15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All Rights Reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContext.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/AddConsoleMessageTask.h"
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/dom/ContextLifecycleNotifier.h"
331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContextTask.h"
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/events/ErrorEvent.h"
3506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventTarget.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/PublicURLManager.h"
370019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "core/inspector/InspectorInstrumentation.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
39591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/workers/WorkerGlobalScope.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/workers/WorkerThread.h"
41591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/MainThread.h"
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class ExecutionContext::PendingException : public NoBaseWillBeGarbageCollectedFinalized<ExecutionContext::PendingException> {
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(PendingException);
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    PendingException(const String& errorMessage, int lineNumber, int columnNumber, int scriptId, const String& sourceURL, PassRefPtrWillBeRawPtr<ScriptCallStack> callStack)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_errorMessage(errorMessage)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_lineNumber(lineNumber)
517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        , m_columnNumber(columnNumber)
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , m_scriptId(scriptId)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_sourceURL(sourceURL)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_callStack(callStack)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void trace(Visitor* visitor)
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_callStack);
605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_errorMessage;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_lineNumber;
637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    int m_columnNumber;
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int m_scriptId;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_sourceURL;
665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<ScriptCallStack> m_callStack;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ExecutionContext::ExecutionContext()
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    : m_sandboxFlags(SandboxNone)
71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    , m_circularSequentialID(0)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_inDispatchErrorEvent(false)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_activeDOMObjectsAreSuspended(false)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_activeDOMObjectsAreStopped(false)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ExecutionContext::~ExecutionContext()
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool ExecutionContext::hasPendingActivity()
83591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
8451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return lifecycleNotifier().hasPendingActivity();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ExecutionContext::suspendActiveDOMObjects()
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
89f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    lifecycleNotifier().notifySuspendingActiveDOMObjects();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_activeDOMObjectsAreSuspended = true;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ExecutionContext::resumeActiveDOMObjects()
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_activeDOMObjectsAreSuspended = false;
96f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    lifecycleNotifier().notifyResumingActiveDOMObjects();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ExecutionContext::stopActiveDOMObjects()
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_activeDOMObjectsAreStopped = true;
102f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    lifecycleNotifier().notifyStoppingActiveDOMObjects();
10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
10451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)unsigned ExecutionContext::activeDOMObjectCount()
106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return lifecycleNotifier().activeDOMObjects().size();
108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
11051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ExecutionContext::suspendScheduledTasks()
11151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
11251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    suspendActiveDOMObjects();
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    tasksWereSuspended();
11451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
11551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
11651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void ExecutionContext::resumeScheduledTasks()
11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    resumeActiveDOMObjects();
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    tasksWereResumed();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ExecutionContext::suspendActiveDOMObjectIfNeeded(ActiveDOMObject* object)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
124f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(lifecycleNotifier().contains(object));
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Ensure all ActiveDOMObjects are suspended also newly created ones.
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_activeDOMObjectsAreSuspended)
1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        object->suspend();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool ExecutionContext::shouldSanitizeScriptError(const String& sourceURL, AccessControlStatus corsStatus)
131f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
13223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    return !(securityOrigin()->canRequest(completeURL(sourceURL)) || corsStatus == SharableCrossOrigin);
133f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
134f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ExecutionContext::reportException(PassRefPtrWillBeRawPtr<ErrorEvent> event, int scriptId, PassRefPtrWillBeRawPtr<ScriptCallStack> callStack, AccessControlStatus corsStatus)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
137a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<ErrorEvent> errorEvent = event;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inDispatchErrorEvent) {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_pendingExceptions)
1405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_pendingExceptions = adoptPtrWillBeNoop(new WillBeHeapVector<OwnPtrWillBeMember<PendingException> >());
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_pendingExceptions->append(adoptPtrWillBeNoop(new PendingException(errorEvent->messageForConsole(), errorEvent->lineno(), errorEvent->colno(), scriptId, errorEvent->filename(), callStack)));
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // First report the original exception and only then all the nested ones.
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!dispatchErrorEvent(errorEvent, corsStatus))
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        logExceptionToConsole(errorEvent->messageForConsole(), scriptId, errorEvent->filename(), errorEvent->lineno(), errorEvent->colno(), callStack);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_pendingExceptions)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < m_pendingExceptions->size(); i++) {
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PendingException* e = m_pendingExceptions->at(i).get();
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        logExceptionToConsole(e->m_errorMessage, e->m_scriptId, e->m_sourceURL, e->m_lineNumber, e->m_columnNumber, e->m_callStack);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pendingExceptions.clear();
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
159a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool ExecutionContext::dispatchErrorEvent(PassRefPtrWillBeRawPtr<ErrorEvent> event, AccessControlStatus corsStatus)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EventTarget* target = errorEventTarget();
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!target)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<ErrorEvent> errorEvent = event;
16623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    if (shouldSanitizeScriptError(errorEvent->filename(), corsStatus))
1678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        errorEvent = ErrorEvent::createSanitizedError(errorEvent->world());
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_inDispatchErrorEvent);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inDispatchErrorEvent = true;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    target->dispatchEvent(errorEvent);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inDispatchErrorEvent = false;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return errorEvent->defaultPrevented();
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)int ExecutionContext::circularSequentialID()
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ++m_circularSequentialID;
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_circularSequentialID <= 0)
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_circularSequentialID = 1;
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_circularSequentialID;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)int ExecutionContext::installNewTimeout(PassOwnPtr<ScheduledAction> action, int timeout, bool singleShot)
1850019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{
1860019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    int timeoutID;
1870019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    while (true) {
1880019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch        timeoutID = circularSequentialID();
1890019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch        if (!m_timeouts.contains(timeoutID))
1900019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch            break;
1910019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    }
192fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    TimeoutMap::AddResult result = m_timeouts.add(timeoutID, DOMTimer::create(this, action, timeout, singleShot, timeoutID));
1930019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    ASSERT(result.isNewEntry);
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    DOMTimer* timer = result.storedValue->value.get();
1950019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
1960019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    timer->suspendIfNeeded();
1970019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
198fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    return timer->timeoutID();
1990019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch}
2000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
2011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ExecutionContext::removeTimeoutByID(int timeoutID)
2020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{
2030019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    if (timeoutID <= 0)
204fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        return;
205fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    m_timeouts.remove(timeoutID);
2060019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch}
2070019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
2081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)PublicURLManager& ExecutionContext::publicURLManager()
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_publicURLManager)
2115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        m_publicURLManager = PublicURLManager::create(this);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *m_publicURLManager;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void ExecutionContext::didChangeTimerAlignmentInterval()
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2170019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    for (TimeoutMap::iterator iter = m_timeouts.begin(); iter != m_timeouts.end(); ++iter)
2180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch        iter->value->didChangeAlignmentInterval();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciSecurityOrigin* ExecutionContext::securityOrigin()
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return securityContext().securityOrigin();
224f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
225f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciContentSecurityPolicy* ExecutionContext::contentSecurityPolicy()
227f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return securityContext().contentSecurityPolicy();
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)const KURL& ExecutionContext::url() const
232591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
2335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return virtualURL();
2341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
2351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)KURL ExecutionContext::completeURL(const String& url) const
2371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
2385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return virtualCompleteURL(url);
2391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
2401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
241f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)PassOwnPtr<LifecycleNotifier<ExecutionContext> > ExecutionContext::createLifecycleNotifier()
2421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
243f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ContextLifecycleNotifier::create(this);
2441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
2451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
246f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)ContextLifecycleNotifier& ExecutionContext::lifecycleNotifier()
2471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
248f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return static_cast<ContextLifecycleNotifier&>(LifecycleContext<ExecutionContext>::lifecycleNotifier());
249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
250591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool ExecutionContext::isIteratingOverObservers() const
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return m_lifecycleNotifier && m_lifecycleNotifier->isIteratingOverObservers();
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
256bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void ExecutionContext::enforceSandboxFlags(SandboxFlags mask)
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
258bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_sandboxFlags |= mask;
259bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
260bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // The SandboxOrigin is stored redundantly in the security origin.
2617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (isSandboxed(SandboxOrigin) && securityContext().securityOrigin() && !securityContext().securityOrigin()->isUnique()) {
2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        securityContext().setSecurityOrigin(SecurityOrigin::createUnique());
2637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        didUpdateSecurityOrigin();
264bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ExecutionContext::trace(Visitor* visitor)
2685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
2695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ENABLE(OILPAN)
2705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_pendingExceptions);
2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    HeapSupplementable<ExecutionContext>::trace(visitor);
2725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
273e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    LifecycleContext<ExecutionContext>::trace(visitor);
2745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
2755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
276c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
277