Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 m_domBreakpoints.set(node, mask); | 337 m_domBreakpoints.set(node, mask); |
| 338 else | 338 else |
| 339 m_domBreakpoints.remove(node); | 339 m_domBreakpoints.remove(node); |
| 340 | 340 |
| 341 if ((rootBit & inheritableDOMBreakpointTypesMask) && !(mask & (rootBit << do mBreakpointDerivedTypeShift))) { | 341 if ((rootBit & inheritableDOMBreakpointTypesMask) && !(mask & (rootBit << do mBreakpointDerivedTypeShift))) { |
| 342 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; chil d = InspectorDOMAgent::innerNextSibling(child)) | 342 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; chil d = InspectorDOMAgent::innerNextSibling(child)) |
| 343 updateSubtreeBreakpoints(child, rootBit, false); | 343 updateSubtreeBreakpoints(child, rootBit, false); |
| 344 } | 344 } |
| 345 } | 345 } |
| 346 | 346 |
| 347 void InspectorDOMDebuggerAgent::getEventListeners(ErrorString* errorString, cons t String& objectId, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventLis tener>>& listenersArray) | 347 void InspectorDOMDebuggerAgent::getEventListeners(ErrorString* errorString, cons t String& objectId, const bool* resolveFrameworkHandlers, RefPtr<TypeBuilder::Ar ray<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
| 348 { | 348 { |
| 349 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); | 349 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); |
| 350 if (!remoteId) { | 350 if (!remoteId) { |
| 351 *errorString = "Invalid object id"; | 351 *errorString = "Invalid object id"; |
| 352 return; | 352 return; |
| 353 } | 353 } |
| 354 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript( remoteId.get()); | 354 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript( remoteId.get()); |
| 355 if (injectedScript.isEmpty()) { | 355 if (injectedScript.isEmpty()) { |
| 356 *errorString = "Inspected frame has gone"; | 356 *errorString = "Inspected frame has gone"; |
| 357 return; | 357 return; |
| 358 } | 358 } |
| 359 | |
| 360 ScriptState* state = injectedScript.scriptState(); | 359 ScriptState* state = injectedScript.scriptState(); |
| 361 ScriptState::Scope scope(state); | 360 ScriptState::Scope scope(state); |
| 362 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); | 361 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); |
| 363 if (value.IsEmpty()) { | 362 if (value.IsEmpty()) { |
| 364 *errorString = "No object with passed objectId"; | 363 *errorString = "No object with passed objectId"; |
| 365 return; | 364 return; |
| 366 } | 365 } |
| 367 EventTarget* target = InjectedScriptHost::eventTargetFromV8Value(state->isol ate(), value); | 366 EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state- >isolate(), value); |
| 368 if (!target) { | 367 if (!eventTarget) { |
| 369 *errorString = "No event target with passed objectId"; | 368 *errorString = "No event target with passed objectId"; |
| 370 return; | 369 return; |
| 371 } | 370 } |
| 371 ExecutionContext* executionContext = eventTarget->executionContext(); | |
| 372 if (!executionContext) { | |
| 373 *errorString = "ExecutionContext is empty"; | |
| 374 return; | |
| 375 } | |
| 372 | 376 |
| 377 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | |
| 373 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); | 378 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); |
| 379 eventListeners(executionContext, injectedScript, eventTarget, value, objectG roup, asBool(resolveFrameworkHandlers), listenersArray); | |
| 380 if (asBool(resolveFrameworkHandlers)) | |
| 381 frameworkEventListeners(executionContext, injectedScript, value, objectG roup, listenersArray); | |
| 382 } | |
| 383 | |
| 384 void InspectorDOMDebuggerAgent::eventListeners(ExecutionContext* executionContex t, InjectedScript& injectedScript, EventTarget* eventTarget, v8::Local<v8::Value > object, const String& objectGroup, bool filterFrameworkHandlers, RefPtr<TypeBu ilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) | |
| 385 { | |
| 374 WillBeHeapVector<EventListenerInfo> eventInformation; | 386 WillBeHeapVector<EventListenerInfo> eventInformation; |
| 375 EventListenerInfo::getEventListeners(target, eventInformation, false); | 387 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false); |
| 376 if (eventInformation.isEmpty()) | 388 if (eventInformation.isEmpty()) |
| 377 return; | 389 return; |
| 390 v8::Local<v8::Set> frameworkHandlers; | |
| 391 if (filterFrameworkHandlers) | |
| 392 filterFrameworkHandlers = injectedScript.frameworkEventHandlers(object). ToLocal(&frameworkHandlers); | |
| 378 | 393 |
| 379 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | |
| 380 RegisteredEventListenerIterator iterator(eventInformation); | 394 RegisteredEventListenerIterator iterator(eventInformation); |
| 381 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { | 395 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { |
| 382 const EventListenerInfo& info = iterator.currentEventListenerInfo(); | 396 const EventListenerInfo& info = iterator.currentEventListenerInfo(); |
| 383 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); | 397 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l istener->listener.get()); |
| 398 | |
| 399 if (filterFrameworkHandlers) { | |
| 400 v8::Maybe<bool> hasHandler = frameworkHandlers->Has(frameworkHandler s->CreationContext(), handler); | |
| 401 if (hasHandler.IsJust() && hasHandler.FromJust()) | |
| 402 continue; | |
| 403 } | |
| 404 | |
| 405 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(handler, listener->useCapture, info.eventType, executionCon text, objectGroup); | |
| 384 if (listenerObject) | 406 if (listenerObject) |
| 385 listenersArray->addItem(listenerObject); | 407 listenersArray->addItem(listenerObject); |
| 386 } | 408 } |
| 387 } | 409 } |
| 388 | 410 |
| 389 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(const RegisteredEventListener& registeredEventListene r, const AtomicString& eventType, EventTarget* target, const String& objectGroup Id) | 411 void InspectorDOMDebuggerAgent::frameworkEventListeners(ExecutionContext* execut ionContext, InjectedScript& injectedScript, v8::Local<v8::Value> object, const S tring& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventLi stener>>& listenersArray) |
| 390 { | 412 { |
| 391 EventListener* eventListener = registeredEventListener.listener.get(); | 413 v8::MaybeLocal<v8::Array> listeners = injectedScript.frameworkEventListeners (object); |
| 392 RefPtrWillBeRawPtr<EventListener> protect(eventListener); | 414 if (listeners.IsEmpty()) |
| 415 return; | |
| 416 v8::Local<v8::Array> array = listeners.ToLocalChecked(); | |
| 417 | |
| 418 ScriptState* scriptState = injectedScript.scriptState(); | |
| 419 v8::Isolate* isolate = scriptState->isolate(); | |
| 420 v8::Local<v8::Context> v8Context(array->CreationContext()); | |
| 421 for (unsigned i = 0; i < array->Length(); ++i) { | |
| 422 v8::Local<v8::Value> listener = array->Get(array->CreationContext(), i). ToLocalChecked(); | |
|
yurys
2015/08/12 21:56:03
v8Context
| |
| 423 v8::Local<v8::Object> listenerObject = listener.As<v8::Object>(); | |
| 424 v8::Local<v8::Function> function = listenerObject->Get(v8Context, v8Stri ng(isolate, "handler")).ToLocalChecked().As<v8::Function>(); | |
| 425 v8::Local<v8::String> eventType = listenerObject->Get(v8Context, v8Strin g(isolate, "type")).ToLocalChecked().As<v8::String>(); | |
| 426 v8::Local<v8::Boolean> useCapture = listenerObject->Get(v8Context, v8Str ing(isolate, "useCapture")).ToLocalChecked().As<v8::Boolean>(); | |
| 427 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(function, useCapture->Value(), toCoreString(eventT ype), executionContext, objectGroup); | |
| 428 if (inspectorListenerObject) | |
| 429 listenersArray->addItem(inspectorListenerObject); | |
| 430 } | |
| 431 } | |
| 432 | |
| 433 static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(Executi onContext* context, v8::Local<v8::Object> handler, InjectedScriptManager* manage r, const String* objectGroupId) | |
| 434 { | |
| 435 if (handler.IsEmpty() || !context->isDocument()) | |
| 436 return nullptr; | |
| 437 | |
| 438 ScriptState* scriptState = ScriptState::from(handler->CreationContext()); | |
| 439 LocalFrame* frame = toDocument(context)->frame(); | |
| 440 if (!frame) | |
| 441 return nullptr; | |
| 442 | |
| 443 InjectedScript injectedScript = manager->injectedScriptFor(scriptState); | |
| 444 if (!injectedScript.isEmpty()) | |
| 445 return injectedScript.wrapObject(ScriptValue(scriptState, handler), *obj ectGroupId); | |
| 446 return nullptr; | |
| 447 } | |
| 448 | |
| 449 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(v8::Local<v8::Object> handler, bool useCapture, const String& type, ExecutionContext* context, const String& objectGroupId) | |
| 450 { | |
| 451 if (handler.IsEmpty()) | |
| 452 return nullptr; | |
| 393 String scriptId; | 453 String scriptId; |
| 394 int lineNumber; | 454 int lineNumber; |
| 395 int columnNumber; | 455 int columnNumber; |
| 396 ExecutionContext* context = target->executionContext(); | 456 v8::Local<v8::Function> function = eventListenerEffectiveFunction(toIsolate( context), handler); |
| 397 if (!context) | 457 if (function.IsEmpty()) |
| 398 return nullptr; | 458 return nullptr; |
| 399 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb er, columnNumber)) | 459 getFunctionLocation(function, scriptId, lineNumber, columnNumber); |
| 400 return nullptr; | |
| 401 | |
| 402 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() | 460 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() |
| 403 .setScriptId(scriptId) | 461 .setScriptId(scriptId) |
| 404 .setLineNumber(lineNumber); | 462 .setLineNumber(lineNumber); |
| 405 location->setColumnNumber(columnNumber); | 463 location->setColumnNumber(columnNumber); |
| 406 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() | 464 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() |
| 407 .setType(eventType) | 465 .setType(type) |
| 408 .setUseCapture(registeredEventListener.useCapture) | 466 .setUseCapture(useCapture) |
| 409 .setLocation(location); | 467 .setLocation(location); |
| 410 if (!objectGroupId.isEmpty()) | 468 if (!objectGroupId.isEmpty()) |
| 411 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS criptManager, &objectGroupId)); | 469 value->setHandler(eventHandlerObject(context, function, m_injectedScript Manager, &objectGroupId)); |
| 412 return value.release(); | 470 return value.release(); |
| 413 } | 471 } |
| 414 | 472 |
| 415 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) | 473 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) |
| 416 { | 474 { |
| 417 if (hasBreakpoint(parent, SubtreeModified)) { | 475 if (hasBreakpoint(parent, SubtreeModified)) { |
| 418 RefPtr<JSONObject> eventData = JSONObject::create(); | 476 RefPtr<JSONObject> eventData = JSONObject::create(); |
| 419 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); | 477 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); |
| 420 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); | 478 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); |
| 421 } | 479 } |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 682 eventData->setString("url", url); | 740 eventData->setString("url", url); |
| 683 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release()); | 741 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release()); |
| 684 } | 742 } |
| 685 | 743 |
| 686 void InspectorDOMDebuggerAgent::clear() | 744 void InspectorDOMDebuggerAgent::clear() |
| 687 { | 745 { |
| 688 m_domBreakpoints.clear(); | 746 m_domBreakpoints.clear(); |
| 689 } | 747 } |
| 690 | 748 |
| 691 } // namespace blink | 749 } // namespace blink |
| OLD | NEW |