summaryrefslogtreecommitdiffstats
path: root/webkit/glue/resource_fetcher.cc
diff options
context:
space:
mode:
authorinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-27 00:20:51 +0000
committerinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-27 00:20:51 +0000
commitf5b16fed647e941aa66933178da85db2860d639b (patch)
treef00e9856c04aad3b558a140955e7674add33f051 /webkit/glue/resource_fetcher.cc
parent920c091ac3ee15079194c82ae8a7a18215f3f23c (diff)
downloadchromium_src-f5b16fed647e941aa66933178da85db2860d639b.zip
chromium_src-f5b16fed647e941aa66933178da85db2860d639b.tar.gz
chromium_src-f5b16fed647e941aa66933178da85db2860d639b.tar.bz2
Add webkit to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue/resource_fetcher.cc')
-rw-r--r--webkit/glue/resource_fetcher.cc146
1 files changed, 146 insertions, 0 deletions
diff --git a/webkit/glue/resource_fetcher.cc b/webkit/glue/resource_fetcher.cc
new file mode 100644
index 0000000..1a4bbd4
--- /dev/null
+++ b/webkit/glue/resource_fetcher.cc
@@ -0,0 +1,146 @@
+// Copyright 2008, 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:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * 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.
+// * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+// OWNER OR 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 "webkit/glue/resource_fetcher.h"
+
+#pragma warning(push, 0)
+#include "FrameLoader.h"
+#include "ResourceHandle.h"
+#include "ResourceRequest.h"
+#pragma warning(pop)
+
+#undef LOG
+#include "base/logging.h"
+#include "webkit/glue/glue_util.h"
+#include "net/url_request/url_request_status.h"
+
+using WebCore::ResourceError;
+using WebCore::ResourceHandle;
+using WebCore::ResourceResponse;
+
+ResourceFetcher::ResourceFetcher(const GURL& url, WebCore::Frame* frame,
+ Delegate* d)
+ : url_(url), delegate_(d), completed_(false) {
+ // Can't do anything without a frame. However, delegate can be NULL (so we
+ // can do a http request and ignore the results).
+ DCHECK(frame);
+ Start(frame);
+}
+
+ResourceFetcher::~ResourceFetcher() {
+ if (!completed_)
+ loader_->cancel();
+ loader_ = NULL;
+}
+
+void ResourceFetcher::Cancel() {
+ if (!completed_) {
+ loader_->cancel();
+ completed_ = true;
+ }
+}
+
+void ResourceFetcher::Start(WebCore::Frame* frame) {
+ WebCore::FrameLoader* frame_loader = frame->loader();
+ if (!frame_loader) {
+ // We put this on a 0 timer so the callback happens async (consistent with
+ // regular fetches).
+ start_failed_timer_.reset(new StartFailedTimer(this,
+ &ResourceFetcher::StartFailed));
+ start_failed_timer_->startOneShot(0);
+ return;
+ }
+
+ WebCore::ResourceRequest request(webkit_glue::GURLToKURL(url_));
+ request.setFrame(frame);
+
+ loader_ = ResourceHandle::create(request, this, NULL, false, false);
+}
+
+void ResourceFetcher::StartFailed(StartFailedTimer* timer) {
+ didFail(NULL, ResourceError());
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// ResourceHandleClient methods
+void ResourceFetcher::didReceiveResponse(ResourceHandle* resource_handle,
+ const ResourceResponse& response) {
+ ASSERT(!completed_);
+ // It's safe to use the ResourceResponse copy constructor
+ // (xmlhttprequest.cpp uses it).
+ response_ = response;
+}
+
+void ResourceFetcher::didReceiveData(ResourceHandle* resource_handle,
+ const char* data, int length,
+ int total_length) {
+ ASSERT(!completed_);
+ if (length <= 0)
+ return;
+
+ data_.append(data, length);
+}
+
+void ResourceFetcher::didFinishLoading(ResourceHandle* resource_handle) {
+ ASSERT(!completed_);
+ completed_ = true;
+
+ if (delegate_)
+ delegate_->OnURLFetchComplete(response_, data_);
+}
+
+void ResourceFetcher::didFail(ResourceHandle* resource_handle,
+ const ResourceError& error) {
+ ASSERT(!completed_);
+ completed_ = true;
+
+ // Go ahead and tell our delegate that we're done. Send an empty
+ // ResourceResponse and string.
+ if (delegate_)
+ delegate_->OnURLFetchComplete(ResourceResponse(), std::string());
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// A resource fetcher with a timeout
+
+ResourceFetcherWithTimeout::ResourceFetcherWithTimeout(
+ const GURL& url, WebCore::Frame* frame, double timeout_secs, Delegate* d)
+ : ResourceFetcher(url, frame, d) {
+ timeout_timer_.reset(new FetchTimer(this,
+ &ResourceFetcherWithTimeout::TimeoutFired));
+ timeout_timer_->startOneShot(timeout_secs);
+}
+
+void ResourceFetcherWithTimeout::TimeoutFired(FetchTimer* timer) {
+ if (!completed_) {
+ loader_->cancel();
+ didFail(NULL, ResourceError());
+ }
+}