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

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

Issue 2648053002: Remove old session history logic. (Closed)
Patch Set: Remove policy function Created 3 years, 11 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 1383 matching lines...) Expand 10 before | Expand all | Expand 10 after
3089 if (focused_pepper_plugin_) 3086 if (focused_pepper_plugin_)
3090 GetRenderWidget()->set_focused_pepper_plugin(nullptr); 3087 GetRenderWidget()->set_focused_pepper_plugin(nullptr);
3091 #endif 3088 #endif
3092 3089
3093 for (auto& observer : observers_) 3090 for (auto& observer : observers_)
3094 observer.FrameDetached(); 3091 observer.FrameDetached();
3095 for (auto& observer : render_view_->observers()) 3092 for (auto& observer : render_view_->observers())
3096 observer.FrameDetached(frame); 3093 observer.FrameDetached(frame);
3097 3094
3098 // Send a state update before the frame is detached. 3095 // Send a state update before the frame is detached.
3099 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) 3096 SendUpdateState();
3100 SendUpdateState();
3101 3097
3102 // We only notify the browser process when the frame is being detached for 3098 // We only notify the browser process when the frame is being detached for
3103 // removal and it was initiated from the renderer process. 3099 // removal and it was initiated from the renderer process.
3104 if (!in_browser_initiated_detach_ && type == DetachType::Remove) 3100 if (!in_browser_initiated_detach_ && type == DetachType::Remove)
3105 Send(new FrameHostMsg_Detach(routing_id_)); 3101 Send(new FrameHostMsg_Detach(routing_id_));
3106 3102
3107 // Clean up the associated RenderWidget for the frame, if there is one. 3103 // Clean up the associated RenderWidget for the frame, if there is one.
3108 if (render_widget_) { 3104 if (render_widget_) {
3109 render_widget_->UnregisterRenderFrame(this); 3105 render_widget_->UnregisterRenderFrame(this);
3110 render_widget_->CloseForFrame(); 3106 render_widget_->CloseForFrame();
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
3289 Send(new FrameHostMsg_DownloadUrl(params)); 3285 Send(new FrameHostMsg_DownloadUrl(params));
3290 } else { 3286 } else {
3291 OpenURL(request.url(), IsHttpPost(request), 3287 OpenURL(request.url(), IsHttpPost(request),
3292 GetRequestBodyForWebURLRequest(request), 3288 GetRequestBodyForWebURLRequest(request),
3293 GetWebURLRequestHeaders(request), referrer, policy, 3289 GetWebURLRequestHeaders(request), referrer, policy,
3294 should_replace_current_entry, false); 3290 should_replace_current_entry, false);
3295 } 3291 }
3296 } 3292 }
3297 3293
3298 blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame() { 3294 blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame() {
3299 // OOPIF enabled modes will punt this navigation to the browser in 3295 // We will punt this navigation to the browser in decidePolicyForNavigation.
3300 // decidePolicyForNavigation. 3296 // TODO(creis): Look into cleaning this up.
3301 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) 3297 return WebHistoryItem();
3302 return WebHistoryItem();
3303
3304 return render_view_->history_controller()->GetItemForNewChildFrame(this);
3305 } 3298 }
3306 3299
3307 void RenderFrameImpl::willSendSubmitEvent(const blink::WebFormElement& form) { 3300 void RenderFrameImpl::willSendSubmitEvent(const blink::WebFormElement& form) {
3308 for (auto& observer : observers_) 3301 for (auto& observer : observers_)
3309 observer.WillSendSubmitEvent(form); 3302 observer.WillSendSubmitEvent(form);
3310 } 3303 }
3311 3304
3312 void RenderFrameImpl::willSubmitForm(const blink::WebFormElement& form) { 3305 void RenderFrameImpl::willSubmitForm(const blink::WebFormElement& form) {
3313 // With PlzNavigate-enabled, this will be called before a DataSource has been 3306 // With PlzNavigate-enabled, this will be called before a DataSource has been
3314 // set-up. 3307 // set-up.
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
3464 observer.DidStartProvisionalLoad(); 3457 observer.DidStartProvisionalLoad();
3465 3458
3466 Send(new FrameHostMsg_DidStartProvisionalLoad( 3459 Send(new FrameHostMsg_DidStartProvisionalLoad(
3467 routing_id_, ds->getRequest().url(), navigation_start)); 3460 routing_id_, ds->getRequest().url(), navigation_start));
3468 } 3461 }
3469 3462
3470 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( 3463 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad(
3471 blink::WebLocalFrame* frame) { 3464 blink::WebLocalFrame* frame) {
3472 DCHECK_EQ(frame_, frame); 3465 DCHECK_EQ(frame_, frame);
3473 3466
3474 // We don't use HistoryController in OOPIF enabled modes. 3467 // TODO(creis): Determine if this can be removed or if we need to clear any
3475 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) 3468 // local state here to fix https://crbug.com/671276.
3476 return;
3477
3478 render_view_->history_controller()->RemoveChildrenForRedirect(this);
3479 } 3469 }
3480 3470
3481 void RenderFrameImpl::didFailProvisionalLoad( 3471 void RenderFrameImpl::didFailProvisionalLoad(
3482 blink::WebLocalFrame* frame, 3472 blink::WebLocalFrame* frame,
3483 const blink::WebURLError& error, 3473 const blink::WebURLError& error,
3484 blink::WebHistoryCommitType commit_type) { 3474 blink::WebHistoryCommitType commit_type) {
3485 TRACE_EVENT1("navigation,benchmark,rail", 3475 TRACE_EVENT1("navigation,benchmark,rail",
3486 "RenderFrameImpl::didFailProvisionalLoad", "id", routing_id_); 3476 "RenderFrameImpl::didFailProvisionalLoad", "id", routing_id_);
3487 DCHECK_EQ(frame_, frame); 3477 DCHECK_EQ(frame_, frame);
3488 WebDataSource* ds = frame->provisionalDataSource(); 3478 WebDataSource* ds = frame->provisionalDataSource();
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
3607 // first paint of that page, so it can cancel the timer that waits for it. 3597 // first paint of that page, so it can cancel the timer that waits for it.
3608 if (is_main_frame_ && !navigation_state->WasWithinSamePage()) { 3598 if (is_main_frame_ && !navigation_state->WasWithinSamePage()) {
3609 render_view_->QueueMessage( 3599 render_view_->QueueMessage(
3610 new ViewHostMsg_DidFirstPaintAfterLoad(render_view_->routing_id_), 3600 new ViewHostMsg_DidFirstPaintAfterLoad(render_view_->routing_id_),
3611 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); 3601 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE);
3612 } 3602 }
3613 3603
3614 // When we perform a new navigation, we need to update the last committed 3604 // When we perform a new navigation, we need to update the last committed
3615 // session history entry with state for the page we are leaving. Do this 3605 // session history entry with state for the page we are leaving. Do this
3616 // before updating the current history item. 3606 // before updating the current history item.
3617 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { 3607 SendUpdateState();
3618 SendUpdateState(); 3608
3619 } else {
3620 render_view_->SendUpdateState();
3621 render_view_->history_controller()->UpdateForCommit(
3622 this, item, commit_type, navigation_state->WasWithinSamePage());
3623 }
3624 // Update the current history item for this frame (both in default Chrome and 3609 // Update the current history item for this frame (both in default Chrome and
3625 // subframe FrameNavigationEntry modes). 3610 // subframe FrameNavigationEntry modes).
3626 current_history_item_ = item; 3611 current_history_item_ = item;
3627 3612
3628 InternalDocumentStateData* internal_data = 3613 InternalDocumentStateData* internal_data =
3629 InternalDocumentStateData::FromDocumentState(document_state); 3614 InternalDocumentStateData::FromDocumentState(document_state);
3630 3615
3631 if (internal_data->must_reset_scroll_and_scale_state()) { 3616 if (internal_data->must_reset_scroll_and_scale_state()) {
3632 render_view_->webview()->resetScrollAndScaleState(); 3617 render_view_->webview()->resetScrollAndScaleState();
3633 internal_data->set_must_reset_scroll_and_scale_state(false); 3618 internal_data->set_must_reset_scroll_and_scale_state(false);
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after
4872 params.should_update_history = 4857 params.should_update_history =
4873 !ds->hasUnreachableURL() && response.httpStatusCode() != 404; 4858 !ds->hasUnreachableURL() && response.httpStatusCode() != 404;
4874 4859
4875 params.searchable_form_url = internal_data->searchable_form_url(); 4860 params.searchable_form_url = internal_data->searchable_form_url();
4876 params.searchable_form_encoding = internal_data->searchable_form_encoding(); 4861 params.searchable_form_encoding = internal_data->searchable_form_encoding();
4877 4862
4878 params.gesture = render_view_->navigation_gesture_; 4863 params.gesture = render_view_->navigation_gesture_;
4879 render_view_->navigation_gesture_ = NavigationGestureUnknown; 4864 render_view_->navigation_gesture_ = NavigationGestureUnknown;
4880 4865
4881 // Make navigation state a part of the DidCommitProvisionalLoad message so 4866 // Make navigation state a part of the DidCommitProvisionalLoad message so
4882 // that committed entry has it at all times. 4867 // that committed entry has it at all times. Send a single HistoryItem for
4883 int64_t post_id = -1; 4868 // this frame, rather than the whole tree. It will be stored in the
4884 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) { 4869 // corresponding FrameNavigationEntry.
4885 HistoryEntry* entry = render_view_->history_controller()->GetCurrentEntry(); 4870 params.page_state = SingleHistoryItemToPageState(item);
4886 if (entry) {
4887 params.page_state = HistoryEntryToPageState(entry);
4888 post_id = ExtractPostId(entry->root());
4889 } else {
4890 params.page_state = PageState::CreateFromURL(request.url());
4891 }
4892 } else {
4893 // In --site-per-process, just send a single HistoryItem for this frame,
4894 // rather than the whole tree. It will be stored in the corresponding
4895 // FrameNavigationEntry.
4896 params.page_state = SingleHistoryItemToPageState(item);
4897 post_id = ExtractPostId(item);
4898 }
4899 4871
4900 // When using subframe navigation entries, method and post id are set for all 4872 // Method and post id are set for all frames.
nasko 2017/01/26 00:56:20 Does this comment still add meaningful info? Why w
Charlie Reis 2017/01/26 01:07:47 Done.
4901 // frames. Otherwise, they are only set for the main frame navigation. 4873 params.method = request.httpMethod().latin1();
4902 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { 4874 if (params.method == "POST")
4903 params.method = request.httpMethod().latin1(); 4875 params.post_id = ExtractPostId(item);
4904 if (params.method == "POST")
4905 params.post_id = post_id;
4906 }
4907 4876
4908 params.frame_unique_name = item.target().utf8(); 4877 params.frame_unique_name = item.target().utf8();
4909 params.item_sequence_number = item.itemSequenceNumber(); 4878 params.item_sequence_number = item.itemSequenceNumber();
4910 params.document_sequence_number = item.documentSequenceNumber(); 4879 params.document_sequence_number = item.documentSequenceNumber();
4911 4880
4912 // If the page contained a client redirect (meta refresh, document.loc...), 4881 // If the page contained a client redirect (meta refresh, document.loc...),
4913 // set the referrer appropriately. 4882 // set the referrer appropriately.
4914 if (ds->isClientRedirect()) { 4883 if (ds->isClientRedirect()) {
4915 params.referrer = 4884 params.referrer =
4916 Referrer(params.redirects[0], ds->getRequest().getReferrerPolicy()); 4885 Referrer(params.redirects[0], ds->getRequest().getReferrerPolicy());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
4970 params.transition = ui::PAGE_TRANSITION_LINK; 4939 params.transition = ui::PAGE_TRANSITION_LINK;
4971 } 4940 }
4972 4941
4973 // If the page contained a client redirect (meta refresh, document.loc...), 4942 // If the page contained a client redirect (meta refresh, document.loc...),
4974 // set the transition appropriately. 4943 // set the transition appropriately.
4975 if (ds->isClientRedirect()) { 4944 if (ds->isClientRedirect()) {
4976 params.transition = ui::PageTransitionFromInt( 4945 params.transition = ui::PageTransitionFromInt(
4977 params.transition | ui::PAGE_TRANSITION_CLIENT_REDIRECT); 4946 params.transition | ui::PAGE_TRANSITION_CLIENT_REDIRECT);
4978 } 4947 }
4979 4948
4980 // When using subframe navigation entries, method and post id have already
4981 // been set.
4982 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) {
4983 params.method = request.httpMethod().latin1();
4984 if (params.method == "POST")
4985 params.post_id = post_id;
4986 }
4987
4988 // Send the user agent override back. 4949 // Send the user agent override back.
4989 params.is_overriding_user_agent = internal_data->is_overriding_user_agent(); 4950 params.is_overriding_user_agent = internal_data->is_overriding_user_agent();
4990 4951
4991 // Track the URL of the original request. We use the first entry of the 4952 // Track the URL of the original request. We use the first entry of the
4992 // redirect chain if it exists because the chain may have started in another 4953 // redirect chain if it exists because the chain may have started in another
4993 // process. 4954 // process.
4994 params.original_request_url = GetOriginalRequestURL(ds); 4955 params.original_request_url = GetOriginalRequestURL(ds);
4995 4956
4996 params.history_list_was_cleared = 4957 params.history_list_was_cleared =
4997 navigation_state->request_params().should_clear_history_list; 4958 navigation_state->request_params().should_clear_history_list;
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
5287 if (is_content_initiated && IsTopLevelNavigation(frame_) && 5248 if (is_content_initiated && IsTopLevelNavigation(frame_) &&
5288 render_view_->renderer_preferences_ 5249 render_view_->renderer_preferences_
5289 .browser_handles_all_top_level_requests) { 5250 .browser_handles_all_top_level_requests) {
5290 OpenURL(url, IsHttpPost(info.urlRequest), 5251 OpenURL(url, IsHttpPost(info.urlRequest),
5291 GetRequestBodyForWebURLRequest(info.urlRequest), 5252 GetRequestBodyForWebURLRequest(info.urlRequest),
5292 GetWebURLRequestHeaders(info.urlRequest), referrer, 5253 GetWebURLRequestHeaders(info.urlRequest), referrer,
5293 info.defaultPolicy, info.replacesCurrentHistoryItem, false); 5254 info.defaultPolicy, info.replacesCurrentHistoryItem, false);
5294 return blink::WebNavigationPolicyIgnore; // Suppress the load here. 5255 return blink::WebNavigationPolicyIgnore; // Suppress the load here.
5295 } 5256 }
5296 5257
5297 // In OOPIF-enabled modes, back/forward navigations in newly created subframes 5258 // Back/forward navigations in newly created subframes should be sent to the
5298 // should be sent to the browser if there is a matching FrameNavigationEntry, 5259 // browser if there is a matching FrameNavigationEntry, and if it isn't just
5299 // and if it isn't just staying at about:blank. If this frame isn't in the 5260 // staying at about:blank. If this frame isn't in the map of unique names
5300 // map of unique names that have history items, or if it's staying at the 5261 // that have history items, or if it's staying at the initial about:blank URL,
5301 // initial about:blank URL, fall back to loading the default url. (We remove 5262 // fall back to loading the default url. (We remove each name as we encounter
5302 // each name as we encounter it, because it will only be used once as the 5263 // it, because it will only be used once as the frame is created.)
5303 // frame is created.) 5264 if (info.isHistoryNavigationInNewChildFrame && is_content_initiated &&
5304 if (SiteIsolationPolicy::UseSubframeNavigationEntries() &&
5305 info.isHistoryNavigationInNewChildFrame && is_content_initiated &&
5306 frame_->parent()) { 5265 frame_->parent()) {
5307 // Check whether the browser has a history item for this frame that isn't 5266 // Check whether the browser has a history item for this frame that isn't
5308 // just staying at the initial about:blank document. 5267 // just staying at the initial about:blank document.
5309 bool should_ask_browser = false; 5268 bool should_ask_browser = false;
5310 RenderFrameImpl* parent = RenderFrameImpl::FromWebFrame(frame_->parent()); 5269 RenderFrameImpl* parent = RenderFrameImpl::FromWebFrame(frame_->parent());
5311 const auto& iter = parent->history_subframe_unique_names_.find( 5270 const auto& iter = parent->history_subframe_unique_names_.find(
5312 frame_->uniqueName().utf8()); 5271 frame_->uniqueName().utf8());
5313 if (iter != parent->history_subframe_unique_names_.end()) { 5272 if (iter != parent->history_subframe_unique_names_.end()) {
5314 bool history_item_is_about_blank = iter->second; 5273 bool history_item_is_about_blank = iter->second;
5315 should_ask_browser = 5274 should_ask_browser =
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
5824 if (GetContentClient()->renderer()->AllowPopup()) 5783 if (GetContentClient()->renderer()->AllowPopup())
5825 params.user_gesture = true; 5784 params.user_gesture = true;
5826 5785
5827 if (policy == blink::WebNavigationPolicyNewBackgroundTab || 5786 if (policy == blink::WebNavigationPolicyNewBackgroundTab ||
5828 policy == blink::WebNavigationPolicyNewForegroundTab || 5787 policy == blink::WebNavigationPolicyNewForegroundTab ||
5829 policy == blink::WebNavigationPolicyNewWindow || 5788 policy == blink::WebNavigationPolicyNewWindow ||
5830 policy == blink::WebNavigationPolicyNewPopup) { 5789 policy == blink::WebNavigationPolicyNewPopup) {
5831 WebUserGestureIndicator::consumeUserGesture(); 5790 WebUserGestureIndicator::consumeUserGesture();
5832 } 5791 }
5833 5792
5834 if (is_history_navigation_in_new_child) { 5793 if (is_history_navigation_in_new_child)
5835 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
5836 params.is_history_navigation_in_new_child = true; 5794 params.is_history_navigation_in_new_child = true;
5837 }
5838 5795
5839 Send(new FrameHostMsg_OpenURL(routing_id_, params)); 5796 Send(new FrameHostMsg_OpenURL(routing_id_, params));
5840 } 5797 }
5841 5798
5842 void RenderFrameImpl::NavigateInternal( 5799 void RenderFrameImpl::NavigateInternal(
5843 const CommonNavigationParams& common_params, 5800 const CommonNavigationParams& common_params,
5844 const StartNavigationParams& start_params, 5801 const StartNavigationParams& start_params,
5845 const RequestNavigationParams& request_params, 5802 const RequestNavigationParams& request_params,
5846 std::unique_ptr<StreamOverrideParameters> stream_params) { 5803 std::unique_ptr<StreamOverrideParameters> stream_params) {
5847 bool browser_side_navigation = IsBrowserSideNavigationEnabled(); 5804 bool browser_side_navigation = IsBrowserSideNavigationEnabled();
5848 5805
5849 // Lower bound for browser initiated navigation start time. 5806 // Lower bound for browser initiated navigation start time.
5850 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); 5807 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now();
5851 bool is_reload = IsReload(common_params.navigation_type); 5808 bool is_reload = IsReload(common_params.navigation_type);
5852 bool is_history_navigation = request_params.page_state.IsValid(); 5809 bool is_history_navigation = request_params.page_state.IsValid();
5853 WebCachePolicy cache_policy = WebCachePolicy::UseProtocolCachePolicy; 5810 WebCachePolicy cache_policy = WebCachePolicy::UseProtocolCachePolicy;
5854 RenderFrameImpl::PrepareRenderViewForNavigation( 5811 RenderFrameImpl::PrepareRenderViewForNavigation(
5855 common_params.url, request_params); 5812 common_params.url, request_params);
5856 5813
5857 GetContentClient()->SetActiveURL(common_params.url); 5814 GetContentClient()->SetActiveURL(common_params.url);
5858 5815
5859 // If this frame isn't in the same process as the main frame, it may naively 5816 // If this frame isn't in the same process as the main frame, it may naively
5860 // assume that this is the first navigation in the iframe, but this may not 5817 // assume that this is the first navigation in the iframe, but this may not
5861 // actually be the case. Inform the frame's state machine if this frame has 5818 // actually be the case. Inform the frame's state machine if this frame has
5862 // already committed other loads. 5819 // already committed other loads.
5863 if (request_params.has_committed_real_load && frame_->parent()) 5820 if (request_params.has_committed_real_load && frame_->parent())
5864 frame_->setCommittedFirstRealLoad(); 5821 frame_->setCommittedFirstRealLoad();
5865 5822
5866 bool no_current_entry = 5823 if (is_reload && current_history_item_.isNull()) {
5867 SiteIsolationPolicy::UseSubframeNavigationEntries()
5868 ? current_history_item_.isNull()
5869 : !render_view_->history_controller()->GetCurrentEntry();
5870 if (is_reload && no_current_entry) {
5871 // We cannot reload if we do not have any history state. This happens, for 5824 // We cannot reload if we do not have any history state. This happens, for
5872 // example, when recovering from a crash. 5825 // example, when recovering from a crash.
5873 is_reload = false; 5826 is_reload = false;
5874 cache_policy = WebCachePolicy::ValidatingCacheData; 5827 cache_policy = WebCachePolicy::ValidatingCacheData;
5875 } 5828 }
5876 5829
5877 // If the navigation is for "view source", the WebLocalFrame needs to be put 5830 // If the navigation is for "view source", the WebLocalFrame needs to be put
5878 // in a special mode. 5831 // in a special mode.
5879 if (request_params.is_view_source) 5832 if (request_params.is_view_source)
5880 frame_->enableViewSourceMode(true); 5833 frame_->enableViewSourceMode(true);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
5942 } 5895 }
5943 should_load_request = true; 5896 should_load_request = true;
5944 } else if (is_history_navigation) { 5897 } else if (is_history_navigation) {
5945 // We must know the nav entry ID of the page we are navigating back to, 5898 // We must know the nav entry ID of the page we are navigating back to,
5946 // which should be the case because history navigations are routed via the 5899 // which should be the case because history navigations are routed via the
5947 // browser. 5900 // browser.
5948 DCHECK_NE(0, request_params.nav_entry_id); 5901 DCHECK_NE(0, request_params.nav_entry_id);
5949 std::unique_ptr<HistoryEntry> entry = 5902 std::unique_ptr<HistoryEntry> entry =
5950 PageStateToHistoryEntry(request_params.page_state); 5903 PageStateToHistoryEntry(request_params.page_state);
5951 if (entry) { 5904 if (entry) {
5952 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) { 5905 // The browser process sends a single WebHistoryItem for this frame.
5953 // By default, tell the HistoryController to go the deserialized 5906 // TODO(creis): Change PageState to FrameState. In the meantime, we
5954 // HistoryEntry. This only works if all frames are in the same 5907 // store the relevant frame's WebHistoryItem in the root of the
5955 // process. 5908 // PageState.
5956 DCHECK(!frame_->parent()); 5909 item_for_history_navigation = entry->root();
5957 DCHECK(!browser_side_navigation); 5910 history_load_type = request_params.is_same_document_history_load
5958 std::unique_ptr<NavigationParams> navigation_params( 5911 ? blink::WebHistorySameDocumentLoad
5959 new NavigationParams(*pending_navigation_params_.get())); 5912 : blink::WebHistoryDifferentDocumentLoad;
5960 has_history_navigation_in_frame = 5913 load_type = request_params.is_history_navigation_in_new_child
5961 render_view_->history_controller()->GoToEntry( 5914 ? blink::WebFrameLoadType::InitialHistoryLoad
5962 frame_, std::move(entry), std::move(navigation_params), 5915 : blink::WebFrameLoadType::BackForward;
5963 cache_policy); 5916 should_load_request = true;
5964 } else {
5965 // In --site-per-process, the browser process sends a single
5966 // WebHistoryItem destined for this frame.
5967 // TODO(creis): Change PageState to FrameState. In the meantime, we
5968 // store the relevant frame's WebHistoryItem in the root of the
5969 // PageState.
5970 item_for_history_navigation = entry->root();
5971 history_load_type = request_params.is_same_document_history_load
5972 ? blink::WebHistorySameDocumentLoad
5973 : blink::WebHistoryDifferentDocumentLoad;
5974 load_type = request_params.is_history_navigation_in_new_child
5975 ? blink::WebFrameLoadType::InitialHistoryLoad
5976 : blink::WebFrameLoadType::BackForward;
5977 should_load_request = true;
5978 5917
5979 // Keep track of which subframes the browser process has history items 5918 // Keep track of which subframes the browser process has history items
5980 // for during a history navigation. 5919 // for during a history navigation.
5981 history_subframe_unique_names_ = request_params.subframe_unique_names; 5920 history_subframe_unique_names_ = request_params.subframe_unique_names;
5982 5921
5983 if (history_load_type == blink::WebHistorySameDocumentLoad) { 5922 if (history_load_type == blink::WebHistorySameDocumentLoad) {
5984 // If this is marked as a same document load but we haven't committed 5923 // If this is marked as a same document load but we haven't committed
5985 // anything, treat it as a new load. The browser shouldn't let this 5924 // anything, treat it as a new load. The browser shouldn't let this
5986 // happen. 5925 // happen.
5987 if (current_history_item_.isNull()) { 5926 if (current_history_item_.isNull()) {
5927 history_load_type = blink::WebHistoryDifferentDocumentLoad;
5928 NOTREACHED();
5929 } else {
5930 // Additionally, if the |current_history_item_|'s document
5931 // sequence number doesn't match the one sent from the browser, it
5932 // is possible that this renderer has committed a different
5933 // document. In such case, don't use WebHistorySameDocumentLoad.
5934 if (current_history_item_.documentSequenceNumber() !=
5935 item_for_history_navigation.documentSequenceNumber()) {
5988 history_load_type = blink::WebHistoryDifferentDocumentLoad; 5936 history_load_type = blink::WebHistoryDifferentDocumentLoad;
5989 NOTREACHED();
5990 } else {
5991 // Additionally, if the |current_history_item_|'s document
5992 // sequence number doesn't match the one sent from the browser, it
5993 // is possible that this renderer has committed a different
5994 // document. In such case, don't use WebHistorySameDocumentLoad.
5995 if (current_history_item_.documentSequenceNumber() !=
5996 item_for_history_navigation.documentSequenceNumber()) {
5997 history_load_type = blink::WebHistoryDifferentDocumentLoad;
5998 }
5999 } 5937 }
6000 } 5938 }
5939 }
6001 5940
6002 // If this navigation is to a history item for a new child frame, we may 5941 // If this navigation is to a history item for a new child frame, we may
6003 // want to ignore it in some cases. If a Javascript navigation (i.e., 5942 // want to ignore it in some cases. If a Javascript navigation (i.e.,
6004 // client redirect) interrupted it and has either been scheduled, 5943 // client redirect) interrupted it and has either been scheduled,
6005 // started loading, or has committed, we should ignore the history item. 5944 // started loading, or has committed, we should ignore the history item.
6006 bool interrupted_by_client_redirect = 5945 bool interrupted_by_client_redirect =
6007 frame_->isNavigationScheduledWithin(0) || 5946 frame_->isNavigationScheduledWithin(0) ||
6008 frame_->provisionalDataSource() || 5947 frame_->provisionalDataSource() || !current_history_item_.isNull();
6009 !current_history_item_.isNull(); 5948 if (request_params.is_history_navigation_in_new_child &&
6010 if (request_params.is_history_navigation_in_new_child && 5949 interrupted_by_client_redirect) {
6011 interrupted_by_client_redirect) { 5950 should_load_request = false;
6012 should_load_request = false; 5951 has_history_navigation_in_frame = false;
6013 has_history_navigation_in_frame = false; 5952 }
6014 }
6015 5953
6016 // Generate the request for the load from the HistoryItem. 5954 // Generate the request for the load from the HistoryItem.
6017 // PlzNavigate: use the data sent by the browser for the url and the 5955 // PlzNavigate: use the data sent by the browser for the url and the
6018 // HTTP state. The restoration of user state such as scroll position 5956 // HTTP state. The restoration of user state such as scroll position
6019 // will be done based on the history item during the load. 5957 // will be done based on the history item during the load.
6020 if (!browser_side_navigation && should_load_request) { 5958 if (!browser_side_navigation && should_load_request) {
6021 request = frame_->requestFromHistoryItem(item_for_history_navigation, 5959 request = frame_->requestFromHistoryItem(item_for_history_navigation,
6022 cache_policy); 5960 cache_policy);
6023 }
6024 } 5961 }
6025 } 5962 }
6026 } else { 5963 } else {
6027 // Navigate to the given URL. 5964 // Navigate to the given URL.
6028 if (!start_params.extra_headers.empty() && !browser_side_navigation) { 5965 if (!start_params.extra_headers.empty() && !browser_side_navigation) {
6029 for (net::HttpUtil::HeadersIterator i(start_params.extra_headers.begin(), 5966 for (net::HttpUtil::HeadersIterator i(start_params.extra_headers.begin(),
6030 start_params.extra_headers.end(), 5967 start_params.extra_headers.end(),
6031 "\n"); 5968 "\n");
6032 i.GetNext();) { 5969 i.GetNext();) {
6033 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 5970 request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
6074 history_load_type, is_client_redirect); 6011 history_load_type, is_client_redirect);
6075 6012
6076 if (!weak_this) 6013 if (!weak_this)
6077 return; 6014 return;
6078 } 6015 }
6079 } else { 6016 } else {
6080 // The browser expects the frame to be loading this navigation. Inform it 6017 // The browser expects the frame to be loading this navigation. Inform it
6081 // that the load stopped if needed. 6018 // that the load stopped if needed.
6082 // Note: in the case of history navigations, |should_load_request| will be 6019 // Note: in the case of history navigations, |should_load_request| will be
6083 // false, and the frame may not have been set in a loading state. Do not 6020 // false, and the frame may not have been set in a loading state. Do not
6084 // send a stop message if the HistoryController is loading in this frame 6021 // send a stop message if a history navigation is loading in this frame
6085 // nonetheless. This behavior will go away with subframe navigation 6022 // nonetheless. This behavior will go away with subframe navigation
6086 // entries. 6023 // entries.
6087 if (frame_ && !frame_->isLoading() && !has_history_navigation_in_frame) 6024 if (frame_ && !frame_->isLoading() && !has_history_navigation_in_frame)
6088 Send(new FrameHostMsg_DidStopLoading(routing_id_)); 6025 Send(new FrameHostMsg_DidStopLoading(routing_id_));
6089 } 6026 }
6090 6027
6091 // In case LoadRequest failed before didCreateDataSource was called. 6028 // In case LoadRequest failed before didCreateDataSource was called.
6092 pending_navigation_params_.reset(); 6029 pending_navigation_params_.reset();
6093 } 6030 }
6094 6031
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
6352 // Needed so that history-url-only changes don't become reloads. 6289 // Needed so that history-url-only changes don't become reloads.
6353 params.history_url_for_data_url, replace, load_type, 6290 params.history_url_for_data_url, replace, load_type,
6354 item_for_history_navigation, history_load_type, is_client_redirect); 6291 item_for_history_navigation, history_load_type, is_client_redirect);
6355 } else { 6292 } else {
6356 CHECK(false) << "Invalid URL passed: " 6293 CHECK(false) << "Invalid URL passed: "
6357 << params.url.possibly_invalid_spec(); 6294 << params.url.possibly_invalid_spec();
6358 } 6295 }
6359 } 6296 }
6360 6297
6361 void RenderFrameImpl::SendUpdateState() { 6298 void RenderFrameImpl::SendUpdateState() {
6362 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
6363 if (current_history_item_.isNull()) 6299 if (current_history_item_.isNull())
6364 return; 6300 return;
6365 6301
6366 Send(new FrameHostMsg_UpdateState( 6302 Send(new FrameHostMsg_UpdateState(
6367 routing_id_, SingleHistoryItemToPageState(current_history_item_))); 6303 routing_id_, SingleHistoryItemToPageState(current_history_item_)));
6368 } 6304 }
6369 6305
6370 void RenderFrameImpl::MaybeEnableMojoBindings() { 6306 void RenderFrameImpl::MaybeEnableMojoBindings() {
6371 int enabled_bindings = RenderProcess::current()->GetEnabledBindings(); 6307 int enabled_bindings = RenderProcess::current()->GetEnabledBindings();
6372 // BINDINGS_POLICY_WEB_UI, BINDINGS_POLICY_MOJO and BINDINGS_POLICY_HEADLESS 6308 // BINDINGS_POLICY_WEB_UI, BINDINGS_POLICY_MOJO and BINDINGS_POLICY_HEADLESS
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
6878 // event target. Potentially a Pepper plugin will receive the event. 6814 // event target. Potentially a Pepper plugin will receive the event.
6879 // In order to tell whether a plugin gets the last mouse event and which it 6815 // In order to tell whether a plugin gets the last mouse event and which it
6880 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets 6816 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets
6881 // the event, it will notify us via DidReceiveMouseEvent() and set itself as 6817 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
6882 // |pepper_last_mouse_event_target_|. 6818 // |pepper_last_mouse_event_target_|.
6883 pepper_last_mouse_event_target_ = nullptr; 6819 pepper_last_mouse_event_target_ = nullptr;
6884 #endif 6820 #endif
6885 } 6821 }
6886 6822
6887 } // namespace content 6823 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698