Merge fx-team to central, a=merge
authorWes Kocher <wkocher@mozilla.com>
Wed, 05 Aug 2015 16:36:46 -0700
changeset 256351 9801f91760d99bbedb99b3346c8aeb57db68c93a
parent 256333 84f78a49e2d7a098810efdbff04e331588207e5a (current diff)
parent 256350 ca2464a414a677c789ca69e5fb1fafd372de480a (diff)
child 256393 07befc6f54e743b8be189cd2c14d74cf1bcef1c2
push id29173
push userkwierso@gmail.com
push dateWed, 05 Aug 2015 23:36:51 +0000
treeherdermozilla-central@9801f91760d9 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone42.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge fx-team to central, a=merge
browser/themes/shared/fxa/default-profile-image.svg
modules/libpref/init/all.js
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1702,18 +1702,16 @@ pref("shumway.swf.whitelist", "http://ww
 // The maximum amount of decoded image data we'll willingly keep around (we
 // might keep around more than this, but we'll try to get down to this value).
 // (This is intentionally on the high side; see bug 746055.)
 pref("image.mem.max_decoded_image_kb", 256000);
 
 pref("loop.enabled", true);
 pref("loop.textChat.enabled", true);
 pref("loop.server", "https://loop.services.mozilla.com/v0");
-pref("loop.seenToS", "unseen");
-pref("loop.showPartnerLogo", true);
 pref("loop.gettingStarted.seen", false);
 pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/");
 pref("loop.gettingStarted.resumeOnFirstJoin", false);
 pref("loop.learnMoreUrl", "https://www.firefox.com/hello/");
 pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/");
 pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/");
 pref("loop.do_not_disturb", false);
 pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/ringtone.ogg");
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -558,26 +558,38 @@
         ]]></body>
       </method>
 
       <!-- A web progress listener object definition for a given tab. -->
       <method name="mTabProgressListener">
         <parameter name="aTab"/>
         <parameter name="aBrowser"/>
         <parameter name="aStartsBlank"/>
+        <parameter name="aWasPreloadedBrowser"/>
         <body>
         <![CDATA[
+          let stateFlags = 0;
+          // Initialize mStateFlags to non-zero e.g. when creating a progress
+          // listener for preloaded browsers as there was no progress listener
+          // around when the content started loading. If the content didn't
+          // quite finish loading yet, mStateFlags will very soon be overridden
+          // with the correct value and end up at STATE_STOP again.
+          if (aWasPreloadedBrowser) {
+            stateFlags = Ci.nsIWebProgressListener.STATE_STOP |
+                         Ci.nsIWebProgressListener.STATE_IS_REQUEST;
+          }
+
           return ({
             mTabBrowser: this,
             mTab: aTab,
             mBrowser: aBrowser,
             mBlank: aStartsBlank,
 
             // cache flags for correct status UI update after tab switching
-            mStateFlags: 0,
+            mStateFlags: stateFlags,
             mStatus: 0,
             mMessage: "",
             mTotalProgress: 0,
 
             // count of open requests (should always be 0 or 1)
             mRequestCount: 0,
 
             destroy: function () {
@@ -1832,17 +1844,17 @@
             } else if (aURI.toLowerCase().startsWith("javascript:")) {
               // This can go away when bug 672618 or bug 55696 are fixed.
               t.label = aURI;
             }
 
             this.tabContainer.updateVisibility();
 
             // wire up a progress listener for the new browser object.
-            var tabListener = this.mTabProgressListener(t, b, uriIsAboutBlank);
+            var tabListener = this.mTabProgressListener(t, b, uriIsAboutBlank, usingPreloadedContent);
             const filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
                                      .createInstance(Components.interfaces.nsIWebProgress);
             filter.addProgressListener(tabListener, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
             b.webProgress.addProgressListener(filter, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
             this.mTabListeners[position] = tabListener;
             this.mTabFilters[position] = filter;
 
             b.droppedLinkHandler = handleDroppedLink;
@@ -2558,17 +2570,17 @@
 
             // Swap permanentKey properties.
             let ourPermanentKey = ourBrowser.permanentKey;
             ourBrowser.permanentKey = aOtherBrowser.permanentKey;
             aOtherBrowser.permanentKey = ourPermanentKey;
 
             // Restore the progress listener
             this.mTabListeners[index] = tabListener =
-              this.mTabProgressListener(aOurTab, ourBrowser, false);
+              this.mTabProgressListener(aOurTab, ourBrowser, false, false);
 
             const notifyAll = Ci.nsIWebProgress.NOTIFY_ALL;
             filter.addProgressListener(tabListener, notifyAll);
             ourBrowser.webProgress.addProgressListener(filter, notifyAll);
           ]]>
         </body>
       </method>
 
@@ -4037,17 +4049,17 @@
           this._autoScrollPopup = this.mCurrentBrowser._createAutoScrollPopup();
           this._autoScrollPopup.id = "autoscroller";
           this.appendChild(this._autoScrollPopup);
           this.mCurrentBrowser.setAttribute("autoscrollpopup", this._autoScrollPopup.id);
           this.mCurrentBrowser.droppedLinkHandler = handleDroppedLink;
           this.updateWindowResizers();
 
           // Hook up the event listeners to the first browser
-          var tabListener = this.mTabProgressListener(this.mCurrentTab, this.mCurrentBrowser, true);
+          var tabListener = this.mTabProgressListener(this.mCurrentTab, this.mCurrentBrowser, true, false);
           const nsIWebProgress = Components.interfaces.nsIWebProgress;
           const filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
                                    .createInstance(nsIWebProgress);
           filter.addProgressListener(tabListener, nsIWebProgress.NOTIFY_ALL);
           this.mTabListeners[0] = tabListener;
           this.mTabFilters[0] = filter;
           this.webProgress.addProgressListener(filter, nsIWebProgress.NOTIFY_ALL);
 
--- a/browser/components/loop/content/js/panel.js
+++ b/browser/components/loop/content/js/panel.js
@@ -258,80 +258,55 @@ loop.panel = (function(_, mozL10n) {
         )
       );
     }
   });
 
   var ToSView = React.createClass({displayName: "ToSView",
     mixins: [sharedMixins.WindowCloseMixin],
 
-    getInitialState: function() {
-      var getPref = navigator.mozLoop.getLoopPref.bind(navigator.mozLoop);
-
-      return {
-        seenToS: getPref("seenToS"),
-        gettingStartedSeen: getPref("gettingStarted.seen"),
-        showPartnerLogo: getPref("showPartnerLogo")
-      };
-    },
-
     handleLinkClick: function(event) {
       if (!event.target || !event.target.href) {
         return;
       }
 
       event.preventDefault();
       navigator.mozLoop.openURL(event.target.href);
       this.closeWindow();
     },
 
-    renderPartnerLogo: function() {
-      if (!this.state.showPartnerLogo) {
-        return null;
-      }
-
+    render: function() {
       var locale = mozL10n.getLanguage();
-      navigator.mozLoop.setLoopPref("showPartnerLogo", false);
+      var terms_of_use_url = navigator.mozLoop.getLoopPref("legal.ToS_url");
+      var privacy_notice_url = navigator.mozLoop.getLoopPref("legal.privacy_url");
+      var tosHTML = mozL10n.get("legal_text_and_links3", {
+        "clientShortname": mozL10n.get("clientShortname2"),
+        "terms_of_use": React.renderToStaticMarkup(
+          React.createElement("a", {href: terms_of_use_url, target: "_blank"}, 
+            mozL10n.get("legal_text_tos")
+          )
+        ),
+        "privacy_notice": React.renderToStaticMarkup(
+          React.createElement("a", {href: privacy_notice_url, target: "_blank"}, 
+            mozL10n.get("legal_text_privacy")
+          )
+        )
+      });
       return (
-        React.createElement("p", {className: "powered-by", id: "powered-by"}, 
-          mozL10n.get("powered_by_beforeLogo"), 
-          React.createElement("img", {className: locale, id: "powered-by-logo"}), 
-          mozL10n.get("powered_by_afterLogo")
-        )
+        React.createElement("div", {id: "powered-by-wrapper"}, 
+          React.createElement("p", {className: "powered-by", id: "powered-by"}, 
+            mozL10n.get("powered_by_beforeLogo"), 
+            React.createElement("img", {className: locale, id: "powered-by-logo"}), 
+            mozL10n.get("powered_by_afterLogo")
+          ), 
+          React.createElement("p", {className: "terms-service", 
+             dangerouslySetInnerHTML: {__html: tosHTML}, 
+             onClick: this.handleLinkClick})
+         )
       );
-    },
-
-    render: function() {
-      if (!this.state.gettingStartedSeen || this.state.seenToS == "unseen") {
-        var terms_of_use_url = navigator.mozLoop.getLoopPref("legal.ToS_url");
-        var privacy_notice_url = navigator.mozLoop.getLoopPref("legal.privacy_url");
-        var tosHTML = mozL10n.get("legal_text_and_links3", {
-          "clientShortname": mozL10n.get("clientShortname2"),
-          "terms_of_use": React.renderToStaticMarkup(
-            React.createElement("a", {href: terms_of_use_url, target: "_blank"}, 
-              mozL10n.get("legal_text_tos")
-            )
-          ),
-          "privacy_notice": React.renderToStaticMarkup(
-            React.createElement("a", {href: privacy_notice_url, target: "_blank"}, 
-              mozL10n.get("legal_text_privacy")
-            )
-          )
-        });
-        return (
-          React.createElement("div", {id: "powered-by-wrapper"}, 
-            this.renderPartnerLogo(), 
-            React.createElement("p", {className: "terms-service", 
-               dangerouslySetInnerHTML: {__html: tosHTML}, 
-               onClick: this.handleLinkClick})
-           )
-        );
-      } else {
-        return React.createElement("div", null);
-      }
     }
   });
 
   /**
    * Panel settings (gear) menu entry.
    */
   var SettingsDropdownEntry = React.createClass({displayName: "SettingsDropdownEntry",
     propTypes: {
@@ -964,18 +939,17 @@ loop.panel = (function(_, mozL10n) {
             buttonsHidden: hideButtons, 
             mozLoop: this.props.mozLoop, 
             ref: "tabView", 
             selectedTab: this.props.selectedTab}, 
             React.createElement(Tab, {name: "rooms"}, 
               React.createElement(RoomList, {dispatcher: this.props.dispatcher, 
                         mozLoop: this.props.mozLoop, 
                         store: this.props.roomStore, 
-                        userProfile: this.state.userProfile}), 
-              React.createElement(ToSView, null)
+                        userProfile: this.state.userProfile})
             ), 
             React.createElement(Tab, {name: "contacts"}, 
               React.createElement(ContactsList, {
                 notifications: this.props.notifications, 
                 selectTab: this.selectTab, 
                 startForm: this.startForm})
             ), 
             React.createElement(Tab, {hidden: true, name: "contacts_add"}, 
--- a/browser/components/loop/content/js/panel.jsx
+++ b/browser/components/loop/content/js/panel.jsx
@@ -258,80 +258,55 @@ loop.panel = (function(_, mozL10n) {
         </div>
       );
     }
   });
 
   var ToSView = React.createClass({
     mixins: [sharedMixins.WindowCloseMixin],
 
-    getInitialState: function() {
-      var getPref = navigator.mozLoop.getLoopPref.bind(navigator.mozLoop);
-
-      return {
-        seenToS: getPref("seenToS"),
-        gettingStartedSeen: getPref("gettingStarted.seen"),
-        showPartnerLogo: getPref("showPartnerLogo")
-      };
-    },
-
     handleLinkClick: function(event) {
       if (!event.target || !event.target.href) {
         return;
       }
 
       event.preventDefault();
       navigator.mozLoop.openURL(event.target.href);
       this.closeWindow();
     },
 
-    renderPartnerLogo: function() {
-      if (!this.state.showPartnerLogo) {
-        return null;
-      }
-
+    render: function() {
       var locale = mozL10n.getLanguage();
-      navigator.mozLoop.setLoopPref("showPartnerLogo", false);
+      var terms_of_use_url = navigator.mozLoop.getLoopPref("legal.ToS_url");
+      var privacy_notice_url = navigator.mozLoop.getLoopPref("legal.privacy_url");
+      var tosHTML = mozL10n.get("legal_text_and_links3", {
+        "clientShortname": mozL10n.get("clientShortname2"),
+        "terms_of_use": React.renderToStaticMarkup(
+          <a href={terms_of_use_url} target="_blank">
+            {mozL10n.get("legal_text_tos")}
+          </a>
+        ),
+        "privacy_notice": React.renderToStaticMarkup(
+          <a href={privacy_notice_url} target="_blank">
+            {mozL10n.get("legal_text_privacy")}
+          </a>
+        )
+      });
       return (
-        <p className="powered-by" id="powered-by">
-          {mozL10n.get("powered_by_beforeLogo")}
-          <img className={locale} id="powered-by-logo" />
-          {mozL10n.get("powered_by_afterLogo")}
-        </p>
+        <div id="powered-by-wrapper">
+          <p className="powered-by" id="powered-by">
+            {mozL10n.get("powered_by_beforeLogo")}
+            <img className={locale} id="powered-by-logo" />
+            {mozL10n.get("powered_by_afterLogo")}
+          </p>
+          <p className="terms-service"
+             dangerouslySetInnerHTML={{__html: tosHTML}}
+             onClick={this.handleLinkClick}></p>
+         </div>
       );
-    },
-
-    render: function() {
-      if (!this.state.gettingStartedSeen || this.state.seenToS == "unseen") {
-        var terms_of_use_url = navigator.mozLoop.getLoopPref("legal.ToS_url");
-        var privacy_notice_url = navigator.mozLoop.getLoopPref("legal.privacy_url");
-        var tosHTML = mozL10n.get("legal_text_and_links3", {
-          "clientShortname": mozL10n.get("clientShortname2"),
-          "terms_of_use": React.renderToStaticMarkup(
-            <a href={terms_of_use_url} target="_blank">
-              {mozL10n.get("legal_text_tos")}
-            </a>
-          ),
-          "privacy_notice": React.renderToStaticMarkup(
-            <a href={privacy_notice_url} target="_blank">
-              {mozL10n.get("legal_text_privacy")}
-            </a>
-          )
-        });
-        return (
-          <div id="powered-by-wrapper">
-            {this.renderPartnerLogo()}
-            <p className="terms-service"
-               dangerouslySetInnerHTML={{__html: tosHTML}}
-               onClick={this.handleLinkClick}></p>
-           </div>
-        );
-      } else {
-        return <div />;
-      }
     }
   });
 
   /**
    * Panel settings (gear) menu entry.
    */
   var SettingsDropdownEntry = React.createClass({
     propTypes: {
@@ -965,17 +940,16 @@ loop.panel = (function(_, mozL10n) {
             mozLoop={this.props.mozLoop}
             ref="tabView"
             selectedTab={this.props.selectedTab}>
             <Tab name="rooms">
               <RoomList dispatcher={this.props.dispatcher}
                         mozLoop={this.props.mozLoop}
                         store={this.props.roomStore}
                         userProfile={this.state.userProfile} />
-              <ToSView />
             </Tab>
             <Tab name="contacts">
               <ContactsList
                 notifications={this.props.notifications}
                 selectTab={this.selectTab}
                 startForm={this.startForm} />
             </Tab>
             <Tab hidden={true} name="contacts_add">
--- a/browser/components/loop/content/js/roomStore.js
+++ b/browser/components/loop/content/js/roomStore.js
@@ -365,26 +365,21 @@ loop.store = loop.store || {};
      */
     shareRoomUrl: function(actionData) {
       var providerOrigin = new URL(actionData.provider.origin).hostname;
       var shareTitle = "";
       var shareBody = null;
 
       switch (providerOrigin) {
         case "mail.google.com":
-          shareTitle = mozL10n.get("share_email_subject5", {
-            clientShortname2: mozL10n.get("clientShortname2")
+          shareTitle = mozL10n.get("share_email_subject6");
+          shareBody = mozL10n.get("share_email_body6", {
+            callUrl: actionData.roomUrl
           });
-          shareBody = mozL10n.get("share_email_body5", {
-            callUrl: actionData.roomUrl,
-            brandShortname: mozL10n.get("brandShortname"),
-            clientShortname2: mozL10n.get("clientShortname2"),
-            clientSuperShortname: mozL10n.get("clientSuperShortname"),
-            learnMoreUrl: this._mozLoop.getLoopPref("learnMoreUrl")
-          });
+          shareBody += mozL10n.get("share_email_footer");
           break;
         case "twitter.com":
         default:
           shareTitle = mozL10n.get("share_tweet", {
             clientShortname2: mozL10n.get("clientShortname2")
           });
           break;
       }
--- a/browser/components/loop/content/shared/js/activeRoomStore.js
+++ b/browser/components/loop/content/shared/js/activeRoomStore.js
@@ -757,19 +757,16 @@ loop.store.ActiveRoomStore = (function()
     /**
      * Handles recording when a remote peer has connected to the servers.
      */
     remotePeerConnected: function() {
       this.setStoreState({
         roomState: ROOM_STATES.HAS_PARTICIPANTS,
         used: true
       });
-
-      // We've connected with a third-party, therefore stop displaying the ToS etc.
-      this._mozLoop.setLoopPref("seenToS", "seen");
     },
 
     /**
      * Handles a remote peer disconnecting from the session. As we currently only
      * support 2 participants, we declare the room as SESSION_CONNECTED as soon as
      * one participantleaves.
      */
     remotePeerDisconnected: function() {
--- a/browser/components/loop/content/shared/js/utils.js
+++ b/browser/components/loop/content/shared/js/utils.js
@@ -393,50 +393,35 @@ var inChrome = typeof Components != "und
   function composeCallUrlEmail(callUrl, recipient, contextDescription, from) {
     var mozLoop = navigator.mozLoop;
     if (typeof mozLoop === "undefined") {
       console.warn("composeCallUrlEmail isn't available for Loop standalone.");
       return;
     }
 
     var subject, body;
-    var brandShortname = mozL10n.get("brandShortname");
-    var clientShortname2 = mozL10n.get("clientShortname2");
-    var clientSuperShortname = mozL10n.get("clientSuperShortname");
-    var learnMoreUrl = mozLoop.getLoopPref("learnMoreUrl");
+    var footer = mozL10n.get("share_email_footer");
 
     if (contextDescription) {
-      subject = mozL10n.get("share_email_subject_context", {
-        clientShortname2: clientShortname2,
-        title: contextDescription
-      });
-      body = mozL10n.get("share_email_body_context", {
+      subject = mozL10n.get("share_email_subject6");
+      body = mozL10n.get("share_email_body_context2", {
         callUrl: callUrl,
-        brandShortname: brandShortname,
-        clientShortname2: clientShortname2,
-        clientSuperShortname: clientSuperShortname,
-        learnMoreUrl: learnMoreUrl,
         title: contextDescription
       });
     } else {
-      subject = mozL10n.get("share_email_subject5", {
-        clientShortname2: clientShortname2
-      });
-      body = mozL10n.get("share_email_body5", {
-        callUrl: callUrl,
-        brandShortname: brandShortname,
-        clientShortname2: clientShortname2,
-        clientSuperShortname: clientSuperShortname,
-        learnMoreUrl: learnMoreUrl
+      subject = mozL10n.get("share_email_subject6");
+      body = mozL10n.get("share_email_body6", {
+        callUrl: callUrl
       });
     }
-
+    var bodyFooter =  body + footer;
+    bodyFooter = bodyFooter.replace(/\r\n/g, "\n").replace(/\n/g, "\r\n");
     mozLoop.composeEmail(
       subject,
-      body.replace(/\r\n/g, "\n").replace(/\n/g, "\r\n"),
+      bodyFooter,
       recipient
     );
 
     var bucket = mozLoop.SHARING_ROOM_URL["EMAIL_FROM_" + (from || "").toUpperCase()];
     if (typeof bucket === "undefined") {
       console.error("No URL sharing type bucket found for '" + from + "'");
       return;
     }
--- a/browser/components/loop/modules/LoopCalls.jsm
+++ b/browser/components/loop/modules/LoopCalls.jsm
@@ -205,21 +205,16 @@ let LoopCallsInternal = {
    *
    * @param {String} version The version information from the server.
    */
   onNotification: function(version, channelID) {
     if (MozLoopService.doNotDisturb) {
       return;
     }
 
-    // We set this here as it is assumed that once the user receives an incoming
-    // call, they'll have had enough time to see the terms of service. See
-    // bug 1046039 for background.
-    Services.prefs.setCharPref("loop.seenToS", "seen");
-
     // Request the information on the new call(s) associated with this version.
     // The registered FxA session is checked first, then the anonymous session.
     // Make the call to get the GUEST session regardless of whether the FXA
     // request fails.
 
     if (channelID == MozLoopService.channelIDs.callsFxA && MozLoopService.userProfile) {
       this._getCalls(LOOP_SESSION_TYPE.FXA, version);
     }
--- a/browser/components/loop/standalone/content/js/standaloneMozLoop.js
+++ b/browser/components/loop/standalone/content/js/standaloneMozLoop.js
@@ -265,20 +265,16 @@ loop.StandaloneMozLoop = (function(mozL1
      * Stores a preference in the local storage for standalone.
      * Note: Some prefs are filtered out as they are not applicable
      * to the standalone UI.
      *
      * @param {String} prefName The name of the pref
      * @param {String} value The value to set.
      */
     setLoopPref: function(prefName, value) {
-      if (prefName === "seenToS") {
-        return;
-      }
-
       localStorage.setItem(prefName, value);
     },
 
     /**
      * Gets a preference from the local storage for standalone.
      *
      * @param {String} prefName The name of the pref
      * @param {String} value The value to set.
--- a/browser/components/loop/test/desktop-local/panel_test.js
+++ b/browser/components/loop/test/desktop-local/panel_test.js
@@ -454,32 +454,36 @@ describe("loop.panel", function() {
         TestUtils.Simulate
           .click(view.getDOMNode().querySelector(".icon-help"));
 
         sinon.assert.calledOnce(fakeWindow.close);
       });
     });
 
     describe("#render", function() {
-      it("should render a ToSView", function() {
-        var view = createTestPanelView();
-
-        TestUtils.findRenderedComponentWithType(view, loop.panel.ToSView);
-      });
-
-      it("should not render a ToSView when the view has been 'seen'", function() {
+      it("should not render a ToSView when gettingStarted.seen is true", function() {
         navigator.mozLoop.getLoopPref = function() {
-          return "seen";
+          return true;
         };
         var view = createTestPanelView();
 
-        try {
+        expect(function() {
           TestUtils.findRenderedComponentWithType(view, loop.panel.ToSView);
-          sinon.assert.fail("Should not find the ToSView if it has been 'seen'");
-        } catch (ex) {}
+        }).to.Throw(/not find/);
+      });
+
+      it("should not render a ToSView when gettingStarted.seen is false", function() {
+        navigator.mozLoop.getLoopPref = function() {
+          return false;
+        };
+        var view = createTestPanelView();
+
+        expect(function() {
+          TestUtils.findRenderedComponentWithType(view, loop.panel.ToSView);
+        }).to.not.Throw();
       });
 
       it("should render a GettingStarted view", function() {
         navigator.mozLoop.getLoopPref = function(pref) {
           return false;
         };
         var view = createTestPanelView();
 
@@ -984,80 +988,16 @@ describe("loop.panel", function() {
       // Simulate being visible.
       view.onDocumentVisible();
 
       var contextPreview = view.getDOMNode().querySelector(".context-preview");
       expect(contextPreview.src).eql(favicon);
     });
   });
 
-  describe("loop.panel.ToSView", function() {
-
-    it("should render when the value of loop.seenToS is not set", function() {
-      navigator.mozLoop.getLoopPref = function(key) {
-        return {
-          "gettingStarted.seen": true,
-          "seenToS": "unseen"
-        }[key];
-      };
-
-      var view = TestUtils.renderIntoDocument(
-        React.createElement(loop.panel.ToSView));
-
-      TestUtils.findRenderedDOMComponentWithClass(view, "terms-service");
-    });
-
-    it("should not render when the value of loop.seenToS is set to 'seen'", function() {
-        navigator.mozLoop.getLoopPref = function(key) {
-          return {
-            "gettingStarted.seen": true,
-            "seenToS": "seen"
-          }[key];
-        };
-
-        var view = TestUtils.renderIntoDocument(
-          React.createElement(loop.panel.ToSView));
-
-        expect(function() {
-          TestUtils.findRenderedDOMComponentWithClass(view, "terms-service");
-        }).to.Throw(/not find/);
-    });
-
-    it("should render when the value of loop.gettingStarted.seen is false",
-       function() {
-         navigator.mozLoop.getLoopPref = function(key) {
-           return {
-             "gettingStarted.seen": false,
-             "seenToS": "seen"
-           }[key];
-         };
-         var view = TestUtils.renderIntoDocument(
-           React.createElement(loop.panel.ToSView));
-
-         TestUtils.findRenderedDOMComponentWithClass(view, "terms-service");
-       });
-
-    it("should render the telefonica logo after the first time use",
-       function() {
-         navigator.mozLoop.getLoopPref = function(key) {
-           return {
-             "gettingStarted.seen": false,
-             "seenToS": "unseen",
-             "showPartnerLogo": false
-           }[key];
-         };
-
-         var view = TestUtils.renderIntoDocument(
-           React.createElement(loop.panel.ToSView));
-
-         expect(view.getDOMNode().querySelector(".powered-by")).eql(null);
-       });
-
-  });
-
   describe("loop.panel.SignInRequestView", function() {
     var view;
 
     function mountTestComponent() {
       return TestUtils.renderIntoDocument(
         React.createElement(loop.panel.SignInRequestView, {
           mozLoop: fakeMozLoop
         }));
--- a/browser/components/loop/test/desktop-local/roomStore_test.js
+++ b/browser/components/loop/test/desktop-local/roomStore_test.js
@@ -576,17 +576,17 @@ describe("loop.store.RoomStore", functio
           roomUrl: roomUrl,
           provider: {
             origin: origin
           }
         }));
 
         sinon.assert.calledOnce(fakeMozLoop.socialShareRoom);
         sinon.assert.calledWithExactly(fakeMozLoop.socialShareRoom, origin,
-          roomUrl, "share_email_subject5", "share_email_body5");
+          roomUrl, "share_email_subject6", "share_email_body6" + "share_email_footer");
       });
 
       it("should pass the correct data for all other Social Providers", function() {
         var roomUrl = "http://invalid2";
         var origin = "https://twitter.com/share";
         store.shareRoomUrl(new sharedActions.ShareRoomUrl({
           roomUrl: roomUrl,
           provider: {
--- a/browser/components/loop/test/shared/activeRoomStore_test.js
+++ b/browser/components/loop/test/shared/activeRoomStore_test.js
@@ -1267,24 +1267,16 @@ describe("loop.store.ActiveRoomStore", f
   });
 
   describe("#remotePeerConnected", function() {
     it("should set the state to `HAS_PARTICIPANTS`", function() {
       store.remotePeerConnected();
 
       expect(store.getStoreState().roomState).eql(ROOM_STATES.HAS_PARTICIPANTS);
     });
-
-    it("should set the pref for ToS to `seen`", function() {
-      store.remotePeerConnected();
-
-      sinon.assert.calledOnce(fakeMozLoop.setLoopPref);
-      sinon.assert.calledWithExactly(fakeMozLoop.setLoopPref,
-        "seenToS", "seen");
-    });
   });
 
   describe("#remotePeerDisconnected", function() {
     it("should set the state to `SESSION_CONNECTED`", function() {
       store.remotePeerDisconnected();
 
       expect(store.getStoreState().roomState).eql(ROOM_STATES.SESSION_CONNECTED);
     });
--- a/browser/components/loop/test/shared/utils_test.js
+++ b/browser/components/loop/test/shared/utils_test.js
@@ -350,24 +350,24 @@ describe("loop.shared.utils", function()
 
   describe("#composeCallUrlEmail", function() {
     var composeEmail, telemetryAddValue;
 
     beforeEach(function() {
       // fake mozL10n
       sandbox.stub(navigator.mozL10n, "get", function(id) {
         switch(id) {
-          case "share_email_subject5":
+          case "share_email_subject6":
             return "subject";
-          case "share_email_body5":
+          case "share_email_body6":
             return "body";
-          case "share_email_subject_context":
-            return "subject_context";
-          case "share_email_body_context":
+          case "share_email_body_context2":
             return "body_context";
+          case "share_email_footer":
+            return "footer";
         }
       });
       composeEmail = sandbox.spy();
       telemetryAddValue = sandbox.spy();
       navigator.mozLoop = {
         SHARING_ROOM_URL: {
           EMAIL_FROM_CALLFAILED: 2,
           EMAIL_FROM_CONVERSATION: 3
@@ -380,24 +380,24 @@ describe("loop.shared.utils", function()
       sandbox.stub(window.console, "error");
     });
 
     it("should compose a call url email", function() {
       sharedUtils.composeCallUrlEmail("http://invalid", "fake@invalid.tld");
 
       sinon.assert.calledOnce(composeEmail);
       sinon.assert.calledWith(composeEmail,
-                              "subject", "body", "fake@invalid.tld");
+                              "subject", "body" + "footer", "fake@invalid.tld");
     });
 
     it("should compose a different email when context info is provided", function() {
       sharedUtils.composeCallUrlEmail("http://invalid", null, "Hello, is me you're looking for?");
 
       sinon.assert.calledOnce(composeEmail);
-      sinon.assert.calledWith(composeEmail, "subject_context", "body_context");
+      sinon.assert.calledWith(composeEmail, "subject", "body_context" + "footer");
     });
 
     it("should record a telemetry event when an email is composed", function() {
       sharedUtils.composeCallUrlEmail("http://invalid", null,
         "Hello, is me you're looking for?", "callfailed");
 
       sinon.assert.calledOnce(telemetryAddValue, "LOOP_SHARING_ROOM_URL",  2);
     });
--- a/browser/components/loop/test/standalone/standaloneMozLoop_test.js
+++ b/browser/components/loop/test/standalone/standaloneMozLoop_test.js
@@ -50,22 +50,16 @@ describe("loop.StandaloneMozLoop", funct
       localStorage.removeItem("fakePref");
     });
 
     it("should store the value of the preference", function() {
       mozLoop.setLoopPref("fakePref", "fakeValue");
 
       expect(localStorage.getItem("fakePref")).eql("fakeValue");
     });
-
-    it("should not store the value of seenToS", function() {
-      mozLoop.setLoopPref("seenToS", "fakeValue1");
-
-      expect(localStorage.getItem("seenToS")).eql(null);
-    });
   });
 
   describe("#getLoopPref", function() {
     afterEach(function() {
       localStorage.removeItem("fakePref");
     });
 
     it("should return the value of the preference", function() {
--- a/browser/components/loop/test/xpcshell/test_loopservice_notification.js
+++ b/browser/components/loop/test/xpcshell/test_loopservice_notification.js
@@ -5,34 +5,29 @@
 "use strict";
 
 XPCOMUtils.defineLazyModuleGetter(this, "Chat",
                                   "resource:///modules/Chat.jsm");
 
 let openChatOrig = Chat.open;
 
 add_test(function test_openChatWindow_on_notification() {
-  Services.prefs.setCharPref("loop.seenToS", "unseen");
-
   mockPushHandler.registrationPushURL = kEndPointUrl;
 
   MozLoopService.promiseRegisteredWithServers(LOOP_SESSION_TYPE.FXA).then(() => {
     let opened = false;
     Chat.open = function() {
       opened = true;
     };
 
     mockPushHandler.notify(1, MozLoopService.channelIDs.callsFxA);
 
     waitForCondition(() => opened).then(() => {
       do_check_true(opened, "should open a chat window");
 
-      do_check_eq(Services.prefs.getCharPref("loop.seenToS"), "seen",
-                  "should set the pref to 'seen'");
-
       run_next_test();
     }, () => {
       do_throw("should have opened a chat window");
     });
 
   });
 });
 
@@ -51,15 +46,12 @@ function run_test() {
     response.write(JSON.stringify({calls: [{callId: 4444333221, websocketToken: "0deadbeef0"}]}));
     response.processAsync();
     response.finish();
   });
 
   do_register_cleanup(function() {
     // Revert original Chat.open implementation
     Chat.open = openChatOrig;
-
-    // clear test pref
-    Services.prefs.clearUserPref("loop.seenToS");
   });
 
   run_next_test();
 }
--- a/browser/components/preferences/in-content/sync.js
+++ b/browser/components/preferences/in-content/sync.js
@@ -235,42 +235,38 @@ let gSyncPane = {
     setEventListener("loginErrorResetPass", "click", function () {
       gSyncPane.resetPass();
       return false;
     });
     setEventListener("loginErrorStartOver", "click", function () {
       gSyncPane.startOver(true);
       return false;
     });
-    setEventListener("noFxaSignUp", "click", function () {
+    setEventListener("noFxaSignUp", "command", function () {
       gSyncPane.signUp();
       return false;
     });
-    setEventListener("noFxaSignIn", "click", function () {
+    setEventListener("noFxaSignIn", "command", function () {
       gSyncPane.signIn();
       return false;
     });
-    setEventListener("noFxaUseOldSync", "click", function () {
-      gSyncPane.openOldSyncSupportPage();
-      return false;
-    });
     setEventListener("verifiedManage", "command",
       gSyncPane.manageFirefoxAccount);
     setEventListener("fxaUnlinkButton", "click", function () {
       gSyncPane.unlinkFirefoxAccount(true);
     });
     setEventListener("verifyFxaAccount", "command",
       gSyncPane.verifyFirefoxAccount);
-    setEventListener("unverifiedUnlinkFxaAccount", "click", function () {
+    setEventListener("unverifiedUnlinkFxaAccount", "command", function () {
       /* no warning as account can't have previously synced */
       gSyncPane.unlinkFirefoxAccount(false);
     });
     setEventListener("rejectReSignIn", "command",
       gSyncPane.reSignIn);
-    setEventListener("rejectUnlinkFxaAccount", "click", function () {
+    setEventListener("rejectUnlinkFxaAccount", "command", function () {
       gSyncPane.unlinkFirefoxAccount(true);
     });
     setEventListener("tosPP-small-ToS", "click", gSyncPane.openToS);
     setEventListener("tosPP-small-PP", "click", gSyncPane.openPrivacyPolicy);
     setEventListener("sync-migrate-upgrade", "click", function () {
       let win = Services.wm.getMostRecentWindow("navigator:browser");
       fxaMigrator.createFxAccount(win);
     });
--- a/browser/components/preferences/in-content/sync.xul
+++ b/browser/components/preferences/in-content/sync.xul
@@ -195,148 +195,181 @@
       </label>
     </hbox>
     <label id="loginErrorStartOver" class="text-link">
       &unlinkDevice.label;
     </label>
   </vbox>
 
   <!-- These panels are for the Firefox Accounts identity provider -->
-  <vbox id="noFxaAccount" align="start">
-    <label>&welcome.description;</label>
-    <label id="noFxaSignUp" class="text-link">
-      &welcome.createAccount.label;
-    </label>
-    <label id="noFxaSignIn" class="text-link">
-      &welcome.signIn.label;
-    </label>
-    <separator/>
-    <label id="noFxaUseOldSync" class="text-link">
-      &welcome.useOldSync.label;
-    </label>
+  <vbox id="noFxaAccount">
+    <hbox>
+      <groupbox id="noFxaGroup">
+        <vbox>
+          <label id="noFxaCaption">&signedOut.caption;</label>
+          <description id="noFxaDescription" flex="1">&signedOut.description;</description>
+          <hbox class="fxaAccountBox">
+            <image class="fxaFirefoxLogo"/>
+            <vbox>
+              <label id="signedOutAccountBoxTitle">&signedOut.accountBox.title;</label>
+              <hbox>
+                <button id="noFxaSignUp" label="&signedOut.accountBox.create;"/>
+                <button id="noFxaSignIn" label="&signedOut.accountBox.signin;"/>
+              </hbox>
+            </vbox>
+          </hbox>
+        </vbox>
+      </groupbox>
+      <image class="fxaSyncIllustration"/>
+    </hbox>
+    <hbox class="fxaMobilePromo">
+      <label>&mobilePromo.start;</label>
+      <image class="androidLogo"/>
+      <label class="text-link"
+             href="https://www.mozilla.org/firefox/android/">
+        &mobilePromo.androidLink;
+      </label>
+      <label>&mobilePromo.end;</label>
+    </hbox>
+    <label class="androidAttribution">&androidAttribution;</label>
   </vbox>
 
   <vbox id="hasFxaAccount">
-    <groupbox id="fxaGroup">
-      <caption><label>&syncBrand.fxAccount.label;</label></caption>
+    <hbox>
+      <vbox>
+        <groupbox id="fxaGroup">
+          <caption><label>&syncBrand.fxAccount.label;</label></caption>
 
-      <deck id="fxaLoginStatus">
+              <deck id="fxaLoginStatus">
 
-        <!-- logged in and verified and all is good -->
-        <hbox id="fxaLoginVerified"
-              align="center">
-          <hbox align="center">
-            <image id="fxaProfileImage"
-              onclick="gSyncPane.openChangeProfileImage();" hidden="true"
-              tooltiptext="&profilePicture.tooltip;"/>
-            <label id="fxaEmailAddress1"/>
-            <label id="fxaDisplayName" hidden="true"/>
-          </hbox>
-          <spacer flex="1"/>
-          <button id="verifiedManage"
-                  label="&manage.label;"/>
-          <button id="fxaUnlinkButton"
-                  label="&disconnect.label;"/>
-        </hbox>
+                <!-- logged in and verified and all is good -->
+                <hbox id="fxaLoginVerified" class="fxaAccountBox">
+                  <image id="fxaProfileImage"
+                      onclick="gSyncPane.openChangeProfileImage();" hidden="true"
+                      tooltiptext="&profilePicture.tooltip;" class="actionable"/>
+                  <vbox>
+                    <label id="fxaEmailAddress1"/>
+                    <label id="fxaDisplayName" hidden="true"/>
+                    <hbox class="fxaAccountBoxButtons">
+                      <button id="verifiedManage" label="&manage.label;"/>
+                      <button id="fxaUnlinkButton" label="&disconnect.label;"/>
+                    </hbox>
+                  </vbox>
+                </hbox>
 
-        <!-- logged in to an unverified account -->
-        <hbox id="fxaLoginUnverified"
-              flex="1">
-          <description>
-            &signedInUnverified.beforename.label;
-            <label id="fxaEmailAddress2"/>
-            &signedInUnverified.aftername.label;
-          </description>
-          <spacer flex="1"/>
-          <vbox align="end">
-            <button id="verifyFxaAccount"
-                    label="&verify.label;"/>
-            <label id="unverifiedUnlinkFxaAccount" class="text-link">
-              &forget.label;
-            </label>
-          </vbox>
-        </hbox>
+                <!-- logged in to an unverified account -->
+                <hbox id="fxaLoginUnverified" class="fxaAccountBox">
+                  <image id="fxaProfileImage"/>
+                  <vbox>
+                    <hbox>
+                      <vbox><image id="fxaLoginRejectedWarning"/></vbox>
+                      <description>
+                        &signedInUnverified.beforename.label;
+                        <label id="fxaEmailAddress2"/>
+                        &signedInUnverified.aftername.label;
+                      </description>
+                    </hbox>
+                    <hbox class="fxaAccountBoxButtons">
+                      <button id="verifyFxaAccount" label="&verify.label;"/>
+                      <button id="unverifiedUnlinkFxaAccount" label="&forget.label;"/>
+                    </hbox>
+                  </vbox>
+                </hbox>
 
-        <!-- logged in locally but server rejected credentials -->
-        <hbox id="fxaLoginRejected"
-              flex="1">
-          <vbox>
-            <image id="fxaLoginRejectedWarning"/>
-          </vbox>
-          <description>
-            &signedInLoginFailure.beforename.label;
-            <label id="fxaEmailAddress3"/>
-            &signedInLoginFailure.aftername.label;
-          </description>
-          <spacer flex="1"/>
-          <vbox align="end">
-            <button id="rejectReSignIn"
-                    label="&signIn.label;"/>
-            <label id="rejectUnlinkFxaAccount" class="text-link">
-              &forget.label;
-            </label>
-          </vbox>
-        </hbox>
-      </deck>
-    </groupbox>
-
-    <groupbox id="syncOptions">
-      <caption><label>&syncBrand.shortName.label;</label></caption>
-      <hbox id="fxaSyncEngines">
-        <vbox align="start">
-          <checkbox label="&engine.tabs.label;"
-                    accesskey="&engine.tabs.accesskey;"
-                    preference="engine.tabs"/>
-          <checkbox label="&engine.bookmarks.label;"
-                    accesskey="&engine.bookmarks.accesskey;"
-                    preference="engine.bookmarks"/>
-          <checkbox label="&engine.passwords.label;"
-                    accesskey="&engine.passwords.accesskey;"
-                    preference="engine.passwords"/>
-        </vbox>
-        <vbox align="start">
-          <checkbox label="&engine.history.label;"
-                    accesskey="&engine.history.accesskey;"
-                    preference="engine.history"/>
-          <checkbox label="&engine.addons.label;"
-                    accesskey="&engine.addons.accesskey;"
-                    preference="engine.addons"/>
-          <checkbox label="&engine.prefs.label;"
-                    accesskey="&engine.prefs.accesskey;"
-                    preference="engine.prefs"/>
-        </vbox>
-        <spacer/>
-      </hbox>
-    </groupbox>
+                <!-- logged in locally but server rejected credentials -->
+                <hbox id="fxaLoginRejected" class="fxaAccountBox">
+                  <image id="fxaProfileImage"/>
+                  <vbox>
+                    <hbox>
+                      <vbox><image id="fxaLoginRejectedWarning"/></vbox>
+                      <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 id="syncOptions">
+          <caption><label>&signedIn.engines.caption;</label></caption>
+          <hbox id="fxaSyncEngines">
+            <vbox align="start">
+              <checkbox label="&engine.tabs.label;"
+                        accesskey="&engine.tabs.accesskey;"
+                        preference="engine.tabs"/>
+              <checkbox label="&engine.bookmarks.label;"
+                        accesskey="&engine.bookmarks.accesskey;"
+                        preference="engine.bookmarks"/>
+              <checkbox label="&engine.passwords.label;"
+                        accesskey="&engine.passwords.accesskey;"
+                        preference="engine.passwords"/>
+            </vbox>
+            <vbox align="start">
+              <checkbox label="&engine.history.label;"
+                        accesskey="&engine.history.accesskey;"
+                        preference="engine.history"/>
+              <checkbox label="&engine.addons.label;"
+                        accesskey="&engine.addons.accesskey;"
+                        preference="engine.addons"/>
+              <checkbox label="&engine.prefs.label;"
+                        accesskey="&engine.prefs.accesskey;"
+                        preference="engine.prefs"/>
+            </vbox>
+            <spacer/>
+          </hbox>
+        </groupbox>
+      </vbox>
+      <spacer flex="1"/>
+      <image class="fxaSyncIllustration"/>
+    </hbox>
+    <spacer class="separator"/>
     <groupbox>
       <caption>
         <label accesskey="&syncDeviceName.accesskey;"
                control="fxaSyncComputerName">
           &fxaSyncDeviceName.label;
         </label>
       </caption>
       <hbox id="fxaDeviceName">
-        <hbox flex="1">
+        <hbox>
           <textbox id="fxaSyncComputerName" disabled="true" flex="1"/>
         </hbox>
+        <spacer flex="1"/>
         <hbox>
           <button id="fxaChangeDeviceName"
                   label="&changeSyncDeviceName.label;"/>
           <button id="fxaCancelChangeDeviceName"
                   label="&cancelChangeSyncDeviceName.label;"
                   hidden="true"/>
           <button id="fxaSaveChangeDeviceName"
                   label="&saveChangeSyncDeviceName.label;"
                   hidden="true"/>
         </hbox>
       </hbox>
     </groupbox>
+    <spacer class="separator"/>
+    <hbox class="fxaMobilePromo">
+      <label>&mobilePromo.start;</label>
+      <image class="androidLogo"/>
+      <label class="text-link"
+             href="https://www.mozilla.org/firefox/android/">
+        &mobilePromo.androidLink;
+      </label>
+      <label>&mobilePromo.end;</label>
+    </hbox>
     <spacer flex="1"/>
     <vbox id="tosPP-small">
       <label id="tosPP-small-ToS" class="text-link">
         &prefs.tosLink.label;
       </label>
       <label id="tosPP-small-PP" class="text-link">
         &fxaPrivacyNotice.link.label;
       </label>
     </vbox>
+    <label class="androidAttribution">&androidAttribution;</label>
   </vbox>
 </deck>
--- a/browser/locales/en-US/chrome/browser/loop/loop.properties
+++ b/browser/locales/en-US/chrome/browser/loop/loop.properties
@@ -50,28 +50,25 @@ check_internet_connection=Please check y
 login_expired=Your Login Has Expired
 service_not_available=Service Unavailable At This Time
 problem_accessing_account=There Was A Problem Accessing Your Account
 
 ## LOCALIZATION NOTE(retry_button): Displayed when there is an error to retry
 ## the appropriate action.
 retry_button=Retry
 
-share_email_subject5={{clientShortname2}} — Join the conversation
-## LOCALIZATION NOTE (share_email_subject_context): This is the alternate email
-## subject when a conversation is shared with a context attached.
-## {{clientShortName2}} will be replaced with the respective string in this file.
-## {{title}} will be replaced with the title of an HTML document.
-share_email_subject_context={{clientShortname2}} conversation: {{title}}
-## LOCALIZATION NOTE (share_email_body4): In this item, don't translate the
+share_email_subject6=Join me for a video conversation
+## LOCALIZATION NOTE (share_email_body6): In this item, don't translate the
 ## part between {{..}} and leave the \n\n part alone
-share_email_body5=Hello!\n\nJoin me for a video conversation on {{clientShortname2}}.\n\nIt's the easiest way to connect by video with anyone anywhere.  With {{clientSuperShortname}}, you don't have to download or install anything. Just click or paste this link into your {{brandShortname}}, Opera or Chrome browser to join the conversation:\n\n{{callUrl}}\n\nIf you'd like to learn more about {{clientSuperShortname}} and how you can start your own free video conversations, visit {{learnMoreUrl}}\n\nTalk to you soon!
-## LOCALIZATION NOTE (share_email_body_context): In this item, don't translate
+share_email_body6=Click the Firefox Hello link to connect to the conversation now: {{callUrl}}
+## LOCALIZATION NOTE (share_email_body_context2): In this item, don't translate
 ## the part between {{..}} and leave the \n\n part alone.
-share_email_body_context=Hello!\n\nJoin me for a video conversation on {{clientShortname2}} about:\n{{title}}.\n\nIt's the easiest way to connect by video with anyone anywhere.  With {{clientSuperShortname}}, you don't have to download or install anything. Just click or paste this link into your {{brandShortname}}, Opera or Chrome browser to join the conversation:\n\n{{callUrl}}\n\nIf you'd like to learn more about {{clientSuperShortname}} and how you can start your own free video conversations, visit {{learnMoreUrl}}\n\nTalk to you soon!
+share_email_body_context2=Join me for a video conversation. Click the Firefox Hello link to connect now: {{callUrl}}\n\nLet’s talk about this during our conversation: {{title}}
+## LOCALIZATION NOTE (share_email_footer): Common footer content for both email types
+share_email_footer=\n\n________\nJoin and create video conversations free with Firefox Hello. Connect easily over video with anyone, anywhere. No downloads or registration. Learn more at http://www.firefox.com/hello
 ## LOCALIZATION NOTE (share_tweeet): In this item, don't translate the part
 ## between {{..}}. Please keep the text below 117 characters to make sure it fits
 ## in a tweet.
 share_tweet=Join me for a video conversation on {{clientShortname2}}!
 
 share_button3=Share Link
 share_add_service_button=Add a Service
 copy_url_button2=Copy Link
--- a/browser/locales/en-US/chrome/browser/preferences/sync.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/sync.dtd
@@ -78,8 +78,22 @@ both, to better adapt this sentence to t
 <!ENTITY verify.label                "Verify Email">
 <!ENTITY forget.label                "Forget this Email">
 
 <!ENTITY welcome.description "Access your tabs, bookmarks, passwords and more wherever you use &brandShortName;.">
 <!ENTITY welcome.signIn.label "Sign In">
 <!ENTITY welcome.createAccount.label "Create Account">
 
 <!ENTITY welcome.useOldSync.label "Using an older version of Sync?">
+
+<!ENTITY signedOut.caption            "Take your Web with you">
+<!ENTITY signedOut.description        "Synchronize your bookmarks, history, tabs, passwords, add-ons, and preferences across all your devices.">
+<!ENTITY signedOut.accountBox.title   "Connect with a &syncBrand.fxAccount.label;">
+<!ENTITY signedOut.accountBox.create  "Create Account">
+<!ENTITY signedOut.accountBox.signin  "Sign In">
+
+<!ENTITY signedIn.engines.caption     "Sync between all devices">
+
+<!ENTITY mobilePromo.start            "Download Firefox for ">
+<!-- LOCALIZATION NOTE (mobilePromo.androidLink): This is a link title that links to https://www.mozilla.org/firefox/android/ -->
+<!ENTITY mobilePromo.androidLink      "Android™">
+<!ENTITY mobilePromo.end              " to sync with your mobile device.">
+<!ENTITY androidAttribution           "Android is a trademark of Google Inc.">
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -217,17 +217,24 @@ browser.jar:
   skin/classic/browser/preferences/Options-sync.png   (preferences/Options-sync.png)
 #endif
 * skin/classic/browser/preferences/preferences.css    (preferences/preferences.css)
 * skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css      (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/in-content/favicon.ico     (../shared/incontentprefs/favicon.ico)
   skin/classic/browser/preferences/in-content/icons.svg       (../shared/incontentprefs/icons.svg)
   skin/classic/browser/preferences/in-content/search.css      (../shared/incontentprefs/search.css)
-  skin/classic/browser/fxa/default-profile-image.svg   (../shared/fxa/default-profile-image.svg)
+  skin/classic/browser/fxa/default-avatar.png                 (../shared/fxa/default-avatar.png)
+  skin/classic/browser/fxa/default-avatar@2x.png              (../shared/fxa/default-avatar@2x.png)
+  skin/classic/browser/fxa/logo.png                           (../shared/fxa/logo.png)
+  skin/classic/browser/fxa/logo@2x.png                        (../shared/fxa/logo@2x.png)
+  skin/classic/browser/fxa/sync-illustration.png              (../shared/fxa/sync-illustration.png)
+  skin/classic/browser/fxa/sync-illustration@2x.png           (../shared/fxa/sync-illustration@2x.png)
+  skin/classic/browser/fxa/android.png                        (../shared/fxa/android.png)
+  skin/classic/browser/fxa/android@2x.png                     (../shared/fxa/android@2x.png)
   skin/classic/browser/preferences/applications.css   (preferences/applications.css)
   skin/classic/browser/preferences/aboutPermissions.css (preferences/aboutPermissions.css)
   skin/classic/browser/preferences/search.css         (preferences/search.css)
   skin/classic/browser/social/services-16.png         (social/services-16.png)
   skin/classic/browser/social/services-64.png         (social/services-64.png)
   skin/classic/browser/social/share-button.png        (social/share-button.png)
   skin/classic/browser/social/share-button-active.png (social/share-button-active.png)
   skin/classic/browser/social/chat-icons.svg          (../shared/social/chat-icons.svg)
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -293,17 +293,24 @@ browser.jar:
 #endif
   skin/classic/browser/preferences/saveFile.png             (preferences/saveFile.png)
 * skin/classic/browser/preferences/preferences.css          (preferences/preferences.css)
 * skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css      (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/in-content/favicon.ico     (../shared/incontentprefs/favicon.ico)
   skin/classic/browser/preferences/in-content/icons.svg       (../shared/incontentprefs/icons.svg)
   skin/classic/browser/preferences/in-content/search.css      (../shared/incontentprefs/search.css)
-  skin/classic/browser/fxa/default-profile-image.svg   (../shared/fxa/default-profile-image.svg)
+  skin/classic/browser/fxa/default-avatar.png               (../shared/fxa/default-avatar.png)
+  skin/classic/browser/fxa/default-avatar@2x.png            (../shared/fxa/default-avatar@2x.png)
+  skin/classic/browser/fxa/logo.png                         (../shared/fxa/logo.png)
+  skin/classic/browser/fxa/logo@2x.png                      (../shared/fxa/logo@2x.png)
+  skin/classic/browser/fxa/sync-illustration.png            (../shared/fxa/sync-illustration.png)
+  skin/classic/browser/fxa/sync-illustration@2x.png         (../shared/fxa/sync-illustration@2x.png)
+  skin/classic/browser/fxa/android.png                      (../shared/fxa/android.png)
+  skin/classic/browser/fxa/android@2x.png                   (../shared/fxa/android@2x.png)
   skin/classic/browser/preferences/applications.css         (preferences/applications.css)
   skin/classic/browser/preferences/aboutPermissions.css     (preferences/aboutPermissions.css)
   skin/classic/browser/preferences/search.css               (preferences/search.css)
   skin/classic/browser/preferences/checkbox.png             (preferences/checkbox.png)
   skin/classic/browser/preferences/checkbox@2x.png          (preferences/checkbox@2x.png)
   skin/classic/browser/yosemite/preferences/checkbox.png    (preferences/checkbox-yosemite.png)
   skin/classic/browser/yosemite/preferences/checkbox@2x.png (preferences/checkbox-yosemite@2x.png)
   skin/classic/browser/social/services-16.png               (social/services-16.png)
--- a/browser/themes/osx/preferences/preferences.css
+++ b/browser/themes/osx/preferences/preferences.css
@@ -233,20 +233,16 @@ html|a.inline-link:-moz-focusring {
   list-style-image: url("chrome://mozapps/skin/profile/profileicon.png");
 }
 
 #syncAddDeviceLabel {
   margin-top: 1em;
   margin-bottom: 1em;
 }
 
-#fxaUnlinkButton {
-  margin: 0;
-}
-
 #noFxaAccount {
   margin: 12px 4px;
   line-height: 1.2em;
 }
 
 #noFxaAccount > label:first-child {
   margin-bottom: 0.6em;
 }
--- a/browser/themes/shared/customizableui/panelUIOverlay.inc.css
+++ b/browser/themes/shared/customizableui/panelUIOverlay.inc.css
@@ -697,17 +697,17 @@ toolbarpaletteitem[place="palette"] > to
   align-self: center;
   margin: 0px 7px;
   padding: 0px;
   border: 0px none;
   -moz-margin-end: 0;
 }
 
 #PanelUI-footer-fxa[fxaprofileimage="enabled"] > #PanelUI-fxa-status > #PanelUI-fxa-avatar {
-  list-style-image: url(chrome://browser/skin/fxa/default-profile-image.svg);
+  list-style-image: url(chrome://browser/skin/fxa/default-avatar.png)
 }
 
 #PanelUI-customize:hover,
 #PanelUI-help:not([disabled]):hover,
 #PanelUI-quit:not([disabled]):hover {
   -moz-image-region: rect(0, 32px, 16px, 16px);
 }
 
@@ -1493,16 +1493,20 @@ menuitem[checked="true"].subviewbutton >
     background-image: url(chrome://browser/skin/customizableui/subView-arrow-back-inverted-rtl@2x.png),
                       linear-gradient(rgba(255,255,255,0.3), transparent);
   }
 
   #PanelUI-update-status {
     list-style-image: url(chrome://branding/content/icon32.png);
   }
 
+  #PanelUI-footer-fxa[fxaprofileimage="enabled"] > #PanelUI-fxa-status > #PanelUI-fxa-avatar {
+    list-style-image: url(chrome://browser/skin/fxa/default-avatar@2x.png)
+  }
+
   #PanelUI-fxa-label,
   #PanelUI-fxa-icon {
     list-style-image: url(chrome://browser/skin/sync-horizontalbar@2x.png);
   }
 
   #PanelUI-footer-fxa[syncstatus="active"] > #PanelUI-fxa-icon {
     list-style-image: url(chrome://browser/skin/syncProgress-horizontalbar@2x.png);
   }
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bb1ada87ffa878bcafe13172a865505b73070e11
GIT binary patch
literal 15286
zc%1E<e{2(F7{`wvf=q@J#3`Vh2Ln{D_oLTdd$gUiWo&5Y?1pqmWY@d5>q*-yz1!N2
zDZl<vG??N30G$az#gL$~KtLlu9VTcr7$iuDBqI=r#K06o6cg~SKek)j%_U&`=e^|a
zde8fOpU-pe`#$fz|MZR8nnlG$(~1xTDXy;a__X`O+BxIiaoTnDr8QTz+k{wEgMuIr
zmFefGYTxWW1hM}i)%#Vy_c>0GBPL#y1HhDw#1Q>(lqX}nuo9?f05nNaCwA@2!x$=w
zPHd^gOL}8&5R$6e;-Idrre0`UDcD7<+*RaAa$0~0P<b>N2}cz!>BLfTIqkP@CNMPR
zqONpe6?y~e_tv6rISx>Z$%+f4l|@;*iL$UP!_G%(lClt_nJ|+$ZRQw~V`wyUV6GzV
z>WGU$&gZGj;It<v7E;w1M-Yib!jv$Z<aiT7+3j|MqzRhFH4j{AjjDVSk1Dg$L9%f?
zKoR0nOqJv)sz37qxmk5$SP^PCGVc|M^@E~Hrth>~B$9lLpiCrDNF)mVnpkr@oJvg;
z2oMGl5LFdTM-|k?Lb56=A$bU7fAf%FEnBa5_<SRgf=WeQ*rE=vRO(w}fbaoDZjK9J
zVT<-EvkHY$rC_jdB)w(G+(A+rLZ-K*Wv&68Lwi@w9S6KB$LnP|>`KqF+H4=8Zg*-{
zq4T`FAVqcK6AmI*R45+sXs1ip;v|dHWIe@lq?w~^+9OAjh9GIroETnNl!C2=VlW(K
zHpVb`=El$}NaR(1L{W^shB%_Y1?6~zS6xzsZvsRt+T<Vxj0VsCdBwTqupHOY0xq+I
zC}bX-r`O9>M-`Qi3ZUBK(hMd^5;@jtqXIObae=W0afWB?ct9i>90VDGB+Yh<$g-)_
z2g~z9dt{+muNSQ?y|jq3poJeui!}#m)+W%nH7M{nMX@&A###e-z|2wsU=7eDW6pvM
z!SX=Q$0cp$<HH6Y{ar*22F!pq2ZAgP1V+G_fM~~g8*jtyHil;zN(_Ram_-x_lZUF3
z6m9CYx(3bv)S6TWRt>gh8^Tg*jf(Mc1?Uy%#Ihxb<q336s**Wg&{sE?kea4iii4~}
z%cT6_99b9S$%kenLLfR^c^SNh4x-3GHNnS0MU&RkBdh&F!n__Q(p~-^428nC+}S{k
ztgh~GAdIWa|2Yr?03pOjn}FydvcjxkWMh}M4z8|j#pYL|L;pnSm8|8&r-q1f5P7y-
zf4@Er!p&)ah9R|sp!91-Yi!TeHvEgWVHoW|(~_v9y6B7~$81pPU()nyUZ-vPfXiyJ
zm@N(>*PN@Um69Or_ek2Rrs#RlOh%L2P*B)l5Za8whCE?<ungO?^xluiZ2q);C(*z0
zEHq{A{sAEn0wE9rArJx~5CS0(0wE9rArJx~5CS0(0wE9rArJx~5CS0(0wE9rArJx~
z5CS0(0wE9rArJx~5CS0(0wE9rArNwxAw>g!<pfdDi6yXd*Yzvr(+Gl~LY2>pAZ=v`
zvUUT4{B>Kq|AHXRB!XONL=bKZf|SaeSA1QGAfp`Bo{IY9*<Vj}FCJ4-GOqX9rVpod
z``+uF;`g6@<*A)N?x>0Mm2{|BRo_%kZTslyuZ};uxO?}Wy}qLx&g^>p*!N}BT))`(
z`MEWhZ>?zwCf=#s^U;x-j`NXYHz(idUa%2e5`H^Wx@%_dq1U(3mA&&z!edty|9Ril
z-J5!__1hn1`qoana{i^_mwP6i?t3us@#N#NbyJs*pSe$Nw;u~q+h?D=i2pqCyHYpy
znR^x0K7Id%HnQs*`{t_U6Hm-};LMD7e_GVp?K*n+g?0CoE!!v@xG=Br;3MbIrjwz4
zuAZ9TV`EpF=e)n|#MVijJADCgvukJhzAuj4E;-&~BRck<*t-4A`@1^l{c!oMgFC?T
zy<a_cv8;1P?Y6(4?Qpz!Y0J|K4pdLz#w6!9e$e;ijZ3AUsO#Fl{q5A~rO8RJ*+<>#
cIW!Jg7OJ~;y|?SK{?FR#g*Bc}pJ`nG5A-{~cmMzZ
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..957b9071c7cba152d3418406ff0cf915d5736578
GIT binary patch
literal 736
zc%17D@N?(olHy`uVBq!ia0vp^20(1V!3HFE2UfoVQjEnx?oJHr&dIz4aySb-B8wRq
z#8g3;(KATp15j{UiEBiObAE1aYF-ILvPY1wLUKlFUUp7uo`SKFLS}kieo<<Q6|ZBk
zv!|z(f}UQLnx5XFhC?lSdWU!EftZI^=;@Uj0J*CY^z^I_%>W7(@OrpLSSc6)fw`lR
z8HlzpurLA9ZjJ^95WcGgSl-ka%y)GJD>E>5v;>PAnwuL4c`{!Cdf~CBi(^Q|oHx_$
zy$?G`v_~I2*R;T+uxP{NV!=BxZ|*40=E!@i_TpWN_{R8!3ubq_zIgCT!%yjkzJe2z
zAM3?e@4s{{jH&)VnR}1EjjGA}yMO1Ic~&o-l<3O7Hg`k5m7S?Sch1do$(ufy{$Mce
zwk$g!Q4*UL9J}WjYaZ`${RZ|Ad|@%qgLw=2_BkF-c%vv^{X}_oR)^{bws{BjELdwl
zuq1sr+4-}&_TFWN^$%Eeo@s92eD_m5^N{Rp<^Bhu1)TeI4*4e($85CR%yplov-!d0
z4VJU_9hU!meBSF1!Z+@y?>n?TUB`++dQPL0$JBq@UVkY4XCkP(ZQ85oaDjlA>DgCf
zTlJfdTQ-IT?+s;Tyjr&{?PlwNc`6rpBhn83*y!W1JpMO(kjjP2djw-I6)PH?2~2q5
zlrUxSffG>;r^+8@uWHEq^1a{i;qj?ge(uqmAHT%%W09gnh1h}y3w85Zc7p603g=cD
z7>F=_tQ1mUL?DfA4iEqPb(?X`WnevGx%mIuC?U~gZ_P87o1Fv=^n^GZ97?{YyXyFB
zhzs2P8+mb}`V{UZ@Bgi7T5X@I^K{F)==|$DGbb`|Mu>4vXh@ytz`#^oUcBw^J?%+v
tp5^@B8@^<x_ocVtE9HSH@c(~i2JuOo5BJI+X#jE=JYD@<);T3K0RVh;BIW=9
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6ed0e7a777d3a57be0cb4a2fb6edea10854ed55e
GIT binary patch
literal 1562
zc%0=^i#OB>6#j`B@`xSLNj54(sU`IAR>O?eI~<Wmge7Y+_9$u>y)13Cc_ohsVJ($v
z5eg%un8Cz6%oxUu8S^q@p60RB-?8W1?|kR`&OP6`_ndqG2nvAdX`5&R0HEg!hlZ%w
z^&7O*zc~kOJXNHT?B(wT053~*WS2oIZJq!R@dtohD*(v94FFP=mA?)EzuEx+BMtzZ
zs{vq7Ms0tvDrkphkYA{`s$q0y@&8j3a|F^FgTog{q}wvNoWm0=QRtuM2}BBAE>|d(
zN(OuL^8yixT2v?$Br0Q_#bt8&NEG%fk;3BgQ8@Anjk&ocoWd+keO;n$aIj>WDu_&D
zPA`zC8|*p4Ds_XiN@tCsuvjuxD3YLYWIAh8Ad-AU<1kB<FAJnGG*&K`)0muzIXqt|
z<_SbXv1E<GR!uZVSYd7QMPdnVg(jA6Z*X{Wg<^V<G(L-;oG0K{XtQ`SnYKZpv&Ls}
z6b5^HTeiB+6o|wkiBv3+ZVAO4-WCeGJd0nM!7g+80veM$hQ@8nWXseI;u>R1B<Avk
zI5Lf{T1FsJD3lANHPsDdshfaR6qp?nZ~@SV-*`T;%AYhvjLG)9_jq`Y>}?L?f*)z>
z4Gcq!KBK-&4_1Wl<8*nQ8#Ug}@Xfo~M&U_V%LcEZmG2E_XLb#hZ??1|<=G$GKM~nd
z7MzDsMXSaC2!jGepzq--u`>gH5di?kmfxV}8)Cr)0Cgi@s8=X_{Ld;{l%bcw$5Z(R
z<_6}W-nRMW8ch+03ZtD%tO`x7w2Ht7tlO-$!62i3#zDoPJo({4%B1Bf7ewEHSu&A?
z$jd|Y^xS`V0y%a#4eqz%YJ;veFiVcJKYGRzgDmiCw@I;Yq$d^VZc=rl9UV%p9y#i8
zBz2M+T=6qH36a(JAPeD$8o1%+_*Ax|c&T@1zjHuCW`Aw6%R7z!42PtWx1KY7={C*v
ze7l}ET47@+<1$3>@2=+_7>sUvJP_YY(SZcTdcgP4)Os~6G%x-2v?M*wT8*UD40eOe
zTK4j0wcb6`y>dJuoOi9D#rBMD)h%Qhl&*avyKf}?gV=6o>4$%*6$cizN8KTnK8;f*
zQq4P%{_~>?8d13hCw0*FCi{1%QGu&}Lz-3{nMP@0C--(47Y<b2?JgNg9f+<anPZ<c
z9ea@oo_}ct7aJG)gOgxh(z;&)4?e47?LHSHt!Q!4B95gZQPFzWfMKW4)^}T5Q+joV
zeJYFMMew)!5^;Lv?RdrB!a-62+3mhzuEA7O;zO=&Jk1&(6OXO+fN~FM6Jcr9o#O{x
z{rZHffkvo-5AKhfF8N%t@NxrnUM+OQytsCPEo{eedT7nC<AE-9%N;|ce=ff?e19eA
zhxw@(^JA^*PzNnWiwWD}Sa^pX$nkX3-RH5v^{E|dS?-eleayF%>pew&!{7<iv)S1x
zyB36a%SJjvGhJ%PsdTC-c<s8&J*Pi|U@Hx8Zi^J$sWNj;k7$8JJjxctZ0_G(x~M;w
z%Pi)_-Ybo$>@;PYMLRQtCfb|{7u#P|2TuRQjO?8cO#mglIiGzw`iWfTorxI<W|Tp4
zavq@8Q=2pQj06{BF!wI#^dN_B%8h@s?d~>&dE&_vBGK<kHFU%K(8FPadio8p2OS&Z
zF3Rm0LTq10-9~~^#_%(??>!Nop=+cJ_0X;;JLFK37~#?7)H(I4wrINkewKe(MGD3z
zFwD*^@wAEctKo-@CE)U}ixx4TYD^N|m4hr}HJ?O9;&FI<WK@k)_bsK`TupsLM`jL8
P^)-O6cL22OY+T`g$Buwf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0bda852f5a40a65435a73596e87664e8600a46db
GIT binary patch
literal 2560
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
Sh#`r76yW0EVc%dI3i}uSWwA&A
deleted file mode 100644
--- a/browser/themes/shared/fxa/default-profile-image.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000">
-  <path fill="#c3cfd8" d="M500-0.3c276.1,0,500,223.9,500,500s-223.9,500-500,500S0,775.8,0,499.7C0,223.5,223.9-0.3,500-0.3z"/>
-  <circle fill="#fff" cx="500" cy="317" r="139.1"/>
-  <path fill="#fff" d="M751.8,643.6L751.8,643.6c0.1-2.3,0.2-4.6,0.2-6.9c0-68-55.3-127-136.2-156.3L505.9,590.4h0 c-0.4,29.8-1.4,58.8-2.8,86.6c-1,0.1-2,0.3-3.1,0.3s-2-0.2-3.1-0.3c-1.4-27.9-2.4-56.9-2.8-86.7h0L384.3,480.4 C303.3,509.7,248,568.7,248,636.7c0,2.3,0.1,4.6,0.2,6.9l7.4,49.7c57.1,72,145.4,118.2,244.4,118.2c99,0,187.3-46.2,244.4-118.2 L751.8,643.6z"/>
-</svg>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b54b392cccd03dbac9c3e96fd88d3349fc80015a
GIT binary patch
literal 17703
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%0AVsyqamiI=J`t#wukK?cS_E>Sy-#C~t5&cdOeX
zKB;kjlEv(H8J(hXlgfRG42i0O=(*9v(N46pONUOZllf@oWhlr$Z`5hTr0!=NE-U@r
z@aYc3?4=4oY^3QcZxb88pu&cn^@|?n;%~k{^!QYE`Y?i{?=|Wj`EW+JY18rLCuq0#
z$%w4dBHwX5FQ0B{7F8s8gN4`oS-aER!cNsgTLoIy9k0B*O0S4xIPdd4Ceo@;OS6IZ
z2PKYVl^LaH#Uks+=J%QHcUuuhudF+|zgFvxR`l(eXCL;BDrcjV+cCGpq;p#`+wV!f
zlYLWDsehf__tL9-?W^#?O-h#@t@SMqc_C<xogIznPrOX8Urf{AT1_6AxtXGr{rvo$
z!KD+sRPBbOSnqN`S7`0Y9hU1#X*xEiEdX1mtj51n=}_T6)2eHR_gwy*^z^ur?Syfa
zRJ*a|_InV=^?j*NXo0+$K<n_*361N5s?PLl)emN!80i-@Z5WJwlJO)W;I8zC#}SL7
zj!PLcFDPmn^-=e{?|#ZCCzr0NT=;Tfa3v+&*k4k=`~B9kitM{+C*JMKOK*>wMg|3I
jCVlv;^@)dItP`-~y2LGImlTWt%EZdt)+~RuXY~I74ya{r
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5d25f05d8791edceb048a8766c2028f094fdf414
GIT binary patch
literal 4517
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
Dm77h_
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c6de26c9f9be668b57f9a77daa18ba570c59339a
GIT binary patch
literal 18697
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
TwgoNxXGQMLUQWjxLX-Xne0%((
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bc13da3897dda1d7deca5bd25121229a5d843bc9
GIT binary patch
literal 8682
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
OcsVI$$zpM^&wl|uD;oU(
--- a/browser/themes/shared/incontentprefs/preferences.inc.css
+++ b/browser/themes/shared/incontentprefs/preferences.inc.css
@@ -218,42 +218,16 @@ treecol {
 }
 
 /* XXX This style is for bug 740213 and should be removed once that
    bug has a solution. */
 description > html|a {
   cursor: pointer;
 }
 
-#fxaProfileImage {
-  width: 60px;
-  height: 60px;
-  border-radius: 50%;
-  border-width: 5px;
-  border-color: red;
-  background-image: url(chrome://browser/skin/fxa/default-profile-image.svg);
-  background-size: contain;
-  cursor: pointer;
-  -moz-margin-end: 15px;
-}
-
-#fxaProfileImage:hover {
-  box-shadow: 0px 0px 0px 1px #0095DD;
-}
-
-#fxaProfileImage:active {
-  box-shadow: 0px 0px 0px 1px #ff9500;
-}
-
-#noFxaAccount {
-  /* Overriding the margins from the base preferences.css theme file.
-     These overrides can be simplified by fixing bug 1027174 */
-  margin: 0;
-}
-
 #weavePrefsDeck > vbox > label,
 #weavePrefsDeck > vbox > groupbox,
 #weavePrefsDeck > vbox > description,
 #weavePrefsDeck > vbox > #pairDevice > label,
 #weavePrefsDeck > #needsUpdate > hbox > #loginError,
 #weavePrefsDeck > #hasFxaAccount > vbox > label,
 #weavePrefsDeck > #hasFxaAccount > hbox:not(#tosPP-normal) > label {
   /* no margin-start for elements at the begin of a line */
@@ -392,25 +366,167 @@ description > html|a {
   from { opacity: 0; }
   to   { opacity: 1; }
 }
 
 /**
  * Sync
  */
 
+#fxaProfileImage {
+  width: 60px;
+  max-height: 60px;
+  border-radius: 50%;
+  background-image: url(chrome://browser/skin/fxa/default-avatar.png);
+  background-size: contain;
+  margin-inline-end: 15px;
+}
+
+#fxaProfileImage.actionable {
+  cursor: pointer;
+}
+
+#fxaProfileImage.actionable:hover {
+  box-shadow: 0px 0px 0px 1px #0095DD;
+}
+
+#fxaProfileImage.actionable:hover:active {
+  box-shadow: 0px 0px 0px 1px #ff9500;
+}
+
+#noFxaAccount {
+  /* Overriding the margins from the base preferences.css theme file.
+     These overrides can be simplified by fixing bug 1027174 */
+  margin: 0;
+}
+
+#noFxaGroup {
+  -moz-box-flex: 1;
+}
+
+#noFxaGroup > vbox {
+  -moz-box-align: start;
+}
+
 #fxaSyncEngines > vbox:first-child {
   margin-right: 80px;
 }
 
 #fxaSyncComputerName {
-  margin-left: 0px;
+  margin-inline-start: 0px;
+  width: 500px;
 }
 
 #tosPP-small-ToS {
-  margin-bottom: 1em;
+  margin-bottom: 14px;
+}
+
+#noFxaCaption {
+  font-weight: bold;
+  margin-bottom: 11px;
+}
+
+.fxaSyncIllustration {
+  margin-top: 35px;
+}
+
+#syncOptions caption {
+  margin-bottom: 11px;
+}
+
+#fxaDeviceName {
+  margin-bottom: 27.5px;
+}
+
+#noFxaDescription {
+  margin-bottom: 20px !important;
+}
+
+.separator {
+  border-bottom: 1px solid var(--in-content-header-border-color);
+}
+
+.fxaAccountBox {
+  border: 1px solid #D1D2D3;
+  border-radius: 5px;
+  padding: 14px 20px 14px 14px;
+}
+
+#signedOutAccountBoxTitle {
+  margin-inline-start: 6px !important;
+  font-weight: bold;
+  margin-bottom: 11px;
+}
+
+.fxaAccountBox button {
+  padding-left: 11px;
+  padding-right: 11px;
+}
+
+.fxaSyncIllustration {
+  width: 231px;
+  max-height: 200px;
+  list-style-image: url(chrome://browser/skin/fxa/sync-illustration.png)
+}
+
+.fxaFirefoxLogo {
+  list-style-image: url(chrome://browser/skin/fxa/logo.png);
+  max-width: 64px;
+  margin-inline-end: 14px;
+}
+
+#noFxaAccount .fxaMobilePromo {
+  margin-bottom: 55px;
+}
+
+#hasFxaAccount .fxaMobilePromo {
+  margin-bottom: 41px;
+  margin-top: 27.5px;
+}
+
+.fxaMobilePromo > label {
+  margin-inline-start: 0;
+}
+
+#hasFxaAccount .fxaAccountBoxButtons {
+  margin-top: 11px;
 }
 
 #fxaLoginRejectedWarning {
   list-style-image: url(chrome://browser/skin/warning.svg);
   filter: drop-shadow(0 1px 0 hsla(206, 50%, 10%, .15));
   margin: 4px 8px 0px 0px;
 }
+
+#syncOptions {
+  margin-bottom: 27.5px;
+}
+
+.androidLogo {
+  list-style-image: url(chrome://browser/skin/fxa/android.png);
+  max-width: 24px;
+  margin-top: -4px;
+  margin-inline-end: 4px;
+}
+
+#tosPP-small {
+  margin-bottom: 20px;
+}
+
+.androidAttribution {
+  font-size: 12px;
+  color: #D1D2D3;
+}
+
+@media (min-resolution: 1.1dppx) {
+  .fxaSyncIllustration {
+    list-style-image: url(chrome://browser/skin/fxa/sync-illustration@2x.png)
+  }
+  .fxaFirefoxLogo {
+    list-style-image: url(chrome://browser/skin/fxa/logo@2x.png);
+  }
+  .androidLogo {
+    list-style-image: url(chrome://browser/skin/fxa/android@2x.png);
+  }
+  #fxaProfileImage {
+    background-image: url(chrome://browser/skin/fxa/default-avatar@2x.png);
+  }
+}
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -302,17 +302,24 @@ browser.jar:
         skin/classic/browser/preferences/saveFile.png                (preferences/saveFile.png)
         skin/classic/browser/preferences/saveFile-XP.png             (preferences/saveFile-XP.png)
 *       skin/classic/browser/preferences/preferences.css             (preferences/preferences.css)
 *       skin/classic/browser/preferences/in-content/preferences.css  (preferences/in-content/preferences.css)
 *       skin/classic/browser/preferences/in-content/dialog.css       (preferences/in-content/dialog.css)
         skin/classic/browser/preferences/in-content/favicon.ico      (../shared/incontentprefs/favicon.ico)
         skin/classic/browser/preferences/in-content/icons.svg        (../shared/incontentprefs/icons.svg)
         skin/classic/browser/preferences/in-content/search.css       (../shared/incontentprefs/search.css)
-        skin/classic/browser/fxa/default-profile-image.svg   (../shared/fxa/default-profile-image.svg)
+        skin/classic/browser/fxa/default-avatar.png                  (../shared/fxa/default-avatar.png)
+        skin/classic/browser/fxa/default-avatar@2x.png               (../shared/fxa/default-avatar@2x.png)
+        skin/classic/browser/fxa/logo.png                            (../shared/fxa/logo.png)
+        skin/classic/browser/fxa/logo@2x.png                         (../shared/fxa/logo@2x.png)
+        skin/classic/browser/fxa/sync-illustration.png               (../shared/fxa/sync-illustration.png)
+        skin/classic/browser/fxa/sync-illustration@2x.png            (../shared/fxa/sync-illustration@2x.png)
+        skin/classic/browser/fxa/android.png                         (../shared/fxa/android.png)
+        skin/classic/browser/fxa/android@2x.png                      (../shared/fxa/android@2x.png)
         skin/classic/browser/preferences/applications.css            (preferences/applications.css)
         skin/classic/browser/preferences/aboutPermissions.css        (preferences/aboutPermissions.css)
         skin/classic/browser/preferences/search.css                  (preferences/search.css)
         skin/classic/browser/preferences/checkbox.png                (preferences/checkbox.png)
         skin/classic/browser/preferences/checkbox-aero.png           (preferences/checkbox-aero.png)
         skin/classic/browser/preferences/checkbox-classic.png        (preferences/checkbox-classic.png)
         skin/classic/browser/preferences/checkbox-xp.png             (preferences/checkbox-xp.png)
         skin/classic/browser/social/services-16.png                  (social/services-16.png)
--- a/docshell/base/timeline/AutoGlobalTimelineMarker.cpp
+++ b/docshell/base/timeline/AutoGlobalTimelineMarker.cpp
@@ -17,21 +17,21 @@ AutoGlobalTimelineMarker::AutoGlobalTime
 {
   MOZ_GUARD_OBJECT_NOTIFIER_INIT;
   MOZ_ASSERT(NS_IsMainThread());
 
   if (TimelineConsumers::IsEmpty()) {
     return;
   }
 
-  TimelineConsumers::AddMarkerToAllObservedDocShells(mName, TRACING_INTERVAL_START);
+  TimelineConsumers::AddMarkerForAllObservedDocShells(mName, TRACING_INTERVAL_START);
 }
 
 AutoGlobalTimelineMarker::~AutoGlobalTimelineMarker()
 {
   if (TimelineConsumers::IsEmpty()) {
     return;
   }
 
-  TimelineConsumers::AddMarkerToAllObservedDocShells(mName, TRACING_INTERVAL_END);
+  TimelineConsumers::AddMarkerForAllObservedDocShells(mName, TRACING_INTERVAL_END);
 }
 
 } // namespace mozilla
--- a/docshell/base/timeline/TimelineConsumers.cpp
+++ b/docshell/base/timeline/TimelineConsumers.cpp
@@ -79,32 +79,32 @@ TimelineConsumers::AddMarkerForDocShell(
                                         const char* aName, TracingMetadata aMetaData)
 {
   if (aDocShell->IsObserved()) {
     aDocShell->mObserved->AddMarker(aName, aMetaData);
   }
 }
 
 void
-TimelineConsumers::AddMarkerToDocShellsList(Vector<nsRefPtr<nsDocShell>>& aDocShells,
-                                            const char* aName, TracingMetadata aMetaData)
+TimelineConsumers::AddMarkerForDocShellsList(Vector<nsRefPtr<nsDocShell>>& aDocShells,
+                                             const char* aName, TracingMetadata aMetaData)
 {
   for (Vector<nsRefPtr<nsDocShell>>::Range range = aDocShells.all();
        !range.empty();
        range.popFront()) {
     AddMarkerForDocShell(range.front(), aName, aMetaData);
   }
 }
 
 void
-TimelineConsumers::AddMarkerToAllObservedDocShells(const char* aName, TracingMetadata aMetaData)
+TimelineConsumers::AddMarkerForAllObservedDocShells(const char* aName, TracingMetadata aMetaData)
 {
   Vector<nsRefPtr<nsDocShell>> docShells;
   if (!GetKnownDocShells(docShells)) {
     // If we don't successfully populate our vector with *all* docshells being
     // observed, don't add the marker to *any* of them.
     return;
   }
 
-  AddMarkerToDocShellsList(docShells, aName, aMetaData);
+  AddMarkerForDocShellsList(docShells, aName, aMetaData);
 }
 
 } // namespace mozilla
--- a/docshell/base/timeline/TimelineConsumers.h
+++ b/docshell/base/timeline/TimelineConsumers.h
@@ -32,16 +32,16 @@ public:
 
   // Methods for adding markers to appropriate docshells. These will only add
   // markers if the docshell is currently being observed by a timeline.
   // See nsIDocShell::recordProfileTimelineMarkers
   static void AddMarkerForDocShell(nsDocShell* aDocShell,
                                    UniquePtr<TimelineMarker>&& aMarker);
   static void AddMarkerForDocShell(nsDocShell* aDocShell,
                                    const char* aName, TracingMetadata aMetaData);
-  static void AddMarkerToDocShellsList(Vector<nsRefPtr<nsDocShell>>& aDocShells,
-                                       const char* aName, TracingMetadata aMetaData);
-  static void AddMarkerToAllObservedDocShells(const char* aName, TracingMetadata aMetaData);
+  static void AddMarkerForDocShellsList(Vector<nsRefPtr<nsDocShell>>& aDocShells,
+                                        const char* aName, TracingMetadata aMetaData);
+  static void AddMarkerForAllObservedDocShells(const char* aName, TracingMetadata aMetaData);
 };
 
 } // namespace mozilla
 
 #endif /* mozilla_TimelineConsumers_h_ */
--- a/mobile/android/base/RestrictedProfiles.java
+++ b/mobile/android/base/RestrictedProfiles.java
@@ -57,17 +57,19 @@ public class RestrictedProfiles {
     @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
     private static boolean isRestrictedProfile(Context context) {
         if (Versions.preJBMR2) {
             // Early versions don't support restrictions at all
             return false;
         }
 
         final UserManager mgr = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        Bundle restrictions = mgr.getApplicationRestrictions(context.getPackageName());
+        final Bundle restrictions = new Bundle();
+        restrictions.putAll(mgr.getApplicationRestrictions(context.getPackageName()));
+        restrictions.putAll(mgr.getUserRestrictions());
 
         for (String key : restrictions.keySet()) {
             if (restrictions.getBoolean(key)) {
                 // At least one restriction is enabled -> We are a restricted profile
                 return true;
             }
         }
 
--- a/mobile/android/confvars.sh
+++ b/mobile/android/confvars.sh
@@ -95,19 +95,17 @@ MOZ_ANDROID_SHARE_OVERLAY=1
 
 # Enable the Mozilla Location Service stumbler.
 MOZ_ANDROID_MLS_STUMBLER=1
 
 # Enable adding to the system downloads list in pre-release builds.
 MOZ_ANDROID_DOWNLOADS_INTEGRATION=1
 
 # Enable Tab Queue
-if test "$NIGHTLY_BUILD"; then
-  MOZ_ANDROID_TAB_QUEUE=1
-fi
+MOZ_ANDROID_TAB_QUEUE=1
 
 # Use the low-memory GC tuning.
 export JS_GC_SMALL_CHUNK_SIZE=1
 
 # Enable FxAccount Avatar
 if test "$NIGHTLY_BUILD"; then
   MOZ_ANDROID_FIREFOX_ACCOUNT_PROFILES=1
 fi
--- a/toolkit/components/telemetry/TelemetryEnvironment.jsm
+++ b/toolkit/components/telemetry/TelemetryEnvironment.jsm
@@ -142,17 +142,16 @@ const DEFAULT_ENVIRONMENT_PREFS = new Ma
 
 const LOGGER_NAME = "Toolkit.Telemetry";
 
 const PREF_BLOCKLIST_ENABLED = "extensions.blocklist.enabled";
 const PREF_DISTRIBUTION_ID = "distribution.id";
 const PREF_DISTRIBUTION_VERSION = "distribution.version";
 const PREF_DISTRIBUTOR = "app.distributor";
 const PREF_DISTRIBUTOR_CHANNEL = "app.distributor.channel";
-const PREF_E10S_ENABLED = "browser.tabs.remote.autostart";
 const PREF_HOTFIX_LASTVERSION = "extensions.hotfix.lastVersion";
 const PREF_APP_PARTNER_BRANCH = "app.partner.";
 const PREF_PARTNER_ID = "mozilla.partner.id";
 const PREF_TELEMETRY_ENABLED = "toolkit.telemetry.enabled";
 const PREF_UPDATE_ENABLED = "app.update.enabled";
 const PREF_UPDATE_AUTODOWNLOAD = "app.update.auto";
 const PREF_SEARCH_COHORT = "browser.search.cohort";
 
@@ -995,17 +994,17 @@ EnvironmentCache.prototype = {
       updateChannel = UpdateChannel.get(false);
     } catch (e) {}
 
     this._currentEnvironment.settings = {
       blocklistEnabled: Preferences.get(PREF_BLOCKLIST_ENABLED, true),
 #ifndef MOZ_WIDGET_ANDROID
       isDefaultBrowser: this._isDefaultBrowser(),
 #endif
-      e10sEnabled: Preferences.get(PREF_E10S_ENABLED, false),
+      e10sEnabled: Services.appinfo.browserTabsRemoteAutostart,
       telemetryEnabled: Preferences.get(PREF_TELEMETRY_ENABLED, false),
       locale: getBrowserLocale(),
       update: {
         channel: updateChannel,
         enabled: Preferences.get(PREF_UPDATE_ENABLED, true),
         autoDownload: Preferences.get(PREF_UPDATE_AUTODOWNLOAD, true),
       },
       userPrefs: this._getPrefData(),
--- a/toolkit/components/telemetry/docs/environment.rst
+++ b/toolkit/components/telemetry/docs/environment.rst
@@ -35,17 +35,17 @@ Structure::
         blocklistEnabled: <bool>, // true on failure
         isDefaultBrowser: <bool>, // null on failure, not available on Android
         defaultSearchEngine: <string>, // e.g. "yahoo"
         defaultSearchEngineData: {, // data about the current default engine
           name: <string>, // engine name, e.g. "Yahoo"; or "NONE" if no default
           loadPath: <string>, // where the engine line is located; missing if no default
           submissionURL: <string> // missing if no default or for user-installed engines
         },
-        e10sEnabled: <bool>, // false on failure
+        e10sEnabled: <bool>, // whether e10s is on, i.e. browser tabs open by default in a different process
         telemetryEnabled: <bool>, // false on failure
         locale: <string>, // e.g. "it", null on failure
         update: {
           channel: <string>, // e.g. "release", null on failure
           enabled: <bool>, // true on failure
           autoDownload: <bool>, // true on failure
         },
         userPrefs: {