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

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

Issue 1250163002: Fix cross-process location.replace for main frames and subframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and remove some code Created 4 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
« no previous file with comments | « content/common/frame_messages.h ('k') | content/test/test_render_frame_host.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 3702 matching lines...) Expand 10 before | Expand all | Expand 10 after
3713 // Attach |should_replace_current_entry| state to requests so that, should 3713 // Attach |should_replace_current_entry| state to requests so that, should
3714 // this navigation later require a request transfer, all state is preserved 3714 // this navigation later require a request transfer, all state is preserved
3715 // when it is re-created in the new process. 3715 // when it is re-created in the new process.
3716 bool should_replace_current_entry = false; 3716 bool should_replace_current_entry = false;
3717 if (navigation_state->IsContentInitiated()) { 3717 if (navigation_state->IsContentInitiated()) {
3718 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); 3718 should_replace_current_entry = data_source->replacesCurrentHistoryItem();
3719 } else { 3719 } else {
3720 // If the navigation is browser-initiated, the NavigationState contains the 3720 // If the navigation is browser-initiated, the NavigationState contains the
3721 // correct value instead of the WebDataSource. 3721 // correct value instead of the WebDataSource.
3722 // 3722 //
3723 // TODO(davidben): Avoid this awkward duplication of state. See comment on 3723 // TODO(creis): Remove should_replace_current_entry from NavigationState
3724 // NavigationState::should_replace_current_entry(). 3724 // once we verify this is correct, since the WebDataSource should now be
3725 // correct. Currently failing in NewAndAutoSubframe test with CHECK_EQ.
3726 CHECK(
3727 !navigation_state->common_params().should_replace_current_entry ||
3728 data_source->replacesCurrentHistoryItem());
3725 should_replace_current_entry = 3729 should_replace_current_entry =
3726 navigation_state->common_params().should_replace_current_entry; 3730 navigation_state->common_params().should_replace_current_entry;
3727 } 3731 }
3728 3732
3729 int provider_id = kInvalidServiceWorkerProviderId; 3733 int provider_id = kInvalidServiceWorkerProviderId;
3730 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || 3734 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel ||
3731 request.frameType() == blink::WebURLRequest::FrameTypeNested) { 3735 request.frameType() == blink::WebURLRequest::FrameTypeNested) {
3732 // |provisionalDataSource| may be null in some content::ResourceFetcher 3736 // |provisionalDataSource| may be null in some content::ResourceFetcher
3733 // use cases, we don't hook those requests. 3737 // use cases, we don't hook those requests.
3734 if (frame->provisionalDataSource()) { 3738 if (frame->provisionalDataSource()) {
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after
4375 static_cast<NavigationStateImpl*>(document_state->navigation_state()); 4379 static_cast<NavigationStateImpl*>(document_state->navigation_state());
4376 InternalDocumentStateData* internal_data = 4380 InternalDocumentStateData* internal_data =
4377 InternalDocumentStateData::FromDocumentState(document_state); 4381 InternalDocumentStateData::FromDocumentState(document_state);
4378 4382
4379 FrameHostMsg_DidCommitProvisionalLoad_Params params; 4383 FrameHostMsg_DidCommitProvisionalLoad_Params params;
4380 params.http_status_code = response.httpStatusCode(); 4384 params.http_status_code = response.httpStatusCode();
4381 params.url_is_unreachable = ds->hasUnreachableURL(); 4385 params.url_is_unreachable = ds->hasUnreachableURL();
4382 params.is_post = false; 4386 params.is_post = false;
4383 params.intended_as_new_entry = 4387 params.intended_as_new_entry =
4384 navigation_state->request_params().intended_as_new_entry; 4388 navigation_state->request_params().intended_as_new_entry;
4385 params.did_create_new_entry = commit_type == blink::WebStandardCommit; 4389 // We create a new entry for standard commits, as well as location.replace
4390 // navigations that replace the current entry with a different document.
4391 params.did_create_new_entry = commit_type == blink::WebStandardCommit ||
4392 (ds->replacesCurrentHistoryItem() &&
4393 !navigation_state->WasWithinSamePage());
4394 CHECK(!navigation_state->common_params().should_replace_current_entry ||
4395 ds->replacesCurrentHistoryItem());
4396 params.should_replace_current_entry = ds->replacesCurrentHistoryItem();
4386 params.post_id = -1; 4397 params.post_id = -1;
4387 params.page_id = render_view_->page_id_; 4398 params.page_id = render_view_->page_id_;
4388 params.nav_entry_id = navigation_state->request_params().nav_entry_id; 4399 params.nav_entry_id = navigation_state->request_params().nav_entry_id;
4389 // We need to track the RenderViewHost routing_id because of downstream 4400 // We need to track the RenderViewHost routing_id because of downstream
4390 // dependencies (crbug.com/392171 DownloadRequestHandle, SaveFileManager, 4401 // dependencies (crbug.com/392171 DownloadRequestHandle, SaveFileManager,
4391 // ResourceDispatcherHostImpl, MediaStreamUIProxy, 4402 // ResourceDispatcherHostImpl, MediaStreamUIProxy,
4392 // SpeechRecognitionDispatcherHost and possibly others). They look up the view 4403 // SpeechRecognitionDispatcherHost and possibly others). They look up the view
4393 // based on the ID stored in the resource requests. Once those dependencies 4404 // based on the ID stored in the resource requests. Once those dependencies
4394 // are unwound or moved to RenderFrameHost (crbug.com/304341) we can move the 4405 // are unwound or moved to RenderFrameHost (crbug.com/304341) we can move the
4395 // client to be based on the routing_id of the RenderFrameHost. 4406 // client to be based on the routing_id of the RenderFrameHost.
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
4544 // This message needs to be sent before any of allowScripts(), 4555 // This message needs to be sent before any of allowScripts(),
4545 // allowImages(), allowPlugins() is called for the new page, so that when 4556 // allowImages(), allowPlugins() is called for the new page, so that when
4546 // these functions send a ViewHostMsg_ContentBlocked message, it arrives 4557 // these functions send a ViewHostMsg_ContentBlocked message, it arrives
4547 // after the FrameHostMsg_DidCommitProvisionalLoad message. 4558 // after the FrameHostMsg_DidCommitProvisionalLoad message.
4548 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); 4559 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params));
4549 } else { 4560 } else {
4550 // Subframe navigation: the type depends on whether this navigation 4561 // Subframe navigation: the type depends on whether this navigation
4551 // generated a new session history entry. When they do generate a session 4562 // generated a new session history entry. When they do generate a session
4552 // history entry, it means the user initiated the navigation and we should 4563 // history entry, it means the user initiated the navigation and we should
4553 // mark it as such. 4564 // mark it as such.
4554 if (commit_type == blink::WebStandardCommit) 4565 if (params.did_create_new_entry)
4555 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; 4566 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME;
4556 else 4567 else
4557 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; 4568 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME;
4558 4569
4559 DCHECK(!navigation_state->request_params().should_clear_history_list); 4570 DCHECK(!navigation_state->request_params().should_clear_history_list);
4560 params.history_list_was_cleared = false; 4571 params.history_list_was_cleared = false;
4561 params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; 4572 params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT;
4562 4573
4563 // Don't send this message while the subframe is swapped out. 4574 // Don't send this message while the subframe is swapped out.
4564 if (!is_swapped_out()) 4575 if (!is_swapped_out())
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
4965 bool is_history_navigation_in_new_child) { 4976 bool is_history_navigation_in_new_child) {
4966 FrameHostMsg_OpenURL_Params params; 4977 FrameHostMsg_OpenURL_Params params;
4967 params.url = url; 4978 params.url = url;
4968 params.referrer = referrer; 4979 params.referrer = referrer;
4969 params.disposition = RenderViewImpl::NavigationPolicyToDisposition(policy); 4980 params.disposition = RenderViewImpl::NavigationPolicyToDisposition(policy);
4970 4981
4971 if (IsBrowserInitiated(pending_navigation_params_.get())) { 4982 if (IsBrowserInitiated(pending_navigation_params_.get())) {
4972 // This is necessary to preserve the should_replace_current_entry value on 4983 // This is necessary to preserve the should_replace_current_entry value on
4973 // cross-process redirects, in the event it was set by a previous process. 4984 // cross-process redirects, in the event it was set by a previous process.
4974 // 4985 //
4975 // TODO(davidben): Avoid this awkward duplication of state. See comment on 4986 // TODO(creis): Remove should_replace_current_entry from NavigationState
4976 // NavigationState::should_replace_current_entry(). 4987 // once we verify this is correct, since the WebDataSource should now be
4988 // correct.
4989 WebDataSource* ds = frame_->provisionalDataSource();
4990 if (ds) {
4991 DocumentState* document_state = DocumentState::FromDataSource(ds);
4992 NavigationStateImpl* navigation_state =
4993 static_cast<NavigationStateImpl*>(document_state->navigation_state());
4994 CHECK_EQ(navigation_state->common_params().should_replace_current_entry,
4995 ds->replacesCurrentHistoryItem());
4996 }
4977 params.should_replace_current_entry = 4997 params.should_replace_current_entry =
4978 pending_navigation_params_->common_params.should_replace_current_entry; 4998 pending_navigation_params_->common_params.should_replace_current_entry;
4979 } else { 4999 } else {
4980 params.should_replace_current_entry = 5000 params.should_replace_current_entry =
4981 should_replace_current_entry && render_view_->history_list_length_; 5001 should_replace_current_entry && render_view_->history_list_length_;
4982 } 5002 }
4983 params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture(); 5003 params.user_gesture = WebUserGestureIndicator::isProcessingUserGesture();
4984 if (GetContentClient()->renderer()->AllowPopup()) 5004 if (GetContentClient()->renderer()->AllowPopup())
4985 params.user_gesture = true; 5005 params.user_gesture = true;
4986 5006
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
5053 base::TimeTicks(); 5073 base::TimeTicks();
5054 5074
5055 // Unless the load is a WebFrameLoadType::Standard, this should remain 5075 // Unless the load is a WebFrameLoadType::Standard, this should remain
5056 // uninitialized. It will be updated when the load type is determined to be 5076 // uninitialized. It will be updated when the load type is determined to be
5057 // Standard, or after the previous document's unload handler has been 5077 // Standard, or after the previous document's unload handler has been
5058 // triggered. This occurs in UpdateNavigationState. 5078 // triggered. This occurs in UpdateNavigationState.
5059 // TODO(csharrison) See if we can always use the browser timestamp. 5079 // TODO(csharrison) See if we can always use the browser timestamp.
5060 pending_navigation_params_->common_params.navigation_start = 5080 pending_navigation_params_->common_params.navigation_start =
5061 base::TimeTicks(); 5081 base::TimeTicks();
5062 5082
5063 // Create parameters for a standard navigation. 5083 // Create parameters for a standard navigation, indicating whether it should
5064 blink::WebFrameLoadType load_type = blink::WebFrameLoadType::Standard; 5084 // replace the current NavigationEntry.
5085 blink::WebFrameLoadType load_type =
5086 common_params.should_replace_current_entry ?
5087 blink::WebFrameLoadType::ReplaceCurrentItem :
5088 blink::WebFrameLoadType::Standard;
5065 blink::WebHistoryLoadType history_load_type = 5089 blink::WebHistoryLoadType history_load_type =
5066 blink::WebHistoryDifferentDocumentLoad; 5090 blink::WebHistoryDifferentDocumentLoad;
5067 bool should_load_request = false; 5091 bool should_load_request = false;
5068 WebHistoryItem item_for_history_navigation; 5092 WebHistoryItem item_for_history_navigation;
5069 WebURLRequest request = 5093 WebURLRequest request =
5070 CreateURLRequestForNavigation(common_params, std::move(stream_params), 5094 CreateURLRequestForNavigation(common_params, std::move(stream_params),
5071 frame_->isViewSourceModeEnabled()); 5095 frame_->isViewSourceModeEnabled());
5072 #if defined(OS_ANDROID) 5096 #if defined(OS_ANDROID)
5073 request.setHasUserGesture(start_params.has_user_gesture); 5097 request.setHasUserGesture(start_params.has_user_gesture);
5074 #endif 5098 #endif
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
5772 media::ConvertToSwitchOutputDeviceCB(web_callbacks); 5796 media::ConvertToSwitchOutputDeviceCB(web_callbacks);
5773 scoped_refptr<media::AudioOutputDevice> device = 5797 scoped_refptr<media::AudioOutputDevice> device =
5774 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(), 5798 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(),
5775 security_origin); 5799 security_origin);
5776 media::OutputDeviceStatus status = device->GetDeviceStatus(); 5800 media::OutputDeviceStatus status = device->GetDeviceStatus();
5777 device->Stop(); 5801 device->Stop();
5778 callback.Run(status); 5802 callback.Run(status);
5779 } 5803 }
5780 5804
5781 } // namespace content 5805 } // namespace content
OLDNEW
« no previous file with comments | « content/common/frame_messages.h ('k') | content/test/test_render_frame_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698