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

Side by Side Diff: chrome/browser/dom_ui/dom_ui_factory.cc

Issue 172120: Revert "Revert "Allow DOMUI pages to call window.open(), giving DOMUI privileges to the new"" (Closed)
Patch Set: Created 11 years, 3 months 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
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/dom_ui/dom_ui_factory.h" 5 #include "chrome/browser/dom_ui/dom_ui_factory.h"
6 6
7 #include "chrome/browser/dom_ui/downloads_ui.h" 7 #include "chrome/browser/dom_ui/downloads_ui.h"
8 #include "chrome/browser/dom_ui/devtools_ui.h" 8 #include "chrome/browser/dom_ui/devtools_ui.h"
9 #include "chrome/browser/dom_ui/history_ui.h" 9 #include "chrome/browser/dom_ui/history_ui.h"
10 #include "chrome/browser/dom_ui/html_dialog_ui.h" 10 #include "chrome/browser/dom_ui/html_dialog_ui.h"
11 #include "chrome/browser/dom_ui/new_tab_ui.h" 11 #include "chrome/browser/dom_ui/new_tab_ui.h"
12 #include "chrome/browser/dom_ui/print_ui.h" 12 #include "chrome/browser/dom_ui/print_ui.h"
13 #include "chrome/browser/extensions/extension_dom_ui.h" 13 #include "chrome/browser/extensions/extension_dom_ui.h"
14 #include "chrome/browser/extensions/extensions_service.h" 14 #include "chrome/browser/extensions/extensions_service.h"
15 #include "chrome/browser/extensions/extensions_ui.h" 15 #include "chrome/browser/extensions/extensions_ui.h"
16 #include "chrome/browser/profile.h" 16 #include "chrome/browser/profile.h"
17 #include "chrome/browser/tab_contents/tab_contents.h" 17 #include "chrome/browser/tab_contents/tab_contents.h"
18 #include "chrome/common/url_constants.h" 18 #include "chrome/common/url_constants.h"
19 #include "googleurl/src/gurl.h" 19 #include "googleurl/src/gurl.h"
20 20
21 // Backend for both querying for and creating new DOMUI objects. If you're just 21 const DOMUITypeID DOMUIFactory::kNoDOMUI = NULL;
22 // querying whether there's a DOM UI for the given URL, pass NULL for both the 22
23 // web contents and the new_ui. The return value will indiacate whether a DOM UI 23 // A function for creating a new DOMUI. The caller owns the return value, which
24 // exists for the given URL. 24 // may be NULL (for example, if the URL refers to an non-existent extension).
25 // 25 typedef DOMUI* (*DOMUIFactoryFunction)(TabContents* tab_contents,
26 // If you want to create a DOM UI, pass non-NULL pointers for both tab_contents 26 const GURL& url);
27 // and new_ui. The *new_ui pointer will be filled with the created UI if it 27
28 // succeeds (indicated by a return value of true). The caller owns the *new_ui 28 // Template for defining DOMUIFactoryFunction.
29 // pointer. 29 template<class T>
30 static bool CreateDOMUI(const GURL& url, TabContents* tab_contents, 30 DOMUI* NewDOMUI(TabContents* contents, const GURL& url) {
31 DOMUI** new_ui) { 31 return new T(contents);
32 }
33
34 // Special case for extensions.
35 template<>
36 DOMUI* NewDOMUI<ExtensionDOMUI>(TabContents* contents, const GURL& url) {
37 // Don't use a DOMUI for non-existent extensions.
38 ExtensionsService* service = contents->profile()->GetExtensionsService();
39 bool valid_extension = (service && service->GetExtensionById(url.host()));
40 if (valid_extension)
41 return new ExtensionDOMUI(contents);
42 return NULL;
43 }
44
45 // Returns a function that can be used to create the right type of DOMUI for a
46 // tab, based on its URL. Returns NULL if the URL doesn't have DOMUI associated
47 // with it. Even if the factory function is valid, it may yield a NULL DOMUI
48 // when invoked for a particular tab - see NewDOMUI<ExtensionDOMUI>.
49 static DOMUIFactoryFunction GetDOMUIFactoryFunction(const GURL& url) {
32 // Currently, any gears: URL means an HTML dialog. 50 // Currently, any gears: URL means an HTML dialog.
33 if (url.SchemeIs(chrome::kGearsScheme)) { 51 if (url.SchemeIs(chrome::kGearsScheme))
34 if (new_ui) 52 return &NewDOMUI<HtmlDialogUI>;
35 *new_ui = new HtmlDialogUI(tab_contents);
36 return true;
37 }
38 53
39 if (url.SchemeIs(chrome::kExtensionScheme)) { 54 if (url.SchemeIs(chrome::kExtensionScheme))
40 // We assume we have a valid extension unless we have a TabContents which 55 return &NewDOMUI<ExtensionDOMUI>;
41 // can prove us wrong. This can can happen if the user types in a URL
42 // manually.
43 bool valid_extension = true;
44 if (tab_contents) {
45 // TabContents can be NULL if we're doing a quick UseDOMUIForURL check.
46 ExtensionsService* service =
47 tab_contents->profile()->GetExtensionsService();
48 valid_extension = (service && service->GetExtensionById(url.host()));
49 }
50 if (valid_extension) {
51 if (new_ui)
52 *new_ui = new ExtensionDOMUI(tab_contents);
53 return true;
54 }
55 return false;
56 }
57 56
58 // TODO(mhm) Make sure this ifdef is removed once print is complete. 57 // TODO(mhm) Make sure this ifdef is removed once print is complete.
59 #if !defined(GOOGLE_CHROME_BUILD) 58 #if !defined(GOOGLE_CHROME_BUILD)
60 if (url.SchemeIs(chrome::kPrintScheme)) { 59 if (url.SchemeIs(chrome::kPrintScheme))
61 if (new_ui) 60 return &NewDOMUI<PrintUI>;
62 *new_ui = new PrintUI(tab_contents);
63 return true;
64 }
65 #endif 61 #endif
66 62
67 // This will get called a lot to check all URLs, so do a quick check of other 63 // This will get called a lot to check all URLs, so do a quick check of other
68 // schemes (gears was handled above) to filter out most URLs. 64 // schemes (gears was handled above) to filter out most URLs.
69 if (!url.SchemeIs(chrome::kChromeInternalScheme) && 65 if (!url.SchemeIs(chrome::kChromeInternalScheme) &&
70 !url.SchemeIs(chrome::kChromeUIScheme)) 66 !url.SchemeIs(chrome::kChromeUIScheme))
71 return false; 67 return NULL;
72 68
73 if (url.host() == chrome::kSyncResourcesHost) { 69 if (url.host() == chrome::kSyncResourcesHost)
74 if (new_ui) 70 return &NewDOMUI<HtmlDialogUI>;
75 *new_ui = new HtmlDialogUI(tab_contents);
76 return true;
77 }
78 71
79 // Special case the new tab page. In older versions of Chrome, the new tab 72 // Special case the new tab page. In older versions of Chrome, the new tab
80 // page was hosted at chrome-internal:<blah>. This might be in people's saved 73 // page was hosted at chrome-internal:<blah>. This might be in people's saved
81 // sessions or bookmarks, so we say any URL with that scheme triggers the new 74 // sessions or bookmarks, so we say any URL with that scheme triggers the new
82 // tab page. 75 // tab page.
83 if (url.host() == chrome::kChromeUINewTabHost || 76 if (url.host() == chrome::kChromeUINewTabHost ||
84 url.SchemeIs(chrome::kChromeInternalScheme)) { 77 url.SchemeIs(chrome::kChromeInternalScheme))
85 if (new_ui) 78 return &NewDOMUI<NewTabUI>;
86 *new_ui = new NewTabUI(tab_contents);
87 return true;
88 }
89 79
90 // We must compare hosts only since some of the DOM UIs append extra stuff 80 // We must compare hosts only since some of the DOM UIs append extra stuff
91 // after the host name. 81 // after the host name.
92 if (url.host() == chrome::kChromeUIHistoryHost) { 82 if (url.host() == chrome::kChromeUIHistoryHost)
93 if (new_ui) 83 return &NewDOMUI<HistoryUI>;
94 *new_ui = new HistoryUI(tab_contents); 84 if (url.host() == chrome::kChromeUIDownloadsHost)
95 return true; 85 return &NewDOMUI<DownloadsUI>;
96 } 86 if (url.host() == chrome::kChromeUIExtensionsHost)
87 return &NewDOMUI<ExtensionsUI>;
88 if (url.host() == chrome::kChromeUIDevToolsHost)
89 return &NewDOMUI<DevToolsUI>;
97 90
98 if (url.host() == chrome::kChromeUIDownloadsHost) { 91 return NULL;
99 if (new_ui)
100 *new_ui = new DownloadsUI(tab_contents);
101 return true;
102 }
103
104 if (url.host() == chrome::kChromeUIExtensionsHost) {
105 if (new_ui)
106 *new_ui = new ExtensionsUI(tab_contents);
107 return true;
108 }
109
110 if (url.host() == chrome::kChromeUIDevToolsHost) {
111 if (new_ui)
112 *new_ui = new DevToolsUI(tab_contents);
113 return true;
114 }
115
116 return false;
117 } 92 }
118 93
119 // static 94 // static
95 DOMUITypeID DOMUIFactory::GetDOMUIType(const GURL& url) {
96 DOMUIFactoryFunction function = GetDOMUIFactoryFunction(url);
97 return function ? reinterpret_cast<DOMUITypeID>(function) : kNoDOMUI;
98 }
99
100 // static
120 bool DOMUIFactory::HasDOMUIScheme(const GURL& url) { 101 bool DOMUIFactory::HasDOMUIScheme(const GURL& url) {
121 return url.SchemeIs(chrome::kChromeInternalScheme) || 102 return url.SchemeIs(chrome::kChromeInternalScheme) ||
122 url.SchemeIs(chrome::kChromeUIScheme) || 103 url.SchemeIs(chrome::kChromeUIScheme) ||
123 url.SchemeIs(chrome::kExtensionScheme) || 104 url.SchemeIs(chrome::kExtensionScheme) ||
124 url.SchemeIs(chrome::kPrintScheme); 105 url.SchemeIs(chrome::kPrintScheme);
125 } 106 }
126 107
127 // static 108 // static
128 bool DOMUIFactory::UseDOMUIForURL(const GURL& url) { 109 bool DOMUIFactory::UseDOMUIForURL(const GURL& url) {
129 return CreateDOMUI(url, NULL, NULL); 110 return GetDOMUIFactoryFunction(url) != NULL;
130 } 111 }
131 112
132 // static 113 // static
133 DOMUI* DOMUIFactory::CreateDOMUIForURL(TabContents* tab_contents, 114 DOMUI* DOMUIFactory::CreateDOMUIForURL(TabContents* tab_contents,
134 const GURL& url) { 115 const GURL& url) {
135 DOMUI* dom_ui; 116 DOMUIFactoryFunction function = GetDOMUIFactoryFunction(url);
136 if (!CreateDOMUI(url, tab_contents, &dom_ui)) 117 if (!function)
137 return NULL; 118 return NULL;
138 return dom_ui; 119 return (*function)(tab_contents, url);
139 } 120 }
140 121
141 // static 122 // static
142 bool DOMUIFactory::GetFaviconResourceBytes(const GURL& page_url, 123 bool DOMUIFactory::GetFaviconResourceBytes(const GURL& page_url,
143 std::vector<unsigned char>* bytes) { 124 std::vector<unsigned char>* bytes) {
144 if (!HasDOMUIScheme(page_url)) 125 if (!HasDOMUIScheme(page_url))
145 return false; 126 return false;
146 127
147 if (page_url.host() == chrome::kChromeUIHistoryHost) 128 if (page_url.host() == chrome::kChromeUIHistoryHost)
148 return HistoryUI::GetFaviconResourceBytes(bytes); 129 return HistoryUI::GetFaviconResourceBytes(bytes);
149 130
150 if (page_url.host() == chrome::kChromeUIDownloadsHost) 131 if (page_url.host() == chrome::kChromeUIDownloadsHost)
151 return DownloadsUI::GetFaviconResourceBytes(bytes); 132 return DownloadsUI::GetFaviconResourceBytes(bytes);
152 133
153 return false; 134 return false;
154 } 135 }
OLDNEW
« no previous file with comments | « chrome/browser/dom_ui/dom_ui_factory.h ('k') | chrome/browser/extensions/extension_browsertests_misc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698