mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Merge m-c to s-c.
This commit is contained in:
commit
8ead817faf
2
CLOBBER
2
CLOBBER
@ -22,4 +22,4 @@
|
||||
# changes to stick? As of bug 928195, this shouldn't be necessary! Please
|
||||
# don't change CLOBBER for WebIDL changes any more.
|
||||
|
||||
JS build system changes are apparently requiring clobbers.
|
||||
Bug 948583, first part, apparently requires a clobber. (Ideas for fixing this involve removing jsopcode.tbl, which is a bit too big to do while holding up this patch.)
|
||||
|
@ -331,18 +331,16 @@ HyperTextAccessible::DOMPointToHypertextOffset(nsINode* aNode,
|
||||
break;
|
||||
}
|
||||
|
||||
// This offset no longer applies because the passed-in text object is not a child
|
||||
// of the hypertext. This happens when there are nested hypertexts, e.g.
|
||||
// <div>abc<h1>def</h1>ghi</div>
|
||||
// If the passed-in DOM point was not on a direct child of the hypertext, we will
|
||||
// return the offset for that entire hypertext
|
||||
if (aIsEndOffset) {
|
||||
// Not inclusive, the indicated char comes at index before this offset
|
||||
// If the end offset is after the first character of the passed in object, use 1 for
|
||||
// addTextOffset, to put us after the embedded object char. We'll only treat the offset as
|
||||
// before the embedded object char if we end at the very beginning of the child.
|
||||
addTextOffset = addTextOffset > 0;
|
||||
} else
|
||||
// This offset no longer applies because the passed-in text object is not
|
||||
// a child of the hypertext. This happens when there are nested hypertexts,
|
||||
// e.g. <div>abc<h1>def</h1>ghi</div>. Thus we need to adjust the offset
|
||||
// to make it relative the hypertext.
|
||||
// If the end offset is not supposed to be inclusive and the original point
|
||||
// is not at 0 offset then the returned offset should be after an embedded
|
||||
// character the original point belongs to.
|
||||
if (aIsEndOffset)
|
||||
addTextOffset = (addTextOffset > 0 || descendantAcc->IndexInParent() > 0) ? 1 : 0;
|
||||
else
|
||||
addTextOffset = 0;
|
||||
|
||||
descendantAcc = parentAcc;
|
||||
|
@ -506,23 +506,52 @@ var Output = {
|
||||
|
||||
webspeechEnabled: false,
|
||||
|
||||
deferredOutputs: [],
|
||||
|
||||
init: function init() {
|
||||
let window = Utils.win;
|
||||
this.webspeechEnabled = !!window.speechSynthesis;
|
||||
|
||||
let settingsToGet = 2;
|
||||
let settingsCallback = (aName, aSetting) => {
|
||||
if (--settingsToGet > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.inited = true;
|
||||
|
||||
for (let actions of this.deferredOutputs) {
|
||||
this.output(actions);
|
||||
}
|
||||
};
|
||||
|
||||
this._volumeSetting = new SettingCache(
|
||||
'accessibility.screenreader-volume', settingsCallback,
|
||||
{ defaultValue: 1, callbackNow: true, callbackOnce: true });
|
||||
this._rateSetting = new SettingCache(
|
||||
'accessibility.screenreader-rate', settingsCallback,
|
||||
{ defaultValue: 0, callbackNow: true, callbackOnce: true });
|
||||
|
||||
for (let earcon of this.EARCONS) {
|
||||
let earconName = /(^.*)\..*$/.exec(earcon)[1];
|
||||
this.earconBuffers[earconName] = new WeakMap();
|
||||
this.earconBuffers[earconName].set(
|
||||
window, new window.Audio('chrome://global/content/accessibility/' + earcon));
|
||||
}
|
||||
},
|
||||
|
||||
this.inited = true;
|
||||
uninit: function uninit() {
|
||||
if (this.inited) {
|
||||
delete this._volumeSetting;
|
||||
delete this._rateSetting;
|
||||
}
|
||||
this.inited = false;
|
||||
},
|
||||
|
||||
output: function output(aActions) {
|
||||
if (!this.inited) {
|
||||
this.init();
|
||||
this.deferredOutputs.push(aActions);
|
||||
return;
|
||||
}
|
||||
|
||||
for (let action of aActions) {
|
||||
@ -535,12 +564,18 @@ var Output = {
|
||||
}
|
||||
|
||||
if (action.method === 'speak' && this.webspeechEnabled) {
|
||||
window.speechSynthesis.speak(
|
||||
new window.SpeechSynthesisUtterance(action.data));
|
||||
let utterance = new window.SpeechSynthesisUtterance(action.data);
|
||||
let requestedRate = this._rateSetting.value;
|
||||
utterance.volume = this._volumeSetting.value;
|
||||
utterance.rate = requestedRate >= 0 ?
|
||||
requestedRate + 1 : 1 / (Math.abs(requestedRate) + 1);
|
||||
window.speechSynthesis.speak(utterance);
|
||||
} else if (action.method === 'playEarcon') {
|
||||
let audioBufferWeakMap = this.earconBuffers[action.data];
|
||||
if (audioBufferWeakMap) {
|
||||
audioBufferWeakMap.get(window).cloneNode(false).play();
|
||||
let node = audioBufferWeakMap.get(window).cloneNode(false);
|
||||
node.volume = this._volumeSetting.value;
|
||||
node.play();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -549,6 +584,7 @@ var Output = {
|
||||
|
||||
start: function start() {
|
||||
Cu.import('resource://gre/modules/Geometry.jsm');
|
||||
this.speechHelper.init();
|
||||
},
|
||||
|
||||
stop: function stop() {
|
||||
@ -561,6 +597,8 @@ var Output = {
|
||||
Utils.win.document.documentElement.removeChild(this.announceBox.get());
|
||||
delete this.announceBox;
|
||||
}
|
||||
|
||||
this.speechHelper.uninit();
|
||||
},
|
||||
|
||||
Speech: function Speech(aDetails, aBrowser) {
|
||||
|
@ -20,7 +20,7 @@ XPCOMUtils.defineLazyModuleGetter(this, 'Events',
|
||||
XPCOMUtils.defineLazyModuleGetter(this, 'Relations',
|
||||
'resource://gre/modules/accessibility/Constants.jsm');
|
||||
|
||||
this.EXPORTED_SYMBOLS = ['Utils', 'Logger', 'PivotContext', 'PrefCache'];
|
||||
this.EXPORTED_SYMBOLS = ['Utils', 'Logger', 'PivotContext', 'PrefCache', 'SettingCache'];
|
||||
|
||||
this.Utils = {
|
||||
_buildAppMap: {
|
||||
@ -774,3 +774,40 @@ PrefCache.prototype = {
|
||||
QueryInterface : XPCOMUtils.generateQI([Ci.nsIObserver,
|
||||
Ci.nsISupportsWeakReference])
|
||||
};
|
||||
|
||||
this.SettingCache = function SettingCache(aName, aCallback, aOptions = {}) {
|
||||
this.value = aOptions.defaultValue;
|
||||
let runCallback = () => {
|
||||
if (aCallback) {
|
||||
aCallback(aName, this.value);
|
||||
if (aOptions.callbackOnce) {
|
||||
runCallback = () => {};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let settings = Utils.win.navigator.mozSettings;
|
||||
if (!settings) {
|
||||
if (aOptions.callbackNow) {
|
||||
runCallback();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
let lock = settings.createLock();
|
||||
let req = lock.get(aName);
|
||||
|
||||
req.addEventListener('success', () => {
|
||||
this.value = req.result[aName] == undefined ? aOptions.defaultValue : req.result[aName];
|
||||
if (aOptions.callbackNow) {
|
||||
runCallback();
|
||||
}
|
||||
});
|
||||
|
||||
settings.addObserver(aName,
|
||||
(evt) => {
|
||||
this.value = evt.settingValue;
|
||||
runCallback();
|
||||
});
|
||||
};
|
||||
|
@ -343,13 +343,14 @@ function scroll(aMessage) {
|
||||
|
||||
function adjustRange(aMessage) {
|
||||
function sendUpDownKey(aAccessible) {
|
||||
let evt = content.document.createEvent('KeyboardEvent');
|
||||
let keycode = aMessage.json.direction == 'forward' ?
|
||||
content.KeyEvent.DOM_VK_DOWN : content.KeyEvent.DOM_VK_UP;
|
||||
evt.initKeyEvent(
|
||||
"keypress", false, true, null, false, false, false, false, keycode, 0);
|
||||
if (aAccessible.DOMNode) {
|
||||
aAccessible.DOMNode.dispatchEvent(evt);
|
||||
let acc = Utils.getEmbeddedControl(aAccessible) || aAccessible;
|
||||
if (acc.DOMNode) {
|
||||
let evt = content.document.createEvent('KeyboardEvent');
|
||||
let keycode = aMessage.json.direction == 'forward' ?
|
||||
content.KeyEvent.DOM_VK_DOWN : content.KeyEvent.DOM_VK_UP;
|
||||
evt.initKeyEvent(
|
||||
"keypress", false, true, null, false, false, false, false, keycode, 0);
|
||||
acc.DOMNode.dispatchEvent(evt);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -120,6 +120,12 @@
|
||||
testTextAtOffset([ "li1" ], BOUNDARY_LINE_START,
|
||||
[ [ 0, 5, kDiscBulletChar + "Item", 0, 5 ] ]);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Nested hypertexts
|
||||
|
||||
testTextAtOffset(["ht_5" ], BOUNDARY_LINE_START,
|
||||
[ [ 0, 0, kEmbedChar, 0, 1 ] ]);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
@ -190,5 +196,12 @@ two words
|
||||
<ul>
|
||||
<li id="li1">Item</li>
|
||||
</ul>
|
||||
|
||||
<div id="ht_5">
|
||||
<div>
|
||||
<p>sectiounus</p>
|
||||
<p>seciofarus</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -401,6 +401,7 @@ pref("dom.mozBrowserFramesEnabled", true);
|
||||
pref("dom.ipc.processCount", 100000);
|
||||
|
||||
pref("dom.ipc.browser_frames.oop_by_default", false);
|
||||
pref("dom.browser_frames.useAsyncPanZoom", false);
|
||||
|
||||
// SMS/MMS
|
||||
pref("dom.sms.enabled", true);
|
||||
|
@ -1,3 +1,6 @@
|
||||
/* 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/. */
|
||||
|
||||
window.addEventListener("ContentStart", function(evt) {
|
||||
// Enable touch event shim on desktop that translates mouse events
|
||||
@ -5,6 +8,10 @@ window.addEventListener("ContentStart", function(evt) {
|
||||
let require = Cu.import("resource://gre/modules/devtools/Loader.jsm", {})
|
||||
.devtools.require;
|
||||
let { TouchEventHandler } = require("devtools/touch-events");
|
||||
let touchEventHandler = new TouchEventHandler(shell.contentBrowser);
|
||||
let chromeEventHandler = window.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIWebNavigation)
|
||||
.QueryInterface(Ci.nsIDocShell)
|
||||
.chromeEventHandler || window;
|
||||
let touchEventHandler = new TouchEventHandler(chromeEventHandler);
|
||||
touchEventHandler.start();
|
||||
});
|
||||
|
@ -651,3 +651,10 @@ SettingsListener.observe("accessibility.screenreader", false, function(value) {
|
||||
});
|
||||
});
|
||||
})();
|
||||
|
||||
// =================== AsyncPanZoom ======================
|
||||
|
||||
SettingsListener.observe('apz.force-enable', false, function(value) {
|
||||
Services.prefs.setBoolPref('dom.browser_frames.useAsyncPanZoom', value);
|
||||
});
|
||||
|
||||
|
@ -28,6 +28,9 @@ Cu.import('resource://gre/modules/FxAccountsMgmtService.jsm');
|
||||
|
||||
Cu.import('resource://gre/modules/DownloadsAPI.jsm');
|
||||
|
||||
Cu.import('resource://gre/modules/Webapps.jsm');
|
||||
DOMApplicationRegistry.allAppsLaunchable = true;
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(Services, 'env',
|
||||
'@mozilla.org/process/environment;1',
|
||||
'nsIEnvironment');
|
||||
@ -268,7 +271,6 @@ var shell = {
|
||||
alert(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
let manifestURL = this.manifestURL;
|
||||
// <html:iframe id="systemapp"
|
||||
// mozbrowser="true" allowfullscreen="true"
|
||||
@ -294,14 +296,22 @@ var shell = {
|
||||
.sessionHistory = Cc["@mozilla.org/browser/shistory;1"]
|
||||
.createInstance(Ci.nsISHistory);
|
||||
|
||||
// On firefox mulet, shell.html is loaded in a tab
|
||||
// and we have to listen on the chrome event handler
|
||||
// to catch key events
|
||||
let chromeEventHandler = window.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIWebNavigation)
|
||||
.QueryInterface(Ci.nsIDocShell)
|
||||
.chromeEventHandler || window;
|
||||
// Capture all key events so we can filter out hardware buttons
|
||||
// And send them to Gaia via mozChromeEvents.
|
||||
// Ideally, hardware buttons wouldn't generate key events at all, or
|
||||
// if they did, they would use keycodes that conform to DOM 3 Events.
|
||||
// See discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=762362
|
||||
window.addEventListener('keydown', this, true);
|
||||
window.addEventListener('keypress', this, true);
|
||||
window.addEventListener('keyup', this, true);
|
||||
chromeEventHandler.addEventListener('keydown', this, true);
|
||||
chromeEventHandler.addEventListener('keypress', this, true);
|
||||
chromeEventHandler.addEventListener('keyup', this, true);
|
||||
|
||||
window.addEventListener('MozApplicationManifest', this);
|
||||
window.addEventListener('mozfullscreenchange', this);
|
||||
window.addEventListener('MozAfterPaint', this);
|
||||
@ -613,9 +623,6 @@ var shell = {
|
||||
|
||||
this.reportCrash(true);
|
||||
|
||||
Cu.import('resource://gre/modules/Webapps.jsm');
|
||||
DOMApplicationRegistry.allAppsLaunchable = true;
|
||||
|
||||
this.sendEvent(window, 'ContentStart');
|
||||
|
||||
Services.obs.notifyObservers(null, 'content-start', null);
|
||||
@ -668,13 +675,12 @@ Services.obs.addObserver(function onFullscreenOriginChange(subject, topic, data)
|
||||
fullscreenorigin: data });
|
||||
}, "fullscreen-origin-change", false);
|
||||
|
||||
Services.obs.addObserver(function onWebappsStart(subject, topic, data) {
|
||||
DOMApplicationRegistry.registryStarted.then(function () {
|
||||
shell.sendChromeEvent({ type: 'webapps-registry-start' });
|
||||
}, 'webapps-registry-start', false);
|
||||
|
||||
Services.obs.addObserver(function onWebappsReady(subject, topic, data) {
|
||||
});
|
||||
DOMApplicationRegistry.registryReady.then(function () {
|
||||
shell.sendChromeEvent({ type: 'webapps-registry-ready' });
|
||||
}, 'webapps-registry-ready', false);
|
||||
});
|
||||
|
||||
Services.obs.addObserver(function onBluetoothVolumeChange(subject, topic, data) {
|
||||
shell.sendChromeEvent({
|
||||
@ -1097,6 +1103,8 @@ let RemoteDebugger = {
|
||||
DebuggerServer.registerModule("devtools/server/actors/inspector");
|
||||
DebuggerServer.registerModule("devtools/server/actors/styleeditor");
|
||||
DebuggerServer.registerModule("devtools/server/actors/stylesheets");
|
||||
DebuggerServer.registerModule("devtools/server/actors/tracer");
|
||||
DebuggerServer.registerModule("devtools/server/actors/webgl");
|
||||
}
|
||||
DebuggerServer.addActors('chrome://browser/content/dbg-browser-actors.js');
|
||||
DebuggerServer.addActors("resource://gre/modules/devtools/server/actors/webapps.js");
|
||||
|
@ -12,13 +12,13 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="eda08beb3ba9a159843c70ffde0f9660ec351eb9"/>
|
||||
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="87aa8679560ce09f6445621d6f370d9de722cdba"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<!-- Stock Android things -->
|
||||
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
|
||||
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>
|
||||
|
@ -11,10 +11,10 @@
|
||||
</project>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<project name="valgrind" path="external/valgrind" remote="b2g" revision="905bfa3548eb75cf1792d0d8412b92113bbd4318"/>
|
||||
<project name="vex" path="external/VEX" remote="b2g" revision="c3d7efc45414f1b44cd9c479bb2758c91c4707c0"/>
|
||||
<!-- Stock Android things -->
|
||||
|
@ -12,13 +12,13 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="eda08beb3ba9a159843c70ffde0f9660ec351eb9"/>
|
||||
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="87aa8679560ce09f6445621d6f370d9de722cdba"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<!-- Stock Android things -->
|
||||
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
|
||||
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>
|
||||
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"revision": "806d5b997ec768914eaff1c46143c55de2612dbf",
|
||||
"revision": "5116c92a2905f6646d7049ddd1e1ab68eeb278d9",
|
||||
"repo_path": "/integration/gaia-central"
|
||||
}
|
||||
|
@ -11,12 +11,12 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="84f2f2fce22605e17d511ff1767e54770067b5b5"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<!-- Stock Android things -->
|
||||
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="84f2f2fce22605e17d511ff1767e54770067b5b5"/>
|
||||
|
@ -12,12 +12,12 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="84f2f2fce22605e17d511ff1767e54770067b5b5"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<!-- Stock Android things -->
|
||||
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<project name="platform/bionic" path="bionic" revision="cd5dfce80bc3f0139a56b58aca633202ccaee7f8"/>
|
||||
|
@ -11,12 +11,12 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="84f2f2fce22605e17d511ff1767e54770067b5b5"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
|
||||
<!-- Stock Android things -->
|
||||
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
|
@ -11,10 +11,10 @@
|
||||
</project>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<project name="valgrind" path="external/valgrind" remote="b2g" revision="905bfa3548eb75cf1792d0d8412b92113bbd4318"/>
|
||||
<project name="vex" path="external/VEX" remote="b2g" revision="c3d7efc45414f1b44cd9c479bb2758c91c4707c0"/>
|
||||
<!-- Stock Android things -->
|
||||
|
@ -11,12 +11,12 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="afa75c6f431b00a2cee83c48f1bf986fc1cd6df1"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="48637bedf20a7d1b8cc3f1638e72eeb44728f467"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9b6626eddbc85873eaa2a9174a9bd5101e5c05f"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="84f2f2fce22605e17d511ff1767e54770067b5b5"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="96d2d00165f4561fbde62d1062706eab74b3a01f"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="4addd530e2dc1708745d11d81de21b5d1230ed41"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="a887bfabaed83c4588b40c845535c0388c8da0f3"/>
|
||||
<project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
|
||||
<!-- Stock Android things -->
|
||||
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
|
@ -525,8 +525,6 @@
|
||||
@BINPATH@/components/CaptivePortalDetectComponents.manifest
|
||||
@BINPATH@/components/captivedetect.js
|
||||
#endif
|
||||
@BINPATH@/components/TelemetryPing.js
|
||||
@BINPATH@/components/TelemetryPing.manifest
|
||||
@BINPATH@/components/TelemetryStartup.js
|
||||
@BINPATH@/components/TelemetryStartup.manifest
|
||||
@BINPATH@/components/Webapps.js
|
||||
|
@ -54,6 +54,18 @@
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^Updated.app/.*</key><dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^updating/.*</key><dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -1337,7 +1337,7 @@ pref("browser.uiCustomization.debug", false);
|
||||
|
||||
// The URL where remote content that composes the UI for Firefox Accounts should
|
||||
// be fetched. Must use HTTPS.
|
||||
pref("firefox.accounts.remoteUrl", "https://accounts.dev.lcip.org/?service=sync");
|
||||
pref("identity.fxaccounts.remote.uri", "https://accounts.dev.lcip.org/?service=sync");
|
||||
|
||||
// The URL of the Firefox Accounts auth server backend
|
||||
pref("identity.fxaccounts.auth.uri", "https://api-accounts.dev.lcip.org/v1");
|
||||
|
@ -34,8 +34,12 @@ var FeedHandler = {
|
||||
return false;
|
||||
}
|
||||
|
||||
while (container.firstChild)
|
||||
container.removeChild(container.firstChild);
|
||||
for (let i = container.childNodes.length - 1; i >= 0; --i) {
|
||||
let node = container.childNodes[i];
|
||||
if (isSubview && node.localName == "label")
|
||||
continue;
|
||||
container.removeChild(node);
|
||||
}
|
||||
|
||||
if (!feeds || feeds.length <= 1)
|
||||
return false;
|
||||
@ -46,14 +50,16 @@ var FeedHandler = {
|
||||
var item = document.createElement(itemNodeType);
|
||||
var baseTitle = feedInfo.title || feedInfo.href;
|
||||
var labelStr = gNavigatorBundle.getFormattedString("feedShowFeedNew", [baseTitle]);
|
||||
item.setAttribute("class", "feed-" + itemNodeType);
|
||||
item.setAttribute("label", labelStr);
|
||||
item.setAttribute("feed", feedInfo.href);
|
||||
item.setAttribute("tooltiptext", feedInfo.href);
|
||||
item.setAttribute("crop", "center");
|
||||
let className = "feed-" + itemNodeType;
|
||||
if (isSubview) {
|
||||
item.setAttribute("tabindex", "0");
|
||||
className += " subviewbutton";
|
||||
}
|
||||
item.setAttribute("class", className);
|
||||
container.appendChild(item);
|
||||
}
|
||||
return true;
|
||||
|
@ -283,7 +283,13 @@ let gSyncUI = {
|
||||
.getService(Components.interfaces.nsISupports)
|
||||
.wrappedJSObject;
|
||||
if (xps.fxAccountsEnabled) {
|
||||
switchToTabHavingURI("about:accounts", true);
|
||||
fxAccounts.getSignedInUser().then(userData => {
|
||||
if (userData) {
|
||||
this.openPrefs();
|
||||
} else {
|
||||
switchToTabHavingURI("about:accounts", true);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
let win = Services.wm.getMostRecentWindow("Weave:AccountSetup");
|
||||
if (win)
|
||||
|
@ -265,7 +265,6 @@ toolbarpaletteitem > #personal-bookmarks > #bookmarks-toolbar-placeholder,
|
||||
display: -moz-box;
|
||||
}
|
||||
|
||||
#wrapper-urlbar-container > #urlbar-container > #urlbar-wrapper > #urlbar > toolbarbutton,
|
||||
#urlbar-reload-button:not([displaystop]) + #urlbar-stop-button,
|
||||
#urlbar-reload-button[displaystop] {
|
||||
visibility: collapse;
|
||||
|
@ -3448,6 +3448,21 @@ var XULBrowserWindow = {
|
||||
LinkTargetDisplay.update();
|
||||
},
|
||||
|
||||
showTooltip: function (x, y, tooltip) {
|
||||
// The x,y coordinates are relative to the <browser> element using
|
||||
// the chrome zoom level.
|
||||
let elt = document.getElementById("remoteBrowserTooltip");
|
||||
elt.label = tooltip;
|
||||
|
||||
let anchor = gBrowser.selectedBrowser;
|
||||
elt.openPopupAtScreen(anchor.boxObject.screenX + x, anchor.boxObject.screenY + y, false, null);
|
||||
},
|
||||
|
||||
hideTooltip: function () {
|
||||
let elt = document.getElementById("remoteBrowserTooltip");
|
||||
elt.hidePopup();
|
||||
},
|
||||
|
||||
updateStatusField: function () {
|
||||
var text, type, types = ["overLink"];
|
||||
if (this._busyUI)
|
||||
@ -6418,10 +6433,10 @@ var gIdentityHandler = {
|
||||
// Chrome URIs however get special treatment. Some chrome URIs are
|
||||
// whitelisted to provide a positive security signal to the user.
|
||||
let chromeWhitelist = ["about:addons", "about:app-manager", "about:config",
|
||||
"about:crashes", "about:healthreport", "about:home",
|
||||
"about:newaddon", "about:permissions", "about:preferences",
|
||||
"about:privatebrowsing", "about:sessionstore",
|
||||
"about:support", "about:welcomeback"];
|
||||
"about:crashes", "about:customizing", "about:healthreport",
|
||||
"about:home", "about:newaddon", "about:permissions",
|
||||
"about:preferences", "about:privatebrowsing",
|
||||
"about:sessionstore", "about:support", "about:welcomeback"];
|
||||
let lowercaseSpec = uri.spec.toLowerCase();
|
||||
if (chromeWhitelist.some(function(whitelistedSpec) lowercaseSpec.startsWith(whitelistedSpec))) {
|
||||
this.setMode(this.IDENTITY_MODE_CHROMEUI);
|
||||
|
@ -129,6 +129,7 @@
|
||||
oncommand="gotoHistoryIndex(event); event.stopPropagation();"
|
||||
onclick="checkForMiddleClick(this, event);"/>
|
||||
<tooltip id="aHTMLTooltip" page="true"/>
|
||||
<tooltip id="remoteBrowserTooltip"/>
|
||||
|
||||
<!-- for search and content formfill/pw manager -->
|
||||
<panel type="autocomplete" id="PopupAutoComplete" noautofocus="true" hidden="true"/>
|
||||
@ -217,6 +218,7 @@
|
||||
hidden="true"
|
||||
noautofocus="true"
|
||||
noautohide="true"
|
||||
flip="none"
|
||||
consumeoutsideclicks="false">
|
||||
<box id="UITourHighlight"></box>
|
||||
</panel>
|
||||
|
@ -1,89 +1,89 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Promise",
|
||||
"resource://gre/modules/Promise.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Task",
|
||||
"resource://gre/modules/Task.jsm");
|
||||
|
||||
registerCleanupFunction(function() {
|
||||
// Ensure we don't pollute prefs for next tests.
|
||||
Services.prefs.clearUserPref("firefox.accounts.remoteUrl");
|
||||
});
|
||||
|
||||
let gTests = [
|
||||
|
||||
{
|
||||
desc: "Test the remote commands",
|
||||
setup: function ()
|
||||
{
|
||||
Services.prefs.setCharPref("firefox.accounts.remoteUrl",
|
||||
"https://example.com/browser/browser/base/content/test/general/accounts_testRemoteCommands.html");
|
||||
},
|
||||
run: function ()
|
||||
{
|
||||
let deferred = Promise.defer();
|
||||
|
||||
let results = 0;
|
||||
try {
|
||||
let win = gBrowser.contentWindow;
|
||||
win.addEventListener("message", function testLoad(e) {
|
||||
if (e.data.type == "testResult") {
|
||||
ok(e.data.pass, e.data.info);
|
||||
results++;
|
||||
}
|
||||
else if (e.data.type == "testsComplete") {
|
||||
is(results, e.data.count, "Checking number of results received matches the number of tests that should have run");
|
||||
win.removeEventListener("message", testLoad, false, true);
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
}, false, true);
|
||||
|
||||
} catch(e) {
|
||||
ok(false, "Failed to get all commands");
|
||||
deferred.reject();
|
||||
}
|
||||
return deferred.promise;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
]; // gTests
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
Task.spawn(function () {
|
||||
for (let test of gTests) {
|
||||
info(test.desc);
|
||||
test.setup();
|
||||
|
||||
yield promiseNewTabLoadEvent("about:accounts");
|
||||
|
||||
yield test.run();
|
||||
|
||||
gBrowser.removeCurrentTab();
|
||||
}
|
||||
|
||||
finish();
|
||||
});
|
||||
}
|
||||
|
||||
function promiseNewTabLoadEvent(aUrl, aEventType="load")
|
||||
{
|
||||
let deferred = Promise.defer();
|
||||
let tab = gBrowser.selectedTab = gBrowser.addTab(aUrl);
|
||||
tab.linkedBrowser.addEventListener(aEventType, function load(event) {
|
||||
tab.linkedBrowser.removeEventListener(aEventType, load, true);
|
||||
let iframe = tab.linkedBrowser.contentDocument.getElementById("remote");
|
||||
iframe.addEventListener("load", function frameLoad(e) {
|
||||
iframe.removeEventListener("load", frameLoad, false);
|
||||
deferred.resolve();
|
||||
}, false);
|
||||
}, true);
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Promise",
|
||||
"resource://gre/modules/Promise.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Task",
|
||||
"resource://gre/modules/Task.jsm");
|
||||
|
||||
registerCleanupFunction(function() {
|
||||
// Ensure we don't pollute prefs for next tests.
|
||||
Services.prefs.clearUserPref("identity.fxaccounts.remote.uri");
|
||||
});
|
||||
|
||||
let gTests = [
|
||||
|
||||
{
|
||||
desc: "Test the remote commands",
|
||||
setup: function ()
|
||||
{
|
||||
Services.prefs.setCharPref("identity.fxaccounts.remote.uri",
|
||||
"https://example.com/browser/browser/base/content/test/general/accounts_testRemoteCommands.html");
|
||||
},
|
||||
run: function ()
|
||||
{
|
||||
let deferred = Promise.defer();
|
||||
|
||||
let results = 0;
|
||||
try {
|
||||
let win = gBrowser.contentWindow;
|
||||
win.addEventListener("message", function testLoad(e) {
|
||||
if (e.data.type == "testResult") {
|
||||
ok(e.data.pass, e.data.info);
|
||||
results++;
|
||||
}
|
||||
else if (e.data.type == "testsComplete") {
|
||||
is(results, e.data.count, "Checking number of results received matches the number of tests that should have run");
|
||||
win.removeEventListener("message", testLoad, false, true);
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
}, false, true);
|
||||
|
||||
} catch(e) {
|
||||
ok(false, "Failed to get all commands");
|
||||
deferred.reject();
|
||||
}
|
||||
return deferred.promise;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
]; // gTests
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
Task.spawn(function () {
|
||||
for (let test of gTests) {
|
||||
info(test.desc);
|
||||
test.setup();
|
||||
|
||||
yield promiseNewTabLoadEvent("about:accounts");
|
||||
|
||||
yield test.run();
|
||||
|
||||
gBrowser.removeCurrentTab();
|
||||
}
|
||||
|
||||
finish();
|
||||
});
|
||||
}
|
||||
|
||||
function promiseNewTabLoadEvent(aUrl, aEventType="load")
|
||||
{
|
||||
let deferred = Promise.defer();
|
||||
let tab = gBrowser.selectedTab = gBrowser.addTab(aUrl);
|
||||
tab.linkedBrowser.addEventListener(aEventType, function load(event) {
|
||||
tab.linkedBrowser.removeEventListener(aEventType, load, true);
|
||||
let iframe = tab.linkedBrowser.contentDocument.getElementById("remote");
|
||||
iframe.addEventListener("load", function frameLoad(e) {
|
||||
iframe.removeEventListener("load", frameLoad, false);
|
||||
deferred.resolve();
|
||||
}, false);
|
||||
}, true);
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
|
@ -982,7 +982,7 @@ var tests = [
|
||||
},
|
||||
onHidden: function() { }
|
||||
},
|
||||
{ // Test #31 - Moving a tab to a new window should remove non-swappable
|
||||
{ // Test #34 - Moving a tab to a new window should remove non-swappable
|
||||
// notifications.
|
||||
run: function() {
|
||||
gBrowser.selectedTab = gBrowser.addTab("about:blank");
|
||||
@ -1002,7 +1002,7 @@ var tests = [
|
||||
});
|
||||
}
|
||||
},
|
||||
{ // Test #32 - Moving a tab to a new window should preserve swappable notifications.
|
||||
{ // Test #35 - Moving a tab to a new window should preserve swappable notifications.
|
||||
run: function() {
|
||||
gBrowser.selectedTab = gBrowser.addTab("about:blank");
|
||||
let notifyObj = new basicNotification();
|
||||
@ -1024,6 +1024,50 @@ var tests = [
|
||||
goNext();
|
||||
});
|
||||
}
|
||||
},
|
||||
{ // Test #36 - the hideNotNow option
|
||||
run: function () {
|
||||
this.notifyObj = new basicNotification();
|
||||
this.notifyObj.options.hideNotNow = true;
|
||||
this.notifyObj.mainAction.dismiss = true;
|
||||
showNotification(this.notifyObj);
|
||||
},
|
||||
onShown: function (popup) {
|
||||
// checkPopup verifies that the Not Now item is hidden, and that no separator is added.
|
||||
checkPopup(popup, this.notifyObj);
|
||||
triggerMainCommand(popup);
|
||||
},
|
||||
onHidden: function (popup) { }
|
||||
},
|
||||
{ // Test #37 - the main action callback can keep the notification.
|
||||
run: function () {
|
||||
this.notifyObj = new basicNotification();
|
||||
this.notifyObj.mainAction.dismiss = true;
|
||||
showNotification(this.notifyObj);
|
||||
},
|
||||
onShown: function (popup) {
|
||||
checkPopup(popup, this.notifyObj);
|
||||
triggerMainCommand(popup);
|
||||
},
|
||||
onHidden: function (popup) {
|
||||
ok(this.notifyObj.dismissalCallbackTriggered, "dismissal callback was triggered");
|
||||
ok(!this.notifyObj.removedCallbackTriggered, "removed callback wasn't triggered");
|
||||
}
|
||||
},
|
||||
{ // Test #38 - a secondary action callback can keep the notification.
|
||||
run: function () {
|
||||
this.notifyObj = new basicNotification();
|
||||
this.notifyObj.secondaryActions[0].dismiss = true;
|
||||
showNotification(this.notifyObj);
|
||||
},
|
||||
onShown: function (popup) {
|
||||
checkPopup(popup, this.notifyObj);
|
||||
triggerSecondaryCommand(popup, 0);
|
||||
},
|
||||
onHidden: function (popup) {
|
||||
ok(this.notifyObj.dismissalCallbackTriggered, "dismissal callback was triggered");
|
||||
ok(!this.notifyObj.removedCallbackTriggered, "removed callback wasn't triggered");
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
@ -1063,7 +1107,12 @@ function checkPopup(popup, notificationObj) {
|
||||
function (child) child.nodeName == "menuitem");
|
||||
let secondaryActions = notificationObj.secondaryActions || [];
|
||||
let actualSecondaryActionsCount = actualSecondaryActions.length;
|
||||
if (secondaryActions.length) {
|
||||
if (notificationObj.options.hideNotNow) {
|
||||
is(notification.getAttribute("hidenotnow"), "true", "Not Now item hidden");
|
||||
if (secondaryActions.length)
|
||||
is(notification.lastChild.tagName, "menuitem", "no menuseparator");
|
||||
}
|
||||
else if (secondaryActions.length) {
|
||||
is(notification.lastChild.tagName, "menuseparator", "menuseparator exists");
|
||||
}
|
||||
is(actualSecondaryActionsCount, secondaryActions.length, actualSecondaryActions.length + " secondary actions");
|
||||
|
@ -18,6 +18,8 @@
|
||||
disablefastfind="true">
|
||||
<head>
|
||||
<title>&customizeMode.tabTitle;</title>
|
||||
<link rel="icon" type="image/x-icon"
|
||||
href="chrome://browser/skin/customizableui/customizeFavicon.ico"/>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
|
@ -38,25 +38,28 @@
|
||||
</panelview>
|
||||
|
||||
<panelview id="PanelUI-history" flex="1">
|
||||
<label value="&appMenuHistory.label;"/>
|
||||
<label value="&appMenuHistory.label;" class="panel-subview-header"/>
|
||||
<toolbarbutton id="appMenuViewHistorySidebar" tabindex="0"
|
||||
label="&appMenuHistory.viewSidebar.label;"
|
||||
type="checkbox"
|
||||
class="subviewbutton"
|
||||
oncommand="toggleSidebar('viewHistorySidebar'); PanelUI.hide();">
|
||||
<observes element="viewHistorySidebar" attribute="checked"/>
|
||||
</toolbarbutton>
|
||||
<toolbarbutton id="appMenuClearRecentHistory" tabindex="0"
|
||||
label="&appMenuHistory.clearRecent.label;"
|
||||
class="subviewbutton"
|
||||
command="Tools:Sanitize"/>
|
||||
#ifdef MOZ_SERVICES_SYNC
|
||||
<toolbarbutton id="sync-tabs-menuitem2"
|
||||
class="syncTabsMenuItem"
|
||||
class="syncTabsMenuItem subviewbutton"
|
||||
label="&syncTabsMenu2.label;"
|
||||
oncommand="BrowserOpenSyncTabs();"
|
||||
disabled="true"/>
|
||||
#endif
|
||||
<toolbarbutton id="appMenuRestoreLastSession" tabindex="0"
|
||||
label="&appMenuHistory.restoreSession.label;"
|
||||
class="subviewbutton"
|
||||
command="Browser:RestoreLastSession"/>
|
||||
<menuseparator id="PanelUI-recentlyClosedTabs-separator"/>
|
||||
<vbox id="PanelUI-recentlyClosedTabs" tooltip="bhTooltip"/>
|
||||
@ -64,24 +67,28 @@
|
||||
<vbox id="PanelUI-recentlyClosedWindows" tooltip="bhTooltip"/>
|
||||
<menuseparator id="PanelUI-historyItems-separator"/>
|
||||
<vbox id="PanelUI-historyItems" tooltip="bhTooltip"/>
|
||||
<label value="&appMenuHistory.showAll.label;"
|
||||
id="PanelUI-historyMore"
|
||||
class="text-link"
|
||||
onclick="PlacesCommandHook.showPlacesOrganizer('History'); CustomizableUI.hidePanelForNode(this);"/>
|
||||
<toolbarbutton id="PanelUI-historyMore" tabindex="0"
|
||||
class="panel-subview-footer subviewbutton"
|
||||
label="&appMenuHistory.showAll.label;"
|
||||
oncommand="PlacesCommandHook.showPlacesOrganizer('History'); CustomizableUI.hidePanelForNode(this);"/>
|
||||
</panelview>
|
||||
|
||||
<panelview id="PanelUI-bookmarks" flex="1">
|
||||
<panelview id="PanelUI-bookmarks" flex="1" class="PanelUI-subView">
|
||||
<label value="&bookmarksMenu.label;" class="panel-subview-header"/>
|
||||
<toolbarbutton id="panelMenuBookmarkThisPage"
|
||||
label="&bookmarkThisPageCmd.label;"
|
||||
class="subviewbutton"
|
||||
command="Browser:AddBookmarkAs"
|
||||
onclick="PanelUI.hide();"/>
|
||||
<toolbarseparator/>
|
||||
<toolbarbutton id="panelMenu_showAllBookmarks"
|
||||
label="&showAllBookmarks2.label;"
|
||||
class="subviewbutton"
|
||||
command="Browser:ShowAllBookmarks"
|
||||
onclick="PanelUI.hide();"/>
|
||||
<toolbarbutton id="panelMenu_viewBookmarksSidebar"
|
||||
label="&viewBookmarksSidebar2.label;"
|
||||
class="subviewbutton"
|
||||
oncommand="toggleSidebar('viewBookmarksSidebar'); PanelUI.hide();">
|
||||
<observes element="viewBookmarksSidebar" attribute="checked"/>
|
||||
</toolbarbutton>
|
||||
@ -89,13 +96,16 @@
|
||||
label="&viewBookmarksToolbar.label;"
|
||||
type="checkbox"
|
||||
toolbarId="PersonalToolbar"
|
||||
class="subviewbutton"
|
||||
oncommand="onViewToolbarCommand(event); PanelUI.hide();"/>
|
||||
<toolbarseparator/>
|
||||
<toolbarbutton id="panelMenu_bookmarksToolbar"
|
||||
label="&personalbarCmd.label;"
|
||||
class="subviewbutton"
|
||||
oncommand="PlacesCommandHook.showPlacesOrganizer('BookmarksToolbar'); PanelUI.hide();"/>
|
||||
<toolbarbutton id="panelMenu_unsortedBookmarks"
|
||||
label="&unsortedBookmarksCmd.label;"
|
||||
class="subviewbutton"
|
||||
oncommand="PlacesCommandHook.showPlacesOrganizer('UnfiledBookmarks'); PanelUI.hide();"/>
|
||||
<toolbarseparator/>
|
||||
<toolbaritem id="panelMenu_bookmarksMenu"
|
||||
@ -113,20 +123,22 @@
|
||||
|
||||
<panelview id="PanelUI-socialapi" flex="1"/>
|
||||
|
||||
<panelview id="PanelUI-feeds" flex="1" oncommand="FeedHandler.subscribeToFeed(null, event);"></panelview>
|
||||
<panelview id="PanelUI-feeds" flex="1" oncommand="FeedHandler.subscribeToFeed(null, event);">
|
||||
<label value="&feedsMenu.label;" class="panel-subview-header"/>
|
||||
</panelview>
|
||||
|
||||
<panelview id="PanelUI-helpView" flex="1">
|
||||
<label value="&helpMenu.label;"/>
|
||||
<label value="&helpMenu.label;" class="panel-subview-header"/>
|
||||
<vbox id="PanelUI-helpItems"/>
|
||||
</panelview>
|
||||
|
||||
<panelview id="PanelUI-developer" flex="1">
|
||||
<label value="&webDeveloperMenu.label;"/>
|
||||
<label value="&webDeveloperMenu.label;" class="panel-subview-header"/>
|
||||
<vbox id="PanelUI-developerItems"/>
|
||||
</panelview>
|
||||
|
||||
<panelview id="PanelUI-characterEncodingView" flex="1">
|
||||
<label value="&charsetMenu.label;"/>
|
||||
<label value="&charsetMenu.label;" class="panel-subview-header"/>
|
||||
|
||||
<vbox id="PanelUI-characterEncodingView-customlist"
|
||||
class="PanelUI-characterEncodingView-list"/>
|
||||
|
@ -409,6 +409,7 @@ const PanelUI = {
|
||||
continue;
|
||||
button.setAttribute(attrName, node.getAttribute(attrName));
|
||||
}
|
||||
button.setAttribute("class", "subviewbutton");
|
||||
fragment.appendChild(button);
|
||||
}
|
||||
items.appendChild(fragment);
|
||||
|
@ -102,6 +102,7 @@ const CustomizableWidgets = [{
|
||||
item.setAttribute("label", title || uri);
|
||||
item.setAttribute("tabindex", "0");
|
||||
item.setAttribute("targetURI", uri);
|
||||
item.setAttribute("class", "subviewbutton");
|
||||
item.addEventListener("command", function (aEvent) {
|
||||
onHistoryVisit(uri, aEvent, item);
|
||||
});
|
||||
@ -152,12 +153,24 @@ const CustomizableWidgets = [{
|
||||
|
||||
let tabsFragment = RecentlyClosedTabsAndWindowsMenuUtils.getTabsFragment(doc.defaultView, "toolbarbutton");
|
||||
let separator = doc.getElementById("PanelUI-recentlyClosedTabs-separator");
|
||||
separator.hidden = !tabsFragment.childElementCount;
|
||||
let elementCount = tabsFragment.childElementCount;
|
||||
separator.hidden = !elementCount;
|
||||
while (--elementCount >= 0) {
|
||||
if (tabsFragment.children[elementCount].localName != "toolbarbutton")
|
||||
continue;
|
||||
tabsFragment.children[elementCount].setAttribute("class", "subviewbutton");
|
||||
}
|
||||
recentlyClosedTabs.appendChild(tabsFragment);
|
||||
|
||||
let windowsFragment = RecentlyClosedTabsAndWindowsMenuUtils.getWindowsFragment(doc.defaultView, "toolbarbutton");
|
||||
separator = doc.getElementById("PanelUI-recentlyClosedWindows-separator");
|
||||
separator.hidden = !windowsFragment.childElementCount;
|
||||
elementCount = windowsFragment.childElementCount;
|
||||
separator.hidden = !elementCount;
|
||||
while (--elementCount >= 0) {
|
||||
if (windowsFragment.children[elementCount].localName != "toolbarbutton")
|
||||
continue;
|
||||
windowsFragment.children[elementCount].setAttribute("class", "subviewbutton");
|
||||
}
|
||||
recentlyClosedWindows.appendChild(windowsFragment);
|
||||
},
|
||||
onViewHiding: function(aEvent) {
|
||||
@ -244,6 +257,7 @@ const CustomizableWidgets = [{
|
||||
} else if (node.localName == "menuitem") {
|
||||
item = doc.createElementNS(kNSXUL, "toolbarbutton");
|
||||
item.setAttribute("tabindex", "0");
|
||||
item.setAttribute("class", "subviewbutton");
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
@ -715,6 +729,7 @@ const CustomizableWidgets = [{
|
||||
elem.setAttribute("current", "true");
|
||||
if (disabled)
|
||||
elem.setAttribute("disabled", "true");
|
||||
elem.setAttribute("class", "subviewbutton");
|
||||
containerElem.appendChild(elem);
|
||||
}
|
||||
},
|
||||
|
@ -1780,7 +1780,7 @@ PlacesPanelMenuView.prototype = {
|
||||
}
|
||||
else {
|
||||
button = document.createElement("toolbarbutton");
|
||||
button.className = "bookmark-item";
|
||||
button.className = "bookmark-item subviewbutton";
|
||||
button.setAttribute("label", aChild.title);
|
||||
let icon = aChild.icon;
|
||||
if (icon)
|
||||
|
@ -84,11 +84,11 @@
|
||||
.getService(Components.interfaces.nsIObserverService);
|
||||
os.addObserver(this, "browser-search-engine-modified", false);
|
||||
|
||||
this._addedObserver = true;
|
||||
this._initialized = true;
|
||||
|
||||
this.searchService.init((function search_init_cb(aStatus) {
|
||||
// Bail out if the binding's been destroyed
|
||||
if (this._destroyed)
|
||||
if (!this._initialized)
|
||||
return;
|
||||
|
||||
if (Components.isSuccessCode(aStatus)) {
|
||||
@ -101,13 +101,12 @@
|
||||
]]></constructor>
|
||||
|
||||
<destructor><![CDATA[
|
||||
this._destroyed = true;
|
||||
if (this._initialized) {
|
||||
this._initialized = false;
|
||||
|
||||
if (this._addedObserver) {
|
||||
var os = Components.classes["@mozilla.org/observer-service;1"]
|
||||
.getService(Components.interfaces.nsIObserverService);
|
||||
os.removeObserver(this, "browser-search-engine-modified");
|
||||
this._addedObserver = false;
|
||||
}
|
||||
|
||||
// Make sure to break the cycle from _textbox to us. Otherwise we leak
|
||||
|
@ -60,7 +60,9 @@ let SessionCookiesInternal = {
|
||||
// Collect all hosts for the current window.
|
||||
let hosts = this.getHostsForWindow(window, true);
|
||||
|
||||
for (let [host, isPinned] in Iterator(hosts)) {
|
||||
for (let host of Object.keys(hosts)) {
|
||||
let isPinned = hosts[host];
|
||||
|
||||
for (let cookie of CookieStore.getCookiesForHost(host)) {
|
||||
// _getCookiesForHost() will only return hosts with the right privacy
|
||||
// rules, so there is no need to do anything special with this call
|
||||
@ -302,7 +304,7 @@ let CookieStore = {
|
||||
let cookies = [];
|
||||
|
||||
for (let pathToNamesMap of this._hosts.get(host).values()) {
|
||||
cookies = cookies.concat([cookie for (cookie of pathToNamesMap.values())]);
|
||||
cookies.push(...pathToNamesMap.values());
|
||||
}
|
||||
|
||||
return cookies;
|
||||
|
@ -113,9 +113,9 @@ let SessionStorageInternal = {
|
||||
// of missing documentURI will be solved in a followup bug to bug 600307.
|
||||
let storage = storageManager.createStorage(principal, "", aDocShell.usePrivateBrowsing);
|
||||
|
||||
for (let [key, value] in Iterator(data)) {
|
||||
for (let key of Object.keys(data)) {
|
||||
try {
|
||||
storage.setItem(key, value);
|
||||
storage.setItem(key, data[key]);
|
||||
} catch (e) {
|
||||
// throws e.g. for URIs that can't have sessionStorage
|
||||
console.error(e);
|
||||
|
@ -288,7 +288,8 @@ function test_setBrowserState() {
|
||||
|
||||
waitForBrowserState(lameMultiWindowState, function() {
|
||||
let checkedWindows = 0;
|
||||
for each (let [id, winEvents] in Iterator(windowEvents)) {
|
||||
for (let id of Object.keys(windowEvents)) {
|
||||
let winEvents = windowEvents[id];
|
||||
is(winEvents.busyEventCount, 1,
|
||||
"[test_setBrowserState] window" + id + " busy event count correct");
|
||||
is(winEvents.readyEventCount, 1,
|
||||
|
@ -0,0 +1,3 @@
|
||||
. "$topsrcdir/browser/config/mozconfigs/macosx-universal/nightly"
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
@ -5,8 +5,6 @@ ac_add_options --enable-trace-malloc
|
||||
ac_add_options --enable-accessibility
|
||||
ac_add_options --enable-signmar
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
||||
|
||||
# Needed to enable breakpad in application.ini
|
||||
export MOZILLA_OFFICIAL=1
|
||||
|
||||
|
3
browser/config/mozconfigs/macosx64/debug-nonunified
Normal file
3
browser/config/mozconfigs/macosx64/debug-nonunified
Normal file
@ -0,0 +1,3 @@
|
||||
. "$topsrcdir/browser/config/mozconfigs/macosx64/debug"
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
@ -5,7 +5,7 @@ whitelist = {
|
||||
'nightly': {},
|
||||
}
|
||||
|
||||
all_platforms = ['win32', 'linux32', 'linux64', 'macosx-universal']
|
||||
all_platforms = ['win64', 'win32', 'linux32', 'linux64', 'macosx-universal']
|
||||
|
||||
for platform in all_platforms:
|
||||
whitelist['nightly'][platform] = [
|
||||
@ -19,7 +19,7 @@ for platform in ['linux32', 'linux64', 'macosx-universal']:
|
||||
'mk_add_options MOZ_MAKE_FLAGS="-j4"',
|
||||
]
|
||||
|
||||
for platform in ['linux32', 'linux64', 'macosx-universal', 'win32']:
|
||||
for platform in ['linux32', 'linux64', 'macosx-universal', 'win32', 'win64']:
|
||||
whitelist['nightly'][platform] += ['ac_add_options --enable-signmar']
|
||||
whitelist['nightly'][platform] += ['ac_add_options --enable-js-diagnostics']
|
||||
|
||||
@ -62,6 +62,10 @@ whitelist['nightly']['win32'] += [
|
||||
'fi',
|
||||
'ac_add_options --enable-metro',
|
||||
]
|
||||
whitelist['nightly']['win64'] += [
|
||||
'. "$topsrcdir/browser/config/mozconfigs/win64/common-win64"',
|
||||
'ac_add_options --enable-metro',
|
||||
]
|
||||
|
||||
for platform in all_platforms:
|
||||
whitelist['release'][platform] = [
|
||||
@ -71,6 +75,8 @@ for platform in all_platforms:
|
||||
'export BUILDING_RELEASE=1',
|
||||
]
|
||||
whitelist['release']['win32'] += ['mk_add_options MOZ_PGO=1']
|
||||
whitelist['release']['win64'] += ['mk_add_options MOZ_PGO=1']
|
||||
|
||||
whitelist['release']['linux32'] += [
|
||||
'export MOZILLA_OFFICIAL=1',
|
||||
'export MOZ_TELEMETRY_REPORTING=1',
|
||||
|
@ -5,8 +5,6 @@ ac_add_options --enable-trace-malloc
|
||||
ac_add_options --enable-signmar
|
||||
ac_add_options --enable-metro
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
||||
|
||||
# Needed to enable breakpad in application.ini
|
||||
export MOZILLA_OFFICIAL=1
|
||||
|
||||
|
3
browser/config/mozconfigs/win32/debug-nonunified
Normal file
3
browser/config/mozconfigs/win32/debug-nonunified
Normal file
@ -0,0 +1,3 @@
|
||||
. "$topsrcdir/browser/config/mozconfigs/win32/debug"
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
3
browser/config/mozconfigs/win32/nightly-nonunified
Normal file
3
browser/config/mozconfigs/win32/nightly-nonunified
Normal file
@ -0,0 +1,3 @@
|
||||
. "$topsrcdir/browser/config/mozconfigs/win32/nightly"
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
@ -1,7 +1,9 @@
|
||||
. "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
|
||||
. "$topsrcdir/browser/config/mozconfigs/win64/common-opt"
|
||||
|
||||
mk_add_options MOZ_PGO=1
|
||||
|
||||
ac_add_options --enable-official-branding
|
||||
. $topsrcdir/build/win64/mozconfig.vs2010
|
||||
|
||||
. "$topsrcdir/build/mozconfig.common.override"
|
||||
|
@ -8,8 +8,6 @@ ac_add_options --enable-trace-malloc
|
||||
ac_add_options --enable-signmar
|
||||
ac_add_options --enable-metro
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
||||
|
||||
# Needed to enable breakpad in application.ini
|
||||
export MOZILLA_OFFICIAL=1
|
||||
|
||||
|
3
browser/config/mozconfigs/win64/debug-nonunified
Normal file
3
browser/config/mozconfigs/win64/debug-nonunified
Normal file
@ -0,0 +1,3 @@
|
||||
. "$topsrcdir/browser/config/mozconfigs/win64/debug"
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
3
browser/config/mozconfigs/win64/nightly-nonunified
Normal file
3
browser/config/mozconfigs/win64/nightly-nonunified
Normal file
@ -0,0 +1,3 @@
|
||||
. "$topsrcdir/browser/config/mozconfigs/win64/nightly"
|
||||
|
||||
ac_add_options --disable-unified-compilation
|
@ -1,5 +1,6 @@
|
||||
# This make file should be identical to the beta mozconfig, apart from the
|
||||
# safeguard below
|
||||
. "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
|
||||
. "$topsrcdir/browser/config/mozconfigs/win64/common-opt"
|
||||
|
||||
mk_add_options MOZ_PGO=1
|
||||
@ -9,5 +10,6 @@ ac_add_options --enable-official-branding
|
||||
# safeguard against someone forgetting to re-set EARLY_BETA_OR_EARLIER in
|
||||
# defines.sh during the beta cycle
|
||||
export BUILDING_RELEASE=1
|
||||
. $topsrcdir/build/win64/mozconfig.vs2010
|
||||
|
||||
. "$topsrcdir/build/mozconfig.common.override"
|
||||
|
@ -235,7 +235,7 @@ let DebuggerController = {
|
||||
if (target.chrome) {
|
||||
this._startChromeDebugging(chromeDebugger, startedDebugging.resolve);
|
||||
} else {
|
||||
this._startDebuggingTab(threadActor, startedDebugging.resolve);
|
||||
this._startDebuggingTab(startedDebugging.resolve);
|
||||
const startedTracing = promise.defer();
|
||||
this._startTracingTab(traceActor, startedTracing.resolve);
|
||||
|
||||
@ -339,13 +339,13 @@ let DebuggerController = {
|
||||
/**
|
||||
* Sets up a debugging session.
|
||||
*
|
||||
* @param string aThreadActor
|
||||
* The remote protocol grip of the tab.
|
||||
* @param function aCallback
|
||||
* A function to invoke once the client attaches to the active thread.
|
||||
*/
|
||||
_startDebuggingTab: function(aThreadActor, aCallback) {
|
||||
this.client.attachThread(aThreadActor, (aResponse, aThreadClient) => {
|
||||
_startDebuggingTab: function(aCallback) {
|
||||
this._target.activeTab.attachThread({
|
||||
useSourceMaps: Prefs.sourceMapsEnabled
|
||||
}, (aResponse, aThreadClient) => {
|
||||
if (!aThreadClient) {
|
||||
Cu.reportError("Couldn't attach to thread: " + aResponse.error);
|
||||
return;
|
||||
@ -355,12 +355,14 @@ let DebuggerController = {
|
||||
this.ThreadState.connect();
|
||||
this.StackFrames.connect();
|
||||
this.SourceScripts.connect();
|
||||
aThreadClient.resume(this._ensureResumptionOrder);
|
||||
if (aThreadClient.paused) {
|
||||
aThreadClient.resume(this._ensureResumptionOrder);
|
||||
}
|
||||
|
||||
if (aCallback) {
|
||||
aCallback();
|
||||
}
|
||||
}, { useSourceMaps: Prefs.sourceMapsEnabled });
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
@ -382,7 +384,9 @@ let DebuggerController = {
|
||||
this.ThreadState.connect();
|
||||
this.StackFrames.connect();
|
||||
this.SourceScripts.connect();
|
||||
aThreadClient.resume(this._ensureResumptionOrder);
|
||||
if (aThreadClient.paused) {
|
||||
aThreadClient.resume(this._ensureResumptionOrder);
|
||||
}
|
||||
|
||||
if (aCallback) {
|
||||
aCallback();
|
||||
@ -419,7 +423,7 @@ let DebuggerController = {
|
||||
* away old sources and get them again.
|
||||
*/
|
||||
reconfigureThread: function(aUseSourceMaps) {
|
||||
this.client.reconfigureThread({ useSourceMaps: aUseSourceMaps }, aResponse => {
|
||||
this.activeThread.reconfigure({ useSourceMaps: aUseSourceMaps }, aResponse => {
|
||||
if (aResponse.error) {
|
||||
let msg = "Couldn't reconfigure thread: " + aResponse.message;
|
||||
Cu.reportError(msg);
|
||||
@ -432,8 +436,10 @@ let DebuggerController = {
|
||||
this.SourceScripts.handleTabNavigation();
|
||||
|
||||
// Update the stack frame list.
|
||||
this.activeThread._clearFrames();
|
||||
this.activeThread.fillFrames(CALL_STACK_PAGE_SIZE);
|
||||
if (this.activeThread.paused) {
|
||||
this.activeThread._clearFrames();
|
||||
this.activeThread.fillFrames(CALL_STACK_PAGE_SIZE);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -1068,7 +1068,24 @@ FilterView.prototype = {
|
||||
_doSearch: function(aOperator = "", aText = "") {
|
||||
this._searchbox.focus();
|
||||
this._searchbox.value = ""; // Need to clear value beforehand. Bug 779738.
|
||||
this._searchbox.value = aOperator + (aText || DebuggerView.editor.getSelection());
|
||||
|
||||
if (aText) {
|
||||
this._searchbox.value = aOperator + aText;
|
||||
}
|
||||
else if (DebuggerView.editor.somethingSelected()) {
|
||||
this._searchbox.value = aOperator + DebuggerView.editor.getSelection();
|
||||
}
|
||||
else {
|
||||
let cursor = DebuggerView.editor.getCursor();
|
||||
let content = DebuggerView.editor.getText();
|
||||
let location = DebuggerView.Sources.selectedValue;
|
||||
let source = DebuggerController.Parser.get(content, location);
|
||||
let identifier = source.getIdentifierAt({ line: cursor.line+1, column: cursor.ch });
|
||||
|
||||
if (identifier && identifier.name) {
|
||||
this._searchbox.value = aOperator + identifier.name;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -247,6 +247,7 @@ support-files =
|
||||
[browser_dbg_variables-view-webidl.js]
|
||||
[browser_dbg_watch-expressions-01.js]
|
||||
[browser_dbg_watch-expressions-02.js]
|
||||
[browser_dbg_search-function.js]
|
||||
[browser_dbg_chrome-create.js]
|
||||
skip-if = os == "linux" # Bug 847558
|
||||
[browser_dbg_on-pause-raise.js]
|
||||
|
@ -32,7 +32,7 @@ function test() {
|
||||
is(gEvents.itemCount, 0, "There should be no events before reloading.");
|
||||
|
||||
let reloaded = waitForSourcesAfterReload();
|
||||
gDebugger.gClient.activeTab.reload();
|
||||
gDebugger.DebuggerController._target.activeTab.reload();
|
||||
|
||||
is(gEvents.itemCount, 0, "There should be no events while reloading.");
|
||||
yield reloaded;
|
||||
|
@ -47,7 +47,7 @@ function test() {
|
||||
|
||||
let reloading = once(gDebugger.gTarget, "will-navigate");
|
||||
let reloaded = waitForSourcesAfterReload();
|
||||
gDebugger.gClient.activeTab.reload();
|
||||
gDebugger.DebuggerController._target.activeTab.reload();
|
||||
|
||||
yield reloading;
|
||||
|
||||
@ -89,7 +89,7 @@ function test() {
|
||||
|
||||
let reloading = once(gDebugger.gTarget, "will-navigate");
|
||||
let reloaded = waitForSourcesAfterReload();
|
||||
gDebugger.gClient.activeTab.reload();
|
||||
gDebugger.DebuggerController._target.activeTab.reload();
|
||||
|
||||
yield reloading;
|
||||
|
||||
|
@ -68,7 +68,7 @@ function testBreakOnAll() {
|
||||
|
||||
// Test calling pauseOnDOMEvents from a paused state.
|
||||
gThreadClient.pauseOnDOMEvents("*", (aPacket) => {
|
||||
is(aPacket, undefined,
|
||||
is(aPacket.error, undefined,
|
||||
"The pause-on-any-event request completed successfully.");
|
||||
|
||||
gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
|
||||
|
@ -0,0 +1,28 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* Tests that Debugger Search uses the identifier under cursor
|
||||
* if nothing is selected or manually passed
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
function test() {
|
||||
|
||||
const TAB_URL = EXAMPLE_URL + "doc_function-search.html";
|
||||
|
||||
initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => {
|
||||
let Source = 'code_function-search-01.js';
|
||||
let Debugger = aPanel.panelWin;
|
||||
let Editor = Debugger.DebuggerView.editor;
|
||||
let Filtering = Debugger.DebuggerView.Filtering;
|
||||
|
||||
waitForSourceShown(aPanel, Source).then(() => {
|
||||
Editor.setCursor({ line: 7, ch: 0});
|
||||
Filtering._doSearch("@");
|
||||
is(Filtering._searchbox.value, "@test", "Searchbox value should be set to the identifier under cursor if no aText or selection provided");
|
||||
closeDebuggerAndFinish(aPanel);
|
||||
});
|
||||
});
|
||||
};
|
@ -8,12 +8,11 @@
|
||||
const TAB_URL = EXAMPLE_URL + "doc_binary_search.html";
|
||||
const JS_URL = EXAMPLE_URL + "code_binary_search.js";
|
||||
|
||||
let gTab, gDebuggee, gPanel, gDebugger;
|
||||
let gEditor, gSources, gFrames, gPrefs, gOptions;
|
||||
let gDebuggee, gPanel, gDebugger, gEditor;
|
||||
let gSources, gFrames, gPrefs, gOptions;
|
||||
|
||||
function test() {
|
||||
initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => {
|
||||
gTab = aTab;
|
||||
gDebuggee = aDebuggee;
|
||||
gPanel = aPanel;
|
||||
gDebugger = gPanel.panelWin;
|
||||
@ -26,7 +25,6 @@ function test() {
|
||||
waitForSourceShown(gPanel, ".coffee")
|
||||
.then(testToggleGeneratedSource)
|
||||
.then(testSetBreakpoint)
|
||||
.then(testHitBreakpoint)
|
||||
.then(testToggleOnPause)
|
||||
.then(testResume)
|
||||
.then(() => closeDebuggerAndFinish(gPanel))
|
||||
@ -68,34 +66,23 @@ function testSetBreakpoint() {
|
||||
ok(!aResponse.error,
|
||||
"Should be able to set a breakpoint in a js file.");
|
||||
|
||||
deferred.resolve();
|
||||
});
|
||||
gDebugger.gClient.addOneTimeListener("resumed", () => {
|
||||
waitForCaretAndScopes(gPanel, 7).then(() => {
|
||||
// Make sure that we have JavaScript stack frames.
|
||||
is(gFrames.itemCount, 1,
|
||||
"Should have only one frame.");
|
||||
is(gFrames.getItemAtIndex(0).attachment.url.indexOf(".coffee"), -1,
|
||||
"First frame should not be a coffee source frame.");
|
||||
isnot(gFrames.getItemAtIndex(0).attachment.url.indexOf(".js"), -1,
|
||||
"First frame should be a JS frame.");
|
||||
|
||||
return deferred.promise;
|
||||
}
|
||||
deferred.resolve();
|
||||
});
|
||||
|
||||
function testHitBreakpoint() {
|
||||
let deferred = promise.defer();
|
||||
|
||||
gDebugger.gThreadClient.resume(aResponse => {
|
||||
ok(!aResponse.error, "Shouldn't get an error resuming.");
|
||||
is(aResponse.type, "resumed", "Type should be 'resumed'.");
|
||||
|
||||
waitForCaretAndScopes(gPanel, 7).then(() => {
|
||||
// Make sure that we have JavaScript stack frames.
|
||||
is(gFrames.itemCount, 1,
|
||||
"Should have only one frame.");
|
||||
is(gFrames.getItemAtIndex(0).attachment.url.indexOf(".coffee"), -1,
|
||||
"First frame should not be a coffee source frame.");
|
||||
isnot(gFrames.getItemAtIndex(0).attachment.url.indexOf(".js"), -1,
|
||||
"First frame should be a JS frame.");
|
||||
|
||||
deferred.resolve();
|
||||
// This will cause the breakpoint to be hit, and put us back in the
|
||||
// paused state.
|
||||
gDebuggee.binary_search([0, 2, 3, 5, 7, 10], 5);
|
||||
});
|
||||
|
||||
// This will cause the breakpoint to be hit, and put us back in the
|
||||
// paused state.
|
||||
gDebuggee.binary_search([0, 2, 3, 5, 7, 10], 5);
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
@ -148,7 +135,6 @@ function testResume() {
|
||||
}
|
||||
|
||||
registerCleanupFunction(function() {
|
||||
gTab = null;
|
||||
gDebuggee = null;
|
||||
gPanel = null;
|
||||
gDebugger = null;
|
||||
|
@ -8,12 +8,11 @@
|
||||
const TAB_URL = EXAMPLE_URL + "doc_minified.html";
|
||||
const JS_URL = EXAMPLE_URL + "code_math.js";
|
||||
|
||||
let gTab, gDebuggee, gPanel, gDebugger;
|
||||
let gDebuggee, gPanel, gDebugger;
|
||||
let gEditor, gSources, gFrames;
|
||||
|
||||
function test() {
|
||||
initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => {
|
||||
gTab = aTab;
|
||||
gDebuggee = aDebuggee;
|
||||
gPanel = aPanel;
|
||||
gDebugger = gPanel.panelWin;
|
||||
@ -24,7 +23,6 @@ function test() {
|
||||
waitForSourceShown(gPanel, JS_URL)
|
||||
.then(checkInitialSource)
|
||||
.then(testSetBreakpoint)
|
||||
.then(testHitBreakpoint)
|
||||
.then(() => resumeDebuggerThenCloseAndFinish(gPanel))
|
||||
.then(null, aError => {
|
||||
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
|
||||
@ -45,50 +43,35 @@ function checkInitialSource() {
|
||||
function testSetBreakpoint() {
|
||||
let deferred = promise.defer();
|
||||
|
||||
gDebugger.gThreadClient.interrupt(aResponse => {
|
||||
gDebugger.gThreadClient.setBreakpoint({ url: JS_URL, line: 30, column: 21 }, aResponse => {
|
||||
ok(!aResponse.error,
|
||||
"Should be able to set a breakpoint in a js file.");
|
||||
ok(!aResponse.actualLocation,
|
||||
"Should be able to set a breakpoint on line 30 and column 10.");
|
||||
gDebugger.gThreadClient.setBreakpoint({ url: JS_URL, line: 30, column: 21 }, aResponse => {
|
||||
ok(!aResponse.error,
|
||||
"Should be able to set a breakpoint in a js file.");
|
||||
ok(!aResponse.actualLocation,
|
||||
"Should be able to set a breakpoint on line 30 and column 10.");
|
||||
|
||||
deferred.resolve();
|
||||
gDebugger.gClient.addOneTimeListener("resumed", () => {
|
||||
waitForCaretAndScopes(gPanel, 30).then(() => {
|
||||
// Make sure that we have the right stack frames.
|
||||
is(gFrames.itemCount, 9,
|
||||
"Should have nine frames.");
|
||||
is(gFrames.getItemAtIndex(0).attachment.url.indexOf(".min.js"), -1,
|
||||
"First frame should not be a minified JS frame.");
|
||||
isnot(gFrames.getItemAtIndex(0).attachment.url.indexOf(".js"), -1,
|
||||
"First frame should be a JS frame.");
|
||||
|
||||
deferred.resolve();
|
||||
});
|
||||
|
||||
// This will cause the breakpoint to be hit, and put us back in the
|
||||
// paused state.
|
||||
gDebuggee.arithmetic();
|
||||
});
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
function testHitBreakpoint() {
|
||||
let deferred = promise.defer();
|
||||
|
||||
gDebugger.gThreadClient.resume(aResponse => {
|
||||
ok(!aResponse.error, "Shouldn't get an error resuming.");
|
||||
is(aResponse.type, "resumed", "Type should be 'resumed'.");
|
||||
|
||||
waitForCaretAndScopes(gPanel, 30).then(() => {
|
||||
// Make sure that we have the right stack frames.
|
||||
is(gFrames.itemCount, 9,
|
||||
"Should have nine frames.");
|
||||
is(gFrames.getItemAtIndex(0).attachment.url.indexOf(".min.js"), -1,
|
||||
"First frame should not be a minified JS frame.");
|
||||
isnot(gFrames.getItemAtIndex(0).attachment.url.indexOf(".js"), -1,
|
||||
"First frame should be a JS frame.");
|
||||
|
||||
deferred.resolve();
|
||||
});
|
||||
|
||||
// This will cause the breakpoint to be hit, and put us back in the
|
||||
// paused state.
|
||||
gDebuggee.arithmetic();
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
|
||||
registerCleanupFunction(function() {
|
||||
gTab = null;
|
||||
gDebuggee = null;
|
||||
gPanel = null;
|
||||
gDebugger = null;
|
||||
|
@ -101,7 +101,7 @@ function testSetBreakpoint() {
|
||||
|
||||
function reloadPage() {
|
||||
let loaded = waitForSourceAndCaret(gPanel, ".js", 3);
|
||||
gDebugger.gClient.activeTab.reload();
|
||||
gDebugger.DebuggerController._target.activeTab.reload();
|
||||
return loaded.then(() => ok(true, "Page was reloaded and execution resumed."));
|
||||
}
|
||||
|
||||
|
@ -410,7 +410,7 @@ function ensureThreadClientState(aPanel, aState) {
|
||||
|
||||
function navigateActiveTabTo(aPanel, aUrl, aWaitForEventName, aEventRepeat) {
|
||||
let finished = waitForDebuggerEvents(aPanel, aWaitForEventName, aEventRepeat);
|
||||
let activeTab = aPanel.panelWin.gClient.activeTab;
|
||||
let activeTab = aPanel.panelWin.DebuggerController._target.activeTab;
|
||||
aUrl ? activeTab.navigateTo(aUrl) : activeTab.reload();
|
||||
return finished;
|
||||
}
|
||||
|
@ -194,17 +194,16 @@ FontInspector.prototype = {
|
||||
!this.inspector.selection.isElementNode()) {
|
||||
return;
|
||||
}
|
||||
let node = this.inspector.selection.nodeFront;
|
||||
let contentDocument = node.ownerDocument;
|
||||
let root = contentDocument.documentElement;
|
||||
if (contentDocument.body) {
|
||||
root = contentDocument.body;
|
||||
}
|
||||
this.inspector.selection.setNode(root, "fontinspector");
|
||||
|
||||
// Select the body node to show all fonts
|
||||
let walker = this.inspector.walker;
|
||||
|
||||
walker.getRootNode().then(root => walker.querySelector(root, "body")).then(body => {
|
||||
this.inspector.selection.setNodeFront(body, "fontinspector");
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
window.setPanel = function(panel) {
|
||||
window.fontInspector = new FontInspector(panel, window);
|
||||
}
|
||||
|
@ -12,8 +12,8 @@ function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
let doc;
|
||||
let node;
|
||||
let view;
|
||||
let viewDoc;
|
||||
let inspector;
|
||||
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
@ -43,25 +43,23 @@ function test() {
|
||||
}
|
||||
|
||||
function openFontInspector(aInspector) {
|
||||
inspector = aInspector;
|
||||
|
||||
info("Inspector open");
|
||||
inspector = aInspector;
|
||||
|
||||
inspector.selection.setNode(doc.body);
|
||||
inspector.sidebar.select("fontinspector");
|
||||
inspector.sidebar.once("fontinspector-ready", viewReady);
|
||||
inspector.sidebar.once("fontinspector-ready", testBodyFonts);
|
||||
}
|
||||
|
||||
function viewReady() {
|
||||
function testBodyFonts() {
|
||||
info("Font Inspector ready");
|
||||
|
||||
view = inspector.sidebar.getWindowForTab("fontinspector");
|
||||
viewDoc = view.document;
|
||||
|
||||
ok(!!view.fontInspector, "Font inspector document is alive.");
|
||||
|
||||
let d = view.document;
|
||||
|
||||
let s = d.querySelectorAll("#all-fonts > section");
|
||||
let s = viewDoc.querySelectorAll("#all-fonts > section");
|
||||
is(s.length, 2, "Found 2 fonts");
|
||||
|
||||
is(s[0].querySelector(".font-name").textContent,
|
||||
@ -76,7 +74,6 @@ function test() {
|
||||
is(s[0].querySelector(".font-css-name").textContent,
|
||||
"bar", "font 0: right css name");
|
||||
|
||||
|
||||
let font1Name = s[1].querySelector(".font-name").textContent;
|
||||
let font1CssName = s[1].querySelector(".font-css-name").textContent;
|
||||
|
||||
@ -89,14 +86,40 @@ function test() {
|
||||
ok((font1CssName == "Arial") || (font1CssName == "Liberation Sans"),
|
||||
"Arial", "font 1: right css name");
|
||||
|
||||
executeSoon(function() {
|
||||
gDevTools.once("toolbox-destroyed", finishUp);
|
||||
inspector._toolbox.destroy();
|
||||
testDivFonts();
|
||||
}
|
||||
|
||||
function testDivFonts() {
|
||||
inspector.selection.setNode(doc.querySelector("div"));
|
||||
inspector.once("inspector-updated", () => {
|
||||
let s = viewDoc.querySelectorAll("#all-fonts > section");
|
||||
is(s.length, 1, "Found 1 font on DIV");
|
||||
is(s[0].querySelector(".font-name").textContent, "DeLarge Bold",
|
||||
"The DIV font has the right name");
|
||||
|
||||
testShowAllFonts();
|
||||
});
|
||||
}
|
||||
|
||||
function testShowAllFonts() {
|
||||
viewDoc.querySelector("#showall").click();
|
||||
inspector.once("inspector-updated", () => {
|
||||
is(inspector.selection.node, doc.body, "Show all fonts selected the body node");
|
||||
let s = viewDoc.querySelectorAll("#all-fonts > section");
|
||||
is(s.length, 2, "And font-inspector still shows 2 fonts for body");
|
||||
|
||||
finishUp();
|
||||
});
|
||||
}
|
||||
|
||||
function finishUp() {
|
||||
gBrowser.removeCurrentTab();
|
||||
finish();
|
||||
executeSoon(function() {
|
||||
gDevTools.once("toolbox-destroyed", () => {
|
||||
doc = view = viewDoc = inspector = null;
|
||||
gBrowser.removeCurrentTab();
|
||||
finish();
|
||||
});
|
||||
inspector._toolbox.destroy();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -284,6 +284,7 @@ TabTarget.prototype = {
|
||||
this._remote.reject("Unable to attach to the tab");
|
||||
return;
|
||||
}
|
||||
this.activeTab = aTabClient;
|
||||
this.threadActor = aResponse.threadActor;
|
||||
this._remote.resolve(null);
|
||||
});
|
||||
@ -444,11 +445,14 @@ TabTarget.prototype = {
|
||||
this._teardownListeners();
|
||||
}
|
||||
|
||||
let cleanupAndResolve = () => {
|
||||
this._cleanup();
|
||||
this._destroyer.resolve(null);
|
||||
};
|
||||
// If this target was not remoted, the promise will be resolved before the
|
||||
// function returns.
|
||||
if (this._tab && !this._client) {
|
||||
this._cleanup();
|
||||
this._destroyer.resolve(null);
|
||||
cleanupAndResolve();
|
||||
} else if (this._client) {
|
||||
// If, on the other hand, this target was remoted, the promise will be
|
||||
// resolved after the remote connection is closed.
|
||||
@ -457,15 +461,15 @@ TabTarget.prototype = {
|
||||
if (this.isLocalTab) {
|
||||
// We started with a local tab and created the client ourselves, so we
|
||||
// should close it.
|
||||
this._client.close(() => {
|
||||
this._cleanup();
|
||||
this._destroyer.resolve(null);
|
||||
});
|
||||
this._client.close(cleanupAndResolve);
|
||||
} else {
|
||||
// The client was handed to us, so we are not responsible for closing
|
||||
// it.
|
||||
this._cleanup();
|
||||
this._destroyer.resolve(null);
|
||||
// it. We just need to detach from the tab, if already attached.
|
||||
if (this.activeTab) {
|
||||
this.activeTab.detach(cleanupAndResolve);
|
||||
} else {
|
||||
cleanupAndResolve();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -481,6 +485,7 @@ TabTarget.prototype = {
|
||||
} else {
|
||||
promiseTargets.delete(this._form);
|
||||
}
|
||||
this.activeTab = null;
|
||||
this._client = null;
|
||||
this._tab = null;
|
||||
this._form = null;
|
||||
|
@ -212,7 +212,7 @@ OptionsPanel.prototype = {
|
||||
}.bind(menulist));
|
||||
}
|
||||
|
||||
this.target.client.attachTab(this.target.client.activeTab._actor, (response) => {
|
||||
this.target.client.attachTab(this.target.activeTab._actor, (response) => {
|
||||
this._origJavascriptEnabled = response.javascriptEnabled;
|
||||
this._origCacheEnabled = response.cacheEnabled;
|
||||
|
||||
@ -248,7 +248,7 @@ OptionsPanel.prototype = {
|
||||
"javascriptEnabled": !checked
|
||||
};
|
||||
|
||||
this.target.client.reconfigureTab(options);
|
||||
this.target.activeTab.reconfigure(options);
|
||||
},
|
||||
|
||||
/**
|
||||
@ -264,7 +264,7 @@ OptionsPanel.prototype = {
|
||||
"cacheEnabled": !checked
|
||||
};
|
||||
|
||||
this.target.client.reconfigureTab(options);
|
||||
this.target.activeTab.reconfigure(options);
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
@ -291,7 +291,7 @@ OptionsPanel.prototype = {
|
||||
"cacheEnabled": this._origCacheEnabled,
|
||||
"javascriptEnabled": this._origJavascriptEnabled
|
||||
};
|
||||
this.target.client.reconfigureTab(options, () => {
|
||||
this.target.activeTab.reconfigure(options, () => {
|
||||
this.toolbox = null;
|
||||
deferred.resolve();
|
||||
}, true);
|
||||
|
@ -1217,7 +1217,7 @@ Toolbox.prototype = {
|
||||
outstanding.push(panel.destroy());
|
||||
} catch (e) {
|
||||
// We don't want to stop here if any panel fail to close.
|
||||
console.error(e);
|
||||
console.error("Panel " + id + ":", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -982,6 +982,7 @@ var Scratchpad = {
|
||||
|
||||
this.editor.setText(content);
|
||||
this.editor.clearHistory();
|
||||
this.dirty = false;
|
||||
document.getElementById("sp-cmd-revert").setAttribute("disabled", true);
|
||||
}
|
||||
else if (!aSilentError) {
|
||||
|
@ -53,6 +53,9 @@ function fileImported(aStatus, aFileContent)
|
||||
is(gScratchpad.getText(), gFileContent,
|
||||
"the editor content is correct");
|
||||
|
||||
is(gScratchpad.dirty, false,
|
||||
"the editor marks imported file as saved");
|
||||
|
||||
// Save the file after changes.
|
||||
gFileContent += "// omg, saved!";
|
||||
gScratchpad.editor.setText(gFileContent);
|
||||
|
@ -229,12 +229,12 @@ function navigateInHistory(aTarget, aDirection, aWaitForTargetEvent = "navigate"
|
||||
}
|
||||
|
||||
function navigate(aTarget, aUrl, aWaitForTargetEvent = "navigate") {
|
||||
executeSoon(() => aTarget.client.activeTab.navigateTo(aUrl));
|
||||
executeSoon(() => aTarget.activeTab.navigateTo(aUrl));
|
||||
return once(aTarget, aWaitForTargetEvent);
|
||||
}
|
||||
|
||||
function reload(aTarget, aWaitForTargetEvent = "navigate") {
|
||||
executeSoon(() => aTarget.client.activeTab.reload());
|
||||
executeSoon(() => aTarget.activeTab.reload());
|
||||
return once(aTarget, aWaitForTargetEvent);
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@ const Ci = Components.interfaces;
|
||||
const Cu = Components.utils;
|
||||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
const { DevToolsUtils } = Cu.import("resource://gre/modules/devtools/DevToolsUtils.jsm", {});
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this,
|
||||
"Reflect", "resource://gre/modules/reflect.jsm");
|
||||
@ -65,7 +66,7 @@ Parser.prototype = {
|
||||
syntaxTrees.push(new SyntaxTree(nodes, aUrl, length));
|
||||
} catch (e) {
|
||||
this.errors.push(e);
|
||||
log(aUrl, e);
|
||||
DevToolsUtils.reportException(aUrl, e);
|
||||
}
|
||||
}
|
||||
// Generate the AST nodes for each script.
|
||||
@ -79,7 +80,7 @@ Parser.prototype = {
|
||||
syntaxTrees.push(new SyntaxTree(nodes, aUrl, length, offset));
|
||||
} catch (e) {
|
||||
this.errors.push(e);
|
||||
log(aUrl, e);
|
||||
DevToolsUtils.reportException(aUrl, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -225,7 +226,7 @@ SyntaxTreesPool.prototype = {
|
||||
// Can't guarantee that the tree traversal logic is forever perfect :)
|
||||
// Language features may be added, in which case the recursive methods
|
||||
// need to be updated. If an exception is thrown here, file a bug.
|
||||
log("syntax tree", e);
|
||||
DevToolsUtils.reportException("syntax tree", e);
|
||||
}
|
||||
}
|
||||
this._cache.set(requestId, results);
|
||||
@ -2341,26 +2342,4 @@ let SyntaxTreeVisitor = {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Logs a warning.
|
||||
*
|
||||
* @param string aStr
|
||||
* The message to be displayed.
|
||||
* @param Exception aEx
|
||||
* The thrown exception.
|
||||
*/
|
||||
function log(aStr, aEx) {
|
||||
let msg = "Warning: " + aStr + ", " + aEx.message;
|
||||
|
||||
if ("lineNumber" in aEx && "columnNumber" in aEx) {
|
||||
msg += ", line: " + aEx.lineNumber + ", column: " + aEx.columnNumber;
|
||||
}
|
||||
if ("stack" in aEx) {
|
||||
msg += "\n" + aEx.stack;
|
||||
}
|
||||
|
||||
Cu.reportError(msg);
|
||||
dump(msg + "\n");
|
||||
};
|
||||
|
||||
XPCOMUtils.defineLazyGetter(Parser, "reflectionAPI", () => Reflect);
|
||||
|
@ -167,7 +167,9 @@ BreadcrumbsWidget.prototype = {
|
||||
// Repeated calls to ensureElementIsVisible would interfere with each other
|
||||
// and may sometimes result in incorrect scroll positions.
|
||||
setNamedTimeout("breadcrumb-select", ENSURE_SELECTION_VISIBLE_DELAY, () => {
|
||||
this._list.ensureElementIsVisible(aElement);
|
||||
if (this._list.ensureElementIsVisible) {
|
||||
this._list.ensureElementIsVisible(aElement);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -510,8 +510,6 @@
|
||||
#endif
|
||||
@BINPATH@/components/servicesComponents.manifest
|
||||
@BINPATH@/components/cryptoComponents.manifest
|
||||
@BINPATH@/components/TelemetryPing.js
|
||||
@BINPATH@/components/TelemetryPing.manifest
|
||||
@BINPATH@/components/TelemetryStartup.js
|
||||
@BINPATH@/components/TelemetryStartup.manifest
|
||||
@BINPATH@/components/messageWakeupService.js
|
||||
|
@ -129,6 +129,7 @@ These should match what Safari and other Apple applications use on OS X Lion. --
|
||||
<!ENTITY shareSelectCmd.accesskey "s">
|
||||
<!ENTITY shareVideoCmd.label "Share This Video">
|
||||
<!ENTITY shareVideoCmd.accesskey "s">
|
||||
<!ENTITY feedsMenu.label "Subscribe">
|
||||
<!ENTITY subscribeToPageMenupopup.label "Subscribe to This Page">
|
||||
<!ENTITY subscribeToPageMenuitem.label "Subscribe to This Page…">
|
||||
<!ENTITY addCurPagesCmd.label "Bookmark All Tabs…">
|
||||
|
@ -477,6 +477,10 @@ getUserMedia.denyRequest.accesskey = D
|
||||
getUserMedia.sharingCamera.message2 = You are currently sharing your camera with this page.
|
||||
getUserMedia.sharingMicrophone.message2 = You are currently sharing your microphone with this page.
|
||||
getUserMedia.sharingCameraAndMicrophone.message2 = You are currently sharing your camera and microphone with this page.
|
||||
getUserMedia.continueSharing.label = Continue Sharing
|
||||
getUserMedia.continueSharing.accesskey = C
|
||||
getUserMedia.stopSharing.label = Stop Sharing
|
||||
getUserMedia.stopSharing.accesskey = S
|
||||
|
||||
# Mixed Content Blocker Doorhanger Notification
|
||||
# LOCALIZATION NOTE - %S is brandShortName
|
||||
|
@ -161,11 +161,6 @@ var BrowserUI = {
|
||||
Util.dumpLn("Exception in delay load module:", ex.message);
|
||||
}
|
||||
|
||||
if (WindowsPrefSync) {
|
||||
// Pulls in Desktop controlled prefs and pushes out Metro controlled prefs
|
||||
WindowsPrefSync.init();
|
||||
}
|
||||
|
||||
// check for left over crash reports and submit them if found.
|
||||
BrowserUI.startupCrashCheck();
|
||||
|
||||
|
@ -185,8 +185,7 @@ var Browser = {
|
||||
// Should we restore the previous session (crash or some other event)
|
||||
let ss = Cc["@mozilla.org/browser/sessionstore;1"]
|
||||
.getService(Ci.nsISessionStore);
|
||||
let shouldRestore = ss.shouldRestore()
|
||||
|| (3 == Services.prefs.getIntPref("browser.startup.page"));
|
||||
let shouldRestore = ss.shouldRestore();
|
||||
if (shouldRestore) {
|
||||
let bringFront = false;
|
||||
// First open any commandline URLs, except the homepage
|
||||
|
@ -643,9 +643,6 @@ Desktop browser's sync prefs.
|
||||
#endif
|
||||
|
||||
<flyoutpanel id="prefs-flyoutpanel" class="flyout-narrow" headertext="&optionsHeader.title;">
|
||||
<settings id="prefs-charencoding" label="&optionsHeader.char.title;">
|
||||
<setting pref="browser.menu.showCharacterEncoding" title="&optionsHeader.char.options.label;" type="bool"/>
|
||||
</settings>
|
||||
<settings id="prefs-privdata" label="&clearPrivateData.title;">
|
||||
<description>&clearPrivateData.label;</description>
|
||||
|
||||
|
@ -165,6 +165,13 @@ var ContextMenuHandler = {
|
||||
} else {
|
||||
Util.dumpLn("error: target element does not support nsIDOMNSEditableElement");
|
||||
}
|
||||
} else if (Util.isEditableContent(this._target)) {
|
||||
try {
|
||||
this._target.ownerDocument.execCommand("copy", false);
|
||||
} catch (ex) {
|
||||
dump("ContextMenuHandler: exception copying from contentEditable: " +
|
||||
ex.message + "\n");
|
||||
}
|
||||
} else {
|
||||
let selectionText = this._previousState.string;
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
const {classes: Cc, interfaces: Ci, manager: Cm, utils: Cu} = Components;
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
const PRIVATE_PREF_PREFIX = "capability."; // Tag to prevent exposing private preferences
|
||||
const INITIAL_PAGE_DELAY = 500; // Initial pause on program start for scroll alignment
|
||||
const PREFS_BUFFER_MAX = 100; // Max prefs buffer size for getPrefsBuffer()
|
||||
const PAGE_SCROLL_TRIGGER = 200; // Triggers additional getPrefsBuffer() on user scroll-to-bottom
|
||||
@ -86,12 +85,6 @@ var NewPrefDialog = {
|
||||
return;
|
||||
}
|
||||
|
||||
// Prevent addition of new "private" preferences
|
||||
if (aPrefName.startsWith(PRIVATE_PREF_PREFIX)) {
|
||||
this._positiveButton.textContent = gStringBundle.GetStringFromName("newPref.privateButton");
|
||||
return;
|
||||
}
|
||||
|
||||
// If item already in list, it's being changed, else added
|
||||
let item = document.querySelector(".pref-item[name=" + aPrefName.quote() + "]");
|
||||
if (item) {
|
||||
@ -206,10 +199,7 @@ var AboutConfig = {
|
||||
this._prefsContainer = document.getElementById("prefs-container");
|
||||
this._loadingContainer = document.getElementById("loading-container");
|
||||
|
||||
let list = Services.prefs.getChildList("", {}).filter(function(aElement) {
|
||||
// Prevent display of "private" preferences
|
||||
return !aElement.startsWith(PRIVATE_PREF_PREFIX);
|
||||
});
|
||||
let list = Services.prefs.getChildList("");
|
||||
this._list = list.sort().map( function AC_getMapPref(aPref) {
|
||||
return new Pref(aPref);
|
||||
}, this);
|
||||
@ -461,8 +451,8 @@ var AboutConfig = {
|
||||
observe: function AC_observe(aSubject, aTopic, aPrefName) {
|
||||
let pref = new Pref(aPrefName);
|
||||
|
||||
// Ignore uninteresting preference changes, and external changes to "private" preferences
|
||||
if ((aTopic != "nsPref:changed") || pref.name.startsWith(PRIVATE_PREF_PREFIX)) {
|
||||
// Ignore uninteresting changes, and avoid "private" preferences
|
||||
if (aTopic != "nsPref:changed") {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -744,7 +744,7 @@ gTests.push({
|
||||
// Case #2: Document isn't in design mode and text is selected.
|
||||
tabWindow.getSelection().selectAllChildren(testSpan);
|
||||
|
||||
let promise = waitForEvent(tabWindow.document, "popupshown");
|
||||
let promise = waitForEvent(document, "popupshown");
|
||||
sendContextMenuClickToSelection(tabWindow);
|
||||
yield promise;
|
||||
|
||||
@ -758,7 +758,7 @@ gTests.push({
|
||||
tabWindow.document.designMode = "on";
|
||||
tabWindow.getSelection().removeAllRanges();
|
||||
|
||||
promise = waitForEvent(tabWindow.document, "popupshown");
|
||||
promise = waitForEvent(document, "popupshown");
|
||||
sendContextMenuClickToElement(tabWindow, testSpan);
|
||||
yield promise;
|
||||
|
||||
@ -771,7 +771,7 @@ gTests.push({
|
||||
// Case #4: Document is in design mode and text is selected.
|
||||
tabWindow.getSelection().selectAllChildren(testSpan);
|
||||
|
||||
promise = waitForEvent(tabWindow.document, "popupshown");
|
||||
promise = waitForEvent(document, "popupshown");
|
||||
sendContextMenuClickToSelection(tabWindow);
|
||||
yield promise;
|
||||
|
||||
@ -787,6 +787,93 @@ gTests.push({
|
||||
}
|
||||
});
|
||||
|
||||
gTests.push({
|
||||
desc: "Bug 961702 - 'Copy' context menu action does not copy rich content " +
|
||||
"while document in design mode (or inside container that allows to " +
|
||||
"edit its content)",
|
||||
run: function test() {
|
||||
info(chromeRoot + "browser_context_menu_tests_05.html");
|
||||
yield addTab(chromeRoot + "browser_context_menu_tests_05.html");
|
||||
|
||||
purgeEventQueue();
|
||||
emptyClipboard();
|
||||
ContextUI.dismiss();
|
||||
|
||||
yield waitForCondition(() => !ContextUI.navbarVisible);
|
||||
|
||||
let tabWindow = Browser.selectedTab.browser.contentWindow;
|
||||
let testDiv = tabWindow.document.getElementById("div1");
|
||||
|
||||
// Case #1: Document is in design mode.
|
||||
tabWindow.document.designMode = "on";
|
||||
|
||||
let promise = waitForEvent(document, "popupshown");
|
||||
sendContextMenuClickToElement(tabWindow, testDiv);
|
||||
yield promise;
|
||||
|
||||
let selectAllMenuItem = document.getElementById("context-select-all");
|
||||
promise = waitForEvent(document, "popuphidden");
|
||||
sendNativeTap(selectAllMenuItem);
|
||||
yield promise;
|
||||
|
||||
promise = waitForEvent(document, "popupshown");
|
||||
sendContextMenuClickToSelection(tabWindow);
|
||||
yield promise;
|
||||
|
||||
let copyMenuItem = document.getElementById("context-copy");
|
||||
promise = waitForEvent(document, "popuphidden");
|
||||
sendNativeTap(copyMenuItem);
|
||||
yield promise;
|
||||
|
||||
// The wait is needed to give time to populate the clipboard.
|
||||
let clipboardContent = "";
|
||||
let contentToCopy = tabWindow.document.body.innerHTML;
|
||||
yield waitForCondition(function () {
|
||||
clipboardContent = SpecialPowers.getClipboardData("text/html");
|
||||
return clipboardContent == contentToCopy;
|
||||
});
|
||||
ok(clipboardContent == contentToCopy, "Rich content copied.");
|
||||
|
||||
// Case #2: Container with editable content.
|
||||
emptyClipboard();
|
||||
tabWindow.document.designMode = "off";
|
||||
tabWindow.getSelection().removeAllRanges();
|
||||
|
||||
promise = waitForEvent(tabWindow.document.body, "focus");
|
||||
sendNativeTap(testDiv);
|
||||
yield promise;
|
||||
|
||||
promise = waitForEvent(document, "popupshown");
|
||||
sendContextMenuClickToElement(tabWindow, testDiv);
|
||||
yield promise;
|
||||
|
||||
selectAllMenuItem = document.getElementById("context-select-all");
|
||||
promise = waitForEvent(document, "popuphidden");
|
||||
sendNativeTap(selectAllMenuItem);
|
||||
yield promise;
|
||||
|
||||
promise = waitForEvent(document, "popupshown");
|
||||
sendContextMenuClickToSelection(tabWindow);
|
||||
yield promise;
|
||||
|
||||
copyMenuItem = document.getElementById("context-copy");
|
||||
promise = waitForEvent(document, "popuphidden");
|
||||
sendNativeTap(copyMenuItem);
|
||||
yield promise;
|
||||
|
||||
// The wait is needed to give time to populate the clipboard.
|
||||
clipboardContent = "";
|
||||
contentToCopy = testDiv.innerHTML;
|
||||
yield waitForCondition(function () {
|
||||
clipboardContent = SpecialPowers.getClipboardData("text/html");
|
||||
return clipboardContent == contentToCopy;
|
||||
});
|
||||
ok(clipboardContent == contentToCopy, "Rich content copied.");
|
||||
|
||||
Browser.closeTab(Browser.selectedTab, { forceClose: true });
|
||||
}
|
||||
});
|
||||
|
||||
function test() {
|
||||
setDevPixelEqualToPx();
|
||||
runTests();
|
||||
|
@ -0,0 +1,15 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
</style>
|
||||
</head>
|
||||
<body style="padding: 10px; margin: 10px;">
|
||||
<span id="text1">Test text</span>
|
||||
<div contenteditable="true" id="div1" style="border: 2px solid blue; width: 200px; height: 200px;">
|
||||
<table>
|
||||
<tr><td>Test content</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -4,6 +4,7 @@ support-files =
|
||||
browser_context_menu_tests_02.html
|
||||
browser_context_menu_tests_03.html
|
||||
browser_context_menu_tests_04.html
|
||||
browser_context_menu_tests_05.html
|
||||
browser_findbar.html
|
||||
browser_form_auto_complete.html
|
||||
browser_form_selects.html
|
||||
|
@ -121,7 +121,7 @@ HelperAppLauncherDialog.prototype = {
|
||||
className: "download-filename-text"
|
||||
},
|
||||
{
|
||||
text: aLauncher.suggestedFileName,
|
||||
text: aLauncher.downloadSize,
|
||||
className: "download-size-text"
|
||||
},
|
||||
{
|
||||
|
@ -9,6 +9,7 @@ const Cr = Components.results;
|
||||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/WindowsPrefSync.jsm");
|
||||
|
||||
#ifdef MOZ_CRASHREPORTER
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "CrashReporter",
|
||||
@ -199,6 +200,10 @@ SessionStore.prototype = {
|
||||
break;
|
||||
case "final-ui-startup":
|
||||
observerService.removeObserver(this, "final-ui-startup");
|
||||
if (WindowsPrefSync) {
|
||||
// Pulls in Desktop controlled prefs and pushes out Metro controlled prefs
|
||||
WindowsPrefSync.init();
|
||||
}
|
||||
this.init();
|
||||
break;
|
||||
case "domwindowopened":
|
||||
@ -340,9 +345,12 @@ SessionStore.prototype = {
|
||||
this._lastSaveTime = Date.now();
|
||||
|
||||
// Nothing to restore, notify observers things are complete
|
||||
if (!this._shouldRestore) {
|
||||
if (!this.shouldRestore()) {
|
||||
this._clearCache();
|
||||
Services.obs.notifyObservers(null, "sessionstore-windows-restored", "");
|
||||
|
||||
// If nothing is being restored, we only have our single Metro window.
|
||||
this._orderedWindows.push(aWindow.__SSID);
|
||||
}
|
||||
}
|
||||
|
||||
@ -726,7 +734,7 @@ SessionStore.prototype = {
|
||||
},
|
||||
|
||||
shouldRestore: function ss_shouldRestore() {
|
||||
return this._shouldRestore;
|
||||
return this._shouldRestore || (3 == Services.prefs.getIntPref("browser.startup.page"));
|
||||
},
|
||||
|
||||
restoreLastSession: function ss_restoreLastSession(aBringToFront) {
|
||||
|
@ -251,9 +251,26 @@ function showBrowserSpecificIndicator(aBrowser) {
|
||||
let stringBundle = chromeWin.gNavigatorBundle;
|
||||
|
||||
let message = stringBundle.getString("getUserMedia.sharing" + captureState + ".message2");
|
||||
let mainAction = null;
|
||||
let secondaryActions = null;
|
||||
|
||||
let windowId = aBrowser.contentWindow
|
||||
.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIDOMWindowUtils)
|
||||
.currentInnerWindowID;
|
||||
let mainAction = {
|
||||
label: stringBundle.getString("getUserMedia.continueSharing.label"),
|
||||
accessKey: stringBundle.getString("getUserMedia.continueSharing.accesskey"),
|
||||
callback: function () {},
|
||||
dismiss: true
|
||||
};
|
||||
let secondaryActions = [{
|
||||
label: stringBundle.getString("getUserMedia.stopSharing.label"),
|
||||
accessKey: stringBundle.getString("getUserMedia.stopSharing.accesskey"),
|
||||
callback: function () {
|
||||
Services.obs.notifyObservers(null, "getUserMedia:revoke", windowId);
|
||||
}
|
||||
}];
|
||||
let options = {
|
||||
hideNotNow: true,
|
||||
dismissed: true,
|
||||
eventCallback: function(aTopic) aTopic == "swapping"
|
||||
};
|
||||
|
@ -27,6 +27,7 @@ browser.jar:
|
||||
skin/classic/browser/customizableui/customizeMode-gridTexture.png (customizableui/customizeMode-gridTexture.png)
|
||||
skin/classic/browser/customizableui/customizeMode-separatorHorizontal.png (customizableui/customizeMode-separatorHorizontal.png)
|
||||
skin/classic/browser/customizableui/customizeMode-separatorVertical.png (customizableui/customizeMode-separatorVertical.png)
|
||||
skin/classic/browser/customizableui/customizeFavicon.ico (../shared/customizableui/customizeFavicon.ico)
|
||||
* skin/classic/browser/engineManager.css
|
||||
skin/classic/browser/fullscreen-darknoise.png
|
||||
skin/classic/browser/Geolocation-16.png
|
||||
|
@ -159,7 +159,7 @@ toolbarbutton.chevron:-moz-locale-dir(rtl) > .toolbarbutton-icon {
|
||||
|
||||
/* ----- BOOKMARK BUTTONS ----- */
|
||||
|
||||
toolbarbutton.bookmark-item,
|
||||
toolbarbutton.bookmark-item:not(.subviewbutton),
|
||||
#personal-bookmarks[cui-areatype="toolbar"] > #bookmarks-toolbar-placeholder {
|
||||
font-weight: bold;
|
||||
color: #222;
|
||||
@ -199,8 +199,8 @@ toolbarbutton.bookmark-item[open="true"] {
|
||||
background-color: rgba(0, 0, 0, .205);
|
||||
}
|
||||
|
||||
toolbarbutton.bookmark-item:hover,
|
||||
toolbarbutton.bookmark-item[open="true"] {
|
||||
+toolbarbutton.bookmark-item:hover:not(.subviewbutton),
|
||||
+toolbarbutton.bookmark-item[open="true"]:not(.subviewbutton) {
|
||||
color: #FFF !important;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, .4) !important;
|
||||
}
|
||||
|
@ -4,10 +4,6 @@
|
||||
|
||||
%include ../../shared/customizableui/panelUIOverlay.inc.css
|
||||
|
||||
.panel-subviews {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
@media (min-resolution: 2dppx) {
|
||||
#customization-palette toolbarbutton > .toolbarbutton-icon,
|
||||
#PanelUI-contents toolbarbutton > .toolbarbutton-icon {
|
||||
|
@ -27,6 +27,7 @@ browser.jar:
|
||||
skin/classic/browser/customizableui/customizeMode-gridTexture.png (customizableui/customizeMode-gridTexture.png)
|
||||
skin/classic/browser/customizableui/customizeMode-separatorHorizontal.png (customizableui/customizeMode-separatorHorizontal.png)
|
||||
skin/classic/browser/customizableui/customizeMode-separatorVertical.png (customizableui/customizeMode-separatorVertical.png)
|
||||
skin/classic/browser/customizableui/customizeFavicon.ico (../shared/customizableui/customizeFavicon.ico)
|
||||
* skin/classic/browser/engineManager.css (engineManager.css)
|
||||
skin/classic/browser/fullscreen-darknoise.png
|
||||
skin/classic/browser/Geolocation-16.png
|
||||
|
BIN
browser/themes/shared/customizableui/customizeFavicon.ico
Normal file
BIN
browser/themes/shared/customizableui/customizeFavicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
@ -5,24 +5,24 @@
|
||||
%filter substitution
|
||||
|
||||
%define menuPanelWidth 22.35em
|
||||
%define panelTextSize 1rem
|
||||
%define exitSubviewGutterWidth 38px
|
||||
%define buttonStateHover :not(:-moz-any([disabled],[checked="true"],[open],:active)):hover
|
||||
%define buttonStateActive :not([disabled]):-moz-any([open],[checked="true"],:hover:active)
|
||||
%define buttonStateHover :not(:-moz-any([disabled],[open],[checked="true"],[_moz-menuactive="true"],:active)):hover
|
||||
%define buttonStateActive :not([disabled]):-moz-any([open],[checked="true"],[_moz-menuactive="true"],:hover:active)
|
||||
|
||||
%include ../browser.inc
|
||||
|
||||
.panel-subviews {
|
||||
background-image: linear-gradient(to bottom, white 1px, rgba(255, 255, 255, 0) 15px);
|
||||
background-color: -moz-dialog;
|
||||
box-shadow: -1px 0px 0px rgba(0, 0, 0, 0.2), -1px 0px 2px rgba(0, 0, 0, 0.1), 1px 0px 0px rgba(255, 255, 255, 0.2) inset;
|
||||
padding: 4px;
|
||||
background-color: hsla(0,0%,100%,.97);
|
||||
background-clip: padding-box;
|
||||
border-right: 1px solid hsla(210,4%,10%,.2);
|
||||
border-left: 1px solid hsla(210,4%,10%,.2);
|
||||
box-shadow: 0 3px 5px hsla(210,4%,10%,.1),
|
||||
0 0 7px hsla(210,4%,10%,.1);
|
||||
color: #222426;
|
||||
-moz-margin-start: @exitSubviewGutterWidth@;
|
||||
}
|
||||
|
||||
.panel-subviews:-moz-locale-dir(rtl) {
|
||||
box-shadow: 1px 0px 0px rgba(0, 0, 0, 0.2), 1px 0px 2px rgba(0, 0, 0, 0.1), -1px 0px 0px rgba(255, 255, 255, 0.2) inset;
|
||||
}
|
||||
|
||||
.panel-viewstack[viewtype="main"] > .panel-subviews {
|
||||
transform: translateX(@menuPanelWidth@);
|
||||
}
|
||||
@ -35,6 +35,23 @@
|
||||
-moz-box-flex: 1;
|
||||
}
|
||||
|
||||
.panel-subview-header,
|
||||
.subviewbutton.panel-subview-footer {
|
||||
padding: 12px;
|
||||
background-color: hsla(210,4%,10%,.04);
|
||||
}
|
||||
|
||||
.panel-subview-header {
|
||||
margin: -4px -4px 4px;
|
||||
box-shadow: 0 -1px 0 hsla(210,4%,10%,.08) inset;
|
||||
color: #797c80;
|
||||
}
|
||||
|
||||
.subviewbutton.panel-subview-footer {
|
||||
margin: 4px -4px -4px;
|
||||
box-shadow: 0 1px 0 hsla(210,4%,10%,.08) inset;
|
||||
}
|
||||
|
||||
#PanelUI-mainView {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@ -67,16 +84,8 @@
|
||||
padding: .5em 0;
|
||||
}
|
||||
|
||||
toolbaritem[cui-areatype="menu-panel"][sdkstylewidget="true"]:not(.panel-wide-item) > .toolbarbutton-text,
|
||||
.panelUI-grid .panel-combined-button > .toolbarbutton-text,
|
||||
.widget-overflow-list .toolbarbutton-menubutton-button > .toolbarbutton-text,
|
||||
.widget-overflow-list .toolbarbutton-1 > .toolbarbutton-text {
|
||||
font-size: @panelTextSize@;
|
||||
}
|
||||
|
||||
.panelUI-grid .toolbarbutton-menubutton-button > .toolbarbutton-multiline-text,
|
||||
.panelUI-grid .toolbarbutton-1 > .toolbarbutton-multiline-text {
|
||||
font-size: @panelTextSize@;
|
||||
margin: 2px 0 0;
|
||||
text-align: center;
|
||||
-moz-hyphens: auto;
|
||||
@ -326,8 +335,9 @@ toolbarpaletteitem[place="palette"] > toolbaritem > toolbarbutton {
|
||||
display: none;
|
||||
}
|
||||
|
||||
panelview toolbarbutton,
|
||||
#widget-overflow-list > toolbarbutton,
|
||||
panelview .toolbarbutton-1,
|
||||
panelview .subviewbutton,
|
||||
.widget-overflow-list .toolbarbutton-1,
|
||||
.customizationmode-button,
|
||||
#edit-controls@inAnyPanel@ > toolbarbutton,
|
||||
#zoom-controls@inAnyPanel@ > toolbarbutton,
|
||||
@ -343,13 +353,43 @@ panelview toolbarbutton,
|
||||
transition-duration: 150ms;
|
||||
}
|
||||
|
||||
.PanelUI-subView .subviewbutton.panel-subview-footer {
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.PanelUI-subView .subviewbutton.panel-subview-footer > .toolbarbutton-text {
|
||||
-moz-padding-start: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.PanelUI-subView .subviewbutton:not(.panel-subview-footer) {
|
||||
margin: 2px 0;
|
||||
}
|
||||
|
||||
.PanelUI-subView .subviewbutton:not(.panel-subview-footer) > .toolbarbutton-text {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.PanelUI-subView .subviewbutton.bookmark-item {
|
||||
font-weight: normal;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.PanelUI-subView menuseparator,
|
||||
.PanelUI-subView toolbarseparator {
|
||||
-moz-margin-start: -5px;
|
||||
-moz-margin-end: -4px;
|
||||
}
|
||||
|
||||
panelview .toolbarbutton-1,
|
||||
#widget-overflow-list > toolbarbutton {
|
||||
.widget-overflow-list .toolbarbutton-1 {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
panelview toolbarbutton@buttonStateHover@,
|
||||
#widget-overflow-list > toolbarbutton@buttonStateHover@,
|
||||
panelview .toolbarbutton-1@buttonStateHover@,
|
||||
panelview .subviewbutton@buttonStateHover@,
|
||||
.widget-overflow-list .toolbarbutton-1@buttonStateHover@,
|
||||
.customizationmode-button,
|
||||
#edit-controls@inAnyPanel@ > toolbarbutton@buttonStateHover@,
|
||||
#zoom-controls@inAnyPanel@ > toolbarbutton@buttonStateHover@,
|
||||
@ -365,9 +405,10 @@ panelview toolbarbutton@buttonStateHover@,
|
||||
border-color: hsla(210,4%,10%,.1);
|
||||
}
|
||||
|
||||
panelview toolbarbutton@buttonStateActive@,
|
||||
panelview .toolbarbutton-1@buttonStateActive@,
|
||||
panelview .subviewbutton@buttonStateActive@,
|
||||
.customizationmode-button@buttonStateActive@,
|
||||
#widget-overflow-list > toolbarbutton@buttonStateActive@,
|
||||
.widget-overflow-list .toolbarbutton-1@buttonStateActive@,
|
||||
#edit-controls@inAnyPanel@ > toolbarbutton@buttonStateActive@,
|
||||
#zoom-controls@inAnyPanel@ > toolbarbutton@buttonStateActive@,
|
||||
#BMB_bookmarksPopup > menu@buttonStateActive@,
|
||||
|
@ -29,6 +29,7 @@ browser.jar:
|
||||
skin/classic/browser/customizableui/customizeMode-gridTexture.png (customizableui/customizeMode-gridTexture.png)
|
||||
skin/classic/browser/customizableui/customizeMode-separatorHorizontal.png (customizableui/customizeMode-separatorHorizontal.png)
|
||||
skin/classic/browser/customizableui/customizeMode-separatorVertical.png (customizableui/customizeMode-separatorVertical.png)
|
||||
skin/classic/browser/customizableui/customizeFavicon.ico (../shared/customizableui/customizeFavicon.ico)
|
||||
* skin/classic/browser/engineManager.css
|
||||
skin/classic/browser/fullscreen-darknoise.png
|
||||
skin/classic/browser/Geolocation-16.png
|
||||
|
@ -34,7 +34,7 @@ if test -d "$1"; then
|
||||
(cd "$1"; $PYTHON $_topsrcdir/build/subconfigure.py dump "$_CONFIG_SHELL")
|
||||
fi
|
||||
$2
|
||||
(cd "$1"; $PYTHON $_topsrcdir/build/subconfigure.py adjust)
|
||||
(cd "$1"; $PYTHON $_topsrcdir/build/subconfigure.py adjust $ac_sub_configure)
|
||||
])
|
||||
|
||||
define([AC_OUTPUT_SUBDIRS],
|
||||
|
@ -634,50 +634,8 @@ class Automation(object):
|
||||
return
|
||||
|
||||
self.haveDumpedScreen = True;
|
||||
automationutils.dumpScreen(utilityPath)
|
||||
|
||||
# Need to figure out what tool and whether it write to a file or stdout
|
||||
if self.UNIXISH:
|
||||
utility = [os.path.join(utilityPath, "screentopng")]
|
||||
imgoutput = 'stdout'
|
||||
elif self.IS_MAC:
|
||||
utility = ['/usr/sbin/screencapture', '-C', '-x', '-t', 'png']
|
||||
imgoutput = 'file'
|
||||
elif self.IS_WIN32:
|
||||
utility = [os.path.join(utilityPath, "screenshot.exe")]
|
||||
imgoutput = 'file'
|
||||
|
||||
# Run the capture correctly for the type of capture
|
||||
try:
|
||||
if imgoutput == 'file':
|
||||
tmpfd, imgfilename = tempfile.mkstemp(prefix='mozilla-test-fail_')
|
||||
os.close(tmpfd)
|
||||
dumper = self.Process(utility + [imgfilename])
|
||||
elif imgoutput == 'stdout':
|
||||
dumper = self.Process(utility, bufsize=-1,
|
||||
stdout=subprocess.PIPE, close_fds=True)
|
||||
except OSError, err:
|
||||
self.log.info("Failed to start %s for screenshot: %s",
|
||||
utility[0], err.strerror)
|
||||
return
|
||||
|
||||
# Check whether the capture utility ran successfully
|
||||
dumper_out, dumper_err = dumper.communicate()
|
||||
if dumper.returncode != 0:
|
||||
self.log.info("%s exited with code %d", utility, dumper.returncode)
|
||||
return
|
||||
|
||||
try:
|
||||
if imgoutput == 'stdout':
|
||||
image = dumper_out
|
||||
elif imgoutput == 'file':
|
||||
with open(imgfilename, 'rb') as imgfile:
|
||||
image = imgfile.read()
|
||||
except IOError, err:
|
||||
self.log.info("Failed to read image from %s", imgoutput)
|
||||
|
||||
import base64
|
||||
encoded = base64.b64encode(image)
|
||||
self.log.info("SCREENSHOT: data:image/png;base64,%s", encoded)
|
||||
|
||||
def killAndGetStack(self, processPID, utilityPath, debuggerInfo):
|
||||
"""Kill the process, preferrably in a way that gets us a stack trace.
|
||||
|
@ -484,58 +484,40 @@ def environment(xrePath, env=None, crashreporter=True, debugger=False, dmdPath=N
|
||||
|
||||
return env
|
||||
|
||||
|
||||
def dumpScreen(utilityPath):
|
||||
"""dumps the screen to the log file as a data URI"""
|
||||
"""dumps a screenshot of the entire screen to a directory specified by
|
||||
the MOZ_UPLOAD_DIR environment variable"""
|
||||
import mozfile
|
||||
|
||||
# Need to figure out what tool and whether it write to a file or stdout
|
||||
# Need to figure out which OS-dependent tool to use
|
||||
if mozinfo.isUnix:
|
||||
utility = [os.path.join(utilityPath, "screentopng")]
|
||||
imgoutput = 'stdout'
|
||||
elif mozinfo.isMac:
|
||||
utility = ['/usr/sbin/screencapture', '-C', '-x', '-t', 'png']
|
||||
imgoutput = 'file'
|
||||
elif mozinfo.isWin:
|
||||
utility = [os.path.join(utilityPath, "screenshot.exe")]
|
||||
imgoutput = 'file'
|
||||
else:
|
||||
log.warn("Unable to dump screen on platform '%s'", sys.platform)
|
||||
|
||||
# Run the capture correctly for the type of capture
|
||||
kwargs = {'stdout': subprocess.PIPE}
|
||||
if imgoutput == 'file':
|
||||
tmpfd, imgfilename = tempfile.mkstemp(prefix='mozilla-test-fail_')
|
||||
os.close(tmpfd)
|
||||
utility.append(imgfilename)
|
||||
elif imgoutput == 'stdout':
|
||||
kwargs.update(dict(bufsize=-1, close_fds=True))
|
||||
# Get dir where to write the screenshot file
|
||||
parent_dir = os.environ.get('MOZ_UPLOAD_DIR', None)
|
||||
if not parent_dir:
|
||||
log.info('Failed to retrieve MOZ_UPLOAD_DIR env var')
|
||||
return
|
||||
|
||||
# Run the capture
|
||||
try:
|
||||
dumper = subprocess.Popen(utility, **kwargs)
|
||||
with mozfile.NamedTemporaryFile(suffix='.png',
|
||||
prefix='mozilla-test-fail-screenshot_',
|
||||
dir=parent_dir,
|
||||
delete=False) as f:
|
||||
returncode = subprocess.call(utility + [f.name])
|
||||
except OSError, err:
|
||||
log.info("Failed to start %s for screenshot: %s",
|
||||
utility[0], err.strerror)
|
||||
return
|
||||
|
||||
# Check whether the capture utility ran successfully
|
||||
stdout, _ = dumper.communicate()
|
||||
returncode = dumper.poll()
|
||||
if returncode:
|
||||
if returncode != 0:
|
||||
log.info("%s exited with code %d", utility, returncode)
|
||||
return
|
||||
|
||||
try:
|
||||
if imgoutput == 'stdout':
|
||||
image = stdout
|
||||
elif imgoutput == 'file':
|
||||
with open(imgfilename, 'rb') as imgfile:
|
||||
image = imgfile.read()
|
||||
except IOError, err:
|
||||
log.info("Failed to read image from %s", imgoutput)
|
||||
|
||||
encoded = base64.b64encode(image)
|
||||
uri = "data:image/png;base64,%s" % encoded
|
||||
log.info("SCREENSHOT: %s", uri)
|
||||
return uri
|
||||
|
||||
class ShutdownLeaks(object):
|
||||
"""
|
||||
|
@ -59,6 +59,12 @@ bits
|
||||
|
||||
Optional.
|
||||
|
||||
buildapp
|
||||
The path to the XUL application being built.
|
||||
|
||||
For desktop Firefox, this is ``browser``. For Fennec, it's
|
||||
``mobile/android``. For B2G, it's ``b2g``.
|
||||
|
||||
crashreporter
|
||||
Whether the crash reporter is enabled for this build.
|
||||
|
||||
|
@ -18,6 +18,14 @@ class File(object):
|
||||
stat = os.stat(path)
|
||||
self._times = (stat.st_atime, stat.st_mtime)
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
return self._path
|
||||
|
||||
@property
|
||||
def mtime(self):
|
||||
return self._times[1]
|
||||
|
||||
def update_time(self):
|
||||
'''If the file hasn't changed since the instance was created,
|
||||
restore its old modification time.'''
|
||||
@ -97,7 +105,7 @@ def dump(dump_file, shell):
|
||||
pickle.dump(config_files, f)
|
||||
|
||||
|
||||
def adjust(dump_file):
|
||||
def adjust(dump_file, configure):
|
||||
if not os.path.exists(dump_file):
|
||||
return
|
||||
|
||||
@ -110,6 +118,11 @@ def adjust(dump_file):
|
||||
pass
|
||||
|
||||
for f in config_files:
|
||||
# Still touch config.status if configure is newer than its original
|
||||
# mtime.
|
||||
if configure and os.path.basename(f.path) == 'config.status' and \
|
||||
os.path.getmtime(configure) > f.mtime:
|
||||
continue
|
||||
f.update_time()
|
||||
|
||||
os.remove(dump_file)
|
||||
@ -121,4 +134,4 @@ if __name__ == '__main__':
|
||||
if sys.argv[1] == 'dump':
|
||||
dump(CONFIG_DUMP, sys.argv[2])
|
||||
elif sys.argv[1] == 'adjust':
|
||||
adjust(CONFIG_DUMP)
|
||||
adjust(CONFIG_DUMP, sys.argv[2] if len(sys.argv) > 2 else None)
|
||||
|
@ -2,7 +2,6 @@
|
||||
# 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/.
|
||||
|
||||
SUPPRESS_DEFAULT_RULES := 1
|
||||
STANDALONE_MAKEFILE := 1
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
@ -592,7 +592,6 @@ endif
|
||||
# of the tiers and because of libxul. Suppress the default rules in favor
|
||||
# of something else. Makefiles which use this var *must* provide a sensible
|
||||
# default rule before including rules.mk
|
||||
ifndef SUPPRESS_DEFAULT_RULES
|
||||
default all::
|
||||
$(MAKE) export
|
||||
ifdef MOZ_PSEUDO_DERECURSE
|
||||
@ -602,7 +601,6 @@ endif
|
||||
endif
|
||||
$(MAKE) libs
|
||||
$(MAKE) tools
|
||||
endif # SUPPRESS_DEFAULT_RULES
|
||||
|
||||
ifeq ($(findstring s,$(filter-out --%, $(MAKEFLAGS))),)
|
||||
ECHO := echo
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user