1 /* 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> 4 * Copyright (C) 2009 Google Inc. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 16 * its contributors may be used to endorse or promote products derived 17 * from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef InspectorResource_h 32 #define InspectorResource_h 33 34 #include "HTTPHeaderMap.h" 35 #include "KURL.h" 36 #include "ScriptObject.h" 37 #include "ScriptState.h" 38 #include "ScriptString.h" 39 40 #include <wtf/CurrentTime.h> 41 #include <wtf/OwnPtr.h> 42 #include <wtf/PassRefPtr.h> 43 #include <wtf/RefCounted.h> 44 #include <wtf/RefPtr.h> 45 46 namespace WebCore { 47 48 class CachedResource; 49 class DocumentLoader; 50 class InspectorFrontend; 51 class Frame; 52 class ResourceResponse; 53 54 class ResourceRequest; 55 56 class InspectorResource : public RefCounted<InspectorResource> { 57 public: 58 59 // Keep these in sync with WebInspector.Resource.Type 60 enum Type { 61 Doc, 62 Stylesheet, 63 Image, 64 Font, 65 Script, 66 XHR, 67 Media, 68 Other 69 }; 70 create(unsigned long identifier,DocumentLoader * loader,const KURL & requestURL)71 static PassRefPtr<InspectorResource> create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL) 72 { 73 return adoptRef(new InspectorResource(identifier, loader, requestURL)); 74 } 75 76 static PassRefPtr<InspectorResource> createCached(unsigned long identifier, DocumentLoader*, const CachedResource*); 77 78 ~InspectorResource(); 79 80 PassRefPtr<InspectorResource> appendRedirect(unsigned long identifier, const KURL& redirectURL); 81 void updateScriptObject(InspectorFrontend* frontend); 82 void releaseScriptObject(InspectorFrontend* frontend, bool callRemoveResource); 83 84 void updateRequest(const ResourceRequest&); 85 void updateResponse(const ResourceResponse&); 86 87 void setXMLHttpResponseText(const ScriptString& data); 88 89 String sourceString() const; 90 PassRefPtr<SharedBuffer> resourceData(String* textEncodingName) const; 91 isSameLoader(DocumentLoader * loader)92 bool isSameLoader(DocumentLoader* loader) const { return loader == m_loader; } markMainResource()93 void markMainResource() { m_isMainResource = true; } identifier()94 unsigned long identifier() const { return m_identifier; } requestURL()95 KURL requestURL() const { return m_requestURL; } frame()96 Frame* frame() const { return m_frame.get(); } mimeType()97 const String& mimeType() const { return m_mimeType; } requestHeaderFields()98 const HTTPHeaderMap& requestHeaderFields() const { return m_requestHeaderFields; } responseHeaderFields()99 const HTTPHeaderMap& responseHeaderFields() const { return m_responseHeaderFields; } responseStatusCode()100 int responseStatusCode() const { return m_responseStatusCode; } requestMethod()101 String requestMethod() const { return m_requestMethod; } requestFormData()102 String requestFormData() const { return m_requestFormData; } 103 104 void startTiming(); 105 void markResponseReceivedTime(); 106 void markLoadEventTime(); 107 void markDOMContentEventTime(); 108 void endTiming(); 109 110 void markFailed(); 111 void addLength(int lengthReceived); 112 113 private: 114 enum ChangeType { 115 NoChange = 0, 116 RequestChange = 1, 117 ResponseChange = 2, 118 TypeChange = 4, 119 LengthChange = 8, 120 CompletionChange = 16, 121 TimingChange = 32, 122 RedirectsChange = 64 123 }; 124 125 class Changes { 126 public: Changes()127 Changes() : m_change(NoChange) {} 128 hasChange(ChangeType change)129 inline bool hasChange(ChangeType change) 130 { 131 return m_change & change || (m_change == NoChange && change == NoChange); 132 } set(ChangeType change)133 inline void set(ChangeType change) 134 { 135 m_change = static_cast<ChangeType>(static_cast<unsigned>(m_change) | static_cast<unsigned>(change)); 136 } clear(ChangeType change)137 inline void clear(ChangeType change) 138 { 139 m_change = static_cast<ChangeType>(static_cast<unsigned>(m_change) & ~static_cast<unsigned>(change)); 140 } 141 setAll()142 inline void setAll() { m_change = static_cast<ChangeType>(127); } clearAll()143 inline void clearAll() { m_change = NoChange; } 144 145 private: 146 ChangeType m_change; 147 }; 148 149 InspectorResource(unsigned long identifier, DocumentLoader*, const KURL& requestURL); 150 Type type() const; 151 152 Type cachedResourceType() const; 153 CachedResource* cachedResource() const; 154 155 unsigned long m_identifier; 156 RefPtr<DocumentLoader> m_loader; 157 RefPtr<Frame> m_frame; 158 KURL m_requestURL; 159 HTTPHeaderMap m_requestHeaderFields; 160 HTTPHeaderMap m_responseHeaderFields; 161 String m_mimeType; 162 String m_suggestedFilename; 163 long long m_expectedContentLength; 164 bool m_cached; 165 bool m_finished; 166 bool m_failed; 167 int m_length; 168 int m_responseStatusCode; 169 double m_startTime; 170 double m_responseReceivedTime; 171 double m_endTime; 172 double m_loadEventTime; 173 double m_domContentEventTime; 174 ScriptString m_xmlHttpResponseText; 175 Changes m_changes; 176 bool m_isMainResource; 177 String m_requestMethod; 178 String m_requestFormData; 179 Vector<RefPtr<InspectorResource> > m_redirects; 180 }; 181 182 } // namespace WebCore 183 184 #endif // InspectorResource_h 185