1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
// 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/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
#include "extensions/common/extension.h"
#include "extensions/common/feature_switch.h"
#include "extensions/common/install_warning.h"
#include "extensions/common/manifest.h"
#include "extensions/common/manifest_constants.h"
namespace extensions {
namespace errors = manifest_errors;
namespace keys = manifest_keys;
ScriptBadgeHandler::ScriptBadgeHandler() {
}
ScriptBadgeHandler::~ScriptBadgeHandler() {
}
const std::vector<std::string> ScriptBadgeHandler::PrerequisiteKeys() const {
return SingleKey(keys::kIcons);
}
bool ScriptBadgeHandler::Parse(Extension* extension, base::string16* error) {
scoped_ptr<ActionInfo> action_info(new ActionInfo);
// Provide a default script badge if one isn't declared in the manifest.
if (!extension->manifest()->HasKey(keys::kScriptBadge)) {
SetActionInfoDefaults(extension, action_info.get());
ActionInfo::SetScriptBadgeInfo(extension, action_info.release());
return true;
}
// 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(
InstallWarning(errors::kScriptBadgeRequiresFlag, keys::kScriptBadge));
}
const base::DictionaryValue* dict = NULL;
if (!extension->manifest()->GetDictionary(keys::kScriptBadge, &dict)) {
*error = ASCIIToUTF16(errors::kInvalidScriptBadge);
return false;
}
action_info = ActionInfo::Load(extension, dict, error);
if (!action_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 (!action_info->default_title.empty()) {
extension->AddInstallWarning(
InstallWarning(errors::kScriptBadgeTitleIgnored,
keys::kScriptBadge,
keys::kPageActionDefaultTitle));
}
if (!action_info->default_icon.empty()) {
extension->AddInstallWarning(
InstallWarning(errors::kScriptBadgeIconIgnored,
keys::kScriptBadge,
keys::kPageActionDefaultIcon));
}
SetActionInfoDefaults(extension, action_info.get());
ActionInfo::SetScriptBadgeInfo(extension, action_info.release());
return true;
}
bool ScriptBadgeHandler::AlwaysParseForType(Manifest::Type type) const {
return type == Manifest::TYPE_EXTENSION;
}
void ScriptBadgeHandler::SetActionInfoDefaults(const Extension* extension,
ActionInfo* info) {
info->default_title = extension->name();
info->default_icon.Clear();
for (size_t i = 0; i < extension_misc::kNumScriptBadgeIconSizes; ++i) {
std::string path = IconsInfo::GetIcons(extension).Get(
extension_misc::kScriptBadgeIconSizes[i],
ExtensionIconSet::MATCH_BIGGER);
if (!path.empty()) {
info->default_icon.Add(
extension_misc::kScriptBadgeIconSizes[i], path);
}
}
}
const std::vector<std::string> ScriptBadgeHandler::Keys() const {
return SingleKey(keys::kScriptBadge);
}
} // namespace extensions
|