| 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 1512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1523 | 1523 |
| 1524 bool RenderFrameHostImpl::CanCommitURL(const GURL& url) { | 1524 bool RenderFrameHostImpl::CanCommitURL(const GURL& url) { |
| 1525 // TODO(creis): We should also check for WebUI pages here. Also, when the | 1525 // TODO(creis): We should also check for WebUI pages here. Also, when the |
| 1526 // out-of-process iframes implementation is ready, we should check for | 1526 // out-of-process iframes implementation is ready, we should check for |
| 1527 // cross-site URLs that are not allowed to commit in this process. | 1527 // cross-site URLs that are not allowed to commit in this process. |
| 1528 | 1528 |
| 1529 // Give the client a chance to disallow URLs from committing. | 1529 // Give the client a chance to disallow URLs from committing. |
| 1530 return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); | 1530 return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); |
| 1531 } | 1531 } |
| 1532 | 1532 |
| 1533 void RenderFrameHostImpl::Navigate(const FrameMsg_Navigate_Params& params) { | 1533 void RenderFrameHostImpl::Navigate( |
| 1534 const CommonNavigationParams& common_params, |
| 1535 const StartNavigationParams& start_params, |
| 1536 const CommitNavigationParams& commit_params, |
| 1537 const HistoryNavigationParams& history_params) { |
| 1534 TRACE_EVENT0("navigation", "RenderFrameHostImpl::Navigate"); | 1538 TRACE_EVENT0("navigation", "RenderFrameHostImpl::Navigate"); |
| 1535 // Browser plugin guests are not allowed to navigate outside web-safe schemes, | 1539 // Browser plugin guests are not allowed to navigate outside web-safe schemes, |
| 1536 // so do not grant them the ability to request additional URLs. | 1540 // so do not grant them the ability to request additional URLs. |
| 1537 if (!GetProcess()->IsIsolatedGuest()) { | 1541 if (!GetProcess()->IsIsolatedGuest()) { |
| 1538 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( | 1542 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( |
| 1539 GetProcess()->GetID(), params.common_params.url); | 1543 GetProcess()->GetID(), common_params.url); |
| 1540 if (params.common_params.url.SchemeIs(url::kDataScheme) && | 1544 if (common_params.url.SchemeIs(url::kDataScheme) && |
| 1541 params.common_params.base_url_for_data_url.SchemeIs(url::kFileScheme)) { | 1545 common_params.base_url_for_data_url.SchemeIs(url::kFileScheme)) { |
| 1542 // If 'data:' is used, and we have a 'file:' base url, grant access to | 1546 // If 'data:' is used, and we have a 'file:' base url, grant access to |
| 1543 // local files. | 1547 // local files. |
| 1544 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( | 1548 ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( |
| 1545 GetProcess()->GetID(), params.common_params.base_url_for_data_url); | 1549 GetProcess()->GetID(), common_params.base_url_for_data_url); |
| 1546 } | 1550 } |
| 1547 } | 1551 } |
| 1548 | 1552 |
| 1549 // We may be returning to an existing NavigationEntry that had been granted | 1553 // We may be returning to an existing NavigationEntry that had been granted |
| 1550 // file access. If this is a different process, we will need to grant the | 1554 // file access. If this is a different process, we will need to grant the |
| 1551 // access again. The files listed in the page state are validated when they | 1555 // access again. The files listed in the page state are validated when they |
| 1552 // are received from the renderer to prevent abuse. | 1556 // are received from the renderer to prevent abuse. |
| 1553 if (params.history_params.page_state.IsValid()) { | 1557 if (history_params.page_state.IsValid()) { |
| 1554 render_view_host_->GrantFileAccessFromPageState( | 1558 render_view_host_->GrantFileAccessFromPageState(history_params.page_state); |
| 1555 params.history_params.page_state); | |
| 1556 } | 1559 } |
| 1557 | 1560 |
| 1558 // Only send the message if we aren't suspended at the start of a cross-site | 1561 // Only send the message if we aren't suspended at the start of a cross-site |
| 1559 // request. | 1562 // request. |
| 1560 if (navigations_suspended_) { | 1563 if (navigations_suspended_) { |
| 1561 // Shouldn't be possible to have a second navigation while suspended, since | 1564 // Shouldn't be possible to have a second navigation while suspended, since |
| 1562 // navigations will only be suspended during a cross-site request. If a | 1565 // navigations will only be suspended during a cross-site request. If a |
| 1563 // second navigation occurs, RenderFrameHostManager will cancel this pending | 1566 // second navigation occurs, RenderFrameHostManager will cancel this pending |
| 1564 // RFH and create a new pending RFH. | 1567 // RFH and create a new pending RFH. |
| 1565 DCHECK(!suspended_nav_params_.get()); | 1568 DCHECK(!suspended_nav_params_.get()); |
| 1566 suspended_nav_params_.reset(new FrameMsg_Navigate_Params(params)); | 1569 suspended_nav_params_.reset(new NavigationParams( |
| 1570 common_params, start_params, commit_params, history_params)); |
| 1567 } else { | 1571 } else { |
| 1568 // Get back to a clean state, in case we start a new navigation without | 1572 // Get back to a clean state, in case we start a new navigation without |
| 1569 // completing a RFH swap or unload handler. | 1573 // completing a RFH swap or unload handler. |
| 1570 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 1574 SetState(RenderFrameHostImpl::STATE_DEFAULT); |
| 1571 | 1575 |
| 1572 Send(new FrameMsg_Navigate(routing_id_, params)); | 1576 Send(new FrameMsg_Navigate(routing_id_, common_params, start_params, |
| 1577 commit_params, history_params)); |
| 1573 } | 1578 } |
| 1574 | 1579 |
| 1575 // Force the throbber to start. We do this because Blink's "started | 1580 // Force the throbber to start. We do this because Blink's "started |
| 1576 // loading" message will be received asynchronously from the UI of the | 1581 // loading" message will be received asynchronously from the UI of the |
| 1577 // browser. But we want to keep the throbber in sync with what's happening | 1582 // browser. But we want to keep the throbber in sync with what's happening |
| 1578 // in the UI. For example, we want to start throbbing immediately when the | 1583 // in the UI. For example, we want to start throbbing immediately when the |
| 1579 // user navigates even if the renderer is delayed. There is also an issue | 1584 // user navigates even if the renderer is delayed. There is also an issue |
| 1580 // with the throbber starting because the WebUI (which controls whether the | 1585 // with the throbber starting because the WebUI (which controls whether the |
| 1581 // favicon is displayed) happens synchronously. If the start loading | 1586 // favicon is displayed) happens synchronously. If the start loading |
| 1582 // messages was asynchronous, then the default favicon would flash in. | 1587 // messages was asynchronous, then the default favicon would flash in. |
| 1583 // | 1588 // |
| 1584 // Blink doesn't send throb notifications for JavaScript URLs, so we | 1589 // Blink doesn't send throb notifications for JavaScript URLs, so we |
| 1585 // don't want to either. | 1590 // don't want to either. |
| 1586 if (!params.common_params.url.SchemeIs(url::kJavaScriptScheme)) | 1591 if (!common_params.url.SchemeIs(url::kJavaScriptScheme)) |
| 1587 delegate_->DidStartLoading(this, true); | 1592 delegate_->DidStartLoading(this, true); |
| 1588 } | 1593 } |
| 1589 | 1594 |
| 1590 void RenderFrameHostImpl::NavigateToURL(const GURL& url) { | 1595 void RenderFrameHostImpl::NavigateToURL(const GURL& url) { |
| 1591 FrameMsg_Navigate_Params params; | 1596 CommonNavigationParams common_params( |
| 1592 params.common_params.url = url; | 1597 url, Referrer(), ui::PAGE_TRANSITION_LINK, FrameMsg_Navigate_Type::NORMAL, |
| 1593 params.common_params.transition = ui::PAGE_TRANSITION_LINK; | 1598 true, base::TimeTicks::Now(), FrameMsg_UILoadMetricsReportType::NO_REPORT, |
| 1594 params.common_params.navigation_type = FrameMsg_Navigate_Type::NORMAL; | 1599 GURL(), GURL()); |
| 1595 params.commit_params.browser_navigation_start = base::TimeTicks::Now(); | 1600 Navigate(common_params, StartNavigationParams(), CommitNavigationParams(), |
| 1596 params.history_params.page_id = -1; | 1601 HistoryNavigationParams()); |
| 1597 params.history_params.pending_history_list_offset = -1; | |
| 1598 params.history_params.current_history_list_offset = -1; | |
| 1599 params.history_params.current_history_list_length = 0; | |
| 1600 Navigate(params); | |
| 1601 } | 1602 } |
| 1602 | 1603 |
| 1603 void RenderFrameHostImpl::OpenURL(const FrameHostMsg_OpenURL_Params& params, | 1604 void RenderFrameHostImpl::OpenURL(const FrameHostMsg_OpenURL_Params& params, |
| 1604 SiteInstance* source_site_instance) { | 1605 SiteInstance* source_site_instance) { |
| 1605 GURL validated_url(params.url); | 1606 GURL validated_url(params.url); |
| 1606 GetProcess()->FilterURL(false, &validated_url); | 1607 GetProcess()->FilterURL(false, &validated_url); |
| 1607 | 1608 |
| 1608 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OpenURL", "url", | 1609 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OpenURL", "url", |
| 1609 validated_url.possibly_invalid_spec()); | 1610 validated_url.possibly_invalid_spec()); |
| 1610 frame_tree_node_->navigator()->RequestOpenURL( | 1611 frame_tree_node_->navigator()->RequestOpenURL( |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1934 | 1935 |
| 1935 if (!suspend && suspended_nav_params_) { | 1936 if (!suspend && suspended_nav_params_) { |
| 1936 // There's navigation message params waiting to be sent. Now that we're not | 1937 // There's navigation message params waiting to be sent. Now that we're not |
| 1937 // suspended anymore, resume navigation by sending them. If we were swapped | 1938 // suspended anymore, resume navigation by sending them. If we were swapped |
| 1938 // out, we should also stop filtering out the IPC messages now. | 1939 // out, we should also stop filtering out the IPC messages now. |
| 1939 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 1940 SetState(RenderFrameHostImpl::STATE_DEFAULT); |
| 1940 | 1941 |
| 1941 DCHECK(!proceed_time.is_null()); | 1942 DCHECK(!proceed_time.is_null()); |
| 1942 suspended_nav_params_->commit_params.browser_navigation_start = | 1943 suspended_nav_params_->commit_params.browser_navigation_start = |
| 1943 proceed_time; | 1944 proceed_time; |
| 1944 Send(new FrameMsg_Navigate(routing_id_, *suspended_nav_params_)); | 1945 Send(new FrameMsg_Navigate(routing_id_, |
| 1946 suspended_nav_params_->common_params, |
| 1947 suspended_nav_params_->start_params, |
| 1948 suspended_nav_params_->commit_params, |
| 1949 suspended_nav_params_->history_params)); |
| 1945 suspended_nav_params_.reset(); | 1950 suspended_nav_params_.reset(); |
| 1946 } | 1951 } |
| 1947 } | 1952 } |
| 1948 | 1953 |
| 1949 void RenderFrameHostImpl::CancelSuspendedNavigations() { | 1954 void RenderFrameHostImpl::CancelSuspendedNavigations() { |
| 1950 // Clear any state if a pending navigation is canceled or preempted. | 1955 // Clear any state if a pending navigation is canceled or preempted. |
| 1951 if (suspended_nav_params_) | 1956 if (suspended_nav_params_) |
| 1952 suspended_nav_params_.reset(); | 1957 suspended_nav_params_.reset(); |
| 1953 | 1958 |
| 1954 TRACE_EVENT_ASYNC_END0("navigation", | 1959 TRACE_EVENT_ASYNC_END0("navigation", |
| 1955 "RenderFrameHostImpl navigation suspended", this); | 1960 "RenderFrameHostImpl navigation suspended", this); |
| 1956 navigations_suspended_ = false; | 1961 navigations_suspended_ = false; |
| 1957 } | 1962 } |
| 1958 | 1963 |
| 1959 void RenderFrameHostImpl::DidUseGeolocationPermission() { | 1964 void RenderFrameHostImpl::DidUseGeolocationPermission() { |
| 1960 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); | 1965 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); |
| 1961 GetContentClient()->browser()->RegisterPermissionUsage( | 1966 GetContentClient()->browser()->RegisterPermissionUsage( |
| 1962 PERMISSION_GEOLOCATION, | 1967 PERMISSION_GEOLOCATION, |
| 1963 delegate_->GetAsWebContents(), | 1968 delegate_->GetAsWebContents(), |
| 1964 GetLastCommittedURL().GetOrigin(), | 1969 GetLastCommittedURL().GetOrigin(), |
| 1965 top_frame->GetLastCommittedURL().GetOrigin()); | 1970 top_frame->GetLastCommittedURL().GetOrigin()); |
| 1966 } | 1971 } |
| 1967 | 1972 |
| 1968 } // namespace content | 1973 } // namespace content |
| OLD | NEW |