Index: chrome/browser/resources/uber/uber.js |
diff --git a/chrome/browser/resources/uber/uber.js b/chrome/browser/resources/uber/uber.js |
index 5888f6dbee74e4c231a90365fe880339e1407a96..1599882c03a905da1452abdd18868ba285cce55b 100644 |
--- a/chrome/browser/resources/uber/uber.js |
+++ b/chrome/browser/resources/uber/uber.js |
@@ -105,12 +105,11 @@ cr.define('uber', function() { |
var params = resolvePageInfo(); |
assert(params.id === e.state.pageId); |
- // If the page doesn't exist, create it. Otherwise, swap it in. |
- var frame = $(params.id).querySelector('iframe'); |
- if (!frame) |
+ // If the page isn't the current page, load it fresh. Even if the page is |
+ // already loaded, it may have state not reflected in the URL, such as the |
+ // history page's "Remove selected items" overlay. http://crbug.com/377386 |
+ if (getRequiredElement(params.id) !== getSelectedIframe()) |
showPage(params.id, HISTORY_STATE_OPTION.NONE, params.path); |
- else |
- selectPage(params.id); |
// Either way, send the state down to it. |
// |
@@ -224,12 +223,11 @@ cr.define('uber', function() { |
/** |
* Changes the path past the page title (i.e. chrome://chrome/settings/(.*)). |
- * @param {string} pageId Should match an id of one of the iframe containers. |
* @param {Object} state The page's state object for the navigation. |
* @param {string} path The new /path/ to be set after the page name. |
* @param {number} historyOption The type of history modification to make. |
*/ |
- function changePathTo(pageId, state, path, historyOption) { |
+ function changePathTo(state, path, historyOption) { |
assert(!path || path.substr(-1) != '/', 'invalid path given'); |
var histFunc; |
@@ -240,6 +238,7 @@ cr.define('uber', function() { |
assert(histFunc, 'invalid historyOption given ' + historyOption); |
+ var pageId = getSelectedIframe().id; |
var args = [{pageId: pageId, pageState: state}, |
'', |
'/' + pageId + '/' + (path || '')]; |
@@ -261,7 +260,7 @@ cr.define('uber', function() { |
// Only update the currently displayed path if this is the visible frame. |
var container = getIframeFromOrigin(origin).parentNode; |
if (container == getSelectedIframe()) |
- changePathTo(container.id, state, path, historyOption); |
+ changePathTo(state, path, historyOption); |
} |
/** |
@@ -341,23 +340,8 @@ cr.define('uber', function() { |
frame.dataset.ready = false; |
} |
- // This must be called before selectPage so that the title change applies to |
- // the new history entry. |
- if (historyOption != HISTORY_STATE_OPTION.NONE) |
- changePathTo(pageId, {}, path, historyOption); |
- |
- selectPage(pageId); |
- } |
- |
- /** |
- * Switches to a subpage. The subpage must already exist. |
- * @param {string} pageId Should match an id of one of the iframe containers. |
- */ |
- function selectPage(pageId) { |
- var container = getRequiredElement(pageId); |
- var lastSelected = document.querySelector('.iframe-container.selected'); |
- |
// If the last selected container is already showing, ignore the rest. |
+ var lastSelected = document.querySelector('.iframe-container.selected'); |
if (lastSelected === container) |
return; |
@@ -386,6 +370,9 @@ cr.define('uber', function() { |
var selectedFrame = getSelectedIframe().querySelector('iframe'); |
uber.invokeMethodOnWindow(selectedFrame.contentWindow, 'frameSelected'); |
+ if (historyOption != HISTORY_STATE_OPTION.NONE) |
+ changePathTo({}, path, historyOption); |
+ |
if (container.dataset.title) |
document.title = container.dataset.title; |
$('favicon').href = 'chrome://theme/' + container.dataset.favicon; |