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

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

Issue 1167423002: Use V8 Maybe APIs in extensions/renderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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
« no previous file with comments | « extensions/renderer/safe_builtins.cc ('k') | extensions/renderer/send_request_natives.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/script_context.h" 5 #include "extensions/renderer/script_context.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/string_split.h" 9 #include "base/strings/string_split.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "content/public/child/v8_value_converter.h" 13 #include "content/public/child/v8_value_converter.h"
14 #include "content/public/common/url_constants.h" 14 #include "content/public/common/url_constants.h"
15 #include "content/public/renderer/render_frame.h" 15 #include "content/public/renderer/render_frame.h"
16 #include "content/public/renderer/render_view.h" 16 #include "content/public/renderer/render_view.h"
17 #include "extensions/common/constants.h" 17 #include "extensions/common/constants.h"
18 #include "extensions/common/extension.h" 18 #include "extensions/common/extension.h"
19 #include "extensions/common/extension_api.h" 19 #include "extensions/common/extension_api.h"
20 #include "extensions/common/extension_set.h" 20 #include "extensions/common/extension_set.h"
21 #include "extensions/common/extension_urls.h" 21 #include "extensions/common/extension_urls.h"
22 #include "extensions/common/features/base_feature_provider.h" 22 #include "extensions/common/features/base_feature_provider.h"
23 #include "extensions/common/manifest_handlers/sandboxed_page_info.h" 23 #include "extensions/common/manifest_handlers/sandboxed_page_info.h"
24 #include "extensions/common/permissions/permissions_data.h" 24 #include "extensions/common/permissions/permissions_data.h"
25 #include "extensions/renderer/v8_maybe_helpers.h"
25 #include "gin/per_context_data.h" 26 #include "gin/per_context_data.h"
26 #include "third_party/WebKit/public/web/WebDataSource.h" 27 #include "third_party/WebKit/public/web/WebDataSource.h"
27 #include "third_party/WebKit/public/web/WebDocument.h" 28 #include "third_party/WebKit/public/web/WebDocument.h"
28 #include "third_party/WebKit/public/web/WebFrame.h" 29 #include "third_party/WebKit/public/web/WebFrame.h"
29 #include "third_party/WebKit/public/web/WebLocalFrame.h" 30 #include "third_party/WebKit/public/web/WebLocalFrame.h"
30 #include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h" 31 #include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
31 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" 32 #include "third_party/WebKit/public/web/WebSecurityOrigin.h"
32 #include "third_party/WebKit/public/web/WebView.h" 33 #include "third_party/WebKit/public/web/WebView.h"
33 #include "v8/include/v8.h" 34 #include "v8/include/v8.h"
34 35
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 v8::EscapableHandleScope handle_scope(isolate()); 175 v8::EscapableHandleScope handle_scope(isolate());
175 v8::Context::Scope scope(v8_context()); 176 v8::Context::Scope scope(v8_context());
176 177
177 blink::WebScopedMicrotaskSuppression suppression; 178 blink::WebScopedMicrotaskSuppression suppression;
178 if (!is_valid_) { 179 if (!is_valid_) {
179 return handle_scope.Escape( 180 return handle_scope.Escape(
180 v8::Local<v8::Primitive>(v8::Undefined(isolate()))); 181 v8::Local<v8::Primitive>(v8::Undefined(isolate())));
181 } 182 }
182 183
183 v8::Local<v8::Object> global = v8_context()->Global(); 184 v8::Local<v8::Object> global = v8_context()->Global();
184 if (!web_frame_) 185 if (!web_frame_) {
185 return handle_scope.Escape(function->Call(global, argc, argv)); 186 v8::Local<v8::Value> result;
187 if (function->Call(v8_context(), global, argc, argv).ToLocal(&result))
188 return handle_scope.Escape(result);
189 return handle_scope.Escape(
190 v8::Local<v8::Primitive>(v8::Undefined(isolate())));
191 }
186 return handle_scope.Escape( 192 return handle_scope.Escape(
187 v8::Local<v8::Value>(web_frame_->callFunctionEvenIfScriptDisabled( 193 v8::Local<v8::Value>(web_frame_->callFunctionEvenIfScriptDisabled(
188 function, global, argc, argv))); 194 function, global, argc, argv)));
189 } 195 }
190 196
191 v8::Local<v8::Value> ScriptContext::CallFunction( 197 v8::Local<v8::Value> ScriptContext::CallFunction(
192 const v8::Local<v8::Function>& function) const { 198 const v8::Local<v8::Function>& function) const {
193 return CallFunction(function, 0, nullptr); 199 return CallFunction(function, 0, nullptr);
194 } 200 }
195 201
(...skipping 10 matching lines...) Expand all
206 } 212 }
207 return ExtensionAPI::GetSharedInstance()->IsAvailable( 213 return ExtensionAPI::GetSharedInstance()->IsAvailable(
208 api_name, extension, context_type_, GetURL()); 214 api_name, extension, context_type_, GetURL());
209 } 215 }
210 216
211 void ScriptContext::DispatchEvent(const char* event_name, 217 void ScriptContext::DispatchEvent(const char* event_name,
212 v8::Local<v8::Array> args) const { 218 v8::Local<v8::Array> args) const {
213 v8::HandleScope handle_scope(isolate()); 219 v8::HandleScope handle_scope(isolate());
214 v8::Context::Scope context_scope(v8_context()); 220 v8::Context::Scope context_scope(v8_context());
215 221
216 v8::Local<v8::Value> argv[] = {v8::String::NewFromUtf8(isolate(), event_name), 222 v8::Local<v8::Value> argv[] = {ToV8String(isolate(), event_name),
217 args}; 223 args};
218 module_system_->CallModuleMethod( 224 module_system_->CallModuleMethod(
219 kEventBindings, "dispatchEvent", arraysize(argv), argv); 225 kEventBindings, "dispatchEvent", arraysize(argv), argv);
220 } 226 }
221 227
222 void ScriptContext::DispatchOnUnloadEvent() { 228 void ScriptContext::DispatchOnUnloadEvent() {
223 v8::HandleScope handle_scope(isolate()); 229 v8::HandleScope handle_scope(isolate());
224 v8::Context::Scope context_scope(v8_context()); 230 v8::Context::Scope context_scope(v8_context());
225 module_system_->CallModuleMethod("unload_event", "dispatch"); 231 module_system_->CallModuleMethod("unload_event", "dispatch");
226 } 232 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 295
290 ScriptContext* ScriptContext::GetContext() { return this; } 296 ScriptContext* ScriptContext::GetContext() { return this; }
291 297
292 void ScriptContext::OnResponseReceived(const std::string& name, 298 void ScriptContext::OnResponseReceived(const std::string& name,
293 int request_id, 299 int request_id,
294 bool success, 300 bool success,
295 const base::ListValue& response, 301 const base::ListValue& response,
296 const std::string& error) { 302 const std::string& error) {
297 v8::HandleScope handle_scope(isolate()); 303 v8::HandleScope handle_scope(isolate());
298 304
305 CHECK(name.size() < v8::String::kMaxLength);
306 CHECK(error.size() < v8::String::kMaxLength);
299 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); 307 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create());
300 v8::Local<v8::Value> argv[] = { 308 v8::Local<v8::Value> argv[] = {
301 v8::Integer::New(isolate(), request_id), 309 v8::Integer::New(isolate(), request_id),
302 v8::String::NewFromUtf8(isolate(), name.c_str()), 310 ToV8String(isolate(), name.c_str()),
303 v8::Boolean::New(isolate(), success), 311 v8::Boolean::New(isolate(), success),
304 converter->ToV8Value(&response, 312 converter->ToV8Value(&response,
305 v8::Local<v8::Context>::New(isolate(), v8_context_)), 313 v8::Local<v8::Context>::New(isolate(), v8_context_)),
306 v8::String::NewFromUtf8(isolate(), error.c_str())}; 314 ToV8String(isolate(), error.c_str())};
307 315
308 v8::Local<v8::Value> retval = module_system()->CallModuleMethod( 316 v8::Local<v8::Value> retval = module_system()->CallModuleMethod(
309 "sendRequest", "handleResponse", arraysize(argv), argv); 317 "sendRequest", "handleResponse", arraysize(argv), argv);
310 318
311 // In debug, the js will validate the callback parameters and return a 319 // In debug, the js will validate the callback parameters and return a
312 // string if a validation error has occured. 320 // string if a validation error has occured.
313 DCHECK(retval.IsEmpty() || retval->IsUndefined()) 321 DCHECK(retval.IsEmpty() || retval->IsUndefined())
314 << *v8::String::Utf8Value(retval); 322 << *v8::String::Utf8Value(retval);
315 } 323 }
316 324
(...skipping 26 matching lines...) Expand all
343 // crbug.com/466373 is fixed, we don't know the security origin up-front and 351 // crbug.com/466373 is fixed, we don't know the security origin up-front and
344 // may not know it here, either. 352 // may not know it here, either.
345 // 353 //
346 // [1] citation needed. This ScriptContext should already be in a state that 354 // [1] citation needed. This ScriptContext should already be in a state that
347 // doesn't allow this, from ScriptContextSet::ClassifyJavaScriptContext. 355 // doesn't allow this, from ScriptContextSet::ClassifyJavaScriptContext.
348 if (extension() && 356 if (extension() &&
349 SandboxedPageInfo::IsSandboxedPage(extension(), url_.path())) { 357 SandboxedPageInfo::IsSandboxedPage(extension(), url_.path())) {
350 static const char kMessage[] = 358 static const char kMessage[] =
351 "%s cannot be used within a sandboxed frame."; 359 "%s cannot be used within a sandboxed frame.";
352 std::string error_msg = base::StringPrintf(kMessage, name.c_str()); 360 std::string error_msg = base::StringPrintf(kMessage, name.c_str());
361 CHECK(error_msg.size() < v8::String::kMaxLength);
353 isolate()->ThrowException(v8::Exception::Error( 362 isolate()->ThrowException(v8::Exception::Error(
354 v8::String::NewFromUtf8(isolate(), error_msg.c_str()))); 363 ToV8String(isolate(), error_msg.c_str())));
355 return false; 364 return false;
356 } 365 }
357 366
358 Feature::Availability availability = GetAvailability(name); 367 Feature::Availability availability = GetAvailability(name);
359 if (!availability.is_available()) { 368 if (!availability.is_available()) {
369 CHECK(availability.message().size() < v8::String::kMaxLength);
360 isolate()->ThrowException(v8::Exception::Error( 370 isolate()->ThrowException(v8::Exception::Error(
361 v8::String::NewFromUtf8(isolate(), availability.message().c_str()))); 371 ToV8String(isolate(), availability.message().c_str())));
362 return false; 372 return false;
363 } 373 }
364 374
365 return true; 375 return true;
366 } 376 }
367 377
368 std::string ScriptContext::GetDebugString() const { 378 std::string ScriptContext::GetDebugString() const {
369 return base::StringPrintf( 379 return base::StringPrintf(
370 " extension id: %s\n" 380 " extension id: %s\n"
371 " frame: %p\n" 381 " frame: %p\n"
(...skipping 23 matching lines...) Expand all
395 v8::Local<v8::Value> argv[]) { 405 v8::Local<v8::Value> argv[]) {
396 return context_->CallFunction(function, argc, argv); 406 return context_->CallFunction(function, argc, argv);
397 } 407 }
398 408
399 gin::ContextHolder* ScriptContext::Runner::GetContextHolder() { 409 gin::ContextHolder* ScriptContext::Runner::GetContextHolder() {
400 v8::HandleScope handle_scope(context_->isolate()); 410 v8::HandleScope handle_scope(context_->isolate());
401 return gin::PerContextData::From(context_->v8_context())->context_holder(); 411 return gin::PerContextData::From(context_->v8_context())->context_holder();
402 } 412 }
403 413
404 } // namespace extensions 414 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/safe_builtins.cc ('k') | extensions/renderer/send_request_natives.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698