Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1010)

Side by Side Diff: chrome/browser/resources/md_bookmarks/bookmarks_store.js

Issue 2745993002: MD Bookmarks: Update URL router to work in new data binding system (Closed)
Patch Set: calamity@ review Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview A singleton datastore for the Bookmarks page. Page state is 6 * @fileoverview A singleton datastore for the Bookmarks page. Page state is
7 * publicly readable, but can only be modified by dispatching an Action to 7 * publicly readable, but can only be modified by dispatching an Action to
8 * the store. 8 * the store.
9 */ 9 */
10 10
11 cr.define('bookmarks', function() { 11 cr.define('bookmarks', function() {
12 /** @constructor */ 12 /** @constructor */
13 function Store() { 13 function Store() {
14 /** @type {!BookmarksPageState} */ 14 /** @type {!BookmarksPageState} */
15 this.data_ = bookmarks.util.createEmptyState(); 15 this.data_ = bookmarks.util.createEmptyState();
16 /** @type {boolean} */ 16 /** @type {boolean} */
17 this.initialized_ = false; 17 this.initialized_ = false;
18 /** @type {!Array<!Action>} */
19 this.queuedActions_ = [];
18 /** @type {!Array<!StoreObserver>} */ 20 /** @type {!Array<!StoreObserver>} */
19 this.observers_ = []; 21 this.observers_ = [];
20 } 22 }
21 23
22 Store.prototype = { 24 Store.prototype = {
23 /** 25 /**
24 * @param {!BookmarksPageState} initialState 26 * @param {!BookmarksPageState} initialState
25 */ 27 */
26 init: function(initialState) { 28 init: function(initialState) {
27 this.data_ = initialState; 29 this.data_ = initialState;
30
31 this.queuedActions_.forEach(function(action) {
32 this.reduce_(action);
33 }.bind(this));
34
28 this.initialized_ = true; 35 this.initialized_ = true;
29 this.notifyObservers_(this.data_); 36 this.notifyObservers_(this.data_);
30 }, 37 },
31 38
32 /** @type {!BookmarksPageState} */ 39 /** @type {!BookmarksPageState} */
33 get data() { 40 get data() {
34 return this.data_; 41 return this.data_;
35 }, 42 },
36 43
37 /** @return {boolean} */ 44 /** @return {boolean} */
38 isInitialized: function() { 45 isInitialized: function() {
39 return this.initialized_; 46 return this.initialized_;
40 }, 47 },
41 48
42 /** @param {!StoreObserver} observer */ 49 /** @param {!StoreObserver} observer */
43 addObserver: function(observer) { 50 addObserver: function(observer) {
44 this.observers_.push(observer); 51 this.observers_.push(observer);
45 }, 52 },
46 53
47 /** @param {!StoreObserver} observer */ 54 /** @param {!StoreObserver} observer */
48 removeObserver: function(observer) { 55 removeObserver: function(observer) {
49 var index = this.observers_.indexOf(observer); 56 var index = this.observers_.indexOf(observer);
50 this.observers_.splice(index, 1); 57 this.observers_.splice(index, 1);
51 }, 58 },
52 59
53 /** 60 /**
54 * Transition to a new UI state based on the supplied |action|, and notify 61 * Transition to a new UI state based on the supplied |action|, and notify
55 * observers of the change. 62 * observers of the change. If the Store has not yet been initialized, the
63 * action will be queued and performed upon initialization.
56 * @param {Action} action 64 * @param {Action} action
57 */ 65 */
58 handleAction: function(action) { 66 handleAction: function(action) {
59 if (!this.initialized_) 67 if (!this.initialized_) {
68 this.queuedActions_.push(action);
60 return; 69 return;
70 }
61 71
72 this.reduce_(action);
73 this.notifyObservers_(this.data_);
74 },
75
76 /**
77 * @param {Action} action
78 * @private
79 */
80 reduce_: function(action) {
62 this.data_ = bookmarks.reduceAction(this.data_, action); 81 this.data_ = bookmarks.reduceAction(this.data_, action);
63 this.notifyObservers_(this.data_);
64 }, 82 },
65 83
66 /** 84 /**
67 * @param {!BookmarksPageState} state 85 * @param {!BookmarksPageState} state
68 * @private 86 * @private
69 */ 87 */
70 notifyObservers_: function(state) { 88 notifyObservers_: function(state) {
71 this.observers_.forEach(function(o) { 89 this.observers_.forEach(function(o) {
72 o.onStateChanged(state); 90 o.onStateChanged(state);
73 }); 91 });
74 }, 92 },
75 }; 93 };
76 94
77 cr.addSingletonGetter(Store); 95 cr.addSingletonGetter(Store);
78 96
79 return { 97 return {
80 Store: Store, 98 Store: Store,
81 }; 99 };
82 }); 100 });
OLDNEW
« no previous file with comments | « chrome/browser/resources/md_bookmarks/app.html ('k') | chrome/browser/resources/md_bookmarks/compiled_resources2.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698