ui_overrides_handler.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "base/strings/string_util.h"
9#include "base/strings/utf_string_conversions.h"
10#include "base/values.h"
11#include "extensions/common/error_utils.h"
12#include "extensions/common/extension_messages.h"
13#include "extensions/common/feature_switch.h"
14#include "extensions/common/manifest_constants.h"
15#include "extensions/common/permissions/manifest_permission.h"
16#include "extensions/common/permissions/permissions_data.h"
17#include "extensions/common/permissions/permissions_info.h"
18#include "grit/generated_resources.h"
19#include "ipc/ipc_message.h"
20#include "ui/base/l10n/l10n_util.h"
21
22using extensions::api::manifest_types::ChromeUIOverrides;
23
24namespace extensions {
25
26// The manifest permission implementation supports a permission for overriding
27// the bookmark UI.
28class UIOverridesHandler::ManifestPermissionImpl : public ManifestPermission {
29 public:
30  explicit ManifestPermissionImpl(bool override_bookmarks_ui_permission)
31      : override_bookmarks_ui_permission_(override_bookmarks_ui_permission) {}
32
33  // extensions::ManifestPermission overrides.
34  virtual std::string name() const OVERRIDE {
35    return manifest_keys::kUIOverride;
36  }
37
38  virtual std::string id() const OVERRIDE {
39    return name();
40  }
41
42  virtual bool HasMessages() const OVERRIDE {
43    return override_bookmarks_ui_permission_;
44  }
45
46  virtual PermissionMessages GetMessages() const OVERRIDE {
47    PermissionMessages result;
48    if (override_bookmarks_ui_permission_) {
49      result.push_back(PermissionMessage(
50          PermissionMessage::kOverrideBookmarksUI,
51          l10n_util::GetStringUTF16(
52              IDS_EXTENSION_PROMPT_WARNING_OVERRIDE_BOOKMARKS_UI)));
53    }
54    return result;
55  }
56
57  virtual bool FromValue(const base::Value* value) OVERRIDE {
58    return value && value->GetAsBoolean(&override_bookmarks_ui_permission_);
59  }
60
61  virtual scoped_ptr<base::Value> ToValue() const OVERRIDE {
62    return scoped_ptr<base::Value>(
63        new base::FundamentalValue(override_bookmarks_ui_permission_)).Pass();
64  }
65
66  virtual ManifestPermission* Clone() const OVERRIDE {
67    return scoped_ptr<ManifestPermissionImpl>(
68        new ManifestPermissionImpl(
69            override_bookmarks_ui_permission_)).release();
70  }
71
72  virtual ManifestPermission* Diff(const ManifestPermission* rhs) const
73      OVERRIDE {
74    const ManifestPermissionImpl* other =
75        static_cast<const ManifestPermissionImpl*>(rhs);
76
77    return scoped_ptr<ManifestPermissionImpl>(new ManifestPermissionImpl(
78        override_bookmarks_ui_permission_ &&
79        !other->override_bookmarks_ui_permission_)).release();
80  }
81
82  virtual ManifestPermission* Union(const ManifestPermission* rhs) const
83      OVERRIDE {
84    const ManifestPermissionImpl* other =
85        static_cast<const ManifestPermissionImpl*>(rhs);
86
87    return scoped_ptr<ManifestPermissionImpl>(new ManifestPermissionImpl(
88        override_bookmarks_ui_permission_ ||
89        other->override_bookmarks_ui_permission_)).release();
90  }
91
92  virtual ManifestPermission* Intersect(const ManifestPermission* rhs) const
93      OVERRIDE {
94    const ManifestPermissionImpl* other =
95        static_cast<const ManifestPermissionImpl*>(rhs);
96
97    return scoped_ptr<ManifestPermissionImpl>(new ManifestPermissionImpl(
98        override_bookmarks_ui_permission_ &&
99        other->override_bookmarks_ui_permission_)).release();
100  }
101
102  virtual bool Contains(const ManifestPermission* rhs) const OVERRIDE {
103    const ManifestPermissionImpl* other =
104        static_cast<const ManifestPermissionImpl*>(rhs);
105
106    return !other->override_bookmarks_ui_permission_ ||
107        override_bookmarks_ui_permission_;
108  }
109
110  virtual bool Equal(const ManifestPermission* rhs) const OVERRIDE {
111    const ManifestPermissionImpl* other =
112        static_cast<const ManifestPermissionImpl*>(rhs);
113
114    return override_bookmarks_ui_permission_ ==
115        other->override_bookmarks_ui_permission_;
116  }
117
118  virtual void Write(IPC::Message* m) const OVERRIDE {
119    IPC::WriteParam(m, override_bookmarks_ui_permission_);
120  }
121
122  virtual bool Read(const IPC::Message* m, PickleIterator* iter) OVERRIDE {
123    return IPC::ReadParam(m, iter, &override_bookmarks_ui_permission_);
124  }
125
126  virtual void Log(std::string* log) const OVERRIDE {
127    IPC::LogParam(override_bookmarks_ui_permission_, log);
128  }
129
130 private:
131  bool override_bookmarks_ui_permission_;
132};
133
134UIOverrides::UIOverrides() {}
135
136UIOverrides::~UIOverrides() {}
137
138const UIOverrides* UIOverrides::Get(const Extension* extension) {
139  return static_cast<UIOverrides*>(
140      extension->GetManifestData(manifest_keys::kUIOverride));
141}
142
143bool UIOverrides::RemovesBookmarkButton(const Extension* extension) {
144  const UIOverrides* ui_overrides = Get(extension);
145  return ui_overrides && ui_overrides->bookmarks_ui &&
146      ui_overrides->bookmarks_ui->remove_button &&
147      *ui_overrides->bookmarks_ui->remove_button;
148}
149
150bool UIOverrides::RemovesBookmarkShortcut(const Extension* extension) {
151  const UIOverrides* ui_overrides = Get(extension);
152  return ui_overrides && ui_overrides->bookmarks_ui &&
153      ui_overrides->bookmarks_ui->remove_bookmark_shortcut &&
154      *ui_overrides->bookmarks_ui->remove_bookmark_shortcut;
155}
156
157bool UIOverrides::RemovesBookmarkOpenPagesShortcut(const Extension* extension) {
158  const UIOverrides* ui_overrides = Get(extension);
159  return ui_overrides && ui_overrides->bookmarks_ui &&
160      ui_overrides->bookmarks_ui->remove_bookmark_open_pages_shortcut &&
161      *ui_overrides->bookmarks_ui->remove_bookmark_open_pages_shortcut;
162}
163
164UIOverridesHandler::UIOverridesHandler() {}
165
166UIOverridesHandler::~UIOverridesHandler() {}
167
168bool UIOverridesHandler::Parse(Extension* extension, base::string16* error) {
169  const base::Value* dict = NULL;
170  CHECK(extension->manifest()->Get(manifest_keys::kUIOverride, &dict));
171  scoped_ptr<ChromeUIOverrides> overrides(
172      ChromeUIOverrides::FromValue(*dict, error));
173  if (!overrides)
174    return false;
175
176  scoped_ptr<UIOverrides> info(new UIOverrides);
177  info->bookmarks_ui.swap(overrides->bookmarks_ui);
178  if (!info->bookmarks_ui) {
179    *error = ErrorUtils::FormatErrorMessageUTF16(
180        manifest_errors::kInvalidEmptyDictionary,
181        manifest_keys::kUIOverride);
182    return false;
183  }
184  info->manifest_permission.reset(new ManifestPermissionImpl(
185      info->bookmarks_ui.get() != NULL));
186  extension->SetManifestData(manifest_keys::kUIOverride, info.release());
187  return true;
188}
189
190bool UIOverridesHandler::Validate(const Extension* extension,
191                                  std::string* error,
192                                  std::vector<InstallWarning>* warnings) const {
193  const UIOverrides* ui_overrides = UIOverrides::Get(extension);
194
195  if (ui_overrides && ui_overrides->bookmarks_ui) {
196    if (!FeatureSwitch::enable_override_bookmarks_ui()->IsEnabled()) {
197      warnings->push_back(InstallWarning(
198          ErrorUtils::FormatErrorMessage(
199              manifest_errors::kUnrecognizedManifestProperty,
200              manifest_keys::kBookmarkUI,
201              manifest_keys::kUIOverride)));
202    }
203  }
204
205  return true;
206}
207
208ManifestPermission* UIOverridesHandler::CreatePermission() {
209  return new ManifestPermissionImpl(false);
210}
211
212ManifestPermission* UIOverridesHandler::CreateInitialRequiredPermission(
213    const Extension* extension) {
214  const UIOverrides* data = UIOverrides::Get(extension);
215  if (data)
216    return data->manifest_permission->Clone();
217  return NULL;
218}
219const std::vector<std::string> UIOverridesHandler::Keys() const {
220  return SingleKey(manifest_keys::kUIOverride);
221}
222
223}  // namespace extensions
224