Bug 1401418 - Add initialized fade, focus tweaks and bug fixes to Activity Stream. r=dmose
authorEd Lee <edilee@mozilla.com>
Tue, 19 Sep 2017 18:31:55 -0700
changeset 381809 2ecda1649fe43924e185445db870d7fd7e27bb0b
parent 381808 3045288dcb2ebd8106da35ed5067f0edb3f7fb71
child 381810 c55a11aac9cdd5f8adc9ea6f63d06d60267f1d72
push id32537
push userarchaeopteryx@coole-files.de
push dateWed, 20 Sep 2017 09:39:24 +0000
treeherdermozilla-central@c0769d228dd3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdmose
bugs1401418
milestone57.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
Bug 1401418 - Add initialized fade, focus tweaks and bug fixes to Activity Stream. r=dmose MozReview-Commit-ID: KOC1M8QVfoa
browser/extensions/activity-stream/common/Actions.jsm
browser/extensions/activity-stream/data/content/activity-stream-prerendered.html
browser/extensions/activity-stream/data/content/activity-stream.bundle.js
browser/extensions/activity-stream/data/content/activity-stream.css
browser/extensions/activity-stream/data/locales.json
browser/extensions/activity-stream/install.rdf.in
browser/extensions/activity-stream/lib/ActivityStream.jsm
browser/extensions/activity-stream/lib/ActivityStreamMessageChannel.jsm
browser/extensions/activity-stream/lib/NewTabInit.jsm
browser/extensions/activity-stream/test/unit/lib/ActivityStreamMessageChannel.test.js
browser/extensions/activity-stream/test/unit/lib/NewTabInit.test.js
--- a/browser/extensions/activity-stream/common/Actions.jsm
+++ b/browser/extensions/activity-stream/common/Actions.jsm
@@ -51,17 +51,16 @@ for (const type of [
   "PLACES_HISTORY_CLEARED",
   "PLACES_LINK_BLOCKED",
   "PLACES_LINK_DELETED",
   "PREFS_INITIAL_VALUES",
   "PREF_CHANGED",
   "SAVE_SESSION_PERF_DATA",
   "SAVE_TO_POCKET",
   "SCREENSHOT_UPDATED",
-  "SEARCH_BOX_FOCUSED",
   "SECTION_DEREGISTER",
   "SECTION_DISABLE",
   "SECTION_ENABLE",
   "SECTION_REGISTER",
   "SECTION_UPDATE",
   "SECTION_UPDATE_CARD",
   "SET_PREF",
   "SHOW_FIREFOX_ACCOUNTS",
--- a/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html
+++ b/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html
@@ -4,17 +4,17 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp">
     <title></title>
     <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/>
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/data/content/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="544412221"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">Search the Web</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="Search the Web" title="Search the Web" data-reactid="7"/><button id="searchSubmit" class="search-button" title=" " data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10"> </span></span></button></div><section class="top-sites" data-reactid="11"><h3 class="section-title" data-reactid="12"><span class="icon icon-small-spacer icon-topsites" data-reactid="13"></span><span data-reactid="14"> </span></h3><ul class="top-sites-list" data-reactid="15"><li class="top-site-outer placeholder" data-reactid="16"><a data-reactid="17"><div class="tile" aria-hidden="true" data-reactid="18"><span class="letter-fallback" data-reactid="19"></span><div class="screenshot" style="background-image:none;" data-reactid="20"></div></div><div class="title " data-reactid="21"><span dir="auto" data-reactid="22"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="23"><a data-reactid="24"><div class="tile" aria-hidden="true" data-reactid="25"><span class="letter-fallback" data-reactid="26"></span><div class="screenshot" style="background-image:none;" data-reactid="27"></div></div><div class="title " data-reactid="28"><span dir="auto" data-reactid="29"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="30"><a data-reactid="31"><div class="tile" aria-hidden="true" data-reactid="32"><span class="letter-fallback" data-reactid="33"></span><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><span class="letter-fallback" data-reactid="40"></span><div class="screenshot" style="background-image:none;" data-reactid="41"></div></div><div class="title " data-reactid="42"><span dir="auto" data-reactid="43"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="44"><a data-reactid="45"><div class="tile" aria-hidden="true" data-reactid="46"><span class="letter-fallback" data-reactid="47"></span><div class="screenshot" style="background-image:none;" data-reactid="48"></div></div><div class="title " data-reactid="49"><span dir="auto" data-reactid="50"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="51"><a data-reactid="52"><div class="tile" aria-hidden="true" data-reactid="53"><span class="letter-fallback" data-reactid="54"></span><div class="screenshot" style="background-image:none;" data-reactid="55"></div></div><div class="title " data-reactid="56"><span dir="auto" data-reactid="57"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="58"><div class="edit-topsites-button" data-reactid="59"><button class="edit" title=" " data-reactid="60"><span data-reactid="61"> </span></button></div></div></section><div class="sections-list" data-reactid="62"><section data-reactid="63"><div class="section-top-bar" data-reactid="64"><h3 class="section-title" data-reactid="65"><span class="icon icon-small-spacer icon-pocket" data-reactid="66"></span><span data-reactid="67"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="68"><li class="card-outer placeholder" data-reactid="69"><a data-reactid="70"><div class="card" data-reactid="71"><div class="card-details no-image" data-reactid="72"><div class="card-text no-context no-description no-host-name no-image" data-reactid="73"><h4 class="card-title" dir="auto" data-reactid="74"></h4><p class="card-description" dir="auto" data-reactid="75"></p></div><div class="card-context" data-reactid="76"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="77"><a data-reactid="78"><div class="card" data-reactid="79"><div class="card-details no-image" data-reactid="80"><div class="card-text no-context no-description no-host-name no-image" data-reactid="81"><h4 class="card-title" dir="auto" data-reactid="82"></h4><p class="card-description" dir="auto" data-reactid="83"></p></div><div class="card-context" data-reactid="84"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="85"><a data-reactid="86"><div class="card" data-reactid="87"><div class="card-details no-image" data-reactid="88"><div class="card-text no-context no-description no-host-name no-image" data-reactid="89"><h4 class="card-title" dir="auto" data-reactid="90"></h4><p class="card-description" dir="auto" data-reactid="91"></p></div><div class="card-context" data-reactid="92"></div></div></div></a></li></ul><div class="topic" data-reactid="93"><span data-reactid="94"><span data-reactid="95"> </span></span><ul data-reactid="96"><li data-reactid="97"><a class="topic-link" data-reactid="98"></a></li></ul></div></section><section data-reactid="99"><div class="section-top-bar" data-reactid="100"><h3 class="section-title" data-reactid="101"><span class="icon icon-small-spacer icon-highlights" data-reactid="102"></span><span data-reactid="103"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="104"><li class="card-outer placeholder" data-reactid="105"><a data-reactid="106"><div class="card" data-reactid="107"><div class="card-details no-image" data-reactid="108"><div class="card-text no-context no-description no-host-name no-image" data-reactid="109"><h4 class="card-title" dir="auto" data-reactid="110"></h4><p class="card-description" dir="auto" data-reactid="111"></p></div><div class="card-context" data-reactid="112"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="113"><a data-reactid="114"><div class="card" data-reactid="115"><div class="card-details no-image" data-reactid="116"><div class="card-text no-context no-description no-host-name no-image" data-reactid="117"><h4 class="card-title" dir="auto" data-reactid="118"></h4><p class="card-description" dir="auto" data-reactid="119"></p></div><div class="card-context" data-reactid="120"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="121"><a data-reactid="122"><div class="card" data-reactid="123"><div class="card-details no-image" data-reactid="124"><div class="card-text no-context no-description no-host-name no-image" data-reactid="125"><h4 class="card-title" dir="auto" data-reactid="126"></h4><p class="card-description" dir="auto" data-reactid="127"></p></div><div class="card-context" data-reactid="128"></div></div></div></a></li></ul></section></div><!-- react-empty: 129 --></main></div></div>
+    <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="-1132846255"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">Search the Web</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="Search the Web" title="Search the Web" data-reactid="7"/><button id="searchSubmit" class="search-button" title=" " data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10"> </span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="top-sites" data-reactid="12"><h3 class="section-title" data-reactid="13"><span class="icon icon-small-spacer icon-topsites" data-reactid="14"></span><span data-reactid="15"> </span></h3><ul class="top-sites-list" data-reactid="16"><li class="top-site-outer placeholder" data-reactid="17"><a data-reactid="18"><div class="tile" aria-hidden="true" data-reactid="19"><span class="letter-fallback" data-reactid="20"></span><div class="screenshot" style="background-image:none;" data-reactid="21"></div></div><div class="title " data-reactid="22"><span dir="auto" data-reactid="23"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="24"><a data-reactid="25"><div class="tile" aria-hidden="true" data-reactid="26"><span class="letter-fallback" data-reactid="27"></span><div class="screenshot" style="background-image:none;" data-reactid="28"></div></div><div class="title " data-reactid="29"><span dir="auto" data-reactid="30"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><span class="letter-fallback" data-reactid="34"></span><div class="screenshot" style="background-image:none;" data-reactid="35"></div></div><div class="title " data-reactid="36"><span dir="auto" data-reactid="37"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="38"><a data-reactid="39"><div class="tile" aria-hidden="true" data-reactid="40"><span class="letter-fallback" data-reactid="41"></span><div class="screenshot" style="background-image:none;" data-reactid="42"></div></div><div class="title " data-reactid="43"><span dir="auto" data-reactid="44"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="45"><a data-reactid="46"><div class="tile" aria-hidden="true" data-reactid="47"><span class="letter-fallback" data-reactid="48"></span><div class="screenshot" style="background-image:none;" data-reactid="49"></div></div><div class="title " data-reactid="50"><span dir="auto" data-reactid="51"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="52"><a data-reactid="53"><div class="tile" aria-hidden="true" data-reactid="54"><span class="letter-fallback" data-reactid="55"></span><div class="screenshot" style="background-image:none;" data-reactid="56"></div></div><div class="title " data-reactid="57"><span dir="auto" data-reactid="58"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="59"><div class="edit-topsites-button" data-reactid="60"><button class="edit" title=" " data-reactid="61"><span data-reactid="62"> </span></button></div></div></section><div class="sections-list" data-reactid="63"><section data-reactid="64"><div class="section-top-bar" data-reactid="65"><h3 class="section-title" data-reactid="66"><span class="icon icon-small-spacer icon-pocket" data-reactid="67"></span><span data-reactid="68"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="69"><li class="card-outer placeholder" data-reactid="70"><a data-reactid="71"><div class="card" data-reactid="72"><div class="card-details no-image" data-reactid="73"><div class="card-text no-context no-description no-host-name no-image" data-reactid="74"><h4 class="card-title" dir="auto" data-reactid="75"></h4><p class="card-description" dir="auto" data-reactid="76"></p></div><div class="card-context" data-reactid="77"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="78"><a data-reactid="79"><div class="card" data-reactid="80"><div class="card-details no-image" data-reactid="81"><div class="card-text no-context no-description no-host-name no-image" data-reactid="82"><h4 class="card-title" dir="auto" data-reactid="83"></h4><p class="card-description" dir="auto" data-reactid="84"></p></div><div class="card-context" data-reactid="85"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="86"><a data-reactid="87"><div class="card" data-reactid="88"><div class="card-details no-image" data-reactid="89"><div class="card-text no-context no-description no-host-name no-image" data-reactid="90"><h4 class="card-title" dir="auto" data-reactid="91"></h4><p class="card-description" dir="auto" data-reactid="92"></p></div><div class="card-context" data-reactid="93"></div></div></div></a></li></ul><div class="topic" data-reactid="94"><span data-reactid="95"><span data-reactid="96"> </span></span><ul data-reactid="97"><li data-reactid="98"><a class="topic-link" data-reactid="99"></a></li></ul></div></section><section data-reactid="100"><div class="section-top-bar" data-reactid="101"><h3 class="section-title" data-reactid="102"><span class="icon icon-small-spacer icon-highlights" data-reactid="103"></span><span data-reactid="104"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="105"><li class="card-outer placeholder" data-reactid="106"><a data-reactid="107"><div class="card" data-reactid="108"><div class="card-details no-image" data-reactid="109"><div class="card-text no-context no-description no-host-name no-image" data-reactid="110"><h4 class="card-title" dir="auto" data-reactid="111"></h4><p class="card-description" dir="auto" data-reactid="112"></p></div><div class="card-context" data-reactid="113"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="114"><a data-reactid="115"><div class="card" data-reactid="116"><div class="card-details no-image" data-reactid="117"><div class="card-text no-context no-description no-host-name no-image" data-reactid="118"><h4 class="card-title" dir="auto" data-reactid="119"></h4><p class="card-description" dir="auto" data-reactid="120"></p></div><div class="card-context" data-reactid="121"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="122"><a data-reactid="123"><div class="card" data-reactid="124"><div class="card-details no-image" data-reactid="125"><div class="card-text no-context no-description no-host-name no-image" data-reactid="126"><h4 class="card-title" dir="auto" data-reactid="127"></h4><p class="card-description" dir="auto" data-reactid="128"></p></div><div class="card-context" data-reactid="129"></div></div></div></a></li></ul></section></div></div><!-- react-empty: 130 --></main></div></div>
     <div id="snippets-container">
       <div id="snippets"></div>
     </div>
     <script>
 // Don't directly load the following scripts as part of html to let the page
 // finish loading to render the content sooner.
 for (const src of [
   "resource://activity-stream/data/content/activity-stream-initial-state.js",
--- a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
+++ b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
@@ -89,17 +89,17 @@ const globalImportContext = typeof Windo
 
 
 // Create an object that avoids accidental differing key/value pairs:
 // {
 //   INIT: "INIT",
 //   UNINIT: "UNINIT"
 // }
 const actionTypes = {};
-for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SEARCH_BOX_FOCUSED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_DATA", "SNIPPETS_RESET", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) {
+for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_DATA", "SNIPPETS_RESET", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) {
   actionTypes[type] = type;
 }
 
 // Helper function for creating routed actions between content and main
 // Not intended to be used by consumers
 function _RouteMessage(action, options) {
   const meta = action.meta ? Object.assign({}, action.meta) : {};
   if (!options || !options.from || !options.to) {
@@ -1190,19 +1190,23 @@ class Base extends React.PureComponent {
       { key: "STATIC", locale: locale, messages: strings },
       React.createElement(
         "div",
         { className: outerClassName },
         React.createElement(
           "main",
           null,
           prefs.showSearch && React.createElement(Search, null),
-          !prefs.migrationExpired && React.createElement(ManualMigration, null),
-          prefs.showTopSites && React.createElement(TopSites, null),
-          React.createElement(Sections, null),
+          React.createElement(
+            "div",
+            { className: `body-wrapper${initialized ? " on" : ""}` },
+            !prefs.migrationExpired && React.createElement(ManualMigration, null),
+            prefs.showTopSites && React.createElement(TopSites, null),
+            React.createElement(Sections, null)
+          ),
           React.createElement(ConfirmDialog, null)
         ),
         initialized && React.createElement(PreferencesPane, null)
       )
     );
   }
 }
 
@@ -1940,17 +1944,17 @@ module.exports.CheckPinTopSite = (site, 
 
 "use strict";
 /* globals ContentSearchUIController */
 
 
 const React = __webpack_require__(1);
 const { connect } = __webpack_require__(3);
 const { FormattedMessage, injectIntl } = __webpack_require__(2);
-const { actionCreators: ac, actionTypes: at } = __webpack_require__(0);
+const { actionCreators: ac } = __webpack_require__(0);
 const { IS_NEWTAB } = __webpack_require__(20);
 
 class Search extends React.PureComponent {
   constructor(props) {
     super(props);
     this.onClick = this.onClick.bind(this);
     this.onInputMount = this.onInputMount.bind(this);
   }
@@ -1987,19 +1991,16 @@ class Search extends React.PureComponent
       // the existing about:home can find it; and so it allows these tests to pass.
       // In the future, when activity stream is default about:home, this can be renamed
       window.gContentSearchController = new ContentSearchUIController(input, input.parentNode, healthReportKey, searchSource);
       addEventListener("ContentSearchClient", this);
 
       // Focus the search box if we are on about:home
       if (!IS_NEWTAB) {
         input.focus();
-        // Tell the addon side that search box is focused in case the browser
-        // needs to be focused too.
-        this.props.dispatch(ac.SendToMain({ type: at.SEARCH_BOX_FOCUSED }));
       }
     } else {
       window.gContentSearchController = null;
       removeEventListener("ContentSearchClient", this);
     }
   }
 
   /*
--- a/browser/extensions/activity-stream/data/content/activity-stream.css
+++ b/browser/extensions/activity-stream/data/content/activity-stream.css
@@ -195,16 +195,22 @@ main {
   font-size: 13px;
   font-weight: bold;
   text-transform: uppercase; }
   .section-title span {
     color: #737373;
     fill: #737373;
     vertical-align: middle; }
 
+.body-wrapper {
+  opacity: 0;
+  transition: opacity 0.1s ease-in-out; }
+  .body-wrapper.on {
+    opacity: 1; }
+
 .top-sites-list {
   list-style: none;
   margin: 0;
   margin-bottom: -18px;
   padding: 0;
   margin-inline-end: -32px; }
   @media (max-width: 416px) {
     .top-sites-list :nth-child(2n+1) .context-menu {
@@ -445,16 +451,19 @@ main {
   .edit-topsites-wrapper .show-less span {
     padding-inline-start: 3px; }
 
 .topsite-form .form-wrapper {
   padding: 15px 0; }
   .topsite-form .form-wrapper .field {
     margin-inline-start: 205px;
     position: relative; }
+  .topsite-form .form-wrapper .url input:not(:placeholder-shown):dir(rtl) {
+    direction: ltr;
+    text-align: right; }
   .topsite-form .form-wrapper .section-title {
     margin-bottom: 5px;
     margin-inline-start: 205px; }
   .topsite-form .form-wrapper input[type='text'] {
     border: solid 1px rgba(12, 12, 13, 0.2);
     border-radius: 2px;
     margin: 5px 0;
     padding: 7px;
--- a/browser/extensions/activity-stream/data/locales.json
+++ b/browser/extensions/activity-stream/data/locales.json
@@ -39,28 +39,25 @@
     "welcome_body": "Firefox bi tic ki kabedo man me nyuto alamabukke mamegi, coc akwana, vidio, ki potbukke ma ilimo cokcoki ma pi gi tego loyo, wek i dok ii gi ma yot.",
     "welcome_label": "Tye ka kube ki wiye madito mamegi",
     "time_label_less_than_minute": "<dakika1",
     "time_label_minute": "dakika{number}",
     "time_label_hour": "cawa{number}",
     "time_label_day": "nino{number}",
     "settings_pane_button_label": "Yub potbuk me dirica matidi mamegi manyen",
     "settings_pane_header": "Ter me dirica matidi manyen",
-    "settings_pane_body": "Yer ngo ma i neno ka i yabo dirica matidi manyen.",
     "settings_pane_search_header": "Yeny",
     "settings_pane_search_body": "Yeny Kakube ki i dirica ni matidi manyen.",
     "settings_pane_topsites_header": "Kakube ma gi loyo",
     "settings_pane_topsites_body": "Nong kakube ma ilimo loyo.",
     "settings_pane_topsites_options_showmore": "Nyut rek ariyo",
     "settings_pane_bookmarks_header": "Alamabuk ma cocoki",
     "settings_pane_bookmarks_body": "Alamabukke ni ma kicweyo manyen i kabedo acel macek.",
     "settings_pane_visit_again_header": "Lim Kidoco",
     "settings_pane_visit_again_body": "Firefox bi nyuti but gin mukato me yeny mamegi ma itwero mito me poo ikome onyo dok cen iyie.",
-    "settings_pane_pocketstories_header": "Lok madito",
-    "settings_pane_pocketstories_body": "Pocket, but jo me Mozilla, bi konyi me kube i jami mabeco loyo ma twero bedo ni pe i nongo.",
     "settings_pane_done_button": "Otum",
     "edit_topsites_button_text": "Yubi",
     "edit_topsites_button_label": "Yub bute pi kakubi ni ma giloyo",
     "edit_topsites_showmore_button": "Nyut mukene",
     "edit_topsites_showless_button": "Nyut manok",
     "edit_topsites_done_button": "Otum",
     "edit_topsites_pin_button": "Mwon kakube man",
     "edit_topsites_unpin_button": "War kakube man",
@@ -73,20 +70,18 @@
     "topsites_form_url_placeholder": "Coo onyo mwon URL",
     "topsites_form_add_button": "Medi",
     "topsites_form_save_button": "Gwoki",
     "topsites_form_cancel_button": "Kwer",
     "topsites_form_url_validation": "URL ma tye atir mite",
     "pocket_read_more": "Lok macuk gi lamal:",
     "pocket_read_even_more": "Nen Lok mapol",
     "pocket_feedback_header": "Kakube maber loyo, dano makato milion 25 aye oyubo.",
-    "pocket_feedback_body": "Pocket, but jo me Mozilla, bi konyi me kube i jami mabeco loyo ma twero bedo ni pe i nongo.",
-    "pocket_send_feedback": "Cwal adwogi",
+    "highlights_empty_state": "Cak yeny, ka wa binyuto coc akwana mabeco, video, ki potbuk mukene ma ilimo cokcokki onyo ma kiketo alamabuk kany.",
     "topstories_empty_state": "Ityeko weng. Rot doki lacen pi lok madito mapol ki bot {provider}. Pe itwero kuro? Yer lok macuke lamal me nongo lok mabeco mapol ki i but kakube.",
-    "manual_migration_explanation": "Tem Firefox ki kakube ki alamabuk ni ma imaro loyo ki i layeny mukene.",
     "manual_migration_cancel_button": "Pe Apwoyo",
     "manual_migration_import_button": "Kel kombedi"
   },
   "ar": {
     "newtab_page_title": "لسان جديد",
     "default_label_loading": "يُحمّل…",
     "header_top_sites": "المواقع الأكثر زيارة",
     "header_stories": "أهم الأخبار",
@@ -3216,17 +3211,17 @@
     "newtab_page_title": "Nove scheda",
     "default_label_loading": "Cargante…",
     "header_top_sites": "Sitos popular",
     "header_stories": "Historias popular",
     "header_highlights": "In evidentia",
     "header_visit_again": "Visita de novo",
     "header_bookmarks": "Paginas marcate recentemente",
     "header_recommended_by": "Recommendate per {provider}",
-    "header_bookmarks_placeholder": "Vos ha ancora nulle paginas marcate.",
+    "header_bookmarks_placeholder": "Tu ha ancora nulle paginas marcate.",
     "header_stories_from": "de",
     "type_label_visited": "Visitate",
     "type_label_bookmarked": "Marcate",
     "type_label_synced": "Synchronisate de altere apparato",
     "type_label_recommended": "Tendentias",
     "type_label_open": "Aperite",
     "type_label_topic": "Subjecto",
     "type_label_now": "Ora",
@@ -3235,55 +3230,55 @@
     "menu_action_copy_address": "Copiar le adresse",
     "menu_action_email_link": "Inviar le ligamine per email…",
     "menu_action_open_new_window": "Aperir in un nove fenestra",
     "menu_action_open_private_window": "Aperir in un nove fenestra private",
     "menu_action_dismiss": "Dimitter",
     "menu_action_delete": "Deler del chronologia",
     "menu_action_pin": "Clavar",
     "menu_action_unpin": "Disclavar",
-    "confirm_history_delete_p1": "Desira vos vermente deler cata instantia de iste pagina de vostre chronologia?",
+    "confirm_history_delete_p1": "Desira tu vermente deler cata instantia de iste pagina de tu chronologia?",
     "confirm_history_delete_notice_p2": "Iste action es irreversibile.",
     "menu_action_save_to_pocket": "Salvar in Pocket",
     "search_for_something_with": "Cercar {search_term} con:",
     "search_button": "Cercar",
     "search_header": "Recerca {search_engine_name}",
     "search_web_placeholder": "Cercar in le Web",
     "search_settings": "Cambiar le parametros de recerca",
     "section_info_option": "Informationes",
     "section_info_send_feedback": "Inviar feedback",
     "section_info_privacy_notice": "Advertentia de privacitate",
     "welcome_title": "Benvenite al nove scheda",
-    "welcome_body": "Firefox usara iste spatio pro monstrar vostre paginas marcate le plus relevante, articulos, videos e paginas que vos ha visitate recentemente, de sorta que vos pote revider los facilemente.",
-    "welcome_label": "Identificante vostre evidentias",
+    "welcome_body": "Firefox usara iste spatio pro monstrar tu paginas marcate le plus relevante, articulos, videos e paginas que tu ha visitate recentemente, de sorta que tu pote revider los facilemente.",
+    "welcome_label": "Identificante tu evidentias",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} d",
-    "settings_pane_button_label": "Personalisar vostre pagina de nove scheda",
+    "settings_pane_button_label": "Personalisar tu pagina de nove scheda",
     "settings_pane_header": "Preferentias de nove scheda",
-    "settings_pane_body2": "Selige lo que vos vole vider in iste pagina.",
+    "settings_pane_body2": "Selige lo que tu vole vider in iste pagina.",
     "settings_pane_search_header": "Cercar",
-    "settings_pane_search_body": "Cercar in le Web ab vostre nove scheda.",
+    "settings_pane_search_body": "Cercar in le Web ab tu nove scheda.",
     "settings_pane_topsites_header": "Sitos popular",
-    "settings_pane_topsites_body": "Acceder al sitos web que vos plus visita.",
+    "settings_pane_topsites_body": "Acceder al sitos web que tu plus visita.",
     "settings_pane_topsites_options_showmore": "Monstrar duo lineas",
     "settings_pane_bookmarks_header": "Paginas marcate recentemente",
-    "settings_pane_bookmarks_body": "Vostre paginas marcate recentemente a un sol loco.",
+    "settings_pane_bookmarks_body": "Tu paginas marcate recentemente a un sol loco.",
     "settings_pane_visit_again_header": "Visitar de novo",
-    "settings_pane_visit_again_body": "Firefox vos monstrara partes de vostre chronologia de navigation que vos pote voler rememorar o visitar novemente.",
+    "settings_pane_visit_again_body": "Firefox te monstrara partes de tu chronologia de navigation que tu pote voler rememorar o visitar novemente.",
     "settings_pane_highlights_header": "In evidentia",
-    "settings_pane_highlights_body2": "Retrova cosas interessante que vos ha recentemente visitate o marcate.",
+    "settings_pane_highlights_body2": "Retrova cosas interessante que tu ha recentemente visitate o marcate.",
     "settings_pane_highlights_options_bookmarks": "Paginas marcate",
     "settings_pane_highlights_options_visited": "Sitos visitate",
     "settings_pane_snippets_header": "Breve novas",
     "settings_pane_snippets_body": "Lege breve e legier novas de Mozilla super Firefox, cultura internet e occasionalmente super alcun meme.",
     "settings_pane_done_button": "Facite",
     "edit_topsites_button_text": "Editar",
-    "edit_topsites_button_label": "Personalisar vostre section de sitos popular",
+    "edit_topsites_button_label": "Personalisar tu section de sitos popular",
     "edit_topsites_showmore_button": "Monstrar plus",
     "edit_topsites_showless_button": "Monstrar minus",
     "edit_topsites_done_button": "Facite",
     "edit_topsites_pin_button": "Clavar iste sito",
     "edit_topsites_unpin_button": "Disclavar iste sito",
     "edit_topsites_edit_button": "Editar iste sito",
     "edit_topsites_dismiss_button": "Dimitter iste sito",
     "edit_topsites_add_button": "Adder",
@@ -3293,19 +3288,19 @@
     "topsites_form_url_placeholder": "Scriber o collar un URL",
     "topsites_form_add_button": "Adder",
     "topsites_form_save_button": "Salvar",
     "topsites_form_cancel_button": "Cancellar",
     "topsites_form_url_validation": "Il es necessari un URL valide",
     "pocket_read_more": "Subjectos popular:",
     "pocket_read_even_more": "Vider plus historias",
     "pocket_feedback_header": "Le melior del web, selectionate per 25 milliones de personas.",
-    "pocket_description": "Discoperir contento de alte qualitate que vos poterea alteremente non cognoscer, con le adjuta de Pocket, ora parte de Mozilla.",
-    "highlights_empty_state": "Comencia navigar e nos vos monstrara alcun del grande articulos, videos e altere paginas que vos ha recentemente visitate o marcate hic.",
-    "topstories_empty_state": "Vos ja es in die con toto. Reveni plus tarde pro plus historias popular de {provider}. Non vole attender? Selectiona un subjecto popular pro trovar plus altere historias interessante del web.",
+    "pocket_description": "Discoperir contento de alte qualitate que tu poterea alteremente non cognoscer, con le adjuta de Pocket, ora parte de Mozilla.",
+    "highlights_empty_state": "Comencia navigar e nos te monstrara alcun del grande articulos, videos e altere paginas que tu ha recentemente visitate o marcate hic.",
+    "topstories_empty_state": "Tu ja es in die con toto. Reveni plus tarde pro plus historias popular de {provider}. Non vole attender? Selectiona un subjecto popular pro trovar plus altere historias interessante del web.",
     "manual_migration_explanation2": "Essaya Firefox con le paginas marcate, le chronologia e le contrasignos de altere navigator.",
     "manual_migration_cancel_button": "No, gratias",
     "manual_migration_import_button": "Importar ora"
   },
   "id": {
     "newtab_page_title": "Tab Baru",
     "default_label_loading": "Memuat…",
     "header_top_sites": "Situs Teratas",
--- a/browser/extensions/activity-stream/install.rdf.in
+++ b/browser/extensions/activity-stream/install.rdf.in
@@ -3,17 +3,17 @@
 #filter substitution
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>activity-stream@mozilla.org</em:id>
     <em:type>2</em:type>
     <em:bootstrap>true</em:bootstrap>
     <em:unpack>false</em:unpack>
-    <em:version>2017.09.19.0036-50fae6d7</em:version>
+    <em:version>2017.09.20.0232-e27564ef</em:version>
     <em:name>Activity Stream</em:name>
     <em:description>A rich visual history feed and a reimagined home page make it easier than ever to find exactly what you're looking for in Firefox.</em:description>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
 
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>@MOZ_APP_VERSION@</em:minVersion>
--- a/browser/extensions/activity-stream/lib/ActivityStream.jsm
+++ b/browser/extensions/activity-stream/lib/ActivityStream.jsm
@@ -36,16 +36,20 @@ const DEFAULT_SITES = new Map([
   ["FR", "https://www.youtube.com/,https://www.facebook.com/,https://www.wikipedia.org/,https://www.amazon.fr/,https://www.leboncoin.fr/,https://twitter.com/"]
 ]);
 const GEO_PREF = "browser.search.region";
 const REASON_ADDON_UNINSTALL = 6;
 
 // Configure default Activity Stream prefs with a plain `value` or a `getValue`
 // that computes a value. A `value_local_dev` is used for development defaults.
 const PREFS_CONFIG = new Map([
+  ["aboutHome.autoFocus", {
+    title: "Focus the about:home search box on load",
+    value: false
+  }],
   ["default.sites", {
     title: "Comma-separated list of default top sites to fill in behind visited sites",
     getValue: ({geo}) => DEFAULT_SITES.get(DEFAULT_SITES.has(geo) ? geo : "")
   }],
   ["feeds.section.topstories.options", {
     title: "Configuration options for top stories feed",
     // This is a dynamic pref as it depends on the feed being shown or not
     getValue: args => JSON.stringify({
@@ -112,20 +116,16 @@ const PREFS_CONFIG = new Map([
   ["telemetry", {
     title: "Enable system error and usage data collection",
     value: true,
     value_local_dev: false
   }],
   ["telemetry.ping.endpoint", {
     title: "Telemetry server endpoint",
     value: "https://tiles.services.mozilla.com/v4/links/activity-stream"
-  }],
-  ["aboutHome.autoFocus", {
-    title: "Focus the about:home search box on load",
-    value: true
   }]
 ]);
 
 // Array of each feed's FEEDS_CONFIG factory and values to add to PREFS_CONFIG
 const FEEDS_DATA = [
   {
     name: "localization",
     factory: () => new LocalizationFeed(),
--- a/browser/extensions/activity-stream/lib/ActivityStreamMessageChannel.jsm
+++ b/browser/extensions/activity-stream/lib/ActivityStreamMessageChannel.jsm
@@ -169,17 +169,17 @@ this.ActivityStreamMessageChannel = clas
  * onNewTabInit - Handler for special RemotePage:Init message fired
  * by RemotePages
  *
  * @param  {obj} msg The messsage from a page that was just initialized
  */
   onNewTabInit(msg) {
     this.onActionFromContent({
       type: at.NEW_TAB_INIT,
-      data: {url: msg.target.url}
+      data: msg.target
     }, msg.target.portID);
   }
 
   /**
    * onNewTabLoad - Handler for special RemotePage:Load message fired by RemotePages
    *
    * @param  {obj} msg The messsage from a page that was just loaded
    */
--- a/browser/extensions/activity-stream/lib/NewTabInit.jsm
+++ b/browser/extensions/activity-stream/lib/NewTabInit.jsm
@@ -32,18 +32,21 @@ this.NewTabInit = class NewTabInit {
       case at.LOCALE_UPDATED:
         // If the queue is full because we were waiting for strings,
         // dispatch them now.
         if (this._queue.size > 0 && this.store.getState().App.strings) {
           this._queue.forEach(target => this.reply(target));
           this._queue.clear();
         }
         break;
-      case at.SEARCH_BOX_FOCUSED:
-        if (action._target.url === "about:home" && this.store.getState().Prefs.values["aboutHome.autoFocus"]) {
-          action._target.browser.focus();
+      case at.NEW_TAB_INIT:
+        if (action.data.url === "about:home") {
+          const prefs = this.store.getState().Prefs.values;
+          if (prefs["aboutHome.autoFocus"] && prefs.showSearch) {
+            action.data.browser.focus();
+          }
         }
         break;
     }
   }
 };
 
 this.EXPORTED_SYMBOLS = ["NewTabInit"];
--- a/browser/extensions/activity-stream/test/unit/lib/ActivityStreamMessageChannel.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/ActivityStreamMessageChannel.test.js
@@ -75,34 +75,34 @@ describe("ActivityStreamMessageChannel",
         mm.createChannel();
         assert.ok(mm.channel.isFromAboutNewTab);
       });
       it("should not override AboutNewTab if the pageURL is not about:newtab", () => {
         mm = new ActivityStreamMessageChannel({pageURL: "foo.html"});
         mm.createChannel();
         assert.notCalled(global.AboutNewTab.override);
       });
-      it("should simluate init for existing ports", () => {
+      it("should simulate init for existing ports", () => {
         sinon.stub(mm, "onActionFromContent");
 
         RPmessagePorts.push({
           url: "about:monkeys",
           loaded: false,
           portID: "inited"
         });
         RPmessagePorts.push({
           url: "about:sheep",
           loaded: true,
           portID: "loaded"
         });
 
         mm.createChannel();
 
-        assert.calledWith(mm.onActionFromContent.firstCall, {type: at.NEW_TAB_INIT, data: {url: "about:monkeys"}}, "inited");
-        assert.calledWith(mm.onActionFromContent.secondCall, {type: at.NEW_TAB_INIT, data: {url: "about:sheep"}}, "loaded");
+        assert.calledWith(mm.onActionFromContent.firstCall, {type: at.NEW_TAB_INIT, data: RPmessagePorts[0]});
+        assert.calledWith(mm.onActionFromContent.secondCall, {type: at.NEW_TAB_INIT, data: RPmessagePorts[1]});
       });
       it("should simluate load for loaded ports", () => {
         sinon.stub(mm, "onActionFromContent");
         RPmessagePorts.push({loaded: true, portID: "foo"});
 
         mm.createChannel();
 
         assert.calledWith(mm.onActionFromContent, {type: at.NEW_TAB_LOAD}, "foo");
@@ -157,18 +157,18 @@ describe("ActivityStreamMessageChannel",
       it("should dispatch a NEW_TAB_INIT action", () => {
         const t = {portID: "foo", url: "about:monkeys"};
         sinon.stub(mm, "onActionFromContent");
 
         mm.onNewTabInit({target: t});
 
         assert.calledWith(mm.onActionFromContent, {
           type: at.NEW_TAB_INIT,
-          data: {url: "about:monkeys"}
-        }, "foo");
+          data: t
+        });
       });
     });
     describe("#onNewTabLoad", () => {
       it("should dispatch a NEW_TAB_LOAD action", () => {
         const t = {portID: "foo"};
         sinon.stub(mm, "onActionFromContent");
         mm.onNewTabLoad({target: t});
         assert.calledWith(mm.onActionFromContent, {type: at.NEW_TAB_LOAD}, "foo");
--- a/browser/extensions/activity-stream/test/unit/lib/NewTabInit.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/NewTabInit.test.js
@@ -54,45 +54,53 @@ describe("NewTabInit", () => {
     STATE.App = {strings: {}};
     instance.onAction({type: at.LOCALE_UPDATED});
     assert.calledThrice(store.dispatch);
 
     store.dispatch.reset();
     instance.onAction({type: at.LOCALE_UPDATED});
     assert.notCalled(store.dispatch);
   });
-  it("should focus the content browser when SEARCH_BOX_FOCUSED", () => {
-    STATE.Prefs = {values: {"aboutHome.autoFocus": true}};
-    const action = {
-      type: at.SEARCH_BOX_FOCUSED,
-      _target: {
-        url: "about:home",
-        browser: {focus: sinon.spy()}
-      }
-    };
-    instance.onAction(action);
-    assert.calledOnce(action._target.browser.focus);
-  });
-  it("should NOT focus the content browser when SEARCH_BOX_FOCUSED for about:newtab", () => {
-    STATE.Prefs = {values: {"aboutHome.autoFocus": true}};
-    const action = {
-      type: at.SEARCH_BOX_FOCUSED,
-      _target: {
-        url: "about:newtab",
-        browser: {focus: sinon.spy()}
-      }
-    };
-    instance.onAction(action);
-    assert.notCalled(action._target.browser.focus);
-  });
-  it("should NOT focus the content browser when SEARCH_BOX_FOCUSED when autoFocus pref is off", () => {
-    STATE.Prefs = {values: {"aboutHome.autoFocus": false}};
-    const action = {
-      type: at.SEARCH_BOX_FOCUSED,
-      _target: {
-        url: "about:newtab",
-        browser: {focus: sinon.spy()}
-      }
-    };
-    instance.onAction(action);
-    assert.notCalled(action._target.browser.focus);
+  describe("about:home search auto focus", () => {
+    let action;
+    beforeEach(() => {
+      STATE.Prefs = {
+        values: {
+          "aboutHome.autoFocus": true,
+          "showSearch": true
+        }
+      };
+      action = {
+        type: at.NEW_TAB_INIT,
+        data: {
+          url: "about:home",
+          browser: {focus: sinon.spy()}
+        }
+      };
+    });
+    it("should focus the content browser when NEW_TAB_INIT", () => {
+      instance.onAction(action);
+
+      assert.calledOnce(action.data.browser.focus);
+    });
+    it("should NOT focus the content browser when NEW_TAB_INIT for about:newtab", () => {
+      action.data.url = "about:newtab";
+
+      instance.onAction(action);
+
+      assert.notCalled(action.data.browser.focus);
+    });
+    it("should NOT focus the content browser when NEW_TAB_INIT when autoFocus pref is off", () => {
+      STATE.Prefs.values["aboutHome.autoFocus"] = false;
+
+      instance.onAction(action);
+
+      assert.notCalled(action.data.browser.focus);
+    });
+    it("should NOT focus the content browser when NEW_TAB_INIT when there's no search", () => {
+      STATE.Prefs.values.showSearch = false;
+
+      instance.onAction(action);
+
+      assert.notCalled(action.data.browser.focus);
+    });
   });
 });