Merge m-c to s-c.

This commit is contained in:
Richard Newman 2014-01-24 11:59:00 -08:00
commit 8ead817faf
690 changed files with 12038 additions and 5861 deletions

View File

@ -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.)

View File

@ -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;

View File

@ -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) {

View File

@ -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();
});
};

View File

@ -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);
}
}

View File

@ -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>

View File

@ -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);

View File

@ -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();
});

View File

@ -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);
});

View File

@ -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");

View File

@ -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"/>

View File

@ -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 -->

View File

@ -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"/>

View File

@ -1,4 +1,4 @@
{
"revision": "806d5b997ec768914eaff1c46143c55de2612dbf",
"revision": "5116c92a2905f6646d7049ddd1e1ab68eeb278d9",
"repo_path": "/integration/gaia-central"
}

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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 -->

View File

@ -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"/>

View File

@ -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

View File

@ -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>

View File

@ -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");

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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>

View File

@ -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;
}

View File

@ -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");

View File

@ -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>

View File

@ -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"/>

View File

@ -409,6 +409,7 @@ const PanelUI = {
continue;
button.setAttribute(attrName, node.getAttribute(attrName));
}
button.setAttribute("class", "subviewbutton");
fragment.appendChild(button);
}
items.appendChild(fragment);

View File

@ -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);
}
},

View File

@ -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)

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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,

View File

@ -0,0 +1,3 @@
. "$topsrcdir/browser/config/mozconfigs/macosx-universal/nightly"
ac_add_options --disable-unified-compilation

View File

@ -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

View File

@ -0,0 +1,3 @@
. "$topsrcdir/browser/config/mozconfigs/macosx64/debug"
ac_add_options --disable-unified-compilation

View File

@ -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',

View File

@ -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

View File

@ -0,0 +1,3 @@
. "$topsrcdir/browser/config/mozconfigs/win32/debug"
ac_add_options --disable-unified-compilation

View File

@ -0,0 +1,3 @@
. "$topsrcdir/browser/config/mozconfigs/win32/nightly"
ac_add_options --disable-unified-compilation

View File

@ -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"

View File

@ -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

View File

@ -0,0 +1,3 @@
. "$topsrcdir/browser/config/mozconfigs/win64/debug"
ac_add_options --disable-unified-compilation

View File

@ -0,0 +1,3 @@
. "$topsrcdir/browser/config/mozconfigs/win64/nightly"
ac_add_options --disable-unified-compilation

View File

@ -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"

View File

@ -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);
}
});
},

View File

@ -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;
}
}
},
/**

View File

@ -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]

View File

@ -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;

View File

@ -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;

View File

@ -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) => {

View File

@ -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);
});
});
};

View File

@ -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;

View File

@ -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;

View File

@ -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."));
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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();
});
}
}

View File

@ -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;

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}
});
},

View File

@ -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

View File

@ -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…">

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -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>

View File

@ -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;

View File

@ -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;
}

View File

@ -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();

View File

@ -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>

View File

@ -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

View File

@ -121,7 +121,7 @@ HelperAppLauncherDialog.prototype = {
className: "download-filename-text"
},
{
text: aLauncher.suggestedFileName,
text: aLauncher.downloadSize,
className: "download-size-text"
},
{

View File

@ -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) {

View File

@ -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"
};

View File

@ -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

View File

@ -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;
}

View File

@ -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 {

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -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@,

View File

@ -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

View File

@ -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],

View File

@ -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.

View File

@ -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):
"""

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -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