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

Side by Side Diff: third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp

Issue 1767883002: DevTools: generate string16-based handlers for v8_inspector. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: for landing 2 Created 4 years, 9 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "platform/v8_inspector/V8InjectedScriptHost.h" 5 #include "platform/v8_inspector/V8InjectedScriptHost.h"
6 6
7 #include "platform/inspector_protocol/String16.h"
7 #include "platform/inspector_protocol/Values.h" 8 #include "platform/inspector_protocol/Values.h"
8 #include "platform/v8_inspector/InjectedScript.h" 9 #include "platform/v8_inspector/InjectedScript.h"
9 #include "platform/v8_inspector/InjectedScriptHost.h" 10 #include "platform/v8_inspector/InjectedScriptHost.h"
10 #include "platform/v8_inspector/InspectorWrapper.h" 11 #include "platform/v8_inspector/InspectorWrapper.h"
11 #include "platform/v8_inspector/JavaScriptCallFrame.h" 12 #include "platform/v8_inspector/JavaScriptCallFrame.h"
12 #include "platform/v8_inspector/V8DebuggerImpl.h" 13 #include "platform/v8_inspector/V8DebuggerImpl.h"
13 #include "platform/v8_inspector/V8StringUtil.h" 14 #include "platform/v8_inspector/V8StringUtil.h"
14 #include "platform/v8_inspector/public/V8DebuggerClient.h" 15 #include "platform/v8_inspector/public/V8DebuggerClient.h"
15 #include "platform/v8_inspector/public/V8EventListenerInfo.h" 16 #include "platform/v8_inspector/public/V8EventListenerInfo.h"
16 #include "platform/v8_inspector/public/V8ToProtocolValue.h" 17 #include "platform/v8_inspector/public/V8ToProtocolValue.h"
17 #include "wtf/text/WTFString.h"
18 #include <algorithm> 18 #include <algorithm>
19 19
20 namespace blink { 20 namespace blink {
21 21
22 namespace { 22 namespace {
23 23
24 template<typename CallbackInfo, typename S> 24 template<typename CallbackInfo, typename S>
25 inline void v8SetReturnValue(const CallbackInfo& info, const v8::Local<S> handle ) 25 inline void v8SetReturnValue(const CallbackInfo& info, const v8::Local<S> handle )
26 { 26 {
27 info.GetReturnValue().Set(handle); 27 info.GetReturnValue().Set(handle);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 } 139 }
140 140
141 if (value->IsNativeError()) { 141 if (value->IsNativeError()) {
142 v8SetReturnValue(info, toV8StringInternalized(isolate, "error")); 142 v8SetReturnValue(info, toV8StringInternalized(isolate, "error"));
143 return; 143 return;
144 } 144 }
145 145
146 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder()); 146 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder());
147 if (!host->debugger()) 147 if (!host->debugger())
148 return; 148 return;
149 String subtype = host->debugger()->client()->valueSubtype(value); 149 String16 subtype = host->debugger()->client()->valueSubtype(value);
150 if (!subtype.isEmpty()) { 150 if (!subtype.isEmpty()) {
151 v8SetReturnValue(info, toV8String(isolate, subtype)); 151 v8SetReturnValue(info, toV8String(isolate, subtype));
152 return; 152 return;
153 } 153 }
154 } 154 }
155 155
156 void V8InjectedScriptHost::functionDetailsCallback(const v8::FunctionCallbackInf o<v8::Value>& info) 156 void V8InjectedScriptHost::functionDetailsCallback(const v8::FunctionCallbackInf o<v8::Value>& info)
157 { 157 {
158 if (info.Length() < 1 || !info[0]->IsFunction()) 158 if (info.Length() < 1 || !info[0]->IsFunction())
159 return; 159 return;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 return; 241 return;
242 242
243 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder()); 243 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder());
244 if (!host->debugger()) 244 if (!host->debugger())
245 return; 245 return;
246 V8DebuggerClient* client = host->debugger()->client(); 246 V8DebuggerClient* client = host->debugger()->client();
247 V8EventListenerInfoMap listenerInfo; 247 V8EventListenerInfoMap listenerInfo;
248 client->eventListeners(info[0], listenerInfo); 248 client->eventListeners(info[0], listenerInfo);
249 249
250 v8::Local<v8::Object> result = v8::Object::New(info.GetIsolate()); 250 v8::Local<v8::Object> result = v8::Object::New(info.GetIsolate());
251 protocol::Vector<String> types; 251 protocol::Vector<String16> types;
252 for (auto& it : listenerInfo) 252 for (auto& it : listenerInfo)
253 types.append(it.first); 253 types.append(it.first);
254 std::sort(types.begin(), types.end(), WTF::codePointCompareLessThan); 254 std::sort(types.begin(), types.end(), String16::codePointCompareLessThan);
255 for (const String& type : types) { 255 for (const String16& type : types) {
256 v8::Local<v8::Array> listeners = wrapListenerFunctions(info.GetIsolate() , *listenerInfo.get(type)); 256 v8::Local<v8::Array> listeners = wrapListenerFunctions(info.GetIsolate() , *listenerInfo.get(type));
257 if (!listeners->Length()) 257 if (!listeners->Length())
258 continue; 258 continue;
259 result->Set(toV8String(info.GetIsolate(), type), listeners); 259 result->Set(toV8String(info.GetIsolate(), type), listeners);
260 } 260 }
261 261
262 v8SetReturnValue(info, result); 262 v8SetReturnValue(info, result);
263 } 263 }
264 264
265 void V8InjectedScriptHost::inspectCallback(const v8::FunctionCallbackInfo<v8::Va lue>& info) 265 void V8InjectedScriptHost::inspectCallback(const v8::FunctionCallbackInfo<v8::Va lue>& info)
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 v8::Local<v8::Object> wrappedResult = v8::Object::New(isolate); 325 v8::Local<v8::Object> wrappedResult = v8::Object::New(isolate);
326 if (wrappedResult.IsEmpty()) 326 if (wrappedResult.IsEmpty())
327 return; 327 return;
328 328
329 v8::TryCatch tryCatch(isolate); 329 v8::TryCatch tryCatch(isolate);
330 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 330 v8::Local<v8::Context> context = isolate->GetCurrentContext();
331 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(context, info.Holder ()); 331 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(context, info.Holder ());
332 if (!host->debugger()) 332 if (!host->debugger())
333 return; 333 return;
334 334
335 v8::Local<v8::Script> script = host->debugger()->compileInternalScript(conte xt, expression, String()); 335 v8::Local<v8::Script> script = host->debugger()->compileInternalScript(conte xt, expression, String16());
336 if (script.IsEmpty()) { 336 if (script.IsEmpty()) {
337 setExceptionAsReturnValue(info, wrappedResult, tryCatch); 337 setExceptionAsReturnValue(info, wrappedResult, tryCatch);
338 return; 338 return;
339 } 339 }
340 340
341 v8::Local<v8::Symbol> commandLineAPISymbolValue = V8Debugger::commandLineAPI Symbol(isolate); 341 v8::Local<v8::Symbol> commandLineAPISymbolValue = V8Debugger::commandLineAPI Symbol(isolate);
342 v8::Local<v8::Object> global = context->Global(); 342 v8::Local<v8::Object> global = context->Global();
343 if (info.Length() >= 2 && info[1]->IsObject()) { 343 if (info.Length() >= 2 && info[1]->IsObject()) {
344 v8::Local<v8::Object> commandLineAPI = info[1]->ToObject(isolate); 344 v8::Local<v8::Object> commandLineAPI = info[1]->ToObject(isolate);
345 global->Set(commandLineAPISymbolValue, commandLineAPI); 345 global->Set(commandLineAPISymbolValue, commandLineAPI);
(...skipping 12 matching lines...) Expand all
358 v8SetReturnValue(info, wrappedResult); 358 v8SetReturnValue(info, wrappedResult);
359 } 359 }
360 360
361 void V8InjectedScriptHost::setFunctionVariableValueCallback(const v8::FunctionCa llbackInfo<v8::Value>& info) 361 void V8InjectedScriptHost::setFunctionVariableValueCallback(const v8::FunctionCa llbackInfo<v8::Value>& info)
362 { 362 {
363 if (info.Length() < 4 || !info[0]->IsFunction() || !info[1]->IsInt32() || !i nfo[2]->IsString()) 363 if (info.Length() < 4 || !info[0]->IsFunction() || !info[1]->IsInt32() || !i nfo[2]->IsString())
364 return; 364 return;
365 365
366 v8::Local<v8::Value> functionValue = info[0]; 366 v8::Local<v8::Value> functionValue = info[0];
367 int scopeIndex = info[1].As<v8::Int32>()->Value(); 367 int scopeIndex = info[1].As<v8::Int32>()->Value();
368 String variableName = toWTFStringWithTypeCheck(info[2]); 368 String16 variableName = toProtocolStringWithTypeCheck(info[2]);
369 v8::Local<v8::Value> newValue = info[3]; 369 v8::Local<v8::Value> newValue = info[3];
370 370
371 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder()); 371 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder());
372 if (!host->debugger()) 372 if (!host->debugger())
373 return; 373 return;
374 v8SetReturnValue(info, host->debugger()->setFunctionVariableValue(functionVa lue, scopeIndex, variableName, newValue)); 374 v8SetReturnValue(info, host->debugger()->setFunctionVariableValue(functionVa lue, scopeIndex, variableName, newValue));
375 } 375 }
376 376
377 static bool getFunctionLocation(const v8::FunctionCallbackInfo<v8::Value>& info, String* scriptId, int* lineNumber, int* columnNumber) 377 static bool getFunctionLocation(const v8::FunctionCallbackInfo<v8::Value>& info, String16* scriptId, int* lineNumber, int* columnNumber)
378 { 378 {
379 if (info.Length() < 1 || !info[0]->IsFunction()) 379 if (info.Length() < 1 || !info[0]->IsFunction())
380 return false; 380 return false;
381 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(info[0]); 381 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(info[0]);
382 *lineNumber = function->GetScriptLineNumber(); 382 *lineNumber = function->GetScriptLineNumber();
383 *columnNumber = function->GetScriptColumnNumber(); 383 *columnNumber = function->GetScriptColumnNumber();
384 if (*lineNumber == v8::Function::kLineOffsetNotFound || *columnNumber == v8: :Function::kLineOffsetNotFound) 384 if (*lineNumber == v8::Function::kLineOffsetNotFound || *columnNumber == v8: :Function::kLineOffsetNotFound)
385 return false; 385 return false;
386 *scriptId = String::number(function->ScriptId()); 386 *scriptId = String16::number(function->ScriptId());
387 return true; 387 return true;
388 } 388 }
389 389
390 void V8InjectedScriptHost::debugFunctionCallback(const v8::FunctionCallbackInfo< v8::Value>& info) 390 void V8InjectedScriptHost::debugFunctionCallback(const v8::FunctionCallbackInfo< v8::Value>& info)
391 { 391 {
392 String scriptId; 392 String16 scriptId;
393 int lineNumber; 393 int lineNumber;
394 int columnNumber; 394 int columnNumber;
395 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber)) 395 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber))
396 return; 396 return;
397 397
398 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder()); 398 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder());
399 host->debugFunction(scriptId, lineNumber, columnNumber); 399 host->debugFunction(scriptId, lineNumber, columnNumber);
400 } 400 }
401 401
402 void V8InjectedScriptHost::undebugFunctionCallback(const v8::FunctionCallbackInf o<v8::Value>& info) 402 void V8InjectedScriptHost::undebugFunctionCallback(const v8::FunctionCallbackInf o<v8::Value>& info)
403 { 403 {
404 String scriptId; 404 String16 scriptId;
405 int lineNumber; 405 int lineNumber;
406 int columnNumber; 406 int columnNumber;
407 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber)) 407 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber))
408 return; 408 return;
409 409
410 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder()); 410 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder());
411 host->undebugFunction(scriptId, lineNumber, columnNumber); 411 host->undebugFunction(scriptId, lineNumber, columnNumber);
412 } 412 }
413 413
414 void V8InjectedScriptHost::monitorFunctionCallback(const v8::FunctionCallbackInf o<v8::Value>& info) 414 void V8InjectedScriptHost::monitorFunctionCallback(const v8::FunctionCallbackInf o<v8::Value>& info)
415 { 415 {
416 String scriptId; 416 String16 scriptId;
417 int lineNumber; 417 int lineNumber;
418 int columnNumber; 418 int columnNumber;
419 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber)) 419 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber))
420 return; 420 return;
421 421
422 v8::Local<v8::Value> name; 422 v8::Local<v8::Value> name;
423 if (info.Length() > 0 && info[0]->IsFunction()) { 423 if (info.Length() > 0 && info[0]->IsFunction()) {
424 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(info[0] ); 424 v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(info[0] );
425 name = function->GetName(); 425 name = function->GetName();
426 if (!name->IsString() || !v8::Local<v8::String>::Cast(name)->Length()) 426 if (!name->IsString() || !v8::Local<v8::String>::Cast(name)->Length())
427 name = function->GetInferredName(); 427 name = function->GetInferredName();
428 } 428 }
429 429
430 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder()); 430 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder());
431 host->monitorFunction(scriptId, lineNumber, columnNumber, toWTFStringWithTyp eCheck(name)); 431 host->monitorFunction(scriptId, lineNumber, columnNumber, toProtocolStringWi thTypeCheck(name));
432 } 432 }
433 433
434 void V8InjectedScriptHost::unmonitorFunctionCallback(const v8::FunctionCallbackI nfo<v8::Value>& info) 434 void V8InjectedScriptHost::unmonitorFunctionCallback(const v8::FunctionCallbackI nfo<v8::Value>& info)
435 { 435 {
436 String scriptId; 436 String16 scriptId;
437 int lineNumber; 437 int lineNumber;
438 int columnNumber; 438 int columnNumber;
439 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber)) 439 if (!getFunctionLocation(info, &scriptId, &lineNumber, &columnNumber))
440 return; 440 return;
441 441
442 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder()); 442 InjectedScriptHost* host = V8InjectedScriptHost::unwrap(info.GetIsolate()->G etCurrentContext(), info.Holder());
443 host->unmonitorFunction(scriptId, lineNumber, columnNumber); 443 host->unmonitorFunction(scriptId, lineNumber, columnNumber);
444 } 444 }
445 445
446 void V8InjectedScriptHost::callFunctionCallback(const v8::FunctionCallbackInfo<v 8::Value>& info) 446 void V8InjectedScriptHost::callFunctionCallback(const v8::FunctionCallbackInfo<v 8::Value>& info)
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 498
499 void V8InjectedScriptHost::bindCallback(const v8::FunctionCallbackInfo<v8::Value >& info) 499 void V8InjectedScriptHost::bindCallback(const v8::FunctionCallbackInfo<v8::Value >& info)
500 { 500 {
501 if (info.Length() < 2 || !info[1]->IsString()) 501 if (info.Length() < 2 || !info[1]->IsString())
502 return; 502 return;
503 InjectedScriptNative* injectedScriptNative = InjectedScriptNative::fromInjec tedScriptHost(info.Holder()); 503 InjectedScriptNative* injectedScriptNative = InjectedScriptNative::fromInjec tedScriptHost(info.Holder());
504 if (!injectedScriptNative) 504 if (!injectedScriptNative)
505 return; 505 return;
506 506
507 v8::Local<v8::String> v8groupName = info[1]->ToString(info.GetIsolate()); 507 v8::Local<v8::String> v8groupName = info[1]->ToString(info.GetIsolate());
508 String groupName = toWTFStringWithTypeCheck(v8groupName); 508 String16 groupName = toProtocolStringWithTypeCheck(v8groupName);
509 int id = injectedScriptNative->bind(info[0], groupName); 509 int id = injectedScriptNative->bind(info[0], groupName);
510 info.GetReturnValue().Set(id); 510 info.GetReturnValue().Set(id);
511 } 511 }
512 512
513 void V8InjectedScriptHost::objectForIdCallback(const v8::FunctionCallbackInfo<v8 ::Value>& info) 513 void V8InjectedScriptHost::objectForIdCallback(const v8::FunctionCallbackInfo<v8 ::Value>& info)
514 { 514 {
515 if (info.Length() < 1 || !info[0]->IsInt32()) 515 if (info.Length() < 1 || !info[0]->IsInt32())
516 return; 516 return;
517 InjectedScriptNative* injectedScriptNative = InjectedScriptNative::fromInjec tedScriptHost(info.Holder()); 517 InjectedScriptNative* injectedScriptNative = InjectedScriptNative::fromInjec tedScriptHost(info.Holder());
518 if (!injectedScriptNative) 518 if (!injectedScriptNative)
519 return; 519 return;
520 int id = info[0].As<v8::Int32>()->Value(); 520 int id = info[0].As<v8::Int32>()->Value();
521 v8::Local<v8::Value> value = injectedScriptNative->objectForId(id); 521 v8::Local<v8::Value> value = injectedScriptNative->objectForId(id);
522 if (!value.IsEmpty()) 522 if (!value.IsEmpty())
523 info.GetReturnValue().Set(value); 523 info.GetReturnValue().Set(value);
524 } 524 }
525 525
526 void V8InjectedScriptHost::idToObjectGroupNameCallback(const v8::FunctionCallbac kInfo<v8::Value>& info) 526 void V8InjectedScriptHost::idToObjectGroupNameCallback(const v8::FunctionCallbac kInfo<v8::Value>& info)
527 { 527 {
528 if (info.Length() < 1 || !info[0]->IsInt32()) 528 if (info.Length() < 1 || !info[0]->IsInt32())
529 return; 529 return;
530 InjectedScriptNative* injectedScriptNative = InjectedScriptNative::fromInjec tedScriptHost(info.Holder()); 530 InjectedScriptNative* injectedScriptNative = InjectedScriptNative::fromInjec tedScriptHost(info.Holder());
531 if (!injectedScriptNative) 531 if (!injectedScriptNative)
532 return; 532 return;
533 int id = info[0].As<v8::Int32>()->Value(); 533 int id = info[0].As<v8::Int32>()->Value();
534 String groupName = injectedScriptNative->groupName(id); 534 String16 groupName = injectedScriptNative->groupName(id);
535 if (!groupName.isEmpty()) 535 if (!groupName.isEmpty())
536 info.GetReturnValue().Set(toV8String(info.GetIsolate(), groupName)); 536 info.GetReturnValue().Set(toV8String(info.GetIsolate(), groupName));
537 } 537 }
538 538
539 v8::Local<v8::Symbol> V8Debugger::commandLineAPISymbol(v8::Isolate* isolate) 539 v8::Local<v8::Symbol> V8Debugger::commandLineAPISymbol(v8::Isolate* isolate)
540 { 540 {
541 return v8::Symbol::ForApi(isolate, toV8StringInternalized(isolate, "commandL ineAPI")); 541 return v8::Symbol::ForApi(isolate, toV8StringInternalized(isolate, "commandL ineAPI"));
542 } 542 }
543 543
544 bool V8Debugger::isCommandLineAPIMethod(const AtomicString& name) 544 bool V8Debugger::isCommandLineAPIMethod(const String16& name)
545 { 545 {
546 DEFINE_STATIC_LOCAL(protocol::HashSet<String>, methods, ()); 546 DEFINE_STATIC_LOCAL(protocol::HashSet<String16>, methods, ());
547 if (methods.size() == 0) { 547 if (methods.size() == 0) {
548 const char* members[] = { "$", "$$", "$x", "dir", "dirxml", "keys", "val ues", "profile", "profileEnd", 548 const char* members[] = { "$", "$$", "$x", "dir", "dirxml", "keys", "val ues", "profile", "profileEnd",
549 "monitorEvents", "unmonitorEvents", "inspect", "copy", "clear", "get EventListeners", 549 "monitorEvents", "unmonitorEvents", "inspect", "copy", "clear", "get EventListeners",
550 "debug", "undebug", "monitor", "unmonitor", "table", "$_", "$0", "$1 ", "$2", "$3", "$4" }; 550 "debug", "undebug", "monitor", "unmonitor", "table", "$_", "$0", "$1 ", "$2", "$3", "$4" };
551 for (size_t i = 0; i < sizeof(members) / sizeof(const char*); ++i) 551 for (size_t i = 0; i < sizeof(members) / sizeof(const char*); ++i)
552 methods.add(members[i]); 552 methods.add(members[i]);
553 } 553 }
554 return methods.find(name) != methods.end(); 554 return methods.find(name) != methods.end();
555 } 555 }
556 556
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 { 602 {
603 return InjectedScriptHostWrapper::wrap(client, constructorTemplate, context, host); 603 return InjectedScriptHostWrapper::wrap(client, constructorTemplate, context, host);
604 } 604 }
605 605
606 InjectedScriptHost* V8InjectedScriptHost::unwrap(v8::Local<v8::Context> context, v8::Local<v8::Object> object) 606 InjectedScriptHost* V8InjectedScriptHost::unwrap(v8::Local<v8::Context> context, v8::Local<v8::Object> object)
607 { 607 {
608 return InjectedScriptHostWrapper::unwrap(context, object); 608 return InjectedScriptHostWrapper::unwrap(context, object);
609 } 609 }
610 610
611 } // namespace blink 611 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698