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