Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/renderer/render_view.h" | 5 #include "chrome/renderer/render_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 3366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3377 | 3377 |
| 3378 // Fallback to a local error page. | 3378 // Fallback to a local error page. |
| 3379 LoadNavigationErrorPage(frame, failed_request, error, std::string(), replace); | 3379 LoadNavigationErrorPage(frame, failed_request, error, std::string(), replace); |
| 3380 } | 3380 } |
| 3381 | 3381 |
| 3382 void RenderView::didReceiveDocumentData( | 3382 void RenderView::didReceiveDocumentData( |
| 3383 WebFrame* frame, const char* data, size_t data_len, | 3383 WebFrame* frame, const char* data, size_t data_len, |
| 3384 bool& prevent_default) { | 3384 bool& prevent_default) { |
| 3385 NavigationState* navigation_state = | 3385 NavigationState* navigation_state = |
| 3386 NavigationState::FromDataSource(frame->dataSource()); | 3386 NavigationState::FromDataSource(frame->dataSource()); |
| 3387 if (!navigation_state->postpone_loading_data()) | 3387 navigation_state->set_maybe_use_error_page(false); |
| 3388 return; | |
| 3389 | |
| 3390 // We're going to call commitDocumentData ourselves... | |
| 3391 prevent_default = true; | |
| 3392 | |
| 3393 // Continue buffering the response data for the original error page. If it | |
| 3394 // grows too large, then we'll just let it through. For any error other than | |
| 3395 // a 404, "too large" means any data at all. | |
| 3396 navigation_state->append_postponed_data(data, data_len); | |
| 3397 if (navigation_state->postponed_data().size() >= 512 || | |
| 3398 navigation_state->http_status_code() != 404) { | |
| 3399 navigation_state->set_postpone_loading_data(false); | |
| 3400 frame->commitDocumentData(navigation_state->postponed_data().data(), | |
| 3401 navigation_state->postponed_data().size()); | |
| 3402 navigation_state->clear_postponed_data(); | |
| 3403 } | |
| 3404 } | 3388 } |
| 3405 | 3389 |
| 3406 void RenderView::didCommitProvisionalLoad(WebFrame* frame, | 3390 void RenderView::didCommitProvisionalLoad(WebFrame* frame, |
| 3407 bool is_new_navigation) { | 3391 bool is_new_navigation) { |
| 3408 NavigationState* navigation_state = | 3392 NavigationState* navigation_state = |
| 3409 NavigationState::FromDataSource(frame->dataSource()); | 3393 NavigationState::FromDataSource(frame->dataSource()); |
| 3410 | 3394 |
| 3411 navigation_state->set_commit_load_time(Time::Now()); | 3395 navigation_state->set_commit_load_time(Time::Now()); |
| 3412 if (is_new_navigation) { | 3396 if (is_new_navigation) { |
| 3413 // When we perform a new navigation, we need to update the last committed | 3397 // When we perform a new navigation, we need to update the last committed |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3684 CHECK(navigation_state); | 3668 CHECK(navigation_state); |
| 3685 int http_status_code = response.httpStatusCode(); | 3669 int http_status_code = response.httpStatusCode(); |
| 3686 | 3670 |
| 3687 // Record page load flags. | 3671 // Record page load flags. |
| 3688 navigation_state->set_was_fetched_via_spdy(response.wasFetchedViaSPDY()); | 3672 navigation_state->set_was_fetched_via_spdy(response.wasFetchedViaSPDY()); |
| 3689 navigation_state->set_was_npn_negotiated(response.wasNpnNegotiated()); | 3673 navigation_state->set_was_npn_negotiated(response.wasNpnNegotiated()); |
| 3690 navigation_state->set_was_alternate_protocol_available( | 3674 navigation_state->set_was_alternate_protocol_available( |
| 3691 response.wasAlternateProtocolAvailable()); | 3675 response.wasAlternateProtocolAvailable()); |
| 3692 navigation_state->set_was_fetched_via_proxy(response.wasFetchedViaProxy()); | 3676 navigation_state->set_was_fetched_via_proxy(response.wasFetchedViaProxy()); |
| 3693 navigation_state->set_http_status_code(http_status_code); | 3677 navigation_state->set_http_status_code(http_status_code); |
| 3694 | 3678 // Whether or not the http status code actually corresponds to an error is |
| 3695 // Consider loading an alternate error page for 404 responses. | 3679 // only checked when the page is done loading, if |maybe_use_error_page| is |
| 3696 if (http_status_code == 404) { | 3680 // still true. |
| 3697 // Can we even load an alternate error page for this URL? | 3681 navigation_state->set_maybe_use_error_page(true); |
| 3698 if (!GetAlternateErrorPageURL(response.url(), HTTP_404).is_valid()) | |
| 3699 return; | |
| 3700 } else if (!LocalizedError::HasStrings(LocalizedError::kHttpErrorDomain, | |
| 3701 http_status_code)) { | |
| 3702 // If no corresponding error strings for a particular status code, just | |
| 3703 // render any received data, regardless of whether or not the status code | |
| 3704 // indicates an error. | |
| 3705 return; | |
| 3706 } | |
| 3707 | |
| 3708 navigation_state->set_postpone_loading_data(true); | |
| 3709 navigation_state->clear_postponed_data(); | |
| 3710 } | 3682 } |
| 3711 | 3683 |
| 3712 void RenderView::didFinishResourceLoad( | 3684 void RenderView::didFinishResourceLoad( |
| 3713 WebFrame* frame, unsigned identifier) { | 3685 WebFrame* frame, unsigned identifier) { |
| 3714 NavigationState* navigation_state = | 3686 NavigationState* navigation_state = |
| 3715 NavigationState::FromDataSource(frame->dataSource()); | 3687 NavigationState::FromDataSource(frame->dataSource()); |
| 3716 if (!navigation_state->postpone_loading_data()) | 3688 if (!navigation_state->maybe_use_error_page()) |
| 3717 return; | 3689 return; |
| 3718 | 3690 |
| 3719 // The server returned an error and the content was < 512 bytes (which we | 3691 // Display error page, if appropriate. |
| 3720 // suppressed). Go ahead and fetch the alternate page content. | |
| 3721 int http_status_code = navigation_state->http_status_code(); | 3692 int http_status_code = navigation_state->http_status_code(); |
| 3722 if (http_status_code == 404) { | 3693 if (http_status_code == 404) { |
| 3723 // On 404s, try a remote search page as a fallback. | 3694 // On 404s, try a remote search page as a fallback. |
| 3724 const GURL& frame_url = frame->url(); | 3695 const GURL& frame_url = frame->url(); |
| 3725 | 3696 |
| 3726 const GURL& error_page_url = GetAlternateErrorPageURL(frame_url, HTTP_404); | 3697 const GURL& error_page_url = GetAlternateErrorPageURL(frame_url, HTTP_404); |
| 3727 DCHECK(error_page_url.is_valid()); | 3698 if (error_page_url.is_valid()) { |
|
tony
2011/02/23 21:43:20
When will this be invalid? Should we at least kee
mmenke
2011/02/23 21:53:36
It's an empty string (And thus invalid) when chrom
| |
| 3699 WebURLError original_error; | |
| 3700 original_error.unreachableURL = frame_url; | |
| 3728 | 3701 |
| 3729 WebURLError original_error; | 3702 navigation_state->set_alt_error_page_fetcher( |
| 3730 original_error.unreachableURL = frame_url; | 3703 new AltErrorPageResourceFetcher( |
| 3704 error_page_url, frame, original_error, | |
| 3705 NewCallback(this, &RenderView::AltErrorPageFinished))); | |
| 3706 return; | |
| 3707 } | |
| 3708 } | |
| 3731 | 3709 |
| 3732 navigation_state->set_alt_error_page_fetcher( | 3710 // Use an internal error page, if we have one for the status code. |
| 3733 new AltErrorPageResourceFetcher( | 3711 if (LocalizedError::HasStrings(LocalizedError::kHttpErrorDomain, |
| 3734 error_page_url, frame, original_error, | 3712 http_status_code)) { |
|
tony
2011/02/23 21:43:20
Do we have a test for some of the other http statu
mmenke
2011/02/23 21:53:36
No, we don't. They only trigger on responses with
| |
| 3735 NewCallback(this, &RenderView::AltErrorPageFinished))); | |
| 3736 } else { | |
| 3737 // On other errors, use an internal error page. | |
| 3738 WebURLError error; | 3713 WebURLError error; |
| 3739 error.unreachableURL = frame->url(); | 3714 error.unreachableURL = frame->url(); |
| 3740 error.domain = WebString::fromUTF8(LocalizedError::kHttpErrorDomain); | 3715 error.domain = WebString::fromUTF8(LocalizedError::kHttpErrorDomain); |
| 3741 error.reason = http_status_code; | 3716 error.reason = http_status_code; |
| 3742 | 3717 |
| 3743 LoadNavigationErrorPage(frame, frame->dataSource()->request(), error, | 3718 LoadNavigationErrorPage(frame, frame->dataSource()->request(), error, |
| 3744 std::string(), true); | 3719 std::string(), true); |
| 3745 } | 3720 } |
| 3746 } | 3721 } |
| 3747 | 3722 |
| (...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5058 | 5033 |
| 5059 // "t" is the id of the templates root node. | 5034 // "t" is the id of the templates root node. |
| 5060 return jstemplate_builder::GetTemplatesHtml( | 5035 return jstemplate_builder::GetTemplatesHtml( |
| 5061 template_html, &error_strings, "t"); | 5036 template_html, &error_strings, "t"); |
| 5062 } | 5037 } |
| 5063 | 5038 |
| 5064 void RenderView::AltErrorPageFinished(WebFrame* frame, | 5039 void RenderView::AltErrorPageFinished(WebFrame* frame, |
| 5065 const WebURLError& original_error, | 5040 const WebURLError& original_error, |
| 5066 const std::string& html) { | 5041 const std::string& html) { |
| 5067 // Here, we replace the blank page we loaded previously. | 5042 // Here, we replace the blank page we loaded previously. |
| 5068 | 5043 // If we failed to download the alternate error page, LoadNavigationErrorPage |
| 5069 // If we failed to download the alternate error page, fall back to the | |
| 5070 // original error page if present. Otherwise, LoadNavigationErrorPage | |
| 5071 // will simply display a default error page. | 5044 // will simply display a default error page. |
| 5072 const std::string* html_to_load = &html; | 5045 LoadNavigationErrorPage(frame, WebURLRequest(), original_error, html, true); |
| 5073 if (html.empty()) { | |
| 5074 NavigationState* navigation_state = | |
| 5075 NavigationState::FromDataSource(frame->dataSource()); | |
| 5076 html_to_load = &navigation_state->postponed_data(); | |
| 5077 } | |
| 5078 LoadNavigationErrorPage(frame, WebURLRequest(), original_error, *html_to_load, | |
| 5079 true); | |
| 5080 } | 5046 } |
| 5081 | 5047 |
| 5082 void RenderView::OnMoveOrResizeStarted() { | 5048 void RenderView::OnMoveOrResizeStarted() { |
| 5083 if (webview()) | 5049 if (webview()) |
| 5084 webview()->hidePopups(); | 5050 webview()->hidePopups(); |
| 5085 } | 5051 } |
| 5086 | 5052 |
| 5087 void RenderView::OnResize(const gfx::Size& new_size, | 5053 void RenderView::OnResize(const gfx::Size& new_size, |
| 5088 const gfx::Rect& resizer_rect) { | 5054 const gfx::Rect& resizer_rect) { |
| 5089 if (webview()) { | 5055 if (webview()) { |
| (...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5707 } | 5673 } |
| 5708 } | 5674 } |
| 5709 | 5675 |
| 5710 void RenderView::OnContextMenuClosed( | 5676 void RenderView::OnContextMenuClosed( |
| 5711 const webkit_glue::CustomContextMenuContext& custom_context) { | 5677 const webkit_glue::CustomContextMenuContext& custom_context) { |
| 5712 if (custom_context.is_pepper_menu) | 5678 if (custom_context.is_pepper_menu) |
| 5713 pepper_delegate_.OnContextMenuClosed(custom_context); | 5679 pepper_delegate_.OnContextMenuClosed(custom_context); |
| 5714 else | 5680 else |
| 5715 context_menu_node_.reset(); | 5681 context_menu_node_.reset(); |
| 5716 } | 5682 } |
| OLD | NEW |