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

Side by Side Diff: chrome/common/extensions/manifest_url_handler.cc

Issue 11660016: Move the parsing of "chrome_url_overrides" out of Extension. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: patch-rebased Created 7 years, 11 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
« no previous file with comments | « chrome/common/extensions/manifest_url_handler.h ('k') | 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/common/extensions/manifest_url_handler.h" 5 #include "chrome/common/extensions/manifest_url_handler.h"
6 6
7 #include "base/lazy_instance.h"
7 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/string_util.h"
10 #include "base/stringprintf.h"
8 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
9 #include "base/values.h" 12 #include "base/values.h"
13 #include "chrome/common/chrome_constants.h"
10 #include "chrome/common/extensions/extension_manifest_constants.h" 14 #include "chrome/common/extensions/extension_manifest_constants.h"
15 #include "chrome/common/url_constants.h"
11 #include "extensions/common/error_utils.h" 16 #include "extensions/common/error_utils.h"
12 17
13 namespace keys = extension_manifest_keys; 18 namespace keys = extension_manifest_keys;
14 namespace errors = extension_manifest_errors; 19 namespace errors = extension_manifest_errors;
15 20
16 namespace extensions { 21 namespace extensions {
17 22
18 namespace { 23 namespace {
19 24
25 const char kOverrideExtentUrlPatternFormat[] = "chrome://%s/*";
26
20 const GURL& GetManifestURL(const Extension* extension, 27 const GURL& GetManifestURL(const Extension* extension,
21 const std::string& key) { 28 const std::string& key) {
22 ManifestURL* manifest_url = 29 ManifestURL* manifest_url =
23 static_cast<ManifestURL*>(extension->GetManifestData(key)); 30 static_cast<ManifestURL*>(extension->GetManifestData(key));
24 return manifest_url ? manifest_url->url_ : GURL::EmptyGURL(); 31 return manifest_url ? manifest_url->url_ : GURL::EmptyGURL();
25 } 32 }
26 33
27 } // namespace 34 } // namespace
28 35
29 // static 36 // static
30 const GURL& ManifestURL::GetDevToolsPage(const Extension* extension) { 37 const GURL& ManifestURL::GetDevToolsPage(const Extension* extension) {
31 return GetManifestURL(extension, keys::kDevToolsPage); 38 return GetManifestURL(extension, keys::kDevToolsPage);
32 } 39 }
33 40
34 // static 41 // static
35 const GURL ManifestURL::GetHomepageURL(const Extension* extension) { 42 const GURL ManifestURL::GetHomepageURL(const Extension* extension) {
36 const GURL& homepage_url = GetManifestURL(extension, keys::kHomepageURL); 43 const GURL& homepage_url = GetManifestURL(extension, keys::kHomepageURL);
37 if (homepage_url.is_valid()) 44 if (homepage_url.is_valid())
38 return homepage_url; 45 return homepage_url;
39 return extension->UpdatesFromGallery() ? 46 return extension->UpdatesFromGallery() ?
40 GURL(extension_urls::GetWebstoreItemDetailURLPrefix() + extension->id()) : 47 GURL(extension_urls::GetWebstoreItemDetailURLPrefix() + extension->id()) :
41 GURL::EmptyGURL(); 48 GURL::EmptyGURL();
42 } 49 }
43 50
51 URLOverrides::URLOverrides() {
52 }
53
54 URLOverrides::~URLOverrides() {
55 }
56
57 static base::LazyInstance<URLOverrides::URLOverrideMap> g_empty_url_overrides =
58 LAZY_INSTANCE_INITIALIZER;
59
60 // static
61 const URLOverrides::URLOverrideMap&
62 URLOverrides::GetChromeURLOverrides(const Extension* extension) {
63 URLOverrides* url_overrides = static_cast<URLOverrides*>(
64 extension->GetManifestData(keys::kChromeURLOverrides));
65 return url_overrides ?
66 url_overrides->chrome_url_overrides_ :
67 g_empty_url_overrides.Get();
68 }
69
44 DevToolsPageHandler::DevToolsPageHandler() { 70 DevToolsPageHandler::DevToolsPageHandler() {
45 } 71 }
46 72
47 DevToolsPageHandler::~DevToolsPageHandler() { 73 DevToolsPageHandler::~DevToolsPageHandler() {
48 } 74 }
49 75
50 bool DevToolsPageHandler::Parse(const base::Value* value, 76 bool DevToolsPageHandler::Parse(const base::Value* value,
51 Extension* extension, 77 Extension* extension,
52 string16* error) { 78 string16* error) {
53 scoped_ptr<ManifestURL> manifest_url(new ManifestURL); 79 scoped_ptr<ManifestURL> manifest_url(new ManifestURL);
(...skipping 28 matching lines...) Expand all
82 (!manifest_url->url_.SchemeIs("http") && 108 (!manifest_url->url_.SchemeIs("http") &&
83 !manifest_url->url_.SchemeIs("https"))) { 109 !manifest_url->url_.SchemeIs("https"))) {
84 *error = ErrorUtils::FormatErrorMessageUTF16( 110 *error = ErrorUtils::FormatErrorMessageUTF16(
85 errors::kInvalidHomepageURL, homepage_url_str); 111 errors::kInvalidHomepageURL, homepage_url_str);
86 return false; 112 return false;
87 } 113 }
88 extension->SetManifestData(keys::kHomepageURL, manifest_url.release()); 114 extension->SetManifestData(keys::kHomepageURL, manifest_url.release());
89 return true; 115 return true;
90 } 116 }
91 117
118 URLOverridesHandler::URLOverridesHandler() {
119 }
120
121 URLOverridesHandler::~URLOverridesHandler() {
122 }
123
124 bool URLOverridesHandler::Parse(const base::Value* value,
125 Extension* extension,
126 string16* error) {
127 const DictionaryValue* overrides = NULL;
128 if (!value->GetAsDictionary(&overrides)) {
129 *error = ASCIIToUTF16(errors::kInvalidChromeURLOverrides);
130 return false;
131 }
132 scoped_ptr<URLOverrides> url_overrides(new URLOverrides);
133 // Validate that the overrides are all strings
134 for (DictionaryValue::key_iterator iter = overrides->begin_keys();
135 iter != overrides->end_keys(); ++iter) {
136 std::string page = *iter;
137 std::string val;
138 // Restrict override pages to a list of supported URLs.
139 bool is_override = (page != chrome::kChromeUINewTabHost &&
140 page != chrome::kChromeUIBookmarksHost &&
141 page != chrome::kChromeUIHistoryHost);
142 #if defined(OS_CHROMEOS)
143 is_override = (is_override &&
144 page != chrome::kChromeUIActivationMessageHost);
145 #endif
146 #if defined(FILE_MANAGER_EXTENSION)
147 is_override = (is_override &&
148 !(extension->location() == Extension::COMPONENT &&
149 page == chrome::kChromeUIFileManagerHost));
150 #endif
151
152 if (is_override || !overrides->GetStringWithoutPathExpansion(*iter, &val)) {
153 *error = ASCIIToUTF16(errors::kInvalidChromeURLOverrides);
154 return false;
155 }
156 // Replace the entry with a fully qualified chrome-extension:// URL.
157 url_overrides->chrome_url_overrides_[page] = extension->GetResourceURL(val);
158
159 // For component extensions, add override URL to extent patterns.
160 if (extension->is_legacy_packaged_app() &&
161 extension->location() == Extension::COMPONENT) {
162 URLPattern pattern(URLPattern::SCHEME_CHROMEUI);
163 std::string url = base::StringPrintf(kOverrideExtentUrlPatternFormat,
164 page.c_str());
165 if (pattern.Parse(url) != URLPattern::PARSE_SUCCESS) {
166 *error = ErrorUtils::FormatErrorMessageUTF16(
167 errors::kInvalidURLPatternError, url);
168 return false;
169 }
170 extension->AddWebExtentPattern(pattern);
171 }
172 }
173
174 // An extension may override at most one page.
175 if (overrides->size() > 1) {
176 *error = ASCIIToUTF16(errors::kMultipleOverrides);
177 return false;
178 }
179 extension->SetManifestData(keys::kChromeURLOverrides,
180 url_overrides.release());
181 return true;
182 }
183
92 } // namespace extensions 184 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/common/extensions/manifest_url_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698