Index: chrome/common/extensions/api/extension_action/script_badge_handler.cc |
diff --git a/chrome/common/extensions/api/extension_action/script_badge_handler.cc b/chrome/common/extensions/api/extension_action/script_badge_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0f74d77d9f27bf8ca90be299d1fe5b6b77e54916 |
--- /dev/null |
+++ b/chrome/common/extensions/api/extension_action/script_badge_handler.cc |
@@ -0,0 +1,95 @@ |
+// Copyright (c) 2012 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/api/extension_action/script_badge_handler.h" |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "base/utf_string_conversions.h" |
+#include "base/values.h" |
+#include "chrome/common/extensions/api/extension_action/action_handler_helpers.h" |
+#include "chrome/common/extensions/extension.h" |
+#include "chrome/common/extensions/extension_constants.h" |
+#include "chrome/common/extensions/extension_manifest_constants.h" |
+#include "chrome/common/extensions/feature_switch.h" |
+ |
+namespace errors = extension_manifest_errors; |
+ |
+namespace extensions { |
+ |
+// static |
+const ActionInfo* ScriptBadgeInfo::GetScriptBadge( |
+ const Extension* extension) { |
+ ScriptBadgeInfo* info = static_cast<ScriptBadgeInfo*>( |
+ extension->GetManifestData(extension_manifest_keys::kScriptBadge)); |
+ return info ? info->script_badge_info.get() : NULL; |
+} |
+ |
+ScriptBadgeHandler::ScriptBadgeHandler() { |
+} |
+ |
+ScriptBadgeHandler::~ScriptBadgeHandler() { |
+} |
+ |
+bool ScriptBadgeHandler::Parse(const base::Value* value, |
+ Extension* extension, |
+ string16* error) { |
+ scoped_ptr<ScriptBadgeInfo> info(new ScriptBadgeInfo); |
+ |
+ // So as to not confuse developers if they specify a script badge section |
+ // in the manifest, show a warning if the script badge declaration isn't |
+ // going to have any effect. |
+ if (!FeatureSwitch::script_badges()->IsEnabled()) { |
+ extension->AddInstallWarning( |
+ Extension::InstallWarning(Extension::InstallWarning::FORMAT_TEXT, |
+ errors::kScriptBadgeRequiresFlag)); |
+ } |
+ |
+ const DictionaryValue* dict = NULL; |
+ if (!value->GetAsDictionary(&dict)) { |
+ *error = ASCIIToUTF16(extension_manifest_errors::kInvalidScriptBadge); |
+ return false; |
+ } |
+ |
+ info->script_badge_info = |
+ LoadActionInfo(extension, dict, error); |
+ |
+ if (!info->script_badge_info.get()) |
+ return false; // Failed to parse script badge definition. |
+ |
+ // Script badges always use their extension's title and icon so users can rely |
+ // on the visual appearance to know which extension is running. This isn't |
+ // bulletproof since an malicious extension could use a different 16x16 icon |
+ // that matches the icon of a trusted extension, and users wouldn't be warned |
+ // during installation. |
+ |
+ if (!info->script_badge_info->default_title.empty()) { |
+ extension->AddInstallWarning( |
+ Extension::InstallWarning(Extension::InstallWarning::FORMAT_TEXT, |
+ errors::kScriptBadgeTitleIgnored)); |
+ } |
+ info->script_badge_info->default_title = extension->name(); |
+ |
+ if (!info->script_badge_info->default_icon.empty()) { |
+ extension->AddInstallWarning( |
+ Extension::InstallWarning(Extension::InstallWarning::FORMAT_TEXT, |
+ errors::kScriptBadgeIconIgnored)); |
+ } |
+ |
+ info->script_badge_info->default_icon.Clear(); |
+ for (size_t i = 0; i < extension_misc::kNumScriptBadgeIconSizes; ++i) { |
+ std::string path = extension->icons().Get( |
+ extension_misc::kScriptBadgeIconSizes[i], |
+ ExtensionIconSet::MATCH_BIGGER); |
+ if (!path.empty()) { |
+ info->script_badge_info->default_icon.Add( |
+ extension_misc::kScriptBadgeIconSizes[i], path); |
+ } |
+ } |
+ |
+ extension->SetManifestData(extension_manifest_keys::kScriptBadge, |
+ info.release()); |
+ return true; |
+} |
+ |
+} // namespace extensions |