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 EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state- >isolate(), value); |
357 if (!target) { | 356 if (!eventTarget) { |
358 *errorString = "No event target with passed objectId"; | 357 *errorString = "No event target with passed objectId"; |
359 return; | 358 return; |
360 } | 359 } |
360 ExecutionContext* executionContext = eventTarget->executionContext(); | |
361 if (!executionContext) { | |
362 *errorString = "ExecutionContext is empty"; | |
363 return; | |
364 } | |
361 | 365 |
366 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | |
362 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); | 367 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); |
368 eventListeners(executionContext, injectedScript, eventTarget, value, objectG roup, listenersArray); | |
369 frameworkEventListeners(executionContext, injectedScript, value, objectGroup , listenersArray); | |
370 } | |
371 | |
372 void InspectorDOMDebuggerAgent::eventListeners(ExecutionContext* executionContex t, InjectedScript& injectedScript, EventTarget* eventTarget, v8::Local<v8::Value > object, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMD ebugger::EventListener>>& listenersArray) | |
373 { | |
363 WillBeHeapVector<EventListenerInfo> eventInformation; | 374 WillBeHeapVector<EventListenerInfo> eventInformation; |
364 EventListenerInfo::getEventListeners(target, eventInformation, false); | 375 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false); |
365 if (eventInformation.isEmpty()) | 376 if (eventInformation.isEmpty()) |
366 return; | 377 return; |
378 v8::Local<v8::Set> frameworkHandlers = injectedScript.frameworksEventHandler s(object); | |
367 | 379 |
368 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | |
369 RegisteredEventListenerIterator iterator(eventInformation); | 380 RegisteredEventListenerIterator iterator(eventInformation); |
370 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { | 381 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { |
382 TypeBuilder::DOMDebugger::EventListener::HandlerType::Enum handlerType = TypeBuilder::DOMDebugger::EventListener::HandlerType::General; | |
371 const EventListenerInfo& info = iterator.currentEventListenerInfo(); | 383 const EventListenerInfo& info = iterator.currentEventListenerInfo(); |
372 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); | 384 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l istener->listener.get()); |
385 if (!frameworkHandlers.IsEmpty()) { | |
386 v8::Maybe<bool> hasHandler = frameworkHandlers->Has(frameworkHandler s->CreationContext(), handler); | |
yurys
2015/08/13 23:49:07
You may need v8::TryCatch to protect against throw
kozy
2015/08/14 17:07:03
Acknowledged.
| |
387 if (hasHandler.IsJust() && hasHandler.FromJust()) | |
388 handlerType = TypeBuilder::DOMDebugger::EventListener::HandlerTy pe::FrameworksInternal; | |
389 } | |
390 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(handler, handlerType, listener->useCapture, info.eventType, executionContext, objectGroup); | |
373 if (listenerObject) | 391 if (listenerObject) |
374 listenersArray->addItem(listenerObject); | 392 listenersArray->addItem(listenerObject); |
375 } | 393 } |
376 } | 394 } |
377 | 395 |
378 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(const RegisteredEventListener& registeredEventListene r, const AtomicString& eventType, EventTarget* target, const String& objectGroup Id) | 396 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) |
379 { | 397 { |
380 EventListener* eventListener = registeredEventListener.listener.get(); | 398 v8::Local<v8::Array> listeners = injectedScript.frameworksEventListeners(obj ect); |
381 RefPtrWillBeRawPtr<EventListener> protect(eventListener); | 399 if (listeners.IsEmpty()) |
400 return; | |
401 ScriptState* scriptState = injectedScript.scriptState(); | |
402 v8::Isolate* isolate = scriptState->isolate(); | |
403 v8::Local<v8::Context> v8Context(listeners->CreationContext()); | |
404 for (unsigned i = 0; i < listeners->Length(); ++i) { | |
405 v8::Local<v8::Value> listener = listeners->Get(v8Context, i).ToLocalChec ked(); | |
yurys
2015/08/13 23:49:07
You should check if the field is present as the ob
kozy
2015/08/14 17:07:03
Done.
| |
406 v8::Local<v8::Object> listenerObject = listener.As<v8::Object>(); | |
407 v8::Local<v8::Function> function = listenerObject->Get(v8Context, v8Stri ng(isolate, "handler")).ToLocalChecked().As<v8::Function>(); | |
408 v8::Local<v8::String> eventType = listenerObject->Get(v8Context, v8Strin g(isolate, "type")).ToLocalChecked().As<v8::String>(); | |
409 v8::Local<v8::Boolean> useCapture = listenerObject->Get(v8Context, v8Str ing(isolate, "useCapture")).ToLocalChecked().As<v8::Boolean>(); | |
410 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(function, TypeBuilder::DOMDebugger::EventListener: :HandlerType::FrameworksResolved, useCapture->Value(), toCoreString(eventType), executionContext, objectGroup); | |
411 if (inspectorListenerObject) | |
412 listenersArray->addItem(inspectorListenerObject); | |
413 } | |
414 } | |
415 | |
416 static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(Executi onContext* context, v8::Local<v8::Object> handler, InjectedScriptManager* manage r, const String* objectGroupId) | |
417 { | |
418 if (handler.IsEmpty() || !context->isDocument()) | |
419 return nullptr; | |
420 | |
421 ScriptState* scriptState = ScriptState::from(handler->CreationContext()); | |
422 LocalFrame* frame = toDocument(context)->frame(); | |
yurys
2015/08/13 23:49:06
Why do we need LocalFrame here? It should work in
kozy
2015/08/14 17:07:03
Done.
| |
423 if (!frame) | |
424 return nullptr; | |
425 | |
426 InjectedScript injectedScript = manager->injectedScriptFor(scriptState); | |
427 if (!injectedScript.isEmpty()) | |
428 return injectedScript.wrapObject(ScriptValue(scriptState, handler), *obj ectGroupId); | |
429 return nullptr; | |
430 } | |
431 | |
432 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(v8::Local<v8::Object> handler, TypeBuilder::DOMDebugg er::EventListener::HandlerType::Enum handlerType, bool useCapture, const String& type, ExecutionContext* context, const String& objectGroupId) | |
433 { | |
434 if (handler.IsEmpty()) | |
435 return nullptr; | |
382 String scriptId; | 436 String scriptId; |
383 int lineNumber; | 437 int lineNumber; |
384 int columnNumber; | 438 int columnNumber; |
385 ExecutionContext* context = target->executionContext(); | 439 v8::Local<v8::Function> function = eventListenerEffectiveFunction(toIsolate( context), handler); |
386 if (!context) | 440 if (function.IsEmpty()) |
387 return nullptr; | 441 return nullptr; |
388 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb er, columnNumber)) | 442 getFunctionLocation(function, scriptId, lineNumber, columnNumber); |
389 return nullptr; | |
390 | |
391 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() | 443 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() |
392 .setScriptId(scriptId) | 444 .setScriptId(scriptId) |
393 .setLineNumber(lineNumber); | 445 .setLineNumber(lineNumber); |
394 location->setColumnNumber(columnNumber); | 446 location->setColumnNumber(columnNumber); |
395 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() | 447 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() |
396 .setType(eventType) | 448 .setType(type) |
397 .setUseCapture(registeredEventListener.useCapture) | 449 .setUseCapture(useCapture) |
398 .setLocation(location); | 450 .setLocation(location); |
451 value->setHandlerType(handlerType); | |
399 if (!objectGroupId.isEmpty()) | 452 if (!objectGroupId.isEmpty()) |
400 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS criptManager, &objectGroupId)); | 453 value->setHandler(eventHandlerObject(context, function, m_injectedScript Manager, &objectGroupId)); |
401 return value.release(); | 454 return value.release(); |
402 } | 455 } |
403 | 456 |
404 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) | 457 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) |
405 { | 458 { |
406 if (hasBreakpoint(parent, SubtreeModified)) { | 459 if (hasBreakpoint(parent, SubtreeModified)) { |
407 RefPtr<JSONObject> eventData = JSONObject::create(); | 460 RefPtr<JSONObject> eventData = JSONObject::create(); |
408 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); | 461 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); |
409 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); | 462 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); |
410 } | 463 } |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
699 return; | 752 return; |
700 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) | 753 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) |
701 return; | 754 return; |
702 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) | 755 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) |
703 return; | 756 return; |
704 m_state->remove(DOMDebuggerAgentState::enabled); | 757 m_state->remove(DOMDebuggerAgentState::enabled); |
705 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); | 758 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); |
706 } | 759 } |
707 | 760 |
708 } // namespace blink | 761 } // namespace blink |
OLD | NEW |