PageRenderTime 55ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/content/browser/webui/web_ui_controller_factory_registry.cc

http://github.com/chromium/chromium
C++ | 109 lines | 87 code | 16 blank | 6 comment | 13 complexity | 345729c854c16151461747aa94c6f3a8 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.0, BSD-2-Clause, LGPL-2.1, MPL-2.0, 0BSD, EPL-1.0, MPL-2.0-no-copyleft-exception, GPL-2.0, BitTorrent-1.0, CPL-1.0, LGPL-3.0, Unlicense, BSD-3-Clause, CC0-1.0, JSON, MIT, GPL-3.0, CC-BY-SA-3.0, AGPL-1.0
  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. #include "content/browser/webui/web_ui_controller_factory_registry.h"
  5. #include <stddef.h>
  6. #include "base/lazy_instance.h"
  7. #include "content/browser/frame_host/debug_urls.h"
  8. #include "content/public/browser/content_browser_client.h"
  9. #include "content/public/browser/web_ui_controller.h"
  10. #include "content/public/common/content_client.h"
  11. #include "content/public/common/url_constants.h"
  12. #include "content/public/common/url_utils.h"
  13. #include "url/gurl.h"
  14. namespace content {
  15. base::LazyInstance<std::vector<WebUIControllerFactory*>>::DestructorAtExit
  16. g_web_ui_controller_factories = LAZY_INSTANCE_INITIALIZER;
  17. void WebUIControllerFactory::RegisterFactory(WebUIControllerFactory* factory) {
  18. g_web_ui_controller_factories.Pointer()->push_back(factory);
  19. }
  20. void WebUIControllerFactory::UnregisterFactoryForTesting(
  21. WebUIControllerFactory* factory) {
  22. std::vector<WebUIControllerFactory*>* factories =
  23. g_web_ui_controller_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. WebUIControllerFactoryRegistry* WebUIControllerFactoryRegistry::GetInstance() {
  33. return base::Singleton<WebUIControllerFactoryRegistry>::get();
  34. }
  35. std::unique_ptr<WebUIController>
  36. WebUIControllerFactoryRegistry::CreateWebUIControllerForURL(WebUI* web_ui,
  37. const GURL& url) {
  38. std::vector<WebUIControllerFactory*>& factories =
  39. g_web_ui_controller_factories.Get();
  40. for (WebUIControllerFactory* factory : factories) {
  41. auto controller = factory->CreateWebUIControllerForURL(web_ui, url);
  42. if (controller)
  43. return controller;
  44. }
  45. return nullptr;
  46. }
  47. WebUI::TypeID WebUIControllerFactoryRegistry::GetWebUIType(
  48. BrowserContext* browser_context,
  49. const GURL& url) {
  50. std::vector<WebUIControllerFactory*>* factories =
  51. g_web_ui_controller_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. bool WebUIControllerFactoryRegistry::UseWebUIForURL(
  60. BrowserContext* browser_context,
  61. const GURL& url) {
  62. std::vector<WebUIControllerFactory*>* factories =
  63. g_web_ui_controller_factories.Pointer();
  64. for (size_t i = 0; i < factories->size(); ++i) {
  65. if ((*factories)[i]->UseWebUIForURL(browser_context, url))
  66. return true;
  67. }
  68. return false;
  69. }
  70. bool WebUIControllerFactoryRegistry::UseWebUIBindingsForURL(
  71. BrowserContext* browser_context,
  72. const GURL& url) {
  73. std::vector<WebUIControllerFactory*>* factories =
  74. g_web_ui_controller_factories.Pointer();
  75. for (size_t i = 0; i < factories->size(); ++i) {
  76. if ((*factories)[i]->UseWebUIBindingsForURL(browser_context, url))
  77. return true;
  78. }
  79. return false;
  80. }
  81. bool WebUIControllerFactoryRegistry::IsURLAcceptableForWebUI(
  82. BrowserContext* browser_context,
  83. const GURL& url) {
  84. return UseWebUIForURL(browser_context, url) ||
  85. // It's possible to load about:blank in a Web UI renderer.
  86. // See http://crbug.com/42547
  87. url.spec() == url::kAboutBlankURL ||
  88. // javascript: and debug URLs like chrome://kill are allowed.
  89. IsRendererDebugURL(url);
  90. }
  91. WebUIControllerFactoryRegistry::WebUIControllerFactoryRegistry() = default;
  92. WebUIControllerFactoryRegistry::~WebUIControllerFactoryRegistry() = default;
  93. } // namespace content