Commit 0de8be3a authored by Neil Deakin's avatar Neil Deakin
Browse files

Bug 1759604, check CanDropLink during the drop event as sites can cancel the...

Bug 1759604, check CanDropLink during the drop event as sites can cancel the dragover event causing the drop event to still fire, r=arai

Differential Revision: https://phabricator.services.mozilla.com/D154896
parent 96460bcf
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -955,6 +955,14 @@ nsDocShellTreeOwner::HandleEvent(Event* aEvent) {
  } else if (eventType.EqualsLiteral("drop")) {
    nsIWebNavigation* webnav = static_cast<nsIWebNavigation*>(mWebBrowser);

    // The page might have cancelled the dragover event itself, so check to
    // make sure that the link can be dropped first.
    bool canDropLink = false;
    handler->CanDropLink(dragEvent, false, &canDropLink);
    if (!canDropLink) {
      return NS_OK;
    }

    nsTArray<RefPtr<nsIDroppedLinkItem>> links;
    if (webnav && NS_SUCCEEDED(handler->DropLinks(dragEvent, true, links))) {
      if (links.Length() >= 1) {
+4 −0
Original line number Diff line number Diff line
@@ -9,6 +9,10 @@ support-files =
  ../../../browser/base/content/test/general/head.js

[browser_bug1539497.js]
[browser_dragimage.js]
support-files =
  dragimage.html
  green.png
[browser_keyboard_event_init_key_event_enabled_in_contentscript.js]
support-files =
  file_keyboard_event_init_key_event_enabled_in_contentscript.html
+67 −0
Original line number Diff line number Diff line
const TEST_URI = "dragimage.html";

// This test checks that dragging an image onto the same document
// does not drop it, even when the page cancels the dragover event.
add_task(async function dragimage_remote_tab() {
  var tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    "http://www.example.com/browser/dom/events/test/" + TEST_URI
  );

  let dropHappened = false;
  let oldHandler = tab.linkedBrowser.droppedLinkHandler;
  tab.linkedBrowser.droppedLinkHandler = () => {
    dropHappened = true;
  };

  await SpecialPowers.spawn(tab.linkedBrowser, [], async () => {
    let image = content.document.body.firstElementChild;
    let target = content.document.body.lastElementChild;

    const EventUtils = ContentTaskUtils.getEventUtils(content);

    await EventUtils.synthesizePlainDragAndDrop({
      srcElement: image,
      destElement: target,
      srcWindow: content,
      destWindow: content,
      id: content.windowUtils.DEFAULT_MOUSE_POINTER_ID,
    });
  });

  tab.linkedBrowser.droppedLinkHandler = oldHandler;

  ok(!dropHappened, "drop did not occur");

  BrowserTestUtils.removeTab(tab);
});

// This test checks the same but with an in-process page.
add_task(async function dragimage_local_tab() {
  var tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    getRootDirectory(gTestPath) + TEST_URI
  );

  let dropHappened = false;
  let oldHandler = tab.linkedBrowser.droppedLinkHandler;
  tab.linkedBrowser.droppedLinkHandler = () => {
    dropHappened = true;
  };

  let image = tab.linkedBrowser.contentDocument.body.firstElementChild;
  let target = tab.linkedBrowser.contentDocument.body.lastElementChild;

  await EventUtils.synthesizePlainDragAndDrop({
    srcElement: image,
    destElement: target,
    srcWindow: tab.linkedBrowser.contentWindow,
    destWindow: tab.linkedBrowser.contentWindow,
  });

  tab.linkedBrowser.droppedLinkHandler = oldHandler;

  ok(!dropHappened, "drop did not occur");

  BrowserTestUtils.removeTab(tab);
});
+10 −0
Original line number Diff line number Diff line
<html>
<head>
<title>Drag Image Test</title>
</head>
<body>
<img src="green.png" width=100 height=100>
<div id='over' style='width: 100px; height: 100px; border: 1px solid black;'
     ondragover="event.preventDefault();"></div>
</body>
</html>
+255 B
Loading image diff...
Loading