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 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 |