Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 2655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2666 InternalDocumentStateData* internal_data = | 2666 InternalDocumentStateData* internal_data = |
| 2667 InternalDocumentStateData::FromDocumentState(document_state); | 2667 InternalDocumentStateData::FromDocumentState(document_state); |
| 2668 | 2668 |
| 2669 if (document_state->commit_load_time().is_null()) | 2669 if (document_state->commit_load_time().is_null()) |
| 2670 document_state->set_commit_load_time(Time::Now()); | 2670 document_state->set_commit_load_time(Time::Now()); |
| 2671 | 2671 |
| 2672 if (internal_data->must_reset_scroll_and_scale_state()) { | 2672 if (internal_data->must_reset_scroll_and_scale_state()) { |
| 2673 render_view_->webview()->resetScrollAndScaleState(); | 2673 render_view_->webview()->resetScrollAndScaleState(); |
| 2674 internal_data->set_must_reset_scroll_and_scale_state(false); | 2674 internal_data->set_must_reset_scroll_and_scale_state(false); |
| 2675 } | 2675 } |
| 2676 internal_data->set_use_error_page(false); | |
| 2677 | 2676 |
| 2678 bool is_new_navigation = commit_type == blink::WebStandardCommit; | 2677 bool is_new_navigation = commit_type == blink::WebStandardCommit; |
| 2679 if (is_new_navigation) { | 2678 if (is_new_navigation) { |
| 2680 // We bump our Page ID to correspond with the new session history entry. | 2679 // We bump our Page ID to correspond with the new session history entry. |
| 2681 render_view_->page_id_ = render_view_->next_page_id_++; | 2680 render_view_->page_id_ = render_view_->next_page_id_++; |
| 2682 | 2681 |
| 2683 // Don't update history list values for kSwappedOutURL, since | 2682 // Don't update history list values for kSwappedOutURL, since |
| 2684 // we don't want to forget the entry that was there, and since we will | 2683 // we don't want to forget the entry that was there, and since we will |
| 2685 // never come back to kSwappedOutURL. Note that we have to call | 2684 // never come back to kSwappedOutURL. Note that we have to call |
| 2686 // UpdateSessionHistory and update page_id_ even in this case, so that | 2685 // UpdateSessionHistory and update page_id_ even in this case, so that |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2828 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); | 2827 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); |
| 2829 } | 2828 } |
| 2830 | 2829 |
| 2831 void RenderFrameImpl::didChangeIcon(blink::WebLocalFrame* frame, | 2830 void RenderFrameImpl::didChangeIcon(blink::WebLocalFrame* frame, |
| 2832 blink::WebIconURL::Type icon_type) { | 2831 blink::WebIconURL::Type icon_type) { |
| 2833 DCHECK(!frame_ || frame_ == frame); | 2832 DCHECK(!frame_ || frame_ == frame); |
| 2834 // TODO(nasko): Investigate wheather implementation should move here. | 2833 // TODO(nasko): Investigate wheather implementation should move here. |
| 2835 render_view_->didChangeIcon(frame, icon_type); | 2834 render_view_->didChangeIcon(frame, icon_type); |
| 2836 } | 2835 } |
| 2837 | 2836 |
| 2838 void RenderFrameImpl::didFinishDocumentLoad(blink::WebLocalFrame* frame) { | 2837 void RenderFrameImpl::didFinishDocumentLoad(blink::WebLocalFrame* frame, |
| 2838 bool document_is_empty) { | |
| 2839 TRACE_EVENT1("navigation", "RenderFrameImpl::didFinishDocumentLoad", | 2839 TRACE_EVENT1("navigation", "RenderFrameImpl::didFinishDocumentLoad", |
| 2840 "id", routing_id_); | 2840 "id", routing_id_); |
| 2841 DCHECK(!frame_ || frame_ == frame); | 2841 DCHECK(!frame_ || frame_ == frame); |
| 2842 WebDataSource* ds = frame->dataSource(); | 2842 WebDataSource* ds = frame->dataSource(); |
| 2843 DocumentState* document_state = DocumentState::FromDataSource(ds); | 2843 DocumentState* document_state = DocumentState::FromDataSource(ds); |
| 2844 document_state->set_finish_document_load_time(Time::Now()); | 2844 document_state->set_finish_document_load_time(Time::Now()); |
| 2845 | 2845 |
| 2846 Send(new FrameHostMsg_DidFinishDocumentLoad(routing_id_)); | 2846 Send(new FrameHostMsg_DidFinishDocumentLoad(routing_id_)); |
| 2847 | 2847 |
| 2848 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), | 2848 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), |
| 2849 DidFinishDocumentLoad(frame)); | 2849 DidFinishDocumentLoad(frame)); |
| 2850 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishDocumentLoad()); | 2850 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishDocumentLoad()); |
| 2851 | 2851 |
| 2852 // Check whether we have new encoding name. | 2852 // Check whether we have new encoding name. |
| 2853 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); | 2853 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); |
| 2854 | |
| 2855 // If this is an empty document with an http status code indicating an error, | |
| 2856 // we may want to displaying our own error page, so the user doesn't end up | |
|
Charlie Reis
2015/07/13 20:42:43
s/displaying/display/
Nate Chapin
2015/07/14 18:46:23
Done.
| |
| 2857 // with an unexplained blank page. | |
| 2858 if (!document_is_empty) | |
| 2859 return; | |
| 2860 | |
| 2861 // Do not show error page when DevTools is attached. | |
| 2862 RenderFrameImpl* localRoot = this; | |
| 2863 while (localRoot->frame_ && localRoot->frame_->parent() && | |
| 2864 localRoot->frame_->parent()->isWebLocalFrame()) { | |
| 2865 localRoot = RenderFrameImpl::FromWebFrame(localRoot->frame_->parent()); | |
| 2866 DCHECK(localRoot); | |
| 2867 } | |
| 2868 if (localRoot->devtools_agent_ && localRoot->devtools_agent_->IsAttached()) | |
| 2869 return; | |
| 2870 | |
| 2871 // Display error page, if appropriate. | |
|
Charlie Reis
2015/07/13 20:42:43
nit: Display an error page instead of a blank page
Nate Chapin
2015/07/14 18:46:23
Done.
| |
| 2872 std::string error_domain = "http"; | |
| 2873 InternalDocumentStateData* internal_data = | |
| 2874 InternalDocumentStateData::FromDataSource(frame->dataSource()); | |
| 2875 int http_status_code = internal_data->http_status_code(); | |
| 2876 if (GetContentClient()->renderer()->HasErrorPage(http_status_code, | |
| 2877 &error_domain)) { | |
| 2878 WebURLError error; | |
| 2879 error.unreachableURL = frame->document().url(); | |
| 2880 error.domain = WebString::fromUTF8(error_domain); | |
| 2881 error.reason = http_status_code; | |
| 2882 LoadNavigationErrorPage(frame->dataSource()->request(), error, true); | |
| 2883 } | |
| 2854 } | 2884 } |
| 2855 | 2885 |
| 2856 void RenderFrameImpl::didHandleOnloadEvents(blink::WebLocalFrame* frame) { | 2886 void RenderFrameImpl::didHandleOnloadEvents(blink::WebLocalFrame* frame) { |
| 2857 DCHECK(!frame_ || frame_ == frame); | 2887 DCHECK(!frame_ || frame_ == frame); |
| 2858 if (!frame->parent()) { | 2888 if (!frame->parent()) { |
| 2859 FrameMsg_UILoadMetricsReportType::Value report_type = | 2889 FrameMsg_UILoadMetricsReportType::Value report_type = |
| 2860 static_cast<FrameMsg_UILoadMetricsReportType::Value>( | 2890 static_cast<FrameMsg_UILoadMetricsReportType::Value>( |
| 2861 frame->dataSource()->request().inputPerfMetricReportPolicy()); | 2891 frame->dataSource()->request().inputPerfMetricReportPolicy()); |
| 2862 base::TimeTicks ui_timestamp = base::TimeTicks() + | 2892 base::TimeTicks ui_timestamp = base::TimeTicks() + |
| 2863 base::TimeDelta::FromSecondsD( | 2893 base::TimeDelta::FromSecondsD( |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3346 document_state->set_connection_info( | 3376 document_state->set_connection_info( |
| 3347 extra_data->connection_info()); | 3377 extra_data->connection_info()); |
| 3348 document_state->set_was_fetched_via_proxy( | 3378 document_state->set_was_fetched_via_proxy( |
| 3349 extra_data->was_fetched_via_proxy()); | 3379 extra_data->was_fetched_via_proxy()); |
| 3350 document_state->set_proxy_server( | 3380 document_state->set_proxy_server( |
| 3351 extra_data->proxy_server()); | 3381 extra_data->proxy_server()); |
| 3352 } | 3382 } |
| 3353 InternalDocumentStateData* internal_data = | 3383 InternalDocumentStateData* internal_data = |
| 3354 InternalDocumentStateData::FromDocumentState(document_state); | 3384 InternalDocumentStateData::FromDocumentState(document_state); |
| 3355 internal_data->set_http_status_code(http_status_code); | 3385 internal_data->set_http_status_code(http_status_code); |
| 3356 // Whether or not the http status code actually corresponds to an error is | |
| 3357 // only checked when the page is done loading, if |use_error_page| is | |
| 3358 // still true. | |
| 3359 internal_data->set_use_error_page(true); | |
| 3360 } | |
| 3361 | |
| 3362 void RenderFrameImpl::didFinishResourceLoad(blink::WebLocalFrame* frame, | |
| 3363 unsigned identifier) { | |
| 3364 DCHECK(!frame_ || frame_ == frame); | |
| 3365 InternalDocumentStateData* internal_data = | |
| 3366 InternalDocumentStateData::FromDataSource(frame->dataSource()); | |
| 3367 if (!internal_data->use_error_page()) | |
| 3368 return; | |
| 3369 | |
| 3370 // Do not show error page when DevTools is attached. | |
| 3371 RenderFrameImpl* localRoot = this; | |
| 3372 while (localRoot->frame_ && localRoot->frame_->parent() && | |
| 3373 localRoot->frame_->parent()->isWebLocalFrame()) { | |
| 3374 localRoot = RenderFrameImpl::FromWebFrame(localRoot->frame_->parent()); | |
| 3375 DCHECK(localRoot); | |
| 3376 } | |
| 3377 if (localRoot->devtools_agent_ && localRoot->devtools_agent_->IsAttached()) | |
| 3378 return; | |
| 3379 | |
| 3380 // Display error page, if appropriate. | |
| 3381 std::string error_domain = "http"; | |
| 3382 int http_status_code = internal_data->http_status_code(); | |
| 3383 if (GetContentClient()->renderer()->HasErrorPage( | |
| 3384 http_status_code, &error_domain)) { | |
| 3385 WebURLError error; | |
| 3386 error.unreachableURL = frame->document().url(); | |
| 3387 error.domain = WebString::fromUTF8(error_domain); | |
| 3388 error.reason = http_status_code; | |
| 3389 LoadNavigationErrorPage(frame->dataSource()->request(), error, true); | |
| 3390 } | |
| 3391 } | 3386 } |
| 3392 | 3387 |
| 3393 void RenderFrameImpl::didLoadResourceFromMemoryCache( | 3388 void RenderFrameImpl::didLoadResourceFromMemoryCache( |
| 3394 blink::WebLocalFrame* frame, | 3389 blink::WebLocalFrame* frame, |
| 3395 const blink::WebURLRequest& request, | 3390 const blink::WebURLRequest& request, |
| 3396 const blink::WebURLResponse& response) { | 3391 const blink::WebURLResponse& response) { |
| 3397 DCHECK(!frame_ || frame_ == frame); | 3392 DCHECK(!frame_ || frame_ == frame); |
| 3398 // The recipients of this message have no use for data: URLs: they don't | 3393 // The recipients of this message have no use for data: URLs: they don't |
| 3399 // affect the page's insecure content list and are not in the disk cache. To | 3394 // affect the page's insecure content list and are not in the disk cache. To |
| 3400 // prevent large (1M+) data: URLs from crashing in the IPC system, we simply | 3395 // prevent large (1M+) data: URLs from crashing in the IPC system, we simply |
| (...skipping 1655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5056 void RenderFrameImpl::RegisterMojoServices() { | 5051 void RenderFrameImpl::RegisterMojoServices() { |
| 5057 // Only main frame have ImageDownloader service. | 5052 // Only main frame have ImageDownloader service. |
| 5058 if (!frame_->parent()) { | 5053 if (!frame_->parent()) { |
| 5059 GetServiceRegistry()->AddService<image_downloader::ImageDownloader>( | 5054 GetServiceRegistry()->AddService<image_downloader::ImageDownloader>( |
| 5060 base::Bind(&ImageDownloaderImpl::CreateMojoService, | 5055 base::Bind(&ImageDownloaderImpl::CreateMojoService, |
| 5061 base::Unretained(this))); | 5056 base::Unretained(this))); |
| 5062 } | 5057 } |
| 5063 } | 5058 } |
| 5064 | 5059 |
| 5065 } // namespace content | 5060 } // namespace content |
| OLD | NEW |