This commit is contained in:
Ryan VanderMeulen 2015-08-14 15:17:32 -04:00
Родитель de062041d4 bf6e75549f
Коммит 65e8abbd34
25 изменённых файлов: 309 добавлений и 163 удалений

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

@ -9,7 +9,7 @@ html, body {
display: none; display: none;
} }
#manage, #intro, #stage { #networkError, #manage, #intro, #stage {
display: none; display: none;
} }

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

@ -114,6 +114,10 @@ let wrapper = {
let iframe = document.getElementById("remote"); let iframe = document.getElementById("remote");
this.iframe = iframe; this.iframe = iframe;
this.iframe.QueryInterface(Ci.nsIFrameLoaderOwner);
let docShell = this.iframe.frameLoader.docShell;
docShell.QueryInterface(Ci.nsIWebProgress);
docShell.addProgressListener(this.iframeListener, Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
iframe.addEventListener("load", this); iframe.addEventListener("load", this);
// Ideally we'd just merge urlParams with new URL(url).searchParams, but our // Ideally we'd just merge urlParams with new URL(url).searchParams, but our
@ -122,9 +126,56 @@ let wrapper = {
if (urlParamStr) { if (urlParamStr) {
url += (url.includes("?") ? "&" : "?") + urlParamStr; url += (url.includes("?") ? "&" : "?") + urlParamStr;
} }
this.url = url;
iframe.src = url; iframe.src = url;
}, },
retry: function () {
let webNav = this.iframe.frameLoader.docShell.QueryInterface(Ci.nsIWebNavigation);
webNav.loadURI(this.url, null, null, null, null);
},
iframeListener: {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
Ci.nsISupportsWeakReference,
Ci.nsISupports]),
onStateChange: function(aWebProgress, aRequest, aState, aStatus) {
let failure = false;
// Captive portals sometimes redirect users
if ((aState & Ci.nsIWebProgressListener.STATE_REDIRECTING)) {
failure = true;
} else if ((aState & Ci.nsIWebProgressListener.STATE_STOP)) {
if (aRequest instanceof Ci.nsIHttpChannel) {
try {
failure = aRequest.responseStatus != 200;
} catch (e) {
failure = aStatus != Components.results.NS_OK;
}
}
}
// Calling cancel() will raise some OnStateChange notifications by itself,
// so avoid doing that more than once
if (failure && aStatus != Components.results.NS_BINDING_ABORTED) {
aRequest.cancel(Components.results.NS_BINDING_ABORTED);
setErrorPage();
}
},
onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) {
if (aRequest && aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) {
aRequest.cancel(Components.results.NS_BINDING_ABORTED);
setErrorPage();
}
},
onProgressChange: function() {},
onStatusChange: function() {},
onSecurityChange: function() {},
},
handleEvent: function (evt) { handleEvent: function (evt) {
switch (evt.type) { switch (evt.type) {
case "load": case "load":
@ -292,6 +343,11 @@ function getStarted() {
show("remote"); show("remote");
} }
function retry() {
show("remote");
wrapper.retry();
}
function openPrefs() { function openPrefs() {
window.openPreferences("paneSync"); window.openPreferences("paneSync");
} }
@ -363,6 +419,10 @@ function init() {
}); });
} }
function setErrorPage() {
show("stage", "networkError");
}
// Causes the "top-level" element with |id| to be shown - all other top-level // Causes the "top-level" element with |id| to be shown - all other top-level
// elements are hidden. Optionally, ensures that only 1 "second-level" element // elements are hidden. Optionally, ensures that only 1 "second-level" element
// inside the top-level one is shown. // inside the top-level one is shown.
@ -449,6 +509,9 @@ document.addEventListener("DOMContentLoaded", function onload() {
var buttonGetStarted = document.getElementById('buttonGetStarted'); var buttonGetStarted = document.getElementById('buttonGetStarted');
buttonGetStarted.addEventListener('click', getStarted); buttonGetStarted.addEventListener('click', getStarted);
var buttonRetry = document.getElementById('buttonRetry');
buttonRetry.addEventListener('click', retry);
var oldsync = document.getElementById('oldsync'); var oldsync = document.getElementById('oldsync');
oldsync.addEventListener('click', handleOldSync); oldsync.addEventListener('click', handleOldSync);

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

@ -71,6 +71,22 @@
</section> </section>
</div> </div>
<div id="networkError">
<header>
<h1>&aboutAccounts.noConnection.title;</h1>
</header>
<section>
<div class="graphic graphic-sync-intro"> </div>
<div class="description">&aboutAccounts.noConnection.description;</div>
<div class="button-row">
<button id="buttonRetry" class="button" tabindex="3">&aboutAccounts.noConnection.retry;</button>
</div>
</section>
</div>
</div> </div>
<iframe mozframetype="content" id="remote" /> <iframe mozframetype="content" id="remote" />

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

@ -458,7 +458,23 @@ var FullScreen = {
this._element.removeAttribute(currentState); this._element.removeAttribute(currentState);
} }
if (newState != "hidden") { if (newState != "hidden") {
this._element.setAttribute(newState, true); if (currentState != "hidden") {
this._element.setAttribute(newState, true);
} else {
// When the previous state is hidden, the display was none,
// thus no box was constructed. We need to wait for the new
// display value taking effect first, otherwise, there won't
// be any transition. Since requestAnimationFrame callback is
// generally triggered before any style flush and layout, we
// should wait for the second animation frame.
requestAnimationFrame(() => {
requestAnimationFrame(() => {
if (this._element) {
this._element.setAttribute(newState, true);
}
});
});
}
} }
}, },
@ -476,7 +492,7 @@ var FullScreen = {
} }
} else { } else {
let elemRect = this._element.getBoundingClientRect(); let elemRect = this._element.getBoundingClientRect();
if (state == "hiding") { if (state == "hiding" && this._lastState != "hidden") {
// If we are on the hiding transition, and the pointer // If we are on the hiding transition, and the pointer
// moved near the box, restore to the previous state. // moved near the box, restore to the previous state.
if (event.clientY <= elemRect.bottom + 50) { if (event.clientY <= elemRect.bottom + 50) {

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

@ -670,7 +670,6 @@ window[chromehidden~="toolbar"] toolbar:not(#nav-bar):not(#TabsToolbar):not(#pri
} }
#fullscreen-warning { #fullscreen-warning {
display: flex;
position: fixed; position: fixed;
z-index: 2147483647 !important; z-index: 2147483647 !important;
visibility: visible; visibility: visible;
@ -684,13 +683,8 @@ window[chromehidden~="toolbar"] toolbar:not(#nav-bar):not(#TabsToolbar):not(#pri
max-width: 95%; max-width: 95%;
pointer-events: none; pointer-events: none;
} }
#fullscreen-warning[hidden] { #fullscreen-warning:not([hidden]) {
/* To ensure the transition always works fine, never change
the value of display property. */
display: flex; display: flex;
visibility: hidden !important;
transition: initial;
pointer-events: none !important;
} }
#fullscreen-warning[onscreen] { #fullscreen-warning[onscreen] {
transform: translate(-50%, 50px); transform: translate(-50%, 50px);

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

@ -85,7 +85,8 @@ let gTests = [
stage: false, // parent of 'manage' and 'intro' stage: false, // parent of 'manage' and 'intro'
manage: false, manage: false,
intro: false, // this is "get started" intro: false, // this is "get started"
remote: true remote: true,
networkError: false
}); });
} }
}, },
@ -112,7 +113,48 @@ let gTests = [
stage: true, // parent of 'manage' and 'intro' stage: true, // parent of 'manage' and 'intro'
manage: true, manage: true,
intro: false, // this is "get started" intro: false, // this is "get started"
remote: false remote: false,
networkError: false
});
}
},
{
desc: "Test action=signin - captive portal",
teardown: () => gBrowser.removeCurrentTab(),
run: function* ()
{
const signinUrl = "https://redirproxy.example.com/test";
setPref("identity.fxaccounts.remote.signin.uri", signinUrl);
let [tab, url] = yield promiseNewTabWithIframeLoadEvent("about:accounts?action=signin");
yield checkVisibilities(tab, {
stage: true, // parent of 'manage' and 'intro'
manage: false,
intro: false, // this is "get started"
remote: false,
networkError: true
});
}
},
{
desc: "Test action=signin - offline",
teardown: () => {
gBrowser.removeCurrentTab();
BrowserOffline.toggleOfflineStatus();
},
run: function* ()
{
BrowserOffline.toggleOfflineStatus();
Services.cache2.clear();
const signinUrl = "https://unknowndomain.cow";
setPref("identity.fxaccounts.remote.signin.uri", signinUrl);
let [tab, url] = yield promiseNewTabWithIframeLoadEvent("about:accounts?action=signin");
yield checkVisibilities(tab, {
stage: true, // parent of 'manage' and 'intro'
manage: false,
intro: false, // this is "get started"
remote: false,
networkError: true
}); });
} }
}, },
@ -130,7 +172,8 @@ let gTests = [
stage: false, // parent of 'manage' and 'intro' stage: false, // parent of 'manage' and 'intro'
manage: false, manage: false,
intro: false, // this is "get started" intro: false, // this is "get started"
remote: true remote: true,
networkError: false
}); });
}, },
}, },
@ -149,7 +192,8 @@ let gTests = [
stage: true, // parent of 'manage' and 'intro' stage: true, // parent of 'manage' and 'intro'
manage: true, manage: true,
intro: false, // this is "get started" intro: false, // this is "get started"
remote: false remote: false,
networkError: false
}); });
}, },
}, },

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

@ -22,12 +22,14 @@ addEventListener("DOMContentLoaded", function domContentLoaded(event) {
// at least one test initially loads about:blank - in that case, we are done. // at least one test initially loads about:blank - in that case, we are done.
return; return;
} }
iframe.addEventListener("load", function iframeLoaded(event) { // We use DOMContentLoaded here as that fires for our iframe even when we've
// arranged for the URL in the iframe to cause an error.
addEventListener("DOMContentLoaded", function iframeLoaded(event) {
if (iframe.contentWindow.location.href == "about:blank" || if (iframe.contentWindow.location.href == "about:blank" ||
event.target != iframe) { event.target != iframe.contentDocument) {
return; return;
} }
iframe.removeEventListener("load", iframeLoaded, true); removeEventListener("DOMContentLoaded", iframeLoaded, true);
sendAsyncMessage("test:iframe:load", {url: iframe.getAttribute("src")}); sendAsyncMessage("test:iframe:load", {url: iframe.getAttribute("src")});
// And an event listener for the test responses, which we send to the test // And an event listener for the test responses, which we send to the test
// via a message. // via a message.

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

@ -51,7 +51,12 @@
insertScript("//www.google-analytics.com/analytics.js"); insertScript("//www.google-analytics.com/analytics.js");
window.ga("create", "UA-36116321-15", "auto"); window.ga("create", "UA-36116321-15", "auto");
window.ga("set", "anonymizeIp", true); /* Don't send conversation ids to GA, by specifying our own location. */
window.ga("set", {
"location": document.location.origin + "/conversation/",
"anonymizeIp": true,
"title": "Link Clicker"
});
window.ga("send", "pageview"); window.ga("send", "pageview");
} }
})(); })();

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

@ -362,7 +362,7 @@ let gSyncPane = {
document.getElementById("fxaChangeDeviceName").disabled = !syncReady; document.getElementById("fxaChangeDeviceName").disabled = !syncReady;
// Clear the profile image (if any) of the previously logged in account. // Clear the profile image (if any) of the previously logged in account.
document.getElementById("fxaProfileImage").style.removeProperty("background-image"); document.getElementById("fxaProfileImage").style.removeProperty("list-style-image");
// If the account is verified the next promise in the chain will // If the account is verified the next promise in the chain will
// fetch profile data. // fetch profile data.
@ -385,7 +385,7 @@ let gSyncPane = {
let img = new Image(); let img = new Image();
img.onload = () => { img.onload = () => {
let bgImage = "url('" + data.avatar + "')"; let bgImage = "url('" + data.avatar + "')";
document.getElementById("fxaProfileImage").style.backgroundImage = bgImage; document.getElementById("fxaProfileImage").style.listStyleImage = bgImage;
}; };
img.src = data.avatar; img.src = data.avatar;
} }

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

@ -200,102 +200,111 @@
<!-- These panels are for the Firefox Accounts identity provider --> <!-- These panels are for the Firefox Accounts identity provider -->
<vbox id="noFxaAccount"> <vbox id="noFxaAccount">
<hbox> <hbox>
<groupbox id="noFxaGroup"> <vbox id="fxaContentWrapper">
<vbox> <groupbox id="noFxaGroup">
<label id="noFxaCaption">&signedOut.caption;</label> <vbox>
<description id="noFxaDescription" flex="1">&signedOut.description;</description> <label id="noFxaCaption">&signedOut.caption;</label>
<hbox class="fxaAccountBox"> <description id="noFxaDescription" flex="1">&signedOut.description;</description>
<image class="fxaFirefoxLogo"/> <hbox class="fxaAccountBox">
<vbox> <vbox>
<label id="signedOutAccountBoxTitle">&signedOut.accountBox.title;</label> <image class="fxaFirefoxLogo"/>
<hbox> </vbox>
<button id="noFxaSignUp" label="&signedOut.accountBox.create;"/> <vbox flex="1">
<button id="noFxaSignIn" label="&signedOut.accountBox.signin;"/> <label id="signedOutAccountBoxTitle">&signedOut.accountBox.title;</label>
</hbox> <description class="fxaAccountBoxButtons">
</vbox> <button id="noFxaSignUp">&signedOut.accountBox.create;</button>
</hbox> <button id="noFxaSignIn">&signedOut.accountBox.signin;</button>
</vbox> </description>
</groupbox> </vbox>
<image class="fxaSyncIllustration"/> </hbox>
</hbox> </vbox>
<hbox class="fxaMobilePromo"> </groupbox>
<label>&mobilePromo.start;</label> </vbox>
<image class="androidLogo"/> <vbox>
<label class="text-link" <image class="fxaSyncIllustration"/>
href="https://www.mozilla.org/firefox/android/"> </vbox>
&mobilePromo.androidLink;
</label>
<label>&mobilePromo.end;</label>
</hbox> </hbox>
<label class="fxaMobilePromo">
&mobilePromo.start;<!-- We put these comments to avoid inserting white spaces
--><image class="androidLogo"/><!--
--><label class="androidLink text-link" href="https://www.mozilla.org/firefox/android/"><!--
-->&mobilePromo.androidLink;</label><!--
-->&mobilePromo.end;
</label>
<label class="androidAttribution">&androidAttribution;</label> <label class="androidAttribution">&androidAttribution;</label>
</vbox> </vbox>
<vbox id="hasFxaAccount"> <vbox id="hasFxaAccount">
<hbox> <hbox>
<vbox> <vbox id="fxaContentWrapper">
<groupbox id="fxaGroup"> <groupbox id="fxaGroup">
<caption><label>&syncBrand.fxAccount.label;</label></caption> <caption><label>&syncBrand.fxAccount.label;</label></caption>
<deck id="fxaLoginStatus">
<deck id="fxaLoginStatus"> <!-- logged in and verified and all is good -->
<hbox id="fxaLoginVerified" class="fxaAccountBox">
<vbox>
<image id="fxaProfileImage"
onclick="gSyncPane.openChangeProfileImage();" hidden="true"
tooltiptext="&profilePicture.tooltip;" class="actionable"/>
</vbox>
<vbox flex="1">
<label id="fxaEmailAddress1"/>
<label id="fxaDisplayName" hidden="true"/>
<description class="fxaAccountBoxButtons">
<button id="verifiedManage">&manage.label;</button>
<button id="fxaUnlinkButton">&disconnect.label;</button>
</description>
</vbox>
</hbox>
<!-- logged in and verified and all is good --> <!-- logged in to an unverified account -->
<hbox id="fxaLoginVerified" class="fxaAccountBox"> <hbox id="fxaLoginUnverified" class="fxaAccountBox">
<image id="fxaProfileImage" <vbox>
onclick="gSyncPane.openChangeProfileImage();" hidden="true" <image id="fxaProfileImage"/>
tooltiptext="&profilePicture.tooltip;" class="actionable"/> </vbox>
<vbox> <vbox flex="1">
<label id="fxaEmailAddress1"/> <hbox>
<label id="fxaDisplayName" hidden="true"/> <vbox><image id="fxaLoginRejectedWarning"/></vbox>
<hbox class="fxaAccountBoxButtons"> <description flex="1">
<button id="verifiedManage" label="&manage.label;"/> &signedInUnverified.beforename.label;
<button id="fxaUnlinkButton" label="&disconnect.label;"/> <label id="fxaEmailAddress2"/>
</hbox> &signedInUnverified.aftername.label;
</vbox> </description>
</hbox> </hbox>
<description class="fxaAccountBoxButtons">
<button id="verifyFxaAccount">&verify.label;</button>
<button id="unverifiedUnlinkFxaAccount">&forget.label;</button>
</description>
</vbox>
</hbox>
<!-- logged in to an unverified account --> <!-- logged in locally but server rejected credentials -->
<hbox id="fxaLoginUnverified" class="fxaAccountBox"> <hbox id="fxaLoginRejected" class="fxaAccountBox">
<image id="fxaProfileImage"/> <vbox>
<vbox> <image id="fxaProfileImage"/>
<hbox> </vbox>
<vbox><image id="fxaLoginRejectedWarning"/></vbox> <vbox flex="1">
<description> <hbox>
&signedInUnverified.beforename.label; <vbox><image id="fxaLoginRejectedWarning"/></vbox>
<label id="fxaEmailAddress2"/> <description flex="1">
&signedInUnverified.aftername.label; &signedInLoginFailure.beforename.label;
</description> <label id="fxaEmailAddress3"/>
</hbox> &signedInLoginFailure.aftername.label;
<hbox class="fxaAccountBoxButtons"> </description>
<button id="verifyFxaAccount" label="&verify.label;"/>
<button id="unverifiedUnlinkFxaAccount" label="&forget.label;"/>
</hbox>
</vbox>
</hbox> </hbox>
<description class="fxaAccountBoxButtons">
<!-- logged in locally but server rejected credentials --> <button id="rejectReSignIn">&signIn.label;</button>
<hbox id="fxaLoginRejected" class="fxaAccountBox"> <button id="rejectUnlinkFxaAccount">&forget.label;</button>
<image id="fxaProfileImage"/> </description>
<vbox> </vbox>
<hbox> </hbox>
<vbox><image id="fxaLoginRejectedWarning"/></vbox> </deck>
<description>
&signedInLoginFailure.beforename.label;
<label id="fxaEmailAddress3"/>
&signedInLoginFailure.aftername.label;
</description>
</hbox>
<hbox class="fxaAccountBoxButtons">
<button id="rejectReSignIn" label="&signIn.label;"/>
<button id="rejectUnlinkFxaAccount" label="&forget.label;"/>
</hbox>
</vbox>
</hbox>
</deck>
</groupbox> </groupbox>
<groupbox id="syncOptions"> <groupbox id="syncOptions">
<caption><label>&signedIn.engines.label;</label></caption> <caption><label>&signedIn.engines.label;</label></caption>
<hbox id="fxaSyncEngines"> <hbox id="fxaSyncEngines">
<vbox align="start"> <vbox align="start" flex="1">
<checkbox label="&engine.tabs.label;" <checkbox label="&engine.tabs.label;"
accesskey="&engine.tabs.accesskey;" accesskey="&engine.tabs.accesskey;"
preference="engine.tabs"/> preference="engine.tabs"/>
@ -306,7 +315,7 @@
accesskey="&engine.passwords.accesskey;" accesskey="&engine.passwords.accesskey;"
preference="engine.passwords"/> preference="engine.passwords"/>
</vbox> </vbox>
<vbox align="start"> <vbox align="start" flex="1">
<checkbox label="&engine.history.label;" <checkbox label="&engine.history.label;"
accesskey="&engine.history.accesskey;" accesskey="&engine.history.accesskey;"
preference="engine.history"/> preference="engine.history"/>
@ -321,8 +330,9 @@
</hbox> </hbox>
</groupbox> </groupbox>
</vbox> </vbox>
<spacer flex="1"/> <vbox>
<image class="fxaSyncIllustration"/> <image class="fxaSyncIllustration"/>
</vbox>
</hbox> </hbox>
<spacer class="separator"/> <spacer class="separator"/>
<groupbox> <groupbox>
@ -333,10 +343,7 @@
</label> </label>
</caption> </caption>
<hbox id="fxaDeviceName"> <hbox id="fxaDeviceName">
<hbox> <textbox id="fxaSyncComputerName" disabled="true"/>
<textbox id="fxaSyncComputerName" disabled="true" flex="1"/>
</hbox>
<spacer flex="1"/>
<hbox> <hbox>
<button id="fxaChangeDeviceName" <button id="fxaChangeDeviceName"
label="&changeSyncDeviceName.label;"/> label="&changeSyncDeviceName.label;"/>
@ -350,15 +357,13 @@
</hbox> </hbox>
</groupbox> </groupbox>
<spacer class="separator"/> <spacer class="separator"/>
<hbox class="fxaMobilePromo"> <label class="fxaMobilePromo">
<label>&mobilePromo.start;</label> &mobilePromo.start;<!-- We put these comments to avoid inserting white spaces
<image class="androidLogo"/> --><image class="androidLogo"/><!--
<label class="text-link" --><label class="androidLink text-link" href="https://www.mozilla.org/firefox/android/"><!--
href="https://www.mozilla.org/firefox/android/"> -->&mobilePromo.androidLink;</label><!--
&mobilePromo.androidLink; -->&mobilePromo.end;
</label> </label>
<label>&mobilePromo.end;</label>
</hbox>
<spacer flex="1"/> <spacer flex="1"/>
<vbox id="tosPP-small" align="start"> <vbox id="tosPP-small" align="start">
<label id="tosPP-small-ToS" class="text-link"> <label id="tosPP-small-ToS" class="text-link">

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

@ -2738,11 +2738,10 @@ ElementEditor.prototype = {
// Create links in the attribute value, and collapse long attributes if // Create links in the attribute value, and collapse long attributes if
// needed. // needed.
let collapse = value => { let collapse = value => {
if (value.match(COLLAPSE_DATA_URL_REGEX)) { if (value && value.match(COLLAPSE_DATA_URL_REGEX)) {
return truncateString(value, COLLAPSE_DATA_URL_LENGTH); return truncateString(value, COLLAPSE_DATA_URL_LENGTH);
} else {
return truncateString(value, COLLAPSE_ATTRIBUTE_LENGTH);
} }
return truncateString(value, COLLAPSE_ATTRIBUTE_LENGTH);
}; };
val.innerHTML = ""; val.innerHTML = "";
@ -2920,7 +2919,7 @@ function nodeDocument(node) {
} }
function truncateString(str, maxLength) { function truncateString(str, maxLength) {
if (str.length <= maxLength) { if (!str || str.length <= maxLength) {
return str; return str;
} }

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

@ -9,3 +9,6 @@
<!ENTITY aboutAccountsConfig.startButton.label "Get started"> <!ENTITY aboutAccountsConfig.startButton.label "Get started">
<!ENTITY aboutAccountsConfig.useOldSync.label "Using an older version of Sync?"> <!ENTITY aboutAccountsConfig.useOldSync.label "Using an older version of Sync?">
<!ENTITY aboutAccountsConfig.syncPreferences.label "Sync preferences"> <!ENTITY aboutAccountsConfig.syncPreferences.label "Sync preferences">
<!ENTITY aboutAccounts.noConnection.title "No connection">
<!ENTITY aboutAccounts.noConnection.description "You must be connected to the internet to sign in.">
<!ENTITY aboutAccounts.noConnection.retry "Try again">

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

@ -88,16 +88,12 @@
<!ENTITY performanceUI.table.selfAlloc "Self Sampled Allocations"> <!ENTITY performanceUI.table.selfAlloc "Self Sampled Allocations">
<!ENTITY performanceUI.table.selfAlloc.tooltip "The number of Object allocations sampled at this location."> <!ENTITY performanceUI.table.selfAlloc.tooltip "The number of Object allocations sampled at this location.">
<!-- LOCALIZATION NOTE (performanceUI.newtab.tooltiptext): The tooltiptext shown <!-- LOCALIZATION NOTE (performanceUI.options.filter.tooltiptext): This string
- on the "+" (new tab) button for a profile when a selection is available. -->
<!ENTITY performanceUI.newtab.tooltiptext "Add new tab from selection">
<!-- LOCALIZATION NOTE (performanceUI.toolbar.filter.tooltiptext): This string
- is displayed next to the filter button--> - is displayed next to the filter button-->
<!ENTITY performanceUI.options.filter.tooltiptext "Select what data to display in the timeline"> <!ENTITY performanceUI.options.filter.tooltiptext "Select what data to display in the timeline">
<!-- LOCALIZATION NOTE (performanceUI.options.tooltiptext): This is the tooltip <!-- LOCALIZATION NOTE (performanceUI.options.gear.tooltiptext): This is the
- for the options button. --> - tooltip for the options button. -->
<!ENTITY performanceUI.options.gear.tooltiptext "Configure performance preferences."> <!ENTITY performanceUI.options.gear.tooltiptext "Configure performance preferences.">
<!-- LOCALIZATION NOTE (performanceUI.invertTree): This is the label shown next to <!-- LOCALIZATION NOTE (performanceUI.invertTree): This is the label shown next to

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

@ -113,11 +113,6 @@ table.idle=(idle)
# labels which, when clicked, jump to the debugger. # labels which, when clicked, jump to the debugger.
table.url.tooltiptext=View source in Debugger table.url.tooltiptext=View source in Debugger
# LOCALIZATION NOTE (table.zoom.tooltiptext):
# This string is displayed in the call tree as the tooltip text for the 'zoom'
# buttons (small magnifying glass icons) which spawn a new tab.
table.zoom.tooltiptext=Inspect frame in new tab
# LOCALIZATION NOTE (table.view-optimizations.tooltiptext): # LOCALIZATION NOTE (table.view-optimizations.tooltiptext):
# This string is displayed in the icon displayed next to frames that # This string is displayed in the icon displayed next to frames that
# have optimization data # have optimization data

Двоичные данные
browser/themes/shared/fxa/android.png

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

До

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

После

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

Двоичные данные
browser/themes/shared/fxa/android@2x.png

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

До

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

После

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

Двоичные данные
browser/themes/shared/fxa/default-avatar.png

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

До

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

После

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

Двоичные данные
browser/themes/shared/fxa/default-avatar@2x.png

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

До

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

После

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

Двоичные данные
browser/themes/shared/fxa/logo.png

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

До

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

После

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

Двоичные данные
browser/themes/shared/fxa/logo@2x.png

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

До

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

После

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

Двоичные данные
browser/themes/shared/fxa/sync-illustration.png

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

До

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

После

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

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

До

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

После

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

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

@ -372,11 +372,9 @@ description > html|a {
*/ */
#fxaProfileImage { #fxaProfileImage {
width: 60px; max-width: 60px;
max-height: 60px;
border-radius: 50%; border-radius: 50%;
background-image: url(chrome://browser/skin/fxa/default-avatar.png); list-style-image: url(chrome://browser/skin/fxa/default-avatar.png);
background-size: contain;
margin-inline-end: 15px; margin-inline-end: 15px;
} }
@ -396,13 +394,24 @@ description > html|a {
/* Overriding the margins from the base preferences.css theme file. /* Overriding the margins from the base preferences.css theme file.
These overrides can be simplified by fixing bug 1027174 */ These overrides can be simplified by fixing bug 1027174 */
margin: 0; margin: 0;
padding-top: 15px;
}
#fxaContentWrapper {
-moz-box-flex: 1;
} }
#noFxaGroup { #noFxaGroup {
-moz-box-flex: 1; -moz-box-flex: 1;
margin: 0;
} }
#noFxaGroup > vbox { #fxaContentWrapper {
padding-right: 15px;
}
#noFxaGroup > vbox,
#fxaGroup {
-moz-box-align: start; -moz-box-align: start;
} }
@ -412,7 +421,7 @@ description > html|a {
#fxaSyncComputerName { #fxaSyncComputerName {
margin-inline-start: 0px; margin-inline-start: 0px;
width: 500px; -moz-box-flex: 1;
} }
#tosPP-small-ToS { #tosPP-small-ToS {
@ -453,41 +462,38 @@ description > html|a {
#signedOutAccountBoxTitle { #signedOutAccountBoxTitle {
margin-inline-start: 6px !important; margin-inline-start: 6px !important;
font-weight: bold; font-weight: bold;
margin-bottom: 11px;
} }
.fxaAccountBox button { .fxaAccountBoxButtons {
margin-bottom: 0 !important;
margin-top: 11px;
}
.fxaAccountBoxButtons > button {
padding-left: 11px; padding-left: 11px;
padding-right: 11px; padding-right: 11px;
} }
.fxaSyncIllustration { .fxaSyncIllustration {
width: 231px; width: 231px;
max-height: 200px;
list-style-image: url(chrome://browser/skin/fxa/sync-illustration.png) list-style-image: url(chrome://browser/skin/fxa/sync-illustration.png)
} }
#fxaEmailAddress1,
#fxaEmailAddress2,
#fxaEmailAddress3 {
word-break: break-all;
}
.fxaFirefoxLogo { .fxaFirefoxLogo {
list-style-image: url(chrome://browser/skin/fxa/logo.png); list-style-image: url(chrome://browser/skin/fxa/logo.png);
max-width: 64px; max-width: 64px;
margin-inline-end: 14px; margin-inline-end: 14px;
} }
#noFxaAccount .fxaMobilePromo { .fxaMobilePromo {
margin-bottom: 55px; margin-top: 14px;
}
#hasFxaAccount .fxaMobilePromo {
margin-bottom: 41px; margin-bottom: 41px;
margin-top: 27.5px;
}
.fxaMobilePromo > label {
margin-inline-start: 0;
}
#hasFxaAccount .fxaAccountBoxButtons {
margin-top: 11px;
} }
#fxaLoginRejectedWarning { #fxaLoginRejectedWarning {
@ -503,8 +509,14 @@ description > html|a {
.androidLogo { .androidLogo {
list-style-image: url(chrome://browser/skin/fxa/android.png); list-style-image: url(chrome://browser/skin/fxa/android.png);
max-width: 24px; max-width: 24px;
margin-top: -4px; position: relative;
margin-inline-end: 4px; top: 8px;
margin: 0px;
margin-inline-end: 5px;
}
.androidLink {
margin: 0;
} }
#tosPP-small { #tosPP-small {
@ -527,6 +539,6 @@ description > html|a {
list-style-image: url(chrome://browser/skin/fxa/android@2x.png); list-style-image: url(chrome://browser/skin/fxa/android@2x.png);
} }
#fxaProfileImage { #fxaProfileImage {
background-image: url(chrome://browser/skin/fxa/default-avatar@2x.png); list-style-image: url(chrome://browser/skin/fxa/default-avatar@2x.png);
} }
} }

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

@ -221,7 +221,7 @@
</style> </style>
<style name="Widget.HomeListView" parent="Widget.ListView"> <style name="Widget.HomeListView" parent="Widget.ListView">
<item name="android:divider">#E7ECF0</item> <item name="android:divider">@color/divider_light</item>
</style> </style>
<style name="Widget.TopSitesListView" parent="Widget.BookmarksListView"/> <style name="Widget.TopSitesListView" parent="Widget.BookmarksListView"/>
@ -559,7 +559,7 @@
</style> </style>
<style name="Widget.RemoteTabsListView" parent="Widget.HomeListView"> <style name="Widget.RemoteTabsListView" parent="Widget.HomeListView">
<item name="android:childDivider">#E7ECF0</item> <item name="android:childDivider">@color/divider_light</item>
<item name="android:drawSelectorOnTop">true</item> <item name="android:drawSelectorOnTop">true</item>
</style> </style>

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

@ -89,10 +89,6 @@ const SCHEDULER_TICK_IDLE_INTERVAL_MS = 60 * 60 * 1000;
// The tolerance we have when checking if it's midnight (15 minutes). // The tolerance we have when checking if it's midnight (15 minutes).
const SCHEDULER_MIDNIGHT_TOLERANCE_MS = 15 * 60 * 1000; const SCHEDULER_MIDNIGHT_TOLERANCE_MS = 15 * 60 * 1000;
// Coalesce the daily and aborted-session pings if they are both due within
// two minutes from each other.
const SCHEDULER_COALESCE_THRESHOLD_MS = 2 * 60 * 1000;
// Seconds of idle time before pinging. // Seconds of idle time before pinging.
// On idle-daily a gather-telemetry notification is fired, during it probes can // On idle-daily a gather-telemetry notification is fired, during it probes can
// start asynchronous tasks to gather data. // start asynchronous tasks to gather data.