mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 08:15:31 +00:00
Bug 816406 - Disallow dragging a private tab into a non-private window and vice versa; r=dao
This commit is contained in:
parent
7a3ea75982
commit
77bb9823b5
@ -1896,6 +1896,14 @@
|
|||||||
<parameter name="aOtherTab"/>
|
<parameter name="aOtherTab"/>
|
||||||
<body>
|
<body>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
|
#ifdef MOZ_PER_WINDOW_PRIVATE_BROWSING
|
||||||
|
// Do not allow transfering a private tab to a non-private window
|
||||||
|
// and vice versa.
|
||||||
|
if (PrivateBrowsingUtils.isWindowPrivate(window) !=
|
||||||
|
PrivateBrowsingUtils.isWindowPrivate(aOtherTab.ownerDocument.defaultView))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
// That's gBrowser for the other window, not the tab's browser!
|
// That's gBrowser for the other window, not the tab's browser!
|
||||||
var remoteBrowser = aOtherTab.ownerDocument.defaultView.gBrowser;
|
var remoteBrowser = aOtherTab.ownerDocument.defaultView.gBrowser;
|
||||||
|
|
||||||
@ -3422,6 +3430,14 @@
|
|||||||
sourceNode.ownerDocument.defaultView instanceof ChromeWindow &&
|
sourceNode.ownerDocument.defaultView instanceof ChromeWindow &&
|
||||||
sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" &&
|
sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser" &&
|
||||||
sourceNode.ownerDocument.defaultView.gBrowser.tabContainer == sourceNode.parentNode) {
|
sourceNode.ownerDocument.defaultView.gBrowser.tabContainer == sourceNode.parentNode) {
|
||||||
|
#ifdef MOZ_PER_WINDOW_PRIVATE_BROWSING
|
||||||
|
// Do not allow transfering a private tab to a non-private window
|
||||||
|
// and vice versa.
|
||||||
|
if (PrivateBrowsingUtils.isWindowPrivate(window) !=
|
||||||
|
PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerDocument.defaultView))
|
||||||
|
return dt.effectAllowed = "none";
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
return dt.effectAllowed = event.altKey ? "copy" : "move";
|
return dt.effectAllowed = event.altKey ? "copy" : "move";
|
||||||
#else
|
#else
|
||||||
|
@ -320,6 +320,7 @@ _BROWSER_FILES += \
|
|||||||
browser_save_link-perwindowpb.js \
|
browser_save_link-perwindowpb.js \
|
||||||
browser_save_private_link_perwindowpb.js \
|
browser_save_private_link_perwindowpb.js \
|
||||||
browser_tabMatchesInAwesomebar_perwindowpb.js \
|
browser_tabMatchesInAwesomebar_perwindowpb.js \
|
||||||
|
browser_tab_drag_drop_perwindow.js \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
else
|
else
|
||||||
_BROWSER_FILES += \
|
_BROWSER_FILES += \
|
||||||
|
50
browser/base/content/test/browser_tab_drag_drop_perwindow.js
Normal file
50
browser/base/content/test/browser_tab_drag_drop_perwindow.js
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
//initialization
|
||||||
|
waitForExplicitFinish();
|
||||||
|
|
||||||
|
let scriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
|
||||||
|
getService(Ci.mozIJSSubScriptLoader);
|
||||||
|
let chromeUtils = {};
|
||||||
|
scriptLoader.loadSubScript("chrome://mochikit/content/tests/SimpleTest/ChromeUtils.js", chromeUtils);
|
||||||
|
|
||||||
|
function testOnWindow(aIsPrivate, aCallback) {
|
||||||
|
whenNewWindowLoaded({private: aIsPrivate}, function(win) {
|
||||||
|
executeSoon(function() aCallback(win));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
testOnWindow(false, function(aNormalWindow) {
|
||||||
|
testOnWindow(true, function(aPrivateWindow) {
|
||||||
|
// Open a tab in each window
|
||||||
|
let normalTab = aNormalWindow.gBrowser.addTab("about:blank", {skipAnimation: true});
|
||||||
|
let privateTab = aPrivateWindow.gBrowser.addTab("about:blank", {skipAnimation: true});
|
||||||
|
|
||||||
|
let effect = chromeUtils.synthesizeDrop(normalTab, privateTab,
|
||||||
|
[[{type: TAB_DROP_TYPE, data: normalTab}]],
|
||||||
|
null, aNormalWindow, EventUtils, aPrivateWindow);
|
||||||
|
is(effect, "none", "Should not be able to drag a normal tab to a private window");
|
||||||
|
|
||||||
|
effect = chromeUtils.synthesizeDrop(privateTab, normalTab,
|
||||||
|
[[{type: TAB_DROP_TYPE, data: privateTab}]],
|
||||||
|
null, aPrivateWindow, EventUtils, aNormalWindow);
|
||||||
|
is(effect, "none", "Should not be able to drag a private tab to a normal window");
|
||||||
|
|
||||||
|
aNormalWindow.gBrowser.swapBrowsersAndCloseOther(normalTab, privateTab);
|
||||||
|
is(aNormalWindow.gBrowser.tabs.length, 2, "Prevent moving a normal tab to a private tabbrowser");
|
||||||
|
is(aPrivateWindow.gBrowser.tabs.length, 2, "Prevent accepting a normal tab in a private tabbrowser");
|
||||||
|
|
||||||
|
aPrivateWindow.gBrowser.swapBrowsersAndCloseOther(privateTab, normalTab);
|
||||||
|
is(aPrivateWindow.gBrowser.tabs.length, 2, "Prevent moving a private tab to a normal tabbrowser");
|
||||||
|
is(aNormalWindow.gBrowser.tabs.length, 2, "Prevent accepting a private tab in a normal tabbrowser");
|
||||||
|
|
||||||
|
aNormalWindow.close();
|
||||||
|
aPrivateWindow.close();
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -210,13 +210,17 @@ function synthesizeDragStart(element, expectedDragData, aWindow, x, y)
|
|||||||
* eventUtils - optional; allows you to pass in a reference to EventUtils.js.
|
* eventUtils - optional; allows you to pass in a reference to EventUtils.js.
|
||||||
* If the eventUtils parameter is not passed in, we assume EventUtils.js is
|
* If the eventUtils parameter is not passed in, we assume EventUtils.js is
|
||||||
* in the scope. Used by browser-chrome tests.
|
* in the scope. Used by browser-chrome tests.
|
||||||
|
* aDestWindow - optional; defaults to aWindow.
|
||||||
|
* Used when destElement is in a different window than srcElement.
|
||||||
*
|
*
|
||||||
* Returns the drop effect that was desired.
|
* Returns the drop effect that was desired.
|
||||||
*/
|
*/
|
||||||
function synthesizeDrop(srcElement, destElement, dragData, dropEffect, aWindow, eventUtils)
|
function synthesizeDrop(srcElement, destElement, dragData, dropEffect, aWindow, eventUtils, aDestWindow)
|
||||||
{
|
{
|
||||||
if (!aWindow)
|
if (!aWindow)
|
||||||
aWindow = window;
|
aWindow = window;
|
||||||
|
if (!aDestWindow)
|
||||||
|
aDestWindow = aWindow;
|
||||||
|
|
||||||
var synthesizeMouseAtCenter = (eventUtils || window).synthesizeMouseAtCenter;
|
var synthesizeMouseAtCenter = (eventUtils || window).synthesizeMouseAtCenter;
|
||||||
var synthesizeMouse = (eventUtils || window).synthesizeMouse;
|
var synthesizeMouse = (eventUtils || window).synthesizeMouse;
|
||||||
@ -254,24 +258,24 @@ function synthesizeDrop(srcElement, destElement, dragData, dropEffect, aWindow,
|
|||||||
synthesizeMouse(srcElement, x+10, y+10, { type: "mousemove" }, aWindow);
|
synthesizeMouse(srcElement, x+10, y+10, { type: "mousemove" }, aWindow);
|
||||||
aWindow.removeEventListener("dragstart", trapDrag, true);
|
aWindow.removeEventListener("dragstart", trapDrag, true);
|
||||||
|
|
||||||
event = aWindow.document.createEvent("DragEvents");
|
event = aDestWindow.document.createEvent("DragEvents");
|
||||||
event.initDragEvent("dragenter", true, true, aWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
event.initDragEvent("dragenter", true, true, aDestWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
||||||
gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true);
|
gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true);
|
||||||
|
|
||||||
var event = aWindow.document.createEvent("DragEvents");
|
var event = aDestWindow.document.createEvent("DragEvents");
|
||||||
event.initDragEvent("dragover", true, true, aWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
event.initDragEvent("dragover", true, true, aDestWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
||||||
if (gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true)) {
|
if (gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true)) {
|
||||||
synthesizeMouseAtCenter(destElement, { type: "mouseup" }, aWindow);
|
synthesizeMouseAtCenter(destElement, { type: "mouseup" }, aDestWindow);
|
||||||
return "none";
|
return "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dataTransfer.dropEffect != "none") {
|
if (dataTransfer.dropEffect != "none") {
|
||||||
event = aWindow.document.createEvent("DragEvents");
|
event = aDestWindow.document.createEvent("DragEvents");
|
||||||
event.initDragEvent("drop", true, true, aWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
event.initDragEvent("drop", true, true, aDestWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null, dataTransfer);
|
||||||
gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true);
|
gWindowUtils.dispatchDOMEventViaPresShell(destElement, event, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
synthesizeMouseAtCenter(destElement, { type: "mouseup" }, aWindow);
|
synthesizeMouseAtCenter(destElement, { type: "mouseup" }, aDestWindow);
|
||||||
|
|
||||||
return dataTransfer.dropEffect;
|
return dataTransfer.dropEffect;
|
||||||
} finally {
|
} finally {
|
||||||
|
Loading…
Reference in New Issue
Block a user