summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-10 01:42:31 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-10 01:42:31 +0000
commitd6ef7684df0f0699bbeb5baceb69998fecd2c36d (patch)
tree986df4b654309cfabefbc778bd2f8665b3d8b5ba
parentbd132983c14c2bc63098578027c9596b397f9f4e (diff)
downloadchromium_src-d6ef7684df0f0699bbeb5baceb69998fecd2c36d.zip
chromium_src-d6ef7684df0f0699bbeb5baceb69998fecd2c36d.tar.gz
chromium_src-d6ef7684df0f0699bbeb5baceb69998fecd2c36d.tar.bz2
Revert 175890: actually, looks like we want this to also help move chromeos webui pages out of src/chrome.
> Revert 175822 > > After more investigation of what it would take to share the webui code framework from chrome with content, it didn't seam feasible to do this. The code in chrome (i.e. ChromeURLDataManager) is heavily tied to chrome, and is used by chrome for non-webui stuff. The JS code is also specific to Chrome. It seems better to not bring in all this stuff to content. > > > Allow multiple WebUIControllerFactory objects to be registered. This makes is possible to implement webui inside content. > > Review URL: https://codereview.chromium.org/11783038 > > TBR=jam@chromium.org > Review URL: https://codereview.chromium.org/11818036 TBR=jam@chromium.org Review URL: https://codereview.chromium.org/11819050 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175971 0039d316-1c4b-4281-b951-d872f2087c98
-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/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
28 files changed, 262 insertions, 255 deletions
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 07e9876..25a7a4c 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -92,6 +92,7 @@
#include "chrome/browser/ui/uma_browsing_activity_observer.h"
#include "chrome/browser/ui/user_data_dir_dialog.h"
#include "chrome/browser/ui/webui/chrome_url_data_manager_backend.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"
@@ -1391,6 +1392,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 53ab0ed..475e3cd 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -625,11 +625,6 @@ void ChromeContentBrowserClient::RenderProcessHostCreated(
#endif
}
-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 468bd3b..3113f6e 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -62,7 +62,6 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
content::RenderViewHost* render_view_host) OVERRIDE;
virtual void RenderProcessHostCreated(
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/extensions/api/debugger/debugger_api.cc b/chrome/browser/extensions/api/debugger/debugger_api.cc
index 79b28b7..2342691 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 7b44b6b..f76498f 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -35,9 +35,6 @@
#include "chrome/browser/ui/webui/instant_ui.h"
#include "chrome/browser/ui/webui/local_omnibox_popup/local_omnibox_popup_ui.h"
#include "chrome/browser/ui/webui/media/media_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
@@ -583,7 +584,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 577498b..2a70d88 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 de0b960..96762ce 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 c8b086e..1ebe282 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 a1791ae..5f6a07a 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"
@@ -211,6 +213,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 0c83621..5a60afc7 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -83,6 +83,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"
@@ -97,7 +98,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"
@@ -1268,12 +1268,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;
}
@@ -1389,10 +1387,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 9f54364..2347d17 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"
@@ -64,7 +65,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"
@@ -836,13 +836,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;
@@ -1589,13 +1585,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.
@@ -1872,11 +1865,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 c368149..518f854 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -866,6 +866,8 @@
'browser/user_metrics.cc',
'browser/utility_process_host_impl.cc',
'browser/utility_process_host_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 dcc127d..07666fc 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 68ca0ae..1795cf4 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,12 +64,10 @@ class RenderViewHost;
class RenderViewHostDelegateView;
class ResourceContext;
class SiteInstance;
-class SpeechInputManagerDelegate;
class SpeechRecognitionManagerDelegate;
class WebContents;
class WebContentsView;
class WebContentsViewDelegate;
-class WebUIControllerFactory;
struct MainFunctionParams;
struct ShowDesktopNotificationHostMsgParams;
@@ -117,10 +114,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 d203e06..abb50e1 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 a3294e7..3c89085 100644
--- a/content/public/common/content_client.h
+++ b/content/public/common/content_client.h
@@ -100,10 +100,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 d7eb89e..c7819db 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 {
@@ -66,4 +67,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 500c0af..696d2ff 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 {
@@ -73,6 +75,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 c9df9fd..706adc4 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 6894e66..130abd3 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -2940,8 +2940,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() &&