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/browser/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
(...skipping 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1534 // out-of-process iframes implementation is ready, we should check for | 1534 // out-of-process iframes implementation is ready, we should check for |
1535 // cross-site URLs that are not allowed to commit in this process. | 1535 // cross-site URLs that are not allowed to commit in this process. |
1536 | 1536 |
1537 // Give the client a chance to disallow URLs from committing. | 1537 // Give the client a chance to disallow URLs from committing. |
1538 return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); | 1538 return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); |
1539 } | 1539 } |
1540 | 1540 |
1541 void RenderFrameHostImpl::Navigate( | 1541 void RenderFrameHostImpl::Navigate( |
1542 const CommonNavigationParams& common_params, | 1542 const CommonNavigationParams& common_params, |
1543 const StartNavigationParams& start_params, | 1543 const StartNavigationParams& start_params, |
1544 const CommitNavigationParams& commit_params, | 1544 const RequestNavigationParams& request_params) { |
1545 const HistoryNavigationParams& history_params) { | |
1546 TRACE_EVENT0("navigation", "RenderFrameHostImpl::Navigate"); | 1545 TRACE_EVENT0("navigation", "RenderFrameHostImpl::Navigate"); |
1547 // Browser plugin guests are not allowed to navigate outside web-safe schemes, | 1546 // Browser plugin guests are not allowed to navigate outside web-safe schemes, |
1548 // so do not grant them the ability to request additional URLs. | 1547 // so do not grant them the ability to request additional URLs. |
1549 if (!GetProcess()->IsIsolatedGuest()) { | 1548 if (!GetProcess()->IsIsolatedGuest()) { |
1550 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( | 1549 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( |
1551 GetProcess()->GetID(), common_params.url); | 1550 GetProcess()->GetID(), common_params.url); |
1552 if (common_params.url.SchemeIs(url::kDataScheme) && | 1551 if (common_params.url.SchemeIs(url::kDataScheme) && |
1553 common_params.base_url_for_data_url.SchemeIs(url::kFileScheme)) { | 1552 common_params.base_url_for_data_url.SchemeIs(url::kFileScheme)) { |
1554 // If 'data:' is used, and we have a 'file:' base url, grant access to | 1553 // If 'data:' is used, and we have a 'file:' base url, grant access to |
1555 // local files. | 1554 // local files. |
1556 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( | 1555 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( |
1557 GetProcess()->GetID(), common_params.base_url_for_data_url); | 1556 GetProcess()->GetID(), common_params.base_url_for_data_url); |
1558 } | 1557 } |
1559 } | 1558 } |
1560 | 1559 |
1561 // We may be returning to an existing NavigationEntry that had been granted | 1560 // We may be returning to an existing NavigationEntry that had been granted |
1562 // file access. If this is a different process, we will need to grant the | 1561 // file access. If this is a different process, we will need to grant the |
1563 // access again. The files listed in the page state are validated when they | 1562 // access again. The files listed in the page state are validated when they |
1564 // are received from the renderer to prevent abuse. | 1563 // are received from the renderer to prevent abuse. |
1565 if (history_params.page_state.IsValid()) { | 1564 if (request_params.page_state.IsValid()) { |
1566 render_view_host_->GrantFileAccessFromPageState(history_params.page_state); | 1565 render_view_host_->GrantFileAccessFromPageState(request_params.page_state); |
1567 } | 1566 } |
1568 | 1567 |
1569 // Only send the message if we aren't suspended at the start of a cross-site | 1568 // Only send the message if we aren't suspended at the start of a cross-site |
1570 // request. | 1569 // request. |
1571 if (navigations_suspended_) { | 1570 if (navigations_suspended_) { |
1572 // Shouldn't be possible to have a second navigation while suspended, since | 1571 // Shouldn't be possible to have a second navigation while suspended, since |
1573 // navigations will only be suspended during a cross-site request. If a | 1572 // navigations will only be suspended during a cross-site request. If a |
1574 // second navigation occurs, RenderFrameHostManager will cancel this pending | 1573 // second navigation occurs, RenderFrameHostManager will cancel this pending |
1575 // RFH and create a new pending RFH. | 1574 // RFH and create a new pending RFH. |
1576 DCHECK(!suspended_nav_params_.get()); | 1575 DCHECK(!suspended_nav_params_.get()); |
1577 suspended_nav_params_.reset(new NavigationParams( | 1576 suspended_nav_params_.reset( |
1578 common_params, start_params, commit_params, history_params)); | 1577 new NavigationParams(common_params, start_params, request_params)); |
1579 } else { | 1578 } else { |
1580 // Get back to a clean state, in case we start a new navigation without | 1579 // Get back to a clean state, in case we start a new navigation without |
1581 // completing a RFH swap or unload handler. | 1580 // completing a RFH swap or unload handler. |
1582 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 1581 SetState(RenderFrameHostImpl::STATE_DEFAULT); |
1583 | 1582 |
1584 Send(new FrameMsg_Navigate(routing_id_, common_params, start_params, | 1583 Send(new FrameMsg_Navigate(routing_id_, common_params, start_params, |
1585 commit_params, history_params)); | 1584 request_params)); |
1586 } | 1585 } |
1587 | 1586 |
1588 // Force the throbber to start. We do this because Blink's "started | 1587 // Force the throbber to start. We do this because Blink's "started |
1589 // loading" message will be received asynchronously from the UI of the | 1588 // loading" message will be received asynchronously from the UI of the |
1590 // browser. But we want to keep the throbber in sync with what's happening | 1589 // browser. But we want to keep the throbber in sync with what's happening |
1591 // in the UI. For example, we want to start throbbing immediately when the | 1590 // in the UI. For example, we want to start throbbing immediately when the |
1592 // user navigates even if the renderer is delayed. There is also an issue | 1591 // user navigates even if the renderer is delayed. There is also an issue |
1593 // with the throbber starting because the WebUI (which controls whether the | 1592 // with the throbber starting because the WebUI (which controls whether the |
1594 // favicon is displayed) happens synchronously. If the start loading | 1593 // favicon is displayed) happens synchronously. If the start loading |
1595 // messages was asynchronous, then the default favicon would flash in. | 1594 // messages was asynchronous, then the default favicon would flash in. |
1596 // | 1595 // |
1597 // Blink doesn't send throb notifications for JavaScript URLs, so we | 1596 // Blink doesn't send throb notifications for JavaScript URLs, so we |
1598 // don't want to either. | 1597 // don't want to either. |
1599 if (!common_params.url.SchemeIs(url::kJavaScriptScheme)) | 1598 if (!common_params.url.SchemeIs(url::kJavaScriptScheme)) |
1600 delegate_->DidStartLoading(this, true); | 1599 delegate_->DidStartLoading(this, true); |
1601 } | 1600 } |
1602 | 1601 |
1603 void RenderFrameHostImpl::NavigateToURL(const GURL& url) { | 1602 void RenderFrameHostImpl::NavigateToURL(const GURL& url) { |
1604 CommonNavigationParams common_params( | 1603 CommonNavigationParams common_params( |
1605 url, Referrer(), ui::PAGE_TRANSITION_LINK, FrameMsg_Navigate_Type::NORMAL, | 1604 url, Referrer(), ui::PAGE_TRANSITION_LINK, FrameMsg_Navigate_Type::NORMAL, |
1606 true, base::TimeTicks::Now(), FrameMsg_UILoadMetricsReportType::NO_REPORT, | 1605 true, base::TimeTicks::Now(), FrameMsg_UILoadMetricsReportType::NO_REPORT, |
1607 GURL(), GURL()); | 1606 GURL(), GURL()); |
1608 Navigate(common_params, StartNavigationParams(), CommitNavigationParams(), | 1607 Navigate(common_params, StartNavigationParams(), RequestNavigationParams()); |
1609 HistoryNavigationParams()); | |
1610 } | 1608 } |
1611 | 1609 |
1612 void RenderFrameHostImpl::OpenURL(const FrameHostMsg_OpenURL_Params& params, | 1610 void RenderFrameHostImpl::OpenURL(const FrameHostMsg_OpenURL_Params& params, |
1613 SiteInstance* source_site_instance) { | 1611 SiteInstance* source_site_instance) { |
1614 GURL validated_url(params.url); | 1612 GURL validated_url(params.url); |
1615 GetProcess()->FilterURL(false, &validated_url); | 1613 GetProcess()->FilterURL(false, &validated_url); |
1616 | 1614 |
1617 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OpenURL", "url", | 1615 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OpenURL", "url", |
1618 validated_url.possibly_invalid_spec()); | 1616 validated_url.possibly_invalid_spec()); |
1619 frame_tree_node_->navigator()->RequestOpenURL( | 1617 frame_tree_node_->navigator()->RequestOpenURL( |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1711 // correctly while waiting for a response. | 1709 // correctly while waiting for a response. |
1712 if (is_waiting && dialog_was_suppressed) | 1710 if (is_waiting && dialog_was_suppressed) |
1713 render_view_host_->delegate_->RendererUnresponsive(render_view_host_); | 1711 render_view_host_->delegate_->RendererUnresponsive(render_view_host_); |
1714 } | 1712 } |
1715 | 1713 |
1716 // PlzNavigate | 1714 // PlzNavigate |
1717 void RenderFrameHostImpl::CommitNavigation( | 1715 void RenderFrameHostImpl::CommitNavigation( |
1718 ResourceResponse* response, | 1716 ResourceResponse* response, |
1719 scoped_ptr<StreamHandle> body, | 1717 scoped_ptr<StreamHandle> body, |
1720 const CommonNavigationParams& common_params, | 1718 const CommonNavigationParams& common_params, |
1721 const CommitNavigationParams& commit_params, | 1719 const RequestNavigationParams& request_params) { |
1722 const HistoryNavigationParams& history_params) { | |
1723 DCHECK((response && body.get()) || | 1720 DCHECK((response && body.get()) || |
1724 !NavigationRequest::ShouldMakeNetworkRequest(common_params.url)); | 1721 !NavigationRequest::ShouldMakeNetworkRequest(common_params.url)); |
1725 // TODO(clamy): Check if we have to add security checks for the browser plugin | 1722 // TODO(clamy): Check if we have to add security checks for the browser plugin |
1726 // guests. | 1723 // guests. |
1727 | 1724 |
1728 // Get back to a clean state, in case we start a new navigation without | 1725 // Get back to a clean state, in case we start a new navigation without |
1729 // completing a RFH swap or unload handler. | 1726 // completing a RFH swap or unload handler. |
1730 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 1727 SetState(RenderFrameHostImpl::STATE_DEFAULT); |
1731 | 1728 |
1732 const GURL body_url = body.get() ? body->GetURL() : GURL(); | 1729 const GURL body_url = body.get() ? body->GetURL() : GURL(); |
1733 const ResourceResponseHead head = response ? | 1730 const ResourceResponseHead head = response ? |
1734 response->head : ResourceResponseHead(); | 1731 response->head : ResourceResponseHead(); |
1735 Send(new FrameMsg_CommitNavigation(routing_id_, head, body_url, common_params, | 1732 Send(new FrameMsg_CommitNavigation(routing_id_, head, body_url, common_params, |
1736 commit_params, history_params)); | 1733 request_params)); |
1737 // TODO(clamy): Check if we should start the throbber for non javascript urls | 1734 // TODO(clamy): Check if we should start the throbber for non javascript urls |
1738 // here. | 1735 // here. |
1739 | 1736 |
1740 // TODO(clamy): Release the stream handle once the renderer has finished | 1737 // TODO(clamy): Release the stream handle once the renderer has finished |
1741 // reading it. | 1738 // reading it. |
1742 stream_handle_ = body.Pass(); | 1739 stream_handle_ = body.Pass(); |
1743 } | 1740 } |
1744 | 1741 |
1745 void RenderFrameHostImpl::SetUpMojoIfNeeded() { | 1742 void RenderFrameHostImpl::SetUpMojoIfNeeded() { |
1746 if (service_registry_.get()) | 1743 if (service_registry_.get()) |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1941 "RenderFrameHostImpl navigation suspended", this); | 1938 "RenderFrameHostImpl navigation suspended", this); |
1942 } | 1939 } |
1943 | 1940 |
1944 if (!suspend && suspended_nav_params_) { | 1941 if (!suspend && suspended_nav_params_) { |
1945 // There's navigation message params waiting to be sent. Now that we're not | 1942 // There's navigation message params waiting to be sent. Now that we're not |
1946 // suspended anymore, resume navigation by sending them. If we were swapped | 1943 // suspended anymore, resume navigation by sending them. If we were swapped |
1947 // out, we should also stop filtering out the IPC messages now. | 1944 // out, we should also stop filtering out the IPC messages now. |
1948 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 1945 SetState(RenderFrameHostImpl::STATE_DEFAULT); |
1949 | 1946 |
1950 DCHECK(!proceed_time.is_null()); | 1947 DCHECK(!proceed_time.is_null()); |
1951 suspended_nav_params_->commit_params.browser_navigation_start = | 1948 suspended_nav_params_->request_params.browser_navigation_start = |
1952 proceed_time; | 1949 proceed_time; |
1953 Send(new FrameMsg_Navigate(routing_id_, | 1950 Send(new FrameMsg_Navigate(routing_id_, |
1954 suspended_nav_params_->common_params, | 1951 suspended_nav_params_->common_params, |
1955 suspended_nav_params_->start_params, | 1952 suspended_nav_params_->start_params, |
1956 suspended_nav_params_->commit_params, | 1953 suspended_nav_params_->request_params)); |
1957 suspended_nav_params_->history_params)); | |
1958 suspended_nav_params_.reset(); | 1954 suspended_nav_params_.reset(); |
1959 } | 1955 } |
1960 } | 1956 } |
1961 | 1957 |
1962 void RenderFrameHostImpl::CancelSuspendedNavigations() { | 1958 void RenderFrameHostImpl::CancelSuspendedNavigations() { |
1963 // Clear any state if a pending navigation is canceled or preempted. | 1959 // Clear any state if a pending navigation is canceled or preempted. |
1964 if (suspended_nav_params_) | 1960 if (suspended_nav_params_) |
1965 suspended_nav_params_.reset(); | 1961 suspended_nav_params_.reset(); |
1966 | 1962 |
1967 TRACE_EVENT_ASYNC_END0("navigation", | 1963 TRACE_EVENT_ASYNC_END0("navigation", |
1968 "RenderFrameHostImpl navigation suspended", this); | 1964 "RenderFrameHostImpl navigation suspended", this); |
1969 navigations_suspended_ = false; | 1965 navigations_suspended_ = false; |
1970 } | 1966 } |
1971 | 1967 |
1972 void RenderFrameHostImpl::DidUseGeolocationPermission() { | 1968 void RenderFrameHostImpl::DidUseGeolocationPermission() { |
1973 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); | 1969 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); |
1974 GetContentClient()->browser()->RegisterPermissionUsage( | 1970 GetContentClient()->browser()->RegisterPermissionUsage( |
1975 PERMISSION_GEOLOCATION, | 1971 PERMISSION_GEOLOCATION, |
1976 delegate_->GetAsWebContents(), | 1972 delegate_->GetAsWebContents(), |
1977 GetLastCommittedURL().GetOrigin(), | 1973 GetLastCommittedURL().GetOrigin(), |
1978 top_frame->GetLastCommittedURL().GetOrigin()); | 1974 top_frame->GetLastCommittedURL().GetOrigin()); |
1979 } | 1975 } |
1980 | 1976 |
1981 } // namespace content | 1977 } // namespace content |
OLD | NEW |