OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 } | 350 } |
351 | 351 |
352 bool IsBrowserInitiated(NavigationParams* pending) { | 352 bool IsBrowserInitiated(NavigationParams* pending) { |
353 // A navigation resulting from loading a javascript URL should not be treated | 353 // A navigation resulting from loading a javascript URL should not be treated |
354 // as a browser initiated event. Instead, we want it to look as if the page | 354 // as a browser initiated event. Instead, we want it to look as if the page |
355 // initiated any load resulting from JS execution. | 355 // initiated any load resulting from JS execution. |
356 return pending && | 356 return pending && |
357 !pending->common_params.url.SchemeIs(url::kJavaScriptScheme); | 357 !pending->common_params.url.SchemeIs(url::kJavaScriptScheme); |
358 } | 358 } |
359 | 359 |
| 360 bool IsHistoryNavigation(const PageState& page_state, |
| 361 const ExplodedFrameState& frame_state) { |
| 362 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
| 363 return frame_state.item_sequence_number != 0; |
| 364 |
| 365 return page_state.IsValid(); |
| 366 } |
| 367 |
360 NOINLINE void CrashIntentionally() { | 368 NOINLINE void CrashIntentionally() { |
361 // NOTE(shess): Crash directly rather than using NOTREACHED() so | 369 // NOTE(shess): Crash directly rather than using NOTREACHED() so |
362 // that the signature is easier to triage in crash reports. | 370 // that the signature is easier to triage in crash reports. |
363 // | 371 // |
364 // Linker's ICF feature may merge this function with other functions with the | 372 // Linker's ICF feature may merge this function with other functions with the |
365 // same definition and it may confuse the crash report processing system. | 373 // same definition and it may confuse the crash report processing system. |
366 static int static_variable_to_make_this_function_unique = 0; | 374 static int static_variable_to_make_this_function_unique = 0; |
367 base::debug::Alias(&static_variable_to_make_this_function_unique); | 375 base::debug::Alias(&static_variable_to_make_this_function_unique); |
368 | 376 |
369 volatile int* zero = nullptr; | 377 volatile int* zero = nullptr; |
(...skipping 3870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4240 if (entry) { | 4248 if (entry) { |
4241 params.page_state = HistoryEntryToPageState(entry); | 4249 params.page_state = HistoryEntryToPageState(entry); |
4242 post_id = ExtractPostId(entry->root()); | 4250 post_id = ExtractPostId(entry->root()); |
4243 } else { | 4251 } else { |
4244 params.page_state = PageState::CreateFromURL(request.url()); | 4252 params.page_state = PageState::CreateFromURL(request.url()); |
4245 } | 4253 } |
4246 } else { | 4254 } else { |
4247 // In --site-per-process, just send a single HistoryItem for this frame, | 4255 // In --site-per-process, just send a single HistoryItem for this frame, |
4248 // rather than the whole tree. It will be stored in the corresponding | 4256 // rather than the whole tree. It will be stored in the corresponding |
4249 // FrameNavigationEntry. | 4257 // FrameNavigationEntry. |
4250 params.page_state = SingleHistoryItemToPageState(item); | 4258 params.frame_state = HistoryItemToFrameState(item); |
4251 post_id = ExtractPostId(item); | 4259 post_id = ExtractPostId(item); |
4252 } | 4260 } |
4253 params.frame_unique_name = item.target().utf8(); | 4261 params.frame_unique_name = item.target().utf8(); |
4254 params.item_sequence_number = item.itemSequenceNumber(); | 4262 params.item_sequence_number = item.itemSequenceNumber(); |
4255 params.document_sequence_number = item.documentSequenceNumber(); | 4263 params.document_sequence_number = item.documentSequenceNumber(); |
4256 | 4264 |
4257 if (!frame->parent()) { | 4265 if (!frame->parent()) { |
4258 // Top-level navigation. | 4266 // Top-level navigation. |
4259 | 4267 |
4260 // Reset the zoom limits in case a plugin had changed them previously. This | 4268 // Reset the zoom limits in case a plugin had changed them previously. This |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4419 NavigateInternal(common_params, StartNavigationParams(), request_params, | 4427 NavigateInternal(common_params, StartNavigationParams(), request_params, |
4420 stream_override.Pass()); | 4428 stream_override.Pass()); |
4421 } | 4429 } |
4422 | 4430 |
4423 void RenderFrameImpl::OnFailedNavigation( | 4431 void RenderFrameImpl::OnFailedNavigation( |
4424 const CommonNavigationParams& common_params, | 4432 const CommonNavigationParams& common_params, |
4425 const RequestNavigationParams& request_params, | 4433 const RequestNavigationParams& request_params, |
4426 bool has_stale_copy_in_cache, | 4434 bool has_stale_copy_in_cache, |
4427 int error_code) { | 4435 int error_code) { |
4428 bool is_reload = IsReload(common_params.navigation_type); | 4436 bool is_reload = IsReload(common_params.navigation_type); |
4429 bool is_history_navigation = request_params.page_state.IsValid(); | 4437 bool is_history_navigation = IsHistoryNavigation(request_params.page_state, |
| 4438 request_params.frame_state); |
4430 WebURLRequest::CachePolicy cache_policy = | 4439 WebURLRequest::CachePolicy cache_policy = |
4431 WebURLRequest::UseProtocolCachePolicy; | 4440 WebURLRequest::UseProtocolCachePolicy; |
4432 RenderFrameImpl::PrepareRenderViewForNavigation( | 4441 RenderFrameImpl::PrepareRenderViewForNavigation( |
4433 common_params.url, request_params, &is_reload, &cache_policy); | 4442 common_params.url, request_params, &is_reload, &cache_policy); |
4434 | 4443 |
4435 GetContentClient()->SetActiveURL(common_params.url); | 4444 GetContentClient()->SetActiveURL(common_params.url); |
4436 | 4445 |
4437 pending_navigation_params_.reset(new NavigationParams( | 4446 pending_navigation_params_.reset(new NavigationParams( |
4438 common_params, StartNavigationParams(), request_params)); | 4447 common_params, StartNavigationParams(), request_params)); |
4439 | 4448 |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4749 const StartNavigationParams& start_params, | 4758 const StartNavigationParams& start_params, |
4750 const RequestNavigationParams& request_params, | 4759 const RequestNavigationParams& request_params, |
4751 scoped_ptr<StreamOverrideParameters> stream_params) { | 4760 scoped_ptr<StreamOverrideParameters> stream_params) { |
4752 bool browser_side_navigation = | 4761 bool browser_side_navigation = |
4753 base::CommandLine::ForCurrentProcess()->HasSwitch( | 4762 base::CommandLine::ForCurrentProcess()->HasSwitch( |
4754 switches::kEnableBrowserSideNavigation); | 4763 switches::kEnableBrowserSideNavigation); |
4755 | 4764 |
4756 // Lower bound for browser initiated navigation start time. | 4765 // Lower bound for browser initiated navigation start time. |
4757 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); | 4766 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); |
4758 bool is_reload = IsReload(common_params.navigation_type); | 4767 bool is_reload = IsReload(common_params.navigation_type); |
4759 bool is_history_navigation = request_params.page_state.IsValid(); | 4768 bool is_history_navigation = IsHistoryNavigation(request_params.page_state, |
| 4769 request_params.frame_state); |
4760 WebURLRequest::CachePolicy cache_policy = | 4770 WebURLRequest::CachePolicy cache_policy = |
4761 WebURLRequest::UseProtocolCachePolicy; | 4771 WebURLRequest::UseProtocolCachePolicy; |
4762 RenderFrameImpl::PrepareRenderViewForNavigation( | 4772 RenderFrameImpl::PrepareRenderViewForNavigation( |
4763 common_params.url, request_params, &is_reload, &cache_policy); | 4773 common_params.url, request_params, &is_reload, &cache_policy); |
4764 | 4774 |
4765 GetContentClient()->SetActiveURL(common_params.url); | 4775 GetContentClient()->SetActiveURL(common_params.url); |
4766 | 4776 |
4767 // If this frame isn't in the same process as the main frame, it may naively | 4777 // If this frame isn't in the same process as the main frame, it may naively |
4768 // assume that this is the first navigation in the iframe, but this may not | 4778 // assume that this is the first navigation in the iframe, but this may not |
4769 // actually be the case. Inform the frame's state machine if this frame has | 4779 // actually be the case. Inform the frame's state machine if this frame has |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4835 request = frame_->requestForReload(load_type, override_url); | 4845 request = frame_->requestForReload(load_type, override_url); |
4836 } | 4846 } |
4837 should_load_request = true; | 4847 should_load_request = true; |
4838 } else if (is_history_navigation) { | 4848 } else if (is_history_navigation) { |
4839 // We must know the page ID of the page we are navigating back to. | 4849 // We must know the page ID of the page we are navigating back to. |
4840 DCHECK_NE(request_params.page_id, -1); | 4850 DCHECK_NE(request_params.page_id, -1); |
4841 // We must know the nav entry ID of the page we are navigating back to, | 4851 // We must know the nav entry ID of the page we are navigating back to, |
4842 // which should be the case because history navigations are routed via the | 4852 // which should be the case because history navigations are routed via the |
4843 // browser. | 4853 // browser. |
4844 DCHECK_NE(0, request_params.nav_entry_id); | 4854 DCHECK_NE(0, request_params.nav_entry_id); |
4845 scoped_ptr<HistoryEntry> entry = | |
4846 PageStateToHistoryEntry(request_params.page_state); | |
4847 if (entry) { | |
4848 // Ensure we didn't save the swapped out URL in UpdateState, since the | |
4849 // browser should never be telling us to navigate to swappedout://. | |
4850 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); | |
4851 | 4855 |
4852 if (!browser_side_navigation) { | 4856 scoped_ptr<NavigationParams> navigation_params( |
4853 scoped_ptr<NavigationParams> navigation_params( | 4857 new NavigationParams(*pending_navigation_params_.get())); |
4854 new NavigationParams(*pending_navigation_params_.get())); | 4858 |
4855 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) { | 4859 if (SiteIsolationPolicy::UseSubframeNavigationEntries() && |
| 4860 !browser_side_navigation) { |
| 4861 // In --site-per-process, the browser process sends a WebHistoryItem |
| 4862 // destined for this frame. |
| 4863 SetPendingNavigationParams(navigation_params.Pass()); |
| 4864 blink::WebHistoryItem history_item = |
| 4865 FrameStateToHistoryItem(request_params.frame_state); |
| 4866 blink::WebHistoryLoadType load_type = |
| 4867 request_params.is_same_document_history_load |
| 4868 ? blink::WebHistorySameDocumentLoad |
| 4869 : blink::WebHistoryDifferentDocumentLoad; |
| 4870 |
| 4871 // Navigate the frame directly. |
| 4872 // TODO(creis): Use InitialHistoryLoad rather than BackForward for a |
| 4873 // history navigation in a newly created subframe. |
| 4874 WebURLRequest request = |
| 4875 frame_->requestFromHistoryItem(history_item, cache_policy); |
| 4876 frame_->load(request, blink::WebFrameLoadType::BackForward, history_item, |
| 4877 load_type); |
| 4878 } else { |
| 4879 scoped_ptr<HistoryEntry> entry = |
| 4880 PageStateToHistoryEntry(request_params.page_state); |
| 4881 if (entry) { |
| 4882 // Ensure we didn't save the swapped out URL in UpdateState, since the |
| 4883 // browser should never be telling us to navigate to swappedout://. |
| 4884 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); |
| 4885 |
| 4886 if (!browser_side_navigation) { |
4856 // By default, tell the HistoryController to go the deserialized | 4887 // By default, tell the HistoryController to go the deserialized |
4857 // HistoryEntry. This only works if all frames are in the same | 4888 // HistoryEntry. This only works if all frames are in the same |
4858 // process. | 4889 // process. |
4859 DCHECK(!frame_->parent()); | 4890 DCHECK(!frame_->parent()); |
4860 render_view_->history_controller()->GoToEntry( | 4891 render_view_->history_controller()->GoToEntry( |
4861 frame_, entry.Pass(), navigation_params.Pass(), cache_policy); | 4892 frame_, entry.Pass(), navigation_params.Pass(), cache_policy); |
4862 } else { | 4893 } else { |
4863 // In --site-per-process, the browser process sends a single | 4894 // TODO(clamy): this should be set to the HistoryItem sent by the |
4864 // WebHistoryItem destined for this frame. | 4895 // browser once the HistoryController has moved to the browser. |
4865 // TODO(creis): Change PageState to FrameState. In the meantime, we | 4896 // TODO(clamy): distinguish between different document and same |
4866 // store the relevant frame's WebHistoryItem in the root of the | 4897 // document |
4867 // PageState. | 4898 // loads. |
4868 SetPendingNavigationParams(navigation_params.Pass()); | 4899 // TODO(clamy): update this for subframes history loads. |
4869 blink::WebHistoryItem history_item = entry->root(); | 4900 item_for_history_navigation = |
4870 blink::WebHistoryLoadType load_type = | 4901 entry->GetHistoryNodeForFrame(this)->item(); |
4871 request_params.is_same_document_history_load | 4902 load_type = blink::WebFrameLoadType::BackForward; |
4872 ? blink::WebHistorySameDocumentLoad | 4903 should_load_request = true; |
4873 : blink::WebHistoryDifferentDocumentLoad; | |
4874 | |
4875 // Navigate the frame directly. | |
4876 // TODO(creis): Use InitialHistoryLoad rather than BackForward for a | |
4877 // history navigation in a newly created subframe. | |
4878 WebURLRequest request = | |
4879 frame_->requestFromHistoryItem(history_item, cache_policy); | |
4880 frame_->load(request, blink::WebFrameLoadType::BackForward, | |
4881 history_item, load_type); | |
4882 } | 4904 } |
4883 } else { | |
4884 // TODO(clamy): this should be set to the HistoryItem sent by the | |
4885 // browser once the HistoryController has moved to the browser. | |
4886 // TODO(clamy): distinguish between different document and same document | |
4887 // loads. | |
4888 // TODO(clamy): update this for subframes history loads. | |
4889 item_for_history_navigation = | |
4890 entry->GetHistoryNodeForFrame(this)->item(); | |
4891 load_type = blink::WebFrameLoadType::BackForward; | |
4892 should_load_request = true; | |
4893 } | 4905 } |
4894 } | 4906 } |
4895 } else { | 4907 } else { |
4896 // Navigate to the given URL. | 4908 // Navigate to the given URL. |
4897 if (!start_params.extra_headers.empty() && !browser_side_navigation) { | 4909 if (!start_params.extra_headers.empty() && !browser_side_navigation) { |
4898 for (net::HttpUtil::HeadersIterator i(start_params.extra_headers.begin(), | 4910 for (net::HttpUtil::HeadersIterator i(start_params.extra_headers.begin(), |
4899 start_params.extra_headers.end(), | 4911 start_params.extra_headers.end(), |
4900 "\n"); | 4912 "\n"); |
4901 i.GetNext();) { | 4913 i.GetNext();) { |
4902 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), | 4914 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5197 << params.url.possibly_invalid_spec(); | 5209 << params.url.possibly_invalid_spec(); |
5198 } | 5210 } |
5199 } | 5211 } |
5200 | 5212 |
5201 void RenderFrameImpl::SendUpdateState() { | 5213 void RenderFrameImpl::SendUpdateState() { |
5202 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries()); | 5214 DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries()); |
5203 if (current_history_item_.isNull()) | 5215 if (current_history_item_.isNull()) |
5204 return; | 5216 return; |
5205 | 5217 |
5206 Send(new FrameHostMsg_UpdateState( | 5218 Send(new FrameHostMsg_UpdateState( |
5207 routing_id_, SingleHistoryItemToPageState(current_history_item_))); | 5219 routing_id_, HistoryItemToFrameState(current_history_item_))); |
5208 } | 5220 } |
5209 | 5221 |
5210 void RenderFrameImpl::SendFailedProvisionalLoad( | 5222 void RenderFrameImpl::SendFailedProvisionalLoad( |
5211 const blink::WebURLRequest& request, | 5223 const blink::WebURLRequest& request, |
5212 const blink::WebURLError& error, | 5224 const blink::WebURLError& error, |
5213 blink::WebLocalFrame* frame) { | 5225 blink::WebLocalFrame* frame) { |
5214 bool show_repost_interstitial = | 5226 bool show_repost_interstitial = |
5215 (error.reason == net::ERR_CACHE_MISS && | 5227 (error.reason == net::ERR_CACHE_MISS && |
5216 base::EqualsASCII(base::StringPiece16(request.httpMethod()), "POST")); | 5228 base::EqualsASCII(base::StringPiece16(request.httpMethod()), "POST")); |
5217 | 5229 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5283 // from the network. | 5295 // from the network. |
5284 // | 5296 // |
5285 // TODO(davidben): Remove this in favor of passing a cache policy to the | 5297 // TODO(davidben): Remove this in favor of passing a cache policy to the |
5286 // loadHistoryItem call in OnNavigate. That requires not overloading | 5298 // loadHistoryItem call in OnNavigate. That requires not overloading |
5287 // UseProtocolCachePolicy to mean both "normal load" and "determine cache | 5299 // UseProtocolCachePolicy to mean both "normal load" and "determine cache |
5288 // policy based on load type, etc". | 5300 // policy based on load type, etc". |
5289 internal_data->set_cache_policy_override( | 5301 internal_data->set_cache_policy_override( |
5290 WebURLRequest::UseProtocolCachePolicy); | 5302 WebURLRequest::UseProtocolCachePolicy); |
5291 } | 5303 } |
5292 | 5304 |
5293 if (IsReload(pending_navigation_params_->common_params.navigation_type)) | 5305 if (IsReload(pending_navigation_params_->common_params.navigation_type)) { |
5294 document_state->set_load_type(DocumentState::RELOAD); | 5306 document_state->set_load_type(DocumentState::RELOAD); |
5295 else if (pending_navigation_params_->request_params.page_state.IsValid()) | 5307 } else if (IsHistoryNavigation( |
| 5308 pending_navigation_params_->request_params.page_state, |
| 5309 pending_navigation_params_->request_params.frame_state)) { |
5296 document_state->set_load_type(DocumentState::HISTORY_LOAD); | 5310 document_state->set_load_type(DocumentState::HISTORY_LOAD); |
5297 else | 5311 } else { |
5298 document_state->set_load_type(DocumentState::NORMAL_LOAD); | 5312 document_state->set_load_type(DocumentState::NORMAL_LOAD); |
| 5313 } |
5299 | 5314 |
5300 internal_data->set_is_overriding_user_agent( | 5315 internal_data->set_is_overriding_user_agent( |
5301 pending_navigation_params_->request_params.is_overriding_user_agent); | 5316 pending_navigation_params_->request_params.is_overriding_user_agent); |
5302 internal_data->set_must_reset_scroll_and_scale_state( | 5317 internal_data->set_must_reset_scroll_and_scale_state( |
5303 pending_navigation_params_->common_params.navigation_type == | 5318 pending_navigation_params_->common_params.navigation_type == |
5304 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); | 5319 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); |
5305 document_state->set_can_load_local_resources( | 5320 document_state->set_can_load_local_resources( |
5306 pending_navigation_params_->request_params.can_load_local_resources); | 5321 pending_navigation_params_->request_params.can_load_local_resources); |
5307 } | 5322 } |
5308 | 5323 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5492 media::ConvertToSwitchOutputDeviceCB(web_callbacks); | 5507 media::ConvertToSwitchOutputDeviceCB(web_callbacks); |
5493 scoped_refptr<media::AudioOutputDevice> device = | 5508 scoped_refptr<media::AudioOutputDevice> device = |
5494 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(), | 5509 AudioDeviceFactory::NewOutputDevice(routing_id_, 0, sink_id.utf8(), |
5495 security_origin); | 5510 security_origin); |
5496 media::OutputDeviceStatus status = device->GetDeviceStatus(); | 5511 media::OutputDeviceStatus status = device->GetDeviceStatus(); |
5497 device->Stop(); | 5512 device->Stop(); |
5498 callback.Run(status); | 5513 callback.Run(status); |
5499 } | 5514 } |
5500 | 5515 |
5501 } // namespace content | 5516 } // namespace content |
OLD | NEW |