Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: chrome/browser/ui/webui/chrome_web_ui_factory.cc

Issue 8823015: Fix a crash regression in Chrome OS when using Bookmark All Tabs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/chrome_web_ui_factory.h" 5 #include "chrome/browser/ui/webui/chrome_web_ui_factory.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "chrome/browser/about_flags.h" 8 #include "chrome/browser/about_flags.h"
9 #include "chrome/browser/extensions/extension_service.h" 9 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/extensions/extension_web_ui.h" 10 #include "chrome/browser/extensions/extension_web_ui.h"
11 #include "chrome/browser/history/history_types.h" 11 #include "chrome/browser/history/history_types.h"
12 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/profiles/profile_manager.h" 13 #include "chrome/browser/profiles/profile_manager.h"
14 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
14 #include "chrome/browser/ui/webui/about_ui.h" 15 #include "chrome/browser/ui/webui/about_ui.h"
15 #include "chrome/browser/ui/webui/bookmarks_ui.h" 16 #include "chrome/browser/ui/webui/bookmarks_ui.h"
16 #include "chrome/browser/ui/webui/bug_report_ui.h" 17 #include "chrome/browser/ui/webui/bug_report_ui.h"
17 #include "chrome/browser/ui/webui/constrained_html_ui.h" 18 #include "chrome/browser/ui/webui/constrained_html_ui.h"
18 #include "chrome/browser/ui/webui/crashes_ui.h" 19 #include "chrome/browser/ui/webui/crashes_ui.h"
19 #include "chrome/browser/ui/webui/devtools_ui.h" 20 #include "chrome/browser/ui/webui/devtools_ui.h"
20 #include "chrome/browser/ui/webui/downloads_ui.h" 21 #include "chrome/browser/ui/webui/downloads_ui.h"
21 #include "chrome/browser/ui/webui/edit_search_engine_dialog_ui_webui.h" 22 #include "chrome/browser/ui/webui/edit_search_engine_dialog_ui_webui.h"
22 #include "chrome/browser/ui/webui/task_manager_ui.h" 23 #include "chrome/browser/ui/webui/task_manager_ui.h"
23 #include "chrome/browser/ui/webui/flags_ui.h" 24 #include "chrome/browser/ui/webui/flags_ui.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 89
89 // Template for defining WebUIFactoryFunction. 90 // Template for defining WebUIFactoryFunction.
90 template<class T> 91 template<class T>
91 ChromeWebUI* NewWebUI(TabContents* contents, const GURL& url) { 92 ChromeWebUI* NewWebUI(TabContents* contents, const GURL& url) {
92 return new T(contents); 93 return new T(contents);
93 } 94 }
94 95
95 // Special case for extensions. 96 // Special case for extensions.
96 template<> 97 template<>
97 ChromeWebUI* NewWebUI<ExtensionWebUI>(TabContents* contents, const GURL& url) { 98 ChromeWebUI* NewWebUI<ExtensionWebUI>(TabContents* contents, const GURL& url) {
98 // Don't use a WebUI for incognito tabs because we require extensions to run 99 return new ExtensionWebUI(contents, url);
99 // within a single process.
100 Profile* profile = Profile::FromBrowserContext(contents->browser_context());
101 ExtensionService* service = profile->GetExtensionService();
102 if (service && service->ExtensionBindingsAllowed(url))
103 return new ExtensionWebUI(contents, url);
104 return NULL;
105 } 100 }
106 101
107 // Special case for older about: handlers. 102 // Special case for older about: handlers.
108 template<> 103 template<>
109 ChromeWebUI* NewWebUI<AboutUI>(TabContents* contents, const GURL& url) { 104 ChromeWebUI* NewWebUI<AboutUI>(TabContents* contents, const GURL& url) {
110 return new AboutUI(contents, url.host()); 105 return new AboutUI(contents, url.host());
111 } 106 }
112 107
113 // Returns a function that can be used to create the right type of WebUI for a 108 // Returns a function that can be used to create the right type of WebUI for a
114 // tab, based on its URL. Returns NULL if the URL doesn't have WebUI associated 109 // tab, based on its URL. Returns NULL if the URL doesn't have WebUI associated
115 // with it. Even if the factory function is valid, it may yield a NULL WebUI 110 // with it.
116 // when invoked for a particular tab - see NewWebUI<ExtensionWebUI>. 111 WebUIFactoryFunction GetWebUIFactoryFunction(TabContents* tab_contents,
117 WebUIFactoryFunction GetWebUIFactoryFunction(Profile* profile, 112 Profile* profile,
118 const GURL& url) { 113 const GURL& url) {
119 if (url.host() == chrome::kChromeUIDialogHost) 114 if (url.host() == chrome::kChromeUIDialogHost)
120 return &NewWebUI<ConstrainedHtmlUI>; 115 return &NewWebUI<ConstrainedHtmlUI>;
121 116
117 // Only create ExtensionWebUI for URLs that are allowed extension bindings,
118 // hosted by actual tabs. If tab_contents has no wrapper, it likely refers
119 // to another container type, like an extension background page.
122 ExtensionService* service = profile ? profile->GetExtensionService() : NULL; 120 ExtensionService* service = profile ? profile->GetExtensionService() : NULL;
123 if (service && service->ExtensionBindingsAllowed(url)) 121 if (service && service->ExtensionBindingsAllowed(url) &&
124 return &NewWebUI<ExtensionWebUI>; 122 (!tab_contents ||
123 TabContentsWrapper::GetCurrentWrapperForContents(tab_contents)))
124 return &NewWebUI<ExtensionWebUI>;
125 125
126 // All platform builds of Chrome will need to have a cloud printing 126 // All platform builds of Chrome will need to have a cloud printing
127 // dialog as backup. It's just that on Chrome OS, it's the only 127 // dialog as backup. It's just that on Chrome OS, it's the only
128 // print dialog. 128 // print dialog.
129 if (url.host() == chrome::kChromeUICloudPrintResourcesHost) 129 if (url.host() == chrome::kChromeUICloudPrintResourcesHost)
130 return &NewWebUI<ExternalHtmlDialogUI>; 130 return &NewWebUI<ExternalHtmlDialogUI>;
131 131
132 // This will get called a lot to check all URLs, so do a quick check of other 132 // This will get called a lot to check all URLs, so do a quick check of other
133 // schemes to filter out most URLs. 133 // schemes to filter out most URLs.
134 if (!url.SchemeIs(chrome::kChromeDevToolsScheme) && 134 if (!url.SchemeIs(chrome::kChromeDevToolsScheme) &&
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 else 315 else
316 return DefaultSingletonTraits<Type>::New(); 316 return DefaultSingletonTraits<Type>::New();
317 } 317 }
318 }; 318 };
319 319
320 } // namespace 320 } // namespace
321 321
322 WebUI::TypeID ChromeWebUIFactory::GetWebUIType( 322 WebUI::TypeID ChromeWebUIFactory::GetWebUIType(
323 content::BrowserContext* browser_context, const GURL& url) const { 323 content::BrowserContext* browser_context, const GURL& url) const {
324 Profile* profile = Profile::FromBrowserContext(browser_context); 324 Profile* profile = Profile::FromBrowserContext(browser_context);
325 WebUIFactoryFunction function = GetWebUIFactoryFunction(profile, url); 325 WebUIFactoryFunction function = GetWebUIFactoryFunction(NULL, profile, url);
326 return function ? reinterpret_cast<WebUI::TypeID>(function) : WebUI::kNoWebUI; 326 return function ? reinterpret_cast<WebUI::TypeID>(function) : WebUI::kNoWebUI;
327 } 327 }
328 328
329 bool ChromeWebUIFactory::UseWebUIForURL( 329 bool ChromeWebUIFactory::UseWebUIForURL(
330 content::BrowserContext* browser_context, const GURL& url) const { 330 content::BrowserContext* browser_context, const GURL& url) const {
331 return GetWebUIType(browser_context, url) != WebUI::kNoWebUI; 331 return GetWebUIType(browser_context, url) != WebUI::kNoWebUI;
332 } 332 }
333 333
334 bool ChromeWebUIFactory::HasWebUIScheme(const GURL& url) const { 334 bool ChromeWebUIFactory::HasWebUIScheme(const GURL& url) const {
335 return url.SchemeIs(chrome::kChromeDevToolsScheme) || 335 return url.SchemeIs(chrome::kChromeDevToolsScheme) ||
(...skipping 15 matching lines...) Expand all
351 url == GURL(chrome::kChromeUIKillURL) || 351 url == GURL(chrome::kChromeUIKillURL) ||
352 url == GURL(chrome::kChromeUIHangURL) || 352 url == GURL(chrome::kChromeUIHangURL) ||
353 url == GURL(chrome::kChromeUIShorthangURL); 353 url == GURL(chrome::kChromeUIShorthangURL);
354 } 354 }
355 355
356 WebUI* ChromeWebUIFactory::CreateWebUIForURL( 356 WebUI* ChromeWebUIFactory::CreateWebUIForURL(
357 TabContents* tab_contents, 357 TabContents* tab_contents,
358 const GURL& url) const { 358 const GURL& url) const {
359 Profile* profile = 359 Profile* profile =
360 Profile::FromBrowserContext(tab_contents->browser_context()); 360 Profile::FromBrowserContext(tab_contents->browser_context());
361 WebUIFactoryFunction function = GetWebUIFactoryFunction(profile, url); 361 WebUIFactoryFunction function = GetWebUIFactoryFunction(tab_contents,
362 profile, url);
362 if (!function) 363 if (!function)
363 return NULL; 364 return NULL;
364 return (*function)(tab_contents, url); 365 return (*function)(tab_contents, url);
365 } 366 }
366 367
367 void ChromeWebUIFactory::GetFaviconForURL( 368 void ChromeWebUIFactory::GetFaviconForURL(
368 Profile* profile, 369 Profile* profile,
369 FaviconService::GetFaviconRequest* request, 370 FaviconService::GetFaviconRequest* request,
370 const GURL& page_url) const { 371 const GURL& page_url) const {
371 // All extensions but the bookmark manager get their favicon from the icons 372 // All extensions but the bookmark manager get their favicon from the icons
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 return FlashUI::GetFaviconResourceBytes(); 437 return FlashUI::GetFaviconResourceBytes();
437 438
438 if (page_url.host() == chrome::kChromeUISettingsHost) 439 if (page_url.host() == chrome::kChromeUISettingsHost)
439 return OptionsUI::GetFaviconResourceBytes(); 440 return OptionsUI::GetFaviconResourceBytes();
440 441
441 if (page_url.host() == chrome::kChromeUIPluginsHost) 442 if (page_url.host() == chrome::kChromeUIPluginsHost)
442 return PluginsUI::GetFaviconResourceBytes(); 443 return PluginsUI::GetFaviconResourceBytes();
443 444
444 return NULL; 445 return NULL;
445 } 446 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698