1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/alt_error_page_resource_fetcher.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/resource_fetcher.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebFrame;
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebURLError;
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing WebKit::WebURLRequest;
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebURLResponse;
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace webkit_glue {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Number of seconds to wait for the alternate error page server.  If it takes
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// too long, just use the local error page.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kDownloadTimeoutSec = 3;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAltErrorPageResourceFetcher::AltErrorPageResourceFetcher(
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& url,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WebFrame* frame,
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const WebURLError& original_error,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Callback* callback)
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : frame_(frame),
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      callback_(callback),
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      original_error_(original_error) {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  fetcher_.reset(new ResourceFetcherWithTimeout(
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      url, frame, WebURLRequest::TargetIsMainFrame, kDownloadTimeoutSec,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &AltErrorPageResourceFetcher::OnURLFetchComplete)));
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAltErrorPageResourceFetcher::~AltErrorPageResourceFetcher() {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AltErrorPageResourceFetcher::Cancel() {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  fetcher_->Cancel();
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AltErrorPageResourceFetcher::OnURLFetchComplete(
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const WebURLResponse& response,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& data) {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A null response indicates a network error.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!response.isNull() && response.httpStatusCode() == 200) {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    callback_->Run(frame_, original_error_, data);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    callback_->Run(frame_, original_error_, std::string());
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace webkit_glue
53