Home | History | Annotate | Download | only in webui
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/webui/web_ui_controller_factory_registry.h"
      6 
      7 #include "base/lazy_instance.h"
      8 #include "content/browser/frame_host/debug_urls.h"
      9 #include "content/public/common/url_constants.h"
     10 #include "url/gurl.h"
     11 
     12 namespace content {
     13 
     14 base::LazyInstance<std::vector<WebUIControllerFactory*> > g_factories =
     15     LAZY_INSTANCE_INITIALIZER;
     16 
     17 void WebUIControllerFactory::RegisterFactory(WebUIControllerFactory* factory) {
     18   g_factories.Pointer()->push_back(factory);
     19 }
     20 
     21 void WebUIControllerFactory::UnregisterFactoryForTesting(
     22     WebUIControllerFactory* factory) {
     23   std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
     24   for (size_t i = 0; i < factories->size(); ++i) {
     25     if ((*factories)[i] == factory) {
     26       factories->erase(factories->begin() + i);
     27       return;
     28     }
     29   }
     30   NOTREACHED() << "Tried to unregister a factory but it wasn't found";
     31 }
     32 
     33 WebUIControllerFactoryRegistry* WebUIControllerFactoryRegistry::GetInstance() {
     34   return Singleton<WebUIControllerFactoryRegistry>::get();
     35 }
     36 
     37 WebUIController* WebUIControllerFactoryRegistry::CreateWebUIControllerForURL(
     38     WebUI* web_ui, const GURL& url) const {
     39   std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
     40   for (size_t i = 0; i < factories->size(); ++i) {
     41     WebUIController* controller = (*factories)[i]->CreateWebUIControllerForURL(
     42         web_ui, url);
     43     if (controller)
     44       return controller;
     45   }
     46   return NULL;
     47 }
     48 
     49 WebUI::TypeID WebUIControllerFactoryRegistry::GetWebUIType(
     50     BrowserContext* browser_context, const GURL& url) const {
     51   std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
     52   for (size_t i = 0; i < factories->size(); ++i) {
     53     WebUI::TypeID type = (*factories)[i]->GetWebUIType(browser_context, url);
     54     if (type != WebUI::kNoWebUI)
     55       return type;
     56   }
     57   return WebUI::kNoWebUI;
     58 }
     59 
     60 bool WebUIControllerFactoryRegistry::UseWebUIForURL(
     61     BrowserContext* browser_context, const GURL& url) const {
     62   std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
     63   for (size_t i = 0; i < factories->size(); ++i) {
     64     if ((*factories)[i]->UseWebUIForURL(browser_context, url))
     65       return true;
     66   }
     67   return false;
     68 }
     69 
     70 bool WebUIControllerFactoryRegistry::UseWebUIBindingsForURL(
     71     BrowserContext* browser_context, const GURL& url) const {
     72   std::vector<WebUIControllerFactory*>* factories = g_factories.Pointer();
     73   for (size_t i = 0; i < factories->size(); ++i) {
     74     if ((*factories)[i]->UseWebUIBindingsForURL(browser_context, url))
     75       return true;
     76   }
     77   return false;
     78 }
     79 
     80 bool WebUIControllerFactoryRegistry::IsURLAcceptableForWebUI(
     81     BrowserContext* browser_context,
     82     const GURL& url) const {
     83   return UseWebUIForURL(browser_context, url) ||
     84       // It's possible to load about:blank in a Web UI renderer.
     85       // See http://crbug.com/42547
     86       url.spec() == url::kAboutBlankURL ||
     87       // javascript: and debug URLs like chrome://kill are allowed.
     88       IsRendererDebugURL(url);
     89 }
     90 
     91 WebUIControllerFactoryRegistry::WebUIControllerFactoryRegistry() {
     92 }
     93 
     94 WebUIControllerFactoryRegistry::~WebUIControllerFactoryRegistry() {
     95 }
     96 
     97 }  // namespace content
     98