зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to b-i
This commit is contained in:
Коммит
f6c8f279a5
|
@ -31,9 +31,8 @@ this.AccessFu = {
|
||||||
Utils.init(aWindow);
|
Utils.init(aWindow);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let bridgeCc = Cc['@mozilla.org/android/bridge;1'];
|
Services.androidBridge.handleGeckoMessage(
|
||||||
bridgeCc.getService(Ci.nsIAndroidBridge).handleGeckoMessage(
|
{ type: 'Accessibility:Ready' });
|
||||||
JSON.stringify({ type: 'Accessibility:Ready' }));
|
|
||||||
Services.obs.addObserver(this, 'Accessibility:Settings', false);
|
Services.obs.addObserver(this, 'Accessibility:Settings', false);
|
||||||
} catch (x) {
|
} catch (x) {
|
||||||
// Not on Android
|
// Not on Android
|
||||||
|
@ -702,8 +701,7 @@ var Output = {
|
||||||
get androidBridge() {
|
get androidBridge() {
|
||||||
delete this.androidBridge;
|
delete this.androidBridge;
|
||||||
if (Utils.MozBuildApp === 'mobile/android') {
|
if (Utils.MozBuildApp === 'mobile/android') {
|
||||||
this.androidBridge = Cc['@mozilla.org/android/bridge;1'].getService(
|
this.androidBridge = Services.androidBridge;
|
||||||
Ci.nsIAndroidBridge);
|
|
||||||
} else {
|
} else {
|
||||||
this.androidBridge = null;
|
this.androidBridge = null;
|
||||||
}
|
}
|
||||||
|
@ -734,7 +732,7 @@ var Output = {
|
||||||
androidEvent.brailleOutput = this.brailleState.init(androidEvent.brailleOutput);
|
androidEvent.brailleOutput = this.brailleState.init(androidEvent.brailleOutput);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
this.androidBridge.handleGeckoMessage(JSON.stringify(androidEvent));
|
this.androidBridge.handleGeckoMessage(androidEvent);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -902,9 +900,8 @@ var Input = {
|
||||||
|
|
||||||
if (Utils.MozBuildApp == 'mobile/android')
|
if (Utils.MozBuildApp == 'mobile/android')
|
||||||
// Return focus to native Android browser chrome.
|
// Return focus to native Android browser chrome.
|
||||||
Cc['@mozilla.org/android/bridge;1'].
|
Services.androidBridge.handleGeckoMessage(
|
||||||
getService(Ci.nsIAndroidBridge).handleGeckoMessage(
|
{ type: 'ToggleChrome:Focus' });
|
||||||
JSON.stringify({ type: 'ToggleChrome:Focus' }));
|
|
||||||
break;
|
break;
|
||||||
case aEvent.DOM_VK_RETURN:
|
case aEvent.DOM_VK_RETURN:
|
||||||
if (this.editState.editing)
|
if (this.editState.editing)
|
||||||
|
|
|
@ -1228,7 +1228,7 @@ pref("devtools.webconsole.filter.csserror", true);
|
||||||
pref("devtools.webconsole.filter.cssparser", false);
|
pref("devtools.webconsole.filter.cssparser", false);
|
||||||
pref("devtools.webconsole.filter.csslog", false);
|
pref("devtools.webconsole.filter.csslog", false);
|
||||||
pref("devtools.webconsole.filter.exception", true);
|
pref("devtools.webconsole.filter.exception", true);
|
||||||
pref("devtools.webconsole.filter.jswarn", false);
|
pref("devtools.webconsole.filter.jswarn", true);
|
||||||
pref("devtools.webconsole.filter.jslog", false);
|
pref("devtools.webconsole.filter.jslog", false);
|
||||||
pref("devtools.webconsole.filter.error", true);
|
pref("devtools.webconsole.filter.error", true);
|
||||||
pref("devtools.webconsole.filter.warn", true);
|
pref("devtools.webconsole.filter.warn", true);
|
||||||
|
|
|
@ -386,6 +386,11 @@ body[narrow] #restorePreviousSession::before {
|
||||||
transform-origin: 0 0;
|
transform-origin: 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.launchButton:-moz-dir(rtl)::before,
|
||||||
|
#aboutMozilla:-moz-dir(rtl)::before {
|
||||||
|
transform: scale(.5) translateX(32px);
|
||||||
|
}
|
||||||
|
|
||||||
#downloads::before {
|
#downloads::before {
|
||||||
content: url("chrome://browser/content/abouthome/downloads@2x.png");
|
content: url("chrome://browser/content/abouthome/downloads@2x.png");
|
||||||
}
|
}
|
||||||
|
@ -422,6 +427,11 @@ body[narrow] #restorePreviousSession::before {
|
||||||
content: url("chrome://browser/content/abouthome/restore@2x.png");
|
content: url("chrome://browser/content/abouthome/restore@2x.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#restorePreviousSession:-moz-dir(rtl)::before {
|
||||||
|
transform: scale(-0.5, 0.5) translateX(24px);
|
||||||
|
transform-origin: top center;
|
||||||
|
}
|
||||||
|
|
||||||
#aboutMozilla::before {
|
#aboutMozilla::before {
|
||||||
content: url("chrome://browser/content/abouthome/mozilla@2x.png");
|
content: url("chrome://browser/content/abouthome/mozilla@2x.png");
|
||||||
}
|
}
|
||||||
|
|
|
@ -884,6 +884,10 @@ let PlacesToolbarHelper = {
|
||||||
if (!viewElt || viewElt._placesView)
|
if (!viewElt || viewElt._placesView)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// CustomizableUI.addListener is idempotent, so we can safely
|
||||||
|
// call this multiple times.
|
||||||
|
CustomizableUI.addListener(this);
|
||||||
|
|
||||||
// If the bookmarks toolbar item is:
|
// If the bookmarks toolbar item is:
|
||||||
// - not in a toolbar, or;
|
// - not in a toolbar, or;
|
||||||
// - the toolbar is collapsed, or;
|
// - the toolbar is collapsed, or;
|
||||||
|
@ -899,7 +903,11 @@ let PlacesToolbarHelper = {
|
||||||
if (forceToolbarOverflowCheck) {
|
if (forceToolbarOverflowCheck) {
|
||||||
viewElt._placesView.updateOverflowStatus();
|
viewElt._placesView.updateOverflowStatus();
|
||||||
}
|
}
|
||||||
this.customizeChange();
|
this._setupPlaceholder();
|
||||||
|
},
|
||||||
|
|
||||||
|
uninit: function PTH_uninit() {
|
||||||
|
CustomizableUI.removeListener(this);
|
||||||
},
|
},
|
||||||
|
|
||||||
customizeStart: function PTH_customizeStart() {
|
customizeStart: function PTH_customizeStart() {
|
||||||
|
@ -914,10 +922,15 @@ let PlacesToolbarHelper = {
|
||||||
},
|
},
|
||||||
|
|
||||||
customizeChange: function PTH_customizeChange() {
|
customizeChange: function PTH_customizeChange() {
|
||||||
|
this._setupPlaceholder();
|
||||||
|
},
|
||||||
|
|
||||||
|
_setupPlaceholder: function PTH_setupPlaceholder() {
|
||||||
let placeholder = this._placeholder;
|
let placeholder = this._placeholder;
|
||||||
if (!placeholder) {
|
if (!placeholder) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let shouldWrapNow = this._getShouldWrap();
|
let shouldWrapNow = this._getShouldWrap();
|
||||||
if (this._shouldWrap != shouldWrapNow) {
|
if (this._shouldWrap != shouldWrapNow) {
|
||||||
if (shouldWrapNow) {
|
if (shouldWrapNow) {
|
||||||
|
@ -958,7 +971,40 @@ let PlacesToolbarHelper = {
|
||||||
element = element.parentNode;
|
element = element.parentNode;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
onWidgetUnderflow: function(aNode, aContainer) {
|
||||||
|
// The view gets broken by being removed and reinserted by the overflowable
|
||||||
|
// toolbar, so we have to force an uninit and reinit.
|
||||||
|
let win = aNode.ownerDocument.defaultView;
|
||||||
|
if (aNode.id == "personal-bookmarks" && win == window) {
|
||||||
|
this._resetView();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onWidgetAdded: function(aWidgetId, aArea, aPosition) {
|
||||||
|
if (aWidgetId == "personal-bookmarks" && !this._isCustomizing) {
|
||||||
|
// It's possible (with the "Add to Menu", "Add to Toolbar" context
|
||||||
|
// options) that the Places Toolbar Items have been moved without
|
||||||
|
// letting us prepare and handle it with with customizeStart and
|
||||||
|
// customizeDone. If that's the case, we need to reset the views
|
||||||
|
// since they're probably broken from the DOM reparenting.
|
||||||
|
this._resetView();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_resetView: function() {
|
||||||
|
if (this._viewElt) {
|
||||||
|
// It's possible that the placesView might not exist, and we need to
|
||||||
|
// do a full init. This could happen if the Bookmarks Toolbar Items are
|
||||||
|
// moved to the Menu Panel, and then to the toolbar with the "Add to Toolbar"
|
||||||
|
// context menu option, outside of customize mode.
|
||||||
|
if (this._viewElt._placesView) {
|
||||||
|
this._viewElt._placesView.uninit();
|
||||||
|
}
|
||||||
|
this.init(true);
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1164,6 +1210,16 @@ let BookmarkingUI = {
|
||||||
// so kill current view and let popupshowing generate a new one.
|
// so kill current view and let popupshowing generate a new one.
|
||||||
if (this.button._placesView)
|
if (this.button._placesView)
|
||||||
this.button._placesView.uninit();
|
this.button._placesView.uninit();
|
||||||
|
|
||||||
|
// We have to do the same thing for the "special" views underneath the
|
||||||
|
// the bookmarks menu.
|
||||||
|
const kSpecialViewNodeIDs = ["BMB_bookmarksToolbar", "BMB_unsortedBookmarks"];
|
||||||
|
for (let viewNodeID of kSpecialViewNodeIDs) {
|
||||||
|
let elem = document.getElementById(viewNodeID);
|
||||||
|
if (elem && elem._placesView) {
|
||||||
|
elem._placesView.uninit();
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onCustomizeStart: function BUI_customizeStart(aWindow) {
|
onCustomizeStart: function BUI_customizeStart(aWindow) {
|
||||||
|
|
|
@ -1289,6 +1289,8 @@ var gBrowserInit = {
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PlacesToolbarHelper.uninit();
|
||||||
|
|
||||||
BookmarkingUI.uninit();
|
BookmarkingUI.uninit();
|
||||||
|
|
||||||
TabsInTitlebar.uninit();
|
TabsInTitlebar.uninit();
|
||||||
|
|
|
@ -154,7 +154,9 @@ Site.prototype = {
|
||||||
*/
|
*/
|
||||||
refreshThumbnail: function Site_refreshThumbnail() {
|
refreshThumbnail: function Site_refreshThumbnail() {
|
||||||
let thumbnail = this._querySelector(".newtab-thumbnail");
|
let thumbnail = this._querySelector(".newtab-thumbnail");
|
||||||
|
if (this.link.bgColor) {
|
||||||
thumbnail.style.backgroundColor = this.link.bgColor;
|
thumbnail.style.backgroundColor = this.link.bgColor;
|
||||||
|
}
|
||||||
let uri = this.link.imageURISpec || PageThumbs.getThumbnailURL(this.url);
|
let uri = this.link.imageURISpec || PageThumbs.getThumbnailURL(this.url);
|
||||||
thumbnail.style.backgroundImage = "url(" + uri + ")";
|
thumbnail.style.backgroundImage = "url(" + uri + ")";
|
||||||
},
|
},
|
||||||
|
|
|
@ -424,7 +424,7 @@
|
||||||
|
|
||||||
newPrompt.clientTop; // style flush to assure binding is attached
|
newPrompt.clientTop; // style flush to assure binding is attached
|
||||||
|
|
||||||
let tab = self._getTabForContentWindow(browser.contentWindow);
|
let tab = self._getTabForBrowser(browser);
|
||||||
newPrompt.init(args, tab, onCloseCallback);
|
newPrompt.init(args, tab, onCloseCallback);
|
||||||
return newPrompt;
|
return newPrompt;
|
||||||
},
|
},
|
||||||
|
@ -3196,7 +3196,13 @@
|
||||||
|
|
||||||
// We're about to open a modal dialog, make sure the opening
|
// We're about to open a modal dialog, make sure the opening
|
||||||
// tab is brought to the front.
|
// tab is brought to the front.
|
||||||
this.selectedTab = this._getTabForContentWindow(event.target.top);
|
// If this is a same-process modal dialog, then we're given its DOM
|
||||||
|
// window as the event's target. For remote dialogs, we're given the
|
||||||
|
// browser, but that's in the originalTarget.
|
||||||
|
// XXX Why originalTarget for the browser?
|
||||||
|
this.selectedTab = (event.target instanceof Window) ?
|
||||||
|
this._getTabForContentWindow(event.target.top) :
|
||||||
|
this._getTabForBrowser(event.originalTarget);
|
||||||
]]>
|
]]>
|
||||||
</handler>
|
</handler>
|
||||||
<handler event="DOMTitleChanged">
|
<handler event="DOMTitleChanged">
|
||||||
|
|
|
@ -93,6 +93,10 @@ skip-if = os == "linux"
|
||||||
[browser_978084_dragEnd_after_move.js]
|
[browser_978084_dragEnd_after_move.js]
|
||||||
[browser_980155_add_overflow_toolbar.js]
|
[browser_980155_add_overflow_toolbar.js]
|
||||||
[browser_981418-widget-onbeforecreated-handler.js]
|
[browser_981418-widget-onbeforecreated-handler.js]
|
||||||
|
|
||||||
|
[browser_984455_bookmarks_items_reparenting.js]
|
||||||
|
skip-if = os == "linux"
|
||||||
|
|
||||||
[browser_985815_propagate_setToolbarVisibility.js]
|
[browser_985815_propagate_setToolbarVisibility.js]
|
||||||
[browser_981305_separator_insertion.js]
|
[browser_981305_separator_insertion.js]
|
||||||
[browser_987177_destroyWidget_xul.js]
|
[browser_987177_destroyWidget_xul.js]
|
||||||
|
|
|
@ -10,7 +10,7 @@ const isOSX = (Services.appinfo.OS === "Darwin");
|
||||||
// show a context menu with options to move it.
|
// show a context menu with options to move it.
|
||||||
add_task(function() {
|
add_task(function() {
|
||||||
let contextMenu = document.getElementById("toolbar-context-menu");
|
let contextMenu = document.getElementById("toolbar-context-menu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let homeButton = document.getElementById("home-button");
|
let homeButton = document.getElementById("home-button");
|
||||||
EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2 });
|
EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2 });
|
||||||
yield shownPromise;
|
yield shownPromise;
|
||||||
|
@ -30,7 +30,7 @@ add_task(function() {
|
||||||
);
|
);
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenPromise = contextMenuHidden(contextMenu);
|
let hiddenPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenPromise;
|
yield hiddenPromise;
|
||||||
});
|
});
|
||||||
|
@ -40,7 +40,7 @@ add_task(function() {
|
||||||
// and a toggle option for the extra toolbar
|
// and a toggle option for the extra toolbar
|
||||||
add_task(function() {
|
add_task(function() {
|
||||||
let contextMenu = document.getElementById("toolbar-context-menu");
|
let contextMenu = document.getElementById("toolbar-context-menu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let toolbar = createToolbarWithPlacements("880164_empty_toolbar", []);
|
let toolbar = createToolbarWithPlacements("880164_empty_toolbar", []);
|
||||||
toolbar.setAttribute("context", "toolbar-context-menu");
|
toolbar.setAttribute("context", "toolbar-context-menu");
|
||||||
toolbar.setAttribute("toolbarname", "Fancy Toolbar for Context Menu");
|
toolbar.setAttribute("toolbarname", "Fancy Toolbar for Context Menu");
|
||||||
|
@ -63,7 +63,7 @@ add_task(function() {
|
||||||
);
|
);
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenPromise = contextMenuHidden(contextMenu);
|
let hiddenPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenPromise;
|
yield hiddenPromise;
|
||||||
removeCustomToolbars();
|
removeCustomToolbars();
|
||||||
|
@ -74,7 +74,7 @@ add_task(function() {
|
||||||
// show a context menu with disabled options to move it.
|
// show a context menu with disabled options to move it.
|
||||||
add_task(function() {
|
add_task(function() {
|
||||||
let contextMenu = document.getElementById("toolbar-context-menu");
|
let contextMenu = document.getElementById("toolbar-context-menu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let urlBarContainer = document.getElementById("urlbar-container");
|
let urlBarContainer = document.getElementById("urlbar-container");
|
||||||
// Need to make sure not to click within an edit field.
|
// Need to make sure not to click within an edit field.
|
||||||
let urlbarRect = urlBarContainer.getBoundingClientRect();
|
let urlbarRect = urlBarContainer.getBoundingClientRect();
|
||||||
|
@ -96,7 +96,7 @@ add_task(function() {
|
||||||
);
|
);
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenPromise = contextMenuHidden(contextMenu);
|
let hiddenPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenPromise;
|
yield hiddenPromise;
|
||||||
});
|
});
|
||||||
|
@ -135,7 +135,7 @@ add_task(function() {
|
||||||
yield shownPanelPromise;
|
yield shownPanelPromise;
|
||||||
|
|
||||||
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
||||||
let shownContextPromise = contextMenuShown(contextMenu);
|
let shownContextPromise = popupShown(contextMenu);
|
||||||
let newWindowButton = document.getElementById("new-window-button");
|
let newWindowButton = document.getElementById("new-window-button");
|
||||||
ok(newWindowButton, "new-window-button was found");
|
ok(newWindowButton, "new-window-button was found");
|
||||||
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
|
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
|
||||||
|
@ -151,7 +151,7 @@ add_task(function() {
|
||||||
];
|
];
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenContextPromise = contextMenuHidden(contextMenu);
|
let hiddenContextPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenContextPromise;
|
yield hiddenContextPromise;
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ add_task(function() {
|
||||||
add_task(function() {
|
add_task(function() {
|
||||||
yield startCustomizing();
|
yield startCustomizing();
|
||||||
let contextMenu = document.getElementById("toolbar-context-menu");
|
let contextMenu = document.getElementById("toolbar-context-menu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let homeButton = document.getElementById("wrapper-home-button");
|
let homeButton = document.getElementById("wrapper-home-button");
|
||||||
EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2});
|
EventUtils.synthesizeMouse(homeButton, 2, 2, {type: "contextmenu", button: 2});
|
||||||
yield shownPromise;
|
yield shownPromise;
|
||||||
|
@ -185,7 +185,7 @@ add_task(function() {
|
||||||
);
|
);
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenContextPromise = contextMenuHidden(contextMenu);
|
let hiddenContextPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenContextPromise;
|
yield hiddenContextPromise;
|
||||||
});
|
});
|
||||||
|
@ -194,7 +194,7 @@ add_task(function() {
|
||||||
// show a context menu with options to move it.
|
// show a context menu with options to move it.
|
||||||
add_task(function() {
|
add_task(function() {
|
||||||
let contextMenu = document.getElementById("customizationPaletteItemContextMenu");
|
let contextMenu = document.getElementById("customizationPaletteItemContextMenu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let openFileButton = document.getElementById("wrapper-open-file-button");
|
let openFileButton = document.getElementById("wrapper-open-file-button");
|
||||||
EventUtils.synthesizeMouse(openFileButton, 2, 2, {type: "contextmenu", button: 2});
|
EventUtils.synthesizeMouse(openFileButton, 2, 2, {type: "contextmenu", button: 2});
|
||||||
yield shownPromise;
|
yield shownPromise;
|
||||||
|
@ -205,7 +205,7 @@ add_task(function() {
|
||||||
];
|
];
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenContextPromise = contextMenuHidden(contextMenu);
|
let hiddenContextPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenContextPromise;
|
yield hiddenContextPromise;
|
||||||
});
|
});
|
||||||
|
@ -214,7 +214,7 @@ add_task(function() {
|
||||||
// should show a context menu with options to move it.
|
// should show a context menu with options to move it.
|
||||||
add_task(function() {
|
add_task(function() {
|
||||||
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let newWindowButton = document.getElementById("wrapper-new-window-button");
|
let newWindowButton = document.getElementById("wrapper-new-window-button");
|
||||||
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
|
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
|
||||||
yield shownPromise;
|
yield shownPromise;
|
||||||
|
@ -227,7 +227,7 @@ add_task(function() {
|
||||||
];
|
];
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenContextPromise = contextMenuHidden(contextMenu);
|
let hiddenContextPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenContextPromise;
|
yield hiddenContextPromise;
|
||||||
yield endCustomizing();
|
yield endCustomizing();
|
||||||
|
@ -241,7 +241,7 @@ add_task(function() {
|
||||||
yield startCustomizing(this.otherWin);
|
yield startCustomizing(this.otherWin);
|
||||||
|
|
||||||
let contextMenu = this.otherWin.document.getElementById("customizationPanelItemContextMenu");
|
let contextMenu = this.otherWin.document.getElementById("customizationPanelItemContextMenu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let newWindowButton = this.otherWin.document.getElementById("wrapper-new-window-button");
|
let newWindowButton = this.otherWin.document.getElementById("wrapper-new-window-button");
|
||||||
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2}, this.otherWin);
|
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2}, this.otherWin);
|
||||||
yield shownPromise;
|
yield shownPromise;
|
||||||
|
@ -254,7 +254,7 @@ add_task(function() {
|
||||||
];
|
];
|
||||||
checkContextMenu(contextMenu, expectedEntries, this.otherWin);
|
checkContextMenu(contextMenu, expectedEntries, this.otherWin);
|
||||||
|
|
||||||
let hiddenContextPromise = contextMenuHidden(contextMenu);
|
let hiddenContextPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenContextPromise;
|
yield hiddenContextPromise;
|
||||||
yield endCustomizing(this.otherWin);
|
yield endCustomizing(this.otherWin);
|
||||||
|
@ -267,13 +267,13 @@ add_task(function() {
|
||||||
add_task(function() {
|
add_task(function() {
|
||||||
yield startCustomizing();
|
yield startCustomizing();
|
||||||
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
||||||
let shownPromise = contextMenuShown(contextMenu);
|
let shownPromise = popupShown(contextMenu);
|
||||||
let zoomControls = document.getElementById("wrapper-zoom-controls");
|
let zoomControls = document.getElementById("wrapper-zoom-controls");
|
||||||
EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2});
|
EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2});
|
||||||
yield shownPromise;
|
yield shownPromise;
|
||||||
// Execute the command to move the item from the panel to the toolbar.
|
// Execute the command to move the item from the panel to the toolbar.
|
||||||
contextMenu.childNodes[0].doCommand();
|
contextMenu.childNodes[0].doCommand();
|
||||||
let hiddenPromise = contextMenuHidden(contextMenu);
|
let hiddenPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenPromise;
|
yield hiddenPromise;
|
||||||
yield endCustomizing();
|
yield endCustomizing();
|
||||||
|
@ -282,7 +282,7 @@ add_task(function() {
|
||||||
is(zoomControls.parentNode.id, "nav-bar-customization-target", "Zoom-controls should be on the nav-bar");
|
is(zoomControls.parentNode.id, "nav-bar-customization-target", "Zoom-controls should be on the nav-bar");
|
||||||
|
|
||||||
contextMenu = document.getElementById("toolbar-context-menu");
|
contextMenu = document.getElementById("toolbar-context-menu");
|
||||||
shownPromise = contextMenuShown(contextMenu);
|
shownPromise = popupShown(contextMenu);
|
||||||
EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2});
|
EventUtils.synthesizeMouse(zoomControls, 2, 2, {type: "contextmenu", button: 2});
|
||||||
yield shownPromise;
|
yield shownPromise;
|
||||||
|
|
||||||
|
@ -301,7 +301,7 @@ add_task(function() {
|
||||||
);
|
);
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
hiddenPromise = contextMenuHidden(contextMenu);
|
hiddenPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenPromise;
|
yield hiddenPromise;
|
||||||
yield resetCustomization();
|
yield resetCustomization();
|
||||||
|
@ -315,7 +315,7 @@ add_task(function() {
|
||||||
yield PanelUI.show();
|
yield PanelUI.show();
|
||||||
|
|
||||||
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
let contextMenu = document.getElementById("customizationPanelItemContextMenu");
|
||||||
let shownContextPromise = contextMenuShown(contextMenu);
|
let shownContextPromise = popupShown(contextMenu);
|
||||||
let newWindowButton = document.getElementById("new-window-button");
|
let newWindowButton = document.getElementById("new-window-button");
|
||||||
ok(newWindowButton, "new-window-button was found");
|
ok(newWindowButton, "new-window-button was found");
|
||||||
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
|
EventUtils.synthesizeMouse(newWindowButton, 2, 2, {type: "contextmenu", button: 2});
|
||||||
|
@ -331,7 +331,7 @@ add_task(function() {
|
||||||
];
|
];
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenContextPromise = contextMenuHidden(contextMenu);
|
let hiddenContextPromise = popupHidden(contextMenu);
|
||||||
contextMenu.hidePopup();
|
contextMenu.hidePopup();
|
||||||
yield hiddenContextPromise;
|
yield hiddenContextPromise;
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ add_task(function() {
|
||||||
yield shownPanelPromise;
|
yield shownPanelPromise;
|
||||||
|
|
||||||
let contextMenu = document.getElementById("toolbar-context-menu");
|
let contextMenu = document.getElementById("toolbar-context-menu");
|
||||||
let shownContextPromise = contextMenuShown(contextMenu);
|
let shownContextPromise = popupShown(contextMenu);
|
||||||
let homeButton = document.getElementById("home-button");
|
let homeButton = document.getElementById("home-button");
|
||||||
ok(homeButton, "home-button was found");
|
ok(homeButton, "home-button was found");
|
||||||
is(homeButton.getAttribute("overflowedItem"), "true", "Home button is overflowing");
|
is(homeButton.getAttribute("overflowedItem"), "true", "Home button is overflowing");
|
||||||
|
@ -51,7 +51,7 @@ add_task(function() {
|
||||||
);
|
);
|
||||||
checkContextMenu(contextMenu, expectedEntries);
|
checkContextMenu(contextMenu, expectedEntries);
|
||||||
|
|
||||||
let hiddenContextPromise = contextMenuHidden(contextMenu);
|
let hiddenContextPromise = popupHidden(contextMenu);
|
||||||
let hiddenPromise = promisePanelElementHidden(window, overflowPanel);
|
let hiddenPromise = promisePanelElementHidden(window, overflowPanel);
|
||||||
let moveToPanel = contextMenu.querySelector(".customize-context-moveToPanel");
|
let moveToPanel = contextMenu.querySelector(".customize-context-moveToPanel");
|
||||||
if (moveToPanel) {
|
if (moveToPanel) {
|
||||||
|
|
|
@ -0,0 +1,256 @@
|
||||||
|
/* 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/. */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
let gNavBar = document.getElementById(CustomizableUI.AREA_NAVBAR);
|
||||||
|
let gOverflowList = document.getElementById(gNavBar.getAttribute("overflowtarget"));
|
||||||
|
|
||||||
|
const kBookmarksButton = "bookmarks-menu-button";
|
||||||
|
const kBookmarksItems = "personal-bookmarks";
|
||||||
|
const kOriginalWindowWidth = window.outerWidth;
|
||||||
|
const kSmallWidth = 400;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function that opens the bookmarks menu, and returns a Promise that
|
||||||
|
* resolves as soon as the menu is ready for interaction.
|
||||||
|
*/
|
||||||
|
function bookmarksMenuPanelShown() {
|
||||||
|
let deferred = Promise.defer();
|
||||||
|
let bookmarksMenuPopup = document.getElementById("BMB_bookmarksPopup");
|
||||||
|
let onTransitionEnd = (e) => {
|
||||||
|
if (e.target == bookmarksMenuPopup) {
|
||||||
|
bookmarksMenuPopup.removeEventListener("transitionend", onTransitionEnd);
|
||||||
|
deferred.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bookmarksMenuPopup.addEventListener("transitionend", onTransitionEnd);
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that the placesContext menu is correctly attached to the
|
||||||
|
* controller of some view. Returns a Promise that resolves as soon
|
||||||
|
* as the context menu is closed.
|
||||||
|
*
|
||||||
|
* @param aItemWithContextMenu the item that we need to synthesize hte
|
||||||
|
* right click on in order to open the context menu.
|
||||||
|
*/
|
||||||
|
function checkPlacesContextMenu(aItemWithContextMenu) {
|
||||||
|
return Task.spawn(function* () {
|
||||||
|
let contextMenu = document.getElementById("placesContext");
|
||||||
|
let newBookmarkItem = document.getElementById("placesContext_new:bookmark");
|
||||||
|
let shownPromise = popupShown(contextMenu);
|
||||||
|
EventUtils.synthesizeMouseAtCenter(aItemWithContextMenu,
|
||||||
|
{type: "contextmenu", button: 2});
|
||||||
|
yield shownPromise;
|
||||||
|
|
||||||
|
ok(!newBookmarkItem.hasAttribute("disabled"),
|
||||||
|
"New bookmark item shouldn't be disabled");
|
||||||
|
|
||||||
|
yield closePopup(contextMenu);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the bookmarks menu panel, and then opens each of the "special"
|
||||||
|
* submenus in that list. Then it checks that those submenu's context menus
|
||||||
|
* are properly hooked up to a controller.
|
||||||
|
*/
|
||||||
|
function checkSpecialContextMenus() {
|
||||||
|
return Task.spawn(function* () {
|
||||||
|
let contextMenu = document.getElementById("placesContext");
|
||||||
|
let bookmarksMenuButton = document.getElementById(kBookmarksButton);
|
||||||
|
let bookmarksMenuPopup = document.getElementById("BMB_bookmarksPopup");
|
||||||
|
|
||||||
|
const kSpecialItemIDs = {
|
||||||
|
"BMB_bookmarksToolbar": "BMB_bookmarksToolbarPopup",
|
||||||
|
"BMB_unsortedBookmarks": "BMB_unsortedBookmarksPopup",
|
||||||
|
};
|
||||||
|
|
||||||
|
// Open the bookmarks menu button context menus and ensure that
|
||||||
|
// they have the proper views attached.
|
||||||
|
let shownPromise = bookmarksMenuPanelShown();
|
||||||
|
let dropmarker = document.getAnonymousElementByAttribute(bookmarksMenuButton,
|
||||||
|
"anonid", "dropmarker");
|
||||||
|
EventUtils.synthesizeMouseAtCenter(dropmarker, {});
|
||||||
|
info("Waiting for bookmarks menu popup to show after clicking dropmarker.")
|
||||||
|
yield shownPromise;
|
||||||
|
|
||||||
|
for (let menuID in kSpecialItemIDs) {
|
||||||
|
let menuItem = document.getElementById(menuID);
|
||||||
|
let menuPopup = document.getElementById(kSpecialItemIDs[menuID]);
|
||||||
|
let shownPromise = popupShown(menuPopup);
|
||||||
|
EventUtils.synthesizeMouseAtCenter(menuItem, {});
|
||||||
|
yield shownPromise;
|
||||||
|
|
||||||
|
yield checkPlacesContextMenu(menuPopup);
|
||||||
|
yield closePopup(menuPopup);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield closePopup(bookmarksMenuPopup);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes a focused popup by simulating pressing the Escape key,
|
||||||
|
* and returns a Promise that resolves as soon as the popup is closed.
|
||||||
|
*
|
||||||
|
* @param aPopup the popup node to close.
|
||||||
|
*/
|
||||||
|
function closePopup(aPopup) {
|
||||||
|
let hiddenPromise = popupHidden(aPopup);
|
||||||
|
EventUtils.synthesizeKey("VK_ESCAPE", {});
|
||||||
|
return hiddenPromise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function that checks that the context menu of the
|
||||||
|
* bookmark toolbar items chevron popup is correctly hooked up
|
||||||
|
* to the controller of a view.
|
||||||
|
*/
|
||||||
|
function checkBookmarksItemsChevronContextMenu() {
|
||||||
|
return Task.spawn(function*() {
|
||||||
|
let chevronPopup = document.getElementById("PlacesChevronPopup");
|
||||||
|
let shownPromise = popupShown(chevronPopup);
|
||||||
|
let chevron = document.getElementById("PlacesChevron");
|
||||||
|
EventUtils.synthesizeMouseAtCenter(chevron, {});
|
||||||
|
yield shownPromise;
|
||||||
|
yield waitForCondition(() => {
|
||||||
|
for (let child of chevronPopup.children) {
|
||||||
|
if (child.style.visibility != "hidden")
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
yield checkPlacesContextMenu(chevronPopup);
|
||||||
|
yield closePopup(chevronPopup);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forces the window to a width that causes the nav-bar to overflow
|
||||||
|
* its contents. Returns a Promise that resolves as soon as the
|
||||||
|
* overflowable nav-bar is showing its chevron.
|
||||||
|
*/
|
||||||
|
function overflowEverything() {
|
||||||
|
window.resizeTo(kSmallWidth, window.outerHeight);
|
||||||
|
return waitForCondition(() => gNavBar.hasAttribute("overflowing"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the window to its original size from the start of the test,
|
||||||
|
* and returns a Promise that resolves when the nav-bar is no longer
|
||||||
|
* overflowing.
|
||||||
|
*/
|
||||||
|
function stopOverflowing() {
|
||||||
|
window.resizeTo(kOriginalWindowWidth, window.outerHeight);
|
||||||
|
return waitForCondition(() => !gNavBar.hasAttribute("overflowing"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that an item with ID aID is overflowing in the nav-bar.
|
||||||
|
*
|
||||||
|
* @param aID the ID of the node to check for overflowingness.
|
||||||
|
*/
|
||||||
|
function checkOverflowing(aID) {
|
||||||
|
ok(!gNavBar.querySelector("#" + aID),
|
||||||
|
"Item with ID " + aID + " should no longer be in the gNavBar");
|
||||||
|
let item = gOverflowList.querySelector("#" + aID);
|
||||||
|
ok(item, "Item with ID " + aID + " should be overflowing");
|
||||||
|
is(item.getAttribute("overflowedItem"), "true",
|
||||||
|
"Item with ID " + aID + " should have overflowedItem attribute");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks that an item with ID aID is not overflowing in the nav-bar.
|
||||||
|
*
|
||||||
|
* @param aID the ID of hte node to check for non-overflowingness.
|
||||||
|
*/
|
||||||
|
function checkNotOverflowing(aID) {
|
||||||
|
ok(!gOverflowList.querySelector("#" + aID),
|
||||||
|
"Item with ID " + aID + " should no longer be overflowing");
|
||||||
|
let item = gNavBar.querySelector("#" + aID);
|
||||||
|
ok(item, "Item with ID " + aID + " should be in the nav bar");
|
||||||
|
ok(!item.hasAttribute("overflowedItem"),
|
||||||
|
"Item with ID " + aID + " should not have overflowedItem attribute");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that overflowing the bookmarks menu button doesn't break the
|
||||||
|
* context menus for the Unsorted and Bookmarks Toolbar menu items.
|
||||||
|
*/
|
||||||
|
add_task(function* testOverflowingBookmarksButtonContextMenu() {
|
||||||
|
ok(!gNavBar.hasAttribute("overflowing"), "Should start with a non-overflowing toolbar.");
|
||||||
|
ok(CustomizableUI.inDefaultState, "Should start in default state.");
|
||||||
|
|
||||||
|
// Open the Unsorted and Bookmarks Toolbar context menus and ensure
|
||||||
|
// that they have views attached.
|
||||||
|
yield checkSpecialContextMenus();
|
||||||
|
|
||||||
|
yield overflowEverything();
|
||||||
|
checkOverflowing(kBookmarksButton);
|
||||||
|
|
||||||
|
yield stopOverflowing();
|
||||||
|
checkNotOverflowing(kBookmarksButton);
|
||||||
|
|
||||||
|
yield checkSpecialContextMenus();
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that the bookmarks toolbar items context menu still works if moved
|
||||||
|
* to the menu from the overflow panel, and then back to the toolbar.
|
||||||
|
*/
|
||||||
|
add_task(function* testOverflowingBookmarksItemsContextMenu() {
|
||||||
|
yield PanelUI.ensureReady();
|
||||||
|
|
||||||
|
let bookmarksToolbarItems = document.getElementById(kBookmarksItems);
|
||||||
|
gCustomizeMode.addToToolbar(bookmarksToolbarItems);
|
||||||
|
yield checkPlacesContextMenu(bookmarksToolbarItems);
|
||||||
|
|
||||||
|
yield overflowEverything();
|
||||||
|
checkOverflowing(kBookmarksItems)
|
||||||
|
|
||||||
|
gCustomizeMode.addToPanel(bookmarksToolbarItems);
|
||||||
|
|
||||||
|
yield stopOverflowing();
|
||||||
|
|
||||||
|
gCustomizeMode.addToToolbar(bookmarksToolbarItems);
|
||||||
|
yield checkPlacesContextMenu(bookmarksToolbarItems);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that overflowing the bookmarks toolbar items doesn't cause the
|
||||||
|
* context menu in the bookmarks toolbar items chevron to stop working.
|
||||||
|
*/
|
||||||
|
add_task(function* testOverflowingBookmarksItemsChevronContextMenu() {
|
||||||
|
// If it's not already there, let's move the bookmarks toolbar items to
|
||||||
|
// the nav-bar.
|
||||||
|
let bookmarksToolbarItems = document.getElementById(kBookmarksItems);
|
||||||
|
gCustomizeMode.addToToolbar(bookmarksToolbarItems);
|
||||||
|
|
||||||
|
// We make the PlacesToolbarItems element be super tiny in order to force
|
||||||
|
// the bookmarks toolbar items into overflowing and making the chevron
|
||||||
|
// show itself.
|
||||||
|
let placesToolbarItems = document.getElementById("PlacesToolbarItems");
|
||||||
|
let placesChevron = document.getElementById("PlacesChevron");
|
||||||
|
placesToolbarItems.style.maxWidth = "10px";
|
||||||
|
yield waitForCondition(() => !placesChevron.collapsed);
|
||||||
|
|
||||||
|
yield checkBookmarksItemsChevronContextMenu();
|
||||||
|
|
||||||
|
yield overflowEverything();
|
||||||
|
checkOverflowing(kBookmarksItems);
|
||||||
|
|
||||||
|
yield stopOverflowing();
|
||||||
|
checkNotOverflowing(kBookmarksItems);
|
||||||
|
|
||||||
|
yield checkBookmarksItemsChevronContextMenu();
|
||||||
|
|
||||||
|
placesToolbarItems.style.removeProperty("max-width");
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function* asyncCleanup() {
|
||||||
|
window.resizeTo(kOriginalWindowWidth, window.outerHeight);
|
||||||
|
yield resetCustomization();
|
||||||
|
});
|
|
@ -428,36 +428,49 @@ function promiseTabHistoryNavigation(aDirection = -1, aConditionFn) {
|
||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
function contextMenuShown(aContextMenu) {
|
function popupShown(aPopup) {
|
||||||
let deferred = Promise.defer();
|
return promisePopupEvent(aPopup, "shown");
|
||||||
let win = aContextMenu.ownerDocument.defaultView;
|
|
||||||
let timeoutId = win.setTimeout(() => {
|
|
||||||
deferred.reject("Context menu (" + aContextMenu.id + ") did not show within 20 seconds.");
|
|
||||||
}, 20000);
|
|
||||||
function onPopupShown(e) {
|
|
||||||
aContextMenu.removeEventListener("popupshown", onPopupShown);
|
|
||||||
win.clearTimeout(timeoutId);
|
|
||||||
deferred.resolve();
|
|
||||||
};
|
|
||||||
aContextMenu.addEventListener("popupshown", onPopupShown);
|
|
||||||
return deferred.promise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function contextMenuHidden(aContextMenu) {
|
function popupHidden(aPopup) {
|
||||||
let deferred = Promise.defer();
|
return promisePopupEvent(aPopup, "hidden");
|
||||||
let win = aContextMenu.ownerDocument.defaultView;
|
|
||||||
let timeoutId = win.setTimeout(() => {
|
|
||||||
deferred.reject("Context menu (" + aContextMenu.id + ") did not hide within 20 seconds.");
|
|
||||||
}, 20000);
|
|
||||||
function onPopupHidden(e) {
|
|
||||||
win.clearTimeout(timeoutId);
|
|
||||||
aContextMenu.removeEventListener("popuphidden", onPopupHidden);
|
|
||||||
deferred.resolve();
|
|
||||||
};
|
|
||||||
aContextMenu.addEventListener("popuphidden", onPopupHidden);
|
|
||||||
return deferred.promise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a Promise that resolves when aPopup fires an event of type
|
||||||
|
* aEventType. Times out and rejects after 20 seconds.
|
||||||
|
*
|
||||||
|
* @param aPopup the popup to monitor for events.
|
||||||
|
* @param aEventSuffix the _suffix_ for the popup event type to watch for.
|
||||||
|
*
|
||||||
|
* Example usage:
|
||||||
|
* let popupShownPromise = promisePopupEvent(somePopup, "shown");
|
||||||
|
* // ... something that opens a popup
|
||||||
|
* yield popupShownPromise;
|
||||||
|
*
|
||||||
|
* let popupHiddenPromise = promisePopupEvent(somePopup, "hidden");
|
||||||
|
* // ... something that hides a popup
|
||||||
|
* yield popupHiddenPromise;
|
||||||
|
*/
|
||||||
|
function promisePopupEvent(aPopup, aEventSuffix) {
|
||||||
|
let deferred = Promise.defer();
|
||||||
|
let win = aPopup.ownerDocument.defaultView;
|
||||||
|
let eventType = "popup" + aEventSuffix;
|
||||||
|
|
||||||
|
let timeoutId = win.setTimeout(() => {
|
||||||
|
deferred.reject("Context menu (" + aPopup.id + ") did not fire "
|
||||||
|
+ eventType + " within 20 seconds.");
|
||||||
|
}, 20000);
|
||||||
|
|
||||||
|
function onPopupEvent(e) {
|
||||||
|
win.clearTimeout(timeoutId);
|
||||||
|
aPopup.removeEventListener(eventType, onPopupEvent);
|
||||||
|
deferred.resolve();
|
||||||
|
};
|
||||||
|
|
||||||
|
aPopup.addEventListener(eventType, onPopupEvent);
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
|
||||||
// This is a simpler version of the context menu check that
|
// This is a simpler version of the context menu check that
|
||||||
// exists in contextmenu_common.js.
|
// exists in contextmenu_common.js.
|
||||||
|
|
|
@ -81,6 +81,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "PlacesBackups",
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "OS",
|
XPCOMUtils.defineLazyModuleGetter(this, "OS",
|
||||||
"resource://gre/modules/osfile.jsm");
|
"resource://gre/modules/osfile.jsm");
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "RemotePrompt",
|
||||||
|
"resource:///modules/RemotePrompt.jsm");
|
||||||
|
|
||||||
XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
|
XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
|
||||||
"resource:///modules/sessionstore/SessionStore.jsm");
|
"resource:///modules/sessionstore/SessionStore.jsm");
|
||||||
|
|
||||||
|
@ -495,8 +498,10 @@ BrowserGlue.prototype = {
|
||||||
SessionStore.init();
|
SessionStore.init();
|
||||||
BrowserUITelemetry.init();
|
BrowserUITelemetry.init();
|
||||||
|
|
||||||
if (Services.appinfo.browserTabsRemote)
|
if (Services.appinfo.browserTabsRemote) {
|
||||||
ContentClick.init();
|
ContentClick.init();
|
||||||
|
RemotePrompt.init();
|
||||||
|
}
|
||||||
|
|
||||||
Services.obs.notifyObservers(null, "browser-ui-startup-complete", "");
|
Services.obs.notifyObservers(null, "browser-ui-startup-complete", "");
|
||||||
},
|
},
|
||||||
|
|
|
@ -960,6 +960,10 @@ PlacesToolbar.prototype = {
|
||||||
this._removeEventListeners(window, ["resize", "unload"], false);
|
this._removeEventListeners(window, ["resize", "unload"], false);
|
||||||
this._removeEventListeners(gBrowser.tabContainer, ["TabOpen", "TabClose"], false);
|
this._removeEventListeners(gBrowser.tabContainer, ["TabOpen", "TabClose"], false);
|
||||||
|
|
||||||
|
if (this._chevron._placesView) {
|
||||||
|
this._chevron._placesView.uninit();
|
||||||
|
}
|
||||||
|
|
||||||
PlacesViewBase.prototype.uninit.apply(this, arguments);
|
PlacesViewBase.prototype.uninit.apply(this, arguments);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
|
support-files =
|
||||||
|
head.js
|
||||||
|
|
||||||
[browser_layoutview.js]
|
[browser_layoutview.js]
|
||||||
skip-if = true
|
skip-if = true
|
||||||
|
[browser_editablemodel.js]
|
||||||
|
[browser_editablemodel_allproperties.js]
|
||||||
|
[browser_editablemodel_border.js]
|
||||||
|
[browser_editablemodel_stylerules.js]
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
function getStyle(node, property) {
|
||||||
|
return node.style.getPropertyValue(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
let doc;
|
||||||
|
let inspector;
|
||||||
|
|
||||||
|
let test = asyncTest(function*() {
|
||||||
|
let style = "div { margin: 10px; padding: 3px } #div1 { margin-top: 5px } #div2 { border-bottom: 1em solid black; } #div3 { padding: 2em; }";
|
||||||
|
let html = "<style>" + style + "</style><div id='div1'></div><div id='div2'></div><div id='div3'></div>"
|
||||||
|
|
||||||
|
let content = yield loadTab("data:text/html," + encodeURIComponent(html));
|
||||||
|
doc = content.document;
|
||||||
|
|
||||||
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
||||||
|
let toolbox = yield gDevTools.showToolbox(target, "inspector");
|
||||||
|
inspector = toolbox.getCurrentPanel();
|
||||||
|
|
||||||
|
inspector.sidebar.select("layoutview");
|
||||||
|
yield inspector.sidebar.once("layoutview-ready");
|
||||||
|
yield runTests();
|
||||||
|
yield gDevTools.closeToolbox(toolbox);
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that editing margin dynamically updates the document, pressing escape cancels the changes",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
is(getStyle(node, "margin-top"), "", "Should be no margin-top on the element.")
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".margin.top > span");
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "5px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("3", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "margin-top"), "3px", "Should have updated the margin.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_ESCAPE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "margin-top"), "", "Should be no margin-top on the element.")
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that arrow keys work correctly and pressing enter commits the changes",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
is(getStyle(node, "margin-left"), "", "Should be no margin-top on the element.")
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".margin.left > span");
|
||||||
|
is(span.textContent, 10, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "10px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_UP", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "11px", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "margin-left"), "11px", "Should have updated the margin.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_DOWN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "10px", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "margin-left"), "10px", "Should have updated the margin.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_UP", { shiftKey: true }, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "20px", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "margin-left"), "20px", "Should have updated the margin.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_RETURN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "margin-left"), "20px", "Should be the right margin-top on the element.")
|
||||||
|
is(span.textContent, 20, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that deleting the value removes the property but escape undoes that",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
is(getStyle(node, "margin-left"), "20px", "Should be the right margin-top on the element.")
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".margin.left > span");
|
||||||
|
is(span.textContent, 20, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "20px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_DELETE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "margin-left"), "", "Should have updated the margin.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_ESCAPE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "margin-left"), "20px", "Should be the right margin-top on the element.")
|
||||||
|
is(span.textContent, 20, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that deleting the value removes the property",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
node.style.marginRight = "15px";
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".margin.right > span");
|
||||||
|
is(span.textContent, 15, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "15px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_DELETE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "margin-right"), "", "Should have updated the margin.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_RETURN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "margin-right"), "", "Should be the right margin-top on the element.")
|
||||||
|
is(span.textContent, 10, "Should have the right value in the box model.");
|
||||||
|
});
|
|
@ -0,0 +1,134 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
function getStyle(node, property) {
|
||||||
|
return node.style.getPropertyValue(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
let doc;
|
||||||
|
let inspector;
|
||||||
|
|
||||||
|
let test = asyncTest(function*() {
|
||||||
|
let style = "div { margin: 10px; padding: 3px } #div1 { margin-top: 5px } #div2 { border-bottom: 1em solid black; } #div3 { padding: 2em; }";
|
||||||
|
let html = "<style>" + style + "</style><div id='div1'></div><div id='div2'></div><div id='div3'></div>"
|
||||||
|
|
||||||
|
let content = yield loadTab("data:text/html," + encodeURIComponent(html));
|
||||||
|
doc = content.document;
|
||||||
|
|
||||||
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
||||||
|
let toolbox = yield gDevTools.showToolbox(target, "inspector");
|
||||||
|
inspector = toolbox.getCurrentPanel();
|
||||||
|
|
||||||
|
inspector.sidebar.select("layoutview");
|
||||||
|
yield inspector.sidebar.once("layoutview-ready");
|
||||||
|
yield runTests();
|
||||||
|
yield gDevTools.closeToolbox(toolbox);
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("When all properties are set on the node editing one should work",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
node.style.padding = "5px";
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".padding.bottom > span");
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "5px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("7", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "7", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "padding-bottom"), "7px", "Should have updated the padding");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_RETURN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "padding-bottom"), "7px", "Should be the right padding.")
|
||||||
|
is(span.textContent, 7, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("When all properties are set on the node editing one should work",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
node.style.padding = "5px";
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".padding.left > span");
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "5px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("8", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "8", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "padding-left"), "8px", "Should have updated the padding");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_ESCAPE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "padding-left"), "5px", "Should be the right padding.")
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("When all properties are set on the node deleting one should work",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
node.style.padding = "5px";
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".padding.left > span");
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "5px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_DELETE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "padding-left"), "", "Should have updated the padding");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_RETURN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "padding-left"), "", "Should be the right padding.")
|
||||||
|
is(span.textContent, 3, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("When all properties are set on the node deleting one then cancelling should work",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
node.style.padding = "5px";
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".padding.left > span");
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "5px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_DELETE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "padding-left"), "", "Should have updated the padding");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_ESCAPE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "padding-left"), "5px", "Should be the right padding.")
|
||||||
|
is(span.textContent, 5, "Should have the right value in the box model.");
|
||||||
|
});
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
function getStyle(node, property) {
|
||||||
|
return node.style.getPropertyValue(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
let doc;
|
||||||
|
let inspector;
|
||||||
|
|
||||||
|
let test = asyncTest(function*() {
|
||||||
|
let style = "div { margin: 10px; padding: 3px } #div1 { margin-top: 5px } #div2 { border-bottom: 1em solid black; } #div3 { padding: 2em; }";
|
||||||
|
let html = "<style>" + style + "</style><div id='div1'></div><div id='div2'></div><div id='div3'></div>"
|
||||||
|
|
||||||
|
let content = yield loadTab("data:text/html," + encodeURIComponent(html));
|
||||||
|
doc = content.document;
|
||||||
|
|
||||||
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
||||||
|
let toolbox = yield gDevTools.showToolbox(target, "inspector");
|
||||||
|
inspector = toolbox.getCurrentPanel();
|
||||||
|
|
||||||
|
inspector.sidebar.select("layoutview");
|
||||||
|
yield inspector.sidebar.once("layoutview-ready");
|
||||||
|
yield runTests();
|
||||||
|
yield gDevTools.closeToolbox(toolbox);
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that adding a border applies a border style when necessary",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
is(getStyle(node, "border-top-width"), "", "Should have the right border");
|
||||||
|
is(getStyle(node, "border-top-style"), "", "Should have the right border");
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".border.top > span");
|
||||||
|
is(span.textContent, 0, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "0", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("1", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "1", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "border-top-width"), "1px", "Should have the right border");
|
||||||
|
is(getStyle(node, "border-top-style"), "solid", "Should have the right border");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_ESCAPE", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "border-top-width"), "", "Should be the right padding.")
|
||||||
|
is(getStyle(node, "border-top-style"), "", "Should have the right border");
|
||||||
|
is(span.textContent, 0, "Should have the right value in the box model.");
|
||||||
|
});
|
|
@ -0,0 +1,108 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
function getStyle(node, property) {
|
||||||
|
return node.style.getPropertyValue(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
let doc;
|
||||||
|
let inspector;
|
||||||
|
|
||||||
|
let test = asyncTest(function*() {
|
||||||
|
let style = "div { margin: 10px; padding: 3px } #div1 { margin-top: 5px } #div2 { border-bottom: 1em solid black; } #div3 { padding: 2em; }";
|
||||||
|
let html = "<style>" + style + "</style><div id='div1'></div><div id='div2'></div><div id='div3'></div>"
|
||||||
|
|
||||||
|
let content = yield loadTab("data:text/html," + encodeURIComponent(html));
|
||||||
|
doc = content.document;
|
||||||
|
|
||||||
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
||||||
|
let toolbox = yield gDevTools.showToolbox(target, "inspector");
|
||||||
|
inspector = toolbox.getCurrentPanel();
|
||||||
|
|
||||||
|
inspector.sidebar.select("layoutview");
|
||||||
|
yield inspector.sidebar.once("layoutview-ready");
|
||||||
|
yield runTests();
|
||||||
|
yield gDevTools.closeToolbox(toolbox);
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that entering units works",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div1");
|
||||||
|
is(getStyle(node, "padding-top"), "", "Should have the right padding");
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".padding.top > span");
|
||||||
|
is(span.textContent, 3, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "3px", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("1", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
EventUtils.synthesizeKey("e", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "padding-top"), "", "An invalid value is handled cleanly");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("m", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "1em", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "padding-top"), "1em", "Should have updated the padding.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_RETURN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "padding-top"), "1em", "Should be the right padding.")
|
||||||
|
is(span.textContent, 16, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that we pick up the value from a higher style rule",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div2");
|
||||||
|
is(getStyle(node, "border-bottom-width"), "", "Should have the right border-bottom-width");
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".border.bottom > span");
|
||||||
|
is(span.textContent, 16, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "1em", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("0", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(editor.value, "0", "Should have the right value in the editor.");
|
||||||
|
is(getStyle(node, "border-bottom-width"), "0px", "Should have updated the border.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_RETURN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "border-bottom-width"), "0px", "Should be the right border-bottom-width.")
|
||||||
|
is(span.textContent, 0, "Should have the right value in the box model.");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that shorthand properties are parsed correctly",
|
||||||
|
function*() {
|
||||||
|
let node = doc.getElementById("div3");
|
||||||
|
is(getStyle(node, "padding-right"), "", "Should have the right padding");
|
||||||
|
let view = yield selectNode(node);
|
||||||
|
|
||||||
|
let span = view.document.querySelector(".padding.right > span");
|
||||||
|
is(span.textContent, 32, "Should have the right value in the box model.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeMouseAtCenter(span, {}, view);
|
||||||
|
let editor = view.document.querySelector(".styleinspector-propertyeditor");
|
||||||
|
ok(editor, "Should have opened the editor.");
|
||||||
|
is(editor.value, "2em", "Should have the right value in the editor.");
|
||||||
|
|
||||||
|
EventUtils.synthesizeKey("VK_RETURN", {}, view);
|
||||||
|
yield waitForUpdate();
|
||||||
|
|
||||||
|
is(getStyle(node, "padding-right"), "", "Should be the right padding.")
|
||||||
|
is(span.textContent, 32, "Should have the right value in the box model.");
|
||||||
|
});
|
|
@ -1,26 +1,8 @@
|
||||||
/* Any copyright is dedicated to the Public Domain.
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
let {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
|
// Expected values:
|
||||||
let TargetFactory = devtools.TargetFactory;
|
let res1 = [
|
||||||
|
|
||||||
function test() {
|
|
||||||
waitForExplicitFinish();
|
|
||||||
|
|
||||||
gDevTools.testing = true;
|
|
||||||
SimpleTest.registerCleanupFunction(() => {
|
|
||||||
gDevTools.testing = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
Services.prefs.setBoolPref("devtools.inspector.sidebarOpen", true);
|
|
||||||
|
|
||||||
let doc;
|
|
||||||
let node;
|
|
||||||
let view;
|
|
||||||
let inspector;
|
|
||||||
|
|
||||||
// Expected values:
|
|
||||||
let res1 = [
|
|
||||||
{selector: "#element-size", value: "160x160"},
|
{selector: "#element-size", value: "160x160"},
|
||||||
{selector: ".size > span", value: "100x100"},
|
{selector: ".size > span", value: "100x100"},
|
||||||
{selector: ".margin.top > span", value: 30},
|
{selector: ".margin.top > span", value: 30},
|
||||||
|
@ -35,9 +17,9 @@ function test() {
|
||||||
{selector: ".border.left > span", value: 10},
|
{selector: ".border.left > span", value: 10},
|
||||||
{selector: ".border.bottom > span", value: 10},
|
{selector: ".border.bottom > span", value: 10},
|
||||||
{selector: ".border.right > span", value: 10},
|
{selector: ".border.right > span", value: 10},
|
||||||
];
|
];
|
||||||
|
|
||||||
let res2 = [
|
let res2 = [
|
||||||
{selector: "#element-size", value: "190x210"},
|
{selector: "#element-size", value: "190x210"},
|
||||||
{selector: ".size > span", value: "100x150"},
|
{selector: ".size > span", value: "100x150"},
|
||||||
{selector: ".margin.top > span", value: 30},
|
{selector: ".margin.top > span", value: 30},
|
||||||
|
@ -52,83 +34,66 @@ function test() {
|
||||||
{selector: ".border.left > span", value: 10},
|
{selector: ".border.left > span", value: 10},
|
||||||
{selector: ".border.bottom > span", value: 10},
|
{selector: ".border.bottom > span", value: 10},
|
||||||
{selector: ".border.right > span", value: 10},
|
{selector: ".border.right > span", value: 10},
|
||||||
];
|
];
|
||||||
|
|
||||||
gBrowser.selectedTab = gBrowser.addTab();
|
let inspector;
|
||||||
gBrowser.selectedBrowser.addEventListener("load", function onload() {
|
let view;
|
||||||
gBrowser.selectedBrowser.removeEventListener("load", onload, true);
|
|
||||||
doc = content.document;
|
|
||||||
waitForFocus(setupTest, content);
|
|
||||||
}, true);
|
|
||||||
|
|
||||||
|
let test = asyncTest(function*() {
|
||||||
let style = "div { position: absolute; top: 42px; left: 42px; height: 100px; width: 100px; border: 10px solid black; padding: 20px; margin: 30px auto;}";
|
let style = "div { position: absolute; top: 42px; left: 42px; height: 100px; width: 100px; border: 10px solid black; padding: 20px; margin: 30px auto;}";
|
||||||
let html = "<style>" + style + "</style><div></div>"
|
let html = "<style>" + style + "</style><div></div>"
|
||||||
content.location = "data:text/html," + encodeURIComponent(html);
|
|
||||||
|
|
||||||
function setupTest() {
|
let content = yield loadTab("data:text/html," + encodeURIComponent(html));
|
||||||
node = doc.querySelector("div");
|
let node = content.document.querySelector("div");
|
||||||
ok(node, "node found");
|
ok(node, "node found");
|
||||||
|
|
||||||
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
||||||
gDevTools.showToolbox(target, "inspector").then(function(toolbox) {
|
let toolbox = yield gDevTools.showToolbox(target, "inspector");
|
||||||
openLayoutView(toolbox.getCurrentPanel());
|
inspector = toolbox.getCurrentPanel();
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function openLayoutView(aInspector) {
|
|
||||||
inspector = aInspector;
|
|
||||||
|
|
||||||
info("Inspector open");
|
info("Inspector open");
|
||||||
|
|
||||||
inspector.sidebar.select("layoutview");
|
inspector.sidebar.select("layoutview");
|
||||||
inspector.sidebar.once("layoutview-ready", () => {
|
yield inspector.sidebar.once("layoutview-ready");
|
||||||
|
|
||||||
inspector.selection.setNode(node);
|
inspector.selection.setNode(node);
|
||||||
inspector.once("inspector-updated", viewReady);
|
yield inspector.once("inspector-updated");
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function viewReady() {
|
|
||||||
info("Layout view ready");
|
info("Layout view ready");
|
||||||
|
|
||||||
view = inspector.sidebar.getWindowForTab("layoutview");
|
view = inspector.sidebar.getWindowForTab("layoutview");
|
||||||
|
|
||||||
ok(!!view.layoutview, "LayoutView document is alive.");
|
ok(!!view.layoutview, "LayoutView document is alive.");
|
||||||
|
|
||||||
test1();
|
yield runTests();
|
||||||
}
|
|
||||||
|
|
||||||
function test1() {
|
executeSoon(function() {
|
||||||
|
inspector._toolbox.destroy();
|
||||||
|
});
|
||||||
|
|
||||||
|
yield gDevTools.once("toolbox-destroyed");
|
||||||
|
});
|
||||||
|
|
||||||
|
addTest("Test that the initial values of the box model are correct",
|
||||||
|
function*() {
|
||||||
let viewdoc = view.document;
|
let viewdoc = view.document;
|
||||||
|
|
||||||
for (let i = 0; i < res1.length; i++) {
|
for (let i = 0; i < res1.length; i++) {
|
||||||
let elt = viewdoc.querySelector(res1[i].selector);
|
let elt = viewdoc.querySelector(res1[i].selector);
|
||||||
is(elt.textContent, res1[i].value, res1[i].selector + " has the right value.");
|
is(elt.textContent, res1[i].value, res1[i].selector + " has the right value.");
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
inspector.once("layoutview-updated", test2);
|
addTest("Test that changing the document updates the box model",
|
||||||
|
function*() {
|
||||||
|
let viewdoc = view.document;
|
||||||
|
|
||||||
inspector.selection.node.style.height = "150px";
|
inspector.selection.node.style.height = "150px";
|
||||||
inspector.selection.node.style.paddingRight = "50px";
|
inspector.selection.node.style.paddingRight = "50px";
|
||||||
}
|
|
||||||
|
|
||||||
function test2() {
|
yield waitForUpdate();
|
||||||
let viewdoc = view.document;
|
|
||||||
|
|
||||||
for (let i = 0; i < res2.length; i++) {
|
for (let i = 0; i < res2.length; i++) {
|
||||||
let elt = viewdoc.querySelector(res2[i].selector);
|
let elt = viewdoc.querySelector(res2[i].selector);
|
||||||
is(elt.textContent, res2[i].value, res2[i].selector + " has the right value after style update.");
|
is(elt.textContent, res2[i].value, res2[i].selector + " has the right value after style update.");
|
||||||
}
|
}
|
||||||
|
});
|
||||||
executeSoon(function() {
|
|
||||||
gDevTools.once("toolbox-destroyed", finishUp);
|
|
||||||
inspector._toolbox.destroy();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function finishUp() {
|
|
||||||
Services.prefs.clearUserPref("devtools.inspector.sidebarOpen");
|
|
||||||
gBrowser.removeCurrentTab();
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/Task.jsm");
|
||||||
|
|
||||||
|
let {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
|
||||||
|
const promise = devtools.require("sdk/core/promise");
|
||||||
|
let TargetFactory = devtools.TargetFactory;
|
||||||
|
|
||||||
|
Services.prefs.setBoolPref("devtools.inspector.sidebarOpen", true);
|
||||||
|
Services.prefs.setIntPref("devtools.toolbox.footer.height", 350);
|
||||||
|
gDevTools.testing = true;
|
||||||
|
SimpleTest.registerCleanupFunction(() => {
|
||||||
|
Services.prefs.clearUserPref("devtools.inspector.sidebarOpen");
|
||||||
|
Services.prefs.clearUserPref("devtools.toolbox.footer.height");
|
||||||
|
gDevTools.testing = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
// All tests are async in general
|
||||||
|
waitForExplicitFinish();
|
||||||
|
|
||||||
|
function loadTab(url) {
|
||||||
|
let deferred = promise.defer();
|
||||||
|
|
||||||
|
gBrowser.selectedTab = gBrowser.addTab();
|
||||||
|
gBrowser.selectedBrowser.addEventListener("load", function onload() {
|
||||||
|
gBrowser.selectedBrowser.removeEventListener("load", onload, true);
|
||||||
|
waitForFocus(function() {
|
||||||
|
deferred.resolve(content);
|
||||||
|
}, content);
|
||||||
|
}, true);
|
||||||
|
|
||||||
|
content.location = url;
|
||||||
|
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectNode(aNode) {
|
||||||
|
info("selecting node");
|
||||||
|
let onSelect = inspector.once("layoutview-updated");
|
||||||
|
inspector.selection.setNode(aNode, "test");
|
||||||
|
return onSelect.then(() => {
|
||||||
|
let view = inspector.sidebar.getWindowForTab("layoutview");
|
||||||
|
ok(!!view.layoutview, "LayoutView document is alive.");
|
||||||
|
|
||||||
|
return view;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitForUpdate() {
|
||||||
|
return inspector.once("layoutview-updated");
|
||||||
|
}
|
||||||
|
|
||||||
|
function asyncTest(testfunc) {
|
||||||
|
return Task.async(function*() {
|
||||||
|
let initialTab = gBrowser.selectedTab;
|
||||||
|
|
||||||
|
yield testfunc();
|
||||||
|
|
||||||
|
// Remove all tabs except for the initial tab. This is basically
|
||||||
|
// gBrowser.removeAllTabsBut without the animation
|
||||||
|
let tabs = gBrowser.visibleTabs;
|
||||||
|
gBrowser.selectedTab = initialTab;
|
||||||
|
for (let i = tabs.length - 1; i >= 0; i--) {
|
||||||
|
if (tabs[i] != initialTab)
|
||||||
|
gBrowser.removeTab(tabs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the sidebar back to the default
|
||||||
|
Services.prefs.setCharPref("devtools.inspector.activeSidebar", "ruleview");
|
||||||
|
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var TESTS = [];
|
||||||
|
|
||||||
|
function addTest(message, func) {
|
||||||
|
TESTS.push([message, Task.async(func)])
|
||||||
|
}
|
||||||
|
|
||||||
|
var runTests = Task.async(function*() {
|
||||||
|
for (let [message, test] of TESTS) {
|
||||||
|
info(message);
|
||||||
|
yield test();
|
||||||
|
}
|
||||||
|
});
|
|
@ -86,9 +86,16 @@ body {
|
||||||
#main > p > span {
|
#main > p > span {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.size > span {
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.editable {
|
||||||
|
-moz-user-select: text;
|
||||||
|
}
|
||||||
|
|
||||||
.top,
|
.top,
|
||||||
.bottom {
|
.bottom {
|
||||||
width: calc(100% - 2px);
|
width: calc(100% - 2px);
|
||||||
|
@ -179,4 +186,3 @@ body.dim > #main > p,
|
||||||
body.dim > #main > .tooltip {
|
body.dim > #main > .tooltip {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,113 @@ const Ci = Components.interfaces;
|
||||||
const Cc = Components.classes;
|
const Cc = Components.classes;
|
||||||
|
|
||||||
Cu.import("resource://gre/modules/Services.jsm");
|
Cu.import("resource://gre/modules/Services.jsm");
|
||||||
|
Cu.import("resource://gre/modules/Task.jsm");
|
||||||
Cu.import("resource://gre/modules/devtools/Loader.jsm");
|
Cu.import("resource://gre/modules/devtools/Loader.jsm");
|
||||||
Cu.import("resource://gre/modules/devtools/Console.jsm");
|
Cu.import("resource://gre/modules/devtools/Console.jsm");
|
||||||
|
|
||||||
const promise = devtools.require("sdk/core/promise");
|
const promise = devtools.require("sdk/core/promise");
|
||||||
|
const {InplaceEditor, editableItem} = devtools.require("devtools/shared/inplace-editor");
|
||||||
|
const {parseDeclarations} = devtools.require("devtools/styleinspector/css-parsing-utils");
|
||||||
|
|
||||||
|
const NUMERIC = /^-?[\d\.]+$/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An instance of EditingSession tracks changes that have been made during the
|
||||||
|
* modification of box model values. All of these changes can be reverted by
|
||||||
|
* calling revert.
|
||||||
|
*
|
||||||
|
* @param doc A DOM document that can be used to test style rules.
|
||||||
|
* @param rules An array of the style rules defined for the node being edited.
|
||||||
|
* These should be in order of priority, least important first.
|
||||||
|
*/
|
||||||
|
function EditingSession(doc, rules) {
|
||||||
|
this._doc = doc;
|
||||||
|
this._rules = rules;
|
||||||
|
this._modifications = new Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
EditingSession.prototype = {
|
||||||
|
/**
|
||||||
|
* Gets the value of a single property from the CSS rule.
|
||||||
|
*
|
||||||
|
* @param rule The CSS rule
|
||||||
|
* @param property The name of the property
|
||||||
|
*/
|
||||||
|
getPropertyFromRule: function(rule, property) {
|
||||||
|
let dummyStyle = this._element.style;
|
||||||
|
|
||||||
|
dummyStyle.cssText = rule.cssText;
|
||||||
|
return dummyStyle.getPropertyValue(property);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current value for a property as a string or the empty string if
|
||||||
|
* no style rules affect the property.
|
||||||
|
*
|
||||||
|
* @param property The name of the property as a string
|
||||||
|
*/
|
||||||
|
getProperty: function(property) {
|
||||||
|
// Create a hidden element for getPropertyFromRule to use
|
||||||
|
let div = this._doc.createElement("div");
|
||||||
|
div.setAttribute("style", "display: none");
|
||||||
|
this._doc.body.appendChild(div);
|
||||||
|
this._element = this._doc.createElement("p");
|
||||||
|
div.appendChild(this._element);
|
||||||
|
|
||||||
|
// As the rules are in order of priority we can just iterate until we find
|
||||||
|
// the first that defines a value for the property and return that.
|
||||||
|
for (let rule of this._rules) {
|
||||||
|
let value = this.getPropertyFromRule(rule, property);
|
||||||
|
if (value !== "") {
|
||||||
|
div.remove();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
div.remove();
|
||||||
|
return "";
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a number of properties on the node. Returns a promise that will be
|
||||||
|
* resolved when the modifications are complete.
|
||||||
|
*
|
||||||
|
* @param properties An array of properties, each is an object with name and
|
||||||
|
* value properties. If the value is "" then the property
|
||||||
|
* is removed.
|
||||||
|
*/
|
||||||
|
setProperties: function(properties) {
|
||||||
|
let modifications = this._rules[0].startModifyingProperties();
|
||||||
|
|
||||||
|
for (let property of properties) {
|
||||||
|
if (!this._modifications.has(property.name))
|
||||||
|
this._modifications.set(property.name, this.getPropertyFromRule(this._rules[0], property.name));
|
||||||
|
|
||||||
|
if (property.value == "")
|
||||||
|
modifications.removeProperty(property.name);
|
||||||
|
else
|
||||||
|
modifications.setProperty(property.name, property.value, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
return modifications.apply().then(null, console.error);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverts all of the property changes made by this instance. Returns a
|
||||||
|
* promise that will be resolved when complete.
|
||||||
|
*/
|
||||||
|
revert: function() {
|
||||||
|
let modifications = this._rules[0].startModifyingProperties();
|
||||||
|
|
||||||
|
for (let [property, value] of this._modifications) {
|
||||||
|
if (value != "")
|
||||||
|
modifications.setProperty(property, value, "");
|
||||||
|
else
|
||||||
|
modifications.removeProperty(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
return modifications.apply().then(null, console.error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
function LayoutView(aInspector, aWindow)
|
function LayoutView(aInspector, aWindow)
|
||||||
{
|
{
|
||||||
|
@ -54,11 +157,17 @@ LayoutView.prototype = {
|
||||||
marginBottom: {selector: ".margin.bottom > span",
|
marginBottom: {selector: ".margin.bottom > span",
|
||||||
property: "margin-bottom",
|
property: "margin-bottom",
|
||||||
value: undefined},
|
value: undefined},
|
||||||
|
// margin-left is a shorthand for some internal properties,
|
||||||
|
// margin-left-ltr-source and margin-left-rtl-source for example. The
|
||||||
|
// real margin value we want is in margin-left-value
|
||||||
marginLeft: {selector: ".margin.left > span",
|
marginLeft: {selector: ".margin.left > span",
|
||||||
property: "margin-left",
|
property: "margin-left",
|
||||||
|
realProperty: "margin-left-value",
|
||||||
value: undefined},
|
value: undefined},
|
||||||
|
// margin-right behaves the same as margin-left
|
||||||
marginRight: {selector: ".margin.right > span",
|
marginRight: {selector: ".margin.right > span",
|
||||||
property: "margin-right",
|
property: "margin-right",
|
||||||
|
realProperty: "margin-right-value",
|
||||||
value: undefined},
|
value: undefined},
|
||||||
paddingTop: {selector: ".padding.top > span",
|
paddingTop: {selector: ".padding.top > span",
|
||||||
property: "padding-top",
|
property: "padding-top",
|
||||||
|
@ -66,11 +175,15 @@ LayoutView.prototype = {
|
||||||
paddingBottom: {selector: ".padding.bottom > span",
|
paddingBottom: {selector: ".padding.bottom > span",
|
||||||
property: "padding-bottom",
|
property: "padding-bottom",
|
||||||
value: undefined},
|
value: undefined},
|
||||||
|
// padding-left behaves the same as margin-left
|
||||||
paddingLeft: {selector: ".padding.left > span",
|
paddingLeft: {selector: ".padding.left > span",
|
||||||
property: "padding-left",
|
property: "padding-left",
|
||||||
|
realProperty: "padding-left-value",
|
||||||
value: undefined},
|
value: undefined},
|
||||||
|
// padding-right behaves the same as margin-left
|
||||||
paddingRight: {selector: ".padding.right > span",
|
paddingRight: {selector: ".padding.right > span",
|
||||||
property: "padding-right",
|
property: "padding-right",
|
||||||
|
realProperty: "padding-right-value",
|
||||||
value: undefined},
|
value: undefined},
|
||||||
borderTop: {selector: ".border.top > span",
|
borderTop: {selector: ".border.top > span",
|
||||||
property: "border-top-width",
|
property: "border-top-width",
|
||||||
|
@ -86,9 +199,58 @@ LayoutView.prototype = {
|
||||||
value: undefined},
|
value: undefined},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Make each element the dimensions editable
|
||||||
|
for (let i in this.map) {
|
||||||
|
if (i == "position")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
let dimension = this.map[i];
|
||||||
|
editableItem({ element: this.doc.querySelector(dimension.selector) }, (element, event) => {
|
||||||
|
this.initEditor(element, event, dimension);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.onNewNode();
|
this.onNewNode();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the user clicks on one of the editable values in the layoutview
|
||||||
|
*/
|
||||||
|
initEditor: function LV_initEditor(element, event, dimension) {
|
||||||
|
let { property, realProperty } = dimension;
|
||||||
|
if (!realProperty)
|
||||||
|
realProperty = property;
|
||||||
|
let session = new EditingSession(document, this.elementRules);
|
||||||
|
let initialValue = session.getProperty(realProperty);
|
||||||
|
|
||||||
|
new InplaceEditor({
|
||||||
|
element: element,
|
||||||
|
initial: initialValue,
|
||||||
|
|
||||||
|
change: (value) => {
|
||||||
|
if (NUMERIC.test(value))
|
||||||
|
value += "px";
|
||||||
|
let properties = [
|
||||||
|
{ name: property, value: value }
|
||||||
|
]
|
||||||
|
|
||||||
|
if (property.substring(0, 7) == "border-") {
|
||||||
|
let bprop = property.substring(0, property.length - 5) + "style";
|
||||||
|
let style = session.getProperty(bprop);
|
||||||
|
if (!style || style == "none" || style == "hidden")
|
||||||
|
properties.push({ name: bprop, value: "solid" });
|
||||||
|
}
|
||||||
|
|
||||||
|
session.setProperties(properties);
|
||||||
|
},
|
||||||
|
|
||||||
|
done: (value, commit) => {
|
||||||
|
if (!commit)
|
||||||
|
session.revert();
|
||||||
|
}
|
||||||
|
}, event);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the layoutview visible in the sidebar?
|
* Is the layoutview visible in the sidebar?
|
||||||
*/
|
*/
|
||||||
|
@ -158,23 +320,28 @@ LayoutView.prototype = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the dimensions of the node and update the values in
|
* Compute the dimensions of the node and update the values in
|
||||||
* the layoutview/view.xhtml document.
|
* the layoutview/view.xhtml document. Returns a promise that will be resolved
|
||||||
|
* when complete.
|
||||||
*/
|
*/
|
||||||
update: function LV_update() {
|
update: function LV_update() {
|
||||||
|
let lastRequest = Task.spawn((function*() {
|
||||||
if (!this.isActive() ||
|
if (!this.isActive() ||
|
||||||
!this.inspector.selection.isConnected() ||
|
!this.inspector.selection.isConnected() ||
|
||||||
!this.inspector.selection.isElementNode()) {
|
!this.inspector.selection.isElementNode()) {
|
||||||
return promise.resolve(undefined);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let node = this.inspector.selection.nodeFront;
|
let node = this.inspector.selection.nodeFront;
|
||||||
let lastRequest = this.inspector.pageStyle.getLayout(node, {
|
let layout = yield this.inspector.pageStyle.getLayout(node, {
|
||||||
autoMargins: !this.dimmed
|
autoMargins: !this.dimmed
|
||||||
}).then(layout => {
|
});
|
||||||
|
let styleEntries = yield this.inspector.pageStyle.getApplied(node, {});
|
||||||
|
|
||||||
// If a subsequent request has been made, wait for that one instead.
|
// If a subsequent request has been made, wait for that one instead.
|
||||||
if (this._lastRequest != lastRequest) {
|
if (this._lastRequest != lastRequest) {
|
||||||
return this._lastRequest;
|
return this._lastRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._lastRequest = null;
|
this._lastRequest = null;
|
||||||
let width = layout.width;
|
let width = layout.width;
|
||||||
let height = layout.height;
|
let height = layout.height;
|
||||||
|
@ -233,12 +400,12 @@ LayoutView.prototype = {
|
||||||
this.sizeLabel.textContent = newValue;
|
this.sizeLabel.textContent = newValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.inspector.emit("layoutview-updated");
|
this.elementRules = [e.rule for (e of styleEntries)];
|
||||||
return null;
|
|
||||||
});
|
|
||||||
|
|
||||||
this._lastRequest = lastRequest;
|
this.inspector.emit("layoutview-updated");
|
||||||
return this._lastRequest;
|
}).bind(this)).then(null, console.error);
|
||||||
|
|
||||||
|
return this._lastRequest = lastRequest;
|
||||||
},
|
},
|
||||||
|
|
||||||
showBoxModel: function(options={}) {
|
showBoxModel: function(options={}) {
|
||||||
|
|
|
@ -39,20 +39,20 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="border top"><span data-box="border" tooltip="border-top"></span></p>
|
<p class="border top"><span data-box="border" class="editable" tooltip="border-top"></span></p>
|
||||||
<p class="border right"><span data-box="border" tooltip="border-right"></span></p>
|
<p class="border right"><span data-box="border" class="editable" tooltip="border-right"></span></p>
|
||||||
<p class="border bottom"><span data-box="border" tooltip="border-bottom"></span></p>
|
<p class="border bottom"><span data-box="border" class="editable" tooltip="border-bottom"></span></p>
|
||||||
<p class="border left"><span data-box="border" tooltip="border-left"></span></p>
|
<p class="border left"><span data-box="border" class="editable" tooltip="border-left"></span></p>
|
||||||
|
|
||||||
<p class="margin top"><span data-box="margin" tooltip="margin-top"></span></p>
|
<p class="margin top"><span data-box="margin" class="editable" tooltip="margin-top"></span></p>
|
||||||
<p class="margin right"><span data-box="margin" tooltip="margin-right"></span></p>
|
<p class="margin right"><span data-box="margin" class="editable" tooltip="margin-right"></span></p>
|
||||||
<p class="margin bottom"><span data-box="margin" tooltip="margin-bottom"></span></p>
|
<p class="margin bottom"><span data-box="margin" class="editable" tooltip="margin-bottom"></span></p>
|
||||||
<p class="margin left"><span data-box="margin" tooltip="margin-left"></span></p>
|
<p class="margin left"><span data-box="margin" class="editable" tooltip="margin-left"></span></p>
|
||||||
|
|
||||||
<p class="padding top"><span data-box="padding" tooltip="padding-top"></span></p>
|
<p class="padding top"><span data-box="padding" class="editable" tooltip="padding-top"></span></p>
|
||||||
<p class="padding right"><span data-box="padding" tooltip="padding-right"></span></p>
|
<p class="padding right"><span data-box="padding" class="editable" tooltip="padding-right"></span></p>
|
||||||
<p class="padding bottom"><span data-box="padding" tooltip="padding-bottom"></span></p>
|
<p class="padding bottom"><span data-box="padding" class="editable" tooltip="padding-bottom"></span></p>
|
||||||
<p class="padding left"><span data-box="padding" tooltip="padding-left"></span></p>
|
<p class="padding left"><span data-box="padding" class="editable" tooltip="padding-left"></span></p>
|
||||||
|
|
||||||
<p class="size"><span data-box="content" tooltip="&content.tooltip;"></span></p>
|
<p class="size"><span data-box="content" tooltip="&content.tooltip;"></span></p>
|
||||||
|
|
||||||
|
@ -60,5 +60,8 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div style="display: none">
|
||||||
|
<p id="dummy"></p>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -211,7 +211,8 @@ function waitForNetworkEvents(aMonitor, aGetRequests, aPostRequests = 0) {
|
||||||
|
|
||||||
function verifyRequestItemTarget(aRequestItem, aMethod, aUrl, aData = {}) {
|
function verifyRequestItemTarget(aRequestItem, aMethod, aUrl, aData = {}) {
|
||||||
info("> Verifying: " + aMethod + " " + aUrl + " " + aData.toSource());
|
info("> Verifying: " + aMethod + " " + aUrl + " " + aData.toSource());
|
||||||
info("> Request: " + aRequestItem.attachment.toSource());
|
// This bloats log sizes significantly in automation (bug 992485)
|
||||||
|
//info("> Request: " + aRequestItem.attachment.toSource());
|
||||||
|
|
||||||
let requestsMenu = aRequestItem.ownerView;
|
let requestsMenu = aRequestItem.ownerView;
|
||||||
let widgetIndex = requestsMenu.indexOfItem(aRequestItem);
|
let widgetIndex = requestsMenu.indexOfItem(aRequestItem);
|
||||||
|
|
|
@ -376,6 +376,11 @@ InplaceEditor.prototype = {
|
||||||
this.input.setSelectionRange(newValue.start, newValue.end);
|
this.input.setSelectionRange(newValue.start, newValue.end);
|
||||||
this._doValidation();
|
this._doValidation();
|
||||||
|
|
||||||
|
// Call the user's change handler if available.
|
||||||
|
if (this.change) {
|
||||||
|
this.change(this.input.value.trim());
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,9 @@ add_task(function* test_setup() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
add_task(function* test_contract() {
|
||||||
|
Cc["@mozilla.org/browser/experiments-service;1"].getService();
|
||||||
|
});
|
||||||
|
|
||||||
// Test basic starting and stopping of experiments.
|
// Test basic starting and stopping of experiments.
|
||||||
|
|
||||||
|
|
|
@ -729,6 +729,8 @@ var ApplicationFactory = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#include ../../../toolkit/components/exthelper/extApplication.js
|
||||||
|
|
||||||
//=================================================
|
//=================================================
|
||||||
// Application constructor
|
// Application constructor
|
||||||
function Application() {
|
function Application() {
|
||||||
|
@ -737,42 +739,56 @@ function Application() {
|
||||||
|
|
||||||
//=================================================
|
//=================================================
|
||||||
// Application implementation
|
// Application implementation
|
||||||
Application.prototype = {
|
function ApplicationPrototype() {
|
||||||
// for nsIClassInfo + XPCOMUtils
|
// for nsIClassInfo + XPCOMUtils
|
||||||
classID: APPLICATION_CID,
|
this.classID = APPLICATION_CID;
|
||||||
|
|
||||||
// redefine the default factory for XPCOMUtils
|
// redefine the default factory for XPCOMUtils
|
||||||
_xpcom_factory: ApplicationFactory,
|
this._xpcom_factory = ApplicationFactory;
|
||||||
|
|
||||||
// for nsISupports
|
// for nsISupports
|
||||||
QueryInterface: XPCOMUtils.generateQI([Ci.fuelIApplication, Ci.extIApplication,
|
this.QueryInterface = XPCOMUtils.generateQI([
|
||||||
Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
Ci.fuelIApplication,
|
||||||
|
Ci.extIApplication,
|
||||||
|
Ci.nsIObserver,
|
||||||
|
Ci.nsISupportsWeakReference
|
||||||
|
]);
|
||||||
|
|
||||||
// for nsIClassInfo
|
// for nsIClassInfo
|
||||||
classInfo: XPCOMUtils.generateCI({classID: APPLICATION_CID,
|
this.classInfo = XPCOMUtils.generateCI({
|
||||||
|
classID: APPLICATION_CID,
|
||||||
contractID: APPLICATION_CONTRACTID,
|
contractID: APPLICATION_CONTRACTID,
|
||||||
interfaces: [Ci.fuelIApplication,
|
interfaces: [
|
||||||
|
Ci.fuelIApplication,
|
||||||
Ci.extIApplication,
|
Ci.extIApplication,
|
||||||
Ci.nsIObserver],
|
Ci.nsIObserver
|
||||||
flags: Ci.nsIClassInfo.SINGLETON}),
|
],
|
||||||
|
flags: Ci.nsIClassInfo.SINGLETON
|
||||||
|
});
|
||||||
|
|
||||||
// for nsIObserver
|
// for nsIObserver
|
||||||
observe: function app_observe(aSubject, aTopic, aData) {
|
this.observe = function (aSubject, aTopic, aData) {
|
||||||
// Call the extApplication version of this function first
|
// Call the extApplication version of this function first
|
||||||
this.__proto__.__proto__.observe.call(this, aSubject, aTopic, aData);
|
var superPrototype = Object.getPrototypeOf(Object.getPrototypeOf(this));
|
||||||
|
superPrototype.observe.call(this, aSubject, aTopic, aData);
|
||||||
if (aTopic == "xpcom-shutdown") {
|
if (aTopic == "xpcom-shutdown") {
|
||||||
this._obs.removeObserver(this, "xpcom-shutdown");
|
this._obs.removeObserver(this, "xpcom-shutdown");
|
||||||
Utilities.free();
|
Utilities.free();
|
||||||
}
|
}
|
||||||
},
|
};
|
||||||
|
|
||||||
get bookmarks() {
|
Object.defineProperty(this, "bookmarks", {
|
||||||
|
get: function bookmarks () {
|
||||||
let bookmarks = new BookmarkRoots();
|
let bookmarks = new BookmarkRoots();
|
||||||
this.__defineGetter__("bookmarks", function() bookmarks);
|
Object.defineProperty(this, "bookmarks", { value: bookmarks });
|
||||||
return this.bookmarks;
|
return this.bookmarks;
|
||||||
},
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
get windows() {
|
Object.defineProperty(this, "windows", {
|
||||||
|
get: function windows() {
|
||||||
var win = [];
|
var win = [];
|
||||||
var browserEnum = Utilities.windowMediator.getEnumerator("navigator:browser");
|
var browserEnum = Utilities.windowMediator.getEnumerator("navigator:browser");
|
||||||
|
|
||||||
|
@ -781,16 +797,22 @@ Application.prototype = {
|
||||||
|
|
||||||
return win;
|
return win;
|
||||||
},
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(this, "activeWindow", {
|
||||||
|
get: () => getWindow(Utilities.windowMediator.getMostRecentWindow("navigator:browser")),
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
get activeWindow() {
|
|
||||||
return getWindow(Utilities.windowMediator.getMostRecentWindow("navigator:browser"));
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#include ../../../toolkit/components/exthelper/extApplication.js
|
|
||||||
|
|
||||||
// set the proto, defined in extApplication.js
|
// set the proto, defined in extApplication.js
|
||||||
Application.prototype.__proto__ = extApplication.prototype;
|
ApplicationPrototype.prototype = extApplication.prototype;
|
||||||
|
|
||||||
|
Application.prototype = new ApplicationPrototype();
|
||||||
|
|
||||||
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([Application]);
|
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([Application]);
|
||||||
|
|
||||||
|
|
|
@ -368,6 +368,8 @@
|
||||||
@BINPATH@/browser/components/BrowserPlaces.manifest
|
@BINPATH@/browser/components/BrowserPlaces.manifest
|
||||||
@BINPATH@/browser/components/devtools-clhandler.manifest
|
@BINPATH@/browser/components/devtools-clhandler.manifest
|
||||||
@BINPATH@/browser/components/devtools-clhandler.js
|
@BINPATH@/browser/components/devtools-clhandler.js
|
||||||
|
@BINPATH@/browser/components/Experiments.manifest
|
||||||
|
@BINPATH@/browser/components/ExperimentsService.js
|
||||||
@BINPATH@/components/Downloads.manifest
|
@BINPATH@/components/Downloads.manifest
|
||||||
@BINPATH@/components/DownloadLegacy.js
|
@BINPATH@/components/DownloadLegacy.js
|
||||||
@BINPATH@/components/BrowserPageThumbs.manifest
|
@BINPATH@/components/BrowserPageThumbs.manifest
|
||||||
|
|
|
@ -707,7 +707,7 @@ Function SendPing
|
||||||
Call RelativeGotoPage
|
Call RelativeGotoPage
|
||||||
!else
|
!else
|
||||||
${NSD_CreateTimer} OnPing ${DownloadIntervalMS}
|
${NSD_CreateTimer} OnPing ${DownloadIntervalMS}
|
||||||
InetBgDL::Get "${BaseURLStubPing}/${StubURLVersion}/${Channel}/${UpdateChannel}/${AB_CD}/$R0/$R1/$5/$6/$7/$8/$9/$ExitCode/$FirefoxLaunchCode/$DownloadRetryCount/$DownloadedBytes/$DownloadSizeBytes/$IntroPhaseSeconds/$OptionsPhaseSeconds/$0/$1/$DownloadFirstTransferSeconds/$2/$3/$4/$InitialInstallRequirementsCode/$OpenedDownloadPage/$ExistingProfile/$ExistingVersion/$ExistingBuildID/$R5/$R6/$R7/$R8/$R2/$R3/$DownloadServerIP" \
|
InetBgDL::Get "${BaseURLStubPing}/${StubURLVersion}${StubURLVersionAppend}/${Channel}/${UpdateChannel}/${AB_CD}/$R0/$R1/$5/$6/$7/$8/$9/$ExitCode/$FirefoxLaunchCode/$DownloadRetryCount/$DownloadedBytes/$DownloadSizeBytes/$IntroPhaseSeconds/$OptionsPhaseSeconds/$0/$1/$DownloadFirstTransferSeconds/$2/$3/$4/$InitialInstallRequirementsCode/$OpenedDownloadPage/$ExistingProfile/$ExistingVersion/$ExistingBuildID/$R5/$R6/$R7/$R8/$R2/$R3/$DownloadServerIP" \
|
||||||
"$PLUGINSDIR\_temp" /END
|
"$PLUGINSDIR\_temp" /END
|
||||||
!endif
|
!endif
|
||||||
${Else}
|
${Else}
|
||||||
|
|
|
@ -99,7 +99,6 @@ VIAddVersionKey "OriginalFilename" "helper.exe"
|
||||||
!insertmacro un.CheckForFilesInUse
|
!insertmacro un.CheckForFilesInUse
|
||||||
!insertmacro un.CleanUpdateDirectories
|
!insertmacro un.CleanUpdateDirectories
|
||||||
!insertmacro un.CleanVirtualStore
|
!insertmacro un.CleanVirtualStore
|
||||||
!insertmacro un.DeleteRelativeProfiles
|
|
||||||
!insertmacro un.DeleteShortcuts
|
!insertmacro un.DeleteShortcuts
|
||||||
!insertmacro un.GetLongPath
|
!insertmacro un.GetLongPath
|
||||||
!insertmacro un.GetSecondInstallPath
|
!insertmacro un.GetSecondInstallPath
|
||||||
|
@ -256,15 +255,6 @@ Section "Uninstall"
|
||||||
ClearErrors
|
ClearErrors
|
||||||
${EndIf}
|
${EndIf}
|
||||||
|
|
||||||
${MUI_INSTALLOPTIONS_READ} $0 "unconfirm.ini" "Field 3" "State"
|
|
||||||
${If} "$0" == "1"
|
|
||||||
${un.DeleteRelativeProfiles} "Mozilla\Firefox"
|
|
||||||
${un.DeleteRelativeProfiles} "Mozilla\MetroFirefox"
|
|
||||||
RmDir "$APPDATA\Mozilla\Extensions\{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
|
|
||||||
RmDir "$APPDATA\Mozilla\Extensions"
|
|
||||||
RmDir "$APPDATA\Mozilla"
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
; setup the application model id registration value
|
; setup the application model id registration value
|
||||||
${un.InitHashAppModelId} "$INSTDIR" "Software\Mozilla\${AppName}\TaskBarIDs"
|
${un.InitHashAppModelId} "$INSTDIR" "Software\Mozilla\${AppName}\TaskBarIDs"
|
||||||
|
|
||||||
|
@ -551,7 +541,7 @@ Function un.preConfirm
|
||||||
${EndIf}
|
${EndIf}
|
||||||
|
|
||||||
; Setup the unconfirm.ini file for the Custom Uninstall Confirm Page
|
; Setup the unconfirm.ini file for the Custom Uninstall Confirm Page
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "5"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "3"
|
||||||
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Type "label"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Type "label"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Text "$(UN_CONFIRM_UNINSTALLED_FROM)"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Text "$(UN_CONFIRM_UNINSTALLED_FROM)"
|
||||||
|
@ -571,44 +561,22 @@ Function un.preConfirm
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Bottom "30"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Bottom "30"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" flags "READONLY"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" flags "READONLY"
|
||||||
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Type "checkbox"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Type "label"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Text "$(UN_REMOVE_PROFILES)"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Text "$(UN_CONFIRM_CLICK)"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Left "0"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Left "0"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Right "-1"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Right "-1"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Top "40"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Top "130"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Bottom "50"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Bottom "150"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" State "0"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" flags "NOTIFY"
|
|
||||||
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Type "text"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" State "$(UN_REMOVE_PROFILES_DESC)"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Left "0"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Right "-1"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Top "52"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Bottom "120"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" flags "MULTILINE|READONLY"
|
|
||||||
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Type "label"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Text "$(UN_CONFIRM_CLICK)"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Left "0"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Right "-1"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Top "130"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Bottom "150"
|
|
||||||
|
|
||||||
${If} "$TmpVal" == "true"
|
${If} "$TmpVal" == "true"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Type "label"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Type "label"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Text "$(SUMMARY_REBOOT_REQUIRED_UNINSTALL)"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Text "$(SUMMARY_REBOOT_REQUIRED_UNINSTALL)"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Left "0"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Left "0"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Right "-1"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Right "-1"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Top "35"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Top "35"
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Bottom "45"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Bottom "45"
|
||||||
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "6"
|
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "4"
|
||||||
|
|
||||||
; To insert this control reset Top / Bottom for controls below this one
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Top "55"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Bottom "65"
|
|
||||||
WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Top "67"
|
|
||||||
${EndIf}
|
${EndIf}
|
||||||
|
|
||||||
!insertmacro MUI_HEADER_TEXT "$(UN_CONFIRM_PAGE_TITLE)" "$(UN_CONFIRM_PAGE_SUBTITLE)"
|
!insertmacro MUI_HEADER_TEXT "$(UN_CONFIRM_PAGE_TITLE)" "$(UN_CONFIRM_PAGE_SUBTITLE)"
|
||||||
|
@ -616,9 +584,6 @@ Function un.preConfirm
|
||||||
; focus. This sets the focus to the Install button instead.
|
; focus. This sets the focus to the Install button instead.
|
||||||
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "unconfirm.ini"
|
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "unconfirm.ini"
|
||||||
GetDlgItem $0 $HWNDPARENT 1
|
GetDlgItem $0 $HWNDPARENT 1
|
||||||
${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 4" "HWND"
|
|
||||||
SetCtlColors $1 0x000000 0xFFFFEE
|
|
||||||
ShowWindow $1 ${SW_HIDE}
|
|
||||||
System::Call "user32::SetFocus(i r0, i 0x0007, i,i)i"
|
System::Call "user32::SetFocus(i r0, i 0x0007, i,i)i"
|
||||||
${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 2" "HWND"
|
${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 2" "HWND"
|
||||||
SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR"
|
SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR"
|
||||||
|
@ -626,19 +591,6 @@ Function un.preConfirm
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
Function un.leaveConfirm
|
Function un.leaveConfirm
|
||||||
${MUI_INSTALLOPTIONS_READ} $0 "unconfirm.ini" "Settings" "State"
|
|
||||||
StrCmp $0 "3" +1 continue
|
|
||||||
${MUI_INSTALLOPTIONS_READ} $0 "unconfirm.ini" "Field 3" "State"
|
|
||||||
${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 4" "HWND"
|
|
||||||
StrCmp $0 1 +1 +3
|
|
||||||
ShowWindow $1 ${SW_SHOW}
|
|
||||||
Abort
|
|
||||||
|
|
||||||
ShowWindow $1 ${SW_HIDE}
|
|
||||||
Abort
|
|
||||||
|
|
||||||
continue:
|
|
||||||
|
|
||||||
; Try to delete the app executable and if we can't delete it try to find the
|
; Try to delete the app executable and if we can't delete it try to find the
|
||||||
; app's message window and prompt the user to close the app. This allows
|
; app's message window and prompt the user to close the app. This allows
|
||||||
; running an instance that is located in another directory. If for whatever
|
; running an instance that is located in another directory. If for whatever
|
||||||
|
|
|
@ -58,8 +58,6 @@ UN_CONFIRM_PAGE_TITLE=Uninstall $BrandFullName
|
||||||
UN_CONFIRM_PAGE_SUBTITLE=Remove $BrandFullName from your computer.
|
UN_CONFIRM_PAGE_SUBTITLE=Remove $BrandFullName from your computer.
|
||||||
UN_CONFIRM_UNINSTALLED_FROM=$BrandShortName will be uninstalled from the following location:
|
UN_CONFIRM_UNINSTALLED_FROM=$BrandShortName will be uninstalled from the following location:
|
||||||
UN_CONFIRM_CLICK=Click Uninstall to continue.
|
UN_CONFIRM_CLICK=Click Uninstall to continue.
|
||||||
UN_REMOVE_PROFILES=&Remove my $BrandShortName personal data and customizations
|
|
||||||
UN_REMOVE_PROFILES_DESC=This will permanently remove your bookmarks, saved passwords, cookies and customizations. You may wish to keep this information if you plan on installing another version of $BrandShortName in the future.
|
|
||||||
|
|
||||||
BANNER_CHECK_EXISTING=Checking existing installation…
|
BANNER_CHECK_EXISTING=Checking existing installation…
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
/* vim: set ts=2 sw=2 et tw=80: */
|
||||||
|
/* 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/. */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
let Cc = Components.classes;
|
||||||
|
let Ci = Components.interfaces;
|
||||||
|
let Cu = Components.utils;
|
||||||
|
|
||||||
|
this.EXPORTED_SYMBOLS = [ "RemotePrompt" ];
|
||||||
|
|
||||||
|
Cu.import("resource:///modules/PlacesUIUtils.jsm");
|
||||||
|
Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
|
||||||
|
Cu.import("resource://gre/modules/Services.jsm");
|
||||||
|
Cu.import("resource://gre/modules/SharedPromptUtils.jsm");
|
||||||
|
|
||||||
|
let RemotePrompt = {
|
||||||
|
init: function() {
|
||||||
|
let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
|
||||||
|
mm.addMessageListener("Prompt:Open", this);
|
||||||
|
},
|
||||||
|
|
||||||
|
receiveMessage: function(message) {
|
||||||
|
switch (message.name) {
|
||||||
|
case "Prompt:Open":
|
||||||
|
if (message.data.uri) {
|
||||||
|
this.openModalWindow(message.data, message.target);
|
||||||
|
} else {
|
||||||
|
this.openTabPrompt(message.data, message.target)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
openTabPrompt: function(args, browser) {
|
||||||
|
let window = browser.ownerDocument.defaultView;
|
||||||
|
let tabPrompt = window.gBrowser.getTabModalPromptBox(browser)
|
||||||
|
let callbackInvoked = false;
|
||||||
|
let newPrompt;
|
||||||
|
let promptId = args._remoteId;
|
||||||
|
|
||||||
|
function onPromptClose(forceCleanup) {
|
||||||
|
if (newPrompt)
|
||||||
|
tabPrompt.removePrompt(newPrompt);
|
||||||
|
|
||||||
|
PromptUtils.fireDialogEvent(window, "DOMModalDialogClosed", browser);
|
||||||
|
browser.messageManager.sendAsyncMessage("Prompt:Close", args);
|
||||||
|
}
|
||||||
|
|
||||||
|
browser.messageManager.addMessageListener("Prompt:ForceClose", function listener(message) {
|
||||||
|
// If this was for another prompt in the same tab, ignore it.
|
||||||
|
if (message.data._remoteId !== promptId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
browser.messageManager.removeMessageListener("Prompt:ForceClose", listener);
|
||||||
|
|
||||||
|
if (newPrompt) {
|
||||||
|
newPrompt.abortPrompt();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
PromptUtils.fireDialogEvent(window, "DOMWillOpenModalDialog", browser);
|
||||||
|
|
||||||
|
args.promptActive = true;
|
||||||
|
|
||||||
|
newPrompt = tabPrompt.appendPrompt(args, onPromptClose);
|
||||||
|
|
||||||
|
// TODO since we don't actually open a window, need to check if
|
||||||
|
// there's other stuff in nsWindowWatcher::OpenWindowInternal
|
||||||
|
// that we might need to do here as well.
|
||||||
|
} catch (ex) {
|
||||||
|
onPromptClose(true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
openModalWindow: function(args, browser) {
|
||||||
|
let window = browser.ownerDocument.defaultView;
|
||||||
|
try {
|
||||||
|
PromptUtils.fireDialogEvent(window, "DOMWillOpenModalDialog", browser);
|
||||||
|
let bag = PromptUtils.objectToPropBag(args);
|
||||||
|
|
||||||
|
Services.ww.openWindow(window, args.uri, "_blank",
|
||||||
|
"centerscreen,chrome,modal,titlebar", bag);
|
||||||
|
|
||||||
|
PromptUtils.propBagToObject(bag, args);
|
||||||
|
} finally {
|
||||||
|
PromptUtils.fireDialogEvent(window, "DOMModalDialogClosed", browser);
|
||||||
|
browser.messageManager.sendAsyncMessage("Prompt:Close", args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
|
@ -15,6 +15,7 @@ EXTRA_JS_MODULES += [
|
||||||
'Feeds.jsm',
|
'Feeds.jsm',
|
||||||
'NetworkPrioritizer.jsm',
|
'NetworkPrioritizer.jsm',
|
||||||
'offlineAppCache.jsm',
|
'offlineAppCache.jsm',
|
||||||
|
'RemotePrompt.jsm',
|
||||||
'SharedFrame.jsm',
|
'SharedFrame.jsm',
|
||||||
'SitePermissions.jsm',
|
'SitePermissions.jsm',
|
||||||
'Social.jsm',
|
'Social.jsm',
|
||||||
|
|
|
@ -39,3 +39,16 @@
|
||||||
background-color: #d89b28;
|
background-color: #d89b28;
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.editable {
|
||||||
|
border-bottom: 1px dashed transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editable:hover {
|
||||||
|
border-bottom-color: hsl(0,0%,50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.styleinspector-propertyeditor {
|
||||||
|
border: 1px solid #CCC;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
|
@ -132,7 +132,6 @@ button,
|
||||||
menulist {
|
menulist {
|
||||||
-moz-appearance: none;
|
-moz-appearance: none;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
max-height: 30px;
|
|
||||||
color: #737980;
|
color: #737980;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
text-shadow: 0 1px 1px #FEFFFE;
|
text-shadow: 0 1px 1px #FEFFFE;
|
||||||
|
|
|
@ -123,21 +123,15 @@
|
||||||
* text and icons to not appear fuzzy.
|
* text and icons to not appear fuzzy.
|
||||||
*/
|
*/
|
||||||
@media (-moz-windows-classic) {
|
@media (-moz-windows-classic) {
|
||||||
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) .tabbrowser-tab[selected=true] {
|
/**
|
||||||
position: relative;
|
* We need to bump up the z-index of the tabbrowser-tabs so that they appear
|
||||||
z-index: 3;
|
* over top of the fog we're applying for classic themes, as well as the nav-bar.
|
||||||
}
|
*/
|
||||||
|
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) #tabbrowser-tabs {
|
||||||
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) .tabbrowser-tab:not([selected=true]) {
|
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) .tabs-newtab-button {
|
|
||||||
position: relative;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main-window[tabsintitlebar] #TabsToolbar:not(:-moz-lwtheme) {
|
#main-window[tabsintitlebar] #TabsToolbar:not(:-moz-lwtheme) {
|
||||||
background-image: none;
|
background-image: none;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
@ -159,7 +153,6 @@
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
top: 100%;
|
top: 100%;
|
||||||
width: -moz-available;
|
width: -moz-available;
|
||||||
z-index: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) #TabsToolbar:not(:-moz-lwtheme):-moz-window-inactive::after {
|
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) #TabsToolbar:not(:-moz-lwtheme):-moz-window-inactive::after {
|
||||||
|
@ -176,17 +169,31 @@
|
||||||
overflow: -moz-hidden-unscrollable;
|
overflow: -moz-hidden-unscrollable;
|
||||||
}
|
}
|
||||||
|
|
||||||
#main-window[tabsintitlebar][sizemode=normal] .tabbrowser-arrowscrollbox > .arrowscrollbox-scrollbox > .scrollbox-innerbox:not(:-moz-lwtheme) {
|
/**
|
||||||
position: relative;
|
* When the tabstrip is overflowed, pinned tab separators get position: absolute,
|
||||||
|
* which makes the pinned tab separators leak over the nav-bar highlight. Forcing
|
||||||
|
* the element to snap to the bottom of the client rect works around the issue.
|
||||||
|
*/
|
||||||
|
#main-window[tabsintitlebar] #tabbrowser-tabs[positionpinnedtabs] > .tabbrowser-tab[pinned]::before {
|
||||||
|
bottom: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) #TabsToolbar .toolbarbutton-1,
|
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) #TabsToolbar .toolbarbutton-1 {
|
||||||
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) .tabbrowser-arrowscrollbox > .scrollbutton-up,
|
|
||||||
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) .tabbrowser-arrowscrollbox > .scrollbutton-down {
|
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* With the tabbrowser-tabs element z-index'd above the nav-bar, we now get the
|
||||||
|
* scrollbox button borders leaking over the nav-bar highlight. This transparent bottom
|
||||||
|
* border forces the scrollbox button borders to terminate a pixel early, working
|
||||||
|
* around the issue.
|
||||||
|
*/
|
||||||
|
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) .tabbrowser-arrowscrollbox > .scrollbutton-up,
|
||||||
|
#main-window[tabsintitlebar]:not([sizemode=fullscreen]) .tabbrowser-arrowscrollbox > .scrollbutton-down {
|
||||||
|
border-bottom: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
#main-window[tabsintitlebar]:not([inFullscreen]) .tab-close-button:not(:-moz-any(:hover,:-moz-lwtheme,[selected="true"])) {
|
#main-window[tabsintitlebar]:not([inFullscreen]) .tab-close-button:not(:-moz-any(:hover,:-moz-lwtheme,[selected="true"])) {
|
||||||
-moz-image-region: rect(0, 64px, 16px, 48px);
|
-moz-image-region: rect(0, 64px, 16px, 48px);
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,6 +632,32 @@ public:
|
||||||
GetElementsByClassName(const nsAString& aClassNames);
|
GetElementsByClassName(const nsAString& aClassNames);
|
||||||
bool MozMatchesSelector(const nsAString& aSelector,
|
bool MozMatchesSelector(const nsAString& aSelector,
|
||||||
ErrorResult& aError);
|
ErrorResult& aError);
|
||||||
|
void SetPointerCapture(int32_t aPointerId, ErrorResult& aError)
|
||||||
|
{
|
||||||
|
bool activeState = false;
|
||||||
|
if (!nsIPresShell::GetPointerInfo(aPointerId, activeState)) {
|
||||||
|
aError.Throw(NS_ERROR_DOM_INVALID_POINTER_ERR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!activeState) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nsIPresShell::SetPointerCapturingContent(aPointerId, this);
|
||||||
|
}
|
||||||
|
void ReleasePointerCapture(int32_t aPointerId, ErrorResult& aError)
|
||||||
|
{
|
||||||
|
bool activeState = false;
|
||||||
|
if (!nsIPresShell::GetPointerInfo(aPointerId, activeState)) {
|
||||||
|
aError.Throw(NS_ERROR_DOM_INVALID_POINTER_ERR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ignoring ReleasePointerCapture call on incorrect element (on element
|
||||||
|
// that didn't have capture before).
|
||||||
|
if (nsIPresShell::GetPointerCapturingContent(aPointerId) == this) {
|
||||||
|
nsIPresShell::ReleasePointerCapturingContent(aPointerId, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
void SetCapture(bool aRetargetToElement)
|
void SetCapture(bool aRetargetToElement)
|
||||||
{
|
{
|
||||||
// If there is already an active capture, ignore this request. This would
|
// If there is already an active capture, ignore this request. This would
|
||||||
|
|
|
@ -5,11 +5,9 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=339494
|
https://bugzilla.mozilla.org/show_bug.cgi?id=339494
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 339494"
|
<window title="Mozilla Bug 339494"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 339494</title>
|
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
|
@ -7,10 +7,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=357450
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<window title="Mozilla Bug 357450"
|
<window title="Mozilla Bug 357450"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 357450</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
<!-- This file is shared with non-chrome tests -->
|
<!-- This file is shared with non-chrome tests -->
|
||||||
|
|
|
@ -10,7 +10,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=607114.xul
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
xmlns:html="http://www.w3.org/1999/xhtml"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 607114</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,12 @@ public:
|
||||||
|
|
||||||
NS_INLINE_DECL_REFCOUNTING(WebGLActiveInfo)
|
NS_INLINE_DECL_REFCOUNTING(WebGLActiveInfo)
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
|
// Private destructor, to discourage deletion outside of Release():
|
||||||
|
~WebGLActiveInfo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
GLint mSize;
|
GLint mSize;
|
||||||
GLenum mType;
|
GLenum mType;
|
||||||
nsString mName;
|
nsString mName;
|
||||||
|
|
|
@ -39,7 +39,12 @@ public:
|
||||||
|
|
||||||
NS_INLINE_DECL_REFCOUNTING(WebGLShaderPrecisionFormat)
|
NS_INLINE_DECL_REFCOUNTING(WebGLShaderPrecisionFormat)
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
|
// Private destructor, to discourage deletion outside of Release():
|
||||||
|
~WebGLShaderPrecisionFormat()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
GLint mRangeMin;
|
GLint mRangeMin;
|
||||||
GLint mRangeMax;
|
GLint mRangeMax;
|
||||||
GLint mPrecision;
|
GLint mPrecision;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
|
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
|
||||||
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml">
|
xmlns:html="http://www.w3.org/1999/xhtml"
|
||||||
title="Test for Bug 233643">
|
title="Test for Bug 233643">
|
||||||
<!--
|
<!--
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=233643
|
https://bugzilla.mozilla.org/show_bug.cgi?id=233643
|
||||||
|
|
|
@ -100,7 +100,8 @@ const JSClass nsXULPDGlobalObject::gSharedGlobalClass = {
|
||||||
JSCLASS_IMPLEMENTS_BARRIERS | JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(0),
|
JSCLASS_IMPLEMENTS_BARRIERS | JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(0),
|
||||||
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
|
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
|
||||||
JS_EnumerateStub, nsXULPDGlobalObject_resolve, JS_ConvertStub,
|
JS_EnumerateStub, nsXULPDGlobalObject_resolve, JS_ConvertStub,
|
||||||
nsXULPDGlobalObject_finalize, nullptr, nullptr, nullptr, nullptr
|
nsXULPDGlobalObject_finalize, nullptr, nullptr, nullptr,
|
||||||
|
JS_GlobalObjectTraceHook
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=199692
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<vbox hidden="true">
|
||||||
<bindings xmlns="http://www.mozilla.org/xbl"
|
<bindings xmlns="http://www.mozilla.org/xbl"
|
||||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<binding id="anon">
|
<binding id="anon">
|
||||||
|
@ -19,6 +20,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=199692
|
||||||
</content>
|
</content>
|
||||||
</binding>
|
</binding>
|
||||||
</bindings>
|
</bindings>
|
||||||
|
</vbox>
|
||||||
|
|
||||||
<body id="body" xmlns="http://www.w3.org/1999/xhtml">
|
<body id="body" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=199692">Mozilla Bug 199692</a>
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=199692">Mozilla Bug 199692</a>
|
||||||
|
|
|
@ -8,7 +8,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=311681
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
xmlns:html="http://www.w3.org/1999/xhtml"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 311681</title>
|
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
|
@ -9,7 +9,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=335375
|
||||||
<window title="Mozilla Bug 335375"
|
<window title="Mozilla Bug 335375"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||||
onload="RunTest();">
|
onload="RunTest();">
|
||||||
<title>Mozilla Bug 335375</title>
|
|
||||||
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||||
|
|
|
@ -8,7 +8,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=414907
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||||
|
|
||||||
<bindings xmlns="http://www.mozilla.org/xbl"
|
<vbox hidden="true">
|
||||||
|
<bindings xmlns="http://www.mozilla.org/xbl" style="display: block;"
|
||||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<binding id="anon">
|
<binding id="anon">
|
||||||
<implementation>
|
<implementation>
|
||||||
|
@ -22,6 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=414907
|
||||||
</implementation>
|
</implementation>
|
||||||
</binding>
|
</binding>
|
||||||
</bindings>
|
</bindings>
|
||||||
|
</vbox>
|
||||||
|
|
||||||
<!-- test results are displayed in the html:body -->
|
<!-- test results are displayed in the html:body -->
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
|
@ -9,7 +9,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=497875
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
xmlns:html="http://www.w3.org/1999/xhtml"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 497875</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=476634
|
https://bugzilla.mozilla.org/show_bug.cgi?id=476634
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 476634" onload="startup()"
|
<window title="Mozilla Bug 476634" onload="startup()"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 476634</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=112564
|
https://bugzilla.mozilla.org/show_bug.cgi?id=112564
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 112564"
|
<window title="Mozilla Bug 112564"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 112564</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=215405
|
https://bugzilla.mozilla.org/show_bug.cgi?id=215405
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 215405"
|
<window title="Mozilla Bug 215405"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 215405</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=293235.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=293235.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 293235"
|
<window title="Mozilla Bug 293235"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 293235</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=294258.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=294258.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 294258"
|
<window title="Mozilla Bug 294258"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 294258</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=298622.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=298622.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 298622"
|
<window title="Mozilla Bug 298622"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 298622</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=301397.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=301397.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 301397"
|
<window title="Mozilla Bug 301397"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 301397</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=303267.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=303267.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 303267"
|
<window title="Mozilla Bug 303267"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 303267</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=311007.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=311007.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 311007"
|
<window title="Mozilla Bug 311007"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 311007</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/MochiKit/packed.js"></script>
|
src="chrome://mochikit/content/MochiKit/packed.js"></script>
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=321671.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=321671.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 321671"
|
<window title="Mozilla Bug 321671"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 321671</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=360511.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=360511.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 360511"
|
<window title="Mozilla Bug 360511"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 360511</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=364461
|
https://bugzilla.mozilla.org/show_bug.cgi?id=364461
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 364461"
|
<window title="Mozilla Bug 364461"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 364461</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=396649.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=396649.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 396649"
|
<window title="Mozilla Bug 396649"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 396649</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src=
|
src=
|
||||||
"chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
|
"chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
|
||||||
|
|
|
@ -7,7 +7,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=453650
|
||||||
<window title="Mozilla Bug 453650"
|
<window title="Mozilla Bug 453650"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 453650</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=565388
|
||||||
<window title="Mozilla Bug 565388"
|
<window title="Mozilla Bug 565388"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 565388</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=582176.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=582176.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 582176"
|
<window title="Mozilla Bug 582176"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 582176</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=662200.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=662200.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 662200"
|
<window title="Mozilla Bug 662200"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 662200</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=846906
|
||||||
<window title="Mozilla Bug 846906"
|
<window title="Mozilla Bug 846906"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 846906</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=89419.xul
|
https://bugzilla.mozilla.org/show_bug.cgi?id=89419.xul
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 89419"
|
<window title="Mozilla Bug 89419"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 89419</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=92598
|
https://bugzilla.mozilla.org/show_bug.cgi?id=92598
|
||||||
-->
|
-->
|
||||||
<window title="Mozilla Bug 92598"
|
<window title="Mozilla Bug 92598"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 92598</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=769771
|
https://bugzilla.mozilla.org/show_bug.cgi?id=769771
|
||||||
-->
|
-->
|
||||||
<window title="Test mozFrameType attribute"
|
<window title="Test mozFrameType attribute"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test mozFrameType attribute</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,8 @@
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=719994
|
https://bugzilla.mozilla.org/show_bug.cgi?id=719994
|
||||||
-->
|
-->
|
||||||
<window title="Test principal inheriting"
|
<window title="Test principal inheriting"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test principal inheriting</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ enum DOM4ErrorTypeCodeMap {
|
||||||
TimeoutError = nsIDOMDOMException::TIMEOUT_ERR,
|
TimeoutError = nsIDOMDOMException::TIMEOUT_ERR,
|
||||||
InvalidNodeTypeError = nsIDOMDOMException::INVALID_NODE_TYPE_ERR,
|
InvalidNodeTypeError = nsIDOMDOMException::INVALID_NODE_TYPE_ERR,
|
||||||
DataCloneError = nsIDOMDOMException::DATA_CLONE_ERR,
|
DataCloneError = nsIDOMDOMException::DATA_CLONE_ERR,
|
||||||
|
InvalidPointerId = nsIDOMDOMException::INVALID_POINTER_ERR,
|
||||||
EncodingError = 0,
|
EncodingError = 0,
|
||||||
|
|
||||||
/* XXX Should be JavaScript native errors */
|
/* XXX Should be JavaScript native errors */
|
||||||
|
|
|
@ -30,6 +30,7 @@ DOM4_MSG_DEF(QuotaExceededError, "The quota has been exceeded.", NS_ERROR_DOM_QU
|
||||||
DOM4_MSG_DEF(TimeoutError, "The operation timed out.", NS_ERROR_DOM_TIMEOUT_ERR)
|
DOM4_MSG_DEF(TimeoutError, "The operation timed out.", NS_ERROR_DOM_TIMEOUT_ERR)
|
||||||
DOM4_MSG_DEF(InvalidNodeTypeError, "The supplied node is incorrect or has an incorrect ancestor for this operation.", NS_ERROR_DOM_INVALID_NODE_TYPE_ERR)
|
DOM4_MSG_DEF(InvalidNodeTypeError, "The supplied node is incorrect or has an incorrect ancestor for this operation.", NS_ERROR_DOM_INVALID_NODE_TYPE_ERR)
|
||||||
DOM4_MSG_DEF(DataCloneError, "The object could not be cloned.", NS_ERROR_DOM_DATA_CLONE_ERR)
|
DOM4_MSG_DEF(DataCloneError, "The object could not be cloned.", NS_ERROR_DOM_DATA_CLONE_ERR)
|
||||||
|
DOM4_MSG_DEF(InvalidPointerId, "Invalid pointer id.", NS_ERROR_DOM_INVALID_POINTER_ERR)
|
||||||
|
|
||||||
/* XXX Should be JavaScript native TypeError */
|
/* XXX Should be JavaScript native TypeError */
|
||||||
DOM4_MSG_DEF(TypeError, "The method parameter is missing or invalid.", NS_ERROR_TYPE_ERR)
|
DOM4_MSG_DEF(TypeError, "The method parameter is missing or invalid.", NS_ERROR_TYPE_ERR)
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
#include "mozilla/dom/Element.h"
|
#include "mozilla/dom/Element.h"
|
||||||
#include "mozilla/dom/file/FileHandle.h"
|
#include "mozilla/dom/file/FileHandle.h"
|
||||||
#include "mozilla/dom/FileHandleBinding.h"
|
#include "mozilla/dom/FileHandleBinding.h"
|
||||||
|
#include "mozilla/dom/TabChild.h"
|
||||||
#include "mozilla/dom/IDBFactoryBinding.h"
|
#include "mozilla/dom/IDBFactoryBinding.h"
|
||||||
#include "mozilla/dom/indexedDB/IndexedDatabaseManager.h"
|
#include "mozilla/dom/indexedDB/IndexedDatabaseManager.h"
|
||||||
#include "mozilla/dom/quota/PersistenceType.h"
|
#include "mozilla/dom/quota/PersistenceType.h"
|
||||||
|
@ -3623,6 +3624,12 @@ nsDOMWindowUtils::GetIsParentWindowMainWidgetVisible(bool* aIsVisible)
|
||||||
nsCOMPtr<nsIWidget> parentWidget;
|
nsCOMPtr<nsIWidget> parentWidget;
|
||||||
nsIDocShell *docShell = window->GetDocShell();
|
nsIDocShell *docShell = window->GetDocShell();
|
||||||
if (docShell) {
|
if (docShell) {
|
||||||
|
if (TabChild *tabChild = TabChild::GetFrom(docShell)) {
|
||||||
|
if (!tabChild->SendIsParentWindowMainWidgetVisible(aIsVisible))
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIDocShellTreeOwner> parentTreeOwner;
|
nsCOMPtr<nsIDocShellTreeOwner> parentTreeOwner;
|
||||||
docShell->GetTreeOwner(getter_AddRefs(parentTreeOwner));
|
docShell->GetTreeOwner(getter_AddRefs(parentTreeOwner));
|
||||||
nsCOMPtr<nsIBaseWindow> parentWindow(do_GetInterface(parentTreeOwner));
|
nsCOMPtr<nsIBaseWindow> parentWindow(do_GetInterface(parentTreeOwner));
|
||||||
|
|
|
@ -2917,21 +2917,6 @@ nsGlobalWindow::UpdateParentTarget()
|
||||||
mParentTarget = eventTarget;
|
mParentTarget = eventTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
nsGlobalWindow::GetIsTabModalPromptAllowed()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(IsOuterWindow());
|
|
||||||
|
|
||||||
bool allowTabModal = true;
|
|
||||||
if (mDocShell) {
|
|
||||||
nsCOMPtr<nsIContentViewer> cv;
|
|
||||||
mDocShell->GetContentViewer(getter_AddRefs(cv));
|
|
||||||
cv->GetIsTabModalPromptAllowed(&allowTabModal);
|
|
||||||
}
|
|
||||||
|
|
||||||
return allowTabModal;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventTarget*
|
EventTarget*
|
||||||
nsGlobalWindow::GetTargetForDOMEvent()
|
nsGlobalWindow::GetTargetForDOMEvent()
|
||||||
{
|
{
|
||||||
|
@ -6166,10 +6151,6 @@ nsGlobalWindow::AlertOrConfirm(bool aAlert,
|
||||||
nsAutoString final;
|
nsAutoString final;
|
||||||
nsContentUtils::StripNullChars(aMessage, final);
|
nsContentUtils::StripNullChars(aMessage, final);
|
||||||
|
|
||||||
// Check if we're being called at a point where we can't use tab-modal
|
|
||||||
// prompts, because something doesn't want reentrancy.
|
|
||||||
bool allowTabModal = GetIsTabModalPromptAllowed();
|
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsCOMPtr<nsIPromptFactory> promptFac =
|
nsCOMPtr<nsIPromptFactory> promptFac =
|
||||||
do_GetService("@mozilla.org/prompter;1", &rv);
|
do_GetService("@mozilla.org/prompter;1", &rv);
|
||||||
|
@ -6185,9 +6166,10 @@ nsGlobalWindow::AlertOrConfirm(bool aAlert,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIWritablePropertyBag2> promptBag = do_QueryInterface(prompt);
|
// Always allow tab modal prompts for alert and confirm.
|
||||||
if (promptBag)
|
if (nsCOMPtr<nsIWritablePropertyBag2> promptBag = do_QueryInterface(prompt)) {
|
||||||
promptBag->SetPropertyAsBool(NS_LITERAL_STRING("allowTabModal"), allowTabModal);
|
promptBag->SetPropertyAsBool(NS_LITERAL_STRING("allowTabModal"), true);
|
||||||
|
}
|
||||||
|
|
||||||
bool result = false;
|
bool result = false;
|
||||||
nsAutoSyncOperation sync(mDoc);
|
nsAutoSyncOperation sync(mDoc);
|
||||||
|
@ -6281,10 +6263,6 @@ nsGlobalWindow::Prompt(const nsAString& aMessage, const nsAString& aInitial,
|
||||||
nsContentUtils::StripNullChars(aMessage, fixedMessage);
|
nsContentUtils::StripNullChars(aMessage, fixedMessage);
|
||||||
nsContentUtils::StripNullChars(aInitial, fixedInitial);
|
nsContentUtils::StripNullChars(aInitial, fixedInitial);
|
||||||
|
|
||||||
// Check if we're being called at a point where we can't use tab-modal
|
|
||||||
// prompts, because something doesn't want reentrancy.
|
|
||||||
bool allowTabModal = GetIsTabModalPromptAllowed();
|
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsCOMPtr<nsIPromptFactory> promptFac =
|
nsCOMPtr<nsIPromptFactory> promptFac =
|
||||||
do_GetService("@mozilla.org/prompter;1", &rv);
|
do_GetService("@mozilla.org/prompter;1", &rv);
|
||||||
|
@ -6300,9 +6278,10 @@ nsGlobalWindow::Prompt(const nsAString& aMessage, const nsAString& aInitial,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIWritablePropertyBag2> promptBag = do_QueryInterface(prompt);
|
// Always allow tab modal prompts for prompt.
|
||||||
if (promptBag)
|
if (nsCOMPtr<nsIWritablePropertyBag2> promptBag = do_QueryInterface(prompt)) {
|
||||||
promptBag->SetPropertyAsBool(NS_LITERAL_STRING("allowTabModal"), allowTabModal);
|
promptBag->SetPropertyAsBool(NS_LITERAL_STRING("allowTabModal"), true);
|
||||||
|
}
|
||||||
|
|
||||||
// Pass in the default value, if any.
|
// Pass in the default value, if any.
|
||||||
char16_t *inoutValue = ToNewUnicode(fixedInitial);
|
char16_t *inoutValue = ToNewUnicode(fixedInitial);
|
||||||
|
|
|
@ -1299,9 +1299,6 @@ protected:
|
||||||
|
|
||||||
virtual void UpdateParentTarget();
|
virtual void UpdateParentTarget();
|
||||||
|
|
||||||
// Outer windows only.
|
|
||||||
bool GetIsTabModalPromptAllowed();
|
|
||||||
|
|
||||||
inline int32_t DOMMinTimeoutValue() const;
|
inline int32_t DOMMinTimeoutValue() const;
|
||||||
|
|
||||||
nsresult CloneStorageEvent(const nsAString& aType,
|
nsresult CloneStorageEvent(const nsAString& aType,
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
<window title="DOMRequestHelper Test"
|
<window title="DOMRequestHelper Test"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||||
onload="start();">
|
onload="start();">
|
||||||
<title>DOMRequestHelper Test</title>
|
|
||||||
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||||
|
|
|
@ -2554,6 +2554,8 @@ CreateGlobal(JSContext* aCx, T* aObject, nsWrapperCache* aCache,
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(!NS_IsMainThread());
|
MOZ_ASSERT(!NS_IsMainThread());
|
||||||
|
|
||||||
|
aOptions.setTrace(TraceGlobal);
|
||||||
|
|
||||||
JS::Rooted<JSObject*> global(aCx,
|
JS::Rooted<JSObject*> global(aCx,
|
||||||
JS_NewGlobalObject(aCx, aClass, aPrincipal, JS::DontFireOnNewGlobalHook,
|
JS_NewGlobalObject(aCx, aClass, aPrincipal, JS::DontFireOnNewGlobalHook,
|
||||||
aOptions));
|
aOptions));
|
||||||
|
|
|
@ -10,6 +10,7 @@ import re
|
||||||
import string
|
import string
|
||||||
import math
|
import math
|
||||||
import itertools
|
import itertools
|
||||||
|
from textwrap import dedent
|
||||||
|
|
||||||
from WebIDL import BuiltinTypes, IDLBuiltinType, IDLNullValue, IDLSequenceType, IDLType, IDLAttribute, IDLUndefinedValue
|
from WebIDL import BuiltinTypes, IDLBuiltinType, IDLNullValue, IDLSequenceType, IDLType, IDLAttribute, IDLUndefinedValue
|
||||||
from Configuration import NoSuchDescriptorError, getTypesFromDescriptor, getTypesFromDictionary, getTypesFromCallback, Descriptor
|
from Configuration import NoSuchDescriptorError, getTypesFromDescriptor, getTypesFromDictionary, getTypesFromCallback, Descriptor
|
||||||
|
@ -55,6 +56,93 @@ def wantsAddProperty(desc):
|
||||||
not desc.interface.getExtendedAttribute("Global"))
|
not desc.interface.getExtendedAttribute("Global"))
|
||||||
|
|
||||||
|
|
||||||
|
# We'll want to insert the indent at the beginnings of lines, but we
|
||||||
|
# don't want to indent empty lines. So only indent lines that have a
|
||||||
|
# non-newline character on them.
|
||||||
|
lineStartDetector = re.compile("^(?=[^\n#])", re.MULTILINE)
|
||||||
|
|
||||||
|
|
||||||
|
def indent(s, indentLevel=2):
|
||||||
|
"""
|
||||||
|
Indent C++ code.
|
||||||
|
|
||||||
|
Weird secret feature: this doesn't indent lines that start with # (such as
|
||||||
|
#include lines).
|
||||||
|
"""
|
||||||
|
if s == "":
|
||||||
|
return s
|
||||||
|
return re.sub(lineStartDetector, indentLevel * " ", s)
|
||||||
|
|
||||||
|
|
||||||
|
def fill(template, **args):
|
||||||
|
"""
|
||||||
|
Convenience function for filling in a multiline template.
|
||||||
|
|
||||||
|
`fill(template, name1=v1, name2=v2)` is a lot like
|
||||||
|
`string.Template(template).substitute({"name1": v1, "name2": v2})`.
|
||||||
|
|
||||||
|
However, it's shorter, and has a few nice features:
|
||||||
|
|
||||||
|
* If `template` is indented, fill() automatically dedents it!
|
||||||
|
This makes code using fill() with Python's multiline strings
|
||||||
|
much nicer to look at.
|
||||||
|
|
||||||
|
* If `template` starts with a blank line, fill() strips it off.
|
||||||
|
(Again, convenient with multiline strings.)
|
||||||
|
|
||||||
|
* fill() recognizes a special kind of substitution
|
||||||
|
of the form `$*{name}`.
|
||||||
|
|
||||||
|
Use this to paste in, and automatically indent, multiple lines.
|
||||||
|
(Mnemonic: The `*` is for "multiple lines").
|
||||||
|
|
||||||
|
A `$*` substitution must appear by itself on a line, with optional
|
||||||
|
preceding indentation (spaces only). The whole line is replaced by the
|
||||||
|
corresponding keyword argument, indented appropriately. If the
|
||||||
|
argument is an empty string, no output is generated, not even a blank
|
||||||
|
line.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# This works by transforming the fill()-template to an equivalent
|
||||||
|
# string.Template.
|
||||||
|
multiline_substitution_re = re.compile(r"( *)\$\*{(\w+)}(\n)?")
|
||||||
|
|
||||||
|
def replace(match):
|
||||||
|
"""
|
||||||
|
Replaces a line like ' $*{xyz}\n' with '${xyz_n}',
|
||||||
|
where n is the indent depth, and add a corresponding entry to args.
|
||||||
|
"""
|
||||||
|
indentation, name, nl = match.groups()
|
||||||
|
depth = len(indentation)
|
||||||
|
|
||||||
|
# Check that $*{xyz} appears by itself on a line.
|
||||||
|
prev = match.string[:match.start()]
|
||||||
|
if (prev and not prev.endswith("\n")) or nl is None:
|
||||||
|
raise ValueError("Invalid fill() template: $*{%s} must appear by itself on a line" % name)
|
||||||
|
|
||||||
|
# Multiline text without a newline at the end is probably a mistake.
|
||||||
|
if not (args[name] == "" or args[name].endswith("\n")):
|
||||||
|
raise ValueError("Argument %s with value %r is missing a newline" % (name, args[name]))
|
||||||
|
|
||||||
|
# Now replace this whole line of template with the indented equivalent.
|
||||||
|
modified_name = name + "_" + str(depth)
|
||||||
|
indented_value = indent(args[name], depth)
|
||||||
|
if modified_name in args:
|
||||||
|
assert args[modified_name] == indented_value
|
||||||
|
else:
|
||||||
|
args[modified_name] = indented_value
|
||||||
|
return "${" + modified_name + "}"
|
||||||
|
|
||||||
|
t = template
|
||||||
|
if t.startswith("\n"):
|
||||||
|
t = t[1:]
|
||||||
|
t = dedent(t)
|
||||||
|
assert t.endswith("\n") or "\n" not in t
|
||||||
|
t = re.sub(multiline_substitution_re, replace, t)
|
||||||
|
t = string.Template(t)
|
||||||
|
return t.substitute(args)
|
||||||
|
|
||||||
|
|
||||||
class CGThing():
|
class CGThing():
|
||||||
"""
|
"""
|
||||||
Abstract base class for things that spit out code.
|
Abstract base class for things that spit out code.
|
||||||
|
@ -109,14 +197,20 @@ class CGStringTable(CGThing):
|
||||||
for s in self.strings:
|
for s in self.strings:
|
||||||
indices.append(currentIndex)
|
indices.append(currentIndex)
|
||||||
currentIndex += len(s) + 1 # for the null terminator
|
currentIndex += len(s) + 1 # for the null terminator
|
||||||
return """const char *%s(unsigned int aIndex)
|
return fill(
|
||||||
{
|
"""
|
||||||
static const char table[] = %s;
|
const char *${name}(unsigned int aIndex)
|
||||||
static const uint16_t indices[] = { %s };
|
{
|
||||||
static_assert(%d <= UINT16_MAX, "string table overflow!");
|
static const char table[] = ${table};
|
||||||
|
static const uint16_t indices[] = { ${indices} };
|
||||||
|
static_assert(${currentIndex} <= UINT16_MAX, "string table overflow!");
|
||||||
return &table[indices[aIndex]];
|
return &table[indices[aIndex]];
|
||||||
}
|
}
|
||||||
""" % (self.accessorName, table, ", ".join("%d" % index for index in indices), currentIndex)
|
""",
|
||||||
|
name=self.accessorName,
|
||||||
|
table=table,
|
||||||
|
indices=", ".join("%d" % index for index in indices),
|
||||||
|
currentIndex=currentIndex)
|
||||||
|
|
||||||
|
|
||||||
class CGNativePropertyHooks(CGThing):
|
class CGNativePropertyHooks(CGThing):
|
||||||
|
@ -203,20 +297,21 @@ def DOMClass(descriptor):
|
||||||
# is never the ID of any prototype, so it's safe to use as
|
# is never the ID of any prototype, so it's safe to use as
|
||||||
# padding.
|
# padding.
|
||||||
protoList.extend(['prototypes::id::_ID_Count'] * (descriptor.config.maxProtoChainLength - len(protoList)))
|
protoList.extend(['prototypes::id::_ID_Count'] * (descriptor.config.maxProtoChainLength - len(protoList)))
|
||||||
prototypeChainString = ', '.join(protoList)
|
|
||||||
participant = "GetCCParticipant<%s>::Get()" % descriptor.nativeType
|
return fill(
|
||||||
getParentObject = "GetParentObject<%s>::Get" % descriptor.nativeType
|
"""
|
||||||
return """{
|
{
|
||||||
{ %s },
|
{ ${protoChain} },
|
||||||
IsBaseOf<nsISupports, %s >::value,
|
IsBaseOf<nsISupports, ${nativeType} >::value,
|
||||||
%s,
|
${hooks},
|
||||||
%s,
|
GetParentObject<${nativeType}>::Get,
|
||||||
GetProtoObject,
|
GetProtoObject,
|
||||||
%s
|
GetCCParticipant<${nativeType}>::Get()
|
||||||
}""" % (prototypeChainString, descriptor.nativeType,
|
}
|
||||||
NativePropertyHooks(descriptor),
|
""",
|
||||||
getParentObject,
|
protoChain=', '.join(protoList),
|
||||||
participant)
|
nativeType=descriptor.nativeType,
|
||||||
|
hooks=NativePropertyHooks(descriptor))
|
||||||
|
|
||||||
|
|
||||||
class CGDOMJSClass(CGThing):
|
class CGDOMJSClass(CGThing):
|
||||||
|
@ -237,7 +332,7 @@ class CGDOMJSClass(CGThing):
|
||||||
classFlags = "JSCLASS_IS_DOMJSCLASS | "
|
classFlags = "JSCLASS_IS_DOMJSCLASS | "
|
||||||
if self.descriptor.interface.getExtendedAttribute("Global"):
|
if self.descriptor.interface.getExtendedAttribute("Global"):
|
||||||
classFlags += "JSCLASS_DOM_GLOBAL | JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(DOM_GLOBAL_SLOTS) | JSCLASS_IMPLEMENTS_BARRIERS"
|
classFlags += "JSCLASS_DOM_GLOBAL | JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(DOM_GLOBAL_SLOTS) | JSCLASS_IMPLEMENTS_BARRIERS"
|
||||||
traceHook = "mozilla::dom::TraceGlobal"
|
traceHook = "JS_GlobalObjectTraceHook"
|
||||||
else:
|
else:
|
||||||
classFlags += "JSCLASS_HAS_RESERVED_SLOTS(%d)" % slotCount
|
classFlags += "JSCLASS_HAS_RESERVED_SLOTS(%d)" % slotCount
|
||||||
if self.descriptor.interface.getExtendedAttribute("NeedNewResolve"):
|
if self.descriptor.interface.getExtendedAttribute("NeedNewResolve"):
|
||||||
|
@ -251,34 +346,41 @@ class CGDOMJSClass(CGThing):
|
||||||
else:
|
else:
|
||||||
newResolveHook = "JS_ResolveStub"
|
newResolveHook = "JS_ResolveStub"
|
||||||
enumerateHook = "JS_EnumerateStub"
|
enumerateHook = "JS_EnumerateStub"
|
||||||
template = """
|
|
||||||
static const DOMJSClass Class = {
|
return fill( # BOGUS extra blank line at the top
|
||||||
{ "%s",
|
"""
|
||||||
%s,
|
|
||||||
%s, /* addProperty */
|
static const DOMJSClass Class = {
|
||||||
|
{ "${name}",
|
||||||
|
${flags},
|
||||||
|
${addProperty}, /* addProperty */
|
||||||
JS_DeletePropertyStub, /* delProperty */
|
JS_DeletePropertyStub, /* delProperty */
|
||||||
JS_PropertyStub, /* getProperty */
|
JS_PropertyStub, /* getProperty */
|
||||||
JS_StrictPropertyStub, /* setProperty */
|
JS_StrictPropertyStub, /* setProperty */
|
||||||
%s, /* enumerate */
|
${enumerate}, /* enumerate */
|
||||||
%s, /* resolve */
|
${resolve}, /* resolve */
|
||||||
JS_ConvertStub,
|
JS_ConvertStub,
|
||||||
%s, /* finalize */
|
${finalize}, /* finalize */
|
||||||
%s, /* call */
|
${call}, /* call */
|
||||||
nullptr, /* hasInstance */
|
nullptr, /* hasInstance */
|
||||||
nullptr, /* construct */
|
nullptr, /* construct */
|
||||||
%s, /* trace */
|
${trace}, /* trace */
|
||||||
JS_NULL_CLASS_SPEC,
|
JS_NULL_CLASS_SPEC,
|
||||||
JS_NULL_CLASS_EXT,
|
JS_NULL_CLASS_EXT,
|
||||||
JS_NULL_OBJECT_OPS
|
JS_NULL_OBJECT_OPS
|
||||||
},
|
},
|
||||||
%s
|
$*{descriptor}
|
||||||
};
|
};
|
||||||
"""
|
""",
|
||||||
return template % (self.descriptor.interface.identifier.name,
|
name=self.descriptor.interface.identifier.name,
|
||||||
classFlags,
|
flags=classFlags,
|
||||||
ADDPROPERTY_HOOK_NAME if wantsAddProperty(self.descriptor) else 'JS_PropertyStub',
|
addProperty=ADDPROPERTY_HOOK_NAME if wantsAddProperty(self.descriptor) else 'JS_PropertyStub',
|
||||||
enumerateHook, newResolveHook, FINALIZE_HOOK_NAME, callHook, traceHook,
|
enumerate=enumerateHook,
|
||||||
CGIndenter(CGGeneric(DOMClass(self.descriptor))).define())
|
resolve=newResolveHook,
|
||||||
|
finalize=FINALIZE_HOOK_NAME,
|
||||||
|
call=callHook,
|
||||||
|
trace=traceHook,
|
||||||
|
descriptor=DOMClass(self.descriptor))
|
||||||
|
|
||||||
|
|
||||||
class CGDOMProxyJSClass(CGThing):
|
class CGDOMProxyJSClass(CGThing):
|
||||||
|
@ -300,20 +402,22 @@ class CGDOMProxyJSClass(CGThing):
|
||||||
if self.descriptor.interface.identifier.name == "HTMLAllCollection":
|
if self.descriptor.interface.identifier.name == "HTMLAllCollection":
|
||||||
flags.append("JSCLASS_EMULATES_UNDEFINED")
|
flags.append("JSCLASS_EMULATES_UNDEFINED")
|
||||||
callHook = LEGACYCALLER_HOOK_NAME if self.descriptor.operations["LegacyCaller"] else 'nullptr'
|
callHook = LEGACYCALLER_HOOK_NAME if self.descriptor.operations["LegacyCaller"] else 'nullptr'
|
||||||
template = """
|
return fill( # BOGUS extra blank line at the top
|
||||||
static const DOMJSClass Class = {
|
"""
|
||||||
PROXY_CLASS_DEF("%s",
|
|
||||||
|
static const DOMJSClass Class = {
|
||||||
|
PROXY_CLASS_DEF("${name}",
|
||||||
0, /* extra slots */
|
0, /* extra slots */
|
||||||
%s,
|
${flags},
|
||||||
%s, /* call */
|
${call}, /* call */
|
||||||
nullptr /* construct */),
|
nullptr /* construct */),
|
||||||
%s
|
$*{descriptor}
|
||||||
};
|
};
|
||||||
"""
|
""",
|
||||||
return template % (self.descriptor.interface.identifier.name,
|
name=self.descriptor.interface.identifier.name,
|
||||||
" | ".join(flags),
|
flags=" | ".join(flags),
|
||||||
callHook,
|
call=callHook,
|
||||||
CGIndenter(CGGeneric(DOMClass(self.descriptor))).define())
|
descriptor=DOMClass(self.descriptor))
|
||||||
|
|
||||||
|
|
||||||
def PrototypeIDAndDepth(descriptor):
|
def PrototypeIDAndDepth(descriptor):
|
||||||
|
@ -547,36 +651,27 @@ class CGGeneric(CGThing):
|
||||||
return set()
|
return set()
|
||||||
|
|
||||||
|
|
||||||
# We'll want to insert the indent at the beginnings of lines, but we
|
|
||||||
# don't want to indent empty lines. So only indent lines that have a
|
|
||||||
# non-newline character on them.
|
|
||||||
lineStartDetector = re.compile("^(?=[^\n#])", re.MULTILINE)
|
|
||||||
|
|
||||||
|
|
||||||
class CGIndenter(CGThing):
|
class CGIndenter(CGThing):
|
||||||
"""
|
"""
|
||||||
A class that takes another CGThing and generates code that indents that
|
A class that takes another CGThing and generates code that indents that
|
||||||
CGThing by some number of spaces. The default indent is two spaces.
|
CGThing by some number of spaces. The default indent is two spaces.
|
||||||
"""
|
"""
|
||||||
def __init__(self, child, indentLevel=2, declareOnly=False):
|
def __init__(self, child, indentLevel=2, declareOnly=False):
|
||||||
|
assert isinstance(child, CGThing)
|
||||||
CGThing.__init__(self)
|
CGThing.__init__(self)
|
||||||
self.child = child
|
self.child = child
|
||||||
self.indent = " " * indentLevel
|
self.indentLevel = indentLevel
|
||||||
self.declareOnly = declareOnly
|
self.declareOnly = declareOnly
|
||||||
|
|
||||||
def declare(self):
|
def declare(self):
|
||||||
decl = self.child.declare()
|
return indent(self.child.declare(), self.indentLevel)
|
||||||
if decl is not "":
|
|
||||||
return re.sub(lineStartDetector, self.indent, decl)
|
|
||||||
else:
|
|
||||||
return ""
|
|
||||||
|
|
||||||
def define(self):
|
def define(self):
|
||||||
defn = self.child.define()
|
defn = self.child.define()
|
||||||
if defn is not "" and not self.declareOnly:
|
if self.declareOnly:
|
||||||
return re.sub(lineStartDetector, self.indent, defn)
|
|
||||||
else:
|
|
||||||
return defn
|
return defn
|
||||||
|
else:
|
||||||
|
return indent(defn, self.indentLevel)
|
||||||
|
|
||||||
|
|
||||||
class CGWrapper(CGThing):
|
class CGWrapper(CGThing):
|
||||||
|
@ -1418,26 +1513,32 @@ class CGNamedConstructors(CGThing):
|
||||||
constructorID += self.descriptor.name
|
constructorID += self.descriptor.name
|
||||||
else:
|
else:
|
||||||
constructorID += "_ID_Count"
|
constructorID += "_ID_Count"
|
||||||
nativePropertyHooks = """const NativePropertyHooks sNamedConstructorNativePropertyHooks = {
|
|
||||||
|
namedConstructors = ""
|
||||||
|
for n in self.descriptor.interface.namedConstructors:
|
||||||
|
namedConstructors += (
|
||||||
|
"{ \"%s\", { %s, &sNamedConstructorNativePropertyHooks }, %i },\n" %
|
||||||
|
(n.identifier.name, NamedConstructorName(n), methodLength(n)))
|
||||||
|
|
||||||
|
return fill(
|
||||||
|
"""
|
||||||
|
const NativePropertyHooks sNamedConstructorNativePropertyHooks = {
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr,
|
nullptr,
|
||||||
{ nullptr, nullptr },
|
{ nullptr, nullptr },
|
||||||
prototypes::id::%s,
|
prototypes::id::${name},
|
||||||
%s,
|
${constructorID},
|
||||||
nullptr
|
nullptr
|
||||||
};
|
};
|
||||||
|
|
||||||
""" % (self.descriptor.name, constructorID)
|
static const NamedConstructor namedConstructors[] = {
|
||||||
namedConstructors = CGList([], ",\n")
|
$*{namedConstructors}
|
||||||
for n in self.descriptor.interface.namedConstructors:
|
{ nullptr, { nullptr, nullptr }, 0 }
|
||||||
namedConstructors.append(
|
};
|
||||||
CGGeneric("{ \"%s\", { %s, &sNamedConstructorNativePropertyHooks }, %i }" %
|
""",
|
||||||
(n.identifier.name, NamedConstructorName(n), methodLength(n))))
|
name=self.descriptor.name,
|
||||||
namedConstructors.append(CGGeneric("{ nullptr, { nullptr, nullptr }, 0 }"))
|
constructorID=constructorID,
|
||||||
namedConstructors = CGWrapper(CGIndenter(namedConstructors),
|
namedConstructors=namedConstructors)
|
||||||
pre="static const NamedConstructor namedConstructors[] = {\n",
|
|
||||||
post="\n};\n")
|
|
||||||
return nativePropertyHooks + namedConstructors.define()
|
|
||||||
|
|
||||||
|
|
||||||
class CGClassHasInstanceHook(CGAbstractStaticMethod):
|
class CGClassHasInstanceHook(CGAbstractStaticMethod):
|
||||||
|
|
|
@ -48,26 +48,21 @@ ConvertStringToPointerType(const nsAString& aPointerTypeArg)
|
||||||
return nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN;
|
return nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
// static
|
||||||
already_AddRefed<PointerEvent>
|
already_AddRefed<PointerEvent>
|
||||||
PointerEvent::Constructor(const GlobalObject& aGlobal,
|
PointerEvent::Constructor(EventTarget* aOwner,
|
||||||
const nsAString& aType,
|
const nsAString& aType,
|
||||||
const PointerEventInit& aParam,
|
const PointerEventInit& aParam)
|
||||||
ErrorResult& aRv)
|
|
||||||
{
|
{
|
||||||
nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
|
nsRefPtr<PointerEvent> e = new PointerEvent(aOwner, nullptr, nullptr);
|
||||||
nsRefPtr<PointerEvent> e = new PointerEvent(t, nullptr, nullptr);
|
bool trusted = e->Init(aOwner);
|
||||||
bool trusted = e->Init(t);
|
|
||||||
|
|
||||||
aRv = e->InitMouseEvent(aType, aParam.mBubbles, aParam.mCancelable,
|
e->InitMouseEvent(aType, aParam.mBubbles, aParam.mCancelable,
|
||||||
aParam.mView, aParam.mDetail, aParam.mScreenX,
|
aParam.mView, aParam.mDetail, aParam.mScreenX,
|
||||||
aParam.mScreenY, aParam.mClientX, aParam.mClientY,
|
aParam.mScreenY, aParam.mClientX, aParam.mClientY,
|
||||||
aParam.mCtrlKey, aParam.mAltKey, aParam.mShiftKey,
|
aParam.mCtrlKey, aParam.mAltKey, aParam.mShiftKey,
|
||||||
aParam.mMetaKey, aParam.mButton,
|
aParam.mMetaKey, aParam.mButton,
|
||||||
aParam.mRelatedTarget);
|
aParam.mRelatedTarget);
|
||||||
if (aRv.Failed()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
WidgetPointerEvent* widgetEvent = e->mEvent->AsPointerEvent();
|
WidgetPointerEvent* widgetEvent = e->mEvent->AsPointerEvent();
|
||||||
widgetEvent->pointerId = aParam.mPointerId;
|
widgetEvent->pointerId = aParam.mPointerId;
|
||||||
|
@ -84,6 +79,17 @@ PointerEvent::Constructor(const GlobalObject& aGlobal,
|
||||||
return e.forget();
|
return e.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
already_AddRefed<PointerEvent>
|
||||||
|
PointerEvent::Constructor(const GlobalObject& aGlobal,
|
||||||
|
const nsAString& aType,
|
||||||
|
const PointerEventInit& aParam,
|
||||||
|
ErrorResult& aRv)
|
||||||
|
{
|
||||||
|
nsCOMPtr<EventTarget> owner = do_QueryInterface(aGlobal.GetAsSupports());
|
||||||
|
return Constructor(owner, aType, aParam);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PointerEvent::GetPointerType(nsAString& aPointerType)
|
PointerEvent::GetPointerType(nsAString& aPointerType)
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,11 @@ public:
|
||||||
const PointerEventInit& aParam,
|
const PointerEventInit& aParam,
|
||||||
ErrorResult& aRv);
|
ErrorResult& aRv);
|
||||||
|
|
||||||
|
static already_AddRefed<PointerEvent>
|
||||||
|
Constructor(EventTarget* aOwner,
|
||||||
|
const nsAString& aType,
|
||||||
|
const PointerEventInit& aParam);
|
||||||
|
|
||||||
int32_t PointerId();
|
int32_t PointerId();
|
||||||
int32_t Width();
|
int32_t Width();
|
||||||
int32_t Height();
|
int32_t Height();
|
||||||
|
|
|
@ -9,7 +9,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=415498
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||||
onload="init()">
|
onload="init()">
|
||||||
|
|
||||||
<title>Test for Bug 415498</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
|
|
|
@ -7,7 +7,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=586961
|
||||||
<window title="Mozilla Bug 586961"
|
<window title="Mozilla Bug 586961"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 586961</title>
|
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
|
@ -7,7 +7,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=602962
|
||||||
<window title="Mozilla Bug 602962" onload="openWindow()"
|
<window title="Mozilla Bug 602962" onload="openWindow()"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 602962</title>
|
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||||
|
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
|
@ -7,7 +7,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=67949
|
||||||
<window title="Mozilla Bug 67949" onload="doTest();"
|
<window title="Mozilla Bug 67949" onload="doTest();"
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
|
|
||||||
<title>Test for Bug 67949</title>
|
|
||||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||||
|
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
|
@ -685,7 +685,9 @@ const JSClass ThreadLocalJSRuntime::sGlobalClass = {
|
||||||
"IndexedDBTransactionThreadGlobal",
|
"IndexedDBTransactionThreadGlobal",
|
||||||
JSCLASS_GLOBAL_FLAGS,
|
JSCLASS_GLOBAL_FLAGS,
|
||||||
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
|
JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
|
||||||
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub
|
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
|
||||||
|
nullptr, nullptr, nullptr, nullptr,
|
||||||
|
JS_GlobalObjectTraceHook
|
||||||
};
|
};
|
||||||
|
|
||||||
inline
|
inline
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "domstubs.idl"
|
#include "domstubs.idl"
|
||||||
interface nsIContentFrameMessageManager;
|
interface nsIContentFrameMessageManager;
|
||||||
|
|
||||||
[uuid( 60146bc6-31d8-450b-a9eb-4000b6403d5c)]
|
[scriptable, uuid(2eb3bc54-78bf-40f2-b301-a5b5b70f7da0)]
|
||||||
interface nsITabChild : nsISupports
|
interface nsITabChild : nsISupports
|
||||||
{
|
{
|
||||||
readonly attribute nsIContentFrameMessageManager messageManager;
|
readonly attribute nsIContentFrameMessageManager messageManager;
|
||||||
|
|
|
@ -45,6 +45,7 @@ interface nsIDOMDOMException : nsISupports
|
||||||
const unsigned short TIMEOUT_ERR = 23;
|
const unsigned short TIMEOUT_ERR = 23;
|
||||||
const unsigned short INVALID_NODE_TYPE_ERR = 24;
|
const unsigned short INVALID_NODE_TYPE_ERR = 24;
|
||||||
const unsigned short DATA_CLONE_ERR = 25;
|
const unsigned short DATA_CLONE_ERR = 25;
|
||||||
|
const unsigned short INVALID_POINTER_ERR = 26;
|
||||||
|
|
||||||
readonly attribute unsigned short code;
|
readonly attribute unsigned short code;
|
||||||
};
|
};
|
||||||
|
|
|
@ -208,6 +208,8 @@ parent:
|
||||||
int32_t cause,
|
int32_t cause,
|
||||||
int32_t focusChange);
|
int32_t focusChange);
|
||||||
|
|
||||||
|
sync IsParentWindowMainWidgetVisible() returns (bool visible);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the DPI of the screen corresponding to this browser.
|
* Gets the DPI of the screen corresponding to this browser.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "nsIDOMElement.h"
|
#include "nsIDOMElement.h"
|
||||||
#include "nsIDOMEvent.h"
|
#include "nsIDOMEvent.h"
|
||||||
#include "nsIDOMWindow.h"
|
#include "nsIDOMWindow.h"
|
||||||
|
#include "nsIDOMWindowUtils.h"
|
||||||
#include "nsIInterfaceRequestorUtils.h"
|
#include "nsIInterfaceRequestorUtils.h"
|
||||||
#include "nsIPromptFactory.h"
|
#include "nsIPromptFactory.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
|
@ -1504,6 +1505,18 @@ TabParent::RecvSetInputContext(const int32_t& aIMEEnabled,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TabParent::RecvIsParentWindowMainWidgetVisible(bool* aIsVisible)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIContent> frame = do_QueryInterface(mFrameElement);
|
||||||
|
if (!frame)
|
||||||
|
return true;
|
||||||
|
nsCOMPtr<nsIDOMWindowUtils> windowUtils =
|
||||||
|
do_QueryInterface(frame->OwnerDoc()->GetWindow());
|
||||||
|
nsresult rv = windowUtils->GetIsParentWindowMainWidgetVisible(aIsVisible);
|
||||||
|
return NS_SUCCEEDED(rv);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TabParent::RecvGetDPI(float* aValue)
|
TabParent::RecvGetDPI(float* aValue)
|
||||||
{
|
{
|
||||||
|
|
|
@ -172,6 +172,7 @@ public:
|
||||||
virtual bool RecvSetCursor(const uint32_t& aValue) MOZ_OVERRIDE;
|
virtual bool RecvSetCursor(const uint32_t& aValue) MOZ_OVERRIDE;
|
||||||
virtual bool RecvSetBackgroundColor(const nscolor& aValue) MOZ_OVERRIDE;
|
virtual bool RecvSetBackgroundColor(const nscolor& aValue) MOZ_OVERRIDE;
|
||||||
virtual bool RecvSetStatus(const uint32_t& aType, const nsString& aStatus) MOZ_OVERRIDE;
|
virtual bool RecvSetStatus(const uint32_t& aType, const nsString& aStatus) MOZ_OVERRIDE;
|
||||||
|
virtual bool RecvIsParentWindowMainWidgetVisible(bool* aIsVisible);
|
||||||
virtual bool RecvShowTooltip(const uint32_t& aX, const uint32_t& aY, const nsString& aTooltip);
|
virtual bool RecvShowTooltip(const uint32_t& aX, const uint32_t& aY, const nsString& aTooltip);
|
||||||
virtual bool RecvHideTooltip();
|
virtual bool RecvHideTooltip();
|
||||||
virtual bool RecvGetDPI(float* aValue) MOZ_OVERRIDE;
|
virtual bool RecvGetDPI(float* aValue) MOZ_OVERRIDE;
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="NPAPI Private Mode Tests"
|
<window title="NPAPI Private Mode Tests"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>NPAPI Private Mode Tests</title>
|
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<embed id="plugin1" type="application/x-test" width="200" height="200"></embed>
|
<embed id="plugin1" type="application/x-test" width="200" height="200"></embed>
|
||||||
<embed id="plugin2" type="application/x-test" width="200" height="200"></embed>
|
<embed id="plugin2" type="application/x-test" width="200" height="200"></embed>
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="NPAPI Set Undefined Value Test"
|
<window title="NPAPI Set Undefined Value Test"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>NPAPI Set Undefined Value Test</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
<script type="application/javascript" src="utils.js"></script>
|
<script type="application/javascript" src="utils.js"></script>
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="Basic Plugin Tests"
|
<window title="Basic Plugin Tests"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>NPN_ConvertPoint Tests</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
<script type="application/javascript" src="utils.js"></script>
|
<script type="application/javascript" src="utils.js"></script>
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="Basic Plugin Tests"
|
<window title="Basic Plugin Tests"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>Plugin Crash Notification Test</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
<script type="application/javascript" src="utils.js"></script>
|
<script type="application/javascript" src="utils.js"></script>
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="Basic Plugin Tests"
|
<window title="Basic Plugin Tests"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>Plugin Crash Notification Test</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
<script type="application/javascript" src="utils.js"></script>
|
<script type="application/javascript" src="utils.js"></script>
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="Basic Plugin Tests"
|
<window title="Basic Plugin Tests"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>Plugin Crash Notification Test</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="Basic Plugin Tests"
|
<window title="Basic Plugin Tests"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>Plugin Hang Submission Test</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||||
type="text/css"?>
|
type="text/css"?>
|
||||||
<window title="Basic Plugin Tests"
|
<window title="Basic Plugin Tests"
|
||||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<title>Basic Plugin Tests</title>
|
|
||||||
<script type="application/javascript"
|
<script type="application/javascript"
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||||
<script type="application/javascript" src="utils.js"></script>
|
<script type="application/javascript" src="utils.js"></script>
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче