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 38 namespace blink { 39 40 class ScriptSourceCode; 41 class 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. 48 class PendingScript FINAL : public ResourceOwner<ScriptResource> { 49 ALLOW_ONLY_INLINE_ALLOCATION(); 50 public: 51 enum Type { 52 ParsingBlocking, 53 Deferred, 54 Async 55 }; 56 PendingScript()57 PendingScript() 58 : m_watchingForLoad(false) 59 , m_startingPosition(TextPosition::belowRangePosition()) 60 { 61 } 62 PendingScript(Element * element,ScriptResource * resource)63 PendingScript(Element* element, ScriptResource* resource) 64 : m_watchingForLoad(false) 65 , m_element(element) 66 { 67 setScriptResource(resource); 68 } 69 PendingScript(const PendingScript & other)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 startingPosition()95 TextPosition startingPosition() const { return m_startingPosition; } setStartingPosition(const TextPosition & position)96 void setStartingPosition(const TextPosition& position) { m_startingPosition = position; } 97 98 void watchForLoad(ScriptResourceClient*); 99 void stopWatchingForLoad(ScriptResourceClient*); 100 element()101 Element* element() const { return m_element.get(); } setElement(Element * element)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 setStreamer(PassRefPtr<ScriptStreamer> streamer)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 123 private: 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