summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorfsamuel@chromium.org <fsamuel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-07 08:55:19 +0000
committerfsamuel@chromium.org <fsamuel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-07 08:55:19 +0000
commit2aa406a8b4577103e7b933c75ec0e372830f20fe (patch)
treefd498026e0c139388315f6176f9f98372d7f73d3 /extensions
parent5f7dd0629b5b7e203e264a21104b7227b3d5968b (diff)
downloadchromium_src-2aa406a8b4577103e7b933c75ec0e372830f20fe.zip
chromium_src-2aa406a8b4577103e7b933c75ec0e372830f20fe.tar.gz
chromium_src-2aa406a8b4577103e7b933c75ec0e372830f20fe.tar.bz2
<webview>: Update format for local file access in manifest.json
The new format is: "webview" : { "partitions" : [ { "name" : "foo*", "accessible_resources" : ["a.html", "b.html"] }, { "name" : "bar", "accessible_resources" : ["a.html", "c.html"] } ] } BUG=340291 Review URL: https://codereview.chromium.org/151923005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@249640 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'extensions')
-rw-r--r--extensions/common/manifest_constants.cc13
-rw-r--r--extensions/common/manifest_constants.h8
-rw-r--r--extensions/common/manifest_handlers/webview_info.cc128
-rw-r--r--extensions/common/manifest_handlers/webview_info.h17
4 files changed, 113 insertions, 53 deletions
diff --git a/extensions/common/manifest_constants.cc b/extensions/common/manifest_constants.cc
index 454f5ec..ff6acb1 100644
--- a/extensions/common/manifest_constants.cc
+++ b/extensions/common/manifest_constants.cc
@@ -162,7 +162,8 @@ const char kWebAccessibleResources[] = "web_accessible_resources";
const char kWebURLs[] = "app.urls";
const char kWebview[] = "webview";
const char kWebviewAccessibleResources[] = "accessible_resources";
-const char kWebviewPrivilegedPartitions[] = "privileged_partitions";
+const char kWebviewName[] = "name";
+const char kWebviewPartitions[] = "partitions";
} // namespace manifest_keys
@@ -621,10 +622,12 @@ const char kInvalidWebviewAccessibleResourcesList[] =
"Invalid value for'webview.accessible_resources'.";
const char kInvalidWebviewAccessibleResource[] =
"Invalid value for 'webview.accessible_resources[*]'.";
-const char kInvalidWebviewPrivilegedPartitionList[] =
- "Invalid value for 'webview.privileged_partitions'.";
-const char kInvalidWebviewPrivilegedPartition[] =
- "Invalid value for 'webview.privileged_partitions[*]'.";
+const char kInvalidWebviewPartition[] =
+ "Invalid value for 'webview.partitions[*]'.";
+const char kInvalidWebviewPartitionName[] =
+ "Invalid value for 'webview.partitions[*].name'.";
+const char kInvalidWebviewPartitionsList[] =
+ "Invalid value for 'webview.partitions'.";
const char kInvalidWebURL[] =
"Invalid value for 'app.urls[*]': *";
const char kInvalidWebURLs[] =
diff --git a/extensions/common/manifest_constants.h b/extensions/common/manifest_constants.h
index a62583f..f008281 100644
--- a/extensions/common/manifest_constants.h
+++ b/extensions/common/manifest_constants.h
@@ -169,8 +169,9 @@ extern const char kVersion[];
extern const char kWebAccessibleResources[];
extern const char kWebURLs[];
extern const char kWebview[];
+extern const char kWebviewName[];
extern const char kWebviewAccessibleResources[];
-extern const char kWebviewPrivilegedPartitions[];
+extern const char kWebviewPartitions[];
} // namespace manifest_keys
@@ -424,8 +425,9 @@ extern const char kInvalidWebAccessibleResource[];
extern const char kInvalidWebview[];
extern const char kInvalidWebviewAccessibleResourcesList[];
extern const char kInvalidWebviewAccessibleResource[];
-extern const char kInvalidWebviewPrivilegedPartitionList[];
-extern const char kInvalidWebviewPrivilegedPartition[];
+extern const char kInvalidWebviewPartition[];
+extern const char kInvalidWebviewPartitionName[];
+extern const char kInvalidWebviewPartitionsList[];
extern const char kInvalidWebURL[];
extern const char kInvalidWebURLs[];
extern const char kInvalidZipHash[];
diff --git a/extensions/common/manifest_handlers/webview_info.cc b/extensions/common/manifest_handlers/webview_info.cc
index 5240099..3b30bbe 100644
--- a/extensions/common/manifest_handlers/webview_info.cc
+++ b/extensions/common/manifest_handlers/webview_info.cc
@@ -28,6 +28,39 @@ const WebviewInfo* GetResourcesInfo(
} // namespace
+// A PartitionItem represents a set of accessible resources given a partition
+// ID pattern.
+class PartitionItem {
+ public:
+ explicit PartitionItem(const std::string& partition_pattern)
+ : partition_pattern_(partition_pattern) {
+ }
+
+ virtual ~PartitionItem() {
+ }
+
+ bool Matches(const std::string& partition_id) const {
+ return MatchPattern(partition_id, partition_pattern_);
+ }
+
+ // Adds a pattern to the set. Returns true if a new pattern was inserted,
+ // false if the pattern was already in the set.
+ bool AddPattern(const URLPattern& pattern) {
+ return accessible_resources_.AddPattern(pattern);
+ }
+
+ const URLPatternSet& accessible_resources() const {
+ return accessible_resources_;
+ }
+ private:
+ // A pattern string that matches partition IDs.
+ const std::string partition_pattern_;
+ // A URL pattern set of resources accessible to the given
+ // |partition_pattern_|.
+ URLPatternSet accessible_resources_;
+};
+
+
WebviewInfo::WebviewInfo() {
}
@@ -46,18 +79,20 @@ bool WebviewInfo::IsResourceWebviewAccessible(
if (!info)
return false;
- bool partition_is_privileged = false;
- for (size_t i = 0;
- i < info->webview_privileged_partitions_.size();
- ++i) {
- if (MatchPattern(partition_id, info->webview_privileged_partitions_[i])) {
- partition_is_privileged = true;
- break;
+ for (size_t i = 0; i < info->partition_items_.size(); ++i) {
+ const PartitionItem* const item = info->partition_items_[i];
+ if (item->Matches(partition_id) &&
+ extension->ResourceMatches(item->accessible_resources(),
+ relative_path)) {
+ return true;
}
}
- return partition_is_privileged && extension->ResourceMatches(
- info->webview_accessible_resources_, relative_path);
+ return false;
+}
+
+void WebviewInfo::AddPartitionItem(scoped_ptr<PartitionItem> item) {
+ partition_items_.push_back(item.release());
}
WebviewHandler::WebviewHandler() {
@@ -76,47 +111,66 @@ bool WebviewHandler::Parse(Extension* extension, base::string16* error) {
return false;
}
- const base::ListValue* url_list = NULL;
- if (!dict_value->GetList(keys::kWebviewAccessibleResources,
- &url_list)) {
- *error = base::ASCIIToUTF16(errors::kInvalidWebviewAccessibleResourcesList);
+ const base::ListValue* partition_list = NULL;
+ if (!dict_value->GetList(keys::kWebviewPartitions, &partition_list)) {
+ *error = base::ASCIIToUTF16(errors::kInvalidWebviewPartitionsList);
return false;
}
- for (size_t i = 0; i < url_list->GetSize(); ++i) {
- std::string relative_path;
- if (!url_list->GetString(i, &relative_path)) {
+ // The partition list must have at least one entry.
+ if (partition_list->GetSize() == 0) {
+ *error = base::ASCIIToUTF16(errors::kInvalidWebviewPartitionsList);
+ return false;
+ }
+
+ for (size_t i = 0; i < partition_list->GetSize(); ++i) {
+ const base::DictionaryValue* partition = NULL;
+ if (!partition_list->GetDictionary(i, &partition)) {
*error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidWebviewAccessibleResource, base::IntToString(i));
+ errors::kInvalidWebviewPartition, base::IntToString(i));
return false;
}
- URLPattern pattern(URLPattern::SCHEME_EXTENSION);
- if (pattern.Parse(extension->url().spec()) != URLPattern::PARSE_SUCCESS) {
+
+ std::string partition_pattern;
+ if (!partition->GetString(keys::kWebviewName, &partition_pattern)) {
*error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidURLPatternError, extension->url().spec());
+ errors::kInvalidWebviewPartitionName, base::IntToString(i));
return false;
}
- while (relative_path[0] == '/')
- relative_path = relative_path.substr(1, relative_path.length() - 1);
- pattern.SetPath(pattern.path() + relative_path);
- info->webview_accessible_resources_.AddPattern(pattern);
- }
- const base::ListValue* partition_list = NULL;
- if (!dict_value->GetList(keys::kWebviewPrivilegedPartitions,
- &partition_list)) {
- *error = base::ASCIIToUTF16(errors::kInvalidWebviewPrivilegedPartitionList);
- return false;
- }
- for (size_t i = 0; i < partition_list->GetSize(); ++i) {
- std::string partition_wildcard;
- if (!partition_list->GetString(i, &partition_wildcard)) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidWebviewPrivilegedPartition, base::IntToString(i));
+ const base::ListValue* url_list = NULL;
+ if (!partition->GetList(keys::kWebviewAccessibleResources,
+ &url_list)) {
+ *error = base::ASCIIToUTF16(
+ errors::kInvalidWebviewAccessibleResourcesList);
+ return false;
+ }
+
+ // The URL list should have at least one entry.
+ if (url_list->GetSize() == 0) {
+ *error = base::ASCIIToUTF16(
+ errors::kInvalidWebviewAccessibleResourcesList);
return false;
}
- info->webview_privileged_partitions_.push_back(partition_wildcard);
+
+ scoped_ptr<PartitionItem> partition_item(
+ new PartitionItem(partition_pattern));
+
+ for (size_t i = 0; i < url_list->GetSize(); ++i) {
+ std::string relative_path;
+ if (!url_list->GetString(i, &relative_path)) {
+ *error = ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidWebviewAccessibleResource, base::IntToString(i));
+ return false;
+ }
+ URLPattern pattern(URLPattern::SCHEME_EXTENSION,
+ Extension::GetResourceURL(extension->url(),
+ relative_path).spec());
+ partition_item->AddPattern(pattern);
+ }
+ info->AddPartitionItem(partition_item.Pass());
}
+
extension->SetManifestData(keys::kWebviewAccessibleResources, info.release());
return true;
}
diff --git a/extensions/common/manifest_handlers/webview_info.h b/extensions/common/manifest_handlers/webview_info.h
index d32d145..dcdb400 100644
--- a/extensions/common/manifest_handlers/webview_info.h
+++ b/extensions/common/manifest_handlers/webview_info.h
@@ -7,15 +7,19 @@
#include <string>
+#include "base/memory/scoped_vector.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_handler.h"
namespace extensions {
-// A structure to hold the <webview> accessible extension resources
+class PartitionItem;
+
+// A class to hold the <webview> accessible extension resources
// that may be specified in the manifest of an extension using the
// "webview" key.
-struct WebviewInfo : public Extension::ManifestData {
+class WebviewInfo : public Extension::ManifestData {
+ public:
// Define out of line constructor/destructor to please Clang.
WebviewInfo();
virtual ~WebviewInfo();
@@ -25,13 +29,10 @@ struct WebviewInfo : public Extension::ManifestData {
const std::string& partition_id,
const std::string& relative_path);
- // Returns true when 'webview_accessible_resources' are defined for the
- // app.
- static bool HasWebviewAccessibleResources(const Extension* extension);
+ void AddPartitionItem(scoped_ptr<PartitionItem> item);
- // Optional list of webview accessible extension resources.
- std::vector<std::string> webview_privileged_partitions_;
- URLPatternSet webview_accessible_resources_;
+ private:
+ ScopedVector<PartitionItem> partition_items_;
};
// Parses the "webview" manifest key.