Chromium Code Reviews| 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 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 971 } | 971 } |
| 972 | 972 |
| 973 // RenderFrameImpl ---------------------------------------------------------- | 973 // RenderFrameImpl ---------------------------------------------------------- |
| 974 RenderFrameImpl::RenderFrameImpl(const CreateParams& params) | 974 RenderFrameImpl::RenderFrameImpl(const CreateParams& params) |
| 975 : frame_(NULL), | 975 : frame_(NULL), |
| 976 is_main_frame_(true), | 976 is_main_frame_(true), |
| 977 in_browser_initiated_detach_(false), | 977 in_browser_initiated_detach_(false), |
| 978 in_frame_tree_(false), | 978 in_frame_tree_(false), |
| 979 render_view_(params.render_view->AsWeakPtr()), | 979 render_view_(params.render_view->AsWeakPtr()), |
| 980 routing_id_(params.routing_id), | 980 routing_id_(params.routing_id), |
| 981 is_swapped_out_(false), | |
| 982 render_frame_proxy_(NULL), | 981 render_frame_proxy_(NULL), |
| 983 is_detaching_(false), | 982 is_detaching_(false), |
| 984 proxy_routing_id_(MSG_ROUTING_NONE), | 983 proxy_routing_id_(MSG_ROUTING_NONE), |
| 985 #if defined(ENABLE_PLUGINS) | 984 #if defined(ENABLE_PLUGINS) |
| 986 plugin_power_saver_helper_(nullptr), | 985 plugin_power_saver_helper_(nullptr), |
| 987 plugin_find_handler_(nullptr), | 986 plugin_find_handler_(nullptr), |
| 988 #endif | 987 #endif |
| 989 cookie_jar_(this), | 988 cookie_jar_(this), |
| 990 selection_text_offset_(0), | 989 selection_text_offset_(0), |
| 991 selection_range_(gfx::Range::InvalidRange()), | 990 selection_range_(gfx::Range::InvalidRange()), |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1090 "parent", parent_id); | 1089 "parent", parent_id); |
| 1091 } | 1090 } |
| 1092 | 1091 |
| 1093 MaybeEnableMojoBindings(); | 1092 MaybeEnableMojoBindings(); |
| 1094 | 1093 |
| 1095 #if defined(ENABLE_PLUGINS) | 1094 #if defined(ENABLE_PLUGINS) |
| 1096 new PepperBrowserConnection(this); | 1095 new PepperBrowserConnection(this); |
| 1097 #endif | 1096 #endif |
| 1098 new SharedWorkerRepository(this); | 1097 new SharedWorkerRepository(this); |
| 1099 | 1098 |
| 1100 if (IsLocalRoot() && !is_swapped_out_) { | 1099 if (IsLocalRoot()) { |
| 1101 // DevToolsAgent is a RenderFrameObserver, and will destruct itself | 1100 // DevToolsAgent is a RenderFrameObserver, and will destruct itself |
| 1102 // when |this| is deleted. | 1101 // when |this| is deleted. |
| 1103 devtools_agent_ = new DevToolsAgent(this); | 1102 devtools_agent_ = new DevToolsAgent(this); |
| 1104 } | 1103 } |
| 1105 | 1104 |
| 1106 RegisterMojoServices(); | 1105 RegisterMojoServices(); |
| 1107 | 1106 |
| 1108 // We delay calling this until we have the WebFrame so that any observer or | 1107 // We delay calling this until we have the WebFrame so that any observer or |
| 1109 // embedder can call GetWebFrame on any RenderFrame. | 1108 // embedder can call GetWebFrame on any RenderFrame. |
| 1110 GetContentClient()->renderer()->RenderFrameCreated(this); | 1109 GetContentClient()->renderer()->RenderFrameCreated(this); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1305 InitializeUserMediaClient(); | 1304 InitializeUserMediaClient(); |
| 1306 return web_user_media_client_ ? | 1305 return web_user_media_client_ ? |
| 1307 web_user_media_client_->media_stream_dispatcher() : NULL; | 1306 web_user_media_client_->media_stream_dispatcher() : NULL; |
| 1308 } | 1307 } |
| 1309 | 1308 |
| 1310 bool RenderFrameImpl::Send(IPC::Message* message) { | 1309 bool RenderFrameImpl::Send(IPC::Message* message) { |
| 1311 if (is_detaching_) { | 1310 if (is_detaching_) { |
| 1312 delete message; | 1311 delete message; |
| 1313 return false; | 1312 return false; |
| 1314 } | 1313 } |
| 1315 if (is_swapped_out_) { | |
| 1316 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { | |
| 1317 delete message; | |
| 1318 return false; | |
| 1319 } | |
| 1320 } | |
| 1321 | 1314 |
| 1322 return RenderThread::Get()->Send(message); | 1315 return RenderThread::Get()->Send(message); |
| 1323 } | 1316 } |
| 1324 | 1317 |
| 1325 #if defined(OS_MACOSX) || defined(OS_ANDROID) | 1318 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
| 1326 void RenderFrameImpl::DidHideExternalPopupMenu() { | 1319 void RenderFrameImpl::DidHideExternalPopupMenu() { |
| 1327 // We need to clear external_popup_menu_ as soon as ExternalPopupMenu::close | 1320 // We need to clear external_popup_menu_ as soon as ExternalPopupMenu::close |
| 1328 // is called. Otherwise, createExternalPopupMenu() for new popup will fail. | 1321 // is called. Otherwise, createExternalPopupMenu() for new popup will fail. |
| 1329 external_popup_menu_.reset(); | 1322 external_popup_menu_.reset(); |
| 1330 } | 1323 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1464 // Can be NULL in tests. | 1457 // Can be NULL in tests. |
| 1465 if (render_thread_impl) | 1458 if (render_thread_impl) |
| 1466 render_thread_impl->GetRendererScheduler()->OnNavigationStarted(); | 1459 render_thread_impl->GetRendererScheduler()->OnNavigationStarted(); |
| 1467 DCHECK(!IsBrowserSideNavigationEnabled()); | 1460 DCHECK(!IsBrowserSideNavigationEnabled()); |
| 1468 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", "id", routing_id_, | 1461 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", "id", routing_id_, |
| 1469 "url", common_params.url.possibly_invalid_spec()); | 1462 "url", common_params.url.possibly_invalid_spec()); |
| 1470 NavigateInternal(common_params, start_params, request_params, | 1463 NavigateInternal(common_params, start_params, request_params, |
| 1471 scoped_ptr<StreamOverrideParameters>()); | 1464 scoped_ptr<StreamOverrideParameters>()); |
| 1472 } | 1465 } |
| 1473 | 1466 |
| 1474 void RenderFrameImpl::NavigateToSwappedOutURL() { | |
| 1475 // We use loadRequest instead of loadHTMLString because the former commits | |
| 1476 // synchronously. Otherwise a new navigation can interrupt the navigation | |
| 1477 // to kSwappedOutURL. If that happens to be to the page we had been | |
| 1478 // showing, then WebKit will never send a commit and we'll be left spinning. | |
| 1479 // Set the is_swapped_out_ bit to true, so IPC filtering is in effect and | |
| 1480 // the navigation to swappedout:// is not announced to the browser side. | |
| 1481 is_swapped_out_ = true; | |
| 1482 GURL swappedOutURL(kSwappedOutURL); | |
| 1483 WebURLRequest request(swappedOutURL); | |
| 1484 frame_->loadRequest(request); | |
| 1485 } | |
| 1486 | |
| 1487 void RenderFrameImpl::BindServiceRegistry( | 1467 void RenderFrameImpl::BindServiceRegistry( |
| 1488 mojo::shell::mojom::InterfaceProviderRequest services, | 1468 mojo::shell::mojom::InterfaceProviderRequest services, |
| 1489 mojo::shell::mojom::InterfaceProviderPtr exposed_services) { | 1469 mojo::shell::mojom::InterfaceProviderPtr exposed_services) { |
| 1490 service_registry_.Bind(std::move(services)); | 1470 service_registry_.Bind(std::move(services)); |
| 1491 service_registry_.BindRemoteServiceProvider(std::move(exposed_services)); | 1471 service_registry_.BindRemoteServiceProvider(std::move(exposed_services)); |
| 1492 } | 1472 } |
| 1493 | 1473 |
| 1494 ManifestManager* RenderFrameImpl::manifest_manager() { | 1474 ManifestManager* RenderFrameImpl::manifest_manager() { |
| 1495 return manifest_manager_; | 1475 return manifest_manager_; |
| 1496 } | 1476 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1519 void RenderFrameImpl::OnSwapOut( | 1499 void RenderFrameImpl::OnSwapOut( |
| 1520 int proxy_routing_id, | 1500 int proxy_routing_id, |
| 1521 bool is_loading, | 1501 bool is_loading, |
| 1522 const FrameReplicationState& replicated_frame_state) { | 1502 const FrameReplicationState& replicated_frame_state) { |
| 1523 TRACE_EVENT1("navigation", "RenderFrameImpl::OnSwapOut", "id", routing_id_); | 1503 TRACE_EVENT1("navigation", "RenderFrameImpl::OnSwapOut", "id", routing_id_); |
| 1524 RenderFrameProxy* proxy = NULL; | 1504 RenderFrameProxy* proxy = NULL; |
| 1525 | 1505 |
| 1526 // This codepath should only be hit for subframes when in --site-per-process. | 1506 // This codepath should only be hit for subframes when in --site-per-process. |
| 1527 CHECK(is_main_frame_ || SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 1507 CHECK(is_main_frame_ || SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
| 1528 | 1508 |
| 1529 // Only run unload if we're not swapped out yet, but send the ack either way. | 1509 // Swap this RenderFrame out so the frame can navigate to a page rendered by |
| 1530 if (!is_swapped_out_) { | 1510 // a different process. This involves running the unload handler and |
| 1531 // Swap this RenderFrame out so the frame can navigate to a page rendered by | 1511 // clearing the page. We also allow this process to exit if there are no |
| 1532 // a different process. This involves running the unload handler and | 1512 // other active RenderFrames in it. |
| 1533 // clearing the page. We also allow this process to exit if there are no | |
| 1534 // other active RenderFrames in it. | |
| 1535 | 1513 |
| 1536 // Send an UpdateState message before we get swapped out. | 1514 // Send an UpdateState message before we get deleted. |
| 1537 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) | 1515 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
| 1538 SendUpdateState(); | 1516 SendUpdateState(); |
| 1539 else | 1517 else |
| 1540 render_view_->SendUpdateState(); | 1518 render_view_->SendUpdateState(); |
| 1541 | 1519 |
| 1542 // If we need a proxy to replace this, create it now so its routing id is | 1520 // If we need a proxy to replace this, create it now so its routing id is |
| 1543 // registered for receiving IPC messages. | 1521 // registered for receiving IPC messages. |
| 1544 if (proxy_routing_id != MSG_ROUTING_NONE) { | 1522 if (proxy_routing_id != MSG_ROUTING_NONE) { |
| 1545 proxy = RenderFrameProxy::CreateProxyToReplaceFrame( | 1523 proxy = RenderFrameProxy::CreateProxyToReplaceFrame( |
| 1546 this, proxy_routing_id, replicated_frame_state.scope); | 1524 this, proxy_routing_id, replicated_frame_state.scope); |
| 1547 } | 1525 } |
| 1548 | 1526 |
| 1549 // Synchronously run the unload handler before sending the ACK. | 1527 // Synchronously run the unload handler before sending the ACK. |
| 1550 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support | 1528 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support |
| 1551 // unload on subframes as well. | 1529 // unload on subframes as well. |
| 1552 if (is_main_frame_) | 1530 if (is_main_frame_) |
| 1553 frame_->dispatchUnloadEvent(); | 1531 frame_->dispatchUnloadEvent(); |
| 1554 | 1532 |
| 1555 // Swap out and stop sending any IPC messages that are not ACKs. | 1533 // Swap out and stop sending any IPC messages that are not ACKs. |
| 1556 if (is_main_frame_) | 1534 if (is_main_frame_) |
| 1557 render_view_->SetSwappedOut(true); | 1535 render_view_->SetSwappedOut(true); |
| 1558 is_swapped_out_ = true; | |
| 1559 | 1536 |
| 1560 // Set the proxy here, since OnStop() below could cause an onload event | 1537 // Set the proxy here, since OnStop() below could cause an onload event |
| 1561 // handler to execute, which could trigger code such as | 1538 // handler to execute, which could trigger code such as |
| 1562 // willCheckAndDispatchMessageEvent() that needs the proxy. | 1539 // willCheckAndDispatchMessageEvent() that needs the proxy. |
| 1563 if (proxy) | 1540 if (proxy) |
| 1564 set_render_frame_proxy(proxy); | 1541 set_render_frame_proxy(proxy); |
| 1565 | 1542 |
| 1566 // Transfer settings such as initial drawing parameters to the remote frame, | 1543 // Transfer settings such as initial drawing parameters to the remote frame, |
| 1567 // if one is created, that will replace this frame. | 1544 // if one is created, that will replace this frame. |
| 1568 if (!is_main_frame_ && proxy) | 1545 if (!is_main_frame_ && proxy) |
| 1569 proxy->web_frame()->initializeFromFrame(frame_); | 1546 proxy->web_frame()->initializeFromFrame(frame_); |
| 1570 | 1547 |
| 1571 // Let WebKit know that this view is hidden so it can drop resources and | 1548 // Let WebKit know that this view is hidden so it can drop resources and |
| 1572 // stop compositing. | 1549 // stop compositing. |
| 1573 // TODO(creis): Support this for subframes as well. | 1550 // TODO(creis): Support this for subframes as well. |
| 1574 if (is_main_frame_) { | 1551 if (is_main_frame_) { |
| 1575 render_view_->webview()->setVisibilityState( | 1552 render_view_->webview()->setVisibilityState( |
| 1576 blink::WebPageVisibilityStateHidden, false); | 1553 blink::WebPageVisibilityStateHidden, false); |
| 1577 } | |
| 1578 } | 1554 } |
| 1579 | 1555 |
| 1580 // It is now safe to show modal dialogs again. | 1556 // It is now safe to show modal dialogs again. |
| 1581 // TODO(creis): Deal with modal dialogs from subframes. | 1557 // TODO(creis): Deal with modal dialogs from subframes. |
| 1582 if (is_main_frame_) | 1558 if (is_main_frame_) |
| 1583 render_view_->suppress_dialogs_until_swap_out_ = false; | 1559 render_view_->suppress_dialogs_until_swap_out_ = false; |
| 1584 | 1560 |
| 1585 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); | 1561 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); |
| 1586 | 1562 |
| 1587 RenderViewImpl* render_view = render_view_.get(); | 1563 RenderViewImpl* render_view = render_view_.get(); |
| (...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2593 params.parent_routing_id = routing_id_; | 2569 params.parent_routing_id = routing_id_; |
| 2594 params.scope = scope; | 2570 params.scope = scope; |
| 2595 params.frame_name = base::UTF16ToUTF8(base::StringPiece16(name)); | 2571 params.frame_name = base::UTF16ToUTF8(base::StringPiece16(name)); |
| 2596 params.frame_unique_name = | 2572 params.frame_unique_name = |
| 2597 base::UTF16ToUTF8(base::StringPiece16(unique_name)); | 2573 base::UTF16ToUTF8(base::StringPiece16(unique_name)); |
| 2598 params.sandbox_flags = sandbox_flags; | 2574 params.sandbox_flags = sandbox_flags; |
| 2599 params.frame_owner_properties = frame_owner_properties; | 2575 params.frame_owner_properties = frame_owner_properties; |
| 2600 Send(new FrameHostMsg_CreateChildFrame(params, &child_routing_id)); | 2576 Send(new FrameHostMsg_CreateChildFrame(params, &child_routing_id)); |
| 2601 | 2577 |
| 2602 // Allocation of routing id failed, so we can't create a child frame. This can | 2578 // Allocation of routing id failed, so we can't create a child frame. This can |
| 2603 // happen if this RenderFrameImpl's IPCs are being filtered when in swapped | 2579 // happen if the synchronous IPC message above has failed. |
| 2604 // out state or synchronous IPC message above has failed. | |
| 2605 if (child_routing_id == MSG_ROUTING_NONE) { | 2580 if (child_routing_id == MSG_ROUTING_NONE) { |
| 2606 NOTREACHED() << "Failed to allocate routing id for child frame."; | 2581 NOTREACHED() << "Failed to allocate routing id for child frame."; |
| 2607 return nullptr; | 2582 return nullptr; |
| 2608 } | 2583 } |
| 2609 | 2584 |
| 2610 // This method is always called by local frames, never remote frames. | 2585 // This method is always called by local frames, never remote frames. |
| 2611 | 2586 |
| 2612 // Tracing analysis uses this to find main frames when this value is | 2587 // Tracing analysis uses this to find main frames when this value is |
| 2613 // MSG_ROUTING_NONE, and build the frame tree otherwise. | 2588 // MSG_ROUTING_NONE, and build the frame tree otherwise. |
| 2614 TRACE_EVENT2("navigation", "RenderFrameImpl::createChildFrame", | 2589 TRACE_EVENT2("navigation", "RenderFrameImpl::createChildFrame", |
| 2615 "id", routing_id_, | 2590 "id", routing_id_, |
| 2616 "child", child_routing_id); | 2591 "child", child_routing_id); |
| 2617 | 2592 |
| 2618 // Create the RenderFrame and WebLocalFrame, linking the two. | 2593 // Create the RenderFrame and WebLocalFrame, linking the two. |
| 2619 RenderFrameImpl* child_render_frame = RenderFrameImpl::Create( | 2594 RenderFrameImpl* child_render_frame = RenderFrameImpl::Create( |
| 2620 render_view_.get(), child_routing_id); | 2595 render_view_.get(), child_routing_id); |
| 2621 blink::WebLocalFrame* web_frame = | 2596 blink::WebLocalFrame* web_frame = |
| 2622 WebLocalFrame::create(scope, child_render_frame); | 2597 WebLocalFrame::create(scope, child_render_frame); |
| 2623 child_render_frame->BindToWebFrame(web_frame); | 2598 child_render_frame->BindToWebFrame(web_frame); |
| 2624 | 2599 |
| 2625 // Add the frame to the frame tree and initialize it. | 2600 // Add the frame to the frame tree and initialize it. |
| 2626 parent->appendChild(web_frame); | 2601 parent->appendChild(web_frame); |
| 2627 child_render_frame->in_frame_tree_ = true; | 2602 child_render_frame->in_frame_tree_ = true; |
| 2628 child_render_frame->Initialize(); | 2603 child_render_frame->Initialize(); |
| 2629 | 2604 |
| 2630 return web_frame; | 2605 return web_frame; |
| 2631 } | 2606 } |
| 2632 | 2607 |
| 2633 void RenderFrameImpl::didChangeOpener(blink::WebFrame* opener) { | 2608 void RenderFrameImpl::didChangeOpener(blink::WebFrame* opener) { |
| 2634 // Only active frames are able to disown their opener. | |
| 2635 if (!opener && is_swapped_out_) | |
| 2636 return; | |
| 2637 | |
| 2638 // Only a local frame should be able to update another frame's opener. | 2609 // Only a local frame should be able to update another frame's opener. |
| 2639 DCHECK(!opener || opener->isWebLocalFrame()); | 2610 DCHECK(!opener || opener->isWebLocalFrame()); |
| 2640 | 2611 |
| 2641 int opener_routing_id = opener ? | 2612 int opener_routing_id = opener ? |
| 2642 RenderFrameImpl::FromWebFrame(opener->toWebLocalFrame())->GetRoutingID() : | 2613 RenderFrameImpl::FromWebFrame(opener->toWebLocalFrame())->GetRoutingID() : |
| 2643 MSG_ROUTING_NONE; | 2614 MSG_ROUTING_NONE; |
| 2644 Send(new FrameHostMsg_DidChangeOpener(routing_id_, opener_routing_id)); | 2615 Send(new FrameHostMsg_DidChangeOpener(routing_id_, opener_routing_id)); |
| 2645 } | 2616 } |
| 2646 | 2617 |
| 2647 void RenderFrameImpl::frameDetached(blink::WebFrame* frame, DetachType type) { | 2618 void RenderFrameImpl::frameDetached(blink::WebFrame* frame, DetachType type) { |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2980 // In fast/loader/stop-provisional-loads.html, we abort the load before this | 2951 // In fast/loader/stop-provisional-loads.html, we abort the load before this |
| 2981 // callback is invoked. | 2952 // callback is invoked. |
| 2982 if (!ds) | 2953 if (!ds) |
| 2983 return; | 2954 return; |
| 2984 | 2955 |
| 2985 TRACE_EVENT2("navigation,benchmark", | 2956 TRACE_EVENT2("navigation,benchmark", |
| 2986 "RenderFrameImpl::didStartProvisionalLoad", "id", routing_id_, | 2957 "RenderFrameImpl::didStartProvisionalLoad", "id", routing_id_, |
| 2987 "url", ds->request().url().string().utf8()); | 2958 "url", ds->request().url().string().utf8()); |
| 2988 DocumentState* document_state = DocumentState::FromDataSource(ds); | 2959 DocumentState* document_state = DocumentState::FromDataSource(ds); |
| 2989 | 2960 |
| 2990 // We should only navigate to swappedout:// when is_swapped_out_ is true. | 2961 // We should never navigate to swappedout://. |
| 2991 CHECK(ds->request().url() != GURL(kSwappedOutURL) || is_swapped_out_) | 2962 CHECK(ds->request().url() != GURL(kSwappedOutURL)) << "Heard swappedout://."; |
| 2992 << "Heard swappedout:// when not swapped out."; | |
| 2993 | 2963 |
| 2994 // Update the request time if WebKit has better knowledge of it. | 2964 // Update the request time if WebKit has better knowledge of it. |
| 2995 if (document_state->request_time().is_null() && | 2965 if (document_state->request_time().is_null() && |
| 2996 triggering_event_time != 0.0) { | 2966 triggering_event_time != 0.0) { |
| 2997 document_state->set_request_time(Time::FromDoubleT(triggering_event_time)); | 2967 document_state->set_request_time(Time::FromDoubleT(triggering_event_time)); |
| 2998 } | 2968 } |
| 2999 | 2969 |
| 3000 // Start time is only set after request time. | 2970 // Start time is only set after request time. |
| 3001 document_state->set_start_load_time(Time::Now()); | 2971 document_state->set_start_load_time(Time::Now()); |
| 3002 | 2972 |
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3452 TRACE_EVENT_INSTANT0("WebCore,benchmark", "LoadFinished", | 3422 TRACE_EVENT_INSTANT0("WebCore,benchmark", "LoadFinished", |
| 3453 TRACE_EVENT_SCOPE_PROCESS); | 3423 TRACE_EVENT_SCOPE_PROCESS); |
| 3454 } | 3424 } |
| 3455 document_state->set_finish_load_time(Time::Now()); | 3425 document_state->set_finish_load_time(Time::Now()); |
| 3456 } | 3426 } |
| 3457 | 3427 |
| 3458 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), | 3428 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), |
| 3459 DidFinishLoad(frame)); | 3429 DidFinishLoad(frame)); |
| 3460 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishLoad()); | 3430 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishLoad()); |
| 3461 | 3431 |
| 3462 // Don't send this message while the frame is swapped out. | |
| 3463 if (is_swapped_out()) | |
| 3464 return; | |
| 3465 | |
| 3466 Send(new FrameHostMsg_DidFinishLoad(routing_id_, | 3432 Send(new FrameHostMsg_DidFinishLoad(routing_id_, |
| 3467 ds->request().url())); | 3433 ds->request().url())); |
| 3468 } | 3434 } |
| 3469 | 3435 |
| 3470 void RenderFrameImpl::didNavigateWithinPage(blink::WebLocalFrame* frame, | 3436 void RenderFrameImpl::didNavigateWithinPage(blink::WebLocalFrame* frame, |
| 3471 const blink::WebHistoryItem& item, | 3437 const blink::WebHistoryItem& item, |
| 3472 blink::WebHistoryCommitType commit_type) { | 3438 blink::WebHistoryCommitType commit_type) { |
| 3473 TRACE_EVENT1("navigation", "RenderFrameImpl::didNavigateWithinPage", | 3439 TRACE_EVENT1("navigation", "RenderFrameImpl::didNavigateWithinPage", |
| 3474 "id", routing_id_); | 3440 "id", routing_id_); |
| 3475 DCHECK_EQ(frame_, frame); | 3441 DCHECK_EQ(frame_, frame); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3573 message, | 3539 message, |
| 3574 default_value, | 3540 default_value, |
| 3575 frame_->document().url(), | 3541 frame_->document().url(), |
| 3576 &result); | 3542 &result); |
| 3577 if (ok) | 3543 if (ok) |
| 3578 actual_value->assign(result); | 3544 actual_value->assign(result); |
| 3579 return ok; | 3545 return ok; |
| 3580 } | 3546 } |
| 3581 | 3547 |
| 3582 bool RenderFrameImpl::runModalBeforeUnloadDialog(bool is_reload) { | 3548 bool RenderFrameImpl::runModalBeforeUnloadDialog(bool is_reload) { |
| 3583 // If we are swapping out, we have already run the beforeunload handler. | |
| 3584 // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload | |
| 3585 // at all, to avoid running it twice. | |
| 3586 if (is_swapped_out_) | |
| 3587 return true; | |
| 3588 | |
| 3589 // Don't allow further dialogs if we are waiting to swap out, since the | 3549 // Don't allow further dialogs if we are waiting to swap out, since the |
| 3590 // PageGroupLoadDeferrer in our stack prevents it. | 3550 // PageGroupLoadDeferrer in our stack prevents it. |
| 3591 if (render_view()->suppress_dialogs_until_swap_out_) | 3551 if (render_view()->suppress_dialogs_until_swap_out_) |
| 3592 return false; | 3552 return false; |
| 3593 | 3553 |
| 3594 bool success = false; | 3554 bool success = false; |
| 3595 // This is an ignored return value, but is included so we can accept the same | 3555 // This is an ignored return value, but is included so we can accept the same |
| 3596 // response as RunJavaScriptMessage. | 3556 // response as RunJavaScriptMessage. |
| 3597 base::string16 ignored_result; | 3557 base::string16 ignored_result; |
| 3598 render_view()->SendAndRunNestedMessageLoop( | 3558 render_view()->SendAndRunNestedMessageLoop( |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4086 return midi_dispatcher_; | 4046 return midi_dispatcher_; |
| 4087 } | 4047 } |
| 4088 | 4048 |
| 4089 bool RenderFrameImpl::willCheckAndDispatchMessageEvent( | 4049 bool RenderFrameImpl::willCheckAndDispatchMessageEvent( |
| 4090 blink::WebLocalFrame* source_frame, | 4050 blink::WebLocalFrame* source_frame, |
| 4091 blink::WebFrame* target_frame, | 4051 blink::WebFrame* target_frame, |
| 4092 blink::WebSecurityOrigin target_origin, | 4052 blink::WebSecurityOrigin target_origin, |
| 4093 blink::WebDOMMessageEvent event) { | 4053 blink::WebDOMMessageEvent event) { |
| 4094 DCHECK(!frame_ || frame_ == target_frame); | 4054 DCHECK(!frame_ || frame_ == target_frame); |
| 4095 | 4055 |
| 4096 // Currently, a postMessage that targets a cross-process frame can be plumbed | |
| 4097 // either through this function or RenderFrameProxy::postMessageEvent. This | |
| 4098 // function is used when the target cross-process frame is a top-level frame | |
| 4099 // which has been swapped out. In that case, the corresponding WebLocalFrame | |
| 4100 // currently remains in the frame tree even in site-per-process mode (see | |
| 4101 // OnSwapOut). RenderFrameProxy::postMessageEvent is used in | |
| 4102 // --site-per-process mode for all other cases. | |
| 4103 // | |
| 4104 // TODO(alexmos, nasko): When swapped-out:// disappears, this should be | 4056 // TODO(alexmos, nasko): When swapped-out:// disappears, this should be |
| 4105 // cleaned up so that RenderFrameProxy::postMessageEvent is the only path for | 4057 // cleaned up so that RenderFrameProxy::postMessageEvent is the only path for |
| 4106 // cross-process postMessages. | 4058 // cross-process postMessages. |
| 4107 if (!is_swapped_out_) | |
| 4108 return false; | |
| 4109 | 4059 |
| 4110 // It is possible to get here on a swapped-out frame without a | 4060 // It is possible to get here on a swapped-out frame without a |
| 4111 // |render_frame_proxy_|. This happens when: | 4061 // |render_frame_proxy_|. This happens when: |
| 4112 // - This process only has one active RenderView and is about to go away | 4062 // - This process only has one active RenderView and is about to go away |
| 4113 // (e.g., due to cross-process navigation). | 4063 // (e.g., due to cross-process navigation). |
| 4114 // - The top frame has a subframe with an unload handler. | 4064 // - The top frame has a subframe with an unload handler. |
| 4115 // - The subframe sends a postMessage to the top-level frame in its unload | 4065 // - The subframe sends a postMessage to the top-level frame in its unload |
| 4116 // handler. | 4066 // handler. |
| 4117 // See https://crbug.com/475651 for details. We return false here, since we | 4067 // See https://crbug.com/475651 for details. We return false here, since we |
| 4118 // don't want to deliver the message to the new process in this case. | 4068 // don't want to deliver the message to the new process in this case. |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4404 WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); | 4354 WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); |
| 4405 if (extra_data) | 4355 if (extra_data) |
| 4406 params.was_fetched_via_proxy = extra_data->was_fetched_via_proxy(); | 4356 params.was_fetched_via_proxy = extra_data->was_fetched_via_proxy(); |
| 4407 params.was_within_same_page = navigation_state->WasWithinSamePage(); | 4357 params.was_within_same_page = navigation_state->WasWithinSamePage(); |
| 4408 params.security_info = response.securityInfo(); | 4358 params.security_info = response.securityInfo(); |
| 4409 | 4359 |
| 4410 // Set the origin of the frame. This will be replicated to the corresponding | 4360 // Set the origin of the frame. This will be replicated to the corresponding |
| 4411 // RenderFrameProxies in other processes. | 4361 // RenderFrameProxies in other processes. |
| 4412 // TODO(alexmos): Origins for URLs with non-standard schemes are excluded due | 4362 // TODO(alexmos): Origins for URLs with non-standard schemes are excluded due |
| 4413 // to https://crbug.com/439608 and will be replicated as unique origins. | 4363 // to https://crbug.com/439608 and will be replicated as unique origins. |
| 4414 if (!is_swapped_out_) { | 4364 std::string scheme = frame->document().getSecurityOrigin().protocol().utf8(); |
| 4415 std::string scheme = | 4365 if (url::IsStandard(scheme.c_str(), |
|
alexmos
2016/03/17 21:41:27
This reminded me to go clean this up, since url::O
nasko
2016/03/17 23:19:11
Acknowledged.
| |
| 4416 frame->document().getSecurityOrigin().protocol().utf8(); | 4366 url::Component(0, static_cast<int>(scheme.length())))) { |
| 4417 if (url::IsStandard(scheme.c_str(), | 4367 params.origin = frame->document().getSecurityOrigin(); |
| 4418 url::Component(0, static_cast<int>(scheme.length())))) { | |
| 4419 params.origin = frame->document().getSecurityOrigin(); | |
| 4420 } | |
| 4421 } | 4368 } |
| 4422 | 4369 |
| 4423 params.should_enforce_strict_mixed_content_checking = | 4370 params.should_enforce_strict_mixed_content_checking = |
| 4424 frame->shouldEnforceStrictMixedContentChecking(); | 4371 frame->shouldEnforceStrictMixedContentChecking(); |
| 4425 | 4372 |
| 4426 params.has_potentially_trustworthy_unique_origin = | 4373 params.has_potentially_trustworthy_unique_origin = |
| 4427 frame->document().getSecurityOrigin().isUnique() && | 4374 frame->document().getSecurityOrigin().isUnique() && |
| 4428 frame->document().getSecurityOrigin().isPotentiallyTrustworthy(); | 4375 frame->document().getSecurityOrigin().isPotentiallyTrustworthy(); |
| 4429 | 4376 |
| 4430 // Set the URL to be displayed in the browser UI to the user. | 4377 // Set the URL to be displayed in the browser UI to the user. |
| 4431 params.url = GetLoadingUrl(); | 4378 params.url = GetLoadingUrl(); |
| 4432 DCHECK(!is_swapped_out_ || params.url == GURL(kSwappedOutURL)); | |
| 4433 | |
| 4434 if (frame->document().baseURL() != params.url) | 4379 if (frame->document().baseURL() != params.url) |
| 4435 params.base_url = frame->document().baseURL(); | 4380 params.base_url = frame->document().baseURL(); |
| 4436 | 4381 |
| 4437 GetRedirectChain(ds, ¶ms.redirects); | 4382 GetRedirectChain(ds, ¶ms.redirects); |
| 4438 params.should_update_history = | 4383 params.should_update_history = |
| 4439 !ds->hasUnreachableURL() && response.httpStatusCode() != 404; | 4384 !ds->hasUnreachableURL() && response.httpStatusCode() != 404; |
| 4440 | 4385 |
| 4441 params.searchable_form_url = internal_data->searchable_form_url(); | 4386 params.searchable_form_url = internal_data->searchable_form_url(); |
| 4442 params.searchable_form_encoding = internal_data->searchable_form_encoding(); | 4387 params.searchable_form_encoding = internal_data->searchable_form_encoding(); |
| 4443 | 4388 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4545 // process. | 4490 // process. |
| 4546 params.original_request_url = GetOriginalRequestURL(ds); | 4491 params.original_request_url = GetOriginalRequestURL(ds); |
| 4547 | 4492 |
| 4548 params.history_list_was_cleared = | 4493 params.history_list_was_cleared = |
| 4549 navigation_state->request_params().should_clear_history_list; | 4494 navigation_state->request_params().should_clear_history_list; |
| 4550 | 4495 |
| 4551 params.report_type = static_cast<FrameMsg_UILoadMetricsReportType::Value>( | 4496 params.report_type = static_cast<FrameMsg_UILoadMetricsReportType::Value>( |
| 4552 frame->dataSource()->request().inputPerfMetricReportPolicy()); | 4497 frame->dataSource()->request().inputPerfMetricReportPolicy()); |
| 4553 params.ui_timestamp = base::TimeTicks() + base::TimeDelta::FromSecondsD( | 4498 params.ui_timestamp = base::TimeTicks() + base::TimeDelta::FromSecondsD( |
| 4554 frame->dataSource()->request().uiStartTime()); | 4499 frame->dataSource()->request().uiStartTime()); |
| 4555 | |
| 4556 // This message needs to be sent before any of allowScripts(), | |
| 4557 // allowImages(), allowPlugins() is called for the new page, so that when | |
| 4558 // these functions send a ViewHostMsg_ContentBlocked message, it arrives | |
| 4559 // after the FrameHostMsg_DidCommitProvisionalLoad message. | |
| 4560 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); | |
| 4561 } else { | 4500 } else { |
| 4562 // Subframe navigation: the type depends on whether this navigation | 4501 // Subframe navigation: the type depends on whether this navigation |
| 4563 // generated a new session history entry. When they do generate a session | 4502 // generated a new session history entry. When they do generate a session |
| 4564 // history entry, it means the user initiated the navigation and we should | 4503 // history entry, it means the user initiated the navigation and we should |
| 4565 // mark it as such. | 4504 // mark it as such. |
| 4566 if (commit_type == blink::WebStandardCommit) | 4505 if (commit_type == blink::WebStandardCommit) |
| 4567 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; | 4506 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; |
| 4568 else | 4507 else |
| 4569 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; | 4508 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; |
| 4570 | 4509 |
| 4571 DCHECK(!navigation_state->request_params().should_clear_history_list); | 4510 DCHECK(!navigation_state->request_params().should_clear_history_list); |
| 4572 params.history_list_was_cleared = false; | 4511 params.history_list_was_cleared = false; |
| 4573 params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; | 4512 params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; |
| 4513 } | |
| 4574 | 4514 |
| 4575 // Don't send this message while the subframe is swapped out. | 4515 // This message needs to be sent before any of allowScripts(), |
| 4576 if (!is_swapped_out()) | 4516 // allowImages(), allowPlugins() is called for the new page, so that when |
| 4577 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); | 4517 // these functions send a ViewHostMsg_ContentBlocked message, it arrives |
| 4578 } | 4518 // after the FrameHostMsg_DidCommitProvisionalLoad message. |
| 4519 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); | |
| 4579 | 4520 |
| 4580 // If we end up reusing this WebRequest (for example, due to a #ref click), | 4521 // If we end up reusing this WebRequest (for example, due to a #ref click), |
| 4581 // we don't want the transition type to persist. Just clear it. | 4522 // we don't want the transition type to persist. Just clear it. |
| 4582 navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); | 4523 navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); |
| 4583 } | 4524 } |
| 4584 | 4525 |
| 4585 void RenderFrameImpl::didStartLoading(bool to_different_document) { | 4526 void RenderFrameImpl::didStartLoading(bool to_different_document) { |
| 4586 TRACE_EVENT1("navigation", "RenderFrameImpl::didStartLoading", | 4527 TRACE_EVENT1("navigation", "RenderFrameImpl::didStartLoading", |
| 4587 "id", routing_id_); | 4528 "id", routing_id_); |
| 4588 render_view_->FrameDidStartLoading(frame_); | 4529 render_view_->FrameDidStartLoading(frame_); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4721 this, is_content_initiated, render_view_->opener_id_, frame_, | 4662 this, is_content_initiated, render_view_->opener_id_, frame_, |
| 4722 info.urlRequest, info.navigationType, info.defaultPolicy, | 4663 info.urlRequest, info.navigationType, info.defaultPolicy, |
| 4723 is_redirect)) { | 4664 is_redirect)) { |
| 4724 return blink::WebNavigationPolicyIgnore; | 4665 return blink::WebNavigationPolicyIgnore; |
| 4725 } | 4666 } |
| 4726 #endif | 4667 #endif |
| 4727 | 4668 |
| 4728 Referrer referrer( | 4669 Referrer referrer( |
| 4729 RenderViewImpl::GetReferrerFromRequest(frame_, info.urlRequest)); | 4670 RenderViewImpl::GetReferrerFromRequest(frame_, info.urlRequest)); |
| 4730 | 4671 |
| 4731 // TODO(nick): Is consulting |is_main_frame| here correct? | |
| 4732 if (is_main_frame_ && is_swapped_out_) { | |
| 4733 if (info.urlRequest.url() != GURL(kSwappedOutURL)) { | |
| 4734 // Targeted links may try to navigate a swapped out frame. Allow the | |
| 4735 // browser process to navigate the tab instead. Note that it is also | |
| 4736 // possible for non-targeted navigations (from this view) to arrive | |
| 4737 // here just after we are swapped out. It's ok to send them to the | |
| 4738 // browser, as long as they're for the top level frame. | |
| 4739 // TODO(creis): Ensure this supports targeted form submissions when | |
| 4740 // fixing http://crbug.com/101395. | |
| 4741 if (frame_->parent() == NULL) { | |
| 4742 OpenURL(info.urlRequest.url(), referrer, info.defaultPolicy, | |
| 4743 info.replacesCurrentHistoryItem, false); | |
| 4744 return blink::WebNavigationPolicyIgnore; // Suppress the load here. | |
| 4745 } | |
| 4746 | |
| 4747 // We should otherwise ignore in-process iframe navigations, if they | |
| 4748 // arrive just after we are swapped out. | |
| 4749 return blink::WebNavigationPolicyIgnore; | |
| 4750 } | |
| 4751 | |
| 4752 // Allow kSwappedOutURL to complete. | |
| 4753 return info.defaultPolicy; | |
| 4754 } | |
| 4755 | |
| 4756 // Webkit is asking whether to navigate to a new URL. | 4672 // Webkit is asking whether to navigate to a new URL. |
| 4757 // This is fine normally, except if we're showing UI from one security | 4673 // This is fine normally, except if we're showing UI from one security |
| 4758 // context and they're trying to navigate to a different context. | 4674 // context and they're trying to navigate to a different context. |
| 4759 const GURL& url = info.urlRequest.url(); | 4675 const GURL& url = info.urlRequest.url(); |
| 4760 | 4676 |
| 4761 // If the browser is interested, then give it a chance to look at the request. | 4677 // If the browser is interested, then give it a chance to look at the request. |
| 4762 if (is_content_initiated && IsTopLevelNavigation(frame_) && | 4678 if (is_content_initiated && IsTopLevelNavigation(frame_) && |
| 4763 render_view_->renderer_preferences_ | 4679 render_view_->renderer_preferences_ |
| 4764 .browser_handles_all_top_level_requests) { | 4680 .browser_handles_all_top_level_requests) { |
| 4765 OpenURL(url, referrer, info.defaultPolicy, info.replacesCurrentHistoryItem, | 4681 OpenURL(url, referrer, info.defaultPolicy, info.replacesCurrentHistoryItem, |
| (...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5613 RenderViewObserver, render_view_->observers_, Navigate(url)); | 5529 RenderViewObserver, render_view_->observers_, Navigate(url)); |
| 5614 | 5530 |
| 5615 render_view_->history_list_offset_ = | 5531 render_view_->history_list_offset_ = |
| 5616 request_params.current_history_list_offset; | 5532 request_params.current_history_list_offset; |
| 5617 render_view_->history_list_length_ = | 5533 render_view_->history_list_length_ = |
| 5618 request_params.current_history_list_length; | 5534 request_params.current_history_list_length; |
| 5619 if (request_params.should_clear_history_list) { | 5535 if (request_params.should_clear_history_list) { |
| 5620 CHECK_EQ(-1, render_view_->history_list_offset_); | 5536 CHECK_EQ(-1, render_view_->history_list_offset_); |
| 5621 CHECK_EQ(0, render_view_->history_list_length_); | 5537 CHECK_EQ(0, render_view_->history_list_length_); |
| 5622 } | 5538 } |
| 5623 | |
| 5624 if (!is_swapped_out_ || frame_->parent()) | |
| 5625 return; | |
| 5626 | |
| 5627 // This is a swapped out main frame, so swap the renderer back in. | |
| 5628 // We marked the view as hidden when swapping the view out, so be sure to | |
| 5629 // reset the visibility state before navigating to the new URL. | |
| 5630 render_view_->webview()->setVisibilityState( | |
| 5631 render_view_->visibilityState(), false); | |
| 5632 | |
| 5633 // If this is an attempt to reload while we are swapped out, we should not | |
| 5634 // reload swappedout://, but the previous page, which is stored in | |
| 5635 // params.state. Setting is_reload to false will treat this like a back | |
| 5636 // navigation to accomplish that. | |
| 5637 *is_reload = false; | |
| 5638 *cache_policy = WebURLRequest::ReloadIgnoringCacheData; | |
| 5639 | |
| 5640 // We refresh timezone when a view is swapped in since timezone | |
| 5641 // can get out of sync when the system timezone is updated while | |
| 5642 // the view is swapped out. | |
| 5643 RenderThreadImpl::NotifyTimezoneChange(); | |
| 5644 | |
| 5645 render_view_->SetSwappedOut(false); | |
| 5646 is_swapped_out_ = false; | |
| 5647 return; | |
| 5648 } | 5539 } |
| 5649 | 5540 |
| 5650 void RenderFrameImpl::BeginNavigation(blink::WebURLRequest* request, | 5541 void RenderFrameImpl::BeginNavigation(blink::WebURLRequest* request, |
| 5651 bool should_replace_current_entry, | 5542 bool should_replace_current_entry, |
| 5652 bool is_client_redirect) { | 5543 bool is_client_redirect) { |
| 5653 CHECK(IsBrowserSideNavigationEnabled()); | 5544 CHECK(IsBrowserSideNavigationEnabled()); |
| 5654 DCHECK(request); | 5545 DCHECK(request); |
| 5655 // TODO(clamy): Execute the beforeunload event. | 5546 // TODO(clamy): Execute the beforeunload event. |
| 5656 | 5547 |
| 5657 // Note: At this stage, the goal is to apply all the modifications the | 5548 // Note: At this stage, the goal is to apply all the modifications the |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6084 int match_count, | 5975 int match_count, |
| 6085 int ordinal, | 5976 int ordinal, |
| 6086 const WebRect& selection_rect, | 5977 const WebRect& selection_rect, |
| 6087 bool final_status_update) { | 5978 bool final_status_update) { |
| 6088 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count, | 5979 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count, |
| 6089 selection_rect, ordinal, | 5980 selection_rect, ordinal, |
| 6090 final_status_update)); | 5981 final_status_update)); |
| 6091 } | 5982 } |
| 6092 | 5983 |
| 6093 } // namespace content | 5984 } // namespace content |
| OLD | NEW |