diff options
author | Kate Hudson <k88hudson@gmail.com> | 2019-05-29 17:35:15 -0400 |
---|---|---|
committer | Ed Lee <edilee@mozilla.com> | 2019-05-29 14:35:15 -0700 |
commit | 570c5211dad31ac5d56893bc5affba7fd2c4528c (patch) | |
tree | 84382c136bfc82db240d508eeffa96c433793f1a | |
parent | 1c086133c9e4cd69dad551b27d8111d0610a28a8 (diff) |
Bug 1555391 - Remove PrerenderData.jsm and usages (#5080)
-rw-r--r-- | common/PrerenderData.jsm | 126 | ||||
-rw-r--r-- | content-src/activity-stream-prerender.jsx | 32 | ||||
-rw-r--r-- | content-src/activity-stream.jsx | 8 | ||||
-rw-r--r-- | content-src/components/Base/Base.jsx | 3 | ||||
-rw-r--r-- | content-src/components/Base/_Base.scss | 4 | ||||
-rw-r--r-- | lib/PrefsFeed.jsm | 20 | ||||
-rw-r--r-- | test/unit/activity-stream-prerender.test.jsx | 50 | ||||
-rw-r--r-- | test/unit/common/PrerenderData.test.js | 134 | ||||
-rw-r--r-- | test/unit/lib/PrefsFeed.test.js | 140 |
9 files changed, 28 insertions, 489 deletions
diff --git a/common/PrerenderData.jsm b/common/PrerenderData.jsm deleted file mode 100644 index d6309f33..00000000 --- a/common/PrerenderData.jsm +++ /dev/null @@ -1,126 +0,0 @@ -class _PrerenderData { - constructor(options) { - this.initialPrefs = options.initialPrefs; - this.initialSections = options.initialSections; - this._setValidation(options.validation); - } - - get validation() { - return this._validation; - } - - set validation(value) { - this._setValidation(value); - } - - get invalidatingPrefs() { - return this._invalidatingPrefs; - } - - // This is needed so we can use it in the constructor - _setValidation(value = []) { - this._validation = value; - this._invalidatingPrefs = value.reduce((result, next) => { - if (typeof next === "string") { - result.push(next); - return result; - } else if (next && next.oneOf) { - return result.concat(next.oneOf); - } else if (next && next.indexedDB) { - return result.concat(next.indexedDB); - } else if (next && next.jsonPrefs) { - return result.concat(next.jsonPrefs); - } - throw new Error("Your validation configuration is not properly configured"); - }, []); - } - - _isPrefEnabled(prefObj) { - try { - let data = JSON.parse(prefObj); - return (data && data.enabled) ? true : false; // eslint-disable-line no-unneeded-ternary - } catch (e) { - return false; - } - } - - arePrefsValid(getPref, indexedDBPrefs) { - for (const prefs of this.validation) { - // {oneOf: ["foo", "bar"]} - if (prefs && prefs.oneOf && !prefs.oneOf.some(name => getPref(name) === this.initialPrefs[name])) { - return false; - - // {indexedDB: ["foo", "bar"]} - } else if (indexedDBPrefs && prefs && prefs.indexedDB) { - const anyModifiedPrefs = prefs.indexedDB.some(prefName => indexedDBPrefs.some(pref => pref && pref[prefName])); - if (anyModifiedPrefs) { - return false; - } - // {jsonPrefs: ["foo", "bar"]} - } else if (prefs && prefs.jsonPrefs) { - const isPrefModified = - prefs.jsonPrefs.some(name => this._isPrefEnabled(getPref(name)) !== this.initialPrefs[name].enabled); - if (isPrefModified) { - return false; - } - // "foo" - } else if (getPref(prefs) !== this.initialPrefs[prefs]) { - return false; - } - } - return true; - } -} - -this.PrerenderData = new _PrerenderData({ - initialPrefs: { - "feeds.topsites": true, - "showSearch": true, - "topSitesRows": 1, - "feeds.section.topstories": true, - "feeds.section.highlights": true, - "sectionOrder": "topsites,topstories,highlights", - "collapsed": false, - "discoverystream.config": {"enabled": false}, - }, - // Prefs listed as invalidating will prevent the prerendered version - // of AS from being used if their value is something other than what is listed - // here. This is required because some preferences cause the page layout to be - // too different for the prerendered version to be used. Unfortunately, this - // will result in users who have modified some of their preferences not being - // able to get the benefits of prerendering. - validation: [ - "feeds.topsites", - "showSearch", - "topSitesRows", - "sectionOrder", - // This means if either of these are set to their default values, - // prerendering can be used. - {oneOf: ["feeds.section.topstories", "feeds.section.highlights"]}, - // If any component has the following preference set to `true` it will - // invalidate the prerendered version. - {indexedDB: ["collapsed"]}, - // For below prefs, parse value to check enabled property. If enabled property - // differs from initial prefs enabled value, prerendering cannot be used - {jsonPrefs: ["discoverystream.config"]}, - ], - initialSections: [ - { - enabled: true, - icon: "pocket", - id: "topstories", - order: 1, - title: {id: "header_recommended_by", values: {provider: "Pocket"}}, - }, - { - enabled: true, - id: "highlights", - icon: "highlights", - order: 2, - title: {id: "header_highlights"}, - }, - ], -}); - -this._PrerenderData = _PrerenderData; -const EXPORTED_SYMBOLS = ["PrerenderData", "_PrerenderData"]; diff --git a/content-src/activity-stream-prerender.jsx b/content-src/activity-stream-prerender.jsx index b1464bad..8e94a7a2 100644 --- a/content-src/activity-stream-prerender.jsx +++ b/content-src/activity-stream-prerender.jsx @@ -1,35 +1,9 @@ -import {INITIAL_STATE, reducers} from "common/Reducers.jsm"; -import {actionTypes as at} from "common/Actions.jsm"; -import {Base} from "content-src/components/Base/Base"; -import {initStore} from "content-src/lib/init-store"; -import {PrerenderData} from "common/PrerenderData.jsm"; -import {Provider} from "react-redux"; import React from "react"; import ReactDOMServer from "react-dom/server"; -/** - * prerenderStore - Generate a store with the initial state required for a prerendered page - * - * @return {obj} A store - */ -export function prerenderStore() { - const store = initStore(reducers, INITIAL_STATE); - store.dispatch({type: at.PREFS_INITIAL_VALUES, data: PrerenderData.initialPrefs}); - PrerenderData.initialSections.forEach(data => store.dispatch({type: at.SECTION_REGISTER, data})); - return store; -} - export function prerender(locale, strings, renderToString = ReactDOMServer.renderToString) { - const store = prerenderStore(); - - const html = renderToString( - <Provider store={store}> - <Base - isPrerendered={true} - locale={locale} - strings={strings} /> - </Provider>); + const html = renderToString(<div />); // If this happens, it means pre-rendering is effectively disabled, so we // need to sound the alarms: @@ -39,7 +13,7 @@ export function prerender(locale, strings, return { html, - state: store.getState(), - store, + state: {}, + store: {getState() {}}, }; } diff --git a/content-src/activity-stream.jsx b/content-src/activity-stream.jsx index 4159c042..431e2ca9 100644 --- a/content-src/activity-stream.jsx +++ b/content-src/activity-stream.jsx @@ -7,21 +7,19 @@ import React from "react"; import ReactDOM from "react-dom"; import {reducers} from "common/Reducers.jsm"; -const store = initStore(reducers, global.gActivityStreamPrerenderedState); +const store = initStore(reducers); new DetectUserSessionStart(store).sendEventOrAddListener(); // If we are starting in a prerendered state, we must wait until the first render // to request state rehydration (see Base.jsx). If we are NOT in a prerendered state, // we can request it immedately. -if (!global.gActivityStreamPrerenderedState) { - store.dispatch(ac.AlsoToMain({type: at.NEW_TAB_STATE_REQUEST})); -} +store.dispatch(ac.AlsoToMain({type: at.NEW_TAB_STATE_REQUEST})); ReactDOM.hydrate(<Provider store={store}> <Base isFirstrun={global.document.location.href === "about:welcome"} - isPrerendered={!!global.gActivityStreamPrerenderedState} + isPrerendered={false} locale={global.document.documentElement.lang} strings={global.gActivityStreamStrings} /> </Provider>, document.getElementById("root")); diff --git a/content-src/components/Base/Base.jsx b/content-src/components/Base/Base.jsx index d554a894..6e4f5694 100644 --- a/content-src/components/Base/Base.jsx +++ b/content-src/components/Base/Base.jsx @@ -6,7 +6,6 @@ import {ConfirmDialog} from "content-src/components/ConfirmDialog/ConfirmDialog" import {connect} from "react-redux"; import {DiscoveryStreamBase} from "content-src/components/DiscoveryStreamBase/DiscoveryStreamBase"; import {ErrorBoundary} from "content-src/components/ErrorBoundary/ErrorBoundary"; -import {PrerenderData} from "common/PrerenderData.jsm"; import React from "react"; import {Search} from "content-src/components/Search/Search"; import {Sections} from "content-src/components/Sections/Sections"; @@ -134,7 +133,6 @@ export class BaseContent extends React.PureComponent { const {initialized} = App; const prefs = props.Prefs.values; - const shouldBeFixedToTop = PrerenderData.arePrefsValid(name => prefs[name]); const isDiscoveryStream = props.DiscoveryStream.config && props.DiscoveryStream.config.enabled; let filteredSections = props.Sections; @@ -149,7 +147,6 @@ export class BaseContent extends React.PureComponent { "outer-wrapper", isDiscoveryStream && "ds-outer-wrapper-search-alignment", isDiscoveryStream && "ds-outer-wrapper-breakpoint-override", - shouldBeFixedToTop && "fixed-to-top", prefs.showSearch && this.state.fixedSearch && !noSectionsEnabled && "fixed-search", prefs.showSearch && noSectionsEnabled && "only-search", ].filter(v => v).join(" "); diff --git a/content-src/components/Base/_Base.scss b/content-src/components/Base/_Base.scss index cae3a01a..1d213620 100644 --- a/content-src/components/Base/_Base.scss +++ b/content-src/components/Base/_Base.scss @@ -5,10 +5,6 @@ min-height: 100vh; padding: ($section-spacing + $section-vertical-padding) $base-gutter $base-gutter; - &.fixed-to-top { - display: block; - } - &.only-search { display: block; padding-top: 134px; diff --git a/lib/PrefsFeed.jsm b/lib/PrefsFeed.jsm index 73d9c57f..0d1bacf4 100644 --- a/lib/PrefsFeed.jsm +++ b/lib/PrefsFeed.jsm @@ -5,7 +5,6 @@ const {actionCreators: ac, actionTypes: at} = ChromeUtils.import("resource://activity-stream/common/Actions.jsm"); const {Prefs} = ChromeUtils.import("resource://activity-stream/lib/ActivityStreamPrefs.jsm"); -const {PrerenderData} = ChromeUtils.import("resource://activity-stream/common/PrerenderData.jsm"); const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); ChromeUtils.defineModuleGetter(this, "PrivateBrowsingUtils", @@ -20,27 +19,11 @@ this.PrefsFeed = class PrefsFeed { this._prefs = new Prefs(); } - // If any of the prefs are set to something other than what the - // prerendered version of AS expects, we can't use it. - async _setPrerenderPref() { - const indexedDBPrefs = await this._storage.getAll(); - const prefsAreValid = PrerenderData.arePrefsValid(pref => this._prefs.get(pref), indexedDBPrefs); - this._prefs.set("prerender", prefsAreValid); - } - - _checkPrerender(name) { - if (PrerenderData.invalidatingPrefs.includes(name)) { - this._setPrerenderPref(); - } - } - onPrefChanged(name, value) { const prefItem = this._prefMap.get(name); if (prefItem) { this.store.dispatch(ac[prefItem.skipBroadcast ? "OnlyToMain" : "BroadcastToContent"]({type: at.PREF_CHANGED, data: {name, value}})); } - - this._checkPrerender(name); } init() { @@ -78,8 +61,6 @@ this.PrefsFeed = class PrefsFeed { // Set the initial state of all prefs in redux this.store.dispatch(ac.BroadcastToContent({type: at.PREFS_INITIAL_VALUES, data: values})); - - this._setPrerenderPref(); } removeListeners() { @@ -90,7 +71,6 @@ this.PrefsFeed = class PrefsFeed { const name = id === "topsites" ? id : `feeds.section.${id}`; try { await this._storage.set(name, value); - this._setPrerenderPref(); } catch (e) { Cu.reportError("Could not set section preferences."); } diff --git a/test/unit/activity-stream-prerender.test.jsx b/test/unit/activity-stream-prerender.test.jsx deleted file mode 100644 index 566c0cae..00000000 --- a/test/unit/activity-stream-prerender.test.jsx +++ /dev/null @@ -1,50 +0,0 @@ -import {prerender, prerenderStore} from "content-src/activity-stream-prerender"; -import {PrerenderData} from "common/PrerenderData.jsm"; - -const messages = require("data/locales.json")["en-US"]; // eslint-disable-line import/no-commonjs - -describe("prerenderStore", () => { - it("should start uninitialized", () => { - const store = prerenderStore(); - - const state = store.getState(); - assert.equal(state.App.initialized, false); - }); - it("should add the right initial prefs", () => { - const store = prerenderStore(); - - const state = store.getState(); - assert.equal(state.Prefs.values, PrerenderData.initialPrefs); - }); - it("should add TopStories as the first section", () => { - const store = prerenderStore(); - - const state = store.getState(); - // TopStories - const [firstSection] = state.Sections; - assert.equal(firstSection.id, "topstories"); - // it should start uninitialized - assert.equal(firstSection.initialized, false); - }); -}); - -describe("prerender", () => { - it("should provide initial rendered state", () => { - const {store} = prerender("en-US", messages); - - const state = store.getState(); - assert.equal(state.App.initialized, false); - }); - - it("should throw if zero-length HTML content is returned", () => { - const boundPrerender = prerender.bind(null, "en-US", messages, () => ""); - - assert.throws(boundPrerender, Error, /no HTML returned/); - }); - - it("should throw if falsy HTML content is returned", () => { - const boundPrerender = prerender.bind(null, "en-US", messages, () => null); - - assert.throws(boundPrerender, Error, /no HTML returned/); - }); -}); diff --git a/test/unit/common/PrerenderData.test.js b/test/unit/common/PrerenderData.test.js deleted file mode 100644 index 3cadf657..00000000 --- a/test/unit/common/PrerenderData.test.js +++ /dev/null @@ -1,134 +0,0 @@ -import {_PrerenderData, PrerenderData} from "common/PrerenderData.jsm"; - -describe("_PrerenderData", () => { - describe("properties", () => { - it("should set .initialPrefs", () => { - const initialPrefs = {foo: true}; - const instance = new _PrerenderData({initialPrefs}); - - assert.equal(instance.initialPrefs, initialPrefs); - }); - it("should set .initialSections", () => { - const initialSections = [{id: "foo"}]; - const instance = new _PrerenderData({initialSections}); - - assert.equal(instance.initialSections, initialSections); - }); - it("should set .validation and .invalidatingPrefs in the constructor", () => { - const validation = ["foo", "bar", {oneOf: ["baz", "qux"]}]; - const instance = new _PrerenderData({validation}); - - assert.equal(instance.validation, validation); - assert.deepEqual(instance.invalidatingPrefs, ["foo", "bar", "baz", "qux"]); - }); - it("should also set .invalidatingPrefs when .validation is set", () => { - const validation = ["foo", "bar", {oneOf: ["baz", "qux"]}]; - const instance = new _PrerenderData({validation}); - - const newValidation = ["foo", {oneOf: ["blah", "gloo"]}]; - instance.validation = newValidation; - assert.equal(instance.validation, newValidation); - assert.deepEqual(instance.invalidatingPrefs, ["foo", "blah", "gloo"]); - }); - it("should throw if an invalid validation config is set", () => { - // {stuff: []} is not a valid configuration type - assert.throws(() => new _PrerenderData({validation: ["foo", {stuff: ["bar"]}]})); - }); - }); - describe("#arePrefsValid", () => { - let FAKE_PREFS; - const getPrefs = pref => FAKE_PREFS[pref]; - beforeEach(() => { - FAKE_PREFS = {}; - }); - it("should return true if all prefs match", () => { - FAKE_PREFS = {foo: true, bar: false}; - const instance = new _PrerenderData({ - initialPrefs: FAKE_PREFS, - validation: ["foo", "bar"], - }); - assert.isTrue(instance.arePrefsValid(getPrefs)); - }); - it("should return true if all *invalidating* prefs match", () => { - FAKE_PREFS = {foo: true, bar: false}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, bar: true}, - validation: ["foo"], - }); - - assert.isTrue(instance.arePrefsValid(getPrefs)); - }); - it("should return true if one each oneOf group matches", () => { - FAKE_PREFS = {foo: false, floo: true, bar: false, blar: true}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, floo: true, bar: true, blar: true}, - validation: [{oneOf: ["foo", "floo"]}, {oneOf: ["bar", "blar"]}], - }); - - assert.isTrue(instance.arePrefsValid(getPrefs)); - }); - it("should return false if an invalidating pref is mismatched", () => { - FAKE_PREFS = {foo: true, bar: false}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, bar: true}, - validation: ["foo", "bar"], - }); - - assert.isFalse(instance.arePrefsValid(getPrefs)); - }); - it("should return false if none of the oneOf group matches", () => { - FAKE_PREFS = {foo: true, bar: false, baz: false}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, bar: true, baz: true}, - validation: ["foo", {oneOf: ["bar", "baz"]}], - }); - - assert.isFalse(instance.arePrefsValid(getPrefs)); - }); - it("should return false if an indexedDB pref is changed", () => { - FAKE_PREFS = {foo: true, bar: false}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, bar: true}, - validation: ["foo", {indexedDB: ["collapsed"]}], - }); - - assert.isFalse(instance.arePrefsValid(getPrefs, [{collapsed: true}])); - }); - it("should return false if any of jsonPrefs group enabled value not matches", () => { - FAKE_PREFS = {foo: true, bar: "{\"enabled\": true}", baz: "{\"enabled\": true}"}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, bar: {"enabled": true}, baz: {"enabled": false}}, - validation: ["foo", {jsonPrefs: ["baz", "bar"]}], - }); - - assert.isFalse(instance.arePrefsValid(getPrefs)); - }); - it("should treat invalid json as having the component disabled", () => { - FAKE_PREFS = {foo: true, bar: "{\"enabled\": true}", baz: {}}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, bar: {"enabled": true}, baz: {"enabled": false}}, - validation: ["foo", {jsonPrefs: ["baz", "bar"]}], - }); - - assert.isTrue(instance.arePrefsValid(getPrefs)); - }); - it("should return true if all of jsonPrefs group enabled value matches", () => { - FAKE_PREFS = {foo: true, bar: "{\"enabled\": true}", baz: "{\"enabled\": false}"}; - const instance = new _PrerenderData({ - initialPrefs: {foo: true, bar: {"enabled": true}, baz: {"enabled": false}}, - validation: ["foo", {jsonPrefs: ["baz", "bar"]}], - }); - - assert.isTrue(instance.arePrefsValid(getPrefs)); - }); - }); -}); - -// This is the instance used by Activity Stream -describe("PrerenderData", () => { - it("should set initial values for all invalidating prefs", () => { - PrerenderData.invalidatingPrefs.forEach(pref => { - assert.property(PrerenderData.initialPrefs, pref); - }); - }); -}); diff --git a/test/unit/lib/PrefsFeed.test.js b/test/unit/lib/PrefsFeed.test.js index a0eb690a..7f3dfd8c 100644 --- a/test/unit/lib/PrefsFeed.test.js +++ b/test/unit/lib/PrefsFeed.test.js @@ -1,10 +1,6 @@ import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm"; import {GlobalOverrider} from "test/unit/utils"; import {PrefsFeed} from "lib/PrefsFeed.jsm"; -import {PrerenderData} from "common/PrerenderData.jsm"; -const {initialPrefs} = PrerenderData; - -const PRERENDER_PREF_NAME = "prerender"; let overrider = new GlobalOverrider(); @@ -14,7 +10,7 @@ describe("PrefsFeed", () => { let sandbox; beforeEach(() => { sandbox = sinon.createSandbox(); - FAKE_PREFS = new Map([["foo", 1], ["bar", 2]]); + FAKE_PREFS = new Map([["foo", 1], ["bar", 2], ["baz", {value: 1, skipBroadcast: true}]]); feed = new PrefsFeed(FAKE_PREFS); const storage = { getAll: sandbox.stub().resolves(), @@ -43,11 +39,6 @@ describe("PrefsFeed", () => { sandbox.restore(); }); - function setFakePrefsWithInitialValue() { - Object.keys(initialPrefs).forEach(name => FAKE_PREFS.set(name, - typeof(initialPrefs[name]) === "object" ? JSON.stringify(initialPrefs[name]) : initialPrefs[name])); - } - it("should set a pref when a SET_PREF action is received", () => { feed.onAction(ac.SetPref("foo", 2)); assert.calledWith(feed._prefs.set, "foo", 2); @@ -81,118 +72,31 @@ describe("PrefsFeed", () => { feed.onPrefChanged("foo", 2); assert.calledWith(feed.store.dispatch, ac.BroadcastToContent({type: at.PREF_CHANGED, data: {name: "foo", value: 2}})); }); - describe("INIT prerendering", () => { - it("should set a prerender pref on init", async () => { - sandbox.stub(feed, "_setPrerenderPref"); - - await feed.init(); - - assert.calledOnce(feed._setPrerenderPref); - }); - it("should set prerender pref to true if prefs match initial values", async () => { - setFakePrefsWithInitialValue(); - await feed._setPrerenderPref(); - - assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, true); - }); - it("should set prerender pref to false if a pref does not match its initial value", async () => { - setFakePrefsWithInitialValue(); - FAKE_PREFS.set("showSearch", false); - - await feed._setPrerenderPref(); - - assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, false); - }); - it("should set prerender pref to true if indexedDB prefs are unchanged", async () => { - setFakePrefsWithInitialValue(); - feed._storage.getAll.resolves([{collapsed: false}, {collapsed: false}]); - - await feed._setPrerenderPref(); - - assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, true); - }); - it("should set prerender pref to false if a indexedDB pref changed value", async () => { - setFakePrefsWithInitialValue(); - FAKE_PREFS.set("showSearch", false); - feed._storage.getAll.resolves([{collapsed: false}, {collapsed: true}]); - - await feed._setPrerenderPref(); - - assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, false); + it("should set storage pref on UPDATE_SECTION_PREFS", async () => { + await feed.onAction({ + type: at.UPDATE_SECTION_PREFS, + data: {id: "topsites", value: {collapsed: false}}, }); + assert.calledWith(feed._storage.set, "topsites", {collapsed: false}); }); - describe("indexedDB changes", () => { - it("should call _setIndexedDBPref on UPDATE_SECTION_PREFS", () => { - sandbox.stub(feed, "_setIndexedDBPref"); - - feed.onAction({type: at.UPDATE_SECTION_PREFS, data: {}}); - - assert.calledOnce(feed._setIndexedDBPref); - }); - it("should store the pref value", async () => { - sandbox.stub(feed, "_setPrerenderPref"); - await feed._setIndexedDBPref("topsites", "foo"); - - assert.calledOnce(feed._storage.set); - assert.calledWith(feed._storage.set, "topsites", "foo"); - }); - it("should call _setPrerenderPref", async () => { - sandbox.stub(feed, "_setPrerenderPref"); - await feed._setIndexedDBPref("topsites", "foo"); - - assert.calledOnce(feed._setPrerenderPref); - }); - it("should catch any save errors", () => { - const globals = new GlobalOverrider(); - globals.sandbox.spy(global.Cu, "reportError"); - feed._storage.set.throws(new Error()); - - assert.doesNotThrow(() => feed._setIndexedDBPref()); - assert.calledOnce(Cu.reportError); - globals.restore(); + it("should set storage pref with section prefix on UPDATE_SECTION_PREFS", async () => { + await feed.onAction({ + type: at.UPDATE_SECTION_PREFS, + data: {id: "topstories", value: {collapsed: false}}, }); + assert.calledWith(feed._storage.set, "feeds.section.topstories", {collapsed: false}); }); - describe("onPrefChanged prerendering", () => { - it("should not change the prerender pref if the pref is not included in invalidatingPrefs", () => { - feed.onPrefChanged("foo123", true); - assert.notCalled(feed._prefs.set); - }); - it("should set the prerender pref to false if a pref in invalidatingPrefs is changed from its original value", () => { - sandbox.stub(feed, "_setPrerenderPref"); - setFakePrefsWithInitialValue(); - - feed._prefs.set("showSearch", false); - feed.onPrefChanged("showSearch", false); - assert.calledOnce(feed._setPrerenderPref); - }); - it("should set the prerender pref back to true if the invalidatingPrefs are changed back to their original values", () => { - sandbox.stub(feed, "_setPrerenderPref"); - setFakePrefsWithInitialValue(); - FAKE_PREFS.set("showSearch", false); - - feed._prefs.set("showSearch", true); - feed.onPrefChanged("showSearch", true); - assert.calledOnce(feed._setPrerenderPref); - }); - it("should set the prerendered pref to true", async () => { - setFakePrefsWithInitialValue(); - FAKE_PREFS.set("showSearch", false); - feed._prefs.set("showSearch", true); - feed.onPrefChanged("showSearch", true); - - await feed._setPrerenderPref(); - - assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, true); - }); - it("should set the prerendered pref to false", async () => { - setFakePrefsWithInitialValue(); - FAKE_PREFS.set("showSearch", false); - feed._prefs.set("showSearch", false); - feed.onPrefChanged("showSearch", false); - - await feed._setPrerenderPref(); - - assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, false); + it("should catch errors on UPDATE_SECTION_PREFS", async () => { + feed._storage.set.throws(new Error("foo")); + assert.doesNotThrow(async () => { + await feed.onAction({ + type: at.UPDATE_SECTION_PREFS, + data: {id: "topstories", value: {collapsed: false}}, + }); }); }); + it("should send OnlyToMain pref update if config for pref has skipBroadcast: true", async () => { + feed.onPrefChanged("baz", {value: 2, skipBroadcast: true}); + assert.calledWith(feed.store.dispatch, ac.OnlyToMain({type: at.PREF_CHANGED, data: {name: "baz", value: {value: 2, skipBroadcast: true}}})); + }); }); |