| OLD | NEW |
| (Empty) | |
| 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 "chrome/common/extensions/api/extension_urls/extension_urls_handler.h" |
| 6 |
| 7 #include "base/utf_string_conversions.h" |
| 8 #include "base/values.h" |
| 9 #include "chrome/common/extensions/extension_constants.h" |
| 10 #include "chrome/common/extensions/extension_manifest_constants.h" |
| 11 #include "extensions/common/error_utils.h" |
| 12 |
| 13 namespace extensions { |
| 14 |
| 15 namespace { |
| 16 |
| 17 namespace errors = extension_manifest_errors; |
| 18 namespace keys = extension_manifest_keys; |
| 19 |
| 20 const GURL& GetExtensionURL(const Extension* extension, |
| 21 const std::string& key) { |
| 22 ExtensionURL* extension_url = static_cast<ExtensionURL*>( |
| 23 extension->GetManifestData(key)); |
| 24 return extension_url ? extension_url->url : GURL::EmptyGURL(); |
| 25 } |
| 26 |
| 27 } // namespace |
| 28 |
| 29 ExtensionURL::ExtensionURL(const GURL& extension_url) : url(extension_url) { |
| 30 } |
| 31 |
| 32 ExtensionURL::~ExtensionURL() { |
| 33 } |
| 34 |
| 35 // static |
| 36 const GURL& ExtensionURL::GetDevToolsURL(const Extension* extension) { |
| 37 return GetExtensionURL(extension, keys::kDevToolsPage); |
| 38 } |
| 39 |
| 40 // static |
| 41 // Not const GURL& because if we have an invalid homepage_url, we try to |
| 42 // construct one, and we cannot return a reference to a temporary. |
| 43 GURL ExtensionURL::GetHomepageURL(const Extension* extension) { |
| 44 const GURL& homepage_url = GetExtensionURL(extension, keys::kHomepageURL); |
| 45 if (homepage_url.is_valid()) |
| 46 return homepage_url; |
| 47 return extension->UpdatesFromGallery() ? |
| 48 GURL(extension_urls::GetWebstoreItemDetailURLPrefix() + extension->id()) : |
| 49 GURL::EmptyGURL(); |
| 50 } |
| 51 |
| 52 // static |
| 53 const GURL& ExtensionURL::GetOptionsURL(const Extension* extension) { |
| 54 return GetExtensionURL(extension, keys::kOptionsPage); |
| 55 } |
| 56 |
| 57 // static |
| 58 const GURL& ExtensionURL::GetUpdateURL(const Extension* extension) { |
| 59 return GetExtensionURL(extension, keys::kUpdateURL); |
| 60 } |
| 61 |
| 62 DevToolsPageHandler::DevToolsPageHandler() { |
| 63 } |
| 64 |
| 65 DevToolsPageHandler::~DevToolsPageHandler() { |
| 66 } |
| 67 |
| 68 bool DevToolsPageHandler::Parse(const base::Value* value, |
| 69 Extension* extension, |
| 70 string16* error) { |
| 71 std::string devtools_str; |
| 72 if (!value->GetAsString(&devtools_str)) { |
| 73 *error = ASCIIToUTF16(errors::kInvalidDevToolsPage); |
| 74 return false; |
| 75 } |
| 76 |
| 77 extension->SetManifestData( |
| 78 keys::kDevToolsPage, |
| 79 new ExtensionURL(extension->GetResourceURL(devtools_str))); |
| 80 return true; |
| 81 } |
| 82 |
| 83 HomepageURLHandler::HomepageURLHandler() { |
| 84 } |
| 85 |
| 86 HomepageURLHandler::~HomepageURLHandler() { |
| 87 } |
| 88 |
| 89 bool HomepageURLHandler::Parse(const base::Value* value, |
| 90 Extension* extension, |
| 91 string16* error) { |
| 92 std::string homepage_str; |
| 93 if (!value->GetAsString(&homepage_str)) { |
| 94 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 95 errors::kInvalidHomepageURL, ""); |
| 96 return false; |
| 97 } |
| 98 GURL homepage_url(homepage_str); |
| 99 if (!homepage_url.is_valid() || |
| 100 (!homepage_url.SchemeIs("http") && !homepage_url.SchemeIs("https"))) { |
| 101 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 102 errors::kInvalidHomepageURL, homepage_str); |
| 103 return false; |
| 104 } |
| 105 |
| 106 extension->SetManifestData(keys::kHomepageURL, |
| 107 new ExtensionURL(homepage_url)); |
| 108 return true; |
| 109 } |
| 110 |
| 111 OptionsPageHandler::OptionsPageHandler() { |
| 112 } |
| 113 |
| 114 OptionsPageHandler::~OptionsPageHandler() { |
| 115 } |
| 116 |
| 117 bool OptionsPageHandler::Parse(const base::Value* value, |
| 118 Extension* extension, |
| 119 string16* error) { |
| 120 std::string options_str; |
| 121 if (!value->GetAsString(&options_str)) { |
| 122 *error = ASCIIToUTF16(errors::kInvalidOptionsPage); |
| 123 return false; |
| 124 } |
| 125 |
| 126 GURL options_url; |
| 127 if (extension->is_hosted_app()) { |
| 128 // hosted apps require an absolute URL. |
| 129 options_url = GURL(options_str); |
| 130 if (!options_url.is_valid() || |
| 131 !(options_url.SchemeIs("http") || options_url.SchemeIs("https"))) { |
| 132 *error = ASCIIToUTF16(errors::kInvalidOptionsPageInHostedApp); |
| 133 return false; |
| 134 } |
| 135 } else { |
| 136 options_url = GURL(options_str); |
| 137 if (options_url.is_valid()) { |
| 138 *error = ASCIIToUTF16(errors::kInvalidOptionsPageExpectUrlInPackage); |
| 139 return false; |
| 140 } |
| 141 options_url = extension->GetResourceURL(options_str); |
| 142 if (!options_url.is_valid()) { |
| 143 *error = ASCIIToUTF16(errors::kInvalidOptionsPage); |
| 144 return false; |
| 145 } |
| 146 } |
| 147 |
| 148 extension->SetManifestData(keys::kOptionsPage, new ExtensionURL(options_url)); |
| 149 return true; |
| 150 } |
| 151 |
| 152 UpdateURLHandler::UpdateURLHandler() { |
| 153 } |
| 154 |
| 155 UpdateURLHandler::~UpdateURLHandler() { |
| 156 } |
| 157 |
| 158 bool UpdateURLHandler::Parse(const base::Value* value, |
| 159 Extension* extension, |
| 160 string16* error) { |
| 161 std::string update_str; |
| 162 if (!value->GetAsString(&update_str)) { |
| 163 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 164 errors::kInvalidUpdateURL, ""); |
| 165 return false; |
| 166 } |
| 167 GURL update_url = GURL(update_str); |
| 168 if (!update_url.is_valid() || update_url.has_ref()) { |
| 169 *error = ErrorUtils::FormatErrorMessageUTF16( |
| 170 errors::kInvalidUpdateURL, update_str); |
| 171 return false; |
| 172 } |
| 173 |
| 174 extension->SetManifestData(keys::kUpdateURL, new ExtensionURL(update_url)); |
| 175 return true; |
| 176 } |
| 177 |
| 178 } // namespace extensions |
| OLD | NEW |