1dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch/* 2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2010 Google, Inc. All Rights Reserved. 3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Redistribution and use in source and binary forms, with or without 5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modification, are permitted provided that the following conditions 6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * are met: 7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 1. Redistributions of source code must retain the above copyright 8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * notice, this list of conditions and the following disclaimer. 9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * notice, this list of conditions and the following disclaimer in the 11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * documentation and/or other materials provided with the distribution. 12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */ 25dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 26dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "config.h" 272bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "ScriptRunner.h" 28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "CachedScript.h" 305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "Document.h" 31dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "Element.h" 32cad810f21b803229eb11403f9209855525a25d57Steve Block#include "PendingScript.h" 33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "ScriptElement.h" 34dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 35dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochnamespace WebCore { 36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 372bde8e466a4451c7319e3a072d118917957d6554Steve BlockScriptRunner::ScriptRunner(Document* document) 385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick : m_document(document) 392bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_timer(this, &ScriptRunner::timerFired) 40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ASSERT(document); 42dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 442bde8e466a4451c7319e3a072d118917957d6554Steve BlockScriptRunner::~ScriptRunner() 45dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 46cad810f21b803229eb11403f9209855525a25d57Steve Block for (size_t i = 0; i < m_scriptsToExecuteSoon.size(); ++i) 475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_document->decrementLoadEventDelayCount(); 482bde8e466a4451c7319e3a072d118917957d6554Steve Block for (size_t i = 0; i < m_scriptsToExecuteInOrder.size(); ++i) 492bde8e466a4451c7319e3a072d118917957d6554Steve Block m_document->decrementLoadEventDelayCount(); 50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 522bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid ScriptRunner::queueScriptForExecution(ScriptElement* scriptElement, CachedResourceHandle<CachedScript> cachedScript, ExecutionType executionType) 53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 542bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(scriptElement); 55dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 56cad810f21b803229eb11403f9209855525a25d57Steve Block Element* element = scriptElement->element(); 57dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch ASSERT(element); 58dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch ASSERT(element->inDocument()); 59dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_document->incrementLoadEventDelayCount(); 612bde8e466a4451c7319e3a072d118917957d6554Steve Block 622bde8e466a4451c7319e3a072d118917957d6554Steve Block switch (executionType) { 632bde8e466a4451c7319e3a072d118917957d6554Steve Block case ASYNC_EXECUTION: 642bde8e466a4451c7319e3a072d118917957d6554Steve Block m_scriptsToExecuteSoon.append(PendingScript(element, cachedScript.get())); 652bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!m_timer.isActive()) 662bde8e466a4451c7319e3a072d118917957d6554Steve Block m_timer.startOneShot(0); 672bde8e466a4451c7319e3a072d118917957d6554Steve Block break; 682bde8e466a4451c7319e3a072d118917957d6554Steve Block 692bde8e466a4451c7319e3a072d118917957d6554Steve Block case IN_ORDER_EXECUTION: 702bde8e466a4451c7319e3a072d118917957d6554Steve Block m_scriptsToExecuteInOrder.append(PendingScript(element, cachedScript.get())); 712bde8e466a4451c7319e3a072d118917957d6554Steve Block break; 722bde8e466a4451c7319e3a072d118917957d6554Steve Block 732bde8e466a4451c7319e3a072d118917957d6554Steve Block default: 742bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT_NOT_REACHED(); 752bde8e466a4451c7319e3a072d118917957d6554Steve Block } 76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 782bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid ScriptRunner::suspend() 79dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 80dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_timer.stop(); 81dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 82dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 832bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid ScriptRunner::resume() 84dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 85dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (hasPendingScripts()) 86dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_timer.startOneShot(0); 87dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 88dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 892bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid ScriptRunner::notifyInOrderScriptReady() 902bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 912bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!m_scriptsToExecuteInOrder.isEmpty()); 922bde8e466a4451c7319e3a072d118917957d6554Steve Block m_timer.startOneShot(0); 932bde8e466a4451c7319e3a072d118917957d6554Steve Block} 942bde8e466a4451c7319e3a072d118917957d6554Steve Block 952bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid ScriptRunner::timerFired(Timer<ScriptRunner>* timer) 96dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 97dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch ASSERT_UNUSED(timer, timer == &m_timer); 98dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 9968513a70bcd92384395513322f1b801e7bf9c729Steve Block RefPtr<Document> protect(m_document); 1002bde8e466a4451c7319e3a072d118917957d6554Steve Block 101cad810f21b803229eb11403f9209855525a25d57Steve Block Vector<PendingScript> scripts; 102dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch scripts.swap(m_scriptsToExecuteSoon); 1032bde8e466a4451c7319e3a072d118917957d6554Steve Block 1042bde8e466a4451c7319e3a072d118917957d6554Steve Block size_t numInOrderScriptsToExecute = 0; 1052bde8e466a4451c7319e3a072d118917957d6554Steve Block for (; numInOrderScriptsToExecute < m_scriptsToExecuteInOrder.size() && m_scriptsToExecuteInOrder[numInOrderScriptsToExecute].cachedScript()->isLoaded(); ++numInOrderScriptsToExecute) 1062bde8e466a4451c7319e3a072d118917957d6554Steve Block scripts.append(m_scriptsToExecuteInOrder[numInOrderScriptsToExecute]); 1072bde8e466a4451c7319e3a072d118917957d6554Steve Block if (numInOrderScriptsToExecute) 1082bde8e466a4451c7319e3a072d118917957d6554Steve Block m_scriptsToExecuteInOrder.remove(0, numInOrderScriptsToExecute); 1092bde8e466a4451c7319e3a072d118917957d6554Steve Block 110dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch size_t size = scripts.size(); 111dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch for (size_t i = 0; i < size; ++i) { 112cad810f21b803229eb11403f9209855525a25d57Steve Block CachedScript* cachedScript = scripts[i].cachedScript(); 113cad810f21b803229eb11403f9209855525a25d57Steve Block RefPtr<Element> element = scripts[i].releaseElementAndClear(); 114cad810f21b803229eb11403f9209855525a25d57Steve Block toScriptElement(element.get())->execute(cachedScript); 1155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_document->decrementLoadEventDelayCount(); 116dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch } 117dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 118dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 119dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 120