Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 2648053002: Remove old session history logic. (Closed)
Patch Set: Remove comment. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 #include "content/renderer/accessibility/render_accessibility_impl.h" 93 #include "content/renderer/accessibility/render_accessibility_impl.h"
94 #include "content/renderer/browser_plugin/browser_plugin.h" 94 #include "content/renderer/browser_plugin/browser_plugin.h"
95 #include "content/renderer/browser_plugin/browser_plugin_manager.h" 95 #include "content/renderer/browser_plugin/browser_plugin_manager.h"
96 #include "content/renderer/child_frame_compositing_helper.h" 96 #include "content/renderer/child_frame_compositing_helper.h"
97 #include "content/renderer/context_menu_params_builder.h" 97 #include "content/renderer/context_menu_params_builder.h"
98 #include "content/renderer/devtools/devtools_agent.h" 98 #include "content/renderer/devtools/devtools_agent.h"
99 #include "content/renderer/dom_automation_controller.h" 99 #include "content/renderer/dom_automation_controller.h"
100 #include "content/renderer/effective_connection_type_helper.h" 100 #include "content/renderer/effective_connection_type_helper.h"
101 #include "content/renderer/external_popup_menu.h" 101 #include "content/renderer/external_popup_menu.h"
102 #include "content/renderer/gpu/gpu_benchmarking_extension.h" 102 #include "content/renderer/gpu/gpu_benchmarking_extension.h"
103 #include "content/renderer/history_controller.h" 103 #include "content/renderer/history_entry.h"
104 #include "content/renderer/history_serialization.h" 104 #include "content/renderer/history_serialization.h"
105 #include "content/renderer/image_downloader/image_downloader_impl.h" 105 #include "content/renderer/image_downloader/image_downloader_impl.h"
106 #include "content/renderer/ime_event_guard.h" 106 #include "content/renderer/ime_event_guard.h"
107 #include "content/renderer/input/input_handler_manager.h" 107 #include "content/renderer/input/input_handler_manager.h"
108 #include "content/renderer/internal_document_state_data.h" 108 #include "content/renderer/internal_document_state_data.h"
109 #include "content/renderer/manifest/manifest_manager.h" 109 #include "content/renderer/manifest/manifest_manager.h"
110 #include "content/renderer/media/audio_device_factory.h" 110 #include "content/renderer/media/audio_device_factory.h"
111 #include "content/renderer/media/media_devices_listener_impl.h" 111 #include "content/renderer/media/media_devices_listener_impl.h"
112 #include "content/renderer/media/media_permission_dispatcher.h" 112 #include "content/renderer/media/media_permission_dispatcher.h"
113 #include "content/renderer/media/media_stream_dispatcher.h" 113 #include "content/renderer/media/media_stream_dispatcher.h"
(...skipping 1568 matching lines...) Expand 10 before | Expand all | Expand 10 after
1682 1682
1683 // This codepath should only be hit for subframes when in --site-per-process. 1683 // This codepath should only be hit for subframes when in --site-per-process.
1684 CHECK(is_main_frame_ || SiteIsolationPolicy::AreCrossProcessFramesPossible()); 1684 CHECK(is_main_frame_ || SiteIsolationPolicy::AreCrossProcessFramesPossible());
1685 1685
1686 // Swap this RenderFrame out so the frame can navigate to a page rendered by 1686 // Swap this RenderFrame out so the frame can navigate to a page rendered by
1687 // a different process. This involves running the unload handler and 1687 // a different process. This involves running the unload handler and
1688 // clearing the page. We also allow this process to exit if there are no 1688 // clearing the page. We also allow this process to exit if there are no
1689 // other active RenderFrames in it. 1689 // other active RenderFrames in it.
1690 1690
1691 // Send an UpdateState message before we get deleted. 1691 // Send an UpdateState message before we get deleted.
1692 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) 1692 SendUpdateState();
1693 SendUpdateState();
1694 else
1695 render_view_->SendUpdateState();
1696 1693
1697 // There should always be a proxy to replace this RenderFrame. Create it now 1694 // There should always be a proxy to replace this RenderFrame. Create it now
1698 // so its routing id is registered for receiving IPC messages. 1695 // so its routing id is registered for receiving IPC messages.
1699 CHECK_NE(proxy_routing_id, MSG_ROUTING_NONE); 1696 CHECK_NE(proxy_routing_id, MSG_ROUTING_NONE);
1700 proxy = RenderFrameProxy::CreateProxyToReplaceFrame( 1697 proxy = RenderFrameProxy::CreateProxyToReplaceFrame(
1701 this, proxy_routing_id, replicated_frame_state.scope); 1698 this, proxy_routing_id, replicated_frame_state.scope);
1702 1699
1703 // Synchronously run the unload handler before sending the ACK. 1700 // Synchronously run the unload handler before sending the ACK.
1704 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support 1701 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support
1705 // unload on subframes as well. 1702 // unload on subframes as well.
(...skipping 1384 matching lines...) Expand 10 before | Expand all | Expand 10 after
3090 if (focused_pepper_plugin_) 3087 if (focused_pepper_plugin_)
3091 GetRenderWidget()->set_focused_pepper_plugin(nullptr); 3088 GetRenderWidget()->set_focused_pepper_plugin(nullptr);
3092 #endif 3089 #endif
3093 3090
3094 for (auto& observer : observers_) 3091 for (auto& observer : observers_)
3095 observer.FrameDetached(); 3092 observer.FrameDetached();
3096 for (auto& observer : render_view_->observers()) 3093 for (auto& observer : render_view_->observers())
3097 observer.FrameDetached(frame); 3094 observer.FrameDetached(frame);
3098 3095
3099 // Send a state update before the frame is detached. 3096 // Send a state update before the frame is detached.
3100 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) 3097 SendUpdateState();
3101 SendUpdateState();
3102 3098
3103 // We only notify the browser process when the frame is being detached for 3099 // We only notify the browser process when the frame is being detached for
3104 // removal and it was initiated from the renderer process. 3100 // removal and it was initiated from the renderer process.
3105 if (!in_browser_initiated_detach_ && type == DetachType::Remove) 3101 if (!in_browser_initiated_detach_ && type == DetachType::Remove)
3106 Send(new FrameHostMsg_Detach(routing_id_)); 3102 Send(new FrameHostMsg_Detach(routing_id_));
3107 3103
3108 // Clean up the associated RenderWidget for the frame, if there is one. 3104 // Clean up the associated RenderWidget for the frame, if there is one.
3109 if (render_widget_) { 3105 if (render_widget_) {
3110 render_widget_->UnregisterRenderFrame(this); 3106 render_widget_->UnregisterRenderFrame(this);
3111 render_widget_->CloseForFrame(); 3107 render_widget_->CloseForFrame();
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
3294 Send(new FrameHostMsg_DownloadUrl(params)); 3290 Send(new FrameHostMsg_DownloadUrl(params));
3295 } else { 3291 } else {
3296 OpenURL(request.url(), IsHttpPost(request), 3292 OpenURL(request.url(), IsHttpPost(request),
3297 GetRequestBodyForWebURLRequest(request), 3293 GetRequestBodyForWebURLRequest(request),
3298 GetWebURLRequestHeaders(request), referrer, policy, 3294 GetWebURLRequestHeaders(request), referrer, policy,
3299 should_replace_current_entry, false); 3295 should_replace_current_entry, false);
3300 } 3296 }
3301 } 3297 }
3302 3298
3303 blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame() { 3299 blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame() {
3304 // OOPIF enabled modes will punt this navigation to the browser in 3300 // We will punt this navigation to the browser in decidePolicyForNavigation.
3305 // decidePolicyForNavigation. 3301 // TODO(creis): Look into cleaning this up.
3306 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) 3302 return WebHistoryItem();
3307 return WebHistoryItem();
3308
3309 return render_view_->history_controller()->GetItemForNewChildFrame(this);
3310 } 3303 }
3311 3304
3312 void RenderFrameImpl::willSendSubmitEvent(const blink::WebFormElement& form) { 3305 void RenderFrameImpl::willSendSubmitEvent(const blink::WebFormElement& form) {
3313 for (auto& observer : observers_) 3306 for (auto& observer : observers_)
3314 observer.WillSendSubmitEvent(form); 3307 observer.WillSendSubmitEvent(form);
3315 } 3308 }
3316 3309
3317 void RenderFrameImpl::willSubmitForm(const blink::WebFormElement& form) { 3310 void RenderFrameImpl::willSubmitForm(const blink::WebFormElement& form) {
3318 // With PlzNavigate-enabled, this will be called before a DataSource has been 3311 // With PlzNavigate-enabled, this will be called before a DataSource has been
3319 // set-up. 3312 // set-up.
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
3469 observer.DidStartProvisionalLoad(); 3462 observer.DidStartProvisionalLoad();
3470 3463
3471 Send(new FrameHostMsg_DidStartProvisionalLoad( 3464 Send(new FrameHostMsg_DidStartProvisionalLoad(
3472 routing_id_, ds->getRequest().url(), navigation_start)); 3465 routing_id_, ds->getRequest().url(), navigation_start));
3473 } 3466 }
3474 3467
3475 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( 3468 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad(
3476 blink::WebLocalFrame* frame) { 3469 blink::WebLocalFrame* frame) {
3477 DCHECK_EQ(frame_, frame); 3470 DCHECK_EQ(frame_, frame);
3478 3471
3479 // We don't use HistoryController in OOPIF enabled modes. 3472 // TODO(creis): Determine if this can be removed or if we need to clear any
3480 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) 3473 // local state here to fix https://crbug.com/671276.
3481 return;
3482
3483 render_view_->history_controller()->RemoveChildrenForRedirect(this);
3484 } 3474 }
3485 3475
3486 void RenderFrameImpl::didFailProvisionalLoad( 3476 void RenderFrameImpl::didFailProvisionalLoad(
3487 blink::WebLocalFrame* frame, 3477 blink::WebLocalFrame* frame,
3488 const blink::WebURLError& error, 3478 const blink::WebURLError& error,
3489 blink::WebHistoryCommitType commit_type) { 3479 blink::WebHistoryCommitType commit_type) {
3490 TRACE_EVENT1("navigation,benchmark,rail", 3480 TRACE_EVENT1("navigation,benchmark,rail",
3491 "RenderFrameImpl::didFailProvisionalLoad", "id", routing_id_); 3481 "RenderFrameImpl::didFailProvisionalLoad", "id", routing_id_);
3492 DCHECK_EQ(frame_, frame); 3482 DCHECK_EQ(frame_, frame);
3493 WebDataSource* ds = frame->provisionalDataSource(); 3483 WebDataSource* ds = frame->provisionalDataSource();
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
3612 // first paint of that page, so it can cancel the timer that waits for it. 3602 // first paint of that page, so it can cancel the timer that waits for it.
3613 if (is_main_frame_ && !navigation_state->WasWithinSamePage()) { 3603 if (is_main_frame_ && !navigation_state->WasWithinSamePage()) {
3614 render_view_->QueueMessage( 3604 render_view_->QueueMessage(
3615 new ViewHostMsg_DidFirstPaintAfterLoad(render_view_->routing_id_), 3605 new ViewHostMsg_DidFirstPaintAfterLoad(render_view_->routing_id_),
3616 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); 3606 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE);
3617 } 3607 }
3618 3608
3619 // When we perform a new navigation, we need to update the last committed 3609 // When we perform a new navigation, we need to update the last committed
3620 // session history entry with state for the page we are leaving. Do this 3610 // session history entry with state for the page we are leaving. Do this
3621 // before updating the current history item. 3611 // before updating the current history item.
3622 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { 3612 SendUpdateState();
3623 SendUpdateState(); 3613
3624 } else {
3625 render_view_->SendUpdateState();
3626 render_view_->history_controller()->UpdateForCommit(
3627 this, item, commit_type, navigation_state->WasWithinSamePage());
3628 }
3629 // Update the current history item for this frame (both in default Chrome and 3614 // Update the current history item for this frame (both in default Chrome and
3630 // subframe FrameNavigationEntry modes). 3615 // subframe FrameNavigationEntry modes).
3631 current_history_item_ = item; 3616 current_history_item_ = item;
3632 3617
3633 InternalDocumentStateData* internal_data = 3618 InternalDocumentStateData* internal_data =
3634 InternalDocumentStateData::FromDocumentState(document_state); 3619 InternalDocumentStateData::FromDocumentState(document_state);
3635 3620
3636 if (internal_data->must_reset_scroll_and_scale_state()) { 3621 if (internal_data->must_reset_scroll_and_scale_state()) {
3637 render_view_->webview()->resetScrollAndScaleState(); 3622 render_view_->webview()->resetScrollAndScaleState();
3638 internal_data->set_must_reset_scroll_and_scale_state(false); 3623 internal_data->set_must_reset_scroll_and_scale_state(false);
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after
4877 params.should_update_history = 4862 params.should_update_history =
4878 !ds->hasUnreachableURL() && response.httpStatusCode() != 404; 4863 !ds->hasUnreachableURL() && response.httpStatusCode() != 404;
4879 4864
4880 params.searchable_form_url = internal_data->searchable_form_url(); 4865 params.searchable_form_url = internal_data->searchable_form_url();
4881 params.searchable_form_encoding = internal_data->searchable_form_encoding(); 4866 params.searchable_form_encoding = internal_data->searchable_form_encoding();
4882 4867
4883 params.gesture = render_view_->navigation_gesture_; 4868 params.gesture = render_view_->navigation_gesture_;
4884 render_view_->navigation_gesture_ = NavigationGestureUnknown; 4869 render_view_->navigation_gesture_ = NavigationGestureUnknown;
4885 4870
4886 // Make navigation state a part of the DidCommitProvisionalLoad message so 4871 // Make navigation state a part of the DidCommitProvisionalLoad message so
4887 // that committed entry has it at all times. 4872 // that committed entry has it at all times. Send a single HistoryItem for
4888 int64_t post_id = -1; 4873 // this frame, rather than the whole tree. It will be stored in the
4889 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) { 4874 // corresponding FrameNavigationEntry.
4890 HistoryEntry* entry = render_view_->history_controller()->GetCurrentEntry(); 4875 params.page_state = SingleHistoryItemToPageState(item);
4891 if (entry) {
4892 params.page_state = HistoryEntryToPageState(entry);
4893 post_id = ExtractPostId(entry->root());
4894 } else {
4895 params.page_state = PageState::CreateFromURL(request.url());
4896 }
4897 } else {
4898 // In --site-per-process, just send a single HistoryItem for this frame,
4899 // rather than the whole tree. It will be stored in the corresponding
4900 // FrameNavigationEntry.
4901 params.page_state = SingleHistoryItemToPageState(item);
4902 post_id = ExtractPostId(item);
4903 }
4904 4876
4905 // When using subframe navigation entries, method and post id are set for all 4877 params.method = request.httpMethod().latin1();
4906 // frames. Otherwise, they are only set for the main frame navigation. 4878 if (params.method == "POST")
4907 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { 4879 params.post_id = ExtractPostId(item);
4908 params.method = request.httpMethod().latin1();
4909 if (params.method == "POST")
4910 params.post_id = post_id;
4911 }
4912 4880
4913 params.frame_unique_name = item.target().utf8(); 4881 params.frame_unique_name = item.target().utf8();
4914 params.item_sequence_number = item.itemSequenceNumber(); 4882 params.item_sequence_number = item.itemSequenceNumber();
4915 params.document_sequence_number = item.documentSequenceNumber(); 4883 params.document_sequence_number = item.documentSequenceNumber();
4916 4884
4917 // If the page contained a client redirect (meta refresh, document.loc...), 4885 // If the page contained a client redirect (meta refresh, document.loc...),
4918 // set the referrer appropriately. 4886 // set the referrer appropriately.
4919 if (ds->isClientRedirect()) { 4887 if (ds->isClientRedirect()) {
4920 params.referrer = 4888 params.referrer =
4921 Referrer(params.redirects[0], ds->getRequest().getReferrerPolicy()); 4889 Referrer(params.redirects[0], ds->getRequest().getReferrerPolicy());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
4975 params.transition = ui::PAGE_TRANSITION_LINK; 4943 params.transition = ui::PAGE_TRANSITION_LINK;
4976 } 4944 }
4977 4945
4978 // If the page contained a client redirect (meta refresh, document.loc...), 4946 // If the page contained a client redirect (meta refresh, document.loc...),
4979 // set the transition appropriately. 4947 // set the transition appropriately.
4980 if (ds->isClientRedirect()) { 4948 if (ds->isClientRedirect()) {
4981 params.transition = ui::PageTransitionFromInt( 4949 params.transition = ui::PageTransitionFromInt(
4982 params.transition | ui::PAGE_TRANSITION_CLIENT_REDIRECT); 4950 params.transition | ui::PAGE_TRANSITION_CLIENT_REDIRECT);
4983 } 4951 }
4984 4952
4985 // When using subframe navigation entries, method and post id have already
4986 // been set.
4987 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) {
4988 params.method = request.httpMethod().latin1();
4989 if (params.method == "POST")
4990 params.post_id = post_id;
4991 }
4992
4993 // Send the user agent override back. 4953 // Send the user agent override back.
4994 params.is_overriding_user_agent = internal_data->is_overriding_user_agent(); 4954 params.is_overriding_user_agent = internal_data->is_overriding_user_agent();
4995 4955
4996 // Track the URL of the original request. We use the first entry of the 4956 // Track the URL of the original request. We use the first entry of the
4997 // redirect chain if it exists because the chain may have started in another 4957 // redirect chain if it exists because the chain may have started in another
4998 // process. 4958 // process.
4999 params.original_request_url = GetOriginalRequestURL(ds); 4959 params.original_request_url = GetOriginalRequestURL(ds);
5000 4960
5001 params.history_list_was_cleared = 4961 params.history_list_was_cleared =
5002 navigation_state->request_params().should_clear_history_list; 4962 navigation_state->request_params().should_clear_history_list;
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
5291 if (is_content_initiated && IsTopLevelNavigation(frame_) && 5251 if (is_content_initiated && IsTopLevelNavigation(frame_) &&
5292 render_view_->renderer_preferences_ 5252 render_view_->renderer_preferences_
5293 .browser_handles_all_top_level_requests) { 5253 .browser_handles_all_top_level_requests) {
5294 OpenURL(url, IsHttpPost(info.urlRequest), 5254 OpenURL(url, IsHttpPost(info.urlRequest),
5295 GetRequestBodyForWebURLRequest(info.urlRequest), 5255 GetRequestBodyForWebURLRequest(info.urlRequest),
5296 GetWebURLRequestHeaders(info.urlRequest), referrer, 5256 GetWebURLRequestHeaders(info.urlRequest), referrer,
5297 info.defaultPolicy, info.replacesCurrentHistoryItem, false); 5257 info.defaultPolicy, info.replacesCurrentHistoryItem, false);
5298 return blink::WebNavigationPolicyIgnore; // Suppress the load here. 5258 return blink::WebNavigationPolicyIgnore; // Suppress the load here.
5299 } 5259 }
5300 5260
5301 // In OOPIF-enabled modes, back/forward navigations in newly created subframes 5261 // Back/forward navigations in newly created subframes should be sent to the
5302 // should be sent to the browser if there is a matching FrameNavigationEntry, 5262 // browser if there is a matching FrameNavigationEntry, and if it isn't just
5303 // and if it isn't just staying at about:blank. If this frame isn't in the 5263 // staying at about:blank. If this frame isn't in the map of unique names
5304 // map of unique names that have history items, or if it's staying at the 5264 // that have history items, or if it's staying at the initial about:blank URL,
5305 // initial about:blank URL, fall back to loading the default url. (We remove 5265 // fall back to loading the default url. (We remove each name as we encounter
5306 // each name as we encounter it, because it will only be used once as the 5266 // it, because it will only be used once as the frame is created.)
5307 // frame is created.) 5267 if (info.isHistoryNavigationInNewChildFrame && is_content_initiated &&
5308 if (SiteIsolationPolicy::UseSubframeNavigationEntries() &&
5309 info.isHistoryNavigationInNewChildFrame && is_content_initiated &&
5310 frame_->parent()) { 5268 frame_->parent()) {
5311 // Check whether the browser has a history item for this frame that isn't 5269 // Check whether the browser has a history item for this frame that isn't
5312 // just staying at the initial about:blank document. 5270 // just staying at the initial about:blank document.
5313 bool should_ask_browser = false; 5271 bool should_ask_browser = false;
5314 RenderFrameImpl* parent = RenderFrameImpl::FromWebFrame(frame_->parent()); 5272 RenderFrameImpl* parent = RenderFrameImpl::FromWebFrame(frame_->parent());
5315 const auto& iter = parent->history_subframe_unique_names_.find( 5273 const auto& iter = parent->history_subframe_unique_names_.find(
5316 frame_->uniqueName().utf8()); 5274 frame_->uniqueName().utf8());
5317 if (iter != parent->history_subframe_unique_names_.end()) { 5275 if (iter != parent->history_subframe_unique_names_.end()) {
5318 bool history_item_is_about_blank = iter->second; 5276 bool history_item_is_about_blank = iter->second;
5319 should_ask_browser = 5277 should_ask_browser =
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
5819 if (GetContentClient()->renderer()->AllowPopup()) 5777 if (GetContentClient()->renderer()->AllowPopup())
5820 params.user_gesture = true; 5778 params.user_gesture = true;
5821 5779
5822 if (policy == blink::WebNavigationPolicyNewBackgroundTab || 5780 if (policy == blink::WebNavigationPolicyNewBackgroundTab ||
5823 policy == blink::WebNavigationPolicyNewForegroundTab || 5781 policy == blink::WebNavigationPolicyNewForegroundTab ||
5824 policy == blink::WebNavigationPolicyNewWindow || 5782 policy == blink::WebNavigationPolicyNewWindow ||
5825 policy == blink::WebNavigationPolicyNewPopup) { 5783 policy == blink::WebNavigationPolicyNewPopup) {
5826 WebUserGestureIndicator::consumeUserGesture(); 5784 WebUserGestureIndicator::consumeUserGesture();
5827 } 5785 }
5828 5786
5829 if (is_history_navigation_in_new_child) { 5787 if (is_history_navigation_in_new_child)
5830 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
5831 params.is_history_navigation_in_new_child = true; 5788 params.is_history_navigation_in_new_child = true;
5832 }
5833 5789
5834 Send(new FrameHostMsg_OpenURL(routing_id_, params)); 5790 Send(new FrameHostMsg_OpenURL(routing_id_, params));
5835 } 5791 }
5836 5792
5837 void RenderFrameImpl::NavigateInternal( 5793 void RenderFrameImpl::NavigateInternal(
5838 const CommonNavigationParams& common_params, 5794 const CommonNavigationParams& common_params,
5839 const StartNavigationParams& start_params, 5795 const StartNavigationParams& start_params,
5840 const RequestNavigationParams& request_params, 5796 const RequestNavigationParams& request_params,
5841 std::unique_ptr<StreamOverrideParameters> stream_params) { 5797 std::unique_ptr<StreamOverrideParameters> stream_params) {
5842 bool browser_side_navigation = IsBrowserSideNavigationEnabled(); 5798 bool browser_side_navigation = IsBrowserSideNavigationEnabled();
5843 5799
5844 // Lower bound for browser initiated navigation start time. 5800 // Lower bound for browser initiated navigation start time.
5845 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); 5801 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now();
5846 bool is_reload = IsReload(common_params.navigation_type); 5802 bool is_reload = IsReload(common_params.navigation_type);
5847 bool is_history_navigation = request_params.page_state.IsValid(); 5803 bool is_history_navigation = request_params.page_state.IsValid();
5848 WebCachePolicy cache_policy = WebCachePolicy::UseProtocolCachePolicy; 5804 WebCachePolicy cache_policy = WebCachePolicy::UseProtocolCachePolicy;
5849 RenderFrameImpl::PrepareRenderViewForNavigation( 5805 RenderFrameImpl::PrepareRenderViewForNavigation(
5850 common_params.url, request_params); 5806 common_params.url, request_params);
5851 5807
5852 GetContentClient()->SetActiveURL(common_params.url); 5808 GetContentClient()->SetActiveURL(common_params.url);
5853 5809
5854 // If this frame isn't in the same process as the main frame, it may naively 5810 // If this frame isn't in the same process as the main frame, it may naively
5855 // assume that this is the first navigation in the iframe, but this may not 5811 // assume that this is the first navigation in the iframe, but this may not
5856 // actually be the case. Inform the frame's state machine if this frame has 5812 // actually be the case. Inform the frame's state machine if this frame has
5857 // already committed other loads. 5813 // already committed other loads.
5858 if (request_params.has_committed_real_load && frame_->parent()) 5814 if (request_params.has_committed_real_load && frame_->parent())
5859 frame_->setCommittedFirstRealLoad(); 5815 frame_->setCommittedFirstRealLoad();
5860 5816
5861 bool no_current_entry = 5817 if (is_reload && current_history_item_.isNull()) {
5862 SiteIsolationPolicy::UseSubframeNavigationEntries()
5863 ? current_history_item_.isNull()
5864 : !render_view_->history_controller()->GetCurrentEntry();
5865 if (is_reload && no_current_entry) {
5866 // We cannot reload if we do not have any history state. This happens, for 5818 // We cannot reload if we do not have any history state. This happens, for
5867 // example, when recovering from a crash. 5819 // example, when recovering from a crash.
5868 is_reload = false; 5820 is_reload = false;
5869 cache_policy = WebCachePolicy::ValidatingCacheData; 5821 cache_policy = WebCachePolicy::ValidatingCacheData;
5870 } 5822 }
5871 5823
5872 // If the navigation is for "view source", the WebLocalFrame needs to be put 5824 // If the navigation is for "view source", the WebLocalFrame needs to be put
5873 // in a special mode. 5825 // in a special mode.
5874 if (request_params.is_view_source) 5826 if (request_params.is_view_source)
5875 frame_->enableViewSourceMode(true); 5827 frame_->enableViewSourceMode(true);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
5937 } 5889 }
5938 should_load_request = true; 5890 should_load_request = true;
5939 } else if (is_history_navigation) { 5891 } else if (is_history_navigation) {
5940 // We must know the nav entry ID of the page we are navigating back to, 5892 // We must know the nav entry ID of the page we are navigating back to,
5941 // which should be the case because history navigations are routed via the 5893 // which should be the case because history navigations are routed via the
5942 // browser. 5894 // browser.
5943 DCHECK_NE(0, request_params.nav_entry_id); 5895 DCHECK_NE(0, request_params.nav_entry_id);
5944 std::unique_ptr<HistoryEntry> entry = 5896 std::unique_ptr<HistoryEntry> entry =
5945 PageStateToHistoryEntry(request_params.page_state); 5897 PageStateToHistoryEntry(request_params.page_state);
5946 if (entry) { 5898 if (entry) {
5947 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) { 5899 // The browser process sends a single WebHistoryItem for this frame.
5948 // By default, tell the HistoryController to go the deserialized 5900 // TODO(creis): Change PageState to FrameState. In the meantime, we
5949 // HistoryEntry. This only works if all frames are in the same 5901 // store the relevant frame's WebHistoryItem in the root of the
5950 // process. 5902 // PageState.
5951 DCHECK(!frame_->parent()); 5903 item_for_history_navigation = entry->root();
5952 DCHECK(!browser_side_navigation); 5904 history_load_type = request_params.is_same_document_history_load
5953 std::unique_ptr<NavigationParams> navigation_params( 5905 ? blink::WebHistorySameDocumentLoad
5954 new NavigationParams(*pending_navigation_params_.get())); 5906 : blink::WebHistoryDifferentDocumentLoad;
5955 has_history_navigation_in_frame = 5907 load_type = request_params.is_history_navigation_in_new_child
5956 render_view_->history_controller()->GoToEntry( 5908 ? blink::WebFrameLoadType::InitialHistoryLoad
5957 frame_, std::move(entry), std::move(navigation_params), 5909 : blink::WebFrameLoadType::BackForward;
5958 cache_policy); 5910 should_load_request = true;
5959 } else {
5960 // In --site-per-process, the browser process sends a single
5961 // WebHistoryItem destined for this frame.
5962 // TODO(creis): Change PageState to FrameState. In the meantime, we
5963 // store the relevant frame's WebHistoryItem in the root of the
5964 // PageState.
5965 item_for_history_navigation = entry->root();
5966 history_load_type = request_params.is_same_document_history_load
5967 ? blink::WebHistorySameDocumentLoad
5968 : blink::WebHistoryDifferentDocumentLoad;
5969 load_type = request_params.is_history_navigation_in_new_child
5970 ? blink::WebFrameLoadType::InitialHistoryLoad
5971 : blink::WebFrameLoadType::BackForward;
5972 should_load_request = true;
5973 5911
5974 // Keep track of which subframes the browser process has history items 5912 // Keep track of which subframes the browser process has history items
5975 // for during a history navigation. 5913 // for during a history navigation.
5976 history_subframe_unique_names_ = request_params.subframe_unique_names; 5914 history_subframe_unique_names_ = request_params.subframe_unique_names;
5977 5915
5978 if (history_load_type == blink::WebHistorySameDocumentLoad) { 5916 if (history_load_type == blink::WebHistorySameDocumentLoad) {
5979 // If this is marked as a same document load but we haven't committed 5917 // If this is marked as a same document load but we haven't committed
5980 // anything, treat it as a new load. The browser shouldn't let this 5918 // anything, treat it as a new load. The browser shouldn't let this
5981 // happen. 5919 // happen.
5982 if (current_history_item_.isNull()) { 5920 if (current_history_item_.isNull()) {
5921 history_load_type = blink::WebHistoryDifferentDocumentLoad;
5922 NOTREACHED();
5923 } else {
5924 // Additionally, if the |current_history_item_|'s document
5925 // sequence number doesn't match the one sent from the browser, it
5926 // is possible that this renderer has committed a different
5927 // document. In such case, don't use WebHistorySameDocumentLoad.
5928 if (current_history_item_.documentSequenceNumber() !=
5929 item_for_history_navigation.documentSequenceNumber()) {
5983 history_load_type = blink::WebHistoryDifferentDocumentLoad; 5930 history_load_type = blink::WebHistoryDifferentDocumentLoad;
5984 NOTREACHED();
5985 } else {
5986 // Additionally, if the |current_history_item_|'s document
5987 // sequence number doesn't match the one sent from the browser, it
5988 // is possible that this renderer has committed a different
5989 // document. In such case, don't use WebHistorySameDocumentLoad.
5990 if (current_history_item_.documentSequenceNumber() !=
5991 item_for_history_navigation.documentSequenceNumber()) {
5992 history_load_type = blink::WebHistoryDifferentDocumentLoad;
5993 }
5994 } 5931 }
5995 } 5932 }
5933 }
5996 5934
5997 // If this navigation is to a history item for a new child frame, we may 5935 // If this navigation is to a history item for a new child frame, we may
5998 // want to ignore it in some cases. If a Javascript navigation (i.e., 5936 // want to ignore it in some cases. If a Javascript navigation (i.e.,
5999 // client redirect) interrupted it and has either been scheduled, 5937 // client redirect) interrupted it and has either been scheduled,
6000 // started loading, or has committed, we should ignore the history item. 5938 // started loading, or has committed, we should ignore the history item.
6001 bool interrupted_by_client_redirect = 5939 bool interrupted_by_client_redirect =
6002 frame_->isNavigationScheduledWithin(0) || 5940 frame_->isNavigationScheduledWithin(0) ||
6003 frame_->provisionalDataSource() || 5941 frame_->provisionalDataSource() || !current_history_item_.isNull();
6004 !current_history_item_.isNull(); 5942 if (request_params.is_history_navigation_in_new_child &&
6005 if (request_params.is_history_navigation_in_new_child && 5943 interrupted_by_client_redirect) {
6006 interrupted_by_client_redirect) { 5944 should_load_request = false;
6007 should_load_request = false; 5945 has_history_navigation_in_frame = false;
6008 has_history_navigation_in_frame = false; 5946 }
6009 }
6010 5947
6011 // Generate the request for the load from the HistoryItem. 5948 // Generate the request for the load from the HistoryItem.
6012 // PlzNavigate: use the data sent by the browser for the url and the 5949 // PlzNavigate: use the data sent by the browser for the url and the
6013 // HTTP state. The restoration of user state such as scroll position 5950 // HTTP state. The restoration of user state such as scroll position
6014 // will be done based on the history item during the load. 5951 // will be done based on the history item during the load.
6015 if (!browser_side_navigation && should_load_request) { 5952 if (!browser_side_navigation && should_load_request) {
6016 request = frame_->requestFromHistoryItem(item_for_history_navigation, 5953 request = frame_->requestFromHistoryItem(item_for_history_navigation,
6017 cache_policy); 5954 cache_policy);
6018 }
6019 } 5955 }
6020 } 5956 }
6021 } else { 5957 } else {
6022 // Navigate to the given URL. 5958 // Navigate to the given URL.
6023 if (!start_params.extra_headers.empty() && !browser_side_navigation) { 5959 if (!start_params.extra_headers.empty() && !browser_side_navigation) {
6024 for (net::HttpUtil::HeadersIterator i(start_params.extra_headers.begin(), 5960 for (net::HttpUtil::HeadersIterator i(start_params.extra_headers.begin(),
6025 start_params.extra_headers.end(), 5961 start_params.extra_headers.end(),
6026 "\n"); 5962 "\n");
6027 i.GetNext();) { 5963 i.GetNext();) {
6028 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 5964 request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
6069 history_load_type, is_client_redirect); 6005 history_load_type, is_client_redirect);
6070 6006
6071 if (!weak_this) 6007 if (!weak_this)
6072 return; 6008 return;
6073 } 6009 }
6074 } else { 6010 } else {
6075 // The browser expects the frame to be loading this navigation. Inform it 6011 // The browser expects the frame to be loading this navigation. Inform it
6076 // that the load stopped if needed. 6012 // that the load stopped if needed.
6077 // Note: in the case of history navigations, |should_load_request| will be 6013 // Note: in the case of history navigations, |should_load_request| will be
6078 // false, and the frame may not have been set in a loading state. Do not 6014 // false, and the frame may not have been set in a loading state. Do not
6079 // send a stop message if the HistoryController is loading in this frame 6015 // send a stop message if a history navigation is loading in this frame
6080 // nonetheless. This behavior will go away with subframe navigation 6016 // nonetheless. This behavior will go away with subframe navigation
6081 // entries. 6017 // entries.
6082 if (frame_ && !frame_->isLoading() && !has_history_navigation_in_frame) 6018 if (frame_ && !frame_->isLoading() && !has_history_navigation_in_frame)
6083 Send(new FrameHostMsg_DidStopLoading(routing_id_)); 6019 Send(new FrameHostMsg_DidStopLoading(routing_id_));
6084 } 6020 }
6085 6021
6086 // In case LoadRequest failed before didCreateDataSource was called. 6022 // In case LoadRequest failed before didCreateDataSource was called.
6087 pending_navigation_params_.reset(); 6023 pending_navigation_params_.reset();
6088 } 6024 }
6089 6025
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
6347 // Needed so that history-url-only changes don't become reloads. 6283 // Needed so that history-url-only changes don't become reloads.
6348 params.history_url_for_data_url, replace, load_type, 6284 params.history_url_for_data_url, replace, load_type,
6349 item_for_history_navigation, history_load_type, is_client_redirect); 6285 item_for_history_navigation, history_load_type, is_client_redirect);
6350 } else { 6286 } else {
6351 CHECK(false) << "Invalid URL passed: " 6287 CHECK(false) << "Invalid URL passed: "
6352 << params.url.possibly_invalid_spec(); 6288 << params.url.possibly_invalid_spec();
6353 } 6289 }
6354 } 6290 }
6355 6291
6356 void RenderFrameImpl::SendUpdateState() { 6292 void RenderFrameImpl::SendUpdateState() {
6357 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
6358 if (current_history_item_.isNull()) 6293 if (current_history_item_.isNull())
6359 return; 6294 return;
6360 6295
6361 Send(new FrameHostMsg_UpdateState( 6296 Send(new FrameHostMsg_UpdateState(
6362 routing_id_, SingleHistoryItemToPageState(current_history_item_))); 6297 routing_id_, SingleHistoryItemToPageState(current_history_item_)));
6363 } 6298 }
6364 6299
6365 void RenderFrameImpl::MaybeEnableMojoBindings() { 6300 void RenderFrameImpl::MaybeEnableMojoBindings() {
6366 int enabled_bindings = RenderProcess::current()->GetEnabledBindings(); 6301 int enabled_bindings = RenderProcess::current()->GetEnabledBindings();
6367 // BINDINGS_POLICY_WEB_UI, BINDINGS_POLICY_MOJO and BINDINGS_POLICY_HEADLESS 6302 // BINDINGS_POLICY_WEB_UI, BINDINGS_POLICY_MOJO and BINDINGS_POLICY_HEADLESS
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
6866 // event target. Potentially a Pepper plugin will receive the event. 6801 // event target. Potentially a Pepper plugin will receive the event.
6867 // In order to tell whether a plugin gets the last mouse event and which it 6802 // In order to tell whether a plugin gets the last mouse event and which it
6868 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets 6803 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets
6869 // the event, it will notify us via DidReceiveMouseEvent() and set itself as 6804 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
6870 // |pepper_last_mouse_event_target_|. 6805 // |pepper_last_mouse_event_target_|.
6871 pepper_last_mouse_event_target_ = nullptr; 6806 pepper_last_mouse_event_target_ = nullptr;
6872 #endif 6807 #endif
6873 } 6808 }
6874 6809
6875 } // namespace content 6810 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/history_controller_browsertest.cc ('k') | content/renderer/render_view_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698