Extensions: Simplify extension page CSP parsing.

This CL simplifies the CSP parsing logic for extension pages a bit. It should
introduce no behavior change.

BUG=914224

Change-Id: I5c1c2fbcc48364f0e013b16fa6d545da428193b1
Reviewed-on: https://chromium-review.googlesource.com/c/1391361
Reviewed-by: Devlin <rdevlin.cronin@chromium.org>
Commit-Queue: Karan Bhatia <karandeepb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#619079}
diff --git a/extensions/common/api/_manifest_features.json b/extensions/common/api/_manifest_features.json
index 159cbb5..8563424 100644
--- a/extensions/common/api/_manifest_features.json
+++ b/extensions/common/api/_manifest_features.json
@@ -113,12 +113,6 @@
     // app.content_security_policy whitelist).
     "extension_types": ["extension", "legacy_packaged_app"]
   },
-  "content_security_policy.extension_pages": {
-    // TODO(crbug.com/914224): Keep the channel in sync with the check in
-    // csp_info.cc.
-    "channel": "trunk",
-    "extension_types": ["extension"]
-  },
   "current_locale": {
     "channel": "stable",
     "extension_types": "all"
diff --git a/extensions/common/manifest_handlers/csp_info.cc b/extensions/common/manifest_handlers/csp_info.cc
index 1c33a84..7e5148b 100644
--- a/extensions/common/manifest_handlers/csp_info.cc
+++ b/extensions/common/manifest_handlers/csp_info.cc
@@ -119,68 +119,60 @@
 
 bool CSPHandler::Parse(Extension* extension, base::string16* error) {
   const std::string key = Keys()[0];
-  if (!extension->manifest()->HasPath(key))
-    return SetDefaultExtensionPagesCSP(extension);
-
   // The "content_security_policy" manifest key can either be a string or a
   // dictionary of the format
   // "content_security_policy" : {
   //     "extension_pages" : ""
   //  }
-  const base::DictionaryValue* csp_dict = nullptr;
-  std::string content_security_policy;
+  const base::Value* csp = nullptr;
+  bool result = extension->manifest()->Get(key, &csp);
+  DCHECK_EQ(result, !!csp);
 
   // TODO(crbug.com/914224): Remove the channel check once the support for the
   // dictionary key is launched to other channels.
   bool csp_dictionary_supported =
       !is_platform_app_ &&
       GetCurrentChannel() == version_info::Channel::UNKNOWN;
-  if (csp_dictionary_supported &&
-      extension->manifest()->GetDictionary(key, &csp_dict))
-    return ParseCSPDictionary(extension, error, *csp_dict);
+  if (csp_dictionary_supported && csp && csp->is_dict())
+    return ParseCSPDictionary(extension, error, *csp);
 
-  if (extension->manifest()->GetString(key, &content_security_policy)) {
-    return ParseExtensionPagesCSP(extension, error, key,
-                                  content_security_policy);
-  }
-
-  *error = GetInvalidManifestKeyError(key);
-  return false;
+  return ParseExtensionPagesCSP(extension, error, key, csp);
 }
 
 bool CSPHandler::ParseCSPDictionary(Extension* extension,
                                     base::string16* error,
                                     const base::Value& csp_dict) {
   DCHECK(csp_dict.is_dict());
-
-  auto* extension_pages_csp = csp_dict.FindKey(kExtensionPagesKey);
-  if (!extension_pages_csp)
-    return SetDefaultExtensionPagesCSP(extension);
-
-  if (!extension_pages_csp->is_string()) {
-    *error = GetInvalidManifestKeyError(kExtensionPagesPath);
-    return false;
-  }
-
   return ParseExtensionPagesCSP(extension, error, kExtensionPagesPath,
-                                extension_pages_csp->GetString());
+                                csp_dict.FindKey(kExtensionPagesKey));
 }
 
 bool CSPHandler::ParseExtensionPagesCSP(
     Extension* extension,
     base::string16* error,
     const std::string& manifest_key,
-    const std::string& content_security_policy) {
-  if (!ContentSecurityPolicyIsLegal(content_security_policy)) {
+    const base::Value* content_security_policy) {
+  if (!content_security_policy)
+    return SetDefaultExtensionPagesCSP(extension);
+
+  if (!content_security_policy->is_string()) {
     *error = GetInvalidManifestKeyError(manifest_key);
     return false;
   }
+
+  const std::string& content_security_policy_str =
+      content_security_policy->GetString();
+  if (!ContentSecurityPolicyIsLegal(content_security_policy_str)) {
+    *error = GetInvalidManifestKeyError(manifest_key);
+    return false;
+  }
+
   std::vector<InstallWarning> warnings;
   // TODO(crbug.com/914224): For manifest V3, instead of sanitizing the
   // extension provided csp value and raising install warnings, see if we want
   // to raise errors and prevent the extension from loading.
   std::string sanitized_content_security_policy = SanitizeContentSecurityPolicy(
-      content_security_policy, GetValidatorOptions(extension), &warnings);
+      content_security_policy_str, GetValidatorOptions(extension), &warnings);
   extension->AddInstallWarnings(std::move(warnings));
 
   extension->SetManifestData(
diff --git a/extensions/common/manifest_handlers/csp_info.h b/extensions/common/manifest_handlers/csp_info.h
index 2aea0af..5f5d0b02 100644
--- a/extensions/common/manifest_handlers/csp_info.h
+++ b/extensions/common/manifest_handlers/csp_info.h
@@ -53,7 +53,7 @@
   bool ParseExtensionPagesCSP(Extension* extension,
                               base::string16* error,
                               const std::string& manifest_key,
-                              const std::string& content_security_policy);
+                              const base::Value* content_security_policy);
 
   // Sets the default CSP value for the extension.
   bool SetDefaultExtensionPagesCSP(Extension* extension);