1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 return document.getElementById(id);
10 var LOG = function(msg) {
11 window.console.log(msg);
14 var dragStarted = false;
15 var dropData = 'Uninitialized';
17 var isDragInterrupted = false;
18 var sentConnectedMessage = false;
20 // Number of mousemove events recorded after (most recent) mousedown and before
21 // (most recent) mouseup.
22 var numDocumentMouseMoves = 0;
24 var sendGuestGotDrop = function() {
25 embedder.postMessage(JSON.stringify(['guest-got-drop', dropData]), '*');
28 window.addEventListener('resize', function(e) {
33 embedder.postMessage(JSON.stringify(['resized']), '*');
36 var maybeSendConnected = function() {
37 LOG('maybeSendConnected, sentConnectedMessage: ' + sentConnectedMessage);
38 if (!sentConnectedMessage && embedder) {
40 sentConnectedMessage = true;
41 embedder.postMessage(JSON.stringify(['connected']), '*');
45 var resetState = function() {
46 LOG('guest.resetState');
51 isDragInterrupted = false;
53 embedder.postMessage(JSON.stringify(['resetStateReply']), '*');
56 window.addEventListener('message', function(e) {
58 var data = JSON.parse(e.data)[0];
59 if (data == 'create-channel') {
61 } else if (data == 'resetState') {
66 var doPostMessage = function(msg) {
67 embedder.postMessage(JSON.stringify([msg]), '*');
70 var resetSelection = function() {
71 var selection = window.getSelection();
72 var range = document.createRange();
73 range.selectNodeContents($('dragMe'));
74 selection.removeAllRanges();
75 selection.addRange(range);
76 LOG('Restored selection');
79 var setUpGuest = function() {
80 window.console.log('n.guest.setUpGuest');
82 document.body.style.width = '300px';
83 document.body.style.background = '#CCCCCC';
85 document.body.innerHTML +=
86 '<div class="dragMe" id="dragMe">Drop me</div>' +
87 '<div class="destination" id="dest"></div>';
89 document.body.addEventListener('mousemove', function(e) {
90 LOG('document.mousemove: ' + e.clientX + ', ' + e.clientY);
91 ++numDocumentMouseMoves;
93 document.body.addEventListener('mousedown', function(e) {
94 LOG('document.mousedown: ' + e.clientX + ', ' + e.clientY);
95 numDocumentMouseMoves = 0;
97 document.body.addEventListener('mouseup', function(e) {
98 LOG('document.mouseup: ' + e.clientX + ', ' + e.clientY);
99 LOG('numDocumentMouseMoves: ' + numDocumentMouseMoves);
100 LOG('dragStarted: ' + dragStarted +
101 ', isDragInterrupted: ' + isDragInterrupted);
102 if (!dragStarted && !isDragInterrupted) {
103 LOG('Guest drag operation was interrupted by an unexpected mouseup');
104 isDragInterrupted = true;
105 embedder.postMessage(JSON.stringify(
106 ['guest-got-drop', 'drag-interrupted-by-mouseup']), '*');
109 numDocumentMouseMoves = 0;
112 // Select the text to drag.
115 // Whole bunch of drag/drop events on destination node follows.
116 // We only need to make sure we preventDefault in dragenter and
118 var destNode = $('dest');
119 var srcNode = $('dragMe');
121 srcNode.addEventListener('mousemove', function(e) {
122 LOG('s.mousemove ' + e.clientX + ', ' + e.clientY);
124 srcNode.addEventListener('mousedown', function(e) {
125 LOG('s.mousedown ' + e.clientX + ', ' + e.clientY);
127 srcNode.addEventListener('mouseup', function(e) {
128 LOG('s.mouseup ' + e.clientX + ', ' + e.clientY);
131 destNode.addEventListener('dragenter', function(e) {
136 destNode.addEventListener('dragover', function(e) {
141 destNode.addEventListener('dragleave', function(e) {
145 destNode.addEventListener('drop', function (e) {
148 dropData = e.dataTransfer.getData('Text');
152 destNode.addEventListener('dragend', function (e) {
156 srcNode.addEventListener('dragstart', function(e) {
160 srcNode.addEventListener('dragend', function(e) {
163 srcNode.addEventListener('dragexit', function(e) {
166 srcNode.addEventListener('dragleave', function(e) {
170 destNode.addEventListener('dragexit', function(e) {
174 LOG('set up complete');