This commit is contained in:
Phil Ringnalda 2015-08-08 19:43:11 -07:00
Родитель 2e258a5151 64e3f4c954
Коммит 1ee9c4343b
150 изменённых файлов: 1840 добавлений и 1696 удалений

Просмотреть файл

@ -15,9 +15,9 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>

Просмотреть файл

@ -15,9 +15,9 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>

Просмотреть файл

@ -19,8 +19,8 @@
<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="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="2d58f4b9206b50b8fda0d5036da6f0c62608db7c"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="d70e4bfdcb65e7514de0f9315b74aea1c811678d"/>

Просмотреть файл

@ -17,8 +17,8 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="735805df70bc64af1e5b709133afb76499a92ee1"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>

Просмотреть файл

@ -15,9 +15,9 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>

Просмотреть файл

@ -15,9 +15,9 @@
<project name="platform_build" path="build" remote="b2g" revision="05a36844c1046a1eb07d5b1325f85ed741f961ea">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>

Просмотреть файл

@ -19,8 +19,8 @@
<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="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="2d58f4b9206b50b8fda0d5036da6f0c62608db7c"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="d70e4bfdcb65e7514de0f9315b74aea1c811678d"/>

Просмотреть файл

@ -15,9 +15,9 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
@ -125,7 +125,7 @@
<!-- Flame specific things -->
<project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="1bb28abbc215f45220620af5cd60a8ac1be93722"/>
<project name="device/qcom/common" path="device/qcom/common" revision="2501e5940ba69ece7654ff85611c76ae5bda299c"/>
<project name="device-flame" path="device/t2m/flame" remote="b2g" revision="41d3e221039d1c4486fc13ff26793a7a39226423"/>
<project name="device-flame" path="device/t2m/flame" remote="b2g" revision="c4779d6da0f85894b1f78f0351b43f2949e8decd"/>
<project name="codeaurora_kernel_msm" path="kernel" remote="b2g" revision="47aac20dbffea5874cbbbdc6556558855c38dce4"/>
<project name="kernel_lk" path="bootable/bootloader/lk" remote="b2g" revision="fda40423ffa573dc6cafd3780515010cb2a086be"/>
<project name="platform_bootable_recovery" path="bootable/recovery" remote="b2g" revision="d5e53ed6f22fa06052351dc03510af9473af01ea"/>

Просмотреть файл

@ -1,9 +1,9 @@
{
"git": {
"git_revision": "0afa6429bf6a772289801600a84438cd7aa27b11",
"git_revision": "3e5271663e7ef26290c29a45d2e42c0d3c20fe04",
"remote": "https://git.mozilla.org/releases/gaia.git",
"branch": ""
},
"revision": "6bf26f38e5c3092166347c2988f0f95be74333b3",
"revision": "7051317f9ab92e5226b585127aa6b69f030bf759",
"repo_path": "integration/gaia-central"
}

Просмотреть файл

@ -17,8 +17,8 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="735805df70bc64af1e5b709133afb76499a92ee1"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>

Просмотреть файл

@ -15,9 +15,9 @@
<project name="platform_build" path="build" remote="b2g" revision="05a36844c1046a1eb07d5b1325f85ed741f961ea">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="0afa6429bf6a772289801600a84438cd7aa27b11"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3e5271663e7ef26290c29a45d2e42c0d3c20fe04"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4d9fbc08e87731447c19e96e13d8c7444baafcca"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="62cfa11ae7d77f6330de019a5aa79607e35be7d1"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>

Просмотреть файл

@ -7,6 +7,12 @@ Components.utils.import("resource://gre/modules/Services.jsm");
const PREF_EM_HOTFIX_ID = "extensions.hotfix.id";
let gMenuButton = null;
try {
gMenuButton = Services.wm.getMostRecentWindow("navigator:browser")
.document.getElementById("PanelUI-menu-button");
} catch (ex) { };
function init(aEvent)
{
if (aEvent.target != document)
@ -49,6 +55,17 @@ function init(aEvent)
document.getElementById("communityDesc").hidden = true;
}
if (/^42/.test(version)) {
document.getElementById("version").addEventListener("click", event => {
if (gMenuButton) {
gMenuButton.classList.add("thumburger");
if (event.shiftKey) {
gMenuButton = null;
}
}
});
}
#ifdef MOZ_UPDATER
gAppUpdater = new appUpdater();
@ -83,6 +100,9 @@ function onUnload(aEvent) {
// Safe to call even when there isn't a download in progress.
gAppUpdater.removeDownloadListener();
gAppUpdater = null;
if (gMenuButton) {
gMenuButton.classList.remove("thumburger");
}
}

Просмотреть файл

@ -66,6 +66,9 @@ header h1
margin-bottom: 23px;
color: rgb(138, 155, 168);
font-size: 19px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.description {

Просмотреть файл

@ -767,10 +767,6 @@ window[chromehidden~="toolbar"] toolbar:not(#nav-bar):not(#TabsToolbar):not(#pri
-moz-binding: url("chrome://browser/content/urlbarBindings.xml#identity-request-notification");
}
#bad-content-notification {
-moz-binding: url("chrome://browser/content/urlbarBindings.xml#bad-content-notification");
}
#click-to-play-plugins-notification {
-moz-binding: url("chrome://browser/content/urlbarBindings.xml#click-to-play-plugins-notification");
}
@ -1333,16 +1329,6 @@ toolbarpaletteitem[place="palette"][hidden] {
display: none;
}
/* Tracking protection doorhanger */
.popup-notification-footer[popupid="bad-content"] {
display: none;
}
.popup-notification-footer[popupid="bad-content"][mixedblockdisabled],
.popup-notification-footer[popupid="bad-content"][trackingblockdisabled] {
display: block;
}
#login-fill-doorhanger:not([inDetailView]) > #login-fill-clickcapturer {
pointer-events: none;
}

Просмотреть файл

@ -6917,47 +6917,6 @@ var gIdentityHandler = {
// we receive a new security state. If the user opened the popup and looks
// at the provided information we don't want to suddenly change the panel
// contents.
// Show the doorhanger when:
// - mixed active content is blocked
// - mixed active content is loaded (detected but not blocked)
// - tracking content is blocked
// - tracking content is not blocked
if (state &
(nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT |
nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT |
nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT |
nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT)) {
this.showBadContentDoorhanger(state);
}
},
showBadContentDoorhanger : function(state) {
var currentNotification =
PopupNotifications.getNotification("bad-content",
gBrowser.selectedBrowser);
// Avoid showing the same notification (same state) repeatedly.
if (currentNotification && currentNotification.options.state == state)
return;
let options = {
/* keep doorhanger collapsed */
dismissed: true,
state: state
};
// default
let iconState = "bad-content-blocked-notification-icon";
if (state &
(Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT |
Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT)) {
iconState = "bad-content-unblocked-notification-icon";
}
PopupNotifications.show(gBrowser.selectedBrowser, "bad-content",
"", iconState, null, null, options);
},
/**

Просмотреть файл

@ -742,8 +742,6 @@
<image id="webapps-notification-icon" class="notification-anchor-icon" role="button"/>
<image id="plugins-notification-icon" class="notification-anchor-icon" role="button"/>
<image id="web-notifications-notification-icon" class="notification-anchor-icon" role="button"/>
<image id="bad-content-blocked-notification-icon" class="notification-anchor-icon" role="button"/>
<image id="bad-content-unblocked-notification-icon" class="notification-anchor-icon" role="button"/>
<image id="webRTC-shareDevices-notification-icon" class="notification-anchor-icon" role="button"/>
<image id="webRTC-sharingDevices-notification-icon" class="notification-anchor-icon" role="button"/>
<image id="webRTC-shareMicrophone-notification-icon" class="notification-anchor-icon" role="button"/>

Просмотреть файл

@ -259,12 +259,15 @@ skip-if = os == "mac" # Bug 1102331 - does focus things on the content window wh
[browser_bug783614.js]
[browser_bug817947.js]
[browser_bug822367.js]
tags = mcb
[browser_bug832435.js]
[browser_bug839103.js]
[browser_bug880101.js]
[browser_bug882977.js]
[browser_bug902156.js]
tags = mcb
[browser_bug906190.js]
tags = mcb
skip-if = buildapp == "mulet" || e10s # Bug 1093642 - test manipulates content and relies on content focus
[browser_mixedContentFromOnunload.js]
[browser_bug970746.js]
@ -330,6 +333,7 @@ skip-if = os != "win" # The Fitts Law menu button is only supported on Windows (
[browser_minimize.js]
skip-if = e10s # Bug 1100664 - test directly access content docShells (TypeError: gBrowser.docShell is null)
[browser_mixedcontent_securityflags.js]
tags = mcb
[browser_notification_tab_switching.js]
skip-if = buildapp == 'mulet' || e10s # Bug 1100662 - content access causing uncaught exception - Error: cannot ipc non-cpow object at chrome://mochitests/content/browser/browser/base/content/test/general/browser_notification_tab_switching.js:32 (or in RemoteAddonsChild.jsm)
[browser_offlineQuotaNotification.js]
@ -489,6 +493,7 @@ skip-if = e10s # Bug 1094240 - has findbar-related failures
[browser_addCertException.js]
skip-if = e10s # Bug 1100687 - test directly manipulates content (content.document.getElementById)
[browser_bug1045809.js]
tags = mcb
[browser_e10s_switchbrowser.js]
[browser_e10s_about_process.js]
[browser_e10s_chrome_process.js]
@ -497,6 +502,7 @@ skip-if = e10s # Bug 1100687 - test directly manipulates content (content.docume
tags = psm
skip-if = e10s # bug 1100687 - test directly manipulates content (content.document.getElementById)
[browser_mcb_redirect.js]
tags = mcb
[browser_windowactivation.js]
[browser_contextmenu_childprocess.js]
[browser_bug963945.js]

Просмотреть файл

@ -38,7 +38,9 @@ add_task(function*() {
let result = yield promise_first_result("keyword something");
isnot(result, null, "Expect a keyword result");
is(result.getAttribute("type"), "action keyword", "Expect correct `type` attribute");
let types = new Set(result.getAttribute("type").split(/\s+/));
Assert.ok(types.has("action"));
Assert.ok(types.has("keyword"));
is(result.getAttribute("actiontype"), "keyword", "Expect correct `actiontype` attribute");
is(result.getAttribute("title"), "example.com", "Expect correct title");

Просмотреть файл

@ -1,14 +1,20 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
add_task(function*() {
// This test is only relevant if UnifiedComplete is enabled.
let ucpref = Services.prefs.getBoolPref("browser.urlbar.unifiedcomplete");
Services.prefs.setBoolPref("browser.urlbar.unifiedcomplete", true);
registerCleanupFunction(() => {
Services.prefs.setBoolPref("browser.urlbar.unifiedcomplete", ucpref);
});
const UNIFIEDCOMPLETE_PREF = "browser.urlbar.unifiedcomplete";
const SUGGEST_ALL_PREF = "browser.search.suggest.enabled";
const SUGGEST_URLBAR_PREF = "browser.urlbar.suggest.searches";
const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
add_task(function* prepare() {
// This test is only relevant if UnifiedComplete is enabled.
Services.prefs.setBoolPref(UNIFIEDCOMPLETE_PREF, true);
registerCleanupFunction(() => {
Services.prefs.clearUserPref(UNIFIEDCOMPLETE_PREF);
});
});
add_task(function* switchToTab() {
let tab = gBrowser.addTab("about:about");
yield promiseTabLoaded(tab);
@ -18,9 +24,45 @@ add_task(function*() {
ok(gURLBar.popup.richlistbox.children.length > 1, "Should get at least 2 results");
let result = gURLBar.popup.richlistbox.children[1];
is(result.getAttribute("type"), "action switchtab", "Expect right type attribute");
is(result.label, "about:about " + actionURL + " Tab", "Result a11y label should be as expected");
is(result.label, "about:about about:about Tab", "Result a11y label should be: <title> <url> Tab");
gURLBar.popup.hidePopup();
yield promisePopupHidden(gURLBar.popup);
gBrowser.removeTab(tab);
});
add_task(function* searchSuggestions() {
let engine = yield promiseNewSearchEngine(TEST_ENGINE_BASENAME);
let oldCurrentEngine = Services.search.currentEngine;
Services.search.currentEngine = engine;
Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true);
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, true);
registerCleanupFunction(function () {
Services.search.currentEngine = oldCurrentEngine;
Services.prefs.clearUserPref(SUGGEST_ALL_PREF);
Services.prefs.clearUserPref(SUGGEST_URLBAR_PREF);
});
yield promiseAutocompleteResultPopup("foo");
// Don't assume that the search doesn't match history or bookmarks left around
// by earlier tests.
Assert.ok(gURLBar.popup.richlistbox.children.length >= 3,
"Should get at least heuristic result + two search suggestions");
// The first expected search is the search term itself since the heuristic
// result will come before the search suggestions.
let expectedSearches = [
"foo",
"foofoo",
"foobar",
];
for (let child of gURLBar.popup.richlistbox.children) {
if (child.getAttribute("type").split(/\s+/).indexOf("searchengine") >= 0) {
Assert.ok(expectedSearches.length > 0);
let suggestion = expectedSearches.shift();
Assert.equal(child.label, suggestion + " browser_searchSuggestionEngine searchSuggestionEngine.xml Search",
"Result label should be: <search term> <engine name> Search");
}
}
Assert.ok(expectedSearches.length == 0);
gURLBar.closePopup();
});

Просмотреть файл

@ -35,42 +35,27 @@ add_task(function* () {
});
function* test1(gTestBrowser) {
var notification =
PopupNotifications.getNotification("bad-content", gTestBrowser);
isnot(notification, null, "Mixed Content Doorhanger did appear in Test1");
yield promiseNotificationShown(notification);
isnot(PopupNotifications.panel.firstChild.isMixedContentBlocked, 0,
"Mixed Content is being blocked in Test1");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var x = content.document.getElementsByTagName('iframe')[0].contentDocument.getElementById('mixedContentContainer');
is(x, null, "Mixed Content is NOT to be found in Test1");
// Disable Mixed Content Protection for the page (and reload)
PopupNotifications.panel.firstChild.disableMixedContentProtection();
gIdentityHandler.disableMixedContentProtection();
}
function* test2(gTestBrowser) {
var notification =
PopupNotifications.getNotification("bad-content", gTestBrowser);
isnot(notification, null, "Mixed Content Doorhanger did appear in Test2");
yield promiseNotificationShown(notification);
is(PopupNotifications.panel.firstChild.isMixedContentBlocked, 0,
"Mixed Content is NOT being blocked in Test2");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
var x = content.document.getElementsByTagName('iframe')[0].contentDocument.getElementById('mixedContentContainer');
isnot(x, null, "Mixed Content is to be found in Test2");
// Re-enable Mixed Content Protection for the page (and reload)
PopupNotifications.panel.firstChild.enableMixedContentProtection();
gIdentityHandler.enableMixedContentProtection();
}
function* test3(gTestBrowser) {
var notification =
PopupNotifications.getNotification("bad-content", gTestBrowser);
isnot(notification, null, "Mixed Content Doorhanger did appear in Test3");
yield promiseNotificationShown(notification);
isnot(PopupNotifications.panel.firstChild.isMixedContentBlocked, 0,
"Mixed Content is being blocked in Test3");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var x = content.document.getElementsByTagName('iframe')[0].contentDocument.getElementById('mixedContentContainer');
is(x, null, "Mixed Content is NOT to be found in Test3");

Просмотреть файл

@ -50,11 +50,11 @@ function test() {
function MixedTest1A() {
gTestBrowser.removeEventListener("load", MixedTest1A, true);
gTestBrowser.addEventListener("load", MixedTest1B, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger did appear");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked");
PopupNotifications.panel.firstChild.disableMixedContentProtection();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function MixedTest1B() {
waitForCondition(function() content.document.getElementById('p1').innerHTML == "hello", MixedTest1C, "Waited too long for mixed script to run in Test 1");
@ -73,8 +73,7 @@ function MixedTest2() {
}
function MixedTest2A() {
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(!notification, "Mixed Content Doorhanger did not appear for mixed display content!");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: false, passiveLoaded: false});
MixedTest3();
}
@ -88,11 +87,11 @@ function MixedTest3() {
function MixedTest3A() {
gTestBrowser.removeEventListener("load", MixedTest3A, true);
gTestBrowser.addEventListener("load", MixedTest3B, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger did appear for test 3");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in test 3");
PopupNotifications.panel.firstChild.disableMixedContentProtection();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function MixedTest3B() {
waitForCondition(function() content.document.getElementById('p1').innerHTML == "hello", MixedTest3C, "Waited too long for mixed script to run in Test 3");
@ -103,6 +102,7 @@ function MixedTest3C() {
function MixedTest3D() {
ok(content.document.getElementById('p1').innerHTML == "hello","Mixed script didn't load in Test 3");
ok(content.document.getElementById('p2').innerHTML == "bye","Mixed image didn't load in Test 3");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: true});
MixedTest4();
}
@ -116,22 +116,21 @@ function MixedTest4() {
function MixedTest4A() {
gTestBrowser.removeEventListener("load", MixedTest4A, true);
gTestBrowser.addEventListener("load", MixedTest4B, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger did appear for Test 4");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 4");
PopupNotifications.panel.firstChild.disableMixedContentProtection();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function MixedTest4B() {
waitForCondition(function() content.document.location == gHttpTestRoot + "file_bug822367_4B.html", MixedTest4C, "Waited too long for mixed script to run in Test 4");
}
function MixedTest4C() {
ok(content.document.location == gHttpTestRoot + "file_bug822367_4B.html", "Location didn't change in test 4");
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger did appear after location change in Test 4");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in test 4");
notification.remove();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
waitForCondition(function() content.document.getElementById('p1').innerHTML == "", MixedTest4D, "Mixed script loaded in test 4 after location change!");
}
function MixedTest4D() {
@ -149,11 +148,11 @@ function MixedTest5() {
function MixedTest5A() {
gTestBrowser.removeEventListener("load", MixedTest5A, true);
gTestBrowser.addEventListener("load", MixedTest5B, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger did appear for Test 5");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 5");
PopupNotifications.panel.firstChild.disableMixedContentProtection();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function MixedTest5B() {
waitForCondition(function() content.document.getElementById('p1').innerHTML == "hello", MixedTest5C, "Waited too long for mixed script to run in Test 5");
@ -172,16 +171,17 @@ function MixedTest6() {
}
function MixedTest6A() {
gTestBrowser.removeEventListener("load", MixedTest6A, true);
waitForCondition(function() PopupNotifications.getNotification("bad-content", gTestBrowser), MixedTest6B, "waited too long for doorhanger");
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
waitForCondition(() => gIdentityHandler._identityBox.classList.contains("mixedActiveBlocked"), MixedTest6B, "Waited too long for control center to get mixed active blocked state");
}
function MixedTest6B() {
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger did appear for Test 6");
gTestBrowser.addEventListener("load", MixedTest6C, true);
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 6");
PopupNotifications.panel.firstChild.disableMixedContentProtection();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function MixedTest6C() {
@ -196,5 +196,6 @@ function MixedTest6C() {
}
function MixedTest6D() {
ok(content.document.getElementById('f1').contentDocument.getElementById('p1').innerHTML == "hello","Mixed script didn't load in Test 6");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
MixedTestsCompleted();
}

Просмотреть файл

@ -4,19 +4,19 @@
*
* 1. Navigate to the same domain via document.location
* - Load a html page which has mixed content
* - Doorhanger to disable protection appears - we disable it
* - Control Center button to disable protection appears - we disable it
* - Load a new page from the same origin using document.location
* - Doorhanger should not appear anymore!
* - Control Center button should not appear anymore!
*
* 2. Navigate to the same domain via simulateclick for a link on the page
* - Load a html page which has mixed content
* - Doorhanger to disable protection appears - we disable it
* - Control Center button to disable protection appears - we disable it
* - Load a new page from the same origin simulating a click
* - Doorhanger should not appear anymore!
* - Control Center button should not appear anymore!
*
* 3. Navigate to a differnet domain and show the content is still blocked
* - Load a different html page which has mixed content
* - Doorhanger to disable protection should appear again because
* - Control Center button to disable protection should appear again because
* we navigated away from html page where we disabled the protection.
*
* Note, for all tests we set gHttpTestRoot to use 'https'.
@ -50,14 +50,11 @@ function test1A() {
gTestBrowser.removeEventListener("load", test1A, true);
gTestBrowser.addEventListener("load", test1B, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test1A!");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test1A!");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
// Disable Mixed Content Protection for the page (and reload)
PopupNotifications.panel.firstChild.disableMixedContentProtection();
notification.remove();
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function test1B() {
@ -83,13 +80,9 @@ function test1C() {
function test1D() {
gTestBrowser.removeEventListener("load", test1D, true);
// The Doorhanger should appear but isMixedContentBlocked should be NOT true,
// The Control Center button should appear but isMixedContentBlocked should be NOT true,
// because our decision of disabling the mixed content blocker is persistent.
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test1D!");
notification.reshow();
ok(!PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked in Test1D!");
notification.remove();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
var actual = content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1D");
@ -112,14 +105,11 @@ function test2A() {
gTestBrowser.removeEventListener("load", test2A, true);
gTestBrowser.addEventListener("load", test2B, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 2A!");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 2A!");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
// Disable Mixed Content Protection for the page (and reload)
PopupNotifications.panel.firstChild.disableMixedContentProtection();
notification.remove();
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function test2B() {
@ -146,13 +136,9 @@ function test2C() {
function test2D() {
gTestBrowser.removeEventListener("load", test2D, true);
// The Doorhanger should appear but isMixedContentBlocked should be NOT true,
// The Control Center button should appear but isMixedContentBlocked should be NOT true,
// because our decision of disabling the mixed content blocker is persistent.
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test2D!");
notification.reshow();
ok(!PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked");
notification.remove();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
var actual = content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 2D");
@ -174,11 +160,7 @@ function test3A() {
// one once the page is loaded with mixed content blocker disabled
gTestBrowser.removeEventListener("load", test3A, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 3A!");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 3A");
notification.remove();
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
// We are done with tests, clean up
cleanUpAfterTests();

Просмотреть файл

@ -143,15 +143,11 @@ function waitForSomeTabToLoad(callback) {
function checkPopUpNotification() {
waitForSomeTabToLoad(reloadedTabAfterDisablingMCB);
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in " + curTestName + "!");
promiseNotificationShown(notification).then(function() {
ok(gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in " + curTestName + "!");
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
// Disable Mixed Content Protection for the page (and reload page)
gTestWin.PopupNotifications.panel.firstChild.disableMixedContentProtection();
notification.remove();
});
// Disable Mixed Content Protection for the page (which reloads the page)
let {gIdentityHandler} = gTestWin.gBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
}
function reloadedTabAfterDisablingMCB() {
@ -192,18 +188,13 @@ function test1A() {
// The Doorhanger should appear but isMixedContentBlocked should be >> NOT << true,
// because our decision of disabling the mixed content blocker is persistent across tabs.
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 1A!");
promiseNotificationShown(notification).then(function() {
ok(!gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked in Test 1A!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1A");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1A");
gTestWin.gBrowser.removeCurrentTab();
test1B();
});
gTestWin.gBrowser.removeCurrentTab();
test1B();
}
function test1B() {
@ -221,23 +212,18 @@ function test1C() {
// The Doorhanger should appear but isMixedContentBlocked should be >> NOT << true,
// because our decision of disabling the mixed content blocker is persistent across tabs.
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 1C!");
promiseNotificationShown(notification).then(function() {
ok(!gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked in Test 1C!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1C");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 1C");
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
var childTabLink = gHttpTestRoot2 + "file_bug906190_2.html";
setUpTest("Test2", "linkForTest2", test2, childTabLink);
});
var childTabLink = gHttpTestRoot2 + "file_bug906190_2.html";
setUpTest("Test2", "linkForTest2", test2, childTabLink);
}
//------------------------ Test 2 ------------------------------
@ -256,18 +242,13 @@ function test2A() {
// The Doorhanger should appear and isMixedContentBlocked should be >> TRUE <<,
// because our decision of disabling the mixed content blocker should only persist if pages are from the same domain.
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 2A!");
promiseNotificationShown(notification).then(function() {
ok(gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 2A!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 2A");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 2A");
gTestWin.gBrowser.removeCurrentTab();
test2B();
});
gTestWin.gBrowser.removeCurrentTab();
test2B();
}
function test2B() {
@ -285,24 +266,19 @@ function test2C() {
// The Doorhanger should appear and isMixedContentBlocked should be >> TRUE <<,
// because our decision of disabling the mixed content blocker should only persist if pages are from the same domain.
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 2C!");
promiseNotificationShown(notification).then(function() {
ok(gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 2C!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 2C");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 2C");
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// file_bug906190_3_4.html redirects to page test1.example.com/* using meta-refresh
var childTabLink = gHttpTestRoot1 + "file_bug906190_3_4.html";
setUpTest("Test3", "linkForTest3", test3, childTabLink);
});
// file_bug906190_3_4.html redirects to page test1.example.com/* using meta-refresh
var childTabLink = gHttpTestRoot1 + "file_bug906190_3_4.html";
setUpTest("Test3", "linkForTest3", test3, childTabLink);
}
//------------------------ Test 3 ------------------------------
@ -324,19 +300,14 @@ function test3B() {
gTestWin.gBrowser.selectTabAtIndex(2);
// The Doorhanger should appear but isMixedContentBlocked should be >> NOT << true!
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 3B!");
promiseNotificationShown(notification).then(function() {
ok(!gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked in Test 3B!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 3B");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 3B");
// remove tabs
gTestWin.gBrowser.removeCurrentTab();
test3C();
});
// remove tabs
gTestWin.gBrowser.removeCurrentTab();
test3C();
}
function test3C() {
@ -357,23 +328,18 @@ function test3E() {
gTestWin.gBrowser.selectTabAtIndex(2);
// The Doorhanger should appear but isMixedContentBlocked should be >> NOT << true!
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 3E!");
promiseNotificationShown(notification).then(function() {
ok(!gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked in Test 3E!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 3E");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 3E");
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
var childTabLink = gHttpTestRoot1 + "file_bug906190_3_4.html";
setUpTest("Test4", "linkForTest4", test4, childTabLink);
});
var childTabLink = gHttpTestRoot1 + "file_bug906190_3_4.html";
setUpTest("Test4", "linkForTest4", test4, childTabLink);
}
//------------------------ Test 4 ------------------------------
@ -396,19 +362,14 @@ function test4B() {
gTestWin.gBrowser.selectTabAtIndex(2);
// The Doorhanger should appear and isMixedContentBlocked should be >> TRUE <<
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 4B!");
promiseNotificationShown(notification).then(function() {
ok(gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 4B!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 4B");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 4B");
// remove tabs
gTestWin.gBrowser.removeCurrentTab();
test4C();
});
// remove tabs
gTestWin.gBrowser.removeCurrentTab();
test4C();
}
function test4C() {
@ -429,24 +390,19 @@ function test4E() {
gTestWin.gBrowser.selectTabAtIndex(2);
// The Doorhanger should appear and isMixedContentBlocked should be >> TRUE <<
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 4E!");
promiseNotificationShown(notification).then(function() {
ok(gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 4E!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 4E");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 4E");
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// the sjs files returns a 302 redirect- note, same origins
var childTabLink = gHttpTestRoot1 + "file_bug906190.sjs";
setUpTest("Test5", "linkForTest5", test5, childTabLink);
});
// the sjs files returns a 302 redirect- note, same origins
var childTabLink = gHttpTestRoot1 + "file_bug906190.sjs";
setUpTest("Test5", "linkForTest5", test5, childTabLink);
}
//------------------------ Test 5 ------------------------------
@ -465,19 +421,15 @@ function test5A() {
// The Doorhanger should appear but isMixedContentBlocked should be >> NOT << true
// Currently it is >> TRUE << - see follow up bug 914860
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 5A!");
promiseNotificationShown(notification).then(function() {
todo(!gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked in Test 5A!");
notification.remove();
let {gIdentityHandler} = gTestWin.gBrowser.ownerGlobal;
todo(!gIdentityHandler._identityBox.classList.contains("mixedActiveBlocked"), "OK: Mixed Content is NOT being blocked in Test 5A!");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
todo_is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 5A!");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
todo_is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 5A!");
// remove tabs
gTestWin.gBrowser.removeCurrentTab();
test5B();
});
// remove tabs
gTestWin.gBrowser.removeCurrentTab();
test5B();
}
function test5B() {
@ -493,26 +445,23 @@ function test5C() {
// move the tab again
gTestWin.gBrowser.selectTabAtIndex(2);
let {gIdentityHandler} = gTestWin.gBrowser.ownerGlobal;
// The Doorhanger should appear but isMixedContentBlocked should be >> NOT << true
// Currently it is >> TRUE << - see follow up bug 914860
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 5C!");
promiseNotificationShown(notification).then(function() {
todo(!gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is NOT being blocked in Test 5C!");
notification.remove();
todo(!gIdentityHandler._identityBox.classList.contains("mixedActiveBlocked"), "OK: Mixed Content is NOT being blocked in Test 5C!");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
todo_is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 5C!");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
todo_is(actual, "Mixed Content Blocker disabled", "OK: Executed mixed script in Test 5C!");
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// remove tabs
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[2], {animate: false});
gTestWin.gBrowser.removeTab(gTestWin.gBrowser.tabs[1], {animate: false});
gTestWin.gBrowser.selectTabAtIndex(0);
// the sjs files returns a 302 redirect - note, different origins
var childTabLink = gHttpTestRoot2 + "file_bug906190.sjs";
setUpTest("Test6", "linkForTest6", test6, childTabLink);
});
// the sjs files returns a 302 redirect - note, different origins
var childTabLink = gHttpTestRoot2 + "file_bug906190.sjs";
setUpTest("Test6", "linkForTest6", test6, childTabLink);
}
//------------------------ Test 6 ------------------------------
@ -530,19 +479,14 @@ function test6A() {
gTestWin.gBrowser.selectTabAtIndex(2);
// The Doorhanger should appear and isMixedContentBlocked should be >> TRUE <<
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 6A!");
promiseNotificationShown(notification).then(function() {
ok(gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 6A!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 6A");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 6A");
// done
gTestWin.gBrowser.removeCurrentTab();
test6B();
});
// done
gTestWin.gBrowser.removeCurrentTab();
test6B();
}
function test6B() {
@ -558,18 +502,13 @@ function test6C() {
gTestWin.gBrowser.selectTabAtIndex(2);
// The Doorhanger should appear and isMixedContentBlocked should be >> TRUE <<
var notification = PopupNotifications.getNotification("bad-content", gTestWin.gBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger did appear in Test 6C!");
promiseNotificationShown(notification).then(function() {
ok(gTestWin.PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked in Test 6C!");
notification.remove();
assertMixedContentBlockingState(gTestWin.gBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 6C");
var actual = gTestWin.content.document.getElementById('mctestdiv').innerHTML;
is(actual, "Mixed Content Blocker enabled", "OK: Blocked mixed script in Test 6C");
gTestWin.close();
finish();
});
gTestWin.close();
finish();
}
//------------------------ SETUP ------------------------------

Просмотреть файл

@ -100,16 +100,15 @@ function waitForCondition(condition, nextTest, errorMsg, okMsg) {
//------------------------ Test 1 ------------------------------
function test1() {
gTestBrowser.addEventListener("load", checkPopUpNotificationsForTest1, true);
gTestBrowser.addEventListener("load", checkUIForTest1, true);
var url = gHttpsTestRoot + "test_mcb_redirect.html"
gTestBrowser.contentWindow.location = url;
}
function checkPopUpNotificationsForTest1() {
gTestBrowser.removeEventListener("load", checkPopUpNotificationsForTest1, true);
function checkUIForTest1() {
gTestBrowser.removeEventListener("load", checkUIForTest1, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser.selectedBrowser);
ok(notification, "OK: Mixed Content Doorhanger appeared in Test1!");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
var expected = "script blocked";
waitForCondition(
@ -121,16 +120,15 @@ function checkPopUpNotificationsForTest1() {
//------------------------ Test 2 ------------------------------
function test2() {
gTestBrowser.addEventListener("load", checkPopUpNotificationsForTest2, true);
gTestBrowser.addEventListener("load", checkUIForTest2, true);
var url = gHttpTestRoot + "test_mcb_redirect.html"
gTestBrowser.contentWindow.location = url;
}
function checkPopUpNotificationsForTest2() {
gTestBrowser.removeEventListener("load", checkPopUpNotificationsForTest2, true);
function checkUIForTest2() {
gTestBrowser.removeEventListener("load", checkUIForTest2, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser.selectedBrowser);
ok(!notification, "OK: Mixed Content Doorhanger did not appear in 2!");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: false, passiveLoaded: false});
var expected = "script executed";
waitForCondition(

Просмотреть файл

@ -39,16 +39,13 @@ function overrideMCB()
{
// test mixed content flags on load (reload)
gTestBrowser.addEventListener("load", mixedContentOverrideTest, true);
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger should appear");
notification.reshow();
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked, "OK: Mixed Content is being blocked");
// Make sure the notification has no mixedblockdisabled attribute
ok(!PopupNotifications.panel.firstChild.hasAttribute("mixedblockdisabled"),
"Doorhanger must have no mixedblockdisabled attribute");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: true, passiveLoaded: false});
// Click on the doorhanger to allow mixed content (and reload page)
PopupNotifications.panel.firstChild.disableMixedContentProtection();
let {gIdentityHandler} = gTestBrowser.ownerGlobal;
gIdentityHandler.disableMixedContentProtection();
notification.remove();
}
@ -61,13 +58,7 @@ function mixedContentOverrideTest()
is(gTestBrowser.docShell.hasMixedDisplayContentBlocked, false, "second hasMixedDisplayContentBlocked flag has been set");
is(gTestBrowser.docShell.hasMixedActiveContentBlocked, false, "second hasMixedActiveContentBlocked flag has been set");
let notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
ok(notification, "Mixed Content Doorhanger should appear");
notification.reshow();
// Make sure the notification has the mixedblockdisabled attribute set to true
is(PopupNotifications.panel.firstChild.getAttribute("mixedblockdisabled"), "true",
"Doorhanger must have [mixedblockdisabled='true'] attribute");
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: true, activeBlocked: false, passiveLoaded: true});
gBrowser.removeCurrentTab();
finish();

Просмотреть файл

@ -5,7 +5,7 @@ const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
// Must run first.
add_task(function* prepare() {
let engine = yield promiseNewEngine(TEST_ENGINE_BASENAME);
let engine = yield promiseNewSearchEngine(TEST_ENGINE_BASENAME);
let oldCurrentEngine = Services.search.currentEngine;
Services.search.currentEngine = engine;
registerCleanupFunction(function () {
@ -23,29 +23,14 @@ add_task(function* prepare() {
});
});
add_task(function* focus_allSuggestionsDisabled() {
Services.prefs.setBoolPref(SUGGEST_ALL_PREF, false);
Services.prefs.setBoolPref(CHOICE_PREF, false);
gURLBar.blur();
gURLBar.focus();
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
yield promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(false);
});
add_task(function* focus_noChoiceMade() {
add_task(function* focus() {
// Focusing the urlbar used to open the popup in order to show the
// notification, but it doesn't anymore. Make sure it does not.
Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true);
Services.prefs.setBoolPref(CHOICE_PREF, false);
gURLBar.blur();
gURLBar.focus();
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(true);
gURLBar.blur();
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
gURLBar.focus();
Assert.ok(gURLBar.popup.popupOpen, "popup should be open again");
assertVisible(true);
Assert.ok(!gURLBar.popup.popupOpen, "popup should remain closed");
});
add_task(function* dismissWithoutResults() {
@ -53,6 +38,9 @@ add_task(function* dismissWithoutResults() {
Services.prefs.setBoolPref(CHOICE_PREF, false);
gURLBar.blur();
gURLBar.focus();
let popupPromise = promisePopupShown(gURLBar.popup);
gURLBar.openPopup();
yield popupPromise;
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(true);
Assert.equal(gURLBar.popup._matchCount, 0, "popup should have no results");
@ -76,9 +64,9 @@ add_task(function* dismissWithResults() {
Services.prefs.setBoolPref(CHOICE_PREF, false);
gURLBar.blur();
gURLBar.focus();
yield promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(true);
yield promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup._matchCount > 0, "popup should have results");
let disableButton = document.getAnonymousElementByAttribute(
gURLBar.popup, "anonid", "search-suggestions-notification-disable"
@ -100,6 +88,7 @@ add_task(function* disable() {
Services.prefs.setBoolPref(CHOICE_PREF, false);
gURLBar.blur();
gURLBar.focus();
yield promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(true);
let disableButton = document.getAnonymousElementByAttribute(
@ -161,25 +150,6 @@ function assertVisible(visible) {
Assert.equal(style.visibility, visible ? "visible" : "collapse");
}
function promiseNewEngine(basename) {
return new Promise((resolve, reject) => {
info("Waiting for engine to be added: " + basename);
let url = getRootDirectory(gTestPath) + basename;
Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "",
false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
registerCleanupFunction(() => Services.search.removeEngine(engine));
resolve(engine);
},
onError: function (errCode) {
Assert.ok(false, "addEngine failed with error code " + errCode);
reject();
},
});
});
}
function promiseTransition() {
return new Promise(resolve => {
gURLBar.popup.addEventListener("transitionend", function onEnd() {

Просмотреть файл

@ -758,6 +758,66 @@ function assertWebRTCIndicatorStatus(expected) {
}
}
/**
* Test the state of the identity box and control center to make
* sure they are correctly showing the expected mixed content states.
*
* @param tabbrowser
* @param Object states
* MUST include the following properties:
* {
* activeLoaded: true|false,
* activeBlocked: true|false,
* passiveLoaded: true|false,
* }
*/
function assertMixedContentBlockingState(tabbrowser, states = {}) {
if (!tabbrowser || !("activeLoaded" in states) ||
!("activeBlocked" in states) || !("passiveLoaded" in states)) {
throw new Error("assertMixedContentBlockingState requires a browser and a states object");
}
let {passiveLoaded,activeLoaded,activeBlocked} = states;
let {gIdentityHandler} = tabbrowser.ownerGlobal;
let doc = tabbrowser.ownerDocument;
let identityBox = gIdentityHandler._identityBox;
let classList = identityBox.classList;
// Make sure the identity box UI has the correct mixedcontent states
is(classList.contains("mixedActiveContent"), activeLoaded,
"identityBox has expected class for activeLoaded");
is(classList.contains("mixedActiveBlocked"), activeBlocked && !passiveLoaded,
"identityBox has expected class for activeBlocked && !passiveLoaded");
is(classList.contains("mixedDisplayContent"), passiveLoaded && !activeLoaded,
"identityBox has expected class for passiveLoaded && activeLoaded");
is(classList.contains("mixedDisplayContentLoadedActiveBlocked"), passiveLoaded && activeBlocked,
"identityBox has expected class for passiveLoaded && activeBlocked");
is (classList.contains("mixedContent"), activeBlocked || activeLoaded || passiveLoaded,
"identityBox is showing no mixed content");
// Make sure the identity popup has the correct mixedcontent states
gIdentityHandler._identityBox.click();
let popupAttr = doc.getElementById("identity-popup").getAttribute("mixedcontent");
let bodyAttr = doc.getElementById("identity-popup-securityView-body").getAttribute("mixedcontent");
is(popupAttr.contains("active-loaded"), activeLoaded,
"identity-popup has expected attr for activeLoaded");
is(bodyAttr.contains("active-loaded"), activeLoaded,
"securityView-body has expected attr for activeLoaded");
is(popupAttr.contains("active-blocked"), activeBlocked,
"identity-popup has expected attr for activeBlocked");
is(bodyAttr.contains("active-blocked"), activeBlocked,
"securityView-body has expected attr for activeBlocked");
is(popupAttr.contains("passive-loaded"), passiveLoaded,
"identity-popup has expected attr for passiveLoaded");
is(bodyAttr.contains("passive-loaded"), passiveLoaded,
"securityView-body has expected attr for passiveLoaded");
gIdentityHandler._identityPopup.hidden = true;
}
function makeActionURI(action, params) {
let url = "moz-action:" + action + "," + JSON.stringify(params);
return NetUtil.newURI(url);
@ -882,3 +942,22 @@ function promiseTopicObserved(aTopic)
}, aTopic, false);
});
}
function promiseNewSearchEngine(basename) {
return new Promise((resolve, reject) => {
info("Waiting for engine to be added: " + basename);
let url = getRootDirectory(gTestPath) + basename;
Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "",
false, {
onSuccess: function (engine) {
info("Search engine added: " + basename);
registerCleanupFunction(() => Services.search.removeEngine(engine));
resolve(engine);
},
onError: function (errCode) {
Assert.ok(false, "addEngine failed with error code " + errCode);
reject();
},
});
});
}

Просмотреть файл

@ -768,8 +768,14 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Trim popup selected values, but never trim results coming from
// autofill.
let styles = new Set(
this.popup.selectedIndex == -1 ? [] :
this.mController.getStyleAt(this.popup.selectedIndex).split(/\s+/)
);
if (this.popup.selectedIndex == -1 ||
this.mController.getStyleAt(this.popup.selectedIndex) == "autofill") {
this.mController
.getStyleAt(this.popup.selectedIndex)
.split(/\s+/).indexOf("autofill") >= 0) {
this._disableTrim = true;
}
this.value = val;
@ -923,20 +929,16 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
false
]]></field>
<method name="_maybeShowSearchSuggestionsNotification">
<body><![CDATA[
let showNotification =
!this._userMadeSearchSuggestionsChoice &&
// When _urlbarFocused is true, tabbrowser would close the popup if
// it's opened here, so don't show the notification.
!gBrowser.selectedBrowser._urlbarFocused &&
Services.prefs.getBoolPref("browser.search.suggest.enabled") &&
this._prefs.getBoolPref("unifiedcomplete");
if (showNotification) {
this.popup.showSearchSuggestionsNotification(this, this);
}
]]></body>
</method>
<property name="shouldShowSearchSuggestionsNotification" readonly="true">
<getter><![CDATA[
return !this._userMadeSearchSuggestionsChoice &&
// When _urlbarFocused is true, tabbrowser would close the
// popup if it's opened here, so don't show the notification.
!gBrowser.selectedBrowser._urlbarFocused &&
Services.prefs.getBoolPref("browser.search.suggest.enabled") &&
this._prefs.getBoolPref("unifiedcomplete");
]]></getter>
</property>
</implementation>
@ -968,7 +970,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
if (event.originalTarget == this.inputField) {
this._hideURLTooltip();
this.formatValue();
this._maybeShowSearchSuggestionsNotification();
}
]]></handler>
@ -1586,7 +1587,13 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
// ie, hitting page-down will only cause is to wrap if we're already
// at one end of the list.
if (!Services.prefs.getBoolPref("browser.urlbar.unifiedcomplete")) {
// Do not allow the selection to be removed if UnifiedComplete is
// enabled and the popup's first result is a heuristic result.
if (!Services.prefs.getBoolPref("browser.urlbar.unifiedcomplete") ||
(this.input.mController.matchCount > 0 &&
this.input.mController
.getStyleAt(0)
.split(/\s+/).indexOf("heuristic") == -1)) {
if (reverse && index == -1 || newIndex > maxRow && index != maxRow)
newIndex = maxRow;
else if (!reverse && index == -1 || newIndex < 0 && index != 0)
@ -1631,11 +1638,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
// to avoid impacting startup / new window performance
aInput.popup.hidden = false;
// The popup may already be open if it's showing the search
// suggestions notification. In that case, its footer visibility
// needs to be updated.
if (this.popupOpen) {
this._updateFooterVisibility();
if (aInput.shouldShowSearchSuggestionsNotification) {
this._showSearchSuggestionsNotification();
}
this._openAutocompletePopup(aInput, aElement);
@ -1651,7 +1655,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
</body>
</method>
<method name="showSearchSuggestionsNotification">
<method name="_showSearchSuggestionsNotification">
<parameter name="aInput"/>
<parameter name="aElement"/>
<body>
@ -1679,7 +1683,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
this.classList.add("showSearchSuggestionsNotification");
this._updateFooterVisibility();
this.openAutocompletePopup(aInput, aElement);
]]>
</body>
</method>
@ -1790,22 +1793,39 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
</method>
<method name="createResultLabel">
<parameter name="aTitle"/>
<parameter name="aUrl"/>
<parameter name="aType"/>
<parameter name="item"/>
<parameter name="proposedLabel"/>
<body>
<![CDATA[
let label = aTitle + " " + aUrl;
// convert aType (ex: "ac-result-type-<aType>") to text to be spoke aloud
// by screen readers. convert "tag" and "bookmark" to the localized versions,
// but don't do anything for "favicon" (the default)
try {
label += " " + this._bundle.GetStringFromName(aType + "ResultLabel");
} catch (e) {
// Undefined result label, do nothing.
let parts = [proposedLabel];
let action = this.mInput._parseActionUrl(item.getAttribute("url"));
if (action) {
switch (action.type) {
case "searchengine":
parts = [
action.params.searchSuggestion || action.params.searchQuery,
action.params.engineName,
];
break;
case "switchtab":
parts = [
item.getAttribute("title"),
action.params.url,
];
break;
}
}
return label;
let types = item.getAttribute("type").split(/\s+/);
let type = types.find(type => type != "action" && type != "heuristic");
try {
// Some types intentionally do not map to strings, which is not
// an error.
parts.push(this._bundle.GetStringFromName(type + "ResultLabel"));
} catch (e) {}
return parts.filter(str => str).join(" ");
]]>
</body>
</method>
@ -1816,11 +1836,16 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
if (!Services.prefs.getBoolPref("browser.urlbar.unifiedcomplete"))
return;
// If nothing is selected yet, select the first result if it is a
// pre-selected "heuristic" result. (See UnifiedComplete.js.)
if (this._matchCount > 0 && this.selectedIndex == -1) {
// Don't handle this as a user-initiated action.
this._ignoreNextSelect = true;
this.selectedIndex = 0;
this._ignoreNextSelect = false;
let styles = this.input.mController.getStyleAt(0).split(/\s+/);
if (styles.indexOf("heuristic") >= 0) {
// Don't handle this as a user-initiated action.
this._ignoreNextSelect = true;
this.selectedIndex = 0;
this._ignoreNextSelect = false;
}
}
this.input.gotResultForCurrentQuery = true;
@ -2387,259 +2412,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
</implementation>
</binding>
<binding id="bad-content-notification" extends="chrome://global/content/bindings/notification.xml#popup-notification">
<content>
<xul:hbox align="start">
<xul:image class="popup-notification-icon" xbl:inherits="popupid,mixedblockdisabled,trackingblockdisabled"/>
<xul:vbox>
<!-- header -->
<xul:vbox>
<xul:description anonid="badContentBlocked.title"
class="popup-notification-item-title" xbl:inherits="popupid">
</xul:description>
<xul:description class="popup-notification-item-message"
xbl:inherits="popupid">
&badContentBlocked.moreinfo;
</xul:description>
</xul:vbox>
<!-- mixed content -->
<xul:vbox anonid="mixedContent" hidden="true">
<xul:separator class="groove"/>
<xul:hbox align="start">
<xul:vbox>
<xul:description class="popup-notification-item-title"
xbl:inherits="popupid">
&mixedContentBlocked2.message;
</xul:description>
<xul:description class="popup-notification-item-message"
xbl:inherits="popupid,mixedblockdisabled">
&mixedContentBlocked2.moreinfo;
</xul:description>
<xul:label anonid="mixedContent.helplink"
class="text-link" href=""
value="&mixedContentBlocked2.learnMore;"/>
</xul:vbox>
<xul:button
type="menu" label="&mixedContentBlocked2.options;"
sizetopopup="none">
<xul:menupopup>
<xul:menuitem anonid="mixedContentAction.unblock"
hidden="true" label="&mixedContentBlocked2.unblock.label;"
accesskey="&mixedContentBlocked2.unblock.accesskey;"
oncommand="document.getBindingParent(this).disableMixedContentProtection();"/>
<xul:menuitem anonid="mixedContentAction.block"
hidden="true" label="&mixedContentBlocked2.block.label;"
accesskey="&mixedContentBlocked2.block.accesskey;"
oncommand="document.getBindingParent(this).enableMixedContentProtection();"/>
</xul:menupopup>
</xul:button>
</xul:hbox>
<xul:hbox class="popup-notification-footer" xbl:inherits="popupid,mixedblockdisabled">
<xul:description class="popup-notification-item-message popup-notification-item-message-critical" xbl:inherits="popupid">
&mixedContentBlocked2.disabled.message;
</xul:description>
</xul:hbox>
</xul:vbox>
<!-- tracking content -->
<xul:vbox anonid="trackingContent" hidden="true">
<xul:separator class="groove"/>
<xul:hbox align="start">
<xul:vbox>
<xul:description class="popup-notification-item-title"
xbl:inherits="popupid">
&trackingContentBlocked.message;
</xul:description>
<xul:description class="popup-notification-item-message"
xbl:inherits="popupid,trackingblockdisabled">
&trackingContentBlocked.moreinfo;
</xul:description>
<xul:label anonid="trackingContent.helplink"
class="text-link" href=""
value="&trackingContentBlocked.learnMore;"/>
</xul:vbox>
<xul:button
type="menu" label="&trackingContentBlocked.options;"
sizetopopup="none">
<xul:menupopup>
<xul:menuitem anonid="trackingContentAction.unblock"
hidden="true" label="&trackingContentBlocked.unblock2.label;"
accesskey="&trackingContentBlocked.unblock2.accesskey;"
oncommand="document.getBindingParent(this).disableTrackingContentProtection();"/>
<xul:menuitem anonid="trackingContentAction.block"
hidden="true" label="&trackingContentBlocked.block.label;"
accesskey="&trackingContentBlocked.block.accesskey;"
oncommand="document.getBindingParent(this).enableTrackingContentProtection();"/>
</xul:menupopup>
</xul:button>
</xul:hbox>
<xul:hbox class="popup-notification-footer" xbl:inherits="popupid,trackingblockdisabled">
<xul:description class="popup-notification-item-message popup-notification-item-message-critical" xbl:inherits="popupid">
&trackingContentBlocked.disabled.message;
</xul:description>
</xul:hbox>
</xul:vbox>
</xul:vbox>
<xul:vbox pack="start">
<xul:toolbarbutton anonid="closebutton"
class="messageCloseButton popup-notification-closebutton tabbable close-icon"
xbl:inherits="oncommand=closebuttoncommand"
tooltiptext="&closeNotification.tooltip;"/>
</xul:vbox>
</xul:hbox>
</content>
<resources>
<stylesheet src="chrome://global/skin/notification.css"/>
</resources>
<implementation>
<field name="_brandShortName">
document.getElementById("bundle_brand").getString("brandShortName")
</field>
<field name="_doorhangerTitle">
document.getAnonymousElementByAttribute(this, "anonid",
"badContentBlocked.title")
</field>
<field name="_mixedContent">
document.getAnonymousElementByAttribute(this, "anonid",
"mixedContent")
</field>
<field name="_mixedContentUnblock">
document.getAnonymousElementByAttribute(this, "anonid",
"mixedContentAction.unblock")
</field>
<field name="_mixedContentBlock">
document.getAnonymousElementByAttribute(this, "anonid",
"mixedContentAction.block");
</field>
<field name="_mixedContentHelpLink">
document.getAnonymousElementByAttribute(this, "anonid",
"mixedContent.helplink")
</field>
<property name="isMixedContentBlocked" readonly="true">
<getter><![CDATA[
return this.notification.options.state &
Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT;
]]></getter>
</property>
<field name="_trackingContent">
document.getAnonymousElementByAttribute(this, "anonid",
"trackingContent")
</field>
<field name="_trackingContentUnblock">
document.getAnonymousElementByAttribute(this, "anonid",
"trackingContentAction.unblock")
</field>
<field name="_trackingContentBlock">
document.getAnonymousElementByAttribute(this, "anonid",
"trackingContentAction.block");
</field>
<field name="_trackingContentHelpLink">
document.getAnonymousElementByAttribute(this, "anonid",
"trackingContent.helplink")
</field>
<property name="isTrackingContentBlocked" readonly="true">
<getter><![CDATA[
return !!(this.notification.options.state &
Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT);
]]></getter>
</property>
<constructor><![CDATA[
// default title
_doorhangerTitle.value =
gNavigatorBundle.getFormattedString(
"badContentBlocked.notblocked.message", [this._brandShortName]);
if (this.notification.options.state &
Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT) {
_doorhangerTitle.value =
gNavigatorBundle.getFormattedString(
"badContentBlocked.blocked.message", [this._brandShortName]);
_mixedContent.hidden = false;
_mixedContentUnblock.hidden = false;
_mixedContentHelpLink.href =
Services.urlFormatter.formatURLPref("app.support.baseURL")
+ "mixed-content";
}
if (this.notification.options.state &
Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT) {
this.setAttribute("mixedblockdisabled", true);
_mixedContent.hidden = false;
_mixedContentBlock.hidden = false;
_mixedContentHelpLink.href =
Services.urlFormatter.formatURLPref("app.support.baseURL")
+ "mixed-content";
}
if (this.notification.options.state &
Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT) {
_doorhangerTitle.value =
gNavigatorBundle.getFormattedString(
"badContentBlocked.blocked.message", [this._brandShortName]);
_trackingContent.hidden = false;
_trackingContentUnblock.hidden = false;
_trackingContentHelpLink.href =
Services.urlFormatter.formatURLPref("app.support.baseURL")
+ "tracking-protection";
}
if (this.notification.options.state &
Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT) {
this.setAttribute("trackingblockdisabled", true);
_trackingContent.hidden = false;
_trackingContentBlock.hidden = false;
_trackingContentHelpLink.href =
Services.urlFormatter.formatURLPref("app.support.baseURL")
+ "tracking-protection";
}
]]></constructor>
<method name="disableMixedContentProtection">
<body><![CDATA[
// Use telemetry to measure how often unblocking happens
const kMIXED_CONTENT_UNBLOCK_EVENT = 2;
let histogram =
Services.telemetry.getHistogramById(
"MIXED_CONTENT_UNBLOCK_COUNTER");
histogram.add(kMIXED_CONTENT_UNBLOCK_EVENT);
// Reload the page with the content unblocked
BrowserReloadWithFlags(
nsIWebNavigation.LOAD_FLAGS_ALLOW_MIXED_CONTENT);
]]></body>
</method>
<method name="enableMixedContentProtection">
<body><![CDATA[
gBrowser.selectedBrowser.messageManager.sendAsyncMessage(
"MixedContent:ReenableProtection", {});
BrowserReload();
]]></body>
</method>
<method name="disableTrackingContentProtection">
<body><![CDATA[
// convert document URI into the format used by
// nsChannelClassifier::ShouldEnableTrackingProtection
// (any scheme turned into https is correct)
let normalizedUrl = Services.io.newURI(
"https://" + gBrowser.selectedBrowser.currentURI.hostPort,
null, null);
// Add the current host/port combination in the 'trackingprotection' consumer of
// the permission manager using a normalized URI. This effectively
// places this host/port combination on the tracking protection allowlist.
Services.perms.add(normalizedUrl,
"trackingprotection", Services.perms.ALLOW_ACTION);
BrowserReload();
]]></body>
</method>
<method name="enableTrackingContentProtection">
<body><![CDATA[
// Remove the current host/port combination from the 'trackingprotection' consumer
// of the permission manager. This effectively removes this host/port combination
// from the tracking protection allowlist.
let normalizedUrl = Services.io.newURI(
"https://" + gBrowser.selectedBrowser.currentURI.hostPort,
null, null);
Services.perms.remove(normalizedUrl,
"trackingprotection");
BrowserReload();
]]></body>
</method>
</implementation>
</binding>
<binding id="click-to-play-plugins-notification" extends="chrome://global/content/bindings/notification.xml#popup-notification">
<content align="start" style="width: &pluginNotification.width;;">
<xul:vbox flex="1" align="stretch" class="popup-notification-main-box"

Просмотреть файл

@ -184,6 +184,13 @@ Object.defineProperty(ChromeProfileMigrator.prototype, "sourceHomePageURL", {
}
});
Object.defineProperty(ChromeProfileMigrator.prototype, "sourceLocked", {
get: function Chrome_sourceLocked() {
// There is an exclusive lock on some SQLite databases. Assume they are locked for now.
return true;
},
});
function GetBookmarksResource(aProfileFolder) {
let bookmarksFile = aProfileFolder.clone();
bookmarksFile.append("Bookmarks");

Просмотреть файл

@ -167,6 +167,12 @@ this.MigratorPrototype = {
*/
get sourceHomePageURL() "",
/**
* Override if the data to migrate is locked/in-use and the user should
* probably shutdown the source browser.
*/
get sourceLocked() false,
/**
* DO NOT OVERRIDE - After deCOMing migration, the UI will just call
* getResources.

Просмотреть файл

@ -64,6 +64,15 @@ var MigrationWizard = {
// 1 - Import Source
onImportSourcePageShow: function ()
{
// Show warning message to close the selected browser when needed
function toggleCloseBrowserWarning() {
let visibility = "hidden";
if (group.selectedItem.id != "nothing") {
let migrator = MigrationUtils.getMigrator(group.selectedItem.id);
visibility = migrator.sourceLocked ? "visible" : "hidden";
}
document.getElementById("closeSourceBrowser").style.visibility = visibility;
}
this._wiz.canRewind = false;
var selectedMigrator = null;
@ -86,9 +95,12 @@ var MigrationWizard = {
}
}
if (selectedMigrator)
group.addEventListener("command", toggleCloseBrowserWarning);
if (selectedMigrator) {
group.selectedItem = selectedMigrator;
else {
toggleCloseBrowserWarning();
} else {
// We didn't find a migrator, notify the user
document.getElementById("noSources").hidden = false;

Просмотреть файл

@ -52,6 +52,8 @@
<radio id="nothing" label="&importFromNothing.label;" accesskey="&importFromNothing.accesskey;" hidden="true"/>
</radiogroup>
<label id="noSources" hidden="true">&noMigrationSources.label;</label>
<spacer flex="1"/>
<description class="header" id="closeSourceBrowser" style="visibility:hidden">&closeSourceBrowser.label;</description>
</wizardpage>
<wizardpage id="selectProfile" pageid="selectProfile" label="&selectProfile.title;"

Просмотреть файл

@ -8,7 +8,7 @@
interface nsIArray;
interface nsIProfileStartup;
[scriptable, uuid(30e5a7ec-f71e-4f41-9dbd-7429c02132ec)]
[scriptable, uuid(22b56ffc-3149-43c5-b5a9-b3a6b678de93)]
interface nsIBrowserProfileMigrator : nsISupports
{
/**
@ -43,16 +43,16 @@ interface nsIBrowserProfileMigrator : nsISupports
*/
unsigned short getMigrateData(in jsval aProfile, in boolean aDoingStartup);
/**
* Whether or not there is any data that can be imported from this
/**
* Whether or not there is any data that can be imported from this
* browser (i.e. whether or not it is installed, and there exists
* a user profile)
*/
readonly attribute boolean sourceExists;
/**
* An enumeration of available profiles. If the import source does
/**
* An enumeration of available profiles. If the import source does
* not support profiles, this attribute is null.
*/
readonly attribute jsval sourceProfiles;
@ -61,4 +61,11 @@ interface nsIBrowserProfileMigrator : nsISupports
* The import source homepage. Returns null if not present/available
*/
readonly attribute AUTF8String sourceHomePageURL;
/**
* Whether the source browser data is locked/in-use meaning migration likely
* won't succeed and the user should be warned.
*/
readonly attribute boolean sourceLocked;
};

Просмотреть файл

@ -99,7 +99,7 @@
accesskey="&trackingProtection5.accesskey;"
label="&trackingProtection5.label;" />
<image id="trackingProtectionImage"
src="chrome://browser/skin/bad-content-blocked-16.png"/>
src="chrome://browser/skin/tracking-protection-16.svg"/>
</hbox>
<hbox align="center"
class="indent">

Просмотреть файл

@ -69,8 +69,7 @@
class="showTpDisabled">&trackingProtection.state.disabled;</span>
</div>
<p id="tpDiagram"/>
<p class="showTpEnabled">&trackingProtection.description.enabled;</p>
<p class="showTpDisabled">&trackingProtection.description.disabled;</p>
<p>&trackingProtection.description;</p>
<!-- Use text links to implement plain styled buttons without an href. -->
<label xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
id="disableTrackingProtection"

Просмотреть файл

@ -242,12 +242,11 @@ function getInflatedFrameCache(frameTable) {
* @param number index
* @param object frameTable
* @param object stringTable
* @param object allocationsTable
*/
function getOrAddInflatedFrame(cache, index, frameTable, stringTable, allocationsTable) {
function getOrAddInflatedFrame(cache, index, frameTable, stringTable) {
let inflatedFrame = cache[index];
if (inflatedFrame === null) {
inflatedFrame = cache[index] = new InflatedFrame(index, frameTable, stringTable, allocationsTable);
inflatedFrame = cache[index] = new InflatedFrame(index, frameTable, stringTable);
}
return inflatedFrame;
};
@ -258,9 +257,8 @@ function getOrAddInflatedFrame(cache, index, frameTable, stringTable, allocation
* @param number index
* @param object frameTable
* @param object stringTable
* @param object allocationsTable
*/
function InflatedFrame(index, frameTable, stringTable, allocationsTable) {
function InflatedFrame(index, frameTable, stringTable) {
const LOCATION_SLOT = frameTable.schema.location;
const IMPLEMENTATION_SLOT = frameTable.schema.implementation;
const OPTIMIZATIONS_SLOT = frameTable.schema.optimizations;
@ -274,7 +272,6 @@ function InflatedFrame(index, frameTable, stringTable, allocationsTable) {
this.optimizations = frame[OPTIMIZATIONS_SLOT];
this.line = frame[LINE_SLOT];
this.column = undefined;
this.allocations = allocationsTable ? allocationsTable[index] : 0;
this.category = category;
this.isContent = false;
@ -505,10 +502,10 @@ function getFrameInfo (node, options) {
data.COSTS_CALCULATED = true;
}
if (options && options.allocations && !data.ALLOCATIONS_CALCULATED) {
data.totalAllocations = node.allocations + node.calls.reduce((acc, node) => acc + node.allocations, 0);
data.selfAllocations = node.allocations;
data.ALLOCATIONS_CALCULATED = true;
if (options && options.allocations && !data.ALLOCATION_DATA_CALCULATED) {
data.selfCount = node.youngestFrameSamples;
data.totalCount = node.samples;
data.ALLOCATION_DATA_CALCULATED = true;
}
return data;

Просмотреть файл

@ -37,14 +37,14 @@ function ThreadNode(thread, options = {}) {
this.duration = options.endTime - options.startTime;
this.nodeType = "Thread";
let { samples, stackTable, frameTable, stringTable, allocationsTable } = thread;
let { samples, stackTable, frameTable, stringTable } = thread;
// Nothing to do if there are no samples.
if (samples.data.length === 0) {
return;
}
this._buildInverted(samples, stackTable, frameTable, stringTable, allocationsTable, options);
this._buildInverted(samples, stackTable, frameTable, stringTable, options);
if (!options.invertTree) {
this._uninvert();
}
@ -67,9 +67,6 @@ ThreadNode.prototype = {
* The table of deduplicated frames from the backend.
* @param object stringTable
* The table of deduplicated strings from the backend.
* @param object allocationsTable
* The table of allocation counts from the backend. Indexed by frame
* index.
* @param object options
* Additional supported options
* - number startTime
@ -77,7 +74,7 @@ ThreadNode.prototype = {
* - boolean contentOnly [optional]
* - boolean invertTree [optional]
*/
_buildInverted: function buildInverted(samples, stackTable, frameTable, stringTable, allocationsTable, options) {
_buildInverted: function buildInverted(samples, stackTable, frameTable, stringTable, options) {
function getOrAddFrameNode(calls, isLeaf, frameKey, inflatedFrame, isMetaCategory, leafTable) {
// Insert the inflated frame into the call tree at the current level.
let frameNode;
@ -203,7 +200,7 @@ ThreadNode.prototype = {
// Inflate the frame.
let inflatedFrame = getOrAddInflatedFrame(inflatedFrameCache, frameIndex, frameTable,
stringTable, allocationsTable);
stringTable);
// Compute the frame key.
mutableFrameKeyOptions.isRoot = stackIndex === null;
@ -382,11 +379,10 @@ ThreadNode.prototype = {
* Whether or not this is a platform node that should appear as a
* generalized meta category or not.
*/
function FrameNode(frameKey, { location, line, category, allocations, isContent }, isMetaCategory) {
function FrameNode(frameKey, { location, line, category, isContent }, isMetaCategory) {
this.key = frameKey;
this.location = location;
this.line = line;
this.allocations = allocations;
this.youngestFrameSamples = 0;
this.samples = 0;
this.calls = [];

Просмотреть файл

@ -37,10 +37,10 @@ const DEFAULT_AUTO_EXPAND_DEPTH = 3; // depth
const DEFAULT_VISIBLE_CELLS = {
duration: true,
percentage: true,
allocations: false,
count: false,
selfDuration: true,
selfPercentage: true,
selfAllocations: false,
selfCount: false,
samples: true,
function: true
};
@ -134,30 +134,31 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
*/
_displaySelf: function(document, arrowNode) {
let frameInfo = this.getDisplayedData();
let cells = [];
if (this.visibleCells.duration) {
var durationCell = this._createTimeCell(document, frameInfo.totalDuration);
}
if (this.visibleCells.selfDuration) {
var selfDurationCell = this._createTimeCell(document, frameInfo.selfDuration, true);
cells.push(this._createTimeCell(document, frameInfo.totalDuration));
}
if (this.visibleCells.percentage) {
var percentageCell = this._createExecutionCell(document, frameInfo.totalPercentage);
cells.push(this._createExecutionCell(document, frameInfo.totalPercentage));
}
if (this.visibleCells.count) {
cells.push(this._createCountCell(document, frameInfo.totalCount));
}
if (this.visibleCells.selfDuration) {
cells.push(this._createTimeCell(document, frameInfo.selfDuration, true));
}
if (this.visibleCells.selfPercentage) {
var selfPercentageCell = this._createExecutionCell(document, frameInfo.selfPercentage, true);
cells.push(this._createExecutionCell(document, frameInfo.selfPercentage, true));
}
if (this.visibleCells.allocations) {
var allocationsCell = this._createAllocationsCell(document, frameInfo.totalAllocations);
}
if (this.visibleCells.selfAllocations) {
var selfAllocationsCell = this._createAllocationsCell(document, frameInfo.selfAllocations, true);
if (this.visibleCells.selfCount) {
cells.push(this._createCountCell(document, frameInfo.selfCount, true));
}
if (this.visibleCells.samples) {
var samplesCell = this._createSamplesCell(document, frameInfo.samples);
cells.push(this._createSamplesCell(document, frameInfo.samples));
}
if (this.visibleCells.function) {
var functionCell = this._createFunctionCell(document, arrowNode, frameInfo.name, frameInfo, this.level);
cells.push(this._createFunctionCell(document, arrowNode, frameInfo.name, frameInfo, this.level));
}
let targetNode = document.createElement("hbox");
@ -169,29 +170,9 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
if (this.hidden) {
targetNode.style.display = "none";
}
if (this.visibleCells.duration) {
targetNode.appendChild(durationCell);
}
if (this.visibleCells.percentage) {
targetNode.appendChild(percentageCell);
}
if (this.visibleCells.allocations) {
targetNode.appendChild(allocationsCell);
}
if (this.visibleCells.selfDuration) {
targetNode.appendChild(selfDurationCell);
}
if (this.visibleCells.selfPercentage) {
targetNode.appendChild(selfPercentageCell);
}
if (this.visibleCells.selfAllocations) {
targetNode.appendChild(selfAllocationsCell);
}
if (this.visibleCells.samples) {
targetNode.appendChild(samplesCell);
}
if (this.visibleCells.function) {
targetNode.appendChild(functionCell);
for (let i = 0; i < cells.length; i++) {
targetNode.appendChild(cells[i]);
}
return targetNode;
@ -239,10 +220,10 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
cell.setAttribute("value", L10N.numberWithDecimals(percentage, 2) + PERCENTAGE_UNITS);
return cell;
},
_createAllocationsCell: function(doc, count, isSelf = false) {
_createCountCell: function(doc, count, isSelf = false) {
let cell = doc.createElement("description");
cell.className = "plain call-tree-cell";
cell.setAttribute("type", isSelf ? "self-allocations" : "allocations");
cell.setAttribute("type", isSelf ? "self-count" : "count");
cell.setAttribute("crop", "end");
cell.setAttribute("value", count || 0);
return cell;
@ -356,7 +337,7 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
return this._cachedDisplayedData = this.frame.getInfo({
root: this.root.frame,
allocations: (this.visibleCells.allocations || this.visibleCells.selfAllocations)
allocations: (this.visibleCells.count || this.visibleCells.selfCount)
});
/**

Просмотреть файл

@ -305,12 +305,12 @@
<vbox id="memory-calltree-view" flex="1">
<hbox class="call-tree-headers-container">
<label class="plain call-tree-header"
type="allocations"
type="count"
crop="end"
value="&performanceUI.table.totalAlloc;"
tooltiptext="&performanceUI.table.totalAlloc.tooltip;"/>
<label class="plain call-tree-header"
type="self-allocations"
type="self-count"
crop="end"
value="&performanceUI.table.selfAlloc;"
tooltiptext="&performanceUI.table.selfAlloc.tooltip;"/>

Просмотреть файл

@ -12,7 +12,7 @@ function* spawnTest() {
Services.prefs.setBoolPref(MEMORY_PREF, true);
yield startRecording(panel);
yield busyWait(1000);
yield busyWait(100);
let rendered = once(MemoryCallTreeView, EVENTS.MEMORY_CALL_TREE_RENDERED);
yield stopRecording(panel);
@ -23,10 +23,10 @@ function* spawnTest() {
testCells($, $$, {
"duration": false,
"percentage": false,
"allocations": true,
"count": true,
"self-duration": false,
"self-percentage": false,
"self-allocations": true,
"self-count": true,
"samples": false,
"function": true
});

Просмотреть файл

@ -96,8 +96,8 @@ let MemoryCallTreeView = Heritage.extend(DetailsSubview, {
// Some cells like the time duration and cost percentage don't make sense
// for a memory allocations call tree.
visibleCells: {
allocations: true,
selfAllocations: true,
selfCount: true,
count: true,
function: true
}
});

Просмотреть файл

@ -101,7 +101,6 @@ let FramesListView = {
}
this._selectedItem = target;
target.classList.add("selected");
console.log("Emitting select on", this, frame);
this.emit("select", frame);
break;
}

Просмотреть файл

@ -1706,6 +1706,10 @@ CssRuleView.prototype = {
return promise.resolve(undefined);
}
if (this.popup.isOpen) {
this.popup.hidePopup();
}
this.clear();
this.clearPseudoClassPanel();
@ -2208,6 +2212,7 @@ CssRuleView.prototype = {
let isComputedHighlighted = false;
// Highlight search matches in the computed list of properties
editor._populateComputed();
for (let computed of editor.prop.computed) {
if (computed.element) {
// Get the actual property value displayed in the computed list
@ -2837,6 +2842,7 @@ function TextPropertyEditor(aRuleEditor, aProperty) {
this.prop = aProperty;
this.prop.editor = this;
this.browserWindow = this.doc.defaultView.top;
this._populatedComputed = false;
this._onEnableClicked = this._onEnableClicked.bind(this);
this._onExpandClicked = this._onExpandClicked.bind(this);
@ -3179,15 +3185,30 @@ TextPropertyEditor.prototype = {
},
/**
* Populate the list of computed styles.
* Update the indicator for computed styles. The computed styles themselves
* are populated on demand, when they become visible.
*/
_updateComputed: function() {
// Clear out existing viewers.
while (this.computed.hasChildNodes()) {
this.computed.removeChild(this.computed.lastChild);
}
this.computed.innerHTML = "";
let showExpander = this.prop.computed.some(c => c.name !== this.prop.name);
this.expander.style.visibility = showExpander ? "visible" : "hidden";
this._populatedComputed = false;
if (this.expander.hasAttribute("open")) {
this._populateComputed();
}
},
/**
* Populate the list of computed styles.
*/
_populateComputed: function() {
if (this._populatedComputed) {
return;
}
this._populatedComputed = true;
let showExpander = false;
for (let computed of this.prop.computed) {
// Don't bother to duplicate information already
// shown in the text property.
@ -3195,8 +3216,6 @@ TextPropertyEditor.prototype = {
continue;
}
showExpander = true;
let li = createChild(this.computed, "li", {
class: "ruleview-computed"
});
@ -3234,13 +3253,6 @@ TextPropertyEditor.prototype = {
// styles
computed.element = li;
}
// Show or hide the expander as needed.
if (showExpander) {
this.expander.style.visibility = "visible";
} else {
this.expander.style.visibility = "hidden";
}
},
/**
@ -3273,6 +3285,7 @@ TextPropertyEditor.prototype = {
} else {
this.expander.setAttribute("open", "true");
this.computed.setAttribute("user-open", "");
this._populateComputed();
}
aEvent.stopPropagation();
@ -3287,6 +3300,7 @@ TextPropertyEditor.prototype = {
if (!this.computed.hasAttribute("user-open")) {
this.expander.setAttribute("open", "true");
this.computed.setAttribute("filter-open", "");
this._populateComputed();
}
},

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -74,6 +74,9 @@ support-files =
[browser_ruleview_completion-existing-property_02.js]
[browser_ruleview_completion-new-property_01.js]
[browser_ruleview_completion-new-property_02.js]
[browser_ruleview_computed_01.js]
[browser_ruleview_computed_02.js]
[browser_ruleview_completion-popup-hidden-after-navigation.js]
[browser_ruleview_content_01.js]
[browser_ruleview_content_02.js]
skip-if = e10s # Bug 1039528: "inspect element" contextual-menu doesn't work with e10s

Просмотреть файл

@ -0,0 +1,38 @@
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that the ruleview autocomplete popup is hidden after page navigation
let TEST_URL = "data:text/html;charset=utf-8,<h1 style='font: 24px serif'></h1>";
add_task(function*() {
yield addTab(TEST_URL);
let {inspector, view} = yield openRuleView();
info("Test autocompletion popup is hidden after page navigation");
info("Selecting the test node");
yield selectNode("h1", inspector);
info("Focusing the css property editable field");
let propertyName = view.styleDocument.querySelectorAll(".ruleview-propertyname")[0];
let editor = yield focusEditableField(view, propertyName);
info("Pressing key VK_DOWN");
let onSuggest = once(editor.input, "keypress");
EventUtils.synthesizeKey("VK_DOWN", {}, view.styleWindow);
info("Waiting for autocomplete popup to be displayed");
yield onSuggest;
yield wait(1);
ok(view.popup && view.popup.isOpen, "Popup should be opened");
info("Reloading the page");
yield reloadPage(inspector);
ok(!(view.popup && view.popup.isOpen), "Popup should be closed");
});

Просмотреть файл

@ -0,0 +1,47 @@
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Tests that the rule view shows expanders for properties with computed lists.
let TEST_URI = `
<style type="text/css">
#testid {
margin: 4px;
top: 0px;
}
</style>
<h1 id="testid">Styled Node</h1>
`;
add_task(function*() {
yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
let {inspector, view} = yield openRuleView();
yield selectNode("#testid", inspector);
yield testExpandersShown(inspector, view);
});
function* testExpandersShown(inspector, view) {
let rule = getRuleViewRuleEditor(view, 1).rule;
info("Check that the correct rules are visible");
is(rule.selectorText, "#testid", "Second rule is #testid.");
is(rule.textProps[0].name, "margin", "First property is margin.");
is(rule.textProps[1].name, "top", "Second property is top.");
info("Check that the expanders are shown correctly");
is(rule.textProps[0].editor.expander.style.visibility, "visible",
"margin expander is visible.");
is(rule.textProps[1].editor.expander.style.visibility, "hidden",
"top expander is hidden.");
ok(!rule.textProps[0].editor.expander.hasAttribute("open"),
"margin computed list is closed.");
ok(!rule.textProps[1].editor.expander.hasAttribute("open"),
"top computed list is closed.");
ok(!rule.textProps[0].editor.computed.hasChildNodes(),
"margin computed list is empty before opening.");
ok(!rule.textProps[1].editor.computed.hasChildNodes(),
"top computed list is empty.");
}

Просмотреть файл

@ -0,0 +1,68 @@
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Tests that the rule view computed lists can be expanded/collapsed,
// and contain the right subproperties.
let TEST_URI = `
<style type="text/css">
#testid {
margin: 0px 1px 2px 3px;
top: 0px;
}
</style>
<h1 id="testid">Styled Node</h1>
`;
add_task(function*() {
yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
let {inspector, view} = yield openRuleView();
yield selectNode("#testid", inspector);
yield testComputedList(inspector, view);
});
function* testComputedList(inspector, view) {
let rule = getRuleViewRuleEditor(view, 1).rule;
let propEditor = rule.textProps[0].editor;
let expander = propEditor.expander;
ok(!expander.hasAttribute("open"), "margin computed list is closed");
info("Opening the computed list of margin property")
expander.click();
ok(expander.hasAttribute("open"), "margin computed list is open");
let computed = propEditor.prop.computed;
let computedDom = propEditor.computed;
let propNames = [
"margin-top",
"margin-right",
"margin-bottom",
"margin-left"
];
is(computed.length, propNames.length, "There should be 4 computed values");
is(computedDom.children.length, propNames.length, "There should be 4 nodes in the DOM");
propNames.forEach((propName, i) => {
let propValue = i + "px";
is(computed[i].name, propName, "Computed property #" + i + " has name " + propName);
is(computed[i].value, propValue, "Computed property #" + i + " has value " + propValue);
is(computedDom.getElementsByClassName("ruleview-propertyname")[i].textContent, propName,
"Computed property #" + i + " in DOM has correct name");
is(computedDom.getElementsByClassName("ruleview-propertyvalue")[i].textContent, propValue,
"Computed property #" + i + " in DOM has correct value");
});
info("Closing the computed list of margin property")
expander.click();
ok(!expander.hasAttribute("open"), "margin computed list is closed");
info("Opening the computed list of margin property")
expander.click();
ok(expander.hasAttribute("open"), "margin computed list is open");
is(computed.length, propNames.length, "Still 4 computed values");
is(computedDom.children.length, propNames.length, "Still 4 nodes in the DOM");
}

Просмотреть файл

@ -196,7 +196,10 @@ function* checkCopyStyle(view, node, menuItem, expectedPattern, hidden) {
{button: 2, type: "contextmenu"}, view.styleWindow);
yield onPopup;
is(view._contextmenu.menuitemCopy.hidden, true, "Copy hidden is as expected: true");
ok(view._contextmenu.menuitemCopy.disabled,
"Copy disabled is as expected: true");
ok(!view._contextmenu.menuitemCopy.hidden,
"Copy hidden is as expected: false");
is(view._contextmenu.menuitemCopyLocation.hidden,
hidden.copyLocation,

Просмотреть файл

@ -64,4 +64,12 @@ function* editAndCheck(view) {
is(computed[i].name, propName, "Computed property #" + i + " has name " + propName);
is(computed[i].value, newPaddingValue, "Computed value of " + propName + " is as expected");
});
propEditor.expander.click();
let computedDom = propEditor.computed;
is(computedDom.children.length, propNames.length, "There should be 4 nodes in the DOM");
propNames.forEach((propName, i) => {
is(computedDom.getElementsByClassName("ruleview-propertyvalue")[i].textContent,
newPaddingValue, "Computed value of " + propName + " in DOM is as expected");
});
}

Просмотреть файл

@ -197,10 +197,12 @@ skip-if = buildapp == 'mulet'
[browser_warn_user_about_replaced_api.js]
[browser_webconsole_abbreviate_source_url.js]
[browser_webconsole_allow_mixedcontent_securityerrors.js]
tags = mcb
skip-if = buildapp == 'mulet'
[browser_webconsole_assert.js]
[browser_webconsole_basic_net_logging.js]
[browser_webconsole_block_mixedcontent_securityerrors.js]
tags = mcb
skip-if = buildapp == 'mulet'
[browser_webconsole_bug_579412_input_focus.js]
[browser_webconsole_bug_580001_closing_after_completion.js]

Просмотреть файл

@ -63,34 +63,12 @@ function pushPrefEnv() {
return deferred.promise;
}
function waitForNotificationShown(notification, callback) {
if (PopupNotifications.panel.state == "open") {
executeSoon(callback);
return;
}
PopupNotifications.panel.addEventListener("popupshown", function onShown() {
PopupNotifications.panel.removeEventListener("popupshown", onShown);
callback();
}, false);
notification.reshow();
}
function mixedContentOverrideTest2(hud, browser) {
let notification = PopupNotifications.getNotification("bad-content", browser);
ok(notification, "Mixed Content Doorhanger did appear");
let deferred = promise.defer();
waitForNotificationShown(notification, () => {
afterNotificationShown(hud, notification, deferred);
});
return deferred.promise;
}
function afterNotificationShown(hud, notification, deferred) {
ok(PopupNotifications.panel.firstChild.isMixedContentBlocked,
"OK: Mixed Content is being blocked");
// Click on the doorhanger.
PopupNotifications.panel.firstChild.disableMixedContentProtection();
notification.remove();
let {gIdentityHandler} = browser.ownerGlobal;
ok(gIdentityHandler._identityBox.classList.contains("mixedActiveBlocked"),
"Mixed Active Content state appeared on identity box");
gIdentityHandler.disableMixedContentProtection();
waitForMessages({
webconsole: hud,
@ -114,6 +92,8 @@ function afterNotificationShown(hud, notification, deferred) {
},
],
}).then(msgs => deferred.resolve(msgs), Cu.reportError);
return deferred.promise;
}
function testClickOpenNewTab(hud, match) {

Просмотреть файл

@ -13,19 +13,21 @@
-->
<!ENTITY aboutPrivateBrowsing.width "25em">
<!ENTITY aboutPrivateBrowsing.title "You're browsing privately">
<!ENTITY aboutPrivateBrowsing.subtitle "&brandShortName; won't remember any history for this window.">
<!ENTITY aboutPrivateBrowsing.subtitle "In this window, &brandShortName; will not remember any history.">
<!ENTITY aboutPrivateBrowsing.forgotten "In this window, &brandShortName; will not remember:">
<!ENTITY aboutPrivateBrowsing.info.forgotten "Forgotten">
<!ENTITY aboutPrivateBrowsing.info.history "History">
<!ENTITY aboutPrivateBrowsing.info.search "Search">
<!ENTITY aboutPrivateBrowsing.info.search "Searches">
<!ENTITY aboutPrivateBrowsing.info.cookies "Cookies">
<!ENTITY aboutPrivateBrowsing.info.temporaryFiles "Temporary Files">
<!ENTITY aboutPrivateBrowsing.kept "&brandShortName; will keep:">
<!ENTITY aboutPrivateBrowsing.info.kept "Kept">
<!ENTITY aboutPrivateBrowsing.info.downloads "Downloads">
<!ENTITY aboutPrivateBrowsing.info.bookmarks "Bookmarks">
<!ENTITY aboutPrivateBrowsing.note "Your employer or Internet service provider can still track the pages you visit.">
<!ENTITY aboutPrivateBrowsing.note "Please note that your employer or Internet service provider can still track the pages you visit.">
<!ENTITY aboutPrivateBrowsing.learnMore "Learn More.">
<!-- LOCALIZATION NOTE (trackingProtection.width):
@ -42,8 +44,7 @@
<!ENTITY trackingProtection.state.enabled "ON">
<!ENTITY trackingProtection.state.disabled "OFF">
<!ENTITY trackingProtection.description.enabled "Private Windows now block content that tracks your browsing activity.">
<!ENTITY trackingProtection.description.disabled "Private Windows will not block content that tracks your browsing activity.">
<!ENTITY trackingProtection.description "Private Windows now block parts of the page that may track your browsing activity.">
<!ENTITY trackingProtection.disable "Turn Tracking Protection Off">
<!ENTITY trackingProtection.enable "Turn Tracking Protection On">

Просмотреть файл

@ -792,19 +792,6 @@ you can use these alternative items. Otherwise, their values should be empty. -
<!ENTITY getUserMedia.audioCapture.label "Audio from the tab will be shared.">
<!ENTITY getUserMedia.allWindowsShared.message "All visible windows on your screen will be shared.">
<!-- Bad Content Blocker Doorhanger Notification -->
<!ENTITY badContentBlocked.moreinfo "Most websites will work properly even if content is blocked.">
<!ENTITY mixedContentBlocked2.message "Insecure content">
<!ENTITY mixedContentBlocked2.moreinfo "Some unencrypted elements on this website have been blocked.">
<!ENTITY mixedContentBlocked2.learnMore "Learn More">
<!ENTITY mixedContentBlocked2.options "Options">
<!ENTITY mixedContentBlocked2.unblock.label "Disable protection for now">
<!ENTITY mixedContentBlocked2.unblock.accesskey "D">
<!ENTITY mixedContentBlocked2.block.label "Enable protection">
<!ENTITY mixedContentBlocked2.block.accesskey "E">
<!ENTITY mixedContentBlocked2.disabled.message "Protection is disabled">
<!ENTITY trackingProtection.title "Tracking Protection">
<!ENTITY trackingProtection.detectedBlocked3 "&brandShortName; is blocking parts of the page that may track your browsing.">
<!ENTITY trackingProtection.detectedNotBlocked3 "This site includes elements that may track your browsing. You have disabled protection.">

Просмотреть файл

@ -43,3 +43,4 @@
<!ENTITY done.title "Import Complete">
<!ENTITY done.label "The following items were successfully imported:">
<!ENTITY closeSourceBrowser.label "Please ensure the selected browser is closed before continuing.">

Просмотреть файл

@ -8,10 +8,10 @@
<!ENTITY dntTrackingNotOkay4.accesskey "n">
<!ENTITY doNotTrackInfo.label "Learn More">
<!ENTITY trackingProtection5.label "Use Tracking Protection">
<!ENTITY trackingProtection5.accesskey "m">
<!ENTITY trackingProtection5.accesskey "i">
<!ENTITY trackingProtectionLearnMore.label "Learn more">
<!ENTITY trackingProtectionPBM5.label "Use Tracking Protection in Private Windows">
<!ENTITY trackingProtectionPBM5.accesskey "y">
<!ENTITY trackingProtectionPBM5.accesskey "v">
<!ENTITY trackingProtectionPBMLearnMore.label "Learn more">
<!ENTITY history.label "History">

Просмотреть файл

@ -1745,7 +1745,6 @@ toolbarbutton.chevron > .toolbarbutton-icon {
%include ../shared/devtools/responsivedesign.inc.css
%include ../shared/devtools/commandline.inc.css
%include ../shared/plugin-doorhanger.inc.css
%include ../shared/badcontent-doorhanger.inc.css
%include ../shared/login-doorhanger.inc.css
%include downloads/indicator.css

Двоичные данные
browser/themes/linux/customizableui/thumburger-inverted.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 411 B

Двоичные данные
browser/themes/linux/customizableui/thumburger.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 453 B

Просмотреть файл

@ -66,11 +66,6 @@ browser.jar:
skin/classic/browser/menuPanel-help@2x.png
skin/classic/browser/menuPanel-small.png
skin/classic/browser/menuPanel-small@2x.png
skin/classic/browser/bad-content-blocked-16.png (../shared/bad-content-blocked-16.png)
skin/classic/browser/bad-content-blocked-16@2x.png (../shared/bad-content-blocked-16@2x.png)
skin/classic/browser/bad-content-blocked-64.png (../shared/bad-content-blocked-64.png)
skin/classic/browser/bad-content-unblocked-16.png (../shared/bad-content-unblocked-16.png)
skin/classic/browser/bad-content-unblocked-64.png (../shared/bad-content-unblocked-64.png)
skin/classic/browser/monitor.png
skin/classic/browser/monitor_16-10.png
skin/classic/browser/notification-16.png
@ -164,6 +159,8 @@ browser.jar:
* skin/classic/browser/customizableui/panelUIOverlay.css (customizableui/panelUIOverlay.css)
skin/classic/browser/customizableui/subView-arrow-back-inverted.png (../shared/customizableui/subView-arrow-back-inverted.png)
skin/classic/browser/customizableui/subView-arrow-back-inverted-rtl.png (../shared/customizableui/subView-arrow-back-inverted-rtl.png)
skin/classic/browser/customizableui/thumburger.png (customizableui/thumburger.png)
skin/classic/browser/customizableui/thumburger-inverted.png (customizableui/thumburger-inverted.png)
skin/classic/browser/customizableui/whimsy.png (../shared/customizableui/whimsy.png)
skin/classic/browser/customizableui/whimsy@2x.png (../shared/customizableui/whimsy@2x.png)
skin/classic/browser/customizableui/whimsy-bw.png (../shared/customizableui/whimsy-bw.png)

Просмотреть файл

@ -1661,6 +1661,11 @@ toolbarbutton[constrain-size="true"][cui-areatype="toolbar"] > .toolbarbutton-ba
%include ../shared/identity-block/identity-block.inc.css
#identity-box {
padding-top: 2px;
padding-bottom: 2px;
}
#urlbar:not([focused="true"]) > #identity-box {
margin-top: -1px;
margin-bottom: -1px;
@ -3362,7 +3367,6 @@ notification[value="loop-sharing-notification"] .messageImage {
%include ../shared/devtools/responsivedesign.inc.css
%include ../shared/devtools/commandline.inc.css
%include ../shared/plugin-doorhanger.inc.css
%include ../shared/badcontent-doorhanger.inc.css
%include ../shared/login-doorhanger.inc.css
%include downloads/indicator.css

Двоичные данные
browser/themes/osx/customizableui/thumburger-inverted.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 427 B

Двоичные данные
browser/themes/osx/customizableui/thumburger-inverted@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 809 B

Двоичные данные
browser/themes/osx/customizableui/thumburger-yosemite.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 263 B

Двоичные данные
browser/themes/osx/customizableui/thumburger-yosemite@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 477 B

Двоичные данные
browser/themes/osx/customizableui/thumburger.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 388 B

Двоичные данные
browser/themes/osx/customizableui/thumburger@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 891 B

Просмотреть файл

@ -97,6 +97,8 @@
#identity-box {
margin-top: -1px !important;
margin-bottom: -1px !important;
padding-top: 3px !important;
padding-bottom: 3px !important;
}
/* Tab styling - make sure to use an inverted icon for the selected tab

Просмотреть файл

@ -80,14 +80,6 @@ browser.jar:
skin/classic/browser/menuPanel-help@2x.png
skin/classic/browser/menuPanel-small.png
skin/classic/browser/menuPanel-small@2x.png
skin/classic/browser/bad-content-blocked-16.png (../shared/bad-content-blocked-16.png)
skin/classic/browser/bad-content-blocked-16@2x.png (../shared/bad-content-blocked-16@2x.png)
skin/classic/browser/bad-content-blocked-64.png (../shared/bad-content-blocked-64.png)
skin/classic/browser/bad-content-blocked-64@2x.png (../shared/bad-content-blocked-64@2x.png)
skin/classic/browser/bad-content-unblocked-16.png (../shared/bad-content-unblocked-16.png)
skin/classic/browser/bad-content-unblocked-16@2x.png (../shared/bad-content-unblocked-16@2x.png)
skin/classic/browser/bad-content-unblocked-64.png (../shared/bad-content-unblocked-64.png)
skin/classic/browser/bad-content-unblocked-64@2x.png (../shared/bad-content-unblocked-64@2x.png)
skin/classic/browser/panel-expander-closed.png
skin/classic/browser/panel-expander-closed@2x.png
skin/classic/browser/panel-expander-open.png
@ -218,6 +210,10 @@ browser.jar:
skin/classic/browser/customizableui/subView-arrow-back-inverted-rtl.png (../shared/customizableui/subView-arrow-back-inverted-rtl.png)
skin/classic/browser/customizableui/subView-arrow-back-inverted-rtl@2x.png (../shared/customizableui/subView-arrow-back-inverted-rtl@2x.png)
* skin/classic/browser/customizableui/panelUIOverlay.css (customizableui/panelUIOverlay.css)
skin/classic/browser/customizableui/thumburger-inverted.png (customizableui/thumburger-inverted.png)
skin/classic/browser/customizableui/thumburger-inverted@2x.png (customizableui/thumburger-inverted@2x.png)
skin/classic/browser/customizableui/thumburger.png (customizableui/thumburger.png)
skin/classic/browser/customizableui/thumburger@2x.png (customizableui/thumburger@2x.png)
skin/classic/browser/customizableui/whimsy.png (../shared/customizableui/whimsy.png)
skin/classic/browser/customizableui/whimsy@2x.png (../shared/customizableui/whimsy@2x.png)
skin/classic/browser/customizableui/whimsy-bw.png (../shared/customizableui/whimsy-bw.png)
@ -619,6 +615,8 @@ browser.jar:
skin/classic/browser/yosemite/reload-stop-go@2x.png (reload-stop-go-yosemite@2x.png)
skin/classic/browser/yosemite/sync-horizontalbar.png (sync-horizontalbar-yosemite.png)
skin/classic/browser/yosemite/sync-horizontalbar@2x.png (sync-horizontalbar-yosemite@2x.png)
skin/classic/browser/yosemite/thumburger.png (customizableui/thumburger-yosemite.png)
skin/classic/browser/yosemite/thumburger@2x.png (customizableui/thumburger-yosemite@2x.png)
skin/classic/browser/notification-pluginNormal.png (../shared/plugins/notification-pluginNormal.png)
skin/classic/browser/notification-pluginAlert.png (../shared/plugins/notification-pluginAlert.png)
skin/classic/browser/notification-pluginBlocked.png (../shared/plugins/notification-pluginBlocked.png)
@ -649,6 +647,8 @@ browser.jar:
% override chrome://browser/skin/places/toolbar.png chrome://browser/skin/lion/places/toolbar.png os=Darwin osversion>=10.7
% override chrome://browser/skin/Toolbar.png chrome://browser/skin/yosemite/Toolbar.png os=Darwin osversion>=10.10
% override chrome://browser/skin/Toolbar@2x.png chrome://browser/skin/yosemite/Toolbar@2x.png os=Darwin osversion>=10.10
% override chrome://browser/skin/customizableui/thumburger.png chrome://browser/skin/yosemite/thumburger.png os=Darwin osversion>=10.10
% override chrome://browser/skin/customizableui/thumburger@2x.png chrome://browser/skin/yosemite/thumburger@2x.png os=Darwin osversion>=10.10
% override chrome://browser/skin/menuPanel.png chrome://browser/skin/yosemite/menuPanel.png os=Darwin osversion>=10.10
% override chrome://browser/skin/menuPanel@2x.png chrome://browser/skin/yosemite/menuPanel@2x.png os=Darwin osversion>=10.10
% override chrome://browser/skin/loop/menuPanel.png chrome://browser/skin/yosemite/loop/menuPanel.png os=Darwin osversion>=10.10

Двоичные данные
browser/themes/shared/bad-content-blocked-16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 346 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 691 B

Двоичные данные
browser/themes/shared/bad-content-blocked-64.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 462 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 831 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.3 KiB

Просмотреть файл

@ -1,21 +0,0 @@
.popup-notification-item-title[popupid="bad-content"] {
font-weight: bold;
}
.popup-notification-item-message[popupid="bad-content"] {
width: 17em;
}
.popup-notification-item-message[popupid="bad-content"][mixedblockdisabled]:not(.popup-notification-item-message-critical),
.popup-notification-item-message[popupid="bad-content"][trackingblockdisabled]:not(.popup-notification-item-message-critical) {
color: GrayText;
}
.popup-notification-item-message-critical[popupid="bad-content"] {
color: #d74345;
font-style: italic;
}
.popup-notification-footer[popupid="bad-content"] {
padding-top: 1em;
}

Просмотреть файл

@ -10,6 +10,7 @@
--tab-toolbar-navbar-overlap: 0px;
--space-above-tabbar: 0px;
--toolbarbutton-text-shadow: none;
--backbutton-urlbar-overlap: 0px;
}
:root[devtoolstheme="dark"] {

Просмотреть файл

@ -221,10 +221,10 @@
width: 4.5vw;
}
.call-tree-header[type="allocations"],
.call-tree-cell[type="allocations"],
.call-tree-header[type="self-allocations"],
.call-tree-cell[type="self-allocations"] {
.call-tree-header[type="count"],
.call-tree-cell[type="count"],
.call-tree-header[type="self-count"],
.call-tree-cell[type="self-count"] {
width: 9vw;
}

Просмотреть файл

@ -25,7 +25,7 @@
transparent 85%);
border-image-slice: 1;
font-size: .9em;
padding: 2px 5px;
padding: 3px 5px;
margin-inline-end: 4px;
overflow: hidden;
}

Просмотреть файл

@ -70,15 +70,6 @@
list-style-image: url(chrome://global/skin/icons/webapps-64.png);
}
.popup-notification-icon[popupid="bad-content"] {
list-style-image: url(chrome://browser/skin/bad-content-blocked-64.png);
}
.popup-notification-icon[popupid="bad-content"][mixedblockdisabled],
.popup-notification-icon[popupid="bad-content"][trackingblockdisabled] {
list-style-image: url(chrome://browser/skin/bad-content-unblocked-64.png);
}
.popup-notification-icon[popupid="webRTC-sharingDevices"],
.popup-notification-icon[popupid="webRTC-shareDevices"] {
list-style-image: url(chrome://browser/skin/webRTC-shareDevice-64.png);
@ -221,16 +212,6 @@
}
}
.bad-content-blocked-notification-icon,
#bad-content-blocked-notification-icon {
list-style-image: url(chrome://browser/skin/bad-content-blocked-16.png);
}
.bad-content-unblocked-notification-icon,
#bad-content-unblocked-notification-icon {
list-style-image: url(chrome://browser/skin/bad-content-unblocked-16.png);
}
.webRTC-shareDevices-notification-icon,
#webRTC-shareDevices-notification-icon {
list-style-image: url(chrome://browser/skin/webRTC-shareDevice-16.png);
@ -421,14 +402,6 @@
-moz-image-region: rect(0, 96px, 32px, 64px);
}
#bad-content-blocked-notification-icon {
list-style-image: url(chrome://browser/skin/bad-content-blocked-16@2x.png);
}
#bad-content-unblocked-notification-icon {
list-style-image: url(chrome://browser/skin/bad-content-unblocked-16@2x.png);
}
.web-notifications-notification-icon,
#web-notifications-notification-icon {
list-style-image: url(chrome://browser/skin/notification-16@2x.png);
@ -463,15 +436,6 @@
list-style-image: url(chrome://browser/skin/notification-64@2x.png);
}
.popup-notification-icon[popupid="bad-content"] {
list-style-image: url(chrome://browser/skin/bad-content-blocked-64@2x.png);
}
.popup-notification-icon[popupid="bad-content"][mixedblockdisabled],
.popup-notification-icon[popupid="bad-content"][trackingblockdisabled] {
list-style-image: url(chrome://browser/skin/bad-content-unblocked-64@2x.png);
}
.popup-notification-icon[popupid="pointerLock"] {
list-style-image: url(chrome://browser/skin/pointerLock-64@2x.png);
}

Просмотреть файл

@ -12,6 +12,7 @@
--tab-separator-image: url(chrome://browser/skin/tabbrowser/tab-separator.png);
--tab-separator-size: 3px 100%;
--tab-separator-opacity: 1;
--tab-stroke-background-size: auto 100%;
}
%define tabCurveWidth 30px
@ -376,7 +377,7 @@
@fgTabTexture@,
none;
background-repeat: repeat-x;
background-size: auto 100%;
background-size: var(--tab-stroke-background-size), auto 100%;
/* The padding-top combined with background-clip: content-box (the bottom-most) ensure the
background-color doesn't extend above the top border. */
padding-top: 2px;
@ -390,7 +391,7 @@
@fgTabTextureLWT@;/*,
lwtHeader;*/
/* Don't stretch the LWT header images */
background-size: auto 100%, auto 100%, auto auto;
background-size: var(--tab-stroke-background-size), auto 100%, auto auto;
}
/* These LWT styles are normally overridden by browser-lightweightTheme.css */

Просмотреть файл

@ -124,6 +124,15 @@ toolbar[brighttext] #sync-button[status="active"] {
-moz-image-region: rect(0, 486px, 18px, 468px);
}
#PanelUI-menu-button.thumburger {
list-style-image: url("chrome://browser/skin/customizableui/thumburger.png") !important;
-moz-image-region: auto !important;
}
toolbar[brighttext] #PanelUI-menu-button.thumburger {
list-style-image: url("chrome://browser/skin/customizableui/thumburger-inverted.png") !important;
}
#edit-controls:not(@inAnyPanel@) > #cut-button {
-moz-image-region: rect(0, 504px, 18px, 486px);
}
@ -430,6 +439,14 @@ toolbar[brighttext] #loop-button {
%endif
}
#PanelUI-menu-button.thumburger {
list-style-image: url("chrome://browser/skin/customizableui/thumburger@2x.png") !important;
}
toolbar[brighttext] #PanelUI-menu-button.thumburger {
list-style-image: url("chrome://browser/skin/customizableui/thumburger-inverted@2x.png") !important;
}
#loop-button {
list-style-image: url("chrome://browser/skin/loop/toolbar@2x.png");
-moz-image-region: rect(0, 36px, 36px, 0);

Просмотреть файл

@ -317,7 +317,6 @@
#nav-bar {
background-clip: padding-box;
background-image: linear-gradient(@toolbarHighlight@, transparent);
box-shadow: 0 1px 0 @toolbarHighlight@ inset;
}
@media (-moz-os-version: windows-xp),
@ -326,6 +325,7 @@
(-moz-os-version: windows-win8) {
#nav-bar {
border-top: 1px solid @toolbarShadowColor@ !important;
box-shadow: 0 1px 0 @toolbarHighlight@ inset;
}
@media not all and (-moz-windows-compositor) {
#TabsToolbar[collapsed="true"] + #nav-bar {
@ -609,12 +609,20 @@ menuitem.bookmark-item {
#loop-button {
list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver.png)
}
#PanelUI-menu-button.thumburger {
list-style-image: url("chrome://browser/skin/customizableui/thumburger-lunaSilver.png") !important;
}
}
@media (-moz-windows-theme: luna-silver) and (min-resolution: 1.1dppx) {
#loop-button {
list-style-image: url(chrome://browser/skin/loop/toolbar-lunaSilver@2x.png)
}
#PanelUI-menu-button.thumburger {
list-style-image: url("chrome://browser/skin/customizableui/thumburger-lunaSilver@2x.png") !important;
}
}
#main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-icon,
@ -2050,10 +2058,8 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action-
content: none;
}
.tab-background-middle[visuallyselected=true] {
/* Setting background-size to "0 0" for the first
background-image to remove the stroke. */
background-size: 0 0, auto 100%, auto 100%;
#TabsToolbar {
--tab-stroke-background-size: 0 0;
}
:root {
@ -2589,7 +2595,6 @@ notification[value="loop-sharing-notification"] .messageImage {
%include ../shared/devtools/responsivedesign.inc.css
%include ../shared/devtools/commandline.inc.css
%include ../shared/plugin-doorhanger.inc.css
%include ../shared/badcontent-doorhanger.inc.css
%include ../shared/login-doorhanger.inc.css
%include downloads/indicator.css

Двоичные данные
browser/themes/windows/customizableui/thumburger-XP.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 610 B

Двоичные данные
browser/themes/windows/customizableui/thumburger-XP@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Двоичные данные
browser/themes/windows/customizableui/thumburger-aero.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 565 B

Двоичные данные
browser/themes/windows/customizableui/thumburger-aero@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.2 KiB

Двоичные данные
browser/themes/windows/customizableui/thumburger-inverted.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 411 B

Двоичные данные
browser/themes/windows/customizableui/thumburger-inverted@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 754 B

Двоичные данные
browser/themes/windows/customizableui/thumburger-lunaSilver.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 619 B

Двоичные данные
browser/themes/windows/customizableui/thumburger-lunaSilver@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.3 KiB

Двоичные данные
browser/themes/windows/customizableui/thumburger-win8.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 220 B

Двоичные данные
browser/themes/windows/customizableui/thumburger-win8@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 379 B

Двоичные данные
browser/themes/windows/customizableui/thumburger.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 201 B

Двоичные данные
browser/themes/windows/customizableui/thumburger@2x.png Executable file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 343 B

Просмотреть файл

@ -55,6 +55,12 @@
#forward-button {
list-style-image: url("chrome://browser/skin/Toolbar.png");
}
toolbar[brighttext] #back-button,
toolbar[brighttext] #forward-button {
list-style-image: url("chrome://browser/skin/Toolbar-inverted.png");
}
/* The back button region is already set in devedition.inc.css */
#forward-button {
-moz-image-region: rect(0px, 72px, 18px, 54px);

Просмотреть файл

@ -81,11 +81,6 @@ browser.jar:
skin/classic/browser/menuPanel-small@2x.png
skin/classic/browser/menuPanel-small-aero.png
skin/classic/browser/menuPanel-small-aero@2x.png
skin/classic/browser/bad-content-blocked-16.png (../shared/bad-content-blocked-16.png)
skin/classic/browser/bad-content-blocked-16@2x.png (../shared/bad-content-blocked-16@2x.png)
skin/classic/browser/bad-content-blocked-64.png (../shared/bad-content-blocked-64.png)
skin/classic/browser/bad-content-unblocked-16.png (../shared/bad-content-unblocked-16.png)
skin/classic/browser/bad-content-unblocked-64.png (../shared/bad-content-unblocked-64.png)
skin/classic/browser/monitor.png
skin/classic/browser/monitor_16-10.png
skin/classic/browser/notification-16.png
@ -224,6 +219,18 @@ browser.jar:
skin/classic/browser/customizableui/subView-arrow-back-inverted.png (../shared/customizableui/subView-arrow-back-inverted.png)
skin/classic/browser/customizableui/subView-arrow-back-inverted@2x.png (../shared/customizableui/subView-arrow-back-inverted@2x.png)
skin/classic/browser/customizableui/subView-arrow-back-inverted-rtl.png (../shared/customizableui/subView-arrow-back-inverted-rtl.png)
skin/classic/browser/customizableui/thumburger-XP.png (customizableui/thumburger-XP.png)
skin/classic/browser/customizableui/thumburger-XP@2x.png (customizableui/thumburger-XP@2x.png)
skin/classic/browser/customizableui/thumburger-aero.png (customizableui/thumburger-aero.png)
skin/classic/browser/customizableui/thumburger-aero@2x.png (customizableui/thumburger-aero@2x.png)
skin/classic/browser/customizableui/thumburger-inverted.png (customizableui/thumburger-inverted.png)
skin/classic/browser/customizableui/thumburger-inverted@2x.png (customizableui/thumburger-inverted@2x.png)
skin/classic/browser/customizableui/thumburger-lunaSilver.png (customizableui/thumburger-lunaSilver.png)
skin/classic/browser/customizableui/thumburger-lunaSilver@2x.png (customizableui/thumburger-lunaSilver@2x.png)
skin/classic/browser/customizableui/thumburger-win8.png (customizableui/thumburger-win8.png)
skin/classic/browser/customizableui/thumburger-win8@2x.png (customizableui/thumburger-win8@2x.png)
skin/classic/browser/customizableui/thumburger.png (customizableui/thumburger.png)
skin/classic/browser/customizableui/thumburger@2x.png (customizableui/thumburger@2x.png)
skin/classic/browser/customizableui/whimsy.png (../shared/customizableui/whimsy.png)
skin/classic/browser/customizableui/whimsy@2x.png (../shared/customizableui/whimsy@2x.png)
skin/classic/browser/customizableui/whimsy-bw.png (../shared/customizableui/whimsy-bw.png)
@ -702,6 +709,16 @@ browser.jar:
% override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-aero.png os=WINNT osversion=6.1
% override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.2
% override chrome://browser/skin/Toolbar.png chrome://browser/skin/Toolbar-win8.png os=WINNT osversion=6.3
% override chrome://browser/skin/customizableui/thumburger.png chrome://browser/skin/customizableui/thumburger-XP.png os=WINNT osversion<6
% override chrome://browser/skin/customizableui/thumburger.png chrome://browser/skin/customizableui/thumburger-aero.png os=WINNT osversion=6
% override chrome://browser/skin/customizableui/thumburger.png chrome://browser/skin/customizableui/thumburger-aero.png os=WINNT osversion=6.1
% override chrome://browser/skin/customizableui/thumburger.png chrome://browser/skin/customizableui/thumburger-win8.png os=WINNT osversion=6.2
% override chrome://browser/skin/customizableui/thumburger.png chrome://browser/skin/customizableui/thumburger-win8.png os=WINNT osversion=6.3
% override chrome://browser/skin/customizableui/thumburger@2x.png chrome://browser/skin/customizableui/thumburger-XP@2x.png os=WINNT osversion<6
% override chrome://browser/skin/customizableui/thumburger@2x.png chrome://browser/skin/customizableui/thumburger-aero@2x.png os=WINNT osversion=6
% override chrome://browser/skin/customizableui/thumburger@2x.png chrome://browser/skin/customizableui/thumburger-aero@2x.png os=WINNT osversion=6.1
% override chrome://browser/skin/customizableui/thumburger@2x.png chrome://browser/skin/customizableui/thumburger-win8@2x.png os=WINNT osversion=6.2
% override chrome://browser/skin/customizableui/thumburger@2x.png chrome://browser/skin/customizableui/thumburger-win8@2x.png os=WINNT osversion=6.3
% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-XP.png os=WINNT osversion<6
% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6
% override chrome://browser/skin/loop/toolbar.png chrome://browser/skin/loop/toolbar-aero.png os=WINNT osversion=6.1

Просмотреть файл

@ -5,6 +5,7 @@ support-files =
[browser_bug593387.js]
skip-if = e10s # Bug ?????? - test directly touches content (contentWindow.iframe.addEventListener)
[browser_bug902350.js]
tags = mcb
skip-if = e10s # Bug ?????? - test e10s utils don't support load events from iframe etc, which this test relies on.
[browser_messagemanager_loadprocessscript.js]
[browser_messagemanager_targetframeloader.js]

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше