Index: ui/webui/resources/js/cr/ui/page_manager/page_manager.js |
diff --git a/ui/webui/resources/js/cr/ui/page_manager/page_manager.js b/ui/webui/resources/js/cr/ui/page_manager/page_manager.js |
index df1b8ad224f56a0ba625a418ac9e2f86cd2e6a15..6f9f1cce3ffe6bd8bccb1c84cb3e3a46d359816e 100644 |
--- a/ui/webui/resources/js/cr/ui/page_manager/page_manager.js |
+++ b/ui/webui/resources/js/cr/ui/page_manager/page_manager.js |
@@ -21,13 +21,12 @@ cr.define('cr.ui.pageManager', function() { |
isDialog: false, |
/** |
- * Offset of page container in pixels, to allow room for side menu. |
- * Simplified settings pages can override this if they don't use the menu. |
- * The default (155) comes from -webkit-margin-start in uber_shared.css |
- * TODO(michaelpg): Remove dependency on uber menu (crbug.com/313244). |
+ * Offset of page container in pixels. Uber pages that use the side menu |
+ * can override this with the setter. |
+ * The default (23) comes from -webkit-margin-start in uber_shared.css. |
* @type {number} |
*/ |
- horizontalOffset: 155, |
+ horizontalOffset_: 23, |
/** |
* Root pages. Maps lower-case page names to the respective page object. |
@@ -44,6 +43,12 @@ cr.define('cr.ui.pageManager', function() { |
registeredOverlayPages: {}, |
/** |
+ * Observers will be notified when opening and closing overlays. |
+ * @type {!Array.<!PageManager.Observer>} |
+ */ |
+ observers_: [], |
+ |
+ /** |
* Initializes the complete page. |
* @param {cr.ui.pageManager.Page} defaultPage The page to be shown when no |
* page is specified in the path. |
@@ -58,7 +63,7 @@ cr.define('cr.ui.pageManager', function() { |
this.handleScroll_(); |
// Shake the dialog if the user clicks outside the dialog bounds. |
- var containers = [$('overlay-container-1'), $('overlay-container-2')]; |
+ var containers = document.querySelectorAll('body > .overlay'); |
for (var i = 0; i < containers.length; i++) { |
var overlay = containers[i]; |
cr.ui.overlay.setupOverlay(overlay); |
@@ -248,14 +253,11 @@ cr.define('cr.ui.pageManager', function() { |
}, |
/** |
- * Gets the level of the page. The root page (e.g., BrowserOptions) has |
+ * Gets the level of the page. Root pages (e.g., BrowserOptions) are at |
* level 0. |
* @return {number} How far down this page is from the root page. |
*/ |
getNestingLevel: function(page) { |
- if (typeof page.nestingLevelOverride == "number") |
- return page.nestingLevelOverride; |
- |
var level = 0; |
var parent = page.parentPage; |
while (parent) { |
@@ -284,6 +286,17 @@ cr.define('cr.ui.pageManager', function() { |
}, |
/** |
+ * Returns true if the page is a direct descendent of a root page, or if |
+ * the page is considered always on top. Doesn't consider visibility. |
+ * @param {cr.ui.pageManager.Page} page Page to check. |
+ * @return {boolean} True if |page| is a top-level overlay. |
+ */ |
+ isTopLevelOverlay: function(page) { |
+ return page.isOverlay && |
+ (page.alwaysOnTop || this.getNestingLevel(page) == 1); |
+ }, |
+ |
+ /** |
* Called when an page is shown or hidden to update the root page |
* based on the page's new visibility. |
* @param {cr.ui.pageManager.Page} page The page being made visible or |
@@ -292,7 +305,10 @@ cr.define('cr.ui.pageManager', function() { |
onPageVisibilityChanged: function(page) { |
this.updateRootPageFreezeState(); |
- if (page.isOverlay && !page.visible) |
+ for (var i = 0; i < this.observers_.length; ++i) |
+ this.observers_[i].onPageVisibilityChanged(page); |
+ |
+ if (!page.visible && this.isTopLevelOverlay(page)) |
this.updateScrollPosition_(); |
}, |
@@ -442,8 +458,15 @@ cr.define('cr.ui.pageManager', function() { |
* Change the horizontal offset used to reposition elements while showing an |
* overlay from the default. |
*/ |
- setHorizontalOffset: function(value) { |
- this.horizontalOffset = value; |
+ set horizontalOffset(value) { |
+ this.horizontalOffset_ = value; |
+ }, |
+ |
+ /** |
+ * @param {PageManager.Observer} observer The observer to register. |
+ */ |
+ addObserver: function(observer) { |
+ this.observers_.push(observer); |
}, |
/** |
@@ -514,8 +537,8 @@ cr.define('cr.ui.pageManager', function() { |
for (var name in this.registeredOverlayPages) { |
var page = this.registeredOverlayPages[name]; |
if (page.visible && |
- (!topmostPage || this.getNestingLevel(page) > |
- this.getNestingLevel(topmostPage))) { |
+ (!topmostPage || page.alwaysOnTop || |
+ this.getNestingLevel(page) > this.getNestingLevel(topmostPage))) { |
topmostPage = page; |
} |
} |
@@ -523,50 +546,19 @@ cr.define('cr.ui.pageManager', function() { |
}, |
/** |
- * Hides the visible overlay. Does not affect the history state. |
- * @private |
- */ |
- hideOverlay_: function() { |
- var overlay = this.getVisibleOverlay_(); |
- if (overlay) |
- overlay.visible = false; |
- }, |
- |
- /** |
- * Returns the pages which are currently visible, ordered by nesting level |
- * (ascending). |
- * @return {Array.Page} The pages which are currently visible, ordered |
- * by nesting level (ascending). |
- * @private |
- */ |
- getVisiblePages_: function() { |
- var visiblePages = []; |
- for (var name in this.registeredPages) { |
- var page = this.registeredPages[name]; |
- if (page.visible) |
- visiblePages[this.getNestingLevel(page)] = page; |
- } |
- return visiblePages; |
- }, |
- |
- /** |
* Returns the topmost visible page (overlays excluded). |
* @return {cr.ui.pageManager.Page} The topmost visible page aside from any |
* overlays. |
* @private |
*/ |
getTopmostVisibleNonOverlayPage_: function() { |
- var topPage = null; |
for (var name in this.registeredPages) { |
var page = this.registeredPages[name]; |
- if (page.visible && |
- (!topPage || this.getNestingLevel(page) > |
- this.getNestingLevel(topPage))) { |
- topPage = page; |
- } |
+ if (page.visible) |
+ return page; |
} |
- return topPage; |
+ return null; |
}, |
/** |
@@ -589,10 +581,11 @@ cr.define('cr.ui.pageManager', function() { |
*/ |
updateTitle_: function() { |
var page = this.getTopmostVisiblePage(); |
- // TODO(michaelpg): Remove dependency on uber (crbug.com/313244). |
while (page) { |
if (page.title) { |
- uber.setTitle(page.title); |
+ for (var i = 0; i < this.observers_.length; ++i) { |
+ this.observers_[i].updateTitle(page.title); |
+ } |
return; |
} |
page = page.parentPage; |
@@ -600,9 +593,10 @@ cr.define('cr.ui.pageManager', function() { |
}, |
/** |
- * Pushes the current page onto the history stack, replacing the current |
- * entry if appropriate. |
- * @param {boolean} replace If true, allow no history events to be created. |
+ * Constructs a new path to push onto the history stack, using observers |
+ * to update the history. |
+ * @param {boolean} replace If true, handlers should replace the current |
+ * history event rather than create new ones. |
* @param {object=} opt_params A bag of optional params, including: |
* {boolean} ignoreHash Whether to include the hash or not. |
* @private |
@@ -626,9 +620,9 @@ cr.define('cr.ui.pageManager', function() { |
if (path == newPath) |
return; |
- // TODO(michaelpg): Remove dependency on uber (crbug.com/313244). |
- var historyFunction = replace ? uber.replaceState : uber.pushState; |
- historyFunction.call(uber, {}, newPath); |
+ for (var i = 0; i < this.observers_.length; ++i) { |
+ this.observers_[i].updateHistory(newPath, replace); |
+ } |
}, |
/** |
@@ -717,6 +711,33 @@ cr.define('cr.ui.pageManager', function() { |
}, |
}; |
+ /** |
+ * An observer of PageManager. |
+ * @interface |
+ */ |
+ PageManager.Observer = function() {} |
+ |
+ PageManager.Observer.prototype = { |
+ /** |
+ * Called when a page is being shown or has been hidden. |
+ * @param {cr.ui.pageManager.Page} page The page being shown or hidden. |
+ */ |
+ onPageVisibilityChanged: function(page) {}, |
+ |
+ /** |
+ * Called when a new title should be set. |
+ * @param {string} title The title to set. |
+ */ |
+ updateTitle: function(title) {}, |
+ |
+ /** |
+ * Called when a page is navigated to. |
+ * @param {string} path The path of the page being visited. |
+ * @param {boolean} replace If true, allow no history events to be created. |
+ */ |
+ updateHistory: function(path, replace) {}, |
+ }; |
+ |
// Export |
return { |
PageManager: PageManager |