1/* 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef PendingScript_h 27#define PendingScript_h 28 29#include "core/dom/Element.h" 30#include "core/fetch/ResourceClient.h" 31#include "core/fetch/ResourceOwner.h" 32#include "core/fetch/ScriptResource.h" 33#include "platform/heap/Handle.h" 34#include "wtf/PassRefPtr.h" 35#include "wtf/RefPtr.h" 36#include "wtf/text/TextPosition.h" 37 38namespace blink { 39 40class ScriptSourceCode; 41class ScriptStreamer; 42 43// A container for an external script which may be loaded and executed. 44// 45// A ResourcePtr alone does not prevent the underlying Resource 46// from purging its data buffer. This class holds a dummy client open for its 47// lifetime in order to guarantee that the data buffer will not be purged. 48class PendingScript FINAL : public ResourceOwner<ScriptResource> { 49 ALLOW_ONLY_INLINE_ALLOCATION(); 50public: 51 enum Type { 52 ParsingBlocking, 53 Deferred, 54 Async 55 }; 56 57 PendingScript() 58 : m_watchingForLoad(false) 59 , m_startingPosition(TextPosition::belowRangePosition()) 60 { 61 } 62 63 PendingScript(Element* element, ScriptResource* resource) 64 : m_watchingForLoad(false) 65 , m_element(element) 66 { 67 setScriptResource(resource); 68 } 69 70 PendingScript(const PendingScript& other) 71 : ResourceOwner(other) 72 , m_watchingForLoad(other.m_watchingForLoad) 73 , m_element(other.m_element) 74 , m_startingPosition(other.m_startingPosition) 75 , m_streamer(other.m_streamer) 76 { 77 setScriptResource(other.resource()); 78 } 79 80 ~PendingScript(); 81 82 PendingScript& operator=(const PendingScript& other) 83 { 84 if (this == &other) 85 return *this; 86 87 m_watchingForLoad = other.m_watchingForLoad; 88 m_element = other.m_element; 89 m_startingPosition = other.m_startingPosition; 90 m_streamer = other.m_streamer; 91 this->ResourceOwner<ScriptResource, ScriptResourceClient>::operator=(other); 92 return *this; 93 } 94 95 TextPosition startingPosition() const { return m_startingPosition; } 96 void setStartingPosition(const TextPosition& position) { m_startingPosition = position; } 97 98 void watchForLoad(ScriptResourceClient*); 99 void stopWatchingForLoad(ScriptResourceClient*); 100 101 Element* element() const { return m_element.get(); } 102 void setElement(Element* element) { m_element = element; } 103 PassRefPtrWillBeRawPtr<Element> releaseElementAndClear(); 104 105 void setScriptResource(ScriptResource*); 106 107 virtual void notifyFinished(Resource*); 108 virtual void notifyAppendData(ScriptResource*); 109 110 void trace(Visitor*); 111 112 ScriptSourceCode getSource(const KURL& documentURL, bool& errorOccurred) const; 113 114 void setStreamer(PassRefPtr<ScriptStreamer> streamer) 115 { 116 ASSERT(!m_streamer); 117 ASSERT(!m_watchingForLoad); 118 m_streamer = streamer; 119 } 120 121 bool isReady() const; 122 123private: 124 bool m_watchingForLoad; 125 RefPtrWillBeMember<Element> m_element; 126 TextPosition m_startingPosition; // Only used for inline script tags. 127 128 RefPtr<ScriptStreamer> m_streamer; 129}; 130 131} 132 133#endif 134