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

Side by Side Diff: Source/core/inspector/InspectorDebuggerAgent.cpp

Issue 111653002: DevTools: Track async stacks on the corresponding execution context. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: no RefCounted Created 7 years 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 /* 1 /*
2 * Copyright (C) 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2010-2011 Google Inc. All rights reserved. 3 * Copyright (C) 2010-2011 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 17 matching lines...) Expand all
28 */ 28 */
29 29
30 #include "config.h" 30 #include "config.h"
31 #include "core/inspector/InspectorDebuggerAgent.h" 31 #include "core/inspector/InspectorDebuggerAgent.h"
32 #include "core/inspector/JavaScriptCallFrame.h" 32 #include "core/inspector/JavaScriptCallFrame.h"
33 33
34 #include "bindings/v8/ScriptDebugServer.h" 34 #include "bindings/v8/ScriptDebugServer.h"
35 #include "bindings/v8/ScriptObject.h" 35 #include "bindings/v8/ScriptObject.h"
36 #include "bindings/v8/ScriptRegexp.h" 36 #include "bindings/v8/ScriptRegexp.h"
37 #include "bindings/v8/ScriptSourceCode.h" 37 #include "bindings/v8/ScriptSourceCode.h"
38 #include "core/dom/Document.h"
38 #include "core/fetch/Resource.h" 39 #include "core/fetch/Resource.h"
39 #include "core/inspector/ContentSearchUtils.h" 40 #include "core/inspector/ContentSearchUtils.h"
40 #include "core/inspector/InjectedScriptManager.h" 41 #include "core/inspector/InjectedScriptManager.h"
41 #include "core/inspector/InspectorPageAgent.h" 42 #include "core/inspector/InspectorPageAgent.h"
42 #include "core/inspector/InspectorState.h" 43 #include "core/inspector/InspectorState.h"
43 #include "core/inspector/InstrumentingAgents.h" 44 #include "core/inspector/InstrumentingAgents.h"
44 #include "core/inspector/ScriptArguments.h" 45 #include "core/inspector/ScriptArguments.h"
45 #include "core/inspector/ScriptCallStack.h" 46 #include "core/inspector/ScriptCallStack.h"
46 #include "platform/JSONValues.h" 47 #include "platform/JSONValues.h"
47 #include "wtf/text/WTFString.h" 48 #include "wtf/text/WTFString.h"
48 49
49 using WebCore::TypeBuilder::Array; 50 using WebCore::TypeBuilder::Array;
50 using WebCore::TypeBuilder::Debugger::BreakpointId; 51 using WebCore::TypeBuilder::Debugger::BreakpointId;
51 using WebCore::TypeBuilder::Debugger::CallFrame; 52 using WebCore::TypeBuilder::Debugger::CallFrame;
52 using WebCore::TypeBuilder::Debugger::FunctionDetails; 53 using WebCore::TypeBuilder::Debugger::FunctionDetails;
53 using WebCore::TypeBuilder::Debugger::Location;
54 using WebCore::TypeBuilder::Debugger::ScriptId; 54 using WebCore::TypeBuilder::Debugger::ScriptId;
55 using WebCore::TypeBuilder::Debugger::StackTrace; 55 using WebCore::TypeBuilder::Debugger::StackTrace;
56 using WebCore::TypeBuilder::Runtime::RemoteObject; 56 using WebCore::TypeBuilder::Runtime::RemoteObject;
57 57
58 namespace WebCore { 58 namespace WebCore {
59 59
60 namespace DebuggerAgentState { 60 namespace DebuggerAgentState {
61 static const char debuggerEnabled[] = "debuggerEnabled"; 61 static const char debuggerEnabled[] = "debuggerEnabled";
62 static const char javaScriptBreakpoints[] = "javaScriptBreakopints"; 62 static const char javaScriptBreakpoints[] = "javaScriptBreakopints";
63 static const char pauseOnExceptionsState[] = "pauseOnExceptionsState"; 63 static const char pauseOnExceptionsState[] = "pauseOnExceptionsState";
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 290
291 static bool matches(const String& url, const String& pattern, bool isRegex) 291 static bool matches(const String& url, const String& pattern, bool isRegex)
292 { 292 {
293 if (isRegex) { 293 if (isRegex) {
294 ScriptRegexp regex(pattern, TextCaseSensitive); 294 ScriptRegexp regex(pattern, TextCaseSensitive);
295 return regex.match(url) != -1; 295 return regex.match(url) != -1;
296 } 296 }
297 return url == pattern; 297 return url == pattern;
298 } 298 }
299 299
300 void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString* errorString, int li neNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const String* const optionalCondition, c onst bool* isAntiBreakpoint, BreakpointId* outBreakpointId, RefPtr<Array<Locatio n> >& locations) 300 void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString* errorString, int li neNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const String* const optionalCondition, c onst bool* isAntiBreakpoint, BreakpointId* outBreakpointId, RefPtr<Array<TypeBui lder::Debugger::Location> >& locations)
301 { 301 {
302 locations = Array<Location>::create(); 302 locations = Array<TypeBuilder::Debugger::Location>::create();
303 if (!optionalURL == !optionalURLRegex) { 303 if (!optionalURL == !optionalURLRegex) {
304 *errorString = "Either url or urlRegex must be specified."; 304 *errorString = "Either url or urlRegex must be specified.";
305 return; 305 return;
306 } 306 }
307 307
308 bool isAntiBreakpointValue = isAntiBreakpoint && *isAntiBreakpoint; 308 bool isAntiBreakpointValue = isAntiBreakpoint && *isAntiBreakpoint;
309 309
310 String url = optionalURL ? *optionalURL : *optionalURLRegex; 310 String url = optionalURL ? *optionalURL : *optionalURLRegex;
311 int columnNumber; 311 int columnNumber;
312 if (optionalColumnNumber) { 312 if (optionalColumnNumber) {
(...skipping 16 matching lines...) Expand all
329 } 329 }
330 330
331 breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(ur l, lineNumber, columnNumber, condition, isRegex, isAntiBreakpointValue)); 331 breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(ur l, lineNumber, columnNumber, condition, isRegex, isAntiBreakpointValue));
332 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCoo kie); 332 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCoo kie);
333 333
334 if (!isAntiBreakpointValue) { 334 if (!isAntiBreakpointValue) {
335 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); 335 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition);
336 for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) { 336 for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) {
337 if (!matches(it->value.url, url, isRegex)) 337 if (!matches(it->value.url, url, isRegex))
338 continue; 338 continue;
339 RefPtr<Location> location = resolveBreakpoint(breakpointId, it->key, breakpoint, UserBreakpointSource); 339 RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint (breakpointId, it->key, breakpoint, UserBreakpointSource);
340 if (location) 340 if (location)
341 locations->addItem(location); 341 locations->addItem(location);
342 } 342 }
343 } 343 }
344 *outBreakpointId = breakpointId; 344 *outBreakpointId = breakpointId;
345 } 345 }
346 346
347 static bool parseLocation(ErrorString* errorString, PassRefPtr<JSONObject> locat ion, String* scriptId, int* lineNumber, int* columnNumber) 347 static bool parseLocation(ErrorString* errorString, PassRefPtr<JSONObject> locat ion, String* scriptId, int* lineNumber, int* columnNumber)
348 { 348 {
349 if (!location->getString("scriptId", scriptId) || !location->getNumber("line Number", lineNumber)) { 349 if (!location->getString("scriptId", scriptId) || !location->getNumber("line Number", lineNumber)) {
350 // FIXME: replace with input validation. 350 // FIXME: replace with input validation.
351 *errorString = "scriptId and lineNumber are required."; 351 *errorString = "scriptId and lineNumber are required.";
352 return false; 352 return false;
353 } 353 }
354 *columnNumber = 0; 354 *columnNumber = 0;
355 location->getNumber("columnNumber", columnNumber); 355 location->getNumber("columnNumber", columnNumber);
356 return true; 356 return true;
357 } 357 }
358 358
359 void InspectorDebuggerAgent::setBreakpoint(ErrorString* errorString, const RefPt r<JSONObject>& location, const String* const optionalCondition, BreakpointId* ou tBreakpointId, RefPtr<Location>& actualLocation) 359 void InspectorDebuggerAgent::setBreakpoint(ErrorString* errorString, const RefPt r<JSONObject>& location, const String* const optionalCondition, BreakpointId* ou tBreakpointId, RefPtr<TypeBuilder::Debugger::Location>& actualLocation)
360 { 360 {
361 String scriptId; 361 String scriptId;
362 int lineNumber; 362 int lineNumber;
363 int columnNumber; 363 int columnNumber;
364 364
365 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber)) 365 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber))
366 return; 366 return;
367 367
368 String condition = optionalCondition ? *optionalCondition : emptyString(); 368 String condition = optionalCondition ? *optionalCondition : emptyString();
369 369
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 int columnNumber; 422 int columnNumber;
423 423
424 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber)) 424 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber))
425 return; 425 return;
426 426
427 ScriptBreakpoint breakpoint(lineNumber, columnNumber, ""); 427 ScriptBreakpoint breakpoint(lineNumber, columnNumber, "");
428 m_continueToLocationBreakpointId = scriptDebugServer().setBreakpoint(scriptI d, breakpoint, &lineNumber, &columnNumber, interstateLocation); 428 m_continueToLocationBreakpointId = scriptDebugServer().setBreakpoint(scriptI d, breakpoint, &lineNumber, &columnNumber, interstateLocation);
429 resume(errorString); 429 resume(errorString);
430 } 430 }
431 431
432 void InspectorDebuggerAgent::getStepInPositions(ErrorString* errorString, const String& callFrameId, RefPtr<Array<Location> >& positions) 432 void InspectorDebuggerAgent::getStepInPositions(ErrorString* errorString, const String& callFrameId, RefPtr<Array<TypeBuilder::Debugger::Location> >& positions)
433 { 433 {
434 if (!isPaused() || m_currentCallStack.isNull()) { 434 if (!isPaused() || m_currentCallStack.isNull()) {
435 *errorString = "Attempt to access callframe when debugger is not on paus e"; 435 *errorString = "Attempt to access callframe when debugger is not on paus e";
436 return; 436 return;
437 } 437 }
438 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptForOb jectId(callFrameId); 438 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptForOb jectId(callFrameId);
439 if (injectedScript.hasNoValue()) { 439 if (injectedScript.hasNoValue()) {
440 *errorString = "Inspected frame has gone"; 440 *errorString = "Inspected frame has gone";
441 return; 441 return;
442 } 442 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 if (m_skipStepInCount > 0) { 535 if (m_skipStepInCount > 0) {
536 --m_skipStepInCount; 536 --m_skipStepInCount;
537 return ScriptDebugListener::StepInto; 537 return ScriptDebugListener::StepInto;
538 } 538 }
539 return ScriptDebugListener::StepOut; 539 return ScriptDebugListener::StepOut;
540 } 540 }
541 } 541 }
542 return ScriptDebugListener::NoSkip; 542 return ScriptDebugListener::NoSkip;
543 } 543 }
544 544
545 PassRefPtr<Location> InspectorDebuggerAgent::resolveBreakpoint(const String& bre akpointId, const String& scriptId, const ScriptBreakpoint& breakpoint, Breakpoin tSource source) 545 PassRefPtr<TypeBuilder::Debugger::Location> InspectorDebuggerAgent::resolveBreak point(const String& breakpointId, const String& scriptId, const ScriptBreakpoint & breakpoint, BreakpointSource source)
546 { 546 {
547 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); 547 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId);
548 if (scriptIterator == m_scripts.end()) 548 if (scriptIterator == m_scripts.end())
549 return 0; 549 return 0;
550 Script& script = scriptIterator->value; 550 Script& script = scriptIterator->value;
551 if (breakpoint.lineNumber < script.startLine || script.endLine < breakpoint. lineNumber) 551 if (breakpoint.lineNumber < script.startLine || script.endLine < breakpoint. lineNumber)
552 return 0; 552 return 0;
553 553
554 int actualLineNumber; 554 int actualLineNumber;
555 int actualColumnNumber; 555 int actualColumnNumber;
556 String debugServerBreakpointId = scriptDebugServer().setBreakpoint(scriptId, breakpoint, &actualLineNumber, &actualColumnNumber, false); 556 String debugServerBreakpointId = scriptDebugServer().setBreakpoint(scriptId, breakpoint, &actualLineNumber, &actualColumnNumber, false);
557 if (debugServerBreakpointId.isEmpty()) 557 if (debugServerBreakpointId.isEmpty())
558 return 0; 558 return 0;
559 559
560 m_serverBreakpoints.set(debugServerBreakpointId, std::make_pair(breakpointId , source)); 560 m_serverBreakpoints.set(debugServerBreakpointId, std::make_pair(breakpointId , source));
561 561
562 BreakpointIdToDebugServerBreakpointIdsMap::iterator debugServerBreakpointIds Iterator = m_breakpointIdToDebugServerBreakpointIds.find(breakpointId); 562 BreakpointIdToDebugServerBreakpointIdsMap::iterator debugServerBreakpointIds Iterator = m_breakpointIdToDebugServerBreakpointIds.find(breakpointId);
563 if (debugServerBreakpointIdsIterator == m_breakpointIdToDebugServerBreakpoin tIds.end()) 563 if (debugServerBreakpointIdsIterator == m_breakpointIdToDebugServerBreakpoin tIds.end())
564 debugServerBreakpointIdsIterator = m_breakpointIdToDebugServerBreakpoint Ids.set(breakpointId, Vector<String>()).iterator; 564 debugServerBreakpointIdsIterator = m_breakpointIdToDebugServerBreakpoint Ids.set(breakpointId, Vector<String>()).iterator;
565 debugServerBreakpointIdsIterator->value.append(debugServerBreakpointId); 565 debugServerBreakpointIdsIterator->value.append(debugServerBreakpointId);
566 566
567 RefPtr<Location> location = Location::create() 567 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create()
568 .setScriptId(scriptId) 568 .setScriptId(scriptId)
569 .setLineNumber(actualLineNumber); 569 .setLineNumber(actualLineNumber);
570 location->setColumnNumber(actualColumnNumber); 570 location->setColumnNumber(actualColumnNumber);
571 return location; 571 return location;
572 } 572 }
573 573
574 static PassRefPtr<JSONObject> scriptToInspectorObject(ScriptObject scriptObject) 574 static PassRefPtr<JSONObject> scriptToInspectorObject(ScriptObject scriptObject)
575 { 575 {
576 if (scriptObject.hasNoValue()) 576 if (scriptObject.hasNoValue())
577 return 0; 577 return 0;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 } 653 }
654 654
655 void InspectorDebuggerAgent::cancelPauseOnNextStatement() 655 void InspectorDebuggerAgent::cancelPauseOnNextStatement()
656 { 656 {
657 if (m_javaScriptPauseScheduled) 657 if (m_javaScriptPauseScheduled)
658 return; 658 return;
659 clearBreakDetails(); 659 clearBreakDetails();
660 scriptDebugServer().setPauseOnNextStatement(false); 660 scriptDebugServer().setPauseOnNextStatement(false);
661 } 661 }
662 662
663 void InspectorDebuggerAgent::didInstallTimer(ExecutionContext*, int timerId, int timeout, bool singleShot) 663 void InspectorDebuggerAgent::didInstallTimer(ExecutionContext* context, int time rId, int timeout, bool singleShot)
664 { 664 {
665 if (m_asyncCallStackTracker.isEnabled()) 665 if (m_asyncCallStackTracker.isEnabled())
666 m_asyncCallStackTracker.didInstallTimer(timerId, singleShot, scriptDebug Server().currentCallFrames()); 666 m_asyncCallStackTracker.didInstallTimer(context, timerId, singleShot, sc riptDebugServer().currentCallFrames());
667 } 667 }
668 668
669 void InspectorDebuggerAgent::didRemoveTimer(ExecutionContext*, int timerId) 669 void InspectorDebuggerAgent::didRemoveTimer(ExecutionContext* context, int timer Id)
670 { 670 {
671 m_asyncCallStackTracker.didRemoveTimer(timerId); 671 m_asyncCallStackTracker.didRemoveTimer(context, timerId);
672 } 672 }
673 673
674 bool InspectorDebuggerAgent::willFireTimer(ExecutionContext*, int timerId) 674 bool InspectorDebuggerAgent::willFireTimer(ExecutionContext* context, int timerI d)
675 { 675 {
676 m_asyncCallStackTracker.willFireTimer(timerId); 676 m_asyncCallStackTracker.willFireTimer(context, timerId);
677 return true; 677 return true;
678 } 678 }
679 679
680 void InspectorDebuggerAgent::didFireTimer() 680 void InspectorDebuggerAgent::didFireTimer()
681 { 681 {
682 m_asyncCallStackTracker.didFireAsyncCall(); 682 m_asyncCallStackTracker.didFireAsyncCall();
683 cancelPauseOnNextStatement(); 683 cancelPauseOnNextStatement();
684 } 684 }
685 685
686 void InspectorDebuggerAgent::didRequestAnimationFrame(Document*, int callbackId) 686 void InspectorDebuggerAgent::didRequestAnimationFrame(Document* document, int ca llbackId)
687 { 687 {
688 if (m_asyncCallStackTracker.isEnabled()) 688 if (m_asyncCallStackTracker.isEnabled())
689 m_asyncCallStackTracker.didRequestAnimationFrame(callbackId, scriptDebug Server().currentCallFrames()); 689 m_asyncCallStackTracker.didRequestAnimationFrame(static_cast<ExecutionCo ntext*>(document), callbackId, scriptDebugServer().currentCallFrames());
pfeldman 2013/12/10 15:45:02 no need to cast
690 } 690 }
691 691
692 void InspectorDebuggerAgent::didCancelAnimationFrame(Document*, int callbackId) 692 void InspectorDebuggerAgent::didCancelAnimationFrame(Document* document, int cal lbackId)
693 { 693 {
694 m_asyncCallStackTracker.didCancelAnimationFrame(callbackId); 694 m_asyncCallStackTracker.didCancelAnimationFrame(static_cast<ExecutionContext *>(document), callbackId);
695 } 695 }
696 696
697 bool InspectorDebuggerAgent::willFireAnimationFrame(Document*, int callbackId) 697 bool InspectorDebuggerAgent::willFireAnimationFrame(Document* document, int call backId)
698 { 698 {
699 m_asyncCallStackTracker.willFireAnimationFrame(callbackId); 699 m_asyncCallStackTracker.willFireAnimationFrame(static_cast<ExecutionContext* >(document), callbackId);
700 return true; 700 return true;
701 } 701 }
702 702
703 void InspectorDebuggerAgent::didFireAnimationFrame() 703 void InspectorDebuggerAgent::didFireAnimationFrame()
704 { 704 {
705 m_asyncCallStackTracker.didFireAsyncCall(); 705 m_asyncCallStackTracker.didFireAsyncCall();
706 } 706 }
707 707
708 void InspectorDebuggerAgent::didHandleEvent() 708 void InspectorDebuggerAgent::didHandleEvent()
709 { 709 {
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 bool isRegex; 1034 bool isRegex;
1035 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); 1035 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex);
1036 String url; 1036 String url;
1037 breakpointObject->getString(DebuggerAgentState::url, &url); 1037 breakpointObject->getString(DebuggerAgentState::url, &url);
1038 if (!matches(scriptURL, url, isRegex)) 1038 if (!matches(scriptURL, url, isRegex))
1039 continue; 1039 continue;
1040 ScriptBreakpoint breakpoint; 1040 ScriptBreakpoint breakpoint;
1041 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint. lineNumber); 1041 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint. lineNumber);
1042 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin t.columnNumber); 1042 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin t.columnNumber);
1043 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c ondition); 1043 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c ondition);
1044 RefPtr<Location> location = resolveBreakpoint(it->key, scriptId, breakpo int, UserBreakpointSource); 1044 RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(it- >key, scriptId, breakpoint, UserBreakpointSource);
1045 if (location) 1045 if (location)
1046 m_frontend->breakpointResolved(it->key, location); 1046 m_frontend->breakpointResolved(it->key, location);
1047 } 1047 }
1048 } 1048 }
1049 1049
1050 void InspectorDebuggerAgent::failedToParseSource(const String& url, const String & data, int firstLine, int errorLine, const String& errorMessage) 1050 void InspectorDebuggerAgent::failedToParseSource(const String& url, const String & data, int firstLine, int errorLine, const String& errorMessage)
1051 { 1051 {
1052 m_frontend->scriptFailedToParse(url, data, firstLine, errorLine, errorMessag e); 1052 m_frontend->scriptFailedToParse(url, data, firstLine, errorLine, errorMessag e);
1053 } 1053 }
1054 1054
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1161 { 1161 {
1162 m_scripts.clear(); 1162 m_scripts.clear();
1163 m_breakpointIdToDebugServerBreakpointIds.clear(); 1163 m_breakpointIdToDebugServerBreakpointIds.clear();
1164 m_asyncCallStackTracker.clear(); 1164 m_asyncCallStackTracker.clear();
1165 if (m_frontend) 1165 if (m_frontend)
1166 m_frontend->globalObjectCleared(); 1166 m_frontend->globalObjectCleared();
1167 } 1167 }
1168 1168
1169 } // namespace WebCore 1169 } // namespace WebCore
1170 1170
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698