summaryrefslogtreecommitdiff
path: root/chromium/chrome/common/extensions/manifest_handlers/ui_overrides_handler.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-03-05 14:36:22 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-03-05 14:37:32 +0100
commit28db9b54de6402bd38770ecc1d620255e9d1e78f (patch)
tree469a957ff6b9b6d0ee9fb4074b9139cbaa050443 /chromium/chrome/common/extensions/manifest_handlers/ui_overrides_handler.cc
parent3239a38a9b35d29e483b7bd67b786b4f9d109908 (diff)
parent248b70b82a40964d5594eb04feca0fa36716185d (diff)
downloadqtwebengine-chromium-28db9b54de6402bd38770ecc1d620255e9d1e78f.tar.gz
Merge remote-tracking branch 'origin/upstream-master' into 79-based
Conflicts: chromium/chrome/common/pref_names.cc chromium/chrome/common/pref_names.h Change-Id: I9be20fb8dfd946e3db1fa298dce076db5fd1f397
Diffstat (limited to 'chromium/chrome/common/extensions/manifest_handlers/ui_overrides_handler.cc')
-rw-r--r--chromium/chrome/common/extensions/manifest_handlers/ui_overrides_handler.cc181
1 files changed, 181 insertions, 0 deletions
diff --git a/chromium/chrome/common/extensions/manifest_handlers/ui_overrides_handler.cc b/chromium/chrome/common/extensions/manifest_handlers/ui_overrides_handler.cc
new file mode 100644
index 00000000000..51c6303f21e
--- /dev/null
+++ b/chromium/chrome/common/extensions/manifest_handlers/ui_overrides_handler.cc
@@ -0,0 +1,181 @@
+// Copyright 2013 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.
+
+#include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h"
+
+#include <memory>
+
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/grit/generated_resources.h"
+#include "extensions/common/error_utils.h"
+#include "extensions/common/feature_switch.h"
+#include "extensions/common/manifest_constants.h"
+#include "extensions/common/permissions/manifest_permission.h"
+#include "extensions/common/permissions/permissions_data.h"
+#include "extensions/common/permissions/permissions_info.h"
+#include "ipc/ipc_message.h"
+
+using extensions::api::manifest_types::ChromeUIOverrides;
+
+namespace extensions {
+
+// The manifest permission implementation supports a permission for overriding
+// the bookmark UI.
+class UIOverridesHandler::ManifestPermissionImpl : public ManifestPermission {
+ public:
+ explicit ManifestPermissionImpl(bool override_bookmarks_ui_permission)
+ : override_bookmarks_ui_permission_(override_bookmarks_ui_permission) {}
+
+ // extensions::ManifestPermission overrides.
+ std::string name() const override { return manifest_keys::kUIOverride; }
+
+ std::string id() const override { return name(); }
+
+ PermissionIDSet GetPermissions() const override {
+ PermissionIDSet permissions;
+ if (override_bookmarks_ui_permission_) {
+ // TODO(sashab): Add rule to ChromePermissionMessageProvider:
+ // kOverrideBookmarksUI ->
+ // IDS_EXTENSION_PROMPT_WARNING_OVERRIDE_BOOKMARKS_UI
+ permissions.insert(APIPermission::kOverrideBookmarksUI);
+ }
+ return permissions;
+ }
+
+ bool FromValue(const base::Value* value) override {
+ return value && value->GetAsBoolean(&override_bookmarks_ui_permission_);
+ }
+
+ std::unique_ptr<base::Value> ToValue() const override {
+ return std::unique_ptr<base::Value>(
+ new base::Value(override_bookmarks_ui_permission_));
+ }
+
+ std::unique_ptr<ManifestPermission> Diff(
+ const ManifestPermission* rhs) const override {
+ const ManifestPermissionImpl* other =
+ static_cast<const ManifestPermissionImpl*>(rhs);
+
+ return std::make_unique<ManifestPermissionImpl>(
+ override_bookmarks_ui_permission_ &&
+ !other->override_bookmarks_ui_permission_);
+ }
+
+ std::unique_ptr<ManifestPermission> Union(
+ const ManifestPermission* rhs) const override {
+ const ManifestPermissionImpl* other =
+ static_cast<const ManifestPermissionImpl*>(rhs);
+
+ return std::make_unique<ManifestPermissionImpl>(
+ override_bookmarks_ui_permission_ ||
+ other->override_bookmarks_ui_permission_);
+ }
+
+ std::unique_ptr<ManifestPermission> Intersect(
+ const ManifestPermission* rhs) const override {
+ const ManifestPermissionImpl* other =
+ static_cast<const ManifestPermissionImpl*>(rhs);
+
+ return std::make_unique<ManifestPermissionImpl>(
+ override_bookmarks_ui_permission_ &&
+ other->override_bookmarks_ui_permission_);
+ }
+
+ private:
+ bool override_bookmarks_ui_permission_;
+};
+
+UIOverrides::UIOverrides() {}
+
+UIOverrides::~UIOverrides() {}
+
+const UIOverrides* UIOverrides::Get(const Extension* extension) {
+ return static_cast<UIOverrides*>(
+ extension->GetManifestData(manifest_keys::kUIOverride));
+}
+
+bool UIOverrides::RemovesBookmarkButton(const Extension* extension) {
+ const UIOverrides* ui_overrides = Get(extension);
+ return ui_overrides && ui_overrides->bookmarks_ui &&
+ ui_overrides->bookmarks_ui->remove_button &&
+ *ui_overrides->bookmarks_ui->remove_button;
+}
+
+bool UIOverrides::RemovesBookmarkShortcut(const Extension* extension) {
+ const UIOverrides* ui_overrides = Get(extension);
+ return ui_overrides && ui_overrides->bookmarks_ui &&
+ ui_overrides->bookmarks_ui->remove_bookmark_shortcut &&
+ *ui_overrides->bookmarks_ui->remove_bookmark_shortcut;
+}
+
+bool UIOverrides::RemovesBookmarkAllTabsShortcut(const Extension* extension) {
+ const UIOverrides* ui_overrides = Get(extension);
+ return ui_overrides && ui_overrides->bookmarks_ui &&
+ ui_overrides->bookmarks_ui->remove_bookmark_open_pages_shortcut &&
+ *ui_overrides->bookmarks_ui->remove_bookmark_open_pages_shortcut;
+}
+
+UIOverridesHandler::UIOverridesHandler() {}
+
+UIOverridesHandler::~UIOverridesHandler() {}
+
+bool UIOverridesHandler::Parse(Extension* extension, base::string16* error) {
+ const base::Value* dict = NULL;
+ CHECK(extension->manifest()->Get(manifest_keys::kUIOverride, &dict));
+ std::unique_ptr<ChromeUIOverrides> overrides(
+ ChromeUIOverrides::FromValue(*dict, error));
+ if (!overrides)
+ return false;
+
+ std::unique_ptr<UIOverrides> info(new UIOverrides);
+ info->bookmarks_ui.swap(overrides->bookmarks_ui);
+ if (!info->bookmarks_ui) {
+ *error = ErrorUtils::FormatErrorMessageUTF16(
+ manifest_errors::kInvalidEmptyDictionary,
+ manifest_keys::kUIOverride);
+ return false;
+ }
+ info->manifest_permission.reset(new ManifestPermissionImpl(
+ info->bookmarks_ui.get() != NULL));
+ extension->SetManifestData(manifest_keys::kUIOverride, std::move(info));
+ return true;
+}
+
+bool UIOverridesHandler::Validate(const Extension* extension,
+ std::string* error,
+ std::vector<InstallWarning>* warnings) const {
+ const UIOverrides* ui_overrides = UIOverrides::Get(extension);
+
+ if (ui_overrides && ui_overrides->bookmarks_ui) {
+ if (!FeatureSwitch::enable_override_bookmarks_ui()->IsEnabled()) {
+ warnings->push_back(InstallWarning(
+ ErrorUtils::FormatErrorMessage(
+ manifest_errors::kUnrecognizedManifestProperty,
+ manifest_keys::kBookmarkUI,
+ manifest_keys::kUIOverride)));
+ }
+ }
+
+ return true;
+}
+
+ManifestPermission* UIOverridesHandler::CreatePermission() {
+ return new ManifestPermissionImpl(false);
+}
+
+ManifestPermission* UIOverridesHandler::CreateInitialRequiredPermission(
+ const Extension* extension) {
+ const UIOverrides* data = UIOverrides::Get(extension);
+ if (data)
+ return data->manifest_permission->Clone().release();
+ return NULL;
+}
+base::span<const char* const> UIOverridesHandler::Keys() const {
+ static constexpr const char* kKeys[] = {manifest_keys::kUIOverride};
+ return kKeys;
+}
+
+} // namespace extensions