OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "base/version.h" | 23 #include "base/version.h" |
24 #include "chrome/common/chrome_constants.h" | 24 #include "chrome/common/chrome_constants.h" |
25 #include "chrome/common/chrome_switches.h" | 25 #include "chrome/common/chrome_switches.h" |
26 #include "chrome/common/chrome_version_info.h" | 26 #include "chrome/common/chrome_version_info.h" |
27 // TODO(rdevlin.cronin): Remove this once PageAction, BrowserAction, and | 27 // TODO(rdevlin.cronin): Remove this once PageAction, BrowserAction, and |
28 // SystemIndicator have been moved out of Extension. | 28 // SystemIndicator have been moved out of Extension. |
29 #include "chrome/common/extensions/api/extension_action/action_info.h" | 29 #include "chrome/common/extensions/api/extension_action/action_info.h" |
30 #include "chrome/common/extensions/api/extension_action/page_action_handler.h" | 30 #include "chrome/common/extensions/api/extension_action/page_action_handler.h" |
31 #include "chrome/common/extensions/api/icons/icons_handler.h" | 31 #include "chrome/common/extensions/api/icons/icons_handler.h" |
32 #include "chrome/common/extensions/api/themes/theme_handler.h" | 32 #include "chrome/common/extensions/api/themes/theme_handler.h" |
| 33 #include "chrome/common/extensions/background_info.h" |
33 #include "chrome/common/extensions/csp_handler.h" | 34 #include "chrome/common/extensions/csp_handler.h" |
34 #include "chrome/common/extensions/csp_validator.h" | 35 #include "chrome/common/extensions/csp_validator.h" |
35 #include "chrome/common/extensions/extension_manifest_constants.h" | 36 #include "chrome/common/extensions/extension_manifest_constants.h" |
36 #include "chrome/common/extensions/feature_switch.h" | 37 #include "chrome/common/extensions/feature_switch.h" |
37 #include "chrome/common/extensions/features/base_feature_provider.h" | 38 #include "chrome/common/extensions/features/base_feature_provider.h" |
38 #include "chrome/common/extensions/features/feature.h" | 39 #include "chrome/common/extensions/features/feature.h" |
39 #include "chrome/common/extensions/manifest.h" | 40 #include "chrome/common/extensions/manifest.h" |
40 #include "chrome/common/extensions/manifest_handler.h" | 41 #include "chrome/common/extensions/manifest_handler.h" |
41 #include "chrome/common/extensions/manifest_handler_helpers.h" | 42 #include "chrome/common/extensions/manifest_handler_helpers.h" |
42 #include "chrome/common/extensions/manifest_url_handler.h" | 43 #include "chrome/common/extensions/manifest_url_handler.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 // Note: Component extensions have this right implicitly and do not need to be | 142 // Note: Component extensions have this right implicitly and do not need to be |
142 // added to this list. | 143 // added to this list. |
143 Extension::ScriptingWhitelist scripting_whitelist_; | 144 Extension::ScriptingWhitelist scripting_whitelist_; |
144 }; | 145 }; |
145 | 146 |
146 bool ReadLaunchDimension(const extensions::Manifest* manifest, | 147 bool ReadLaunchDimension(const extensions::Manifest* manifest, |
147 const char* key, | 148 const char* key, |
148 int* target, | 149 int* target, |
149 bool is_valid_container, | 150 bool is_valid_container, |
150 string16* error) { | 151 string16* error) { |
151 Value* temp = NULL; | 152 const Value* temp = NULL; |
152 if (manifest->Get(key, &temp)) { | 153 if (manifest->Get(key, &temp)) { |
153 if (!is_valid_container) { | 154 if (!is_valid_container) { |
154 *error = ErrorUtils::FormatErrorMessageUTF16( | 155 *error = ErrorUtils::FormatErrorMessageUTF16( |
155 errors::kInvalidLaunchValueContainer, | 156 errors::kInvalidLaunchValueContainer, |
156 key); | 157 key); |
157 return false; | 158 return false; |
158 } | 159 } |
159 if (!temp->GetAsInteger(target) || *target < 0) { | 160 if (!temp->GetAsInteger(target) || *target < 0) { |
160 *target = 0; | 161 *target = 0; |
161 *error = ErrorUtils::FormatErrorMessageUTF16( | 162 *error = ErrorUtils::FormatErrorMessageUTF16( |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 // static | 503 // static |
503 const Extension::ScriptingWhitelist* Extension::GetScriptingWhitelist() { | 504 const Extension::ScriptingWhitelist* Extension::GetScriptingWhitelist() { |
504 return ExtensionConfig::GetInstance()->whitelist(); | 505 return ExtensionConfig::GetInstance()->whitelist(); |
505 } | 506 } |
506 | 507 |
507 bool Extension::ParsePermissions(const char* key, | 508 bool Extension::ParsePermissions(const char* key, |
508 string16* error, | 509 string16* error, |
509 APIPermissionSet* api_permissions, | 510 APIPermissionSet* api_permissions, |
510 URLPatternSet* host_permissions) { | 511 URLPatternSet* host_permissions) { |
511 if (manifest_->HasKey(key)) { | 512 if (manifest_->HasKey(key)) { |
512 ListValue* permissions = NULL; | 513 const ListValue* permissions = NULL; |
513 if (!manifest_->GetList(key, &permissions)) { | 514 if (!manifest_->GetList(key, &permissions)) { |
514 *error = ErrorUtils::FormatErrorMessageUTF16( | 515 *error = ErrorUtils::FormatErrorMessageUTF16( |
515 errors::kInvalidPermissions, ""); | 516 errors::kInvalidPermissions, ""); |
516 return false; | 517 return false; |
517 } | 518 } |
518 | 519 |
519 // NOTE: We need to get the APIPermission before we check if features | 520 // NOTE: We need to get the APIPermission before we check if features |
520 // associated with them are available because the feature system does not | 521 // associated with them are available because the feature system does not |
521 // know about aliases. | 522 // know about aliases. |
522 | 523 |
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1096 return !content_pack_site_list_.empty(); | 1097 return !content_pack_site_list_.empty(); |
1097 } | 1098 } |
1098 | 1099 |
1099 ExtensionResource Extension::GetContentPackSiteList() const { | 1100 ExtensionResource Extension::GetContentPackSiteList() const { |
1100 if (!is_content_pack()) | 1101 if (!is_content_pack()) |
1101 return ExtensionResource(); | 1102 return ExtensionResource(); |
1102 | 1103 |
1103 return GetResource(content_pack_site_list_); | 1104 return GetResource(content_pack_site_list_); |
1104 } | 1105 } |
1105 | 1106 |
1106 GURL Extension::GetBackgroundURL() const { | |
1107 if (background_scripts_.empty()) | |
1108 return background_url_; | |
1109 return GetResourceURL(extension_filenames::kGeneratedBackgroundPageFilename); | |
1110 } | |
1111 | |
1112 Extension::RuntimeData::RuntimeData() {} | 1107 Extension::RuntimeData::RuntimeData() {} |
1113 Extension::RuntimeData::RuntimeData(const PermissionSet* active) | 1108 Extension::RuntimeData::RuntimeData(const PermissionSet* active) |
1114 : active_permissions_(active) {} | 1109 : active_permissions_(active) {} |
1115 Extension::RuntimeData::~RuntimeData() {} | 1110 Extension::RuntimeData::~RuntimeData() {} |
1116 | 1111 |
1117 void Extension::RuntimeData::SetActivePermissions( | 1112 void Extension::RuntimeData::SetActivePermissions( |
1118 const PermissionSet* active) { | 1113 const PermissionSet* active) { |
1119 active_permissions_ = active; | 1114 active_permissions_ = active; |
1120 } | 1115 } |
1121 | 1116 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 | 1199 |
1205 return base::FilePath(path_str); | 1200 return base::FilePath(path_str); |
1206 #else | 1201 #else |
1207 return path; | 1202 return path; |
1208 #endif | 1203 #endif |
1209 } | 1204 } |
1210 | 1205 |
1211 bool Extension::LoadManagedModeFeatures(string16* error) { | 1206 bool Extension::LoadManagedModeFeatures(string16* error) { |
1212 if (!manifest_->HasKey(keys::kContentPack)) | 1207 if (!manifest_->HasKey(keys::kContentPack)) |
1213 return true; | 1208 return true; |
1214 DictionaryValue* content_pack_value = NULL; | 1209 const DictionaryValue* content_pack_value = NULL; |
1215 if (!manifest_->GetDictionary(keys::kContentPack, &content_pack_value)) { | 1210 if (!manifest_->GetDictionary(keys::kContentPack, &content_pack_value)) { |
1216 *error = ASCIIToUTF16(errors::kInvalidContentPack); | 1211 *error = ASCIIToUTF16(errors::kInvalidContentPack); |
1217 return false; | 1212 return false; |
1218 } | 1213 } |
1219 | 1214 |
1220 if (!LoadManagedModeSites(content_pack_value, error)) | 1215 if (!LoadManagedModeSites(content_pack_value, error)) |
1221 return false; | 1216 return false; |
1222 if (!LoadManagedModeConfigurations(content_pack_value, error)) | 1217 if (!LoadManagedModeConfigurations(content_pack_value, error)) |
1223 return false; | 1218 return false; |
1224 | 1219 |
(...skipping 29 matching lines...) Expand all Loading... |
1254 // See http://b/4946060 for more details. | 1249 // See http://b/4946060 for more details. |
1255 return id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); | 1250 return id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); |
1256 } | 1251 } |
1257 | 1252 |
1258 Extension::Extension(const base::FilePath& path, | 1253 Extension::Extension(const base::FilePath& path, |
1259 scoped_ptr<extensions::Manifest> manifest) | 1254 scoped_ptr<extensions::Manifest> manifest) |
1260 : manifest_version_(0), | 1255 : manifest_version_(0), |
1261 incognito_split_mode_(false), | 1256 incognito_split_mode_(false), |
1262 offline_enabled_(false), | 1257 offline_enabled_(false), |
1263 converted_from_user_script_(false), | 1258 converted_from_user_script_(false), |
1264 background_page_is_persistent_(true), | |
1265 allow_background_js_access_(true), | |
1266 manifest_(manifest.release()), | 1259 manifest_(manifest.release()), |
1267 finished_parsing_manifest_(false), | 1260 finished_parsing_manifest_(false), |
1268 is_storage_isolated_(false), | 1261 is_storage_isolated_(false), |
1269 launch_container_(extension_misc::LAUNCH_TAB), | 1262 launch_container_(extension_misc::LAUNCH_TAB), |
1270 launch_width_(0), | 1263 launch_width_(0), |
1271 launch_height_(0), | 1264 launch_height_(0), |
1272 display_in_launcher_(true), | 1265 display_in_launcher_(true), |
1273 display_in_new_tab_page_(true), | 1266 display_in_new_tab_page_(true), |
1274 wants_file_access_(false), | 1267 wants_file_access_(false), |
1275 creation_flags_(0) { | 1268 creation_flags_(0) { |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1394 is_storage_isolated_ = true; | 1387 is_storage_isolated_ = true; |
1395 return true; | 1388 return true; |
1396 } | 1389 } |
1397 | 1390 |
1398 // Other apps only get it if it is requested _and_ experimental APIs are | 1391 // Other apps only get it if it is requested _and_ experimental APIs are |
1399 // enabled. | 1392 // enabled. |
1400 if (!initial_api_permissions()->count(APIPermission::kExperimental) | 1393 if (!initial_api_permissions()->count(APIPermission::kExperimental) |
1401 || !is_app()) | 1394 || !is_app()) |
1402 return true; | 1395 return true; |
1403 | 1396 |
1404 Value* tmp_isolation = NULL; | 1397 const Value* tmp_isolation = NULL; |
1405 if (!manifest_->Get(keys::kIsolation, &tmp_isolation)) | 1398 if (!manifest_->Get(keys::kIsolation, &tmp_isolation)) |
1406 return true; | 1399 return true; |
1407 | 1400 |
1408 if (tmp_isolation->GetType() != Value::TYPE_LIST) { | 1401 const ListValue* isolation_list = NULL; |
| 1402 if (!tmp_isolation->GetAsList(&isolation_list)) { |
1409 *error = ASCIIToUTF16(errors::kInvalidIsolation); | 1403 *error = ASCIIToUTF16(errors::kInvalidIsolation); |
1410 return false; | 1404 return false; |
1411 } | 1405 } |
1412 | 1406 |
1413 ListValue* isolation_list = static_cast<ListValue*>(tmp_isolation); | |
1414 for (size_t i = 0; i < isolation_list->GetSize(); ++i) { | 1407 for (size_t i = 0; i < isolation_list->GetSize(); ++i) { |
1415 std::string isolation_string; | 1408 std::string isolation_string; |
1416 if (!isolation_list->GetString(i, &isolation_string)) { | 1409 if (!isolation_list->GetString(i, &isolation_string)) { |
1417 *error = ErrorUtils::FormatErrorMessageUTF16( | 1410 *error = ErrorUtils::FormatErrorMessageUTF16( |
1418 errors::kInvalidIsolationValue, | 1411 errors::kInvalidIsolationValue, |
1419 base::UintToString(i)); | 1412 base::UintToString(i)); |
1420 return false; | 1413 return false; |
1421 } | 1414 } |
1422 | 1415 |
1423 // Check for isolated storage. | 1416 // Check for isolated storage. |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1486 display_in_new_tab_page_ = display_in_launcher_; | 1479 display_in_new_tab_page_ = display_in_launcher_; |
1487 } | 1480 } |
1488 return true; | 1481 return true; |
1489 } | 1482 } |
1490 | 1483 |
1491 bool Extension::LoadExtent(const char* key, | 1484 bool Extension::LoadExtent(const char* key, |
1492 URLPatternSet* extent, | 1485 URLPatternSet* extent, |
1493 const char* list_error, | 1486 const char* list_error, |
1494 const char* value_error, | 1487 const char* value_error, |
1495 string16* error) { | 1488 string16* error) { |
1496 Value* temp_pattern_value = NULL; | 1489 const Value* temp_pattern_value = NULL; |
1497 if (!manifest_->Get(key, &temp_pattern_value)) | 1490 if (!manifest_->Get(key, &temp_pattern_value)) |
1498 return true; | 1491 return true; |
1499 | 1492 |
1500 if (temp_pattern_value->GetType() != Value::TYPE_LIST) { | 1493 const ListValue* pattern_list = NULL; |
| 1494 if (!temp_pattern_value->GetAsList(&pattern_list)) { |
1501 *error = ASCIIToUTF16(list_error); | 1495 *error = ASCIIToUTF16(list_error); |
1502 return false; | 1496 return false; |
1503 } | 1497 } |
1504 | 1498 |
1505 ListValue* pattern_list = static_cast<ListValue*>(temp_pattern_value); | |
1506 for (size_t i = 0; i < pattern_list->GetSize(); ++i) { | 1499 for (size_t i = 0; i < pattern_list->GetSize(); ++i) { |
1507 std::string pattern_string; | 1500 std::string pattern_string; |
1508 if (!pattern_list->GetString(i, &pattern_string)) { | 1501 if (!pattern_list->GetString(i, &pattern_string)) { |
1509 *error = ErrorUtils::FormatErrorMessageUTF16(value_error, | 1502 *error = ErrorUtils::FormatErrorMessageUTF16(value_error, |
1510 base::UintToString(i), | 1503 base::UintToString(i), |
1511 errors::kExpectString); | 1504 errors::kExpectString); |
1512 return false; | 1505 return false; |
1513 } | 1506 } |
1514 | 1507 |
1515 URLPattern pattern(kValidWebExtentSchemes); | 1508 URLPattern pattern(kValidWebExtentSchemes); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 } | 1549 } |
1557 pattern.SetPath(pattern.path() + '*'); | 1550 pattern.SetPath(pattern.path() + '*'); |
1558 | 1551 |
1559 extent->AddPattern(pattern); | 1552 extent->AddPattern(pattern); |
1560 } | 1553 } |
1561 | 1554 |
1562 return true; | 1555 return true; |
1563 } | 1556 } |
1564 | 1557 |
1565 bool Extension::LoadLaunchContainer(string16* error) { | 1558 bool Extension::LoadLaunchContainer(string16* error) { |
1566 Value* tmp_launcher_container = NULL; | 1559 const Value* tmp_launcher_container = NULL; |
1567 if (!manifest_->Get(keys::kLaunchContainer, &tmp_launcher_container)) | 1560 if (!manifest_->Get(keys::kLaunchContainer, &tmp_launcher_container)) |
1568 return true; | 1561 return true; |
1569 | 1562 |
1570 std::string launch_container_string; | 1563 std::string launch_container_string; |
1571 if (!tmp_launcher_container->GetAsString(&launch_container_string)) { | 1564 if (!tmp_launcher_container->GetAsString(&launch_container_string)) { |
1572 *error = ASCIIToUTF16(errors::kInvalidLaunchContainer); | 1565 *error = ASCIIToUTF16(errors::kInvalidLaunchContainer); |
1573 return false; | 1566 return false; |
1574 } | 1567 } |
1575 | 1568 |
1576 if (launch_container_string == values::kLaunchContainerPanel) { | 1569 if (launch_container_string == values::kLaunchContainerPanel) { |
(...skipping 24 matching lines...) Expand all Loading... |
1601 &launch_height_, | 1594 &launch_height_, |
1602 can_specify_initial_size, | 1595 can_specify_initial_size, |
1603 error)) { | 1596 error)) { |
1604 return false; | 1597 return false; |
1605 } | 1598 } |
1606 | 1599 |
1607 return true; | 1600 return true; |
1608 } | 1601 } |
1609 | 1602 |
1610 bool Extension::LoadLaunchURL(string16* error) { | 1603 bool Extension::LoadLaunchURL(string16* error) { |
1611 Value* temp = NULL; | 1604 const Value* temp = NULL; |
1612 | 1605 |
1613 // launch URL can be either local (to chrome-extension:// root) or an absolute | 1606 // launch URL can be either local (to chrome-extension:// root) or an absolute |
1614 // web URL. | 1607 // web URL. |
1615 if (manifest_->Get(keys::kLaunchLocalPath, &temp)) { | 1608 if (manifest_->Get(keys::kLaunchLocalPath, &temp)) { |
1616 if (manifest_->Get(keys::kLaunchWebURL, NULL)) { | 1609 if (manifest_->Get(keys::kLaunchWebURL, NULL)) { |
1617 *error = ASCIIToUTF16(errors::kLaunchPathAndURLAreExclusive); | 1610 *error = ASCIIToUTF16(errors::kLaunchPathAndURLAreExclusive); |
1618 return false; | 1611 return false; |
1619 } | 1612 } |
1620 | 1613 |
1621 if (manifest_->Get(keys::kWebURLs, NULL)) { | 1614 if (manifest_->Get(keys::kWebURLs, NULL)) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 return true; | 1712 return true; |
1720 } | 1713 } |
1721 | 1714 |
1722 bool Extension::LoadSharedFeatures(string16* error) { | 1715 bool Extension::LoadSharedFeatures(string16* error) { |
1723 if (!LoadDescription(error) || | 1716 if (!LoadDescription(error) || |
1724 !ManifestHandler::ParseExtension(this, error) || | 1717 !ManifestHandler::ParseExtension(this, error) || |
1725 !LoadPlugins(error) || | 1718 !LoadPlugins(error) || |
1726 !LoadNaClModules(error) || | 1719 !LoadNaClModules(error) || |
1727 !LoadSandboxedPages(error) || | 1720 !LoadSandboxedPages(error) || |
1728 !LoadRequirements(error) || | 1721 !LoadRequirements(error) || |
1729 !LoadOfflineEnabled(error) || | 1722 !LoadOfflineEnabled(error)) |
1730 // LoadBackgroundScripts() must be called before LoadBackgroundPage(). | |
1731 !LoadBackgroundScripts(error) || | |
1732 !LoadBackgroundPage(error) || | |
1733 !LoadBackgroundPersistent(error) || | |
1734 !LoadBackgroundAllowJSAccess(error)) | |
1735 return false; | 1723 return false; |
1736 | 1724 |
1737 return true; | 1725 return true; |
1738 } | 1726 } |
1739 | 1727 |
1740 bool Extension::LoadDescription(string16* error) { | 1728 bool Extension::LoadDescription(string16* error) { |
1741 if (manifest_->HasKey(keys::kDescription) && | 1729 if (manifest_->HasKey(keys::kDescription) && |
1742 !manifest_->GetString(keys::kDescription, &description_)) { | 1730 !manifest_->GetString(keys::kDescription, &description_)) { |
1743 *error = ASCIIToUTF16(errors::kInvalidDescription); | 1731 *error = ASCIIToUTF16(errors::kInvalidDescription); |
1744 return false; | 1732 return false; |
(...skipping 24 matching lines...) Expand all Loading... |
1769 return false; | 1757 return false; |
1770 } | 1758 } |
1771 | 1759 |
1772 return true; | 1760 return true; |
1773 } | 1761 } |
1774 | 1762 |
1775 bool Extension::LoadPlugins(string16* error) { | 1763 bool Extension::LoadPlugins(string16* error) { |
1776 if (!manifest_->HasKey(keys::kPlugins)) | 1764 if (!manifest_->HasKey(keys::kPlugins)) |
1777 return true; | 1765 return true; |
1778 | 1766 |
1779 ListValue* list_value = NULL; | 1767 const ListValue* list_value = NULL; |
1780 if (!manifest_->GetList(keys::kPlugins, &list_value)) { | 1768 if (!manifest_->GetList(keys::kPlugins, &list_value)) { |
1781 *error = ASCIIToUTF16(errors::kInvalidPlugins); | 1769 *error = ASCIIToUTF16(errors::kInvalidPlugins); |
1782 return false; | 1770 return false; |
1783 } | 1771 } |
1784 | 1772 |
1785 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 1773 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
1786 DictionaryValue* plugin_value = NULL; | 1774 const DictionaryValue* plugin_value = NULL; |
1787 if (!list_value->GetDictionary(i, &plugin_value)) { | 1775 if (!list_value->GetDictionary(i, &plugin_value)) { |
1788 *error = ASCIIToUTF16(errors::kInvalidPlugins); | 1776 *error = ASCIIToUTF16(errors::kInvalidPlugins); |
1789 return false; | 1777 return false; |
1790 } | 1778 } |
1791 // Get plugins[i].path. | 1779 // Get plugins[i].path. |
1792 std::string path_str; | 1780 std::string path_str; |
1793 if (!plugin_value->GetString(keys::kPluginsPath, &path_str)) { | 1781 if (!plugin_value->GetString(keys::kPluginsPath, &path_str)) { |
1794 *error = ErrorUtils::FormatErrorMessageUTF16( | 1782 *error = ErrorUtils::FormatErrorMessageUTF16( |
1795 errors::kInvalidPluginsPath, base::IntToString(i)); | 1783 errors::kInvalidPluginsPath, base::IntToString(i)); |
1796 return false; | 1784 return false; |
(...skipping 24 matching lines...) Expand all Loading... |
1821 plugins_.back().path = path().Append( | 1809 plugins_.back().path = path().Append( |
1822 base::FilePath::FromUTF8Unsafe(path_str)); | 1810 base::FilePath::FromUTF8Unsafe(path_str)); |
1823 plugins_.back().is_public = is_public; | 1811 plugins_.back().is_public = is_public; |
1824 } | 1812 } |
1825 return true; | 1813 return true; |
1826 } | 1814 } |
1827 | 1815 |
1828 bool Extension::LoadNaClModules(string16* error) { | 1816 bool Extension::LoadNaClModules(string16* error) { |
1829 if (!manifest_->HasKey(keys::kNaClModules)) | 1817 if (!manifest_->HasKey(keys::kNaClModules)) |
1830 return true; | 1818 return true; |
1831 ListValue* list_value = NULL; | 1819 const ListValue* list_value = NULL; |
1832 if (!manifest_->GetList(keys::kNaClModules, &list_value)) { | 1820 if (!manifest_->GetList(keys::kNaClModules, &list_value)) { |
1833 *error = ASCIIToUTF16(errors::kInvalidNaClModules); | 1821 *error = ASCIIToUTF16(errors::kInvalidNaClModules); |
1834 return false; | 1822 return false; |
1835 } | 1823 } |
1836 | 1824 |
1837 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 1825 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
1838 DictionaryValue* module_value = NULL; | 1826 const DictionaryValue* module_value = NULL; |
1839 if (!list_value->GetDictionary(i, &module_value)) { | 1827 if (!list_value->GetDictionary(i, &module_value)) { |
1840 *error = ASCIIToUTF16(errors::kInvalidNaClModules); | 1828 *error = ASCIIToUTF16(errors::kInvalidNaClModules); |
1841 return false; | 1829 return false; |
1842 } | 1830 } |
1843 | 1831 |
1844 // Get nacl_modules[i].path. | 1832 // Get nacl_modules[i].path. |
1845 std::string path_str; | 1833 std::string path_str; |
1846 if (!module_value->GetString(keys::kNaClModulesPath, &path_str)) { | 1834 if (!module_value->GetString(keys::kNaClModulesPath, &path_str)) { |
1847 *error = ErrorUtils::FormatErrorMessageUTF16( | 1835 *error = ErrorUtils::FormatErrorMessageUTF16( |
1848 errors::kInvalidNaClModulesPath, base::IntToString(i)); | 1836 errors::kInvalidNaClModulesPath, base::IntToString(i)); |
(...skipping 13 matching lines...) Expand all Loading... |
1862 nacl_modules_.back().mime_type = mime_type; | 1850 nacl_modules_.back().mime_type = mime_type; |
1863 } | 1851 } |
1864 | 1852 |
1865 return true; | 1853 return true; |
1866 } | 1854 } |
1867 | 1855 |
1868 bool Extension::LoadSandboxedPages(string16* error) { | 1856 bool Extension::LoadSandboxedPages(string16* error) { |
1869 if (!manifest_->HasPath(keys::kSandboxedPages)) | 1857 if (!manifest_->HasPath(keys::kSandboxedPages)) |
1870 return true; | 1858 return true; |
1871 | 1859 |
1872 ListValue* list_value = NULL; | 1860 const ListValue* list_value = NULL; |
1873 if (!manifest_->GetList(keys::kSandboxedPages, &list_value)) { | 1861 if (!manifest_->GetList(keys::kSandboxedPages, &list_value)) { |
1874 *error = ASCIIToUTF16(errors::kInvalidSandboxedPagesList); | 1862 *error = ASCIIToUTF16(errors::kInvalidSandboxedPagesList); |
1875 return false; | 1863 return false; |
1876 } | 1864 } |
1877 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 1865 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
1878 std::string relative_path; | 1866 std::string relative_path; |
1879 if (!list_value->GetString(i, &relative_path)) { | 1867 if (!list_value->GetString(i, &relative_path)) { |
1880 *error = ErrorUtils::FormatErrorMessageUTF16( | 1868 *error = ErrorUtils::FormatErrorMessageUTF16( |
1881 errors::kInvalidSandboxedPage, base::IntToString(i)); | 1869 errors::kInvalidSandboxedPage, base::IntToString(i)); |
1882 return false; | 1870 return false; |
(...skipping 30 matching lines...) Expand all Loading... |
1913 CHECK(ContentSecurityPolicyIsSandboxed( | 1901 CHECK(ContentSecurityPolicyIsSandboxed( |
1914 sandboxed_pages_content_security_policy_, GetType())); | 1902 sandboxed_pages_content_security_policy_, GetType())); |
1915 } | 1903 } |
1916 | 1904 |
1917 return true; | 1905 return true; |
1918 } | 1906 } |
1919 | 1907 |
1920 bool Extension::LoadRequirements(string16* error) { | 1908 bool Extension::LoadRequirements(string16* error) { |
1921 // Before parsing requirements from the manifest, automatically default the | 1909 // Before parsing requirements from the manifest, automatically default the |
1922 // NPAPI plugin requirement based on whether it includes NPAPI plugins. | 1910 // NPAPI plugin requirement based on whether it includes NPAPI plugins. |
1923 ListValue* list_value = NULL; | 1911 const ListValue* list_value = NULL; |
1924 requirements_.npapi = | 1912 requirements_.npapi = |
1925 manifest_->GetList(keys::kPlugins, &list_value) && !list_value->empty(); | 1913 manifest_->GetList(keys::kPlugins, &list_value) && !list_value->empty(); |
1926 | 1914 |
1927 if (!manifest_->HasKey(keys::kRequirements)) | 1915 if (!manifest_->HasKey(keys::kRequirements)) |
1928 return true; | 1916 return true; |
1929 | 1917 |
1930 DictionaryValue* requirements_value = NULL; | 1918 const DictionaryValue* requirements_value = NULL; |
1931 if (!manifest_->GetDictionary(keys::kRequirements, &requirements_value)) { | 1919 if (!manifest_->GetDictionary(keys::kRequirements, &requirements_value)) { |
1932 *error = ASCIIToUTF16(errors::kInvalidRequirements); | 1920 *error = ASCIIToUTF16(errors::kInvalidRequirements); |
1933 return false; | 1921 return false; |
1934 } | 1922 } |
1935 | 1923 |
1936 for (DictionaryValue::Iterator it(*requirements_value); !it.IsAtEnd(); | 1924 for (DictionaryValue::Iterator it(*requirements_value); !it.IsAtEnd(); |
1937 it.Advance()) { | 1925 it.Advance()) { |
1938 const DictionaryValue* requirement_value; | 1926 const DictionaryValue* requirement_value; |
1939 if (!it.value().GetAsDictionary(&requirement_value)) { | 1927 if (!it.value().GetAsDictionary(&requirement_value)) { |
1940 *error = ErrorUtils::FormatErrorMessageUTF16( | 1928 *error = ErrorUtils::FormatErrorMessageUTF16( |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1999 offline_enabled_ = is_platform_app(); | 1987 offline_enabled_ = is_platform_app(); |
2000 return true; | 1988 return true; |
2001 } | 1989 } |
2002 if (!manifest_->GetBoolean(keys::kOfflineEnabled, &offline_enabled_)) { | 1990 if (!manifest_->GetBoolean(keys::kOfflineEnabled, &offline_enabled_)) { |
2003 *error = ASCIIToUTF16(errors::kInvalidOfflineEnabled); | 1991 *error = ASCIIToUTF16(errors::kInvalidOfflineEnabled); |
2004 return false; | 1992 return false; |
2005 } | 1993 } |
2006 return true; | 1994 return true; |
2007 } | 1995 } |
2008 | 1996 |
2009 bool Extension::LoadBackgroundScripts(string16* error) { | |
2010 const std::string& key = is_platform_app() ? | |
2011 keys::kPlatformAppBackgroundScripts : keys::kBackgroundScripts; | |
2012 return LoadBackgroundScripts(key, error); | |
2013 } | |
2014 | |
2015 bool Extension::LoadBackgroundScripts(const std::string& key, string16* error) { | |
2016 Value* background_scripts_value = NULL; | |
2017 if (!manifest_->Get(key, &background_scripts_value)) | |
2018 return true; | |
2019 | |
2020 CHECK(background_scripts_value); | |
2021 if (background_scripts_value->GetType() != Value::TYPE_LIST) { | |
2022 *error = ASCIIToUTF16(errors::kInvalidBackgroundScripts); | |
2023 return false; | |
2024 } | |
2025 | |
2026 ListValue* background_scripts = | |
2027 static_cast<ListValue*>(background_scripts_value); | |
2028 for (size_t i = 0; i < background_scripts->GetSize(); ++i) { | |
2029 std::string script; | |
2030 if (!background_scripts->GetString(i, &script)) { | |
2031 *error = ErrorUtils::FormatErrorMessageUTF16( | |
2032 errors::kInvalidBackgroundScript, base::IntToString(i)); | |
2033 return false; | |
2034 } | |
2035 background_scripts_.push_back(script); | |
2036 } | |
2037 | |
2038 return true; | |
2039 } | |
2040 | |
2041 bool Extension::LoadBackgroundPage(string16* error) { | |
2042 if (is_platform_app()) { | |
2043 return LoadBackgroundPage(keys::kPlatformAppBackgroundPage, error); | |
2044 } | |
2045 | |
2046 if (!LoadBackgroundPage(keys::kBackgroundPage, error)) | |
2047 return false; | |
2048 if (background_url_.is_empty()) { | |
2049 return LoadBackgroundPage( | |
2050 keys::kBackgroundPageLegacy, error); | |
2051 } | |
2052 return true; | |
2053 } | |
2054 | |
2055 bool Extension::LoadBackgroundPage(const std::string& key, string16* error) { | |
2056 base::Value* background_page_value = NULL; | |
2057 if (!manifest_->Get(key, &background_page_value)) | |
2058 return true; | |
2059 | |
2060 if (!background_scripts_.empty()) { | |
2061 *error = ASCIIToUTF16(errors::kInvalidBackgroundCombination); | |
2062 return false; | |
2063 } | |
2064 | |
2065 | |
2066 std::string background_str; | |
2067 if (!background_page_value->GetAsString(&background_str)) { | |
2068 *error = ASCIIToUTF16(errors::kInvalidBackground); | |
2069 return false; | |
2070 } | |
2071 | |
2072 if (is_hosted_app()) { | |
2073 background_url_ = GURL(background_str); | |
2074 | |
2075 // Make sure "background" permission is set. | |
2076 if (!initial_api_permissions()->count(APIPermission::kBackground)) { | |
2077 *error = ASCIIToUTF16(errors::kBackgroundPermissionNeeded); | |
2078 return false; | |
2079 } | |
2080 // Hosted apps require an absolute URL. | |
2081 if (!background_url_.is_valid()) { | |
2082 *error = ASCIIToUTF16(errors::kInvalidBackgroundInHostedApp); | |
2083 return false; | |
2084 } | |
2085 | |
2086 if (!(background_url_.SchemeIs("https") || | |
2087 (CommandLine::ForCurrentProcess()->HasSwitch( | |
2088 switches::kAllowHTTPBackgroundPage) && | |
2089 background_url_.SchemeIs("http")))) { | |
2090 *error = ASCIIToUTF16(errors::kInvalidBackgroundInHostedApp); | |
2091 return false; | |
2092 } | |
2093 } else { | |
2094 background_url_ = GetResourceURL(background_str); | |
2095 } | |
2096 | |
2097 return true; | |
2098 } | |
2099 | |
2100 bool Extension::LoadBackgroundPersistent(string16* error) { | |
2101 if (is_platform_app()) { | |
2102 background_page_is_persistent_ = false; | |
2103 return true; | |
2104 } | |
2105 | |
2106 Value* background_persistent = NULL; | |
2107 if (!manifest_->Get(keys::kBackgroundPersistent, &background_persistent)) | |
2108 return true; | |
2109 | |
2110 if (!background_persistent->GetAsBoolean(&background_page_is_persistent_)) { | |
2111 *error = ASCIIToUTF16(errors::kInvalidBackgroundPersistent); | |
2112 return false; | |
2113 } | |
2114 | |
2115 if (!has_background_page()) { | |
2116 *error = ASCIIToUTF16(errors::kInvalidBackgroundPersistentNoPage); | |
2117 return false; | |
2118 } | |
2119 | |
2120 return true; | |
2121 } | |
2122 | |
2123 bool Extension::LoadBackgroundAllowJSAccess(string16* error) { | |
2124 Value* allow_js_access = NULL; | |
2125 if (!manifest_->Get(keys::kBackgroundAllowJsAccess, &allow_js_access)) | |
2126 return true; | |
2127 | |
2128 if (!allow_js_access->IsType(Value::TYPE_BOOLEAN) || | |
2129 !allow_js_access->GetAsBoolean(&allow_background_js_access_)) { | |
2130 *error = ASCIIToUTF16(errors::kInvalidBackgroundAllowJsAccess); | |
2131 return false; | |
2132 } | |
2133 | |
2134 return true; | |
2135 } | |
2136 | |
2137 bool Extension::LoadExtensionFeatures(string16* error) { | 1997 bool Extension::LoadExtensionFeatures(string16* error) { |
2138 if (manifest_->HasKey(keys::kConvertedFromUserScript)) | 1998 if (manifest_->HasKey(keys::kConvertedFromUserScript)) |
2139 manifest_->GetBoolean(keys::kConvertedFromUserScript, | 1999 manifest_->GetBoolean(keys::kConvertedFromUserScript, |
2140 &converted_from_user_script_); | 2000 &converted_from_user_script_); |
2141 | 2001 |
2142 if (!LoadContentScripts(error) || | 2002 if (!LoadContentScripts(error) || |
2143 !LoadSystemIndicator(error) || | 2003 !LoadSystemIndicator(error) || |
2144 !LoadIncognitoMode(error)) | 2004 !LoadIncognitoMode(error)) |
2145 return false; | 2005 return false; |
2146 | 2006 |
2147 return true; | 2007 return true; |
2148 } | 2008 } |
2149 | 2009 |
2150 bool Extension::LoadContentScripts(string16* error) { | 2010 bool Extension::LoadContentScripts(string16* error) { |
2151 if (!manifest_->HasKey(keys::kContentScripts)) | 2011 if (!manifest_->HasKey(keys::kContentScripts)) |
2152 return true; | 2012 return true; |
2153 ListValue* list_value; | 2013 const ListValue* list_value; |
2154 if (!manifest_->GetList(keys::kContentScripts, &list_value)) { | 2014 if (!manifest_->GetList(keys::kContentScripts, &list_value)) { |
2155 *error = ASCIIToUTF16(errors::kInvalidContentScriptsList); | 2015 *error = ASCIIToUTF16(errors::kInvalidContentScriptsList); |
2156 return false; | 2016 return false; |
2157 } | 2017 } |
2158 | 2018 |
2159 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 2019 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
2160 DictionaryValue* content_script = NULL; | 2020 const DictionaryValue* content_script = NULL; |
2161 if (!list_value->GetDictionary(i, &content_script)) { | 2021 if (!list_value->GetDictionary(i, &content_script)) { |
2162 *error = ErrorUtils::FormatErrorMessageUTF16( | 2022 *error = ErrorUtils::FormatErrorMessageUTF16( |
2163 errors::kInvalidContentScript, base::IntToString(i)); | 2023 errors::kInvalidContentScript, base::IntToString(i)); |
2164 return false; | 2024 return false; |
2165 } | 2025 } |
2166 | 2026 |
2167 UserScript script; | 2027 UserScript script; |
2168 if (!LoadUserScriptHelper(content_script, i, error, &script)) | 2028 if (!LoadUserScriptHelper(content_script, i, error, &script)) |
2169 return false; // Failed to parse script context definition. | 2029 return false; // Failed to parse script context definition. |
2170 script.set_extension_id(id()); | 2030 script.set_extension_id(id()); |
2171 if (converted_from_user_script_) { | 2031 if (converted_from_user_script_) { |
2172 script.set_emulate_greasemonkey(true); | 2032 script.set_emulate_greasemonkey(true); |
2173 script.set_match_all_frames(true); // Greasemonkey matches all frames. | 2033 script.set_match_all_frames(true); // Greasemonkey matches all frames. |
2174 } | 2034 } |
2175 content_scripts_.push_back(script); | 2035 content_scripts_.push_back(script); |
2176 } | 2036 } |
2177 return true; | 2037 return true; |
2178 } | 2038 } |
2179 | 2039 |
2180 bool Extension::LoadSystemIndicator(string16* error) { | 2040 bool Extension::LoadSystemIndicator(string16* error) { |
2181 if (!manifest_->HasKey(keys::kSystemIndicator)) { | 2041 if (!manifest_->HasKey(keys::kSystemIndicator)) { |
2182 // There was no manifest entry for the system indicator. | 2042 // There was no manifest entry for the system indicator. |
2183 return true; | 2043 return true; |
2184 } | 2044 } |
2185 | 2045 |
2186 DictionaryValue* system_indicator_value = NULL; | 2046 const DictionaryValue* system_indicator_value = NULL; |
2187 if (!manifest_->GetDictionary(keys::kSystemIndicator, | 2047 if (!manifest_->GetDictionary(keys::kSystemIndicator, |
2188 &system_indicator_value)) { | 2048 &system_indicator_value)) { |
2189 *error = ASCIIToUTF16(errors::kInvalidSystemIndicator); | 2049 *error = ASCIIToUTF16(errors::kInvalidSystemIndicator); |
2190 return false; | 2050 return false; |
2191 } | 2051 } |
2192 | 2052 |
2193 system_indicator_info_ = LoadExtensionActionInfoHelper( | 2053 system_indicator_info_ = LoadExtensionActionInfoHelper( |
2194 this, system_indicator_value, error); | 2054 this, system_indicator_value, error); |
2195 | 2055 |
2196 if (!system_indicator_info_.get()) { | 2056 if (!system_indicator_info_.get()) { |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2587 minimum_version_string); | 2447 minimum_version_string); |
2588 return false; | 2448 return false; |
2589 } | 2449 } |
2590 return true; | 2450 return true; |
2591 } | 2451 } |
2592 | 2452 |
2593 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) const { | 2453 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) const { |
2594 if (!is_platform_app()) | 2454 if (!is_platform_app()) |
2595 return true; | 2455 return true; |
2596 | 2456 |
2597 if (!has_background_page()) { | 2457 if (!BackgroundInfo::HasBackgroundPage(this)) { |
2598 *utf8_error = errors::kBackgroundRequiredForPlatformApps; | 2458 *utf8_error = errors::kBackgroundRequiredForPlatformApps; |
2599 return false; | 2459 return false; |
2600 } | 2460 } |
2601 | 2461 |
2602 if (!incognito_split_mode_) { | 2462 if (!incognito_split_mode_) { |
2603 *utf8_error = errors::kInvalidIncognitoModeForPlatformApp; | 2463 *utf8_error = errors::kInvalidIncognitoModeForPlatformApp; |
2604 return false; | 2464 return false; |
2605 } | 2465 } |
2606 | 2466 |
2607 return true; | 2467 return true; |
2608 } | 2468 } |
2609 | 2469 |
2610 bool Extension::CheckConflictingFeatures(std::string* utf8_error) const { | 2470 bool Extension::CheckConflictingFeatures(std::string* utf8_error) const { |
2611 if (has_lazy_background_page() && | 2471 if (BackgroundInfo::HasLazyBackgroundPage(this) && |
2612 HasAPIPermission(APIPermission::kWebRequest)) { | 2472 HasAPIPermission(APIPermission::kWebRequest)) { |
2613 *utf8_error = errors::kWebRequestConflictsWithLazyBackground; | 2473 *utf8_error = errors::kWebRequestConflictsWithLazyBackground; |
2614 return false; | 2474 return false; |
2615 } | 2475 } |
2616 | 2476 |
2617 return true; | 2477 return true; |
2618 } | 2478 } |
2619 | 2479 |
2620 ExtensionInfo::ExtensionInfo(const DictionaryValue* manifest, | 2480 ExtensionInfo::ExtensionInfo(const DictionaryValue* manifest, |
2621 const std::string& id, | 2481 const std::string& id, |
(...skipping 17 matching lines...) Expand all Loading... |
2639 | 2499 |
2640 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 2500 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
2641 const Extension* extension, | 2501 const Extension* extension, |
2642 const PermissionSet* permissions, | 2502 const PermissionSet* permissions, |
2643 Reason reason) | 2503 Reason reason) |
2644 : reason(reason), | 2504 : reason(reason), |
2645 extension(extension), | 2505 extension(extension), |
2646 permissions(permissions) {} | 2506 permissions(permissions) {} |
2647 | 2507 |
2648 } // namespace extensions | 2508 } // namespace extensions |
OLD | NEW |