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