Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Side by Side Diff: chrome/common/extensions/api/extension_api.cc

Issue 8540012: Enable extension APIs for content scripts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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/api/extension_api.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/json/json_reader.h"
11 #include "base/logging.h"
12 #include "base/string_split.h"
13 #include "base/string_util.h"
14 #include "base/values.h"
15 #include "grit/common_resources.h"
16 #include "ui/base/resource/resource_bundle.h"
17
18 namespace extensions {
19
20 // static
21 ExtensionAPI* ExtensionAPI::GetInstance() {
22 return Singleton<ExtensionAPI>::get();
23 }
24
25 ExtensionAPI::ExtensionAPI() {
26 const bool kAllowTrailingCommas = false;
27 std::string error_message;
28 scoped_ptr<Value> temp_value(
29 base::JSONReader::ReadAndReturnError(
Matt Perry 2011/11/11 20:07:19 since this is used in the renderer, doesn't this m
Aaron Boodman 2011/11/11 23:12:02 In the latest patch, I've changed the place where
Matt Perry 2011/11/11 23:35:24 awesome
30 ResourceBundle::GetSharedInstance().GetRawDataResource(
31 IDR_EXTENSION_API_JSON).as_string(),
32 kAllowTrailingCommas,
33 NULL, // error code
34 &error_message));
35 CHECK(temp_value.get()) << error_message;
36 CHECK(temp_value->IsType(base::Value::TYPE_LIST))
37 << "Top-level node in extension API is not dictionary";
38
39 value_.reset(static_cast<base::ListValue*>(temp_value.release()));
40 }
41
42 bool ExtensionAPI::IsFullNameUnprivileged(const std::string& full_name) const {
43 std::vector<std::string> name_space;
44 base::SplitString(full_name, '.', &name_space);
45 std::string name = name_space.back();
46 name_space.pop_back();
47
48 base::DictionaryValue* name_space_node =
49 FindListItem(value_.get(), "namespace", JoinString(name_space, '.'));
50 CHECK(name_space_node);
51
52 return IsChildNameUnprivileged(name_space_node, "functions", name) ||
53 IsChildNameUnprivileged(name_space_node, "events", name);
54 }
55
56 DictionaryValue* ExtensionAPI::FindListItem(
57 base::ListValue* list,
58 const std::string& property_name,
59 const std::string& property_value) const {
60 for (size_t i = 0; i < list->GetSize(); ++i) {
61 DictionaryValue* item = NULL;
62 CHECK(list->GetDictionary(i, &item));
63 std::string value;
64 if (item->GetString(property_name, &value) && value == property_value)
65 return item;
66 }
67
68 return NULL;
69 }
70
71 bool ExtensionAPI::IsChildNameUnprivileged(
72 DictionaryValue* name_space_node,
73 const std::string& child_kind,
74 const std::string& child_name) const {
75 ListValue* child_list = NULL;
76 name_space_node->GetList(child_kind, &child_list);
77 if (!child_list)
78 return false;
79
80 bool unprivileged = false;
81 DictionaryValue* child = FindListItem(child_list, "name", child_name);
82 if (!child || !child->GetBoolean("unprivileged", &unprivileged))
83 return false;
84
85 return unprivileged;
86 }
87
88 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698