summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKate Hudson <k88hudson@gmail.com>2019-05-29 17:35:15 -0400
committerEd Lee <edilee@mozilla.com>2019-05-29 14:35:15 -0700
commit570c5211dad31ac5d56893bc5affba7fd2c4528c (patch)
tree84382c136bfc82db240d508eeffa96c433793f1a
parent1c086133c9e4cd69dad551b27d8111d0610a28a8 (diff)
Bug 1555391 - Remove PrerenderData.jsm and usages (#5080)
-rw-r--r--common/PrerenderData.jsm126
-rw-r--r--content-src/activity-stream-prerender.jsx32
-rw-r--r--content-src/activity-stream.jsx8
-rw-r--r--content-src/components/Base/Base.jsx3
-rw-r--r--content-src/components/Base/_Base.scss4
-rw-r--r--lib/PrefsFeed.jsm20
-rw-r--r--test/unit/activity-stream-prerender.test.jsx50
-rw-r--r--test/unit/common/PrerenderData.test.js134
-rw-r--r--test/unit/lib/PrefsFeed.test.js140
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}}}));
+ });
});