[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/common/url_schemes.h" |
| 6 | |
| 7 | #include <string.h> |
| 8 | |
| 9 | #include <algorithm> |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 10 | |
[email protected] | 30fe1f9 | 2013-06-12 16:34:34 | [diff] [blame] | 11 | #include "base/strings/string_util.h" |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 12 | #include "content/public/common/content_client.h" |
| 13 | #include "content/public/common/url_constants.h" |
[email protected] | 707e1c4 | 2013-07-09 21:18:58 | [diff] [blame] | 14 | #include "url/url_util.h" |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 15 | |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 16 | namespace content { |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 17 | namespace { |
| 18 | |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 19 | // These lists are lazily initialized below and are leaked on shutdown to |
| 20 | // prevent any destructors from being called that will slow us down or cause |
| 21 | // problems. |
| 22 | std::vector<std::string>* savable_schemes = nullptr; |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 23 | // Note we store GURLs here instead of strings to deal with canonicalization. |
| 24 | std::vector<GURL>* secure_origins = nullptr; |
| 25 | std::vector<std::string>* service_worker_schemes = nullptr; |
| 26 | |
| 27 | const char* const kDefaultSavableSchemes[] = { |
| 28 | url::kHttpScheme, |
| 29 | url::kHttpsScheme, |
| 30 | url::kFileScheme, |
| 31 | url::kFileSystemScheme, |
| 32 | url::kFtpScheme, |
| 33 | kChromeDevToolsScheme, |
| 34 | kChromeUIScheme, |
| 35 | url::kDataScheme |
| 36 | }; |
| 37 | |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 38 | } // namespace |
| 39 | |
lizeb | 5120f6dc | 2016-02-19 09:29:44 | [diff] [blame] | 40 | void RegisterContentSchemes(bool lock_schemes) { |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 41 | ContentClient::Schemes schemes; |
| 42 | GetContentClient()->AddAdditionalSchemes(&schemes); |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 43 | |
tyoshino | 11a7c9fe | 2015-08-19 08:51:46 | [diff] [blame] | 44 | url::AddStandardScheme(kChromeDevToolsScheme, url::SCHEME_WITHOUT_PORT); |
| 45 | url::AddStandardScheme(kChromeUIScheme, url::SCHEME_WITHOUT_PORT); |
| 46 | url::AddStandardScheme(kGuestScheme, url::SCHEME_WITHOUT_PORT); |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 47 | |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 48 | for (auto& scheme : schemes.standard_schemes) |
| 49 | url::AddStandardScheme(scheme.c_str(), url::SCHEME_WITHOUT_PORT); |
lizeb | 5120f6dc | 2016-02-19 09:29:44 | [diff] [blame] | 50 | |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 51 | for (auto& scheme : schemes.referrer_schemes) |
| 52 | url::AddReferrerScheme(scheme.c_str(), url::SCHEME_WITHOUT_PORT); |
lizeb | 5120f6dc | 2016-02-19 09:29:44 | [diff] [blame] | 53 | |
jam | 0901535 | 2017-01-19 01:49:02 | [diff] [blame] | 54 | schemes.secure_schemes.push_back(kChromeUIScheme); |
Alex Moshchuk | 71f48559 | 2017-08-16 16:20:00 | [diff] [blame] | 55 | schemes.secure_schemes.push_back(kChromeErrorScheme); |
jam | 0901535 | 2017-01-19 01:49:02 | [diff] [blame] | 56 | for (auto& scheme : schemes.secure_schemes) |
| 57 | url::AddSecureScheme(scheme.c_str()); |
| 58 | |
| 59 | for (auto& scheme : schemes.local_schemes) |
| 60 | url::AddLocalScheme(scheme.c_str()); |
| 61 | |
Alex Moshchuk | 71f48559 | 2017-08-16 16:20:00 | [diff] [blame] | 62 | schemes.no_access_schemes.push_back(kChromeErrorScheme); |
jam | 0901535 | 2017-01-19 01:49:02 | [diff] [blame] | 63 | for (auto& scheme : schemes.no_access_schemes) |
| 64 | url::AddNoAccessScheme(scheme.c_str()); |
| 65 | |
| 66 | schemes.cors_enabled_schemes.push_back(kChromeUIScheme); |
| 67 | for (auto& scheme : schemes.cors_enabled_schemes) |
| 68 | url::AddCORSEnabledScheme(scheme.c_str()); |
| 69 | |
Alex Moshchuk | 71f48559 | 2017-08-16 16:20:00 | [diff] [blame] | 70 | // TODO(mkwst): Investigate whether chrome-error should be included in |
| 71 | // csp_bypassing_schemes. |
arthursonzogni | eb73e43 | 2017-02-09 11:54:49 | [diff] [blame] | 72 | for (auto& scheme : schemes.csp_bypassing_schemes) |
| 73 | url::AddCSPBypassingScheme(scheme.c_str()); |
| 74 | |
jam | cc2df16 | 2017-03-23 23:54:01 | [diff] [blame] | 75 | for (auto& scheme : schemes.empty_document_schemes) |
| 76 | url::AddEmptyDocumentScheme(scheme.c_str()); |
| 77 | |
lizeb | 5120f6dc | 2016-02-19 09:29:44 | [diff] [blame] | 78 | // Prevent future modification of the scheme lists. This is to prevent |
| 79 | // accidental creation of data races in the program. Add*Scheme aren't |
| 80 | // threadsafe so must be called when GURL isn't used on any other thread. This |
| 81 | // is really easy to mess up, so we say that all calls to Add*Scheme in Chrome |
| 82 | // must be inside this function. |
| 83 | if (lock_schemes) |
| 84 | url::LockSchemeRegistries(); |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 85 | |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 86 | // Combine the default savable schemes with the additional ones given. |
jam | 0901535 | 2017-01-19 01:49:02 | [diff] [blame] | 87 | delete savable_schemes; |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 88 | savable_schemes = new std::vector<std::string>; |
vmpstr | 6d9996c8 | 2017-02-23 00:43:25 | [diff] [blame] | 89 | for (auto* default_scheme : kDefaultSavableSchemes) |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 90 | savable_schemes->push_back(default_scheme); |
| 91 | savable_schemes->insert(savable_schemes->end(), |
| 92 | schemes.savable_schemes.begin(), |
| 93 | schemes.savable_schemes.end()); |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 94 | |
jam | 0901535 | 2017-01-19 01:49:02 | [diff] [blame] | 95 | delete service_worker_schemes; |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 96 | service_worker_schemes = new std::vector<std::string>; |
| 97 | *service_worker_schemes = std::move(schemes.service_worker_schemes); |
| 98 | |
jam | 0901535 | 2017-01-19 01:49:02 | [diff] [blame] | 99 | delete secure_origins; |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 100 | secure_origins = new std::vector<GURL>; |
| 101 | *secure_origins = std::move(schemes.secure_origins); |
| 102 | } |
| 103 | |
| 104 | const std::vector<std::string>& GetSavableSchemes() { |
| 105 | return *savable_schemes; |
| 106 | } |
| 107 | |
jam | e0dcd98 | 2017-01-11 03:13:45 | [diff] [blame] | 108 | const std::vector<GURL>& GetSecureOrigins() { |
| 109 | return *secure_origins; |
| 110 | } |
| 111 | |
| 112 | const std::vector<std::string>& GetServiceWorkerSchemes() { |
| 113 | return *service_worker_schemes; |
| 114 | } |
| 115 | |
[email protected] | 1de7a17 | 2012-05-28 18:36:43 | [diff] [blame] | 116 | } // namespace content |