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

Side by Side Diff: extensions/renderer/dispatcher.cc

Issue 404883002: Allow extension APIs to be called from WebUI. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: android compile Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "extensions/renderer/dispatcher.h" 5 #include "extensions/renderer/dispatcher.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/alias.h" 10 #include "base/debug/alias.h"
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 } 369 }
370 370
371 bool Dispatcher::CheckContextAccessToExtensionAPI( 371 bool Dispatcher::CheckContextAccessToExtensionAPI(
372 const std::string& function_name, 372 const std::string& function_name,
373 ScriptContext* context) const { 373 ScriptContext* context) const {
374 if (!context) { 374 if (!context) {
375 DLOG(ERROR) << "Not in a v8::Context"; 375 DLOG(ERROR) << "Not in a v8::Context";
376 return false; 376 return false;
377 } 377 }
378 378
379 if (!context->extension()) {
380 context->isolate()->ThrowException(v8::Exception::Error(
381 v8::String::NewFromUtf8(context->isolate(), "Not in an extension.")));
382 return false;
383 }
384
385 // Theoretically we could end up with bindings being injected into sandboxed 379 // Theoretically we could end up with bindings being injected into sandboxed
386 // frames, for example content scripts. Don't let them execute API functions. 380 // frames, for example content scripts. Don't let them execute API functions.
387 blink::WebFrame* frame = context->web_frame(); 381 blink::WebFrame* frame = context->web_frame();
388 if (IsSandboxedPage(ScriptContext::GetDataSourceURLForFrame(frame))) { 382 if (IsSandboxedPage(ScriptContext::GetDataSourceURLForFrame(frame))) {
389 static const char kMessage[] = 383 static const char kMessage[] =
390 "%s cannot be used within a sandboxed frame."; 384 "%s cannot be used within a sandboxed frame.";
391 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str()); 385 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str());
392 context->isolate()->ThrowException(v8::Exception::Error( 386 context->isolate()->ThrowException(v8::Exception::Error(
393 v8::String::NewFromUtf8(context->isolate(), error_msg.c_str()))); 387 v8::String::NewFromUtf8(context->isolate(), error_msg.c_str())));
394 return false; 388 return false;
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 break; 845 break;
852 } 846 }
853 } 847 }
854 if (runtime_is_available) 848 if (runtime_is_available)
855 RegisterBinding("runtime", context); 849 RegisterBinding("runtime", context);
856 break; 850 break;
857 } 851 }
858 852
859 case Feature::BLESSED_EXTENSION_CONTEXT: 853 case Feature::BLESSED_EXTENSION_CONTEXT:
860 case Feature::UNBLESSED_EXTENSION_CONTEXT: 854 case Feature::UNBLESSED_EXTENSION_CONTEXT:
861 case Feature::CONTENT_SCRIPT_CONTEXT: { 855 case Feature::CONTENT_SCRIPT_CONTEXT:
856 case Feature::WEBUI_CONTEXT: {
862 // Extension context; iterate through all the APIs and bind the available 857 // Extension context; iterate through all the APIs and bind the available
863 // ones. 858 // ones.
864 const FeatureProvider* api_feature_provider = 859 const FeatureProvider* api_feature_provider =
865 FeatureProvider::GetAPIFeatures(); 860 FeatureProvider::GetAPIFeatures();
866 const std::vector<std::string>& apis = 861 const std::vector<std::string>& apis =
867 api_feature_provider->GetAllFeatureNames(); 862 api_feature_provider->GetAllFeatureNames();
868 for (std::vector<std::string>::const_iterator it = apis.begin(); 863 for (std::vector<std::string>::const_iterator it = apis.begin();
869 it != apis.end(); 864 it != apis.end();
870 ++it) { 865 ++it) {
871 const std::string& api_name = *it; 866 const std::string& api_name = *it;
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 1124
1130 // TODO(kalman): This isUnique() check is wrong, it should be performed as 1125 // TODO(kalman): This isUnique() check is wrong, it should be performed as
1131 // part of IsSandboxedPage(). 1126 // part of IsSandboxedPage().
1132 if (!origin.isUnique() && extensions_.ExtensionBindingsAllowed(url)) { 1127 if (!origin.isUnique() && extensions_.ExtensionBindingsAllowed(url)) {
1133 if (!extension) // TODO(kalman): when does this happen? 1128 if (!extension) // TODO(kalman): when does this happen?
1134 return Feature::UNSPECIFIED_CONTEXT; 1129 return Feature::UNSPECIFIED_CONTEXT;
1135 return extension->is_hosted_app() ? Feature::BLESSED_WEB_PAGE_CONTEXT 1130 return extension->is_hosted_app() ? Feature::BLESSED_WEB_PAGE_CONTEXT
1136 : Feature::UNBLESSED_EXTENSION_CONTEXT; 1131 : Feature::UNBLESSED_EXTENSION_CONTEXT;
1137 } 1132 }
1138 1133
1139 if (url.is_valid()) 1134 if (!url.is_valid())
1140 return Feature::WEB_PAGE_CONTEXT; 1135 return Feature::UNSPECIFIED_CONTEXT;
1141 1136
1142 return Feature::UNSPECIFIED_CONTEXT; 1137 if (url.SchemeIs(content::kChromeUIScheme))
1138 return Feature::WEBUI_CONTEXT;
1139
1140 return Feature::WEB_PAGE_CONTEXT;
1143 } 1141 }
1144 1142
1145 v8::Handle<v8::Object> Dispatcher::GetOrCreateObject( 1143 v8::Handle<v8::Object> Dispatcher::GetOrCreateObject(
1146 const v8::Handle<v8::Object>& object, 1144 const v8::Handle<v8::Object>& object,
1147 const std::string& field, 1145 const std::string& field,
1148 v8::Isolate* isolate) { 1146 v8::Isolate* isolate) {
1149 v8::Handle<v8::String> key = v8::String::NewFromUtf8(isolate, field.c_str()); 1147 v8::Handle<v8::String> key = v8::String::NewFromUtf8(isolate, field.c_str());
1150 // If the object has a callback property, it is assumed it is an unavailable 1148 // If the object has a callback property, it is assumed it is an unavailable
1151 // API, so it is safe to delete. This is checked before GetOrCreateObject is 1149 // API, so it is safe to delete. This is checked before GetOrCreateObject is
1152 // called. 1150 // called.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1208 return v8::Handle<v8::Object>(); 1206 return v8::Handle<v8::Object>();
1209 1207
1210 if (bind_name) 1208 if (bind_name)
1211 *bind_name = split.back(); 1209 *bind_name = split.back();
1212 1210
1213 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) 1211 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context))
1214 : bind_object; 1212 : bind_object;
1215 } 1213 }
1216 1214
1217 } // namespace extensions 1215 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/common/features/simple_feature_unittest.cc ('k') | extensions/renderer/resources/binding.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698