void ScriptDebugServer::pauseIfNeeded(JSGlobalObject* dynamicGlobalObject) { if (m_paused) return; if (!getListenersForGlobalObject(dynamicGlobalObject)) return; bool pauseNow = m_pauseOnNextStatement; pauseNow |= (m_pauseOnCallFrame == m_currentCallFrame); pauseNow |= hasBreakpoint(m_currentCallFrame->sourceID(), m_currentCallFrame->position()); m_lastExecutedLine = m_currentCallFrame->position().m_line.zeroBasedInt(); if (!pauseNow) return; m_pauseOnCallFrame = 0; m_pauseOnNextStatement = false; m_paused = true; dispatchFunctionToListeners(&ScriptDebugServer::dispatchDidPause, dynamicGlobalObject); didPause(dynamicGlobalObject); TimerBase::fireTimersInNestedEventLoop(); m_runningNestedMessageLoop = true; m_doneProcessingDebuggerEvents = false; runEventLoopWhilePaused(); m_runningNestedMessageLoop = false; didContinue(dynamicGlobalObject); dispatchFunctionToListeners(&ScriptDebugServer::dispatchDidContinue, dynamicGlobalObject); m_paused = false; }
void ScriptDebugServer::pauseIfNeeded(JSGlobalObject* dynamicGlobalObject) { if (m_paused) return; if (!getListenersForGlobalObject(dynamicGlobalObject)) return; bool pauseNow = m_pauseOnNextStatement; pauseNow |= (m_pauseOnCallFrame == m_currentCallFrame); pauseNow |= hasBreakpoint(m_currentCallFrame->sourceID(), m_currentCallFrame->position()); if (!pauseNow) return; m_pauseOnCallFrame = 0; m_pauseOnNextStatement = false; m_paused = true; dispatchFunctionToListeners(&ScriptDebugServer::dispatchDidPause, dynamicGlobalObject); didPause(dynamicGlobalObject); TimerBase::fireTimersInNestedEventLoop(); EventLoop loop; m_doneProcessingDebuggerEvents = false; while (!m_doneProcessingDebuggerEvents && !loop.ended()) loop.cycle(); didContinue(dynamicGlobalObject); dispatchFunctionToListeners(&ScriptDebugServer::dispatchDidContinue, dynamicGlobalObject); m_paused = false; }
void ScriptDebugServer::dispatchFunctionToListeners(JavaScriptExecutionCallback callback, JSGlobalObject* globalObject) { if (m_callingListeners) return; TemporaryChange<bool> change(m_callingListeners, true); if (ListenerSet* listeners = getListenersForGlobalObject(globalObject)) { ASSERT(!listeners->isEmpty()); dispatchFunctionToListeners(*listeners, callback); } }
void ScriptDebugServer::dispatchFunctionToListeners(JavaScriptExecutionCallback callback, JSGlobalObject* globalObject) { if (m_callingListeners) return; m_callingListeners = true; if (ListenerSet* listeners = getListenersForGlobalObject(globalObject)) { ASSERT(!listeners->isEmpty()); dispatchFunctionToListeners(*listeners, callback); } m_callingListeners = false; }
void ScriptDebugServer::pauseIfNeeded(CallFrame* callFrame) { if (m_paused) return; JSGlobalObject* dynamicGlobalObject = callFrame->dynamicGlobalObject(); if (!getListenersForGlobalObject(dynamicGlobalObject)) return; ScriptBreakpoint breakpoint; bool didHitBreakpoint = false; bool pauseNow = m_pauseOnNextStatement; pauseNow |= (m_pauseOnCallFrame == m_currentCallFrame); intptr_t sourceId = DebuggerCallFrame::sourceIdForCallFrame(m_currentCallFrame); TextPosition position = DebuggerCallFrame::positionForCallFrame(m_currentCallFrame); pauseNow |= didHitBreakpoint = hasBreakpoint(sourceId, position, &breakpoint); m_lastExecutedLine = position.m_line.zeroBasedInt(); if (!pauseNow) return; DebuggerCallFrameScope debuggerCallFrameScope(*this); if (didHitBreakpoint) { evaluateBreakpointActions(breakpoint); if (breakpoint.autoContinue) return; } m_pauseOnCallFrame = 0; m_pauseOnNextStatement = false; m_paused = true; dispatchFunctionToListeners(&ScriptDebugServer::dispatchDidPause, dynamicGlobalObject); didPause(dynamicGlobalObject); TimerBase::fireTimersInNestedEventLoop(); m_runningNestedMessageLoop = true; m_doneProcessingDebuggerEvents = false; runEventLoopWhilePaused(); m_runningNestedMessageLoop = false; didContinue(dynamicGlobalObject); dispatchFunctionToListeners(&ScriptDebugServer::dispatchDidContinue, dynamicGlobalObject); m_paused = false; }
void ScriptDebugServer::dispatchDidSampleProbe(ExecState* exec, int identifier, const Deprecated::ScriptValue& sample) { if (m_callingListeners) return; ListenerSet* listeners = getListenersForGlobalObject(exec->lexicalGlobalObject()); if (!listeners) return; ASSERT(!listeners->isEmpty()); TemporaryChange<bool> change(m_callingListeners, true); Vector<ScriptDebugListener*> listenersCopy; copyToVector(*listeners, listenersCopy); for (auto listener : listenersCopy) listener->didSampleProbe(exec, identifier, m_hitCount, sample); }
void ScriptDebugServer::dispatchBreakpointActionSound(ExecState* exec) { if (m_callingListeners) return; ListenerSet* listeners = getListenersForGlobalObject(exec->lexicalGlobalObject()); if (!listeners) return; ASSERT(!listeners->isEmpty()); TemporaryChange<bool> change(m_callingListeners, true); Vector<ScriptDebugListener*> listenersCopy; copyToVector(*listeners, listenersCopy); for (auto listener : listenersCopy) listener->breakpointActionSound(); }
void ScriptDebugServer::sourceParsed(ExecState* exec, SourceProvider* sourceProvider, int errorLine, const String& errorMessage) { if (m_callingListeners) return; ListenerSet* listeners = getListenersForGlobalObject(exec->lexicalGlobalObject()); if (!listeners) return; ASSERT(!listeners->isEmpty()); TemporaryChange<bool> change(m_callingListeners, true); bool isError = errorLine != -1; if (isError) dispatchFailedToParseSource(*listeners, sourceProvider, errorLine, errorMessage); else dispatchDidParseSource(*listeners, sourceProvider, isContentScript(exec)); }
bool ScriptDebugServer::needPauseHandling(JSGlobalObject* globalObject) { return !!getListenersForGlobalObject(globalObject); }