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 @@
#include "chrome/browser/profiles/profiles_state.h"
#include "chrome/grit/generated_resources.h"
#include "extensions/browser/device_local_account_util.h"
#include "extensions/common/api/incognito.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest.h"
#include "extensions/common/manifest_constants.h"
......@@ -132,7 +133,7 @@ const char* const kSafeManifestEntries[] = {
// Shared Modules configuration: Import resources from another extension.
emk::kImport,
emk::kIncognito,
::extensions::api::incognito::ManifestKeys::kIncognito,
// Keylogging.
// 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_ = [
"management.json",
"hid.idl",
"idle.json",
"incognito.json",
"metrics_private.json",
"mime_handler_private.idl",
"mime_handler_view_guest_internal.json",
......
......@@ -74,7 +74,6 @@ const char kIcons[] = "icons";
const char kId[] = "id";
const char kImeOptionsPage[] = "options_page";
const char kImport[] = "import";
const char kIncognito[] = "incognito";
const char kIncludeGlobs[] = "include_globs";
const char kIndicator[] = "indicator";
const char kInputComponents[] = "input_components";
......@@ -475,8 +474,6 @@ const char kInvalidImportId[] =
"Invalid value for 'import[*].id'.";
const char kInvalidImportVersion[] =
"Invalid value for 'import[*].minimum_version'.";
const char kInvalidIncognitoBehavior[] =
"Invalid value for 'incognito'.";
const char kInvalidInputComponents[] =
"Invalid value for 'input_components'";
const char kInvalidInputComponentDescription[] =
......
......@@ -75,7 +75,6 @@ extern const char kIcons[];
extern const char kId[];
extern const char kImeOptionsPage[];
extern const char kImport[];
extern const char kIncognito[];
extern const char kIncludeGlobs[];
extern const char kIndicator[];
extern const char kInputComponents[];
......@@ -370,7 +369,6 @@ extern const char kInvalidImport[];
extern const char kInvalidImportAndExport[];
extern const char kInvalidImportId[];
extern const char kInvalidImportVersion[];
extern const char kInvalidIncognitoBehavior[];
extern const char kInvalidInputComponents[];
extern const char kInvalidInputComponentDescription[];
extern const char kInvalidInputComponentLayoutName[];
......
......@@ -6,71 +6,64 @@
#include <memory>
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
namespace extensions {
namespace keys = manifest_keys;
using IncognitoManifestKeys = api::incognito::ManifestKeys;
IncognitoInfo::IncognitoInfo(Mode mode) : mode(mode) {}
IncognitoInfo::~IncognitoInfo() {
IncognitoInfo::IncognitoInfo(api::incognito::IncognitoMode mode) : mode(mode) {
DCHECK_NE(api::incognito::INCOGNITO_MODE_NONE, mode);
}
IncognitoInfo::~IncognitoInfo() = default;
// static
bool IncognitoInfo::IsSplitMode(const Extension* extension) {
IncognitoInfo* info = static_cast<IncognitoInfo*>(
extension->GetManifestData(keys::kIncognito));
return info ? info->mode == Mode::SPLIT : false;
extension->GetManifestData(IncognitoManifestKeys::kIncognito));
return info ? info->mode == api::incognito::INCOGNITO_MODE_SPLIT : false;
}
// static
bool IncognitoInfo::IsIncognitoAllowed(const Extension* extension) {
IncognitoInfo* info =
static_cast<IncognitoInfo*>(extension->GetManifestData(keys::kIncognito));
return info ? info->mode != Mode::NOT_ALLOWED : true;
}
IncognitoHandler::IncognitoHandler() {
IncognitoInfo* info = static_cast<IncognitoInfo*>(
extension->GetManifestData(IncognitoManifestKeys::kIncognito));
return info ? info->mode != api::incognito::INCOGNITO_MODE_NOT_ALLOWED : true;
}
IncognitoHandler::~IncognitoHandler() {
}
IncognitoHandler::IncognitoHandler() = default;
IncognitoHandler::~IncognitoHandler() = default;
bool IncognitoHandler::Parse(Extension* extension, base::string16* error) {
// Extensions and Chrome apps default to spanning mode.
// Hosted and legacy packaged apps default to split mode.
IncognitoInfo::Mode mode =
// Extensions and Chrome apps default to spanning mode. Hosted and legacy
// packaged apps default to split mode.
api::incognito::IncognitoMode default_mode =
extension->is_hosted_app() || extension->is_legacy_packaged_app()
? IncognitoInfo::Mode::SPLIT
: IncognitoInfo::Mode::SPANNING;
if (!extension->manifest()->HasKey(keys::kIncognito)) {
extension->SetManifestData(keys::kIncognito,
std::make_unique<IncognitoInfo>(mode));
? api::incognito::INCOGNITO_MODE_SPLIT
: api::incognito::INCOGNITO_MODE_SPANNING;
// This check is necessary since the "incognito" manifest key may not be
// available to the extension.
if (!extension->manifest()->HasKey(IncognitoManifestKeys::kIncognito)) {
extension->SetManifestData(IncognitoManifestKeys::kIncognito,
std::make_unique<IncognitoInfo>(default_mode));
return true;
}
std::string incognito_string;
if (!extension->manifest()->GetString(keys::kIncognito, &incognito_string)) {
*error = base::ASCIIToUTF16(manifest_errors::kInvalidIncognitoBehavior);
IncognitoManifestKeys manifest_keys;
if (!IncognitoManifestKeys::ParseFromDictionary(
*extension->manifest()->value(), &manifest_keys, error)) {
return false;
}
if (incognito_string == manifest_values::kIncognitoSplit) {
mode = IncognitoInfo::Mode::SPLIT;
} else if (incognito_string == manifest_values::kIncognitoSpanning) {
mode = IncognitoInfo::Mode::SPANNING;
} else if (incognito_string == manifest_values::kIncognitoNotAllowed) {
mode = IncognitoInfo::Mode::NOT_ALLOWED;
} else {
*error = base::ASCIIToUTF16(manifest_errors::kInvalidIncognitoBehavior);
return false;
}
api::incognito::IncognitoMode mode = manifest_keys.incognito;
// This will be the case if the manifest key was omitted.
if (mode == api::incognito::INCOGNITO_MODE_NONE)
mode = default_mode;
extension->SetManifestData(keys::kIncognito,
extension->SetManifestData(IncognitoManifestKeys::kIncognito,
std::make_unique<IncognitoInfo>(mode));
return true;
}
......@@ -80,7 +73,7 @@ bool IncognitoHandler::AlwaysParseForType(Manifest::Type type) 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;
}
......
......@@ -7,23 +7,19 @@
#include "base/macros.h"
#include "base/strings/string16.h"
#include "extensions/common/api/incognito.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_handler.h"
namespace extensions {
struct IncognitoInfo : public Extension::ManifestData {
enum Mode { SPLIT, SPANNING, NOT_ALLOWED };
explicit IncognitoInfo(Mode mode);
explicit IncognitoInfo(api::incognito::IncognitoMode mode);
~IncognitoInfo() override;
// If true, a separate process will be used for the extension in incognito
// mode.
Mode mode;
api::incognito::IncognitoMode 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);
// 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