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/fetch/ResourceClient.h" 30 #include "core/fetch/ResourceOwner.h" 31 #include "core/fetch/ScriptResource.h" 32 #include "platform/heap/Handle.h" 33 #include "wtf/PassRefPtr.h" 34 #include "wtf/RefPtr.h" 35 #include "wtf/text/TextPosition.h" 36 37 namespace WebCore { 38 39 class Element; 40 class ScriptResource; 41 42 // A container for an external script which may be loaded and executed. 43 // 44 // A ResourcePtr alone does not prevent the underlying Resource 45 // from purging its data buffer. This class holds a dummy client open for its 46 // lifetime in order to guarantee that the data buffer will not be purged. 47 class PendingScript FINAL : public ResourceOwner<ScriptResource> { 48 ALLOW_ONLY_INLINE_ALLOCATION(); 49 public: 50 PendingScript() 51 : m_watchingForLoad(false) 52 , m_startingPosition(TextPosition::belowRangePosition()) 53 { 54 } 55 56 PendingScript(Element* element, ScriptResource* resource) 57 : m_watchingForLoad(false) 58 , m_element(element) 59 { 60 setScriptResource(resource); 61 } 62 63 PendingScript(const PendingScript& other) 64 : ResourceOwner(other) 65 , m_watchingForLoad(other.m_watchingForLoad) 66 , m_element(other.m_element) 67 , m_startingPosition(other.m_startingPosition) 68 { 69 setScriptResource(other.resource()); 70 } 71 72 ~PendingScript(); 73 74 PendingScript& operator=(const PendingScript& other) 75 { 76 if (this == &other) 77 return *this; 78 79 m_watchingForLoad = other.m_watchingForLoad; 80 m_element = other.m_element; 81 m_startingPosition = other.m_startingPosition; 82 this->ResourceOwner<ScriptResource, ResourceClient>::operator=(other); 83 84 return *this; 85 } 86 87 TextPosition startingPosition() const { return m_startingPosition; } 88 void setStartingPosition(const TextPosition& position) { m_startingPosition = position; } 89 90 bool watchingForLoad() const { return m_watchingForLoad; } 91 void setWatchingForLoad(bool b) { m_watchingForLoad = b; } 92 93 Element* element() const { return m_element.get(); } 94 void setElement(Element* element) { m_element = element; } 95 PassRefPtrWillBeRawPtr<Element> releaseElementAndClear(); 96 97 void setScriptResource(ScriptResource*); 98 99 virtual void notifyFinished(Resource*); 100 101 void trace(Visitor*); 102 103 private: 104 bool m_watchingForLoad; 105 RefPtrWillBeMember<Element> m_element; 106 TextPosition m_startingPosition; // Only used for inline script tags. 107 }; 108 109 } 110 111 #endif 112