15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google, Inc. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/PendingScript.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/ScriptSourceCode.h"
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/ScriptStreamer.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
32e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ScriptResource.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PendingScript::~PendingScript()
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid PendingScript::watchForLoad(ScriptResourceClient* client)
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(!m_watchingForLoad);
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(!isReady());
447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_streamer) {
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_streamer->addClient(client);
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    } else {
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // addClient() will call notifyFinished() if the load is
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // complete. Callers do not expect to be re-entered from this call, so
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // they should not become a client of an already-loaded Resource.
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        resource()->addClient(client);
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_watchingForLoad = true;
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid PendingScript::stopWatchingForLoad(ScriptResourceClient* client)
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_watchingForLoad)
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(resource());
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_streamer) {
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_streamer->cancel();
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_streamer->removeClient(client);
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_streamer.clear();
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    } else {
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        resource()->removeClient(client);
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_watchingForLoad = false;
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
70f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)PassRefPtrWillBeRawPtr<Element> PendingScript::releaseElementAndClear()
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
723c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    setScriptResource(0);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_watchingForLoad = false;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_startingPosition = TextPosition::belowRangePosition();
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_streamer.release();
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_element.release();
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
793c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochvoid PendingScript::setScriptResource(ScriptResource* resource)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setResource(resource);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid PendingScript::notifyFinished(Resource* resource)
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_streamer)
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_streamer->notifyFinished(resource);
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid PendingScript::notifyAppendData(ScriptResource* resource)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_streamer)
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_streamer->notifyAppendData(resource);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void PendingScript::trace(Visitor* visitor)
97f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
98f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    visitor->trace(m_element);
99f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciScriptSourceCode PendingScript::getSource(const KURL& documentURL, bool& errorOccurred) const
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (resource()) {
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        errorOccurred = resource()->errorOccurred();
1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(resource()->isLoaded());
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_streamer && !m_streamer->streamingSuppressed())
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return ScriptSourceCode(m_streamer, resource());
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return ScriptSourceCode(resource());
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    errorOccurred = false;
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return ScriptSourceCode(m_element->textContent(), documentURL, startingPosition());
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool PendingScript::isReady() const
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (resource() && !resource()->isLoaded())
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_streamer && !m_streamer->isFinished())
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return true;
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
124