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/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/debug/alias.h" | 11 #include "base/debug/alias.h" |
12 #include "base/debug/dump_without_crashing.h" | 12 #include "base/debug/dump_without_crashing.h" |
13 #include "base/i18n/char_iterator.h" | 13 #include "base/i18n/char_iterator.h" |
14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 15 #include "base/process/kill.h" |
| 16 #include "base/process/process.h" |
15 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
16 #include "base/time/time.h" | 18 #include "base/time/time.h" |
17 #include "content/child/appcache/appcache_dispatcher.h" | 19 #include "content/child/appcache/appcache_dispatcher.h" |
18 #include "content/child/plugin_messages.h" | 20 #include "content/child/plugin_messages.h" |
19 #include "content/child/quota_dispatcher.h" | 21 #include "content/child/quota_dispatcher.h" |
20 #include "content/child/request_extra_data.h" | 22 #include "content/child/request_extra_data.h" |
21 #include "content/child/service_worker/web_service_worker_provider_impl.h" | 23 #include "content/child/service_worker/web_service_worker_provider_impl.h" |
22 #include "content/common/frame_messages.h" | 24 #include "content/common/frame_messages.h" |
23 #include "content/common/socket_stream_handle_data.h" | 25 #include "content/common/socket_stream_handle_data.h" |
24 #include "content/common/swapped_out_messages.h" | 26 #include "content/common/swapped_out_messages.h" |
(...skipping 15 matching lines...) Expand all Loading... |
40 #include "content/renderer/child_frame_compositing_helper.h" | 42 #include "content/renderer/child_frame_compositing_helper.h" |
41 #include "content/renderer/context_menu_params_builder.h" | 43 #include "content/renderer/context_menu_params_builder.h" |
42 #include "content/renderer/internal_document_state_data.h" | 44 #include "content/renderer/internal_document_state_data.h" |
43 #include "content/renderer/npapi/plugin_channel_host.h" | 45 #include "content/renderer/npapi/plugin_channel_host.h" |
44 #include "content/renderer/render_thread_impl.h" | 46 #include "content/renderer/render_thread_impl.h" |
45 #include "content/renderer/render_view_impl.h" | 47 #include "content/renderer/render_view_impl.h" |
46 #include "content/renderer/render_widget_fullscreen_pepper.h" | 48 #include "content/renderer/render_widget_fullscreen_pepper.h" |
47 #include "content/renderer/renderer_webapplicationcachehost_impl.h" | 49 #include "content/renderer/renderer_webapplicationcachehost_impl.h" |
48 #include "content/renderer/shared_worker_repository.h" | 50 #include "content/renderer/shared_worker_repository.h" |
49 #include "content/renderer/websharedworker_proxy.h" | 51 #include "content/renderer/websharedworker_proxy.h" |
| 52 #include "net/base/data_url.h" |
50 #include "net/base/net_errors.h" | 53 #include "net/base/net_errors.h" |
51 #include "net/http/http_util.h" | 54 #include "net/http/http_util.h" |
52 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" | 55 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" |
53 #include "third_party/WebKit/public/platform/WebString.h" | 56 #include "third_party/WebKit/public/platform/WebString.h" |
54 #include "third_party/WebKit/public/platform/WebURL.h" | 57 #include "third_party/WebKit/public/platform/WebURL.h" |
55 #include "third_party/WebKit/public/platform/WebURLError.h" | 58 #include "third_party/WebKit/public/platform/WebURLError.h" |
56 #include "third_party/WebKit/public/platform/WebURLResponse.h" | 59 #include "third_party/WebKit/public/platform/WebURLResponse.h" |
57 #include "third_party/WebKit/public/platform/WebVector.h" | 60 #include "third_party/WebKit/public/platform/WebVector.h" |
58 #include "third_party/WebKit/public/web/WebDocument.h" | 61 #include "third_party/WebKit/public/web/WebDocument.h" |
59 #include "third_party/WebKit/public/web/WebFrame.h" | 62 #include "third_party/WebKit/public/web/WebFrame.h" |
(...skipping 14 matching lines...) Expand all Loading... |
74 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" | 77 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" |
75 #include "content/renderer/pepper/pepper_webplugin_impl.h" | 78 #include "content/renderer/pepper/pepper_webplugin_impl.h" |
76 #include "content/renderer/pepper/plugin_module.h" | 79 #include "content/renderer/pepper/plugin_module.h" |
77 #endif | 80 #endif |
78 | 81 |
79 #if defined(ENABLE_WEBRTC) | 82 #if defined(ENABLE_WEBRTC) |
80 #include "content/renderer/media/rtc_peer_connection_handler.h" | 83 #include "content/renderer/media/rtc_peer_connection_handler.h" |
81 #endif | 84 #endif |
82 | 85 |
83 using blink::WebContextMenuData; | 86 using blink::WebContextMenuData; |
| 87 using blink::WebData; |
84 using blink::WebDataSource; | 88 using blink::WebDataSource; |
85 using blink::WebDocument; | 89 using blink::WebDocument; |
86 using blink::WebFrame; | 90 using blink::WebFrame; |
87 using blink::WebHistoryItem; | 91 using blink::WebHistoryItem; |
| 92 using blink::WebHTTPBody; |
88 using blink::WebNavigationPolicy; | 93 using blink::WebNavigationPolicy; |
89 using blink::WebPluginParams; | 94 using blink::WebPluginParams; |
90 using blink::WebReferrerPolicy; | 95 using blink::WebReferrerPolicy; |
91 using blink::WebSearchableFormData; | 96 using blink::WebSearchableFormData; |
92 using blink::WebSecurityOrigin; | 97 using blink::WebSecurityOrigin; |
93 using blink::WebSecurityPolicy; | 98 using blink::WebSecurityPolicy; |
94 using blink::WebServiceWorkerProvider; | 99 using blink::WebServiceWorkerProvider; |
95 using blink::WebStorageQuotaCallbacks; | 100 using blink::WebStorageQuotaCallbacks; |
96 using blink::WebString; | 101 using blink::WebString; |
97 using blink::WebURL; | 102 using blink::WebURL; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 ds->redirectChain(urls); | 140 ds->redirectChain(urls); |
136 result->reserve(urls.size()); | 141 result->reserve(urls.size()); |
137 for (size_t i = 0; i < urls.size(); ++i) { | 142 for (size_t i = 0; i < urls.size(); ++i) { |
138 if (urls[i] != GURL(kSwappedOutURL)) | 143 if (urls[i] != GURL(kSwappedOutURL)) |
139 result->push_back(urls[i]); | 144 result->push_back(urls[i]); |
140 else | 145 else |
141 result->push_back(blank_url); | 146 result->push_back(blank_url); |
142 } | 147 } |
143 } | 148 } |
144 | 149 |
| 150 NOINLINE static void CrashIntentionally() { |
| 151 // NOTE(shess): Crash directly rather than using NOTREACHED() so |
| 152 // that the signature is easier to triage in crash reports. |
| 153 volatile int* zero = NULL; |
| 154 *zero = 0; |
| 155 } |
| 156 |
| 157 #if defined(ADDRESS_SANITIZER) |
| 158 NOINLINE static void MaybeTriggerAsanError(const GURL& url) { |
| 159 // NOTE(rogerm): We intentionally perform an invalid heap access here in |
| 160 // order to trigger an Address Sanitizer (ASAN) error report. |
| 161 static const char kCrashDomain[] = "crash"; |
| 162 static const char kHeapOverflow[] = "/heap-overflow"; |
| 163 static const char kHeapUnderflow[] = "/heap-underflow"; |
| 164 static const char kUseAfterFree[] = "/use-after-free"; |
| 165 static const int kArraySize = 5; |
| 166 |
| 167 if (!url.DomainIs(kCrashDomain, sizeof(kCrashDomain) - 1)) |
| 168 return; |
| 169 |
| 170 if (!url.has_path()) |
| 171 return; |
| 172 |
| 173 scoped_ptr<int[]> array(new int[kArraySize]); |
| 174 std::string crash_type(url.path()); |
| 175 int dummy = 0; |
| 176 if (crash_type == kHeapOverflow) { |
| 177 dummy = array[kArraySize]; |
| 178 } else if (crash_type == kHeapUnderflow ) { |
| 179 dummy = array[-1]; |
| 180 } else if (crash_type == kUseAfterFree) { |
| 181 int* dangling = array.get(); |
| 182 array.reset(); |
| 183 dummy = dangling[kArraySize / 2]; |
| 184 } |
| 185 |
| 186 // Make sure the assignments to the dummy value aren't optimized away. |
| 187 base::debug::Alias(&dummy); |
| 188 } |
| 189 #endif // ADDRESS_SANITIZER |
| 190 |
| 191 static void MaybeHandleDebugURL(const GURL& url) { |
| 192 if (!url.SchemeIs(kChromeUIScheme)) |
| 193 return; |
| 194 if (url == GURL(kChromeUICrashURL)) { |
| 195 CrashIntentionally(); |
| 196 } else if (url == GURL(kChromeUIKillURL)) { |
| 197 base::KillProcess(base::GetCurrentProcessHandle(), 1, false); |
| 198 } else if (url == GURL(kChromeUIHangURL)) { |
| 199 for (;;) { |
| 200 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); |
| 201 } |
| 202 } else if (url == GURL(kChromeUIShorthangURL)) { |
| 203 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); |
| 204 } |
| 205 |
| 206 #if defined(ADDRESS_SANITIZER) |
| 207 MaybeTriggerAsanError(url); |
| 208 #endif // ADDRESS_SANITIZER |
| 209 } |
| 210 |
145 } // namespace | 211 } // namespace |
146 | 212 |
147 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = | 213 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = |
148 NULL; | 214 NULL; |
149 | 215 |
150 // static | 216 // static |
151 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, | 217 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, |
152 int32 routing_id) { | 218 int32 routing_id) { |
153 DCHECK(routing_id != MSG_ROUTING_NONE); | 219 DCHECK(routing_id != MSG_ROUTING_NONE); |
154 | 220 |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); | 480 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); |
415 RenderFrameObserver* observer; | 481 RenderFrameObserver* observer; |
416 while ((observer = it.GetNext()) != NULL) { | 482 while ((observer = it.GetNext()) != NULL) { |
417 if (observer->OnMessageReceived(msg)) | 483 if (observer->OnMessageReceived(msg)) |
418 return true; | 484 return true; |
419 } | 485 } |
420 | 486 |
421 bool handled = true; | 487 bool handled = true; |
422 bool msg_is_ok = true; | 488 bool msg_is_ok = true; |
423 IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameImpl, msg, msg_is_ok) | 489 IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameImpl, msg, msg_is_ok) |
| 490 IPC_MESSAGE_HANDLER(FrameMsg_Navigate, OnNavigate) |
424 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut) | 491 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut) |
425 IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) | 492 IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) |
426 IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, | 493 IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, |
427 OnCompositorFrameSwapped(msg)) | 494 OnCompositorFrameSwapped(msg)) |
428 IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) | 495 IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) |
429 IPC_MESSAGE_HANDLER(FrameMsg_ContextMenuClosed, OnContextMenuClosed) | 496 IPC_MESSAGE_HANDLER(FrameMsg_ContextMenuClosed, OnContextMenuClosed) |
430 IPC_MESSAGE_HANDLER(FrameMsg_CustomContextMenuAction, | 497 IPC_MESSAGE_HANDLER(FrameMsg_CustomContextMenuAction, |
431 OnCustomContextMenuAction) | 498 OnCustomContextMenuAction) |
432 IPC_END_MESSAGE_MAP_EX() | 499 IPC_END_MESSAGE_MAP_EX() |
433 | 500 |
434 if (!msg_is_ok) { | 501 if (!msg_is_ok) { |
435 // The message had a handler, but its deserialization failed. | 502 // The message had a handler, but its deserialization failed. |
436 // Kill the renderer to avoid potential spoofing attacks. | 503 // Kill the renderer to avoid potential spoofing attacks. |
437 CHECK(false) << "Unable to deserialize message in RenderFrameImpl."; | 504 CHECK(false) << "Unable to deserialize message in RenderFrameImpl."; |
438 } | 505 } |
439 | 506 |
440 return handled; | 507 return handled; |
441 } | 508 } |
| 509 |
| 510 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { |
| 511 MaybeHandleDebugURL(params.url); |
| 512 if (!render_view_->webview()) |
| 513 return; |
| 514 |
| 515 render_view_->OnNavigate(params); |
| 516 |
| 517 bool is_reload = RenderViewImpl::IsReload(params); |
| 518 WebURLRequest::CachePolicy cache_policy = |
| 519 WebURLRequest::UseProtocolCachePolicy; |
| 520 |
| 521 // If this is a stale back/forward (due to a recent navigation the browser |
| 522 // didn't know about), ignore it. |
| 523 if (render_view_->IsBackForwardToStaleEntry(params, is_reload)) |
| 524 return; |
| 525 |
| 526 // Swap this renderer back in if necessary. |
| 527 if (render_view_->is_swapped_out_) { |
| 528 // We marked the view as hidden when swapping the view out, so be sure to |
| 529 // reset the visibility state before navigating to the new URL. |
| 530 render_view_->webview()->setVisibilityState( |
| 531 render_view_->visibilityState(), false); |
| 532 |
| 533 // If this is an attempt to reload while we are swapped out, we should not |
| 534 // reload swappedout://, but the previous page, which is stored in |
| 535 // params.state. Setting is_reload to false will treat this like a back |
| 536 // navigation to accomplish that. |
| 537 is_reload = false; |
| 538 cache_policy = WebURLRequest::ReloadIgnoringCacheData; |
| 539 |
| 540 // We refresh timezone when a view is swapped in since timezone |
| 541 // can get out of sync when the system timezone is updated while |
| 542 // the view is swapped out. |
| 543 RenderViewImpl::NotifyTimezoneChange(render_view_->webview()->mainFrame()); |
| 544 |
| 545 render_view_->SetSwappedOut(false); |
| 546 is_swapped_out_ = false; |
| 547 } |
| 548 |
| 549 if (params.should_clear_history_list) { |
| 550 CHECK_EQ(params.pending_history_list_offset, -1); |
| 551 CHECK_EQ(params.current_history_list_offset, -1); |
| 552 CHECK_EQ(params.current_history_list_length, 0); |
| 553 } |
| 554 render_view_->history_list_offset_ = params.current_history_list_offset; |
| 555 render_view_->history_list_length_ = params.current_history_list_length; |
| 556 if (render_view_->history_list_length_ >= 0) { |
| 557 render_view_->history_page_ids_.resize( |
| 558 render_view_->history_list_length_, -1); |
| 559 } |
| 560 if (params.pending_history_list_offset >= 0 && |
| 561 params.pending_history_list_offset < render_view_->history_list_length_) { |
| 562 render_view_->history_page_ids_[params.pending_history_list_offset] = |
| 563 params.page_id; |
| 564 } |
| 565 |
| 566 GetContentClient()->SetActiveURL(params.url); |
| 567 |
| 568 WebFrame* frame = frame_; |
| 569 if (!params.frame_to_navigate.empty()) { |
| 570 // TODO(nasko): Move this lookup to the browser process. |
| 571 frame = render_view_->webview()->findFrameByName( |
| 572 WebString::fromUTF8(params.frame_to_navigate)); |
| 573 CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate; |
| 574 } |
| 575 |
| 576 if (is_reload && frame->currentHistoryItem().isNull()) { |
| 577 // We cannot reload if we do not have any history state. This happens, for |
| 578 // example, when recovering from a crash. |
| 579 is_reload = false; |
| 580 cache_policy = WebURLRequest::ReloadIgnoringCacheData; |
| 581 } |
| 582 |
| 583 render_view_->pending_navigation_params_.reset( |
| 584 new FrameMsg_Navigate_Params(params)); |
| 585 |
| 586 // If we are reloading, then WebKit will use the history state of the current |
| 587 // page, so we should just ignore any given history state. Otherwise, if we |
| 588 // have history state, then we need to navigate to it, which corresponds to a |
| 589 // back/forward navigation event. |
| 590 if (is_reload) { |
| 591 bool reload_original_url = |
| 592 (params.navigation_type == |
| 593 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); |
| 594 bool ignore_cache = (params.navigation_type == |
| 595 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); |
| 596 |
| 597 if (reload_original_url) |
| 598 frame->reloadWithOverrideURL(params.url, true); |
| 599 else |
| 600 frame->reload(ignore_cache); |
| 601 } else if (params.page_state.IsValid()) { |
| 602 // We must know the page ID of the page we are navigating back to. |
| 603 DCHECK_NE(params.page_id, -1); |
| 604 WebHistoryItem item = PageStateToHistoryItem(params.page_state); |
| 605 if (!item.isNull()) { |
| 606 // Ensure we didn't save the swapped out URL in UpdateState, since the |
| 607 // browser should never be telling us to navigate to swappedout://. |
| 608 CHECK(item.urlString() != WebString::fromUTF8(kSwappedOutURL)); |
| 609 frame->loadHistoryItem(item, cache_policy); |
| 610 } |
| 611 } else if (!params.base_url_for_data_url.is_empty()) { |
| 612 // A loadData request with a specified base URL. |
| 613 std::string mime_type, charset, data; |
| 614 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { |
| 615 frame->loadData( |
| 616 WebData(data.c_str(), data.length()), |
| 617 WebString::fromUTF8(mime_type), |
| 618 WebString::fromUTF8(charset), |
| 619 params.base_url_for_data_url, |
| 620 params.history_url_for_data_url, |
| 621 false); |
| 622 } else { |
| 623 CHECK(false) << |
| 624 "Invalid URL passed: " << params.url.possibly_invalid_spec(); |
| 625 } |
| 626 } else { |
| 627 // Navigate to the given URL. |
| 628 WebURLRequest request(params.url); |
| 629 |
| 630 // A session history navigation should have been accompanied by state. |
| 631 CHECK_EQ(params.page_id, -1); |
| 632 |
| 633 if (frame->isViewSourceModeEnabled()) |
| 634 request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad); |
| 635 |
| 636 if (params.referrer.url.is_valid()) { |
| 637 WebString referrer = WebSecurityPolicy::generateReferrerHeader( |
| 638 params.referrer.policy, |
| 639 params.url, |
| 640 WebString::fromUTF8(params.referrer.url.spec())); |
| 641 if (!referrer.isEmpty()) |
| 642 request.setHTTPReferrer(referrer, params.referrer.policy); |
| 643 } |
| 644 |
| 645 if (!params.extra_headers.empty()) { |
| 646 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), |
| 647 params.extra_headers.end(), "\n"); |
| 648 i.GetNext(); ) { |
| 649 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), |
| 650 WebString::fromUTF8(i.values())); |
| 651 } |
| 652 } |
| 653 |
| 654 if (params.is_post) { |
| 655 request.setHTTPMethod(WebString::fromUTF8("POST")); |
| 656 |
| 657 // Set post data. |
| 658 WebHTTPBody http_body; |
| 659 http_body.initialize(); |
| 660 const char* data = NULL; |
| 661 if (params.browser_initiated_post_data.size()) { |
| 662 data = reinterpret_cast<const char*>( |
| 663 ¶ms.browser_initiated_post_data.front()); |
| 664 } |
| 665 http_body.appendData( |
| 666 WebData(data, params.browser_initiated_post_data.size())); |
| 667 request.setHTTPBody(http_body); |
| 668 } |
| 669 |
| 670 frame->loadRequest(request); |
| 671 |
| 672 // If this is a cross-process navigation, the browser process will send |
| 673 // along the proper navigation start value. |
| 674 if (!params.browser_navigation_start.is_null() && |
| 675 frame->provisionalDataSource()) { |
| 676 // browser_navigation_start is likely before this process existed, so we |
| 677 // can't use InterProcessTimeTicksConverter. Instead, the best we can do |
| 678 // is just ensure we don't report a bogus value in the future. |
| 679 base::TimeTicks navigation_start = std::min( |
| 680 base::TimeTicks::Now(), params.browser_navigation_start); |
| 681 double navigation_start_seconds = |
| 682 (navigation_start - base::TimeTicks()).InSecondsF(); |
| 683 frame->provisionalDataSource()->setNavigationStartTime( |
| 684 navigation_start_seconds); |
| 685 } |
| 686 } |
| 687 |
| 688 // In case LoadRequest failed before DidCreateDataSource was called. |
| 689 render_view_->pending_navigation_params_.reset(); |
| 690 } |
442 | 691 |
443 void RenderFrameImpl::OnSwapOut() { | 692 void RenderFrameImpl::OnSwapOut() { |
444 // Only run unload if we're not swapped out yet, but send the ack either way. | 693 // Only run unload if we're not swapped out yet, but send the ack either way. |
445 if (!is_swapped_out_) { | 694 if (!is_swapped_out_) { |
446 // Swap this RenderView out so the tab can navigate to a page rendered by a | 695 // Swap this RenderView out so the tab can navigate to a page rendered by a |
447 // different process. This involves running the unload handler and clearing | 696 // different process. This involves running the unload handler and clearing |
448 // the page. Once WasSwappedOut is called, we also allow this process to | 697 // the page. Once WasSwappedOut is called, we also allow this process to |
449 // exit if there are no other active RenderViews in it. | 698 // exit if there are no other active RenderViews in it. |
450 | 699 |
451 // Send an UpdateState message before we get swapped out. | 700 // Send an UpdateState message before we get swapped out. |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 // TODO(davidben): This should also take the failed navigation's replacement | 1311 // TODO(davidben): This should also take the failed navigation's replacement |
1063 // state into account, if a location.replace() failed. | 1312 // state into account, if a location.replace() failed. |
1064 bool replace = | 1313 bool replace = |
1065 navigation_state->pending_page_id() != -1 || | 1314 navigation_state->pending_page_id() != -1 || |
1066 PageTransitionCoreTypeIs(navigation_state->transition_type(), | 1315 PageTransitionCoreTypeIs(navigation_state->transition_type(), |
1067 PAGE_TRANSITION_AUTO_SUBFRAME); | 1316 PAGE_TRANSITION_AUTO_SUBFRAME); |
1068 | 1317 |
1069 // If we failed on a browser initiated request, then make sure that our error | 1318 // If we failed on a browser initiated request, then make sure that our error |
1070 // page load is regarded as the same browser initiated request. | 1319 // page load is regarded as the same browser initiated request. |
1071 if (!navigation_state->is_content_initiated()) { | 1320 if (!navigation_state->is_content_initiated()) { |
1072 render_view_->pending_navigation_params_.reset(new ViewMsg_Navigate_Params); | 1321 render_view_->pending_navigation_params_.reset( |
| 1322 new FrameMsg_Navigate_Params); |
1073 render_view_->pending_navigation_params_->page_id = | 1323 render_view_->pending_navigation_params_->page_id = |
1074 navigation_state->pending_page_id(); | 1324 navigation_state->pending_page_id(); |
1075 render_view_->pending_navigation_params_->pending_history_list_offset = | 1325 render_view_->pending_navigation_params_->pending_history_list_offset = |
1076 navigation_state->pending_history_list_offset(); | 1326 navigation_state->pending_history_list_offset(); |
1077 render_view_->pending_navigation_params_->should_clear_history_list = | 1327 render_view_->pending_navigation_params_->should_clear_history_list = |
1078 navigation_state->history_list_was_cleared(); | 1328 navigation_state->history_list_was_cleared(); |
1079 render_view_->pending_navigation_params_->transition = | 1329 render_view_->pending_navigation_params_->transition = |
1080 navigation_state->transition_type(); | 1330 navigation_state->transition_type(); |
1081 render_view_->pending_navigation_params_->request_time = | 1331 render_view_->pending_navigation_params_->request_time = |
1082 document_state->request_time(); | 1332 document_state->request_time(); |
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1954 | 2204 |
1955 void RenderFrameImpl::didStartLoading() { | 2205 void RenderFrameImpl::didStartLoading() { |
1956 Send(new FrameHostMsg_DidStartLoading(routing_id_)); | 2206 Send(new FrameHostMsg_DidStartLoading(routing_id_)); |
1957 } | 2207 } |
1958 | 2208 |
1959 void RenderFrameImpl::didStopLoading() { | 2209 void RenderFrameImpl::didStopLoading() { |
1960 Send(new FrameHostMsg_DidStopLoading(routing_id_)); | 2210 Send(new FrameHostMsg_DidStopLoading(routing_id_)); |
1961 } | 2211 } |
1962 | 2212 |
1963 } // namespace content | 2213 } // namespace content |
OLD | NEW |