Commit 815b4051 authored by calamity's avatar calamity Committed by Commit bot

Invalidate the page state when restoring WebUIs

This CL invalidates the serialized page state any chrome:// URLs,
causing the page to get reloaded rather than restored. This will prevent
the upgrade to MD History from breaking things since it lives at a
different physical URL than classic history.

BUG=614758
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:closure_compilation

Review-Url: https://codereview.chromium.org/2355543003
Cr-Commit-Position: refs/heads/master@{#420600}
parent 2d290dc4
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/path_service.h" #include "base/path_service.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/background/background_mode_manager.h" #include "chrome/browser/background/background_mode_manager.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
...@@ -34,6 +35,8 @@ ...@@ -34,6 +35,8 @@
#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/startup/startup_browser_creator.h" #include "chrome/browser/ui/startup/startup_browser_creator.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/webui/md_history_ui.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
...@@ -482,6 +485,48 @@ IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, SessionCookiesBrowserClose) { ...@@ -482,6 +485,48 @@ IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, SessionCookiesBrowserClose) {
CheckReloadedPageRestored(new_browser); CheckReloadedPageRestored(new_browser);
} }
// Test that switching MD History on behaves correctly with session restore.
IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, MDHistoryUpgrade) {
MdHistoryUI::use_test_title_ = true;
Browser* current_browser = browser();
{
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(features::kMaterialDesignHistory);
content::WebContents* web_contents =
current_browser->tab_strip_model()->GetActiveWebContents();
content::TitleWatcher title_watcher(web_contents,
base::ASCIIToUTF16("History"));
ui_test_utils::NavigateToURL(current_browser, GURL("chrome://history"));
base::string16 final_title = title_watcher.WaitAndGetTitle();
EXPECT_EQ(3u, current_browser->tab_strip_model()
->GetActiveWebContents()
->GetAllFrames()
.size());
}
{
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kMaterialDesignHistory);
current_browser = QuitBrowserAndRestore(browser(), false);
// The new history page should have loaded.
CheckTitle(current_browser, base::ASCIIToUTF16("MD History"));
EXPECT_EQ(1u, current_browser->tab_strip_model()
->GetActiveWebContents()
->GetAllFrames()
.size());
}
{
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(features::kMaterialDesignHistory);
current_browser = QuitBrowserAndRestore(current_browser, false);
// The old history page should have loaded.
CheckTitle(current_browser, base::ASCIIToUTF16("History"));
EXPECT_EQ(3u, current_browser->tab_strip_model()
->GetActiveWebContents()
->GetAllFrames()
.size());
}
}
// Test that leaving a popup open will not prevent session restore. // Test that leaving a popup open will not prevent session restore.
IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest, IN_PROC_BROWSER_TEST_F(ContinueWhereILeftOffTest,
SessionCookiesBrowserCloseWithPopupOpen) { SessionCookiesBrowserCloseWithPopupOpen) {
......
...@@ -35,7 +35,8 @@ ...@@ -35,7 +35,8 @@
namespace { namespace {
content::WebUIDataSource* CreateMdHistoryUIHTMLSource(Profile* profile) { content::WebUIDataSource* CreateMdHistoryUIHTMLSource(Profile* profile,
bool use_test_title) {
content::WebUIDataSource* source = content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIHistoryHost); content::WebUIDataSource::Create(chrome::kChromeUIHistoryHost);
...@@ -99,6 +100,9 @@ content::WebUIDataSource* CreateMdHistoryUIHTMLSource(Profile* profile) { ...@@ -99,6 +100,9 @@ content::WebUIDataSource* CreateMdHistoryUIHTMLSource(Profile* profile) {
source->AddLocalizedString("signInPromo", IDS_MD_HISTORY_SIGN_IN_PROMO); source->AddLocalizedString("signInPromo", IDS_MD_HISTORY_SIGN_IN_PROMO);
source->AddLocalizedString("signInPromoDesc", source->AddLocalizedString("signInPromoDesc",
IDS_MD_HISTORY_SIGN_IN_PROMO_DESC); IDS_MD_HISTORY_SIGN_IN_PROMO_DESC);
if (use_test_title)
source->AddString("title", "MD History");
else
source->AddLocalizedString("title", IDS_HISTORY_TITLE); source->AddLocalizedString("title", IDS_HISTORY_TITLE);
source->AddString( source->AddString(
...@@ -207,6 +211,8 @@ content::WebUIDataSource* CreateMdHistoryUIHTMLSource(Profile* profile) { ...@@ -207,6 +211,8 @@ content::WebUIDataSource* CreateMdHistoryUIHTMLSource(Profile* profile) {
} // namespace } // namespace
bool MdHistoryUI::use_test_title_ = false;
MdHistoryUI::MdHistoryUI(content::WebUI* web_ui) : WebUIController(web_ui) { MdHistoryUI::MdHistoryUI(content::WebUI* web_ui) : WebUIController(web_ui) {
Profile* profile = Profile::FromWebUI(web_ui); Profile* profile = Profile::FromWebUI(web_ui);
web_ui->AddMessageHandler(new BrowsingHistoryHandler()); web_ui->AddMessageHandler(new BrowsingHistoryHandler());
...@@ -217,7 +223,7 @@ MdHistoryUI::MdHistoryUI(content::WebUI* web_ui) : WebUIController(web_ui) { ...@@ -217,7 +223,7 @@ MdHistoryUI::MdHistoryUI(content::WebUI* web_ui) : WebUIController(web_ui) {
web_ui->AddMessageHandler(new HistoryLoginHandler()); web_ui->AddMessageHandler(new HistoryLoginHandler());
} }
data_source_ = CreateMdHistoryUIHTMLSource(profile); data_source_ = CreateMdHistoryUIHTMLSource(profile, use_test_title_);
content::WebUIDataSource::Add(profile, data_source_); content::WebUIDataSource::Add(profile, data_source_);
web_ui->RegisterMessageCallback("menuPromoShown", web_ui->RegisterMessageCallback("menuPromoShown",
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_UI_WEBUI_MD_HISTORY_UI_H_ #ifndef CHROME_BROWSER_UI_WEBUI_MD_HISTORY_UI_H_
#define CHROME_BROWSER_UI_WEBUI_MD_HISTORY_UI_H_ #define CHROME_BROWSER_UI_WEBUI_MD_HISTORY_UI_H_
#include "base/gtest_prod_util.h"
#include "base/macros.h" #include "base/macros.h"
#include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_controller.h"
#include "ui/base/layout.h" #include "ui/base/layout.h"
...@@ -40,6 +41,10 @@ class MdHistoryUI : public content::WebUIController { ...@@ -40,6 +41,10 @@ class MdHistoryUI : public content::WebUIController {
ui::ScaleFactor scale_factor); ui::ScaleFactor scale_factor);
private: private:
FRIEND_TEST_ALL_PREFIXES(ContinueWhereILeftOffTest, MDHistoryUpgrade);
static bool use_test_title_;
// Handler for the "menuPromoShown" message from the page. No arguments. // Handler for the "menuPromoShown" message from the page. No arguments.
void HandleMenuPromoShown(const base::ListValue* args); void HandleMenuPromoShown(const base::ListValue* args);
......
...@@ -18,6 +18,13 @@ const int kObsoleteReferrerPolicyAlways = 0; ...@@ -18,6 +18,13 @@ const int kObsoleteReferrerPolicyAlways = 0;
const int kObsoleteReferrerPolicyDefault = 1; const int kObsoleteReferrerPolicyDefault = 1;
const int kObsoleteReferrerPolicyNever = 2; const int kObsoleteReferrerPolicyNever = 2;
const int kObsoleteReferrerPolicyOrigin = 3; const int kObsoleteReferrerPolicyOrigin = 3;
bool IsUberOrUberReplacementURL(const GURL& url) {
return url.SchemeIs(content::kChromeUIScheme) &&
(url.host() == content::kChromeUIHistoryHost ||
url.host() == content::kChromeUIUberHost);
}
} // namespace } // namespace
// static // static
...@@ -103,6 +110,14 @@ void ContentSerializedNavigationDriver::Sanitize( ...@@ -103,6 +110,14 @@ void ContentSerializedNavigationDriver::Sanitize(
content::Referrer::SanitizeForRequest(navigation->virtual_url_, content::Referrer::SanitizeForRequest(navigation->virtual_url_,
old_referrer); old_referrer);
// Clear any Uber UI page state so that these pages are reloaded rather than
// restored from page state. This fixes session restore when WebUI URLs
// change.
if (IsUberOrUberReplacementURL(navigation->virtual_url_) &&
IsUberOrUberReplacementURL(navigation->original_request_url_)) {
navigation->encoded_page_state_ = std::string();
}
// No need to compare the policy, as it doesn't change during // No need to compare the policy, as it doesn't change during
// sanitization. If there has been a change, the referrer needs to be // sanitization. If there has been a change, the referrer needs to be
// stripped from the page state as well. // stripped from the page state as well.
......
...@@ -26,6 +26,7 @@ const char kChromeUIBlobInternalsHost[] = "blob-internals"; ...@@ -26,6 +26,7 @@ const char kChromeUIBlobInternalsHost[] = "blob-internals";
const char kChromeUIBrowserCrashHost[] = "inducebrowsercrashforrealz"; const char kChromeUIBrowserCrashHost[] = "inducebrowsercrashforrealz";
const char kChromeUIGpuHost[] = "gpu"; const char kChromeUIGpuHost[] = "gpu";
const char kChromeUIHistogramHost[] = "histograms"; const char kChromeUIHistogramHost[] = "histograms";
const char kChromeUIHistoryHost[] = "history";
const char kChromeUIMediaInternalsHost[] = "media-internals"; const char kChromeUIMediaInternalsHost[] = "media-internals";
const char kChromeUIMemoryExhaustHost[] = "memory-exhaust"; const char kChromeUIMemoryExhaustHost[] = "memory-exhaust";
const char kChromeUINetworkViewCacheHost[] = "view-http-cache"; const char kChromeUINetworkViewCacheHost[] = "view-http-cache";
...@@ -34,6 +35,7 @@ const char kChromeUINetworkErrorsListingHost[] = "network-errors"; ...@@ -34,6 +35,7 @@ const char kChromeUINetworkErrorsListingHost[] = "network-errors";
const char kChromeUIResourcesHost[] = "resources"; const char kChromeUIResourcesHost[] = "resources";
const char kChromeUIServiceWorkerInternalsHost[] = "serviceworker-internals"; const char kChromeUIServiceWorkerInternalsHost[] = "serviceworker-internals";
const char kChromeUITracingHost[] = "tracing"; const char kChromeUITracingHost[] = "tracing";
const char kChromeUIUberHost[] = "chrome";
const char kChromeUIWebRTCInternalsHost[] = "webrtc-internals"; const char kChromeUIWebRTCInternalsHost[] = "webrtc-internals";
const char kChromeUIBadCastCrashURL[] = "chrome://badcastcrash"; const char kChromeUIBadCastCrashURL[] = "chrome://badcastcrash";
......
...@@ -33,6 +33,7 @@ CONTENT_EXPORT extern const char kChromeUIBlobInternalsHost[]; ...@@ -33,6 +33,7 @@ CONTENT_EXPORT extern const char kChromeUIBlobInternalsHost[];
CONTENT_EXPORT extern const char kChromeUIBrowserCrashHost[]; CONTENT_EXPORT extern const char kChromeUIBrowserCrashHost[];
CONTENT_EXPORT extern const char kChromeUIGpuHost[]; CONTENT_EXPORT extern const char kChromeUIGpuHost[];
CONTENT_EXPORT extern const char kChromeUIHistogramHost[]; CONTENT_EXPORT extern const char kChromeUIHistogramHost[];
CONTENT_EXPORT extern const char kChromeUIHistoryHost[];
CONTENT_EXPORT extern const char kChromeUIIndexedDBInternalsHost[]; CONTENT_EXPORT extern const char kChromeUIIndexedDBInternalsHost[];
CONTENT_EXPORT extern const char kChromeUIMediaInternalsHost[]; CONTENT_EXPORT extern const char kChromeUIMediaInternalsHost[];
CONTENT_EXPORT extern const char kChromeUIMemoryExhaustHost[]; CONTENT_EXPORT extern const char kChromeUIMemoryExhaustHost[];
...@@ -42,6 +43,7 @@ CONTENT_EXPORT extern const char kChromeUINetworkViewCacheHost[]; ...@@ -42,6 +43,7 @@ CONTENT_EXPORT extern const char kChromeUINetworkViewCacheHost[];
CONTENT_EXPORT extern const char kChromeUIResourcesHost[]; CONTENT_EXPORT extern const char kChromeUIResourcesHost[];
CONTENT_EXPORT extern const char kChromeUIServiceWorkerInternalsHost[]; CONTENT_EXPORT extern const char kChromeUIServiceWorkerInternalsHost[];
CONTENT_EXPORT extern const char kChromeUITracingHost[]; CONTENT_EXPORT extern const char kChromeUITracingHost[];
CONTENT_EXPORT extern const char kChromeUIUberHost[];
CONTENT_EXPORT extern const char kChromeUIWebRTCInternalsHost[]; CONTENT_EXPORT extern const char kChromeUIWebRTCInternalsHost[];
// Full about URLs (including schemes). // Full about URLs (including schemes).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment