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

Side by Side Diff: chrome/browser/extensions/requirements_checker.cc

Issue 10689097: Enforce the 'requirements' field in manifests. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Conforming to the doc Created 8 years, 4 months 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
OLDNEW
(Empty)
1 // Copyright (c) 2012 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/browser/extensions/requirements_checker.h"
6
7 #include "base/bind.h"
8 #include "base/utf_string_conversions.h"
9 #include "chrome/browser/gpu_feature_checker.h"
10 #include "chrome/common/extensions/extension_manifest_constants.h"
11 #include "chrome/common/extensions/extension.h"
12 #include "chrome/common/extensions/manifest.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "content/public/common/gpu_feature_type.h"
15
16 namespace keys = extension_manifest_keys;
17
18 namespace {
19
20 const char* kWebGlError = "WebGL is not supported";
21 const char* kCSS3dError = "CSS3d is not supported";
22 #if defined(OS_CHROMEOS)
23 const char* kPluginsError = "Plugins are not supported";
24 #endif
25
26 } // namespace
27
28 namespace extensions {
29
30 bool RequirementsChecker::checked_for_webgl_ = false;
31 bool RequirementsChecker::webgl_supported_ = false;
32 bool RequirementsChecker::checked_for_css3d_ = false;
33 bool RequirementsChecker::css3d_supported_ = false;
34
35 RequirementsChecker::RequirementsChecker()
36 : async_requirement_checks_(0) {
37 }
38
39 RequirementsChecker::~RequirementsChecker() {
40 }
41
42 void RequirementsChecker::Check(scoped_refptr<const Extension> extension,
43 base::Callback<void(std::vector<std::string>)> callback,
44 content::BrowserThread::ID callback_thread) {
45 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
46
47 callback_ = callback;
48 callback_thread_ = callback_thread;
49 DictionaryValue* requirements_value = NULL;
50 extension->manifest()->GetDictionary(keys::kRequirements,
51 &requirements_value);
52 if (!requirements_value) {
53 content::BrowserThread::PostTask(callback_thread_, FROM_HERE,
54 base::Bind(&RequirementsChecker::CallbackOnCorrectThread,
55 base::Unretained(this)));
Aaron Boodman 2012/07/30 12:15:11 Unretained is almost always a bad idea. If this cl
eaugusti 2012/07/30 20:03:17 Done.
56 return;
57 }
58
59 for (DictionaryValue::key_iterator it = requirements_value->begin_keys();
60 it != requirements_value->end_keys(); ++it) {
61 DictionaryValue* requirement_value;
62 if (!requirements_value->GetDictionaryWithoutPathExpansion(*it,
63 &requirement_value) || !requirement_value) {
64 continue;
65 }
66
67 if (*it == "plugins") {
68 #if defined(OS_CHROMEOS)
69 errors_.push_back(kPluginsError);
70 #endif
71 } else if (*it == "3D") {
72 ListValue* features;
73 if (!requirement_value->GetListWithoutPathExpansion("features",
74 &features) ||
75 !features) {
76 errors_.push_back("Improperly formatted requirement features for 3D");
77 continue;
78 }
79
80 std::string feature;
81 base::ListValue::iterator it;
82 for (it = features->begin(); it != features->end(); ++it) {
83 if ((*it)->GetAsString(&feature)) {
84 if (feature == "webgl") {
85 if (checked_for_webgl_) {
86 if (!webgl_supported_)
87 errors_.push_back(kWebGlError);
88 } else {
89 ++async_requirement_checks_;
90 webgl_checker_ = new GPUFeatureChecker(
91 content::GPU_FEATURE_TYPE_WEBGL,
92 base::Bind(&RequirementsChecker::IsWebGLAvailable,
93 base::Unretained(this)));
94 }
95 } else if (feature == "css3d") {
96 if (checked_for_css3d_) {
97 if (!css3d_supported_) {
98 errors_.push_back(kCSS3dError);
99 }
100 } else {
101 ++async_requirement_checks_;
102 css3d_checker_ = new GPUFeatureChecker(
103 content::GPU_FEATURE_TYPE_ACCELERATED_COMPOSITING,
104 base::Bind(&RequirementsChecker::IsCSS3dAvailable,
105 base::Unretained(this)));
106 }
107 }
108 }
109 }
110 }
111 }
112
113 if (!async_requirement_checks_) {
114 content::BrowserThread::PostTask(callback_thread_, FROM_HERE,
115 base::Bind(&RequirementsChecker::CallbackOnCorrectThread,
116 base::Unretained(this)));
117 return;
118 }
119 // Running the GPU checkers down here removes any race condition that arises
120 // from the use of async_requirement_checks_.
121 if (webgl_checker_.get())
122 webgl_checker_->CheckGPUFeatureAvailability();
123 if (css3d_checker_.get())
124 css3d_checker_->CheckGPUFeatureAvailability();
125 }
126
127 void RequirementsChecker::IsWebGLAvailable(bool available) {
128 webgl_supported_ = available;
129 checked_for_webgl_ = true;
130 if (!webgl_supported_)
131 errors_.push_back(kWebGlError);
132 MaybeRunCallback();
133 }
134
135 void RequirementsChecker::IsCSS3dAvailable(bool available) {
136 css3d_supported_ = available;
137 checked_for_css3d_ = true;
138 if (!css3d_supported_)
139 errors_.push_back(kCSS3dError);
140 MaybeRunCallback();
141 }
142
143 void RequirementsChecker::MaybeRunCallback() {
144 async_requirement_checks_lock_.Acquire();
145 if (!--async_requirement_checks_) {
146 content::BrowserThread::PostTask(callback_thread_, FROM_HERE,
147 base::Bind(&RequirementsChecker::CallbackOnCorrectThread,
148 base::Unretained(this)));
149 }
150 async_requirement_checks_lock_.Release();
151 }
152
153 void RequirementsChecker::CallbackOnCorrectThread() {
154 DCHECK(content::BrowserThread::CurrentlyOn(callback_thread_));
155 callback_.Run(errors_);
156 }
157
158 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698