Commit e9714794 authored by Karandeep Bhatia's avatar Karandeep Bhatia Committed by Commit Bot

Use auto-generated manifest parsing to parse "incognito" manifest key.

BUG=1113513

Change-Id: I70e687978361920419b834eb9b4c4cb2112cfc86
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2368290
Commit-Queue: Karan Bhatia <karandeepb@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807112}
parent 10317f04
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "chrome/browser/profiles/profiles_state.h" #include "chrome/browser/profiles/profiles_state.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "extensions/browser/device_local_account_util.h" #include "extensions/browser/device_local_account_util.h"
#include "extensions/common/api/incognito.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "extensions/common/manifest.h" #include "extensions/common/manifest.h"
#include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_constants.h"
...@@ -132,7 +133,7 @@ const char* const kSafeManifestEntries[] = { ...@@ -132,7 +133,7 @@ const char* const kSafeManifestEntries[] = {
// Shared Modules configuration: Import resources from another extension. // Shared Modules configuration: Import resources from another extension.
emk::kImport, emk::kImport,
emk::kIncognito, ::extensions::api::incognito::ManifestKeys::kIncognito,
// Keylogging. // Keylogging.
// emk::kInputComponents, // emk::kInputComponents,
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
[
{
"namespace": "incognito",
"description": "Dummy namepsace for the incognito manifest key.",
"types": [
{
"id": "IncognitoMode",
"type": "string",
"enum": ["split", "spanning", "not_allowed"]
}
],
"manifest_keys": {
"incognito": {
"description": "Configures whether and how the extension runs in incognito mode. Default mode is <code>spanning</code>.",
"$ref": "IncognitoMode",
"optional": true
}
}
}
]
...@@ -31,6 +31,7 @@ extensions_api_schema_files_ = [ ...@@ -31,6 +31,7 @@ extensions_api_schema_files_ = [
"management.json", "management.json",
"hid.idl", "hid.idl",
"idle.json", "idle.json",
"incognito.json",
"metrics_private.json", "metrics_private.json",
"mime_handler_private.idl", "mime_handler_private.idl",
"mime_handler_view_guest_internal.json", "mime_handler_view_guest_internal.json",
......
...@@ -74,7 +74,6 @@ const char kIcons[] = "icons"; ...@@ -74,7 +74,6 @@ const char kIcons[] = "icons";
const char kId[] = "id"; const char kId[] = "id";
const char kImeOptionsPage[] = "options_page"; const char kImeOptionsPage[] = "options_page";
const char kImport[] = "import"; const char kImport[] = "import";
const char kIncognito[] = "incognito";
const char kIncludeGlobs[] = "include_globs"; const char kIncludeGlobs[] = "include_globs";
const char kIndicator[] = "indicator"; const char kIndicator[] = "indicator";
const char kInputComponents[] = "input_components"; const char kInputComponents[] = "input_components";
...@@ -475,8 +474,6 @@ const char kInvalidImportId[] = ...@@ -475,8 +474,6 @@ const char kInvalidImportId[] =
"Invalid value for 'import[*].id'."; "Invalid value for 'import[*].id'.";
const char kInvalidImportVersion[] = const char kInvalidImportVersion[] =
"Invalid value for 'import[*].minimum_version'."; "Invalid value for 'import[*].minimum_version'.";
const char kInvalidIncognitoBehavior[] =
"Invalid value for 'incognito'.";
const char kInvalidInputComponents[] = const char kInvalidInputComponents[] =
"Invalid value for 'input_components'"; "Invalid value for 'input_components'";
const char kInvalidInputComponentDescription[] = const char kInvalidInputComponentDescription[] =
......
...@@ -75,7 +75,6 @@ extern const char kIcons[]; ...@@ -75,7 +75,6 @@ extern const char kIcons[];
extern const char kId[]; extern const char kId[];
extern const char kImeOptionsPage[]; extern const char kImeOptionsPage[];
extern const char kImport[]; extern const char kImport[];
extern const char kIncognito[];
extern const char kIncludeGlobs[]; extern const char kIncludeGlobs[];
extern const char kIndicator[]; extern const char kIndicator[];
extern const char kInputComponents[]; extern const char kInputComponents[];
...@@ -370,7 +369,6 @@ extern const char kInvalidImport[]; ...@@ -370,7 +369,6 @@ extern const char kInvalidImport[];
extern const char kInvalidImportAndExport[]; extern const char kInvalidImportAndExport[];
extern const char kInvalidImportId[]; extern const char kInvalidImportId[];
extern const char kInvalidImportVersion[]; extern const char kInvalidImportVersion[];
extern const char kInvalidIncognitoBehavior[];
extern const char kInvalidInputComponents[]; extern const char kInvalidInputComponents[];
extern const char kInvalidInputComponentDescription[]; extern const char kInvalidInputComponentDescription[];
extern const char kInvalidInputComponentLayoutName[]; extern const char kInvalidInputComponentLayoutName[];
......
...@@ -6,71 +6,64 @@ ...@@ -6,71 +6,64 @@
#include <memory> #include <memory>
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
namespace extensions { namespace extensions {
namespace keys = manifest_keys; using IncognitoManifestKeys = api::incognito::ManifestKeys;
IncognitoInfo::IncognitoInfo(Mode mode) : mode(mode) {} IncognitoInfo::IncognitoInfo(api::incognito::IncognitoMode mode) : mode(mode) {
DCHECK_NE(api::incognito::INCOGNITO_MODE_NONE, mode);
IncognitoInfo::~IncognitoInfo() {
} }
IncognitoInfo::~IncognitoInfo() = default;
// static // static
bool IncognitoInfo::IsSplitMode(const Extension* extension) { bool IncognitoInfo::IsSplitMode(const Extension* extension) {
IncognitoInfo* info = static_cast<IncognitoInfo*>( IncognitoInfo* info = static_cast<IncognitoInfo*>(
extension->GetManifestData(keys::kIncognito)); extension->GetManifestData(IncognitoManifestKeys::kIncognito));
return info ? info->mode == Mode::SPLIT : false; return info ? info->mode == api::incognito::INCOGNITO_MODE_SPLIT : false;
} }
// static // static
bool IncognitoInfo::IsIncognitoAllowed(const Extension* extension) { bool IncognitoInfo::IsIncognitoAllowed(const Extension* extension) {
IncognitoInfo* info = IncognitoInfo* info = static_cast<IncognitoInfo*>(
static_cast<IncognitoInfo*>(extension->GetManifestData(keys::kIncognito)); extension->GetManifestData(IncognitoManifestKeys::kIncognito));
return info ? info->mode != Mode::NOT_ALLOWED : true; return info ? info->mode != api::incognito::INCOGNITO_MODE_NOT_ALLOWED : true;
} }
IncognitoHandler::IncognitoHandler() { IncognitoHandler::IncognitoHandler() = default;
} IncognitoHandler::~IncognitoHandler() = default;
IncognitoHandler::~IncognitoHandler() {
}
bool IncognitoHandler::Parse(Extension* extension, base::string16* error) { bool IncognitoHandler::Parse(Extension* extension, base::string16* error) {
// Extensions and Chrome apps default to spanning mode. // Extensions and Chrome apps default to spanning mode. Hosted and legacy
// Hosted and legacy packaged apps default to split mode. // packaged apps default to split mode.
IncognitoInfo::Mode mode = api::incognito::IncognitoMode default_mode =
extension->is_hosted_app() || extension->is_legacy_packaged_app() extension->is_hosted_app() || extension->is_legacy_packaged_app()
? IncognitoInfo::Mode::SPLIT ? api::incognito::INCOGNITO_MODE_SPLIT
: IncognitoInfo::Mode::SPANNING; : api::incognito::INCOGNITO_MODE_SPANNING;
if (!extension->manifest()->HasKey(keys::kIncognito)) {
extension->SetManifestData(keys::kIncognito, // This check is necessary since the "incognito" manifest key may not be
std::make_unique<IncognitoInfo>(mode)); // available to the extension.
if (!extension->manifest()->HasKey(IncognitoManifestKeys::kIncognito)) {
extension->SetManifestData(IncognitoManifestKeys::kIncognito,
std::make_unique<IncognitoInfo>(default_mode));
return true; return true;
} }
std::string incognito_string; IncognitoManifestKeys manifest_keys;
if (!extension->manifest()->GetString(keys::kIncognito, &incognito_string)) { if (!IncognitoManifestKeys::ParseFromDictionary(
*error = base::ASCIIToUTF16(manifest_errors::kInvalidIncognitoBehavior); *extension->manifest()->value(), &manifest_keys, error)) {
return false; return false;
} }
if (incognito_string == manifest_values::kIncognitoSplit) { api::incognito::IncognitoMode mode = manifest_keys.incognito;
mode = IncognitoInfo::Mode::SPLIT;
} else if (incognito_string == manifest_values::kIncognitoSpanning) { // This will be the case if the manifest key was omitted.
mode = IncognitoInfo::Mode::SPANNING; if (mode == api::incognito::INCOGNITO_MODE_NONE)
} else if (incognito_string == manifest_values::kIncognitoNotAllowed) { mode = default_mode;
mode = IncognitoInfo::Mode::NOT_ALLOWED;
} else {
*error = base::ASCIIToUTF16(manifest_errors::kInvalidIncognitoBehavior);
return false;
}
extension->SetManifestData(keys::kIncognito, extension->SetManifestData(IncognitoManifestKeys::kIncognito,
std::make_unique<IncognitoInfo>(mode)); std::make_unique<IncognitoInfo>(mode));
return true; return true;
} }
...@@ -80,7 +73,7 @@ bool IncognitoHandler::AlwaysParseForType(Manifest::Type type) const { ...@@ -80,7 +73,7 @@ bool IncognitoHandler::AlwaysParseForType(Manifest::Type type) const {
} }
base::span<const char* const> IncognitoHandler::Keys() const { base::span<const char* const> IncognitoHandler::Keys() const {
static constexpr const char* kKeys[] = {keys::kIncognito}; static constexpr const char* kKeys[] = {IncognitoManifestKeys::kIncognito};
return kKeys; return kKeys;
} }
......
...@@ -7,23 +7,19 @@ ...@@ -7,23 +7,19 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "extensions/common/api/incognito.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "extensions/common/manifest_handler.h" #include "extensions/common/manifest_handler.h"
namespace extensions { namespace extensions {
struct IncognitoInfo : public Extension::ManifestData { struct IncognitoInfo : public Extension::ManifestData {
enum Mode { SPLIT, SPANNING, NOT_ALLOWED }; explicit IncognitoInfo(api::incognito::IncognitoMode mode);
explicit IncognitoInfo(Mode mode);
~IncognitoInfo() override; ~IncognitoInfo() override;
// If true, a separate process will be used for the extension in incognito api::incognito::IncognitoMode mode;
// mode.
Mode mode;
// Return the incognito mode information for the given |extension|. // Return whether the |extension| should run in split incognito mode.
static bool IsSplitMode(const Extension* extension); static bool IsSplitMode(const Extension* extension);
// Return whether this extension can be run in incognito mode as specified // Return whether this extension can be run in incognito mode as specified
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment