summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chrome_browser_main.cc4
-rw-r--r--chrome/browser/chrome_content_browser_client.cc5
-rw-r--r--chrome/browser/chrome_content_browser_client.h1
-rw-r--r--chrome/browser/devtools/devtools_file_helper.cc3
-rw-r--r--chrome/browser/devtools/devtools_window.cc8
-rw-r--r--chrome/browser/extensions/api/debugger/debugger_api.cc4
-rw-r--r--chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc9
-rw-r--r--chrome/common/chrome_content_client.cc6
-rw-r--r--chrome/common/chrome_content_client.h1
-rw-r--r--chrome/common/chrome_content_client_ios.mm4
-rw-r--r--chrome/test/base/chrome_test_suite.cc12
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc16
-rw-r--r--content/browser/site_instance_impl_unittest.cc27
-rw-r--r--content/browser/web_contents/render_view_host_manager.cc44
-rw-r--r--content/browser/web_contents/render_view_host_manager_unittest.cc59
-rw-r--r--content/browser/web_contents/web_contents_impl.cc24
-rw-r--r--content/browser/web_contents/web_contents_impl_unittest.cc66
-rw-r--r--content/browser/webui/web_ui_controller_factory_registry.cc97
-rw-r--r--content/browser/webui/web_ui_controller_factory_registry.h47
-rw-r--r--content/browser/webui/web_ui_impl.cc9
-rw-r--r--content/content_browser.gypi2
-rw-r--r--content/public/browser/content_browser_client.cc4
-rw-r--r--content/public/browser/content_browser_client.h7
-rw-r--r--content/public/browser/web_ui_controller_factory.h3
-rw-r--r--content/public/common/content_client.cc4
-rw-r--r--content/public/common/content_client.h4
-rw-r--r--content/public/common/url_constants.cc10
-rw-r--r--content/public/common/url_constants.h6
-rw-r--r--content/renderer/render_view_browsertest.cc39
-rw-r--r--content/renderer/render_view_impl.cc3
30 files changed, 268 insertions, 260 deletions
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 76ba381..7bc48a4 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -91,6 +91,7 @@
#include "chrome/browser/ui/startup/startup_browser_creator.h"
#include "chrome/browser/ui/uma_browsing_activity_observer.h"
#include "chrome/browser/ui/user_data_dir_dialog.h"
+#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
#include "chrome/common/child_process_logging.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_paths.h"
@@ -1389,6 +1390,9 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
g_browser_process->profile_manager()->GetLastOpenedProfiles();
#endif
+ content::WebUIControllerFactory::RegisterFactory(
+ ChromeWebUIControllerFactory::GetInstance());
+
if (browser_creator_->Start(parsed_command_line(), FilePath(),
profile_, last_opened_profiles, &result_code)) {
#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 3770f80..f9b792f 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -731,11 +731,6 @@ void ChromeContentBrowserClient::RenderProcessHostDeleted(
instant_service->RemoveInstantProcess(host->GetID());
}
-content::WebUIControllerFactory*
- ChromeContentBrowserClient::GetWebUIControllerFactory() {
- return ChromeWebUIControllerFactory::GetInstance();
-}
-
GURL ChromeContentBrowserClient::GetEffectiveURL(
content::BrowserContext* browser_context, const GURL& url) {
Profile* profile = Profile::FromBrowserContext(browser_context);
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 6e022ad..573060f 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -66,7 +66,6 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
content::RenderProcessHost* host) OVERRIDE;
virtual void RenderProcessHostDeleted(
content::RenderProcessHost* host) OVERRIDE;
- virtual content::WebUIControllerFactory* GetWebUIControllerFactory() OVERRIDE;
virtual bool ShouldUseProcessPerSite(content::BrowserContext* browser_context,
const GURL& effective_url) OVERRIDE;
virtual GURL GetEffectiveURL(content::BrowserContext* browser_context,
diff --git a/chrome/browser/devtools/devtools_file_helper.cc b/chrome/browser/devtools/devtools_file_helper.cc
index 080601e..c77e5f5 100644
--- a/chrome/browser/devtools/devtools_file_helper.cc
+++ b/chrome/browser/devtools/devtools_file_helper.cc
@@ -28,6 +28,7 @@
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_client.h"
+#include "content/public/common/url_constants.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/shell_dialogs/select_file_dialog.h"
@@ -133,7 +134,7 @@ std::string RegisterFileSystem(WebContents* web_contents,
const FilePath& path,
std::string* registered_name) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- CHECK(content::GetContentClient()->HasWebUIScheme(web_contents->GetURL()));
+ CHECK(content::HasWebUIScheme(web_contents->GetURL()));
std::string file_system_id = isolated_context()->RegisterFileSystemForPath(
fileapi::kFileSystemTypeNativeLocal, path, registered_name);
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 60200d0..86860ab 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -34,7 +34,6 @@
#include "chrome/common/pref_names.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/url_constants.h"
-#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/devtools_manager.h"
#include "content/public/browser/favicon_status.h"
@@ -49,6 +48,7 @@
#include "content/public/common/bindings_policy.h"
#include "content/public/common/content_client.h"
#include "content/public/common/page_transition_types.h"
+#include "content/public/common/url_constants.h"
#include "grit/generated_resources.h"
typedef std::vector<DevToolsWindow*> DevToolsWindowList;
@@ -852,19 +852,19 @@ DictionaryValue* CreateFileSystemValue(
} // namespace
void DevToolsWindow::RequestFileSystems() {
- CHECK(content::GetContentClient()->HasWebUIScheme(web_contents_->GetURL()));
+ CHECK(content::HasWebUIScheme(web_contents_->GetURL()));
file_helper_->RequestFileSystems(
Bind(&DevToolsWindow::FileSystemsLoaded, weak_factory_.GetWeakPtr()));
}
void DevToolsWindow::AddFileSystem() {
- CHECK(content::GetContentClient()->HasWebUIScheme(web_contents_->GetURL()));
+ CHECK(content::HasWebUIScheme(web_contents_->GetURL()));
file_helper_->AddFileSystem(
Bind(&DevToolsWindow::FileSystemAdded, weak_factory_.GetWeakPtr()));
}
void DevToolsWindow::RemoveFileSystem(const std::string& file_system_path) {
- CHECK(content::GetContentClient()->HasWebUIScheme(web_contents_->GetURL()));
+ CHECK(content::HasWebUIScheme(web_contents_->GetURL()));
file_helper_->RemoveFileSystem(file_system_path);
StringValue file_system_path_value(file_system_path);
CallClientFunction("InspectorFrontendAPI.fileSystemRemoved",
diff --git a/chrome/browser/extensions/api/debugger/debugger_api.cc b/chrome/browser/extensions/api/debugger/debugger_api.cc
index d672af7..7d4e703 100644
--- a/chrome/browser/extensions/api/debugger/debugger_api.cc
+++ b/chrome/browser/extensions/api/debugger/debugger_api.cc
@@ -36,6 +36,7 @@
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_client.h"
+#include "content/public/common/url_constants.h"
#include "extensions/common/error_utils.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
@@ -428,8 +429,7 @@ bool DebuggerFunction::InitWebContents() {
}
contents_ = web_contents;
- if (content::GetContentClient()->HasWebUIScheme(
- contents_->GetURL())) {
+ if (content::HasWebUIScheme(contents_->GetURL())) {
error_ = ErrorUtils::FormatErrorMessage(
keys::kAttachToWebUIError,
contents_->GetURL().scheme());
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index e271659..072da22 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -36,9 +36,6 @@
#include "chrome/browser/ui/webui/local_omnibox_popup/local_omnibox_popup_ui.h"
#include "chrome/browser/ui/webui/media/media_internals_ui.h"
#include "chrome/browser/ui/webui/media/webrtc_internals_ui.h"
-#if !defined(DISABLE_NACL)
-#include "chrome/browser/ui/webui/nacl_ui.h"
-#endif
#include "chrome/browser/ui/webui/net_internals/net_internals_ui.h"
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
#include "chrome/browser/ui/webui/omnibox/omnibox_ui.h"
@@ -68,6 +65,10 @@
#include "ui/gfx/favicon_size.h"
#include "ui/web_dialogs/web_dialog_ui.h"
+#if !defined(DISABLE_NACL)
+#include "chrome/browser/ui/webui/nacl_ui.h"
+#endif
+
#if defined(ENABLE_CONFIGURATION_POLICY)
#include "chrome/browser/ui/webui/policy_ui.h"
#endif
@@ -564,7 +565,7 @@ base::RefCountedMemory* ChromeWebUIControllerFactory::GetFaviconResourceBytes(
}
#endif
- if (!content::GetContentClient()->HasWebUIScheme(page_url))
+ if (!content::HasWebUIScheme(page_url))
return NULL;
#if defined(OS_WIN)
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc
index 1ff9b0a..5c4afe6 100644
--- a/chrome/common/chrome_content_client.cc
+++ b/chrome/common/chrome_content_client.cc
@@ -386,12 +386,6 @@ void ChromeContentClient::AddAdditionalSchemes(
#endif
}
-bool ChromeContentClient::HasWebUIScheme(const GURL& url) const {
- return url.SchemeIs(chrome::kChromeDevToolsScheme) ||
- url.SchemeIs(chrome::kChromeInternalScheme) ||
- url.SchemeIs(chrome::kChromeUIScheme);
-}
-
bool ChromeContentClient::CanHandleWhileSwappedOut(
const IPC::Message& msg) {
// Any Chrome-specific messages (apart from those listed in
diff --git a/chrome/common/chrome_content_client.h b/chrome/common/chrome_content_client.h
index 414d7a7..387bea2 100644
--- a/chrome/common/chrome_content_client.h
+++ b/chrome/common/chrome_content_client.h
@@ -28,7 +28,6 @@ class ChromeContentClient : public content::ContentClient {
virtual void AddAdditionalSchemes(
std::vector<std::string>* standard_schemes,
std::vector<std::string>* saveable_shemes) OVERRIDE;
- virtual bool HasWebUIScheme(const GURL& url) const OVERRIDE;
virtual bool CanHandleWhileSwappedOut(const IPC::Message& msg) OVERRIDE;
virtual std::string GetProduct() const OVERRIDE;
virtual std::string GetUserAgent() const OVERRIDE;
diff --git a/chrome/common/chrome_content_client_ios.mm b/chrome/common/chrome_content_client_ios.mm
index 963c1ad..f791561 100644
--- a/chrome/common/chrome_content_client_ios.mm
+++ b/chrome/common/chrome_content_client_ios.mm
@@ -42,10 +42,6 @@ void ChromeContentClient::AddAdditionalSchemes(
// No additional schemes for iOS.
}
-bool ChromeContentClient::HasWebUIScheme(const GURL& url) const {
- return url.SchemeIs(chrome::kChromeUIScheme);
-}
-
bool ChromeContentClient::CanHandleWhileSwappedOut(
const IPC::Message& msg) {
NOTIMPLEMENTED();
diff --git a/chrome/test/base/chrome_test_suite.cc b/chrome/test/base/chrome_test_suite.cc
index 872a200..73e861a 100644
--- a/chrome/test/base/chrome_test_suite.cc
+++ b/chrome/test/base/chrome_test_suite.cc
@@ -19,11 +19,13 @@
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_content_browser_client.h"
+#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_content_client.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/testing_browser_process.h"
+#include "content/public/test/test_launcher.h"
#include "net/base/mock_host_resolver.h"
#include "net/base/net_errors.h"
#include "net/base/net_util.h"
@@ -213,6 +215,16 @@ void ChromeTestSuite::Initialize() {
PathService::Override(base::DIR_MODULE, browser_dir_);
}
+#if !defined(OS_IOS)
+ if (!content::GetCurrentTestLauncherDelegate()) {
+ // Only want to do this for unit tests. For browser tests, this won't create
+ // the right object since TestChromeWebUIControllerFactory is used. That's
+ // created and registered in ChromeBrowserMainParts as in normal startup.
+ content::WebUIControllerFactory::RegisterFactory(
+ ChromeWebUIControllerFactory::GetInstance());
+ }
+#endif
+
// Disable external libraries load if we are under python process in
// ChromeOS. That means we are autotest and, if ASAN is used,
// external libraries load crashes.
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 4b0d8ee..b9957c8 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -85,6 +85,7 @@
#include "content/browser/speech/input_tag_speech_dispatcher_host.h"
#include "content/browser/speech/speech_recognition_dispatcher_host.h"
#include "content/browser/trace_message_filter.h"
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/browser/worker_host/worker_storage_partition.h"
#include "content/browser/worker_host/worker_message_filter.h"
#include "content/common/child_process_host_impl.h"
@@ -99,7 +100,6 @@
#include "content/public/browser/render_process_host_factory.h"
#include "content/public/browser/resource_context.h"
#include "content/public/browser/user_metrics.h"
-#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/process_type.h"
@@ -1284,12 +1284,10 @@ bool RenderProcessHostImpl::IsSuitableHost(
if (!host->IsGuest() && site_url.SchemeIs(chrome::kGuestScheme))
return false;
- WebUIControllerFactory* factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
- if (factory &&
- ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
+ if (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
host->GetID()) !=
- factory->UseWebUIBindingsForURL(browser_context, site_url)) {
+ WebUIControllerFactoryRegistry::GetInstance()->UseWebUIBindingsForURL(
+ browser_context, site_url)) {
return false;
}
@@ -1405,10 +1403,8 @@ bool RenderProcessHostImpl::ShouldUseProcessPerSite(
}
// DevTools pages have WebUI type but should not reuse the same host.
- WebUIControllerFactory* factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
- if (factory &&
- factory->UseWebUIForURL(browser_context, url) &&
+ if (WebUIControllerFactoryRegistry::GetInstance()->UseWebUIForURL(
+ browser_context, url) &&
!url.SchemeIs(chrome::kChromeDevToolsScheme)) {
return true;
}
diff --git a/content/browser/site_instance_impl_unittest.cc b/content/browser/site_instance_impl_unittest.cc
index 59ed0c2d..98cbee1 100644
--- a/content/browser/site_instance_impl_unittest.cc
+++ b/content/browser/site_instance_impl_unittest.cc
@@ -15,7 +15,7 @@
#include "content/browser/site_instance_impl.h"
#include "content/browser/web_contents/navigation_entry_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/browser/web_ui_controller_factory.h"
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/content_switches.h"
@@ -47,11 +47,11 @@ class SiteInstanceTestWebUIControllerFactory : public WebUIControllerFactory {
}
virtual bool UseWebUIForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return HasWebUIScheme(url);
}
virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return HasWebUIScheme(url);
}
virtual bool IsURLAcceptableForWebUI(
BrowserContext* browser_context,
@@ -61,24 +61,15 @@ class SiteInstanceTestWebUIControllerFactory : public WebUIControllerFactory {
}
};
-class SiteInstanceTestClient : public TestContentClient {
- public:
- SiteInstanceTestClient() {
- }
-
- virtual bool HasWebUIScheme(const GURL& url) const OVERRIDE {
- return url.SchemeIs(chrome::kChromeUIScheme);
- }
-};
-
class SiteInstanceTestBrowserClient : public TestContentBrowserClient {
public:
SiteInstanceTestBrowserClient()
: privileged_process_id_(-1) {
+ WebUIControllerFactory::RegisterFactory(&factory_);
}
- virtual WebUIControllerFactory* GetWebUIControllerFactory() OVERRIDE {
- return &factory_;
+ ~SiteInstanceTestBrowserClient() {
+ WebUIControllerFactoryRegistry::UnregisterFactoryForTesting(&factory_);
}
virtual bool IsSuitableHost(RenderProcessHost* process_host,
@@ -103,14 +94,11 @@ class SiteInstanceTest : public testing::Test {
file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING,
&message_loop_),
io_thread_(BrowserThread::IO, &message_loop_),
- old_client_(NULL),
old_browser_client_(NULL) {
}
virtual void SetUp() {
- old_client_ = GetContentClient();
old_browser_client_ = GetContentClient()->browser();
- SetContentClient(&client_);
GetContentClient()->set_browser_for_testing(&browser_client_);
url_util::AddStandardScheme(kPrivilegedScheme);
url_util::AddStandardScheme(chrome::kChromeUIScheme);
@@ -121,7 +109,6 @@ class SiteInstanceTest : public testing::Test {
EXPECT_TRUE(RenderProcessHost::AllHostsIterator().IsAtEnd());
GetContentClient()->set_browser_for_testing(old_browser_client_);
- SetContentClient(old_client_);
// http://crbug.com/143565 found SiteInstanceTest leaking an
// AppCacheDatabase. This happens because some part of the test indirectly
@@ -153,9 +140,7 @@ class SiteInstanceTest : public testing::Test {
TestBrowserThread file_user_blocking_thread_;
TestBrowserThread io_thread_;
- SiteInstanceTestClient client_;
SiteInstanceTestBrowserClient browser_client_;
- ContentClient* old_client_;
ContentBrowserClient* old_browser_client_;
};
diff --git a/content/browser/web_contents/render_view_host_manager.cc b/content/browser/web_contents/render_view_host_manager.cc
index 9a31ade..2abf1ff 100644
--- a/content/browser/web_contents/render_view_host_manager.cc
+++ b/content/browser/web_contents/render_view_host_manager.cc
@@ -16,6 +16,7 @@
#include "content/browser/web_contents/interstitial_page_impl.h"
#include "content/browser/web_contents/navigation_controller_impl.h"
#include "content/browser/web_contents/navigation_entry_impl.h"
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/browser/webui/web_ui_impl.h"
#include "content/common/view_messages.h"
#include "content/port/browser/render_widget_host_view_port.h"
@@ -24,7 +25,6 @@
#include "content/public/browser/notification_types.h"
#include "content/public/browser/web_contents_view.h"
#include "content/public/browser/web_ui_controller.h"
-#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/url_constants.h"
@@ -414,19 +414,19 @@ bool RenderViewHostManager::ShouldSwapProcessesForNavigation(
render_view_host_->GetSiteInstance()->GetSiteURL();
BrowserContext* browser_context =
delegate_->GetControllerForRenderManager().GetBrowserContext();
- const WebUIControllerFactory* web_ui_factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
- if (web_ui_factory) {
- if (web_ui_factory->UseWebUIForURL(browser_context, current_url)) {
- // Force swap if it's not an acceptable URL for Web UI.
- // Here, data URLs are never allowed.
- if (!web_ui_factory->IsURLAcceptableForWebUI(browser_context,
- new_entry->GetURL(), false))
- return true;
- } else {
- // Force swap if it's a Web UI URL.
- if (web_ui_factory->UseWebUIForURL(browser_context, new_entry->GetURL()))
- return true;
+ if (WebUIControllerFactoryRegistry::GetInstance()->UseWebUIForURL(
+ browser_context, current_url)) {
+ // Force swap if it's not an acceptable URL for Web UI.
+ // Here, data URLs are never allowed.
+ if (!WebUIControllerFactoryRegistry::GetInstance()->IsURLAcceptableForWebUI(
+ browser_context, new_entry->GetURL(), false)) {
+ return true;
+ }
+ } else {
+ // Force swap if it's a Web UI URL.
+ if (WebUIControllerFactoryRegistry::GetInstance()->UseWebUIForURL(
+ browser_context, new_entry->GetURL())) {
+ return true;
}
}
@@ -453,13 +453,11 @@ bool RenderViewHostManager::ShouldReuseWebUI(
const NavigationEntryImpl* new_entry) const {
NavigationControllerImpl& controller =
delegate_->GetControllerForRenderManager();
- WebUIControllerFactory* factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
return curr_entry && web_ui_.get() &&
- (factory->GetWebUIType(controller.GetBrowserContext(),
- curr_entry->GetURL()) ==
- factory->GetWebUIType(controller.GetBrowserContext(),
- new_entry->GetURL()));
+ (WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType(
+ controller.GetBrowserContext(), curr_entry->GetURL()) ==
+ WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType(
+ controller.GetBrowserContext(), new_entry->GetURL()));
}
SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry(
@@ -534,10 +532,8 @@ SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry(
// If we are navigating from a blank SiteInstance to a WebUI, make sure we
// create a new SiteInstance.
- const WebUIControllerFactory* web_ui_factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
- if (web_ui_factory &&
- web_ui_factory->UseWebUIForURL(browser_context, dest_url)) {
+ if (WebUIControllerFactoryRegistry::GetInstance()->UseWebUIForURL(
+ browser_context, dest_url)) {
return SiteInstance::CreateForURL(browser_context, dest_url);
}
diff --git a/content/browser/web_contents/render_view_host_manager_unittest.cc b/content/browser/web_contents/render_view_host_manager_unittest.cc
index 5dec92c..a048578 100644
--- a/content/browser/web_contents/render_view_host_manager_unittest.cc
+++ b/content/browser/web_contents/render_view_host_manager_unittest.cc
@@ -10,12 +10,12 @@
#include "content/browser/web_contents/navigation_entry_impl.h"
#include "content/browser/web_contents/render_view_host_manager.h"
#include "content/browser/web_contents/test_web_contents.h"
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/common/view_messages.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/web_ui_controller.h"
-#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/common/javascript_message_type.h"
#include "content/public/common/page_transition_types.h"
@@ -25,7 +25,6 @@
#include "content/public/test/test_notification_tracker.h"
#include "content/test/test_content_browser_client.h"
#include "content/test/test_content_client.h"
-#include "googleurl/src/url_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/glue/glue_serialize.h"
@@ -47,7 +46,7 @@ class RenderViewHostManagerTestWebUIControllerFactory
// WebUIFactory implementation.
virtual WebUIController* CreateWebUIControllerForURL(
WebUI* web_ui, const GURL& url) const OVERRIDE {
- if (!(should_create_webui_ && GetContentClient()->HasWebUIScheme(url)))
+ if (!(should_create_webui_ && HasWebUIScheme(url)))
return NULL;
return new WebUIController(web_ui);
}
@@ -59,19 +58,19 @@ class RenderViewHostManagerTestWebUIControllerFactory
virtual bool UseWebUIForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return HasWebUIScheme(url);
}
virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return HasWebUIScheme(url);
}
virtual bool IsURLAcceptableForWebUI(
BrowserContext* browser_context,
const GURL& url,
bool data_urls_allowed) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return HasWebUIScheme(url);
}
private:
@@ -80,38 +79,6 @@ class RenderViewHostManagerTestWebUIControllerFactory
DISALLOW_COPY_AND_ASSIGN(RenderViewHostManagerTestWebUIControllerFactory);
};
-class RenderViewHostManagerTestClient : public TestContentClient {
- public:
- RenderViewHostManagerTestClient() {
- }
-
- virtual bool HasWebUIScheme(const GURL& url) const OVERRIDE {
- return url.SchemeIs(chrome::kChromeUIScheme);
- }
-};
-
-class RenderViewHostManagerTestBrowserClient
- : public TestContentBrowserClient {
- public:
- RenderViewHostManagerTestBrowserClient() {}
- virtual ~RenderViewHostManagerTestBrowserClient() {}
-
- void set_should_create_webui(bool should_create_webui) {
- factory_.set_should_create_webui(should_create_webui);
- }
-
- // TestContentBrowserClient implementation.
- virtual WebUIControllerFactory*
- GetWebUIControllerFactory() OVERRIDE {
- return &factory_;
- }
-
- private:
- RenderViewHostManagerTestWebUIControllerFactory factory_;
-
- DISALLOW_COPY_AND_ASSIGN(RenderViewHostManagerTestBrowserClient);
-};
-
} // namespace
class RenderViewHostManagerTest
@@ -119,21 +86,16 @@ class RenderViewHostManagerTest
public:
virtual void SetUp() OVERRIDE {
RenderViewHostImplTestHarness::SetUp();
- old_client_ = GetContentClient();
- old_browser_client_ = GetContentClient()->browser();
- SetContentClient(&client_);
- GetContentClient()->set_browser_for_testing(&browser_client_);
- url_util::AddStandardScheme(chrome::kChromeUIScheme);
+ WebUIControllerFactory::RegisterFactory(&factory_);
}
virtual void TearDown() OVERRIDE {
RenderViewHostImplTestHarness::TearDown();
- GetContentClient()->set_browser_for_testing(old_browser_client_);
- SetContentClient(old_client_);
+ WebUIControllerFactoryRegistry::UnregisterFactoryForTesting(&factory_);
}
void set_should_create_webui(bool should_create_webui) {
- browser_client_.set_should_create_webui(should_create_webui);
+ factory_.set_should_create_webui(should_create_webui);
}
void NavigateActiveAndCommit(const GURL& url) {
@@ -166,10 +128,7 @@ class RenderViewHostManagerTest
}
private:
- RenderViewHostManagerTestClient client_;
- RenderViewHostManagerTestBrowserClient browser_client_;
- ContentClient* old_client_;
- ContentBrowserClient* old_browser_client_;
+ RenderViewHostManagerTestWebUIControllerFactory factory_;
};
// Tests that when you navigate from a chrome:// url to another page, and
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index ecbe1a7..bb1238f 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -37,6 +37,7 @@
#include "content/browser/web_contents/interstitial_page_impl.h"
#include "content/browser/web_contents/navigation_entry_impl.h"
#include "content/browser/web_contents/web_contents_view_guest.h"
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/browser/webui/web_ui_impl.h"
#include "content/common/browser_plugin_messages.h"
#include "content/common/icon_messages.h"
@@ -65,7 +66,6 @@
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_view.h"
-#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/content_restriction.h"
@@ -856,13 +856,9 @@ WebContentsView* WebContentsImpl::GetView() const {
}
WebUI* WebContentsImpl::CreateWebUI(const GURL& url) {
- WebUIControllerFactory* factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
- if (!factory)
- return NULL;
WebUIImpl* web_ui = new WebUIImpl(this);
- WebUIController* controller =
- factory->CreateWebUIControllerForURL(web_ui, url);
+ WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()->
+ CreateWebUIControllerForURL(web_ui, url);
if (controller) {
web_ui->SetController(controller);
return web_ui;
@@ -1630,13 +1626,10 @@ bool WebContentsImpl::NavigateToEntry(
// For security, we should never send non-Web-UI URLs to a Web UI renderer.
// Double check that here.
int enabled_bindings = dest_render_view_host->GetEnabledBindings();
- WebUIControllerFactory* factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
bool data_urls_allowed = delegate_ && delegate_->CanLoadDataURLsInWebUI();
bool is_allowed_in_web_ui_renderer =
- factory &&
- factory->IsURLAcceptableForWebUI(GetBrowserContext(), entry.GetURL(),
- data_urls_allowed);
+ WebUIControllerFactoryRegistry::GetInstance()->IsURLAcceptableForWebUI(
+ GetBrowserContext(), entry.GetURL(), data_urls_allowed);
if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) &&
!is_allowed_in_web_ui_renderer) {
// Log the URL to help us diagnose any future failures of this CHECK.
@@ -1913,11 +1906,8 @@ int WebContentsImpl::GetContentRestrictions() const {
}
WebUI::TypeID WebContentsImpl::GetWebUITypeForCurrentState() {
- WebUIControllerFactory* factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
- if (!factory)
- return WebUI::kNoWebUI;
- return factory->GetWebUIType(GetBrowserContext(), GetURL());
+ return WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType(
+ GetBrowserContext(), GetURL());
}
WebUI* WebContentsImpl::GetWebUIForCurrentState() {
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index de6887d..a033357 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -10,6 +10,7 @@
#include "content/browser/web_contents/interstitial_page_impl.h"
#include "content/browser/web_contents/navigation_entry_impl.h"
#include "content/browser/web_contents/test_web_contents.h"
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/common/view_messages.h"
#include "content/public/browser/interstitial_page_delegate.h"
#include "content/public/browser/navigation_details.h"
@@ -19,7 +20,6 @@
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_ui_controller.h"
-#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/url_constants.h"
@@ -28,19 +28,20 @@
#include "content/public/test/test_utils.h"
#include "content/test/test_content_browser_client.h"
#include "content/test/test_content_client.h"
-#include "googleurl/src/url_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/glue/webkit_glue.h"
namespace content {
namespace {
+const char kTestWebUIUrl[] = "chrome://blah";
+
class WebContentsImplTestWebUIControllerFactory
: public WebUIControllerFactory {
public:
virtual WebUIController* CreateWebUIControllerForURL(
WebUI* web_ui, const GURL& url) const OVERRIDE {
- if (!GetContentClient()->HasWebUIScheme(url))
+ if (!UseWebUI(url))
return NULL;
return new WebUIController(web_ui);
@@ -53,43 +54,25 @@ class WebContentsImplTestWebUIControllerFactory
virtual bool UseWebUIForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return UseWebUI(url);
}
virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return UseWebUI(url);
}
virtual bool IsURLAcceptableForWebUI(
BrowserContext* browser_context,
const GURL& url,
bool data_urls_allowed) const {
- return GetContentClient()->HasWebUIScheme(url);
- }
-};
-
-class WebContentsImplTestContentClient : public TestContentClient {
- public:
- WebContentsImplTestContentClient() {
- }
-
- virtual bool HasWebUIScheme(const GURL& url) const OVERRIDE {
- return url.SchemeIs("webcontentsimpltest");
- }
-};
-
-class WebContentsImplTestBrowserClient : public TestContentBrowserClient {
- public:
- WebContentsImplTestBrowserClient() {
- }
-
- virtual WebUIControllerFactory* GetWebUIControllerFactory() OVERRIDE {
- return &factory_;
+ return UseWebUI(url);
}
private:
- WebContentsImplTestWebUIControllerFactory factory_;
+ bool UseWebUI(const GURL& url) const {
+ return url == GURL(kTestWebUIUrl);
+ }
};
class TestInterstitialPage;
@@ -257,37 +240,24 @@ class TestInterstitialPageStateGuard : public TestInterstitialPage::Delegate {
class WebContentsImplTest : public RenderViewHostImplTestHarness {
public:
WebContentsImplTest()
- : old_client_(NULL),
- old_browser_client_(NULL),
- ui_thread_(BrowserThread::UI, &message_loop_),
+ : ui_thread_(BrowserThread::UI, &message_loop_),
file_user_blocking_thread_(
BrowserThread::FILE_USER_BLOCKING, &message_loop_),
io_thread_(BrowserThread::IO, &message_loop_) {
}
virtual void SetUp() {
- // These tests treat webcontentsimpltest as a privileged WebUI scheme.
- // We must register it similarly to kChromeUIScheme.
- url_util::AddStandardScheme("webcontentsimpltest");
-
- old_client_ = GetContentClient();
- old_browser_client_ = GetContentClient()->browser();
- SetContentClient(&client_);
- GetContentClient()->set_browser_for_testing(&browser_client_);
RenderViewHostImplTestHarness::SetUp();
+ WebUIControllerFactory::RegisterFactory(&factory_);
}
virtual void TearDown() {
- GetContentClient()->set_browser_for_testing(old_browser_client_);
- SetContentClient(old_client_);
RenderViewHostImplTestHarness::TearDown();
+ WebUIControllerFactoryRegistry::UnregisterFactoryForTesting(&factory_);
}
private:
- WebContentsImplTestContentClient client_;
- WebContentsImplTestBrowserClient browser_client_;
- ContentClient* old_client_;
- ContentBrowserClient* old_browser_client_;
+ WebContentsImplTestWebUIControllerFactory factory_;
TestBrowserThread ui_thread_;
TestBrowserThread file_user_blocking_thread_;
TestBrowserThread io_thread_;
@@ -345,7 +315,7 @@ TEST_F(WebContentsImplTest, UpdateTitle) {
TEST_F(WebContentsImplTest, NTPViewSource) {
NavigationControllerImpl& cont =
static_cast<NavigationControllerImpl&>(controller());
- const char kUrl[] = "view-source:webcontentsimpltest://blah";
+ const char kUrl[] = "view-source:chrome://blah";
const GURL kGURL(kUrl);
process()->sink().ClearMessages();
@@ -759,7 +729,7 @@ TEST_F(WebContentsImplTest, CrossSiteNavigationBackPreempted) {
contents()->transition_cross_site = true;
// Start with a web ui page, which gets a new RVH with WebUI bindings.
- const GURL url1("webcontentsimpltest://blah");
+ const GURL url1("chrome://blah");
controller().LoadURL(
url1, Referrer(), PAGE_TRANSITION_TYPED, std::string());
TestRenderViewHost* ntp_rvh = test_rvh();
@@ -896,7 +866,7 @@ TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) {
contents()->transition_cross_site = true;
// Navigate to NTP URL.
- const GURL url("webcontentsimpltest://blah");
+ const GURL url("chrome://blah");
controller().LoadURL(
url, Referrer(), PAGE_TRANSITION_TYPED, std::string());
TestRenderViewHost* orig_rvh = test_rvh();
@@ -914,7 +884,7 @@ TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) {
// Suppose the first navigation tries to commit now, with a
// ViewMsg_Stop in flight. This should not cancel the pending navigation,
// but it should act as if the beforeunload ack arrived.
- orig_rvh->SendNavigate(1, GURL("webcontentsimpltest://blah"));
+ orig_rvh->SendNavigate(1, GURL("chrome://blah"));
EXPECT_TRUE(contents()->cross_navigation_pending());
EXPECT_EQ(orig_rvh, contents()->GetRenderViewHost());
EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack());
diff --git a/content/browser/webui/web_ui_controller_factory_registry.cc b/content/browser/webui/web_ui_controller_factory_registry.cc
new file mode 100644
index 0000000..15c07e4
--- /dev/null
+++ b/content/browser/webui/web_ui_controller_factory_registry.cc
@@ -0,0 +1,97 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
+
+#include "base/lazy_instance.h"
+
+namespace content {
+
+base::LazyInstance<std::vector<WebUIControllerFactory*> > g_factories =
+ LAZY_INSTANCE_INITIALIZER;
+
+void WebUIControllerFactory::RegisterFactory(WebUIControllerFactory* factory) {
+ g_factories.Pointer()->push_back(factory);
+}
+
+WebUIControllerFactoryRegistry* WebUIControllerFactoryRegistry::GetInstance() {
+ return Singleton<WebUIControllerFactoryRegistry>::get();
+}
+
+void WebUIControllerFactoryRegistry::UnregisterFactoryForTesting(
+ WebUIControllerFactory* factory) {
+ std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
+ for (size_t i = 0; i < factories->size(); ++i) {
+ if ((*factories)[i] == factory) {
+ factories->erase(factories->begin() + i);
+ return;
+ }
+ }
+ NOTREACHED() << "Tried to unregister a factory but it wasn't found";
+}
+
+WebUIController* WebUIControllerFactoryRegistry::CreateWebUIControllerForURL(
+ WebUI* web_ui, const GURL& url) const {
+ std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
+ for (size_t i = 0; i < factories->size(); ++i) {
+ WebUIController* controller = (*factories)[i]->CreateWebUIControllerForURL(
+ web_ui, url);
+ if (controller)
+ return controller;
+ }
+ return NULL;
+}
+
+WebUI::TypeID WebUIControllerFactoryRegistry::GetWebUIType(
+ BrowserContext* browser_context, const GURL& url) const {
+ std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
+ for (size_t i = 0; i < factories->size(); ++i) {
+ WebUI::TypeID type = (*factories)[i]->GetWebUIType(browser_context, url);
+ if (type != WebUI::kNoWebUI)
+ return type;
+ }
+ return WebUI::kNoWebUI;
+}
+
+bool WebUIControllerFactoryRegistry::UseWebUIForURL(
+ BrowserContext* browser_context, const GURL& url) const {
+ std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
+ for (size_t i = 0; i < factories->size(); ++i) {
+ if ((*factories)[i]->UseWebUIForURL(browser_context, url))
+ return true;
+ }
+ return false;
+}
+
+bool WebUIControllerFactoryRegistry::UseWebUIBindingsForURL(
+ BrowserContext* browser_context, const GURL& url) const {
+ std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
+ for (size_t i = 0; i < factories->size(); ++i) {
+ if ((*factories)[i]->UseWebUIBindingsForURL(browser_context, url))
+ return true;
+ }
+ return false;
+}
+
+bool WebUIControllerFactoryRegistry::IsURLAcceptableForWebUI(
+ BrowserContext* browser_context,
+ const GURL& url,
+ bool data_urls_allowed) const {
+ std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
+ for (size_t i = 0; i < factories->size(); ++i) {
+ if ((*factories)[i]->IsURLAcceptableForWebUI(
+ browser_context, url, data_urls_allowed)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+WebUIControllerFactoryRegistry::WebUIControllerFactoryRegistry() {
+}
+
+WebUIControllerFactoryRegistry::~WebUIControllerFactoryRegistry() {
+}
+
+} // namespace content
diff --git a/content/browser/webui/web_ui_controller_factory_registry.h b/content/browser/webui/web_ui_controller_factory_registry.h
new file mode 100644
index 0000000..dbb93e2c
--- /dev/null
+++ b/content/browser/webui/web_ui_controller_factory_registry.h
@@ -0,0 +1,47 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_WEBUI_WEB_UI_CONTROLLER_FACTORY_REGISTRY_H_
+#define CONTENT_BROWSER_WEBUI_WEB_UI_CONTROLLER_FACTORY_REGISTRY_H_
+
+#include "base/memory/singleton.h"
+#include "content/public/browser/web_ui_controller_factory.h"
+
+namespace content {
+
+// A singleton which holds on to all the registered WebUIControllerFactory
+// instances.
+class CONTENT_EXPORT WebUIControllerFactoryRegistry
+ : public WebUIControllerFactory {
+ public:
+ static WebUIControllerFactoryRegistry* GetInstance();
+
+ static void UnregisterFactoryForTesting(WebUIControllerFactory* factory);
+
+ // WebUIControllerFactory implementation. Each method loops through the same
+ // method on all the factories.
+ virtual WebUIController* CreateWebUIControllerForURL(
+ WebUI* web_ui, const GURL& url) const OVERRIDE;
+ virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context,
+ const GURL& url) const OVERRIDE;
+ virtual bool UseWebUIForURL(BrowserContext* browser_context,
+ const GURL& url) const OVERRIDE;
+ virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context,
+ const GURL& url) const OVERRIDE;
+ virtual bool IsURLAcceptableForWebUI(BrowserContext* browser_context,
+ const GURL& url,
+ bool data_urls_allowed) const OVERRIDE;
+
+ private:
+ friend struct DefaultSingletonTraits<WebUIControllerFactoryRegistry>;
+
+ WebUIControllerFactoryRegistry();
+ virtual ~WebUIControllerFactoryRegistry();
+
+ DISALLOW_COPY_AND_ASSIGN(WebUIControllerFactoryRegistry);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_WEBUI_WEB_UI_CONTROLLER_FACTORY_REGISTRY_H_
diff --git a/content/browser/webui/web_ui_impl.cc b/content/browser/webui/web_ui_impl.cc
index 772e22d..5155702 100644
--- a/content/browser/webui/web_ui_impl.cc
+++ b/content/browser/webui/web_ui_impl.cc
@@ -13,12 +13,12 @@
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/common/view_messages.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_contents_view.h"
#include "content/public/browser/web_ui_controller.h"
-#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/common/content_client.h"
@@ -77,13 +77,10 @@ void WebUIImpl::OnWebUISend(const GURL& source_url,
const ListValue& args) {
WebContentsDelegate* delegate = web_contents_->GetDelegate();
bool data_urls_allowed = delegate && delegate->CanLoadDataURLsInWebUI();
- WebUIControllerFactory* factory =
- GetContentClient()->browser()->GetWebUIControllerFactory();
if (!ChildProcessSecurityPolicyImpl::GetInstance()->
HasWebUIBindings(web_contents_->GetRenderProcessHost()->GetID()) ||
- !factory->IsURLAcceptableForWebUI(web_contents_->GetBrowserContext(),
- source_url,
- data_urls_allowed)) {
+ !WebUIControllerFactoryRegistry::GetInstance()->IsURLAcceptableForWebUI(
+ web_contents_->GetBrowserContext(), source_url, data_urls_allowed)) {
NOTREACHED() << "Blocked unauthorized use of WebUIBindings.";
return;
}
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index eed3859..00bdf03 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -895,6 +895,8 @@
'browser/webui/url_data_source_impl.h',
'browser/webui/web_ui_data_source_impl.cc',
'browser/webui/web_ui_data_source_impl.h',
+ 'browser/webui/web_ui_controller_factory_registry.cc',
+ 'browser/webui/web_ui_controller_factory_registry.h',
'browser/webui/web_ui_impl.cc',
'browser/webui/web_ui_impl.h',
'browser/webui/web_ui_message_handler.cc',
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index f377bbd..6eb1f22 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -26,10 +26,6 @@ WebContentsViewDelegate* ContentBrowserClient::GetWebContentsViewDelegate(
return NULL;
}
-WebUIControllerFactory* ContentBrowserClient::GetWebUIControllerFactory() {
- return NULL;
-}
-
GURL ContentBrowserClient::GetEffectiveURL(BrowserContext* browser_context,
const GURL& url) {
return url;
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 822bf1e..99b145c 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -22,7 +22,6 @@
#include "base/posix/global_descriptors.h"
#endif
-
class CommandLine;
class FilePath;
class GURL;
@@ -65,13 +64,11 @@ class RenderViewHost;
class RenderViewHostDelegateView;
class ResourceContext;
class SiteInstance;
-class SpeechInputManagerDelegate;
class SpeechRecognitionManagerDelegate;
class WebContents;
class WebContentsView;
class WebContentsViewDelegate;
class WebRTCInternals;
-class WebUIControllerFactory;
struct MainFunctionParams;
struct ShowDesktopNotificationHostMsgParams;
@@ -125,10 +122,6 @@ class CONTENT_EXPORT ContentBrowserClient {
// Notifies that a BrowserChildProcessHost has been created.
virtual void BrowserChildProcessHostCreated(BrowserChildProcessHost* host) {}
- // Gets the WebUIControllerFactory which will be responsible for generating
- // WebUIs. Can return NULL if the embedder doesn't need WebUI support.
- virtual WebUIControllerFactory* GetWebUIControllerFactory();
-
// Get the effective URL for the given actual URL, to allow an embedder to
// group different url schemes in the same SiteInstance.
virtual GURL GetEffectiveURL(BrowserContext* browser_context,
diff --git a/content/public/browser/web_ui_controller_factory.h b/content/public/browser/web_ui_controller_factory.h
index 3da1d71..11a4c9f 100644
--- a/content/public/browser/web_ui_controller_factory.h
+++ b/content/public/browser/web_ui_controller_factory.h
@@ -22,6 +22,9 @@ class CONTENT_EXPORT WebUIControllerFactory {
public:
virtual ~WebUIControllerFactory() {}
+ // Call to register a factory.
+ static void RegisterFactory(WebUIControllerFactory* factory);
+
// Returns a WebUIController instance for the given URL, or NULL if the URL
// doesn't correspond to a WebUI.
virtual WebUIController* CreateWebUIControllerForURL(
diff --git a/content/public/common/content_client.cc b/content/public/common/content_client.cc
index 12457b7..f9df1888 100644
--- a/content/public/common/content_client.cc
+++ b/content/public/common/content_client.cc
@@ -52,10 +52,6 @@ ContentClient::ContentClient()
ContentClient::~ContentClient() {
}
-bool ContentClient::HasWebUIScheme(const GURL& url) const {
- return false;
-}
-
bool ContentClient::CanHandleWhileSwappedOut(const IPC::Message& message) {
return false;
}
diff --git a/content/public/common/content_client.h b/content/public/common/content_client.h
index 03788bc..85a46ad 100644
--- a/content/public/common/content_client.h
+++ b/content/public/common/content_client.h
@@ -104,10 +104,6 @@ class CONTENT_EXPORT ContentClient {
std::vector<std::string>* standard_schemes,
std::vector<std::string>* savable_schemes) {}
- // Returns true if the url has a scheme for WebUI. See also
- // WebUIControllerFactory::UseWebUIForURL in the browser process.
- virtual bool HasWebUIScheme(const GURL& url) const;
-
// Returns whether the given message should be processed in the browser on
// behalf of a swapped out renderer.
virtual bool CanHandleWhileSwappedOut(const IPC::Message& message);
diff --git a/content/public/common/url_constants.cc b/content/public/common/url_constants.cc
index a813c57..2f57cfc 100644
--- a/content/public/common/url_constants.cc
+++ b/content/public/common/url_constants.cc
@@ -5,6 +5,7 @@
#include "content/public/common/url_constants.h"
#include "content/common/savable_url_schemes.h"
+#include "googleurl/src/gurl.h"
namespace chrome {
@@ -72,4 +73,13 @@ const char* const* GetSavableSchemes() {
return GetSavableSchemesInternal();
}
+bool HasWebUIScheme(const GURL& url) {
+ return
+#if !defined(OS_IOS)
+ url.SchemeIs(chrome::kChromeDevToolsScheme) ||
+ url.SchemeIs(chrome::kChromeInternalScheme) ||
+#endif
+ url.SchemeIs(chrome::kChromeUIScheme);
+}
+
} // namespace content
diff --git a/content/public/common/url_constants.h b/content/public/common/url_constants.h
index 2cf72ed..19c31cf4 100644
--- a/content/public/common/url_constants.h
+++ b/content/public/common/url_constants.h
@@ -9,6 +9,8 @@
// Contains constants for known URLs and portions thereof.
+class GURL;
+
// TODO(jam): rename this to content.
namespace chrome {
@@ -78,6 +80,10 @@ extern const char kSwappedOutURL[];
// invoked on any thread.
CONTENT_EXPORT const char* const* GetSavableSchemes();
+// Returns true if the url has a scheme for WebUI. See also
+// WebUIControllerFactory::UseWebUIForURL in the browser process.
+CONTENT_EXPORT bool HasWebUIScheme(const GURL& url);
+
} // namespace content
#endif // CONTENT_PUBLIC_COMMON_URL_CONSTANTS_H_
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 8d1e706..00abf5e 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -96,11 +96,11 @@ class WebUITestWebUIControllerFactory : public WebUIControllerFactory {
}
virtual bool UseWebUIForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return HasWebUIScheme(url);
}
virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
- return GetContentClient()->HasWebUIScheme(url);
+ return HasWebUIScheme(url);
}
virtual bool IsURLAcceptableForWebUI(
BrowserContext* browser_context,
@@ -110,28 +110,6 @@ class WebUITestWebUIControllerFactory : public WebUIControllerFactory {
}
};
-class WebUITestClient : public ShellContentClient {
- public:
- WebUITestClient() {
- }
-
- virtual bool HasWebUIScheme(const GURL& url) const OVERRIDE {
- return url.SchemeIs(chrome::kChromeUIScheme);
- }
-};
-
-class WebUITestBrowserClient : public ShellContentBrowserClient {
- public:
- WebUITestBrowserClient() {}
-
- virtual WebUIControllerFactory* GetWebUIControllerFactory() OVERRIDE {
- return &factory_;
- }
-
- private:
- WebUITestWebUIControllerFactory factory_;
-};
-
} // namespace
class RenderViewImplTest : public RenderViewTest {
@@ -342,14 +320,8 @@ TEST_F(RenderViewImplTest, OnNavigationHttpPost) {
}
TEST_F(RenderViewImplTest, DecideNavigationPolicy) {
- WebUITestClient client;
- WebUITestBrowserClient browser_client;
- ContentClient* old_client = GetContentClient();
- ContentBrowserClient* old_browser_client = GetContentClient()->browser();
-
- SetContentClient(&client);
- GetContentClient()->set_browser_for_testing(&browser_client);
- client.set_renderer_for_testing(old_client->renderer());
+ WebUITestWebUIControllerFactory factory;
+ WebUIControllerFactory::RegisterFactory(&factory);
// Navigations to normal HTTP URLs can be handled locally.
WebKit::WebURLRequest request(GURL("http://foo.com"));
@@ -384,9 +356,6 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicy) {
WebKit::WebNavigationPolicyNewForegroundTab,
false);
EXPECT_EQ(WebKit::WebNavigationPolicyIgnore, policy);
-
- GetContentClient()->set_browser_for_testing(old_browser_client);
- SetContentClient(old_client);
}
TEST_F(RenderViewImplTest, DecideNavigationPolicyForWebUI) {
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index aec9950..faa04ba 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -2957,8 +2957,7 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
// blessed with file permissions.
int cumulative_bindings = RenderProcess::current()->GetEnabledBindings();
bool is_initial_navigation = page_id_ == -1;
- bool should_fork =
- GetContentClient()->HasWebUIScheme(url) ||
+ bool should_fork = HasWebUIScheme(url) ||
(cumulative_bindings & BINDINGS_POLICY_WEB_UI) ||
url.SchemeIs(chrome::kViewSourceScheme) ||
(frame->isViewSourceModeEnabled() &&