Reland "Send dropEffect attribute on drag and drop events"

This is a reland of commit 0542983115c4ccbaa2b1dd15faff2675d520bbeb

Reason for reland: This CL was erroneously assigned blame for flakiness
in some tests Drag and Drop browser tests in chromeos and linux. See
bug: https://crbug.com/442927728

Original change's description:
> Send dropEffect attribute on drag and drop events
>
> This CL implements the dropEffect attribute in the dataTransfer property
> in drag and drop event to match the spec.
> https://html.spec.whatwg.org/multipage/dnd.html
>
> The attribute is currently not being set, defaulting to "none" on all
> events.
>
> Many existing tests were updated to pass with the new implementation.
> Notably, the default dropEffect for some "effectAllowed" attributes has
> been changed to match the defaults in the table found in "6.11.4 The
> DragEvent interface" in the spec. (defaulting to copy whenever copy is
> available, and to link if link is available)
>
> Bug: 434151262
> Change-Id: Iaeaa7e0e4b9a44e89379b6adf72650ab89fe3dd3
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6803149
> Commit-Queue: Gaston Rodriguez <gastonr@microsoft.com>
> Reviewed-by: Avi Drissman <avi@chromium.org>
> Reviewed-by: Olga Gerchikov <gerchiko@microsoft.com>
> Reviewed-by: Kent Tamura <tkent@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1509844}

Bug: 434151262
Change-Id: Id77db2432864ce8ba8f27b7fd216fd21145791b0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6935426
Commit-Queue: Gaston Rodriguez <gastonr@microsoft.com>
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Olga Gerchikov <gerchiko@microsoft.com>
Reviewed-by: Kent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1513989}
diff --git a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
index d7e1418..504d750 100644
--- a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
+++ b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
@@ -1104,7 +1104,7 @@
   // Setup test expectations.
   DOMDragEventVerifier expected_dom_event_data;
   expected_dom_event_data.set_expected_client_position("(155, 150)");
-  expected_dom_event_data.set_expected_drop_effect("none");
+  expected_dom_event_data.set_expected_drop_effect("copy");
   expected_dom_event_data.set_expected_effect_allowed("all");
   expected_dom_event_data.set_expected_mime_types("text/plain");
   expected_dom_event_data.set_expected_page_position("(155, 150)");
@@ -1703,6 +1703,7 @@
       state->expected_dom_event_data.set_expected_client_position("(355, 150)");
       state->expected_dom_event_data.set_expected_page_position("(355, 150)");
       state->expected_dom_event_data.set_expected_file_names("");
+      state->expected_dom_event_data.set_expected_drop_effect("none");
       state->expected_dom_event_data.set_expected_mime_types(
           state->expect_image_accessible
               ? "Files,text/html,text/plain,text/uri-list"
@@ -1720,6 +1721,7 @@
       // (these coordinates are relative to the right frame).
       state->expected_dom_event_data.set_expected_client_position("(155, 150)");
       state->expected_dom_event_data.set_expected_page_position("(155, 150)");
+      state->expected_dom_event_data.set_expected_drop_effect("copy");
 
       EXPECT_TRUE(
           dragenter_event_waiter.WaitForNextMatchingEvent(&dragenter_event));
@@ -1885,7 +1887,7 @@
 
   // Setup test expectations.
   DragAndDropBrowserTest::DragImageFromDisappearingFrame_TestState state;
-  state.expected_dom_event_data.set_expected_drop_effect("none");
+  state.expected_dom_event_data.set_expected_drop_effect("copy");
   // (dragstart event handler in image_source.html is asking for "copy" only).
   state.expected_dom_event_data.set_expected_effect_allowed("copy");
   state.expected_dom_event_data.set_expected_mime_types(
@@ -2262,7 +2264,7 @@
   state.right_frame_events_counter =
       std::make_unique<DOMDragEventCounter>(GetRightFrame(second_contents));
   state.expected_dom_event_data.set_expected_client_position("(55, 50)");
-  state.expected_dom_event_data.set_expected_drop_effect("none");
+  state.expected_dom_event_data.set_expected_drop_effect("copy");
   // (dragstart event handler in image_source.html is asking for "copy" only).
   state.expected_dom_event_data.set_expected_effect_allowed("copy");
   state.expected_dom_event_data.set_expected_mime_types(
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer.cc b/third_party/blink/renderer/core/clipboard/data_transfer.cc
index 455478c..f3d3ddb 100644
--- a/third_party/blink/renderer/core/clipboard/data_transfer.cc
+++ b/third_party/blink/renderer/core/clipboard/data_transfer.cc
@@ -60,6 +60,7 @@
 #include "third_party/blink/renderer/platform/network/http_names.h"
 #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "ui/base/clipboard/clipboard_constants.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-blink.h"
@@ -196,6 +197,27 @@
   return std::nullopt;
 }
 
+AtomicString ConvertEffectAllowedToDropEffect(
+    const AtomicString& effect_allowed) {
+  auto mask = ConvertEffectAllowedToDragOperationsMask(effect_allowed);
+  if (!mask.has_value()) {
+    return keywords::kNone;
+  }
+  // Defaults to copy if copy if present, then to link if link is present (this
+  // relevant in composite cases like copyMove).  Defaults taken from the table
+  // in https://html.spec.whatwg.org/multipage/dnd.html#the-dragevent-interface
+  if ((mask.value() & kDragOperationCopy) || (mask == kDragOperationEvery)) {
+    return AtomicString("copy");
+  }
+  if (mask.value() & kDragOperationLink) {
+    return AtomicString("link");
+  }
+  if (mask.value() & kDragOperationMove) {
+    return AtomicString("move");
+  }
+  return keywords::kNone;
+}
+
 AtomicString ConvertDragOperationsMaskToEffectAllowed(DragOperationsMask op) {
   if (((op & kDragOperationMove) && (op & kDragOperationCopy) &&
        (op & kDragOperationLink)) ||
@@ -596,9 +618,13 @@
   effect_allowed_ = ConvertDragOperationsMaskToEffectAllowed(op);
 }
 
+void DataTransfer::SetDestinationOperationFromEffectAllowed() {
+  setDropEffect(ConvertEffectAllowedToDropEffect(effect_allowed_));
+}
+
 void DataTransfer::SetDestinationOperation(ui::mojom::blink::DragOperation op) {
-  drop_effect_ = ConvertDragOperationsMaskToEffectAllowed(
-      static_cast<DragOperationsMask>(op));
+  setDropEffect(ConvertDragOperationsMaskToEffectAllowed(
+      static_cast<DragOperationsMask>(op)));
 }
 
 DataTransferItemList* DataTransfer::items() {
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer.h b/third_party/blink/renderer/core/clipboard/data_transfer.h
index 315f9ca..ef5f6045 100644
--- a/third_party/blink/renderer/core/clipboard/data_transfer.h
+++ b/third_party/blink/renderer/core/clipboard/data_transfer.h
@@ -132,6 +132,7 @@
   DragOperationsMask SourceOperation() const;
   ui::mojom::blink::DragOperation DestinationOperation() const;
   void SetSourceOperation(DragOperationsMask);
+  void SetDestinationOperationFromEffectAllowed();
   void SetDestinationOperation(ui::mojom::blink::DragOperation);
 
   DataTransferItemList* items();
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index fd838577..88d13a2 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -631,7 +631,7 @@
   DragData drag_data(current_drag_data_.Get(),
                      ViewportToRootFrame(point_in_viewport), screen_point,
                      operations_allowed_, web_drag_data.ForceDefaultAction());
-  GetPage()->GetDragController().PerformDrag(
+  GetPage()->GetDragController().PerformDrop(
       &drag_data, *local_root_->GetFrame(), drag_operation_);
   // Drops that initiated in the browser get reported via `DragSourceEndedAt`.
   if (!GetPage()->GetDragController().did_initiate_drag()) {
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc
index 64c3818..4474b49 100644
--- a/third_party/blink/renderer/core/input/mouse_event_manager.cc
+++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc
@@ -1043,6 +1043,15 @@
   initializer->setRelatedTarget(related_target);
   initializer->setView(frame_->GetDocument()->domWindow());
   initializer->setComposed(true);
+  if (RuntimeEnabledFeatures::PreserveDropEffectEnabled()) {
+    if (event_type == event_type_names::kDragenter ||
+        event_type == event_type_names::kDragover) {
+      data_transfer->SetDestinationOperationFromEffectAllowed();
+    } else if (event_type == event_type_names::kDragleave) {
+      data_transfer->SetDestinationOperation(
+          ui::mojom::blink::DragOperation::kNone);
+    }
+  }
   initializer->setGetDataTransfer(data_transfer);
   initializer->setSourceCapabilities(
       frame_->GetDocument()->domWindow()
diff --git a/third_party/blink/renderer/core/page/drag_controller.cc b/third_party/blink/renderer/core/page/drag_controller.cc
index 3851de4..39cc534 100644
--- a/third_party/blink/renderer/core/page/drag_controller.cc
+++ b/third_party/blink/renderer/core/page/drag_controller.cc
@@ -251,7 +251,7 @@
   file_input_element_under_mouse_ = nullptr;
 }
 
-void DragController::PerformDrag(DragData* drag_data,
+void DragController::PerformDrop(DragData* drag_data,
                                  LocalFrame& local_root,
                                  const Operation& browser_drag_operation) {
   DCHECK(drag_data);
diff --git a/third_party/blink/renderer/core/page/drag_controller.h b/third_party/blink/renderer/core/page/drag_controller.h
index b86e2e8f..494e1780 100644
--- a/third_party/blink/renderer/core/page/drag_controller.h
+++ b/third_party/blink/renderer/core/page/drag_controller.h
@@ -84,7 +84,7 @@
 
   Operation DragEnteredOrUpdated(DragData*, LocalFrame& local_root);
   void DragExited(DragData*, LocalFrame& local_root);
-  void PerformDrag(DragData*,
+  void PerformDrop(DragData*,
                    LocalFrame& local_root,
                    const Operation& browser_drag_operation);
 
diff --git a/third_party/blink/renderer/core/page/drag_controller_test.cc b/third_party/blink/renderer/core/page/drag_controller_test.cc
index 138bfe4..b653cef5 100644
--- a/third_party/blink/renderer/core/page/drag_controller_test.cc
+++ b/third_party/blink/renderer/core/page/drag_controller_test.cc
@@ -84,7 +84,7 @@
                   static_cast<DragOperationsMask>(kDragOperationMove), false);
     GetFrame().GetPage()->GetDragController().DragEnteredOrUpdated(&data,
                                                                    GetFrame());
-    GetFrame().GetPage()->GetDragController().PerformDrag(
+    GetFrame().GetPage()->GetDragController().PerformDrop(
         &data, GetFrame(), DragController::Operation());
   }
 
@@ -194,7 +194,7 @@
       ->GetFrameView()
       ->SetLifecycleUpdatesThrottledForTesting();
 
-  WebView().GetPage()->GetDragController().PerformDrag(
+  WebView().GetPage()->GetDragController().PerformDrop(
       &data, *GetDocument().GetFrame(), DragController::Operation());
 
   // Test passes if we don't crash.
diff --git a/third_party/blink/web_tests/external/wpt/html/editing/dnd/drop/001.xhtml b/third_party/blink/web_tests/external/wpt/html/editing/dnd/drop/001.xhtml
index c34aef9..32dd0f7 100644
--- a/third_party/blink/web_tests/external/wpt/html/editing/dnd/drop/001.xhtml
+++ b/third_party/blink/web_tests/external/wpt/html/editing/dnd/drop/001.xhtml
@@ -1,38 +1,78 @@
 <?xml version="1.0" encoding="utf-8"?>
 <html xmlns="http://www.w3.org/1999/xhtml">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="../resources/test-helper.js"></script>
 <head>
-<title>Selection drag and drop: allowed effects 'copy','move','link'</title>
-<style type="text/css">
-div
-  {display:inline-block;
-  vertical-align:top;
-  background-color:olive;
-  color:white;
-  padding:20px;
-  width:100px;
-  height:100px;}
-div:nth-child(2)
-  {background-color:green;}
-div:nth-child(3)
-  {background-color:teal;}
-</style>
-<script type="application/ecmascript">
-var effects = ['copy','move','link'], i = 0;
-function selectText()
-  {window.getSelection().selectAllChildren(document.querySelector('p'))}
-function dropSelection(event)
-  {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
-  i = (i + 1)%3;
-  selectText();}
-function start(event)
-  {event.dataTransfer.effectAllowed = effects[i]}
-</script>
+  <title>dropEffect is correctly set when it matches effectAllowed</title>
+  <style type="text/css">
+    div {
+      display: inline-block;
+      vertical-align: top;
+      background-color: olive;
+      color: white;
+      padding: 20px;
+      width: 100px;
+      height: 100px;
+    }
+
+    div:nth-child(2) {
+      background-color: green;
+    }
+
+    div:nth-child(3) {
+      background-color: teal;
+    }
+
+  </style>
 </head>
-<body onload="selectText()">
-<p ondragstart="start(event)">Drag me</p>
-<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
-<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
-<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
-<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
+<body>
+  <p>
+    Drag these boxes. Each box has a different effectAllowed.
+  </p>
+  <p>
+  <div id="copy-drag" draggable="true"
+    ondragstart="event.dataTransfer.effectAllowed = 'copy'">copy</div>
+  <div id="move-drag" draggable="true"
+    ondragstart="event.dataTransfer.effectAllowed = 'move'">move</div>
+  <div id="link-drag" draggable="true"
+    ondragstart="event.dataTransfer.effectAllowed = 'link'">link</div>
+  </p>
+  <p>
+    Drop on these boxes. Each box has a different dropEffect.
+  </p>
+  <p>
+    <div id="copy-drop" ondragover="onDragOver(event, 'copy')">copy</div>
+    <div id="move-drop" ondragover="onDragOver(event, 'move')">move</div>
+    <div id="link-drop" ondragover="onDragOver(event, 'link')">link</div>
+  </p>
 </body>
+<script>
+  function onDragOver(event, effectAllowed) {
+    event.preventDefault();
+    event.dataTransfer.dropEffect = effectAllowed;
+  }
+
+  async function test() {
+    await new Promise(loaded => window.addEventListener("load", loaded));
+
+    function onDropCallBack(event) {
+      assert_equals(event.target.textContent, event.dataTransfer.dropEffect);
+      assert_equals(event.target.textContent, event.dataTransfer
+        .effectAllowed);
+      return true;
+    }
+    for (const effect of ['copy', 'move', 'link']) {
+      const dragDiv = document.getElementById(effect + '-drag');
+      const dropDiv = document.getElementById(effect + '-drop');
+      dragDropTest(
+        dragDiv, dropDiv, onDropCallBack,
+        'dropEffect should match effectAllowed on drop for ' + effect);
+    }
+  }
+  test();
+</script>
 </html>
diff --git a/third_party/blink/web_tests/fast/dnd/dropEffect-for-effectAllowed.html b/third_party/blink/web_tests/fast/dnd/dropEffect-for-effectAllowed.html
index 0f4ac84..fcaebca 100644
--- a/third_party/blink/web_tests/fast/dnd/dropEffect-for-effectAllowed.html
+++ b/third_party/blink/web_tests/fast/dnd/dropEffect-for-effectAllowed.html
@@ -85,9 +85,9 @@
   { allowed: 'uninitialized', drop: 'dummy', operation: 'copy' },
   { allowed: 'copy',          drop: 'dummy', operation: 'copy' },
   { allowed: 'copyLink',      drop: 'dummy', operation: 'copy' },
-  { allowed: 'copyMove',      drop: 'dummy', operation: 'move' },
+  { allowed: 'copyMove',      drop: 'dummy', operation: 'copy' },
   { allowed: 'link',          drop: 'dummy', operation: 'link' },
-  { allowed: 'linkMove',      drop: 'dummy', operation: 'move' },
+  { allowed: 'linkMove',      drop: 'dummy', operation: 'link' },
   { allowed: 'move',          drop: 'dummy', operation: 'move' },
   { allowed: 'all',           drop: 'dummy', operation: 'copy' },
   { allowed: 'none',          drop: 'dummy' },
diff --git a/third_party/blink/web_tests/fast/events/bogus-dropEffect-effectAllowed-expected.txt b/third_party/blink/web_tests/fast/events/bogus-dropEffect-effectAllowed-expected.txt
index 8b94492..945dfbf8 100644
--- a/third_party/blink/web_tests/fast/events/bogus-dropEffect-effectAllowed-expected.txt
+++ b/third_party/blink/web_tests/fast/events/bogus-dropEffect-effectAllowed-expected.txt
@@ -25,7 +25,7 @@
 PASS event.dataTransfer.effectAllowed is "uninitialized"
 PASS event.dataTransfer.effectAllowed is "uninitialized"
 PASS event.dataTransfer.effectAllowed is "uninitialized"
-PASS event.dataTransfer.dropEffect is "none"
+PASS event.dataTransfer.dropEffect is "copy"
 PASS event.dataTransfer.dropEffect is "copy"
 PASS event.dataTransfer.dropEffect is "copy"
 PASS event.dataTransfer.dropEffect is "copy"
@@ -44,7 +44,7 @@
 PASS event.dataTransfer.dropEffect is "none"
 PASS event.dataTransfer.dropEffect is "none"
 PASS event.dataTransfer.dropEffect is "none"
-PASS event.dataTransfer.dropEffect is "none"
+PASS event.dataTransfer.dropEffect is "copy"
 PASS event.dataTransfer.dropEffect is "copy"
 PASS event.dataTransfer.dropEffect is "copy"
 PASS event.dataTransfer.dropEffect is "copy"
diff --git a/third_party/blink/web_tests/fast/events/drag-and-drop-expected.txt b/third_party/blink/web_tests/fast/events/drag-and-drop-expected.txt
index 925ba7d..23c9ed18 100644
--- a/third_party/blink/web_tests/fast/events/drag-and-drop-expected.txt
+++ b/third_party/blink/web_tests/fast/events/drag-and-drop-expected.txt
@@ -75,7 +75,7 @@
 PASS event.dataTransfer.dropEffect is "copy"
 PASS event.dataTransfer.dropEffect is "move"
 PASS event.dataTransfer.dropEffect is "none"
-PASS event.dataTransfer.dropEffect is "move"
+PASS event.dataTransfer.dropEffect is "copy"
 
 When effectAllowed == "copyLink"
 
@@ -91,7 +91,7 @@
 PASS event.dataTransfer.dropEffect is "none"
 PASS event.dataTransfer.dropEffect is "move"
 PASS event.dataTransfer.dropEffect is "link"
-PASS event.dataTransfer.dropEffect is "move"
+PASS event.dataTransfer.dropEffect is "link"
 
 When effectAllowed == "dummy"
 
diff --git a/third_party/blink/web_tests/fast/events/drag-and-drop.html b/third_party/blink/web_tests/fast/events/drag-and-drop.html
index baf0ca2..54f403a 100644
--- a/third_party/blink/web_tests/fast/events/drag-and-drop.html
+++ b/third_party/blink/web_tests/fast/events/drag-and-drop.html
@@ -13,7 +13,7 @@
     var dropEffectElem;
     var consoleElm;
     var event;
-    
+
     window.onload = function()
     {
         dragMe = document.getElementById("dragMe");
@@ -21,20 +21,20 @@
         effectAllowedElem = document.getElementById("effectAllowed");
         dropEffectElem = document.getElementById("dropEffect");
         consoleElm = document.getElementById("console");
-        
+
         if (!dragMe || !dropTarget || !effectAllowedElem || !dropEffectElem || !consoleElm)
             return;
-        
+
         dragMe.ondragstart = dragStart;
         dragMe.ondragend = dragEnd;
-        
+
         dropTarget.ondragenter = dragEntered;
         dropTarget.ondragover = dragOver;
         dropTarget.ondrop = drop;
-        
+
         runTest();
     }
-    
+
     function dragStart(e)
     {
         event = e;
@@ -43,35 +43,35 @@
 
         e.dataTransfer.setData('Text', e.target.textContent);
     }
-    
+
     function dragEnd(e)
     {
         checkDragState(e);
         return;
     }
-    
+
     function dragEntered(e)
     {
         dragEnteredAndUpdated(e);
     }
-    
+
     function dragOver(e)
     {
         dragEnteredAndUpdated(e);
     }
-    
+
     function dragEnteredAndUpdated(e)
     {
         event = e;
         e.dataTransfer.dropEffect = dropEffectElem.options[dropEffectElem.selectedIndex].value;
         cancelDrag(e);
     }
-    
+
     function drop(e)
     {
         cancelDrag(e);
     }
-    
+
     function cancelDrag(e)
     {
         if (e.preventDefault)
@@ -81,28 +81,28 @@
             e.returnValue = false;
         }
     }
-    
+
     function checkDragState(e)
     {
         event = e;
         var chosenDropEffect = dropEffectElem.options[dropEffectElem.selectedIndex].value;
         var chosenEffectAllowed = effectAllowedElem.options[effectAllowedElem.selectedIndex].value;
         var actualDropEffect = e.dataTransfer.dropEffect;
-        
+
         if (chosenEffectAllowed === "undefined") {
             // If no effectAllowed is set, we should default to uninitialized. Make sure that's the case.
             shouldBeEqualToString("event.dataTransfer.effectAllowed", "uninitialized");
-            
+
             // Then set the chosenEffectAllowed so isDropEffectAllowed matches the HTML5 spec, and
             // doesn't need special cases for undefined.
             chosenEffectAllowed = "uninitialized";
         }
-        
+
         if (chosenEffectAllowed === "dummy") {
             // If a bad effectAllowed is attempted to be set, it should never be set, and the
             // effectAllowed should be uninitialized.
             shouldBeEqualToString("event.dataTransfer.effectAllowed", "uninitialized");
-            
+
             // Then set the chosenEffectAllowed so isDropEffectAllowed matches the HTML5 spec, and
             // doesn't need special cases for undefined.
             chosenEffectAllowed = "uninitialized";
@@ -112,13 +112,15 @@
             switch (chosenEffectAllowed) {
                 case "undefined":
                 case "copyLink":
+                case "copyMove":
                 case "uninitialized":
                 case "all":
                     expected = "copy";
                     break;
-                case "copyMove":
-                case "move":
                 case "linkMove":
+                  expected = "link";
+                  break;
+                case "move":
                     expected = "move";
                     break;
                 default:
@@ -129,9 +131,9 @@
             shouldBeEqualToString('event.dataTransfer.dropEffect', expected);
         else
             shouldBeEqualToString('event.dataTransfer.dropEffect', 'none');
-            
+
     }
-    
+
     function isDropEffectAllowed(chosenDropEffect, allowedDropEffect) {
         // Extracted from the HTML 5 drag-and-drop section, http://dev.w3.org/html5/spec/Overview.html#dnd
         if (chosenDropEffect == "none")
@@ -143,7 +145,7 @@
         if (chosenDropEffect == "link" && ["link", "copyLink", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
             return true;
         if (chosenDropEffect == "dummy" && ["copy", "link", "move", "copyLink", "copyMove", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
-            return true; 
+            return true;
         return false;
     }
 
@@ -151,18 +153,18 @@
     {
         if (!window.eventSender)
             return;
-            
+
         if (window.testRunner)
             testRunner.dumpAsText();
-            
+
         var startX = dragMe.offsetLeft + 10;
         var startY = dragMe.offsetTop + dragMe.offsetHeight / 2;
         var endX = dropTarget.offsetLeft + 10;
         var endY = dropTarget.offsetTop + dropTarget.offsetHeight / 2;
-        
+
         var numEffectAllowed = effectAllowedElem.options.length;
         var numEffects = dropEffectElem.options.length;
-        
+
         for (var i = 0; i < numEffectAllowed; ++i) {
             effectAllowedElem.options[i].selected = true;
             debug('<br />When effectAllowed == "' + effectAllowedElem.options[i].value + '"<br />');