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 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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, eventTarget, objectGroup, listenersArray); | |
380 librariesEventListeners(executionContext, injectedScript, objectId, objectGr oup, listenersArray); | |
381 } | |
382 | |
383 void InspectorDOMDebuggerAgent::eventListeners(ExecutionContext* executionContex t, EventTarget* eventTarget, const String& objectGroup, RefPtr<TypeBuilder::Arr ay<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) | |
384 { | |
374 WillBeHeapVector<EventListenerInfo> eventInformation; | 385 WillBeHeapVector<EventListenerInfo> eventInformation; |
375 EventListenerInfo::getEventListeners(target, eventInformation, false); | 386 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false); |
376 if (eventInformation.isEmpty()) | 387 if (eventInformation.isEmpty()) |
377 return; | 388 return; |
378 | |
379 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | |
380 RegisteredEventListenerIterator iterator(eventInformation); | 389 RegisteredEventListenerIterator iterator(eventInformation); |
381 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { | 390 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { |
382 const EventListenerInfo& info = iterator.currentEventListenerInfo(); | 391 const EventListenerInfo& info = iterator.currentEventListenerInfo(); |
383 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); | 392 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l istener->listener.get()); |
393 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(handler, listener->useCapture, info.eventType, executionCon text, objectGroup); | |
384 if (listenerObject) | 394 if (listenerObject) |
385 listenersArray->addItem(listenerObject); | 395 listenersArray->addItem(listenerObject); |
386 } | 396 } |
387 } | 397 } |
388 | 398 |
389 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(const RegisteredEventListener& registeredEventListene r, const AtomicString& eventType, EventTarget* target, const String& objectGroup Id) | 399 void InspectorDOMDebuggerAgent::librariesEventListeners(ExecutionContext* execut ionContext, InjectedScript& injectedScript, const String& objectId, const String & objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListene r>>& listenersArray) |
390 { | 400 { |
391 EventListener* eventListener = registeredEventListener.listener.get(); | 401 ScriptValue listeners = injectedScript.librariesEventListeners(objectId); |
yurys
2015/08/11 21:10:24
Can we make injectedScript.librariesEventListeners
kozy
2015/08/12 18:02:22
Done.
| |
392 RefPtrWillBeRawPtr<EventListener> protect(eventListener); | 402 if (listeners.isEmpty()) |
403 return; | |
404 v8::Local<v8::Value> listenersValue = listeners.v8Value(); | |
405 v8::Local<v8::Array> array = listenersValue.As<v8::Array>(); | |
406 | |
407 ScriptState* scriptState = injectedScript.scriptState(); | |
408 v8::Isolate* isolate = scriptState->isolate(); | |
409 v8::Local<v8::Context> v8Context(array->CreationContext()); | |
410 for (unsigned i = 0; i < array->Length(); ++i) { | |
411 fprintf(stderr, "Added!\n"); | |
yurys
2015/08/11 21:10:24
remove debug print
kozy
2015/08/12 18:02:23
Done.
| |
412 v8::Local<v8::Value> listener = array->Get(array->CreationContext(), i). ToLocalChecked(); | |
413 v8::Local<v8::Object> listenerObject = listener.As<v8::Object>(); | |
414 v8::Local<v8::Function> function = listenerObject->Get(v8Context, v8Stri ng(isolate, "handler")).ToLocalChecked().As<v8::Function>(); | |
415 v8::Local<v8::String> eventType = listenerObject->Get(v8Context, v8Strin g(isolate, "type")).ToLocalChecked().As<v8::String>(); | |
416 v8::Local<v8::Boolean> useCapture = listenerObject->Get(v8Context, v8Str ing(isolate, "useCapture")).ToLocalChecked().As<v8::Boolean>(); | |
417 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(function, useCapture->Value(), toCoreString(eventT ype), executionContext, objectGroup); | |
418 if (inspectorListenerObject) | |
419 listenersArray->addItem(inspectorListenerObject); | |
420 } | |
421 } | |
422 | |
423 static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(Executi onContext* context, v8::Local<v8::Object> handler, InjectedScriptManager* manage r, const String* objectGroupId) | |
424 { | |
425 if (handler.IsEmpty() || !context->isDocument()) | |
426 return nullptr; | |
427 | |
428 ScriptState* scriptState = ScriptState::from(handler->CreationContext()); | |
429 LocalFrame* frame = toDocument(context)->frame(); | |
430 if (!frame) | |
431 return nullptr; | |
432 | |
433 InjectedScript injectedScript = manager->injectedScriptFor(scriptState); | |
434 if (!injectedScript.isEmpty()) | |
435 return injectedScript.wrapObject(ScriptValue(scriptState, handler), *obj ectGroupId); | |
436 return nullptr; | |
437 } | |
438 | |
439 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(v8::Local<v8::Object> handler, bool useCapture, const String& type, ExecutionContext* context, const String& objectGroupId) | |
440 { | |
441 if (handler.IsEmpty()) { | |
442 fprintf(stderr, "handler is empty\n"); | |
yurys
2015/08/11 21:10:25
remove debug print
kozy
2015/08/12 18:02:23
Done.
| |
443 return nullptr; | |
444 } | |
393 String scriptId; | 445 String scriptId; |
394 int lineNumber; | 446 int lineNumber; |
395 int columnNumber; | 447 int columnNumber; |
396 ExecutionContext* context = target->executionContext(); | 448 v8::Local<v8::Function> function = eventListenerEffectiveFunction(toIsolate( context), handler); |
397 if (!context) | 449 if (function.IsEmpty()) { |
450 fprintf(stderr, "function is empty\n"); | |
yurys
2015/08/11 21:10:25
remove debug print
kozy
2015/08/12 18:02:23
Done.
| |
398 return nullptr; | 451 return nullptr; |
399 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb er, columnNumber)) | 452 } |
400 return nullptr; | 453 functionLocation(function, scriptId, lineNumber, columnNumber); |
401 | |
402 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() | 454 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() |
403 .setScriptId(scriptId) | 455 .setScriptId(scriptId) |
404 .setLineNumber(lineNumber); | 456 .setLineNumber(lineNumber); |
405 location->setColumnNumber(columnNumber); | 457 location->setColumnNumber(columnNumber); |
406 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() | 458 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() |
407 .setType(eventType) | 459 .setType(type) |
408 .setUseCapture(registeredEventListener.useCapture) | 460 .setUseCapture(useCapture) |
409 .setLocation(location); | 461 .setLocation(location); |
410 if (!objectGroupId.isEmpty()) | 462 if (!objectGroupId.isEmpty()) |
411 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS criptManager, &objectGroupId)); | 463 value->setHandler(eventHandlerObject(context, handler, m_injectedScriptM anager, &objectGroupId)); |
412 return value.release(); | 464 return value.release(); |
413 } | 465 } |
414 | 466 |
415 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) | 467 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) |
416 { | 468 { |
417 if (hasBreakpoint(parent, SubtreeModified)) { | 469 if (hasBreakpoint(parent, SubtreeModified)) { |
418 RefPtr<JSONObject> eventData = JSONObject::create(); | 470 RefPtr<JSONObject> eventData = JSONObject::create(); |
419 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); | 471 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); |
420 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); | 472 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); |
421 } | 473 } |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
682 eventData->setString("url", url); | 734 eventData->setString("url", url); |
683 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release()); | 735 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release()); |
684 } | 736 } |
685 | 737 |
686 void InspectorDOMDebuggerAgent::clear() | 738 void InspectorDOMDebuggerAgent::clear() |
687 { | 739 { |
688 m_domBreakpoints.clear(); | 740 m_domBreakpoints.clear(); |
689 } | 741 } |
690 | 742 |
691 } // namespace blink | 743 } // namespace blink |
OLD | NEW |