diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-28 06:33:03 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-28 06:33:03 +0000 |
commit | 86a0a6e893f3827fe38a08b4e678d32ea0492903 (patch) | |
tree | 04a038d0bb2db311d119fd4272d4372f2bda9c71 | |
parent | 48dfce7f671b116966958d4e00d9ef7970afba7f (diff) | |
download | chromium_src-86a0a6e893f3827fe38a08b4e678d32ea0492903.zip chromium_src-86a0a6e893f3827fe38a08b4e678d32ea0492903.tar.gz chromium_src-86a0a6e893f3827fe38a08b4e678d32ea0492903.tar.bz2 |
Allow multiple WebUIControllerFactory objects to be registered. This makes is possible to implement webui inside content.
BUG=169170
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=175822
Review URL: https://codereview.chromium.org/11783038
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@179107 0039d316-1c4b-4281-b951-d872f2087c98
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() && |