Index: third_party/WebKit/WebCore/inspector/InspectorResource.cpp |
=================================================================== |
--- third_party/WebKit/WebCore/inspector/InspectorResource.cpp (revision 0) |
+++ third_party/WebKit/WebCore/inspector/InspectorResource.cpp (revision 11136) |
@@ -0,0 +1,176 @@ |
+/* |
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. |
+ * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> |
+ * Copyright (C) 2009 Google Inc. All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions |
+ * are met: |
+ * |
+ * 1. Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * 2. Redistributions in binary form must reproduce the above copyright |
+ * notice, this list of conditions and the following disclaimer in the |
+ * documentation and/or other materials provided with the distribution. |
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
+ * its contributors may be used to endorse or promote products derived |
+ * from this software without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ */ |
+ |
+#include "config.h" |
+#include "InspectorResource.h" |
+ |
+#include "CachedResource.h" |
+#include "DocLoader.h" |
+#include "DocumentLoader.h" |
+#include "Frame.h" |
+#include "TextEncoding.h" |
+ |
+#include <runtime/JSLock.h> |
+ |
+namespace WebCore { |
+ |
+// XMLHttpRequestResource Class |
+ |
+struct XMLHttpRequestResource { |
+ XMLHttpRequestResource(const JSC::UString& sourceString) |
+ { |
+ JSC::JSLock lock(false); |
+ this->sourceString = sourceString.rep(); |
+ } |
+ |
+ ~XMLHttpRequestResource() |
+ { |
+ JSC::JSLock lock(false); |
+ sourceString.clear(); |
+ } |
+ |
+ RefPtr<JSC::UString::Rep> sourceString; |
+}; |
+ |
+ InspectorResource::InspectorResource(long long identifier, DocumentLoader* documentLoader, Frame* frame) |
+ : identifier(identifier) |
+ , loader(documentLoader) |
+ , frame(frame) |
+ , scriptContext(0) |
+ , scriptObject(0) |
+ , expectedContentLength(0) |
+ , cached(false) |
+ , finished(false) |
+ , failed(false) |
+ , length(0) |
+ , responseStatusCode(0) |
+ , startTime(-1.0) |
+ , responseReceivedTime(-1.0) |
+ , endTime(-1.0) |
+ , xmlHttpRequestResource(0) |
+ { |
+ } |
+ |
+InspectorResource::~InspectorResource() |
+{ |
+ setScriptObject(0, 0); |
+} |
+ |
+InspectorResource::Type InspectorResource::type() const |
+{ |
+ if (xmlHttpRequestResource) |
+ return XHR; |
+ |
+ if (requestURL == loader->requestURL()) |
+ return Doc; |
+ |
+ if (loader->frameLoader() && requestURL == loader->frameLoader()->iconURL()) |
+ return Image; |
+ |
+ CachedResource* cachedResource = frame->document()->docLoader()->cachedResource(requestURL.string()); |
+ if (!cachedResource) |
+ return Other; |
+ |
+ switch (cachedResource->type()) { |
+ case CachedResource::ImageResource: |
+ return Image; |
+ case CachedResource::FontResource: |
+ return Font; |
+ case CachedResource::CSSStyleSheet: |
+#if ENABLE(XSLT) |
+ case CachedResource::XSLStyleSheet: |
+#endif |
+ return Stylesheet; |
+ case CachedResource::Script: |
+ return Script; |
+ default: |
+ return Other; |
+ } |
+} |
+ |
+void InspectorResource::setScriptObject(JSContextRef context, JSObjectRef newScriptObject) |
+{ |
+ if (scriptContext && scriptObject) |
+ JSValueUnprotect(scriptContext, scriptObject); |
+ |
+ scriptObject = newScriptObject; |
+ scriptContext = context; |
+ |
+ ASSERT((context && newScriptObject) || (!context && !newScriptObject)); |
+ if (context && newScriptObject) |
+ JSValueProtect(context, newScriptObject); |
+} |
+ |
+void InspectorResource::setXMLHttpRequestProperties(const JSC::UString& data) |
+{ |
+ xmlHttpRequestResource.set(new XMLHttpRequestResource(data)); |
+} |
+ |
+String InspectorResource::sourceString() const |
+{ |
+ if (xmlHttpRequestResource) |
+ return JSC::UString(xmlHttpRequestResource->sourceString); |
+ |
+ RefPtr<SharedBuffer> buffer; |
+ String textEncodingName; |
+ |
+ if (requestURL == loader->requestURL()) { |
+ buffer = loader->mainResourceData(); |
+ textEncodingName = frame->document()->inputEncoding(); |
+ } else { |
+ CachedResource* cachedResource = frame->document()->docLoader()->cachedResource(requestURL.string()); |
+ if (!cachedResource) |
+ return String(); |
+ |
+ if (cachedResource->isPurgeable()) { |
+ // If the resource is purgeable then make it unpurgeable to get |
+ // get its data. This might fail, in which case we return an |
+ // empty String. |
+ // FIXME: should we do something else in the case of a purged |
+ // resource that informs the user why there is no data in the |
+ // inspector? |
+ if (!cachedResource->makePurgeable(false)) |
+ return String(); |
+ } |
+ |
+ buffer = cachedResource->data(); |
+ textEncodingName = cachedResource->encoding(); |
+ } |
+ |
+ if (!buffer) |
+ return String(); |
+ |
+ TextEncoding encoding(textEncodingName); |
+ if (!encoding.isValid()) |
+ encoding = WindowsLatin1Encoding(); |
+ return encoding.decode(buffer->data(), buffer->size()); |
+} |
+ |
+} // namespace WebCore |