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

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

Issue 12792005: Allow extensions on chrome:// URLs, when flag is set and permission is explicitly requested (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reinstate original pickle order; add scripts clause to content_script_chrome_url_invalid.json to av… Created 7 years, 9 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 | Annotate | Revision Log
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/user_script.h" 5 #include "chrome/common/extensions/user_script.h"
6 6
7 #include "base/command_line.h"
7 #include "base/pickle.h" 8 #include "base/pickle.h"
8 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "chrome/common/chrome_switches.h"
9 11
10 namespace { 12 namespace {
11 13
12 bool UrlMatchesGlobs(const std::vector<std::string>* globs, 14 bool UrlMatchesGlobs(const std::vector<std::string>* globs,
13 const GURL& url) { 15 const GURL& url) {
14 for (std::vector<std::string>::const_iterator glob = globs->begin(); 16 for (std::vector<std::string>::const_iterator glob = globs->begin();
15 glob != globs->end(); ++glob) { 17 glob != globs->end(); ++glob) {
16 if (MatchPattern(url.spec(), *glob)) 18 if (MatchPattern(url.spec(), *glob))
17 return true; 19 return true;
18 } 20 }
19 21
20 return false; 22 return false;
21 } 23 }
22 24
23 } // namespace 25 } // namespace
24 26
25 namespace extensions { 27 namespace extensions {
26 28
29 // The bitmask for valid user script injectable schemes used by URLPattern.
30 enum {
31 kValidUserScriptSchemes = URLPattern::SCHEME_CHROMEUI |
32 URLPattern::SCHEME_HTTP |
33 URLPattern::SCHEME_HTTPS |
34 URLPattern::SCHEME_FILE |
35 URLPattern::SCHEME_FTP
36 };
37
27 // static 38 // static
28 const char UserScript::kFileExtension[] = ".user.js"; 39 const char UserScript::kFileExtension[] = ".user.js";
29 40
30 bool UserScript::IsURLUserScript(const GURL& url, 41 bool UserScript::IsURLUserScript(const GURL& url,
31 const std::string& mime_type) { 42 const std::string& mime_type) {
32 return EndsWith(url.ExtractFileName(), kFileExtension, false) && 43 return EndsWith(url.ExtractFileName(), kFileExtension, false) &&
33 mime_type != "text/html"; 44 mime_type != "text/html";
34 } 45 }
35 46
47 // static
48 int UserScript::ValidUserScriptSchemes(bool canExecuteScriptEverywhere) {
49 if (canExecuteScriptEverywhere)
50 return URLPattern::SCHEME_ALL;
51 int valid_schemes = kValidUserScriptSchemes;
52 if (!CommandLine::ForCurrentProcess()->HasSwitch(
53 switches::kExtensionsOnChromeURLs)) {
54 valid_schemes &= ~URLPattern::SCHEME_CHROMEUI;
55 }
56 return valid_schemes;
57 }
58
36 UserScript::File::File(const base::FilePath& extension_root, 59 UserScript::File::File(const base::FilePath& extension_root,
37 const base::FilePath& relative_path, 60 const base::FilePath& relative_path,
38 const GURL& url) 61 const GURL& url)
39 : extension_root_(extension_root), 62 : extension_root_(extension_root),
40 relative_path_(relative_path), 63 relative_path_(relative_path),
41 url_(url) { 64 url_(url) {
42 } 65 }
43 66
44 UserScript::File::File() {} 67 UserScript::File::File() {}
45 68
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 void UserScript::UnpickleURLPatternSet(const ::Pickle& pickle, 200 void UserScript::UnpickleURLPatternSet(const ::Pickle& pickle,
178 PickleIterator* iter, 201 PickleIterator* iter,
179 URLPatternSet* pattern_list) { 202 URLPatternSet* pattern_list) {
180 uint64 num_patterns = 0; 203 uint64 num_patterns = 0;
181 CHECK(pickle.ReadUInt64(iter, &num_patterns)); 204 CHECK(pickle.ReadUInt64(iter, &num_patterns));
182 205
183 pattern_list->ClearPatterns(); 206 pattern_list->ClearPatterns();
184 for (uint64 i = 0; i < num_patterns; ++i) { 207 for (uint64 i = 0; i < num_patterns; ++i) {
185 int valid_schemes; 208 int valid_schemes;
186 CHECK(pickle.ReadInt(iter, &valid_schemes)); 209 CHECK(pickle.ReadInt(iter, &valid_schemes));
210
187 std::string pattern_str; 211 std::string pattern_str;
188 URLPattern pattern(valid_schemes);
189 CHECK(pickle.ReadString(iter, &pattern_str)); 212 CHECK(pickle.ReadString(iter, &pattern_str));
190 213
191 // We remove the file scheme if it's not actually allowed (see Extension:: 214 URLPattern pattern(kValidUserScriptSchemes);
192 // LoadUserScriptHelper), but we need it temporarily while loading the 215 URLPattern::ParseResult result = pattern.Parse(pattern_str);
193 // pattern so that it's valid. 216 CHECK(URLPattern::PARSE_SUCCESS == result) <<
194 bool had_file_scheme = (valid_schemes & URLPattern::SCHEME_FILE) != 0; 217 URLPattern::GetParseResultString(result) << " " << pattern_str.c_str();
195 if (!had_file_scheme)
196 pattern.SetValidSchemes(valid_schemes | URLPattern::SCHEME_FILE);
197 CHECK(URLPattern::PARSE_SUCCESS == pattern.Parse(pattern_str));
198 if (!had_file_scheme)
199 pattern.SetValidSchemes(valid_schemes);
200 218
219 pattern.SetValidSchemes(valid_schemes);
201 pattern_list->AddPattern(pattern); 220 pattern_list->AddPattern(pattern);
202 } 221 }
203 } 222 }
204 223
205 void UserScript::UnpickleScripts(const ::Pickle& pickle, PickleIterator* iter, 224 void UserScript::UnpickleScripts(const ::Pickle& pickle, PickleIterator* iter,
206 FileList* scripts) { 225 FileList* scripts) {
207 uint64 num_files = 0; 226 uint64 num_files = 0;
208 CHECK(pickle.ReadUInt64(iter, &num_files)); 227 CHECK(pickle.ReadUInt64(iter, &num_files));
209 scripts->clear(); 228 scripts->clear();
210 for (uint64 i = 0; i < num_files; ++i) { 229 for (uint64 i = 0; i < num_files; ++i) {
211 File file; 230 File file;
212 file.Unpickle(pickle, iter); 231 file.Unpickle(pickle, iter);
213 scripts->push_back(file); 232 scripts->push_back(file);
214 } 233 }
215 } 234 }
216 235
217 } // namespace extensions 236 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698