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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 338 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); | 338 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); |
| 339 if (!remoteId) { | 339 if (!remoteId) { |
| 340 *errorString = "Invalid object id"; | 340 *errorString = "Invalid object id"; |
| 341 return; | 341 return; |
| 342 } | 342 } |
| 343 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript( remoteId.get()); | 343 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript( remoteId.get()); |
| 344 if (injectedScript.isEmpty()) { | 344 if (injectedScript.isEmpty()) { |
| 345 *errorString = "Inspected frame has gone"; | 345 *errorString = "Inspected frame has gone"; |
| 346 return; | 346 return; |
| 347 } | 347 } |
| 348 | |
| 349 ScriptState* state = injectedScript.scriptState(); | 348 ScriptState* state = injectedScript.scriptState(); |
| 350 ScriptState::Scope scope(state); | 349 ScriptState::Scope scope(state); |
| 351 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); | 350 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); |
| 352 if (value.IsEmpty()) { | 351 if (value.IsEmpty()) { |
| 353 *errorString = "No object with passed objectId"; | 352 *errorString = "No object with passed objectId"; |
| 354 return; | 353 return; |
| 355 } | 354 } |
| 356 EventTarget* target = InjectedScriptHost::eventTargetFromV8Value(state->isol ate(), value); | 355 |
| 357 if (!target) { | 356 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); |
| 358 *errorString = "No event target with passed objectId"; | 357 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); |
| 358 | |
| 359 eventListeners(injectedScript, value, objectGroup, listenersArray); | |
| 360 frameworkUserEventListeners(injectedScript, value, objectGroup, listenersArr ay); | |
| 361 } | |
| 362 | |
| 363 void InspectorDOMDebuggerAgent::eventListeners(InjectedScript& injectedScript, v 8::Local<v8::Value> object, const String& objectGroup, RefPtr<TypeBuilder::Array <TypeBuilder::DOMDebugger::EventListener>>& listenersArray) | |
| 364 { | |
| 365 ScriptState* state = injectedScript.scriptState(); | |
| 366 EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state- >isolate(), object); | |
| 367 if (!eventTarget) | |
| 359 return; | 368 return; |
| 360 } | 369 ExecutionContext* executionContext = eventTarget->executionContext(); |
| 370 if (!executionContext) | |
| 371 return; | |
| 361 | 372 |
| 362 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); | |
| 363 WillBeHeapVector<EventListenerInfo> eventInformation; | 373 WillBeHeapVector<EventListenerInfo> eventInformation; |
| 364 EventListenerInfo::getEventListeners(target, eventInformation, false); | 374 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false); |
| 365 if (eventInformation.isEmpty()) | 375 if (eventInformation.isEmpty()) |
| 366 return; | 376 return; |
| 367 | 377 |
| 368 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | 378 v8::Local<v8::Set> frameworkInternalEventHandlers = injectedScript.framework InternalEventHandlers(object); |
| 379 v8::Local<v8::Context> v8Context(frameworkInternalEventHandlers->CreationCon text()); | |
| 380 | |
| 381 using ListenerType = TypeBuilder::DOMDebugger::EventListener::ListenerType; | |
| 369 RegisteredEventListenerIterator iterator(eventInformation); | 382 RegisteredEventListenerIterator iterator(eventInformation); |
| 370 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { | 383 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { |
| 384 ListenerType::Enum listenerType = ListenerType::Normal; | |
| 385 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l istener->listener.get()); | |
| 386 | |
| 387 if (!frameworkInternalEventHandlers.IsEmpty()) { | |
| 388 v8::Maybe<bool> hasHandler = frameworkInternalEventHandlers->Has(v8C ontext, handler); | |
| 389 if (hasHandler.IsJust() && hasHandler.FromJust()) | |
| 390 listenerType = ListenerType::FrameworkInternal; | |
| 391 } | |
| 392 | |
| 371 const EventListenerInfo& info = iterator.currentEventListenerInfo(); | 393 const EventListenerInfo& info = iterator.currentEventListenerInfo(); |
| 372 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); | 394 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(injectedScript, handler, listenerType, listener->useCapture , info.eventType, objectGroup); |
| 373 if (listenerObject) | 395 if (listenerObject) |
| 374 listenersArray->addItem(listenerObject); | 396 listenersArray->addItem(listenerObject); |
| 375 } | 397 } |
| 376 } | 398 } |
| 377 | 399 |
| 378 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(const RegisteredEventListener& registeredEventListene r, const AtomicString& eventType, EventTarget* target, const String& objectGroup Id) | 400 void InspectorDOMDebuggerAgent::frameworkUserEventListeners(InjectedScript& inje ctedScript, v8::Local<v8::Value> object, const String& objectGroup, RefPtr<Type Builder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
| 379 { | 401 { |
| 380 EventListener* eventListener = registeredEventListener.listener.get(); | 402 v8::Local<v8::Array> listeners = injectedScript.frameworkUserEventListeners( object); |
| 381 RefPtrWillBeRawPtr<EventListener> protect(eventListener); | 403 if (listeners.IsEmpty()) |
| 404 return; | |
| 405 | |
| 406 ScriptState* scriptState = injectedScript.scriptState(); | |
| 407 v8::Isolate* isolate = scriptState->isolate(); | |
| 408 v8::Local<v8::Context> v8Context(listeners->CreationContext()); | |
| 409 for (unsigned i = 0; i < listeners->Length(); ++i) { | |
| 410 v8::Local<v8::Value> value; | |
| 411 | |
| 412 v8::Local<v8::Object> listenerObject; | |
| 413 if (listeners->Get(v8Context, i).ToLocal(&value)) { | |
| 414 if (value->IsObject()) | |
| 415 listenerObject = value.As<v8::Object>(); | |
| 416 else | |
| 417 continue; | |
| 418 } | |
| 419 | |
| 420 v8::Local<v8::Function> handler; | |
| 421 if (listenerObject->Get(v8Context, v8String(isolate, "handler")).ToLocal (&value)) { | |
| 422 if (value->IsFunction()) | |
| 423 handler = value.As<v8::Function>(); | |
| 424 else | |
| 425 continue; | |
| 426 } | |
| 427 | |
| 428 v8::Local<v8::String> type; | |
| 429 if (listenerObject->Get(v8Context, v8String(isolate, "type")).ToLocal(&v alue)) { | |
| 430 if (value->IsString()) | |
| 431 type = value.As<v8::String>(); | |
| 432 else | |
| 433 continue; | |
| 434 } | |
| 435 | |
| 436 v8::Local<v8::Boolean> useCapture; | |
| 437 if (listenerObject->Get(v8Context, v8String(isolate, "useCapture")).ToLo cal(&value)) { | |
| 438 if (value->IsBoolean()) | |
| 439 useCapture = value.As<v8::Boolean>(); | |
| 440 else | |
| 441 continue; | |
| 442 } | |
| 443 | |
| 444 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(injectedScript, handler, TypeBuilder::DOMDebugger: :EventListener::ListenerType::FrameworkUser, useCapture->Value(), toCoreString(t ype), objectGroup); | |
| 445 if (inspectorListenerObject) | |
| 446 listenersArray->addItem(inspectorListenerObject); | |
| 447 } | |
| 448 } | |
| 449 | |
|
yurys
2015/08/14 17:24:20
Consider inlining this function.
kozy
2015/08/14 18:15:45
Done.
| |
| 450 static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(v8::Loc al<v8::Object> handler, InjectedScriptManager* manager, const String* objectGrou pId) | |
| 451 { | |
| 452 if (handler.IsEmpty()) | |
| 453 return nullptr; | |
| 454 ScriptState* scriptState = ScriptState::from(handler->CreationContext()); | |
| 455 InjectedScript injectedScript = manager->injectedScriptFor(scriptState); | |
| 456 if (!injectedScript.isEmpty()) | |
| 457 return injectedScript.wrapObject(ScriptValue(scriptState, handler), *obj ectGroupId); | |
| 458 return nullptr; | |
| 459 } | |
| 460 | |
| 461 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(InjectedScript& injectedScript, v8::Local<v8::Object> handler, TypeBuilder::DOMDebugger::EventListener::ListenerType::Enum listenerTy pe, bool useCapture, const String& type, const String& objectGroupId) | |
| 462 { | |
| 463 if (handler.IsEmpty()) | |
| 464 return nullptr; | |
| 465 | |
| 466 ScriptState* scriptState = injectedScript.scriptState(); | |
| 467 v8::Isolate* isolate = scriptState->isolate(); | |
| 468 v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, h andler); | |
| 469 if (function.IsEmpty()) | |
| 470 return nullptr; | |
| 471 | |
| 382 String scriptId; | 472 String scriptId; |
| 383 int lineNumber; | 473 int lineNumber; |
| 384 int columnNumber; | 474 int columnNumber; |
| 385 ExecutionContext* context = target->executionContext(); | 475 getFunctionLocation(function, scriptId, lineNumber, columnNumber); |
| 386 if (!context) | |
| 387 return nullptr; | |
| 388 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb er, columnNumber)) | |
| 389 return nullptr; | |
| 390 | 476 |
| 391 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() | 477 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() |
| 392 .setScriptId(scriptId) | 478 .setScriptId(scriptId) |
| 393 .setLineNumber(lineNumber); | 479 .setLineNumber(lineNumber); |
| 394 location->setColumnNumber(columnNumber); | 480 location->setColumnNumber(columnNumber); |
| 395 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() | 481 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() |
| 396 .setType(eventType) | 482 .setType(type) |
| 397 .setUseCapture(registeredEventListener.useCapture) | 483 .setUseCapture(useCapture) |
| 398 .setLocation(location); | 484 .setLocation(location); |
| 485 value->setListenerType(listenerType); | |
| 399 if (!objectGroupId.isEmpty()) | 486 if (!objectGroupId.isEmpty()) |
| 400 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS criptManager, &objectGroupId)); | 487 value->setHandler(eventHandlerObject(function, m_injectedScriptManager, &objectGroupId)); |
| 401 return value.release(); | 488 return value.release(); |
| 402 } | 489 } |
| 403 | 490 |
| 404 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) | 491 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) |
| 405 { | 492 { |
| 406 if (hasBreakpoint(parent, SubtreeModified)) { | 493 if (hasBreakpoint(parent, SubtreeModified)) { |
| 407 RefPtr<JSONObject> eventData = JSONObject::create(); | 494 RefPtr<JSONObject> eventData = JSONObject::create(); |
| 408 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); | 495 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); |
| 409 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); | 496 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); |
| 410 } | 497 } |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 699 return; | 786 return; |
| 700 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) | 787 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) |
| 701 return; | 788 return; |
| 702 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) | 789 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) |
| 703 return; | 790 return; |
| 704 m_state->remove(DOMDebuggerAgentState::enabled); | 791 m_state->remove(DOMDebuggerAgentState::enabled); |
| 705 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); | 792 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); |
| 706 } | 793 } |
| 707 | 794 |
| 708 } // namespace blink | 795 } // namespace blink |
| OLD | NEW |