bool VoidCallbackFunctionInterfaceArg::call(ScriptWrappable* scriptWrappable, HTMLDivElement* divElement) { if (!m_scriptState->contextIsValid()) return false; ExecutionContext* context = m_scriptState->getExecutionContext(); DCHECK(context); if (context->activeDOMObjectsAreSuspended() || context->isContextDestroyed()) return false; if (m_callback.isEmpty()) return false; // TODO(bashi): Make sure that using DummyExceptionStateForTesting is OK. // crbug.com/653769 DummyExceptionStateForTesting exceptionState; ScriptState::Scope scope(m_scriptState.get()); v8::Local<v8::Value> divElementArgument = toV8(divElement, m_scriptState->context()->Global(), m_scriptState->isolate()); v8::Local<v8::Value> thisValue = toV8(scriptWrappable, m_scriptState->context()->Global(), m_scriptState->isolate()); v8::Local<v8::Value> argv[] = { divElementArgument }; v8::Local<v8::Value> v8ReturnValue; v8::TryCatch exceptionCatcher(m_scriptState->isolate()); exceptionCatcher.SetVerbose(true); if (V8ScriptRunner::callFunction(m_callback.newLocal(m_scriptState->isolate()), m_scriptState->getExecutionContext(), thisValue, 1, argv, m_scriptState->isolate()).ToLocal(&v8ReturnValue)) { return true; } return false; }
void SuspendableScriptExecutor::run() { suspendIfNeeded(); ExecutionContext* context = executionContext(); ASSERT(context); if (context && !context->activeDOMObjectsAreSuspended()) executeAndDestroySelf(); }
void SuspendableScriptExecutor::run() { ExecutionContext* context = getExecutionContext(); DCHECK(context); if (!context->activeDOMObjectsAreSuspended()) { suspendIfNeeded(); executeAndDestroySelf(); return; } startOneShot(0, BLINK_FROM_HERE); suspendIfNeeded(); }
void IntersectionObserverController::deliverIntersectionObservations() { ExecutionContext* context = getExecutionContext(); if (!context) { m_pendingIntersectionObservers.clear(); return; } if (context->activeDOMObjectsAreSuspended()) { m_callbackFiredWhileSuspended = true; return; } HeapHashSet<Member<IntersectionObserver>> observers; m_pendingIntersectionObservers.swap(observers); for (auto& observer : observers) observer->deliver(); }
void DOMTimer::fired() { ExecutionContext* context = getExecutionContext(); ASSERT(context); context->timers()->setTimerNestingLevel(m_nestingLevel); ASSERT(!context->activeDOMObjectsAreSuspended()); // Only the first execution of a multi-shot timer should get an affirmative user gesture indicator. UserGestureIndicator gestureIndicator(m_userGestureToken.release()); TRACE_EVENT1("devtools.timeline", "TimerFire", "data", InspectorTimerFireEvent::data(context, m_timeoutID)); InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireTimer(context, m_timeoutID); // Simple case for non-one-shot timers. if (isActive()) { if (repeatInterval() && repeatInterval() < minimumInterval) { m_nestingLevel++; if (m_nestingLevel >= maxTimerNestingLevel) augmentRepeatInterval(minimumInterval - repeatInterval()); } // No access to member variables after this point, it can delete the timer. m_action->execute(context); InspectorInstrumentation::didFireTimer(cookie); return; } RawPtr<DOMTimer> protect(this); // Unregister the timer from ExecutionContext before executing the action // for one-shot timers. RawPtr<ScheduledAction> action = m_action.release(); context->timers()->removeTimeoutByID(m_timeoutID); action->execute(context); InspectorInstrumentation::didFireTimer(cookie); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data()); // ExecutionContext might be already gone when we executed action->execute(). if (getExecutionContext()) getExecutionContext()->timers()->setTimerNestingLevel(0); }
void DOMTimer::fired() { ExecutionContext* context = executionContext(); timerNestingLevel = m_nestingLevel; ASSERT(!context->activeDOMObjectsAreSuspended()); // Only the first execution of a multi-shot timer should get an affirmative user gesture indicator. UserGestureIndicator gestureIndicator(m_userGestureToken.release()); TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "TimerFire", "data", InspectorTimerFireEvent::data(context, m_timeoutID)); // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing. InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireTimer(context, m_timeoutID); // Simple case for non-one-shot timers. if (isActive()) { if (repeatInterval() && repeatInterval() < minimumInterval) { m_nestingLevel++; if (m_nestingLevel >= maxTimerNestingLevel) augmentRepeatInterval(minimumInterval - repeatInterval()); } // No access to member variables after this point, it can delete the timer. m_action->execute(context); InspectorInstrumentation::didFireTimer(cookie); return; } // Delete timer before executing the action for one-shot timers. OwnPtr<ScheduledAction> action = m_action.release(); // This timer is being deleted; no access to member variables allowed after this point. context->removeTimeoutByID(m_timeoutID); action->execute(context); InspectorInstrumentation::didFireTimer(cookie); TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", "data", InspectorUpdateCountersEvent::data()); timerNestingLevel = 0; }
void DOMTimer::fired() { ExecutionContext* context = executionContext(); timerNestingLevel = m_nestingLevel; ASSERT(!context->activeDOMObjectsAreSuspended()); // Only the first execution of a multi-shot timer should get an affirmative user gesture indicator. UserGestureIndicator gestureIndicator(m_userGestureToken.release()); InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireTimer(context, m_timeoutID); // Simple case for non-one-shot timers. if (isActive()) { if (repeatInterval() && repeatInterval() < minimumInterval) { m_nestingLevel++; if (m_nestingLevel >= maxTimerNestingLevel) augmentRepeatInterval(minimumInterval - repeatInterval()); } // No access to member variables after this point, it can delete the timer. m_action->execute(context); InspectorInstrumentation::didFireTimer(cookie); return; } // Delete timer before executing the action for one-shot timers. OwnPtr<ScheduledAction> action = m_action.release(); // This timer is being deleted; no access to member variables allowed after this point. context->removeTimeoutByID(m_timeoutID); action->execute(context); InspectorInstrumentation::didFireTimer(cookie); timerNestingLevel = 0; }
bool StringSequenceCallbackFunctionLongSequenceArg::call(ScriptState* scriptState, ScriptWrappable* scriptWrappable, const Vector<int>& arg, Vector<String>& returnValue) { if (!scriptState->contextIsValid()) return false; ExecutionContext* context = scriptState->getExecutionContext(); DCHECK(context); if (context->activeDOMObjectsAreSuspended() || context->activeDOMObjectsAreStopped()) return false; if (m_callback.isEmpty()) return false; // TODO(bashi): Make sure that using TrackExceptionState is OK. // crbug.com/653769 TrackExceptionState exceptionState; ScriptState::Scope scope(scriptState); v8::Local<v8::Value> argArgument = toV8(arg, scriptState->context()->Global(), scriptState->isolate()); v8::Local<v8::Value> thisValue = toV8(scriptWrappable, scriptState->context()->Global(), scriptState->isolate()); v8::Local<v8::Value> argv[] = { argArgument }; v8::Local<v8::Value> v8ReturnValue; v8::TryCatch exceptionCatcher(scriptState->isolate()); exceptionCatcher.SetVerbose(true); if (V8ScriptRunner::callFunction(m_callback.newLocal(scriptState->isolate()), scriptState->getExecutionContext(), thisValue, 1, argv, scriptState->isolate()).ToLocal(&v8ReturnValue)) { Vector<String> cppValue = toImplArray<Vector<String>>(v8ReturnValue, 0, scriptState->isolate(), exceptionState); if (exceptionState.hadException()) return false; returnValue = cppValue; return true; } return false; }
bool ActiveDOMCallback::canInvokeCallback() const { ExecutionContext* context = executionContext(); return context && !context->activeDOMObjectsAreSuspended() && !context->activeDOMObjectsAreStopped(); }