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