| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/web_contents/web_contents_impl.h" | 5 #include "content/browser/web_contents/web_contents_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 ->render_manager() | 195 ->render_manager() |
| 196 ->GetRenderWidgetHostView(); | 196 ->GetRenderWidgetHostView(); |
| 197 set->insert(rwhv); | 197 set->insert(rwhv); |
| 198 } | 198 } |
| 199 | 199 |
| 200 void SetAccessibilityModeOnFrame(AccessibilityMode mode, | 200 void SetAccessibilityModeOnFrame(AccessibilityMode mode, |
| 201 RenderFrameHost* frame_host) { | 201 RenderFrameHost* frame_host) { |
| 202 static_cast<RenderFrameHostImpl*>(frame_host)->SetAccessibilityMode(mode); | 202 static_cast<RenderFrameHostImpl*>(frame_host)->SetAccessibilityMode(mode); |
| 203 } | 203 } |
| 204 | 204 |
| 205 // Enable sudden termination for the current RenderFrameHost of |
| 206 // |frame_tree_node| if the ID of its SiteInstance is |site_instance_id|. Used |
| 207 // with FrameTree::ForEach. |
| 208 bool EnableSuddenTermination(int32 site_instance_id, |
| 209 FrameTreeNode* frame_tree_node) { |
| 210 if (frame_tree_node->current_frame_host()->GetSiteInstance()->GetId() |
| 211 == site_instance_id) { |
| 212 frame_tree_node->current_frame_host() |
| 213 ->set_override_sudden_termination_status(true); |
| 214 } |
| 215 return true; |
| 216 } |
| 217 |
| 218 // Returns false and sets |sudden_termination_allowed| to false if sudden |
| 219 // termination is not allowed for the current RenderFrameHost of |
| 220 // |frame_tree_node|. Used with FrameTree::ForEach. |
| 221 bool SuddenTerminationAllowed(bool* sudden_termination_allowed, |
| 222 FrameTreeNode* frame_tree_node) { |
| 223 if (frame_tree_node->current_frame_host()->SuddenTerminationAllowed()) |
| 224 return true; |
| 225 *sudden_termination_allowed = false; |
| 226 return false; |
| 227 } |
| 228 |
| 205 } // namespace | 229 } // namespace |
| 206 | 230 |
| 207 WebContents* WebContents::Create(const WebContents::CreateParams& params) { | 231 WebContents* WebContents::Create(const WebContents::CreateParams& params) { |
| 208 return WebContentsImpl::CreateWithOpener( | 232 return WebContentsImpl::CreateWithOpener( |
| 209 params, static_cast<WebContentsImpl*>(params.opener)); | 233 params, static_cast<WebContentsImpl*>(params.opener)); |
| 210 } | 234 } |
| 211 | 235 |
| 212 WebContents* WebContents::CreateWithSessionStorage( | 236 WebContents* WebContents::CreateWithSessionStorage( |
| 213 const WebContents::CreateParams& params, | 237 const WebContents::CreateParams& params, |
| 214 const SessionStorageNamespaceMap& session_storage_namespace_map) { | 238 const SessionStorageNamespaceMap& session_storage_namespace_map) { |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 if (view_) | 658 if (view_) |
| 635 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); | 659 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
| 636 } | 660 } |
| 637 } | 661 } |
| 638 | 662 |
| 639 RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { | 663 RenderProcessHost* WebContentsImpl::GetRenderProcessHost() const { |
| 640 RenderViewHostImpl* host = GetRenderManager()->current_host(); | 664 RenderViewHostImpl* host = GetRenderManager()->current_host(); |
| 641 return host ? host->GetProcess() : NULL; | 665 return host ? host->GetProcess() : NULL; |
| 642 } | 666 } |
| 643 | 667 |
| 644 RenderFrameHost* WebContentsImpl::GetMainFrame() { | 668 RenderFrameHostImpl* WebContentsImpl::GetMainFrame() { |
| 645 return frame_tree_.root()->current_frame_host(); | 669 return frame_tree_.root()->current_frame_host(); |
| 646 } | 670 } |
| 647 | 671 |
| 648 RenderFrameHost* WebContentsImpl::GetFocusedFrame() { | 672 RenderFrameHost* WebContentsImpl::GetFocusedFrame() { |
| 649 if (!frame_tree_.GetFocusedFrame()) | 673 if (!frame_tree_.GetFocusedFrame()) |
| 650 return NULL; | 674 return NULL; |
| 651 return frame_tree_.GetFocusedFrame()->current_frame_host(); | 675 return frame_tree_.GetFocusedFrame()->current_frame_host(); |
| 652 } | 676 } |
| 653 | 677 |
| 654 void WebContentsImpl::ForEachFrame( | 678 void WebContentsImpl::ForEachFrame( |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 } | 799 } |
| 776 | 800 |
| 777 bool WebContentsImpl::IsFullAccessibilityModeForTesting() const { | 801 bool WebContentsImpl::IsFullAccessibilityModeForTesting() const { |
| 778 return accessibility_mode_ == AccessibilityModeComplete; | 802 return accessibility_mode_ == AccessibilityModeComplete; |
| 779 } | 803 } |
| 780 | 804 |
| 781 #if defined(OS_WIN) | 805 #if defined(OS_WIN) |
| 782 void WebContentsImpl::SetParentNativeViewAccessible( | 806 void WebContentsImpl::SetParentNativeViewAccessible( |
| 783 gfx::NativeViewAccessible accessible_parent) { | 807 gfx::NativeViewAccessible accessible_parent) { |
| 784 accessible_parent_ = accessible_parent; | 808 accessible_parent_ = accessible_parent; |
| 785 RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); | 809 RenderFrameHostImpl* rfh = GetMainFrame(); |
| 786 if (rfh) | 810 if (rfh) |
| 787 rfh->SetParentNativeViewAccessible(accessible_parent); | 811 rfh->SetParentNativeViewAccessible(accessible_parent); |
| 788 } | 812 } |
| 789 #endif | 813 #endif |
| 790 | 814 |
| 791 const base::string16& WebContentsImpl::GetTitle() const { | 815 const base::string16& WebContentsImpl::GetTitle() const { |
| 792 // Transient entries take precedence. They are used for interstitial pages | 816 // Transient entries take precedence. They are used for interstitial pages |
| 793 // that are shown on top of existing pages. | 817 // that are shown on top of existing pages. |
| 794 NavigationEntry* entry = controller_.GetTransientEntry(); | 818 NavigationEntry* entry = controller_.GetTransientEntry(); |
| 795 std::string accept_languages = | 819 std::string accept_languages = |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1104 } | 1128 } |
| 1105 | 1129 |
| 1106 void WebContentsImpl::WasUnOccluded() { | 1130 void WebContentsImpl::WasUnOccluded() { |
| 1107 for (RenderWidgetHostView* view : GetRenderWidgetHostViewsInTree()) { | 1131 for (RenderWidgetHostView* view : GetRenderWidgetHostViewsInTree()) { |
| 1108 if (view) | 1132 if (view) |
| 1109 view->WasUnOccluded(); | 1133 view->WasUnOccluded(); |
| 1110 } | 1134 } |
| 1111 } | 1135 } |
| 1112 | 1136 |
| 1113 bool WebContentsImpl::NeedToFireBeforeUnload() { | 1137 bool WebContentsImpl::NeedToFireBeforeUnload() { |
| 1138 bool sudden_termination_allowed = true; |
| 1139 frame_tree_.ForEach(base::Bind( |
| 1140 &SuddenTerminationAllowed, &sudden_termination_allowed)); |
| 1114 // TODO(creis): Should we fire even for interstitial pages? | 1141 // TODO(creis): Should we fire even for interstitial pages? |
| 1115 return WillNotifyDisconnection() && | 1142 return WillNotifyDisconnection() && |
| 1116 !ShowingInterstitialPage() && | 1143 !ShowingInterstitialPage() && |
| 1117 !static_cast<RenderViewHostImpl*>( | 1144 !sudden_termination_allowed; |
| 1118 GetRenderViewHost())->SuddenTerminationAllowed(); | |
| 1119 } | 1145 } |
| 1120 | 1146 |
| 1121 void WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) { | 1147 void WebContentsImpl::DispatchBeforeUnload(bool for_cross_site_transition) { |
| 1122 static_cast<RenderFrameHostImpl*>(GetMainFrame())->DispatchBeforeUnload( | 1148 GetMainFrame()->DispatchBeforeUnload(for_cross_site_transition); |
| 1123 for_cross_site_transition); | |
| 1124 } | 1149 } |
| 1125 | 1150 |
| 1126 void WebContentsImpl::Stop() { | 1151 void WebContentsImpl::Stop() { |
| 1127 GetRenderManager()->Stop(); | 1152 GetRenderManager()->Stop(); |
| 1128 FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); | 1153 FOR_EACH_OBSERVER(WebContentsObserver, observers_, NavigationStopped()); |
| 1129 } | 1154 } |
| 1130 | 1155 |
| 1131 WebContents* WebContentsImpl::Clone() { | 1156 WebContents* WebContentsImpl::Clone() { |
| 1132 // We use our current SiteInstance since the cloned entry will use it anyway. | 1157 // We use our current SiteInstance since the cloned entry will use it anyway. |
| 1133 // We pass our own opener so that the cloned page can access it if it was | 1158 // We pass our own opener so that the cloned page can access it if it was |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1347 // Notify the delegate if an embedded fullscreen widget was focused. | 1372 // Notify the delegate if an embedded fullscreen widget was focused. |
| 1348 if (delegate_ && render_widget_host && | 1373 if (delegate_ && render_widget_host && |
| 1349 delegate_->EmbedsFullscreenWidget() && | 1374 delegate_->EmbedsFullscreenWidget() && |
| 1350 render_widget_host->GetView() == GetFullscreenRenderWidgetHostView()) | 1375 render_widget_host->GetView() == GetFullscreenRenderWidgetHostView()) |
| 1351 delegate_->WebContentsFocused(this); | 1376 delegate_->WebContentsFocused(this); |
| 1352 } | 1377 } |
| 1353 | 1378 |
| 1354 void WebContentsImpl::RenderWidgetWasResized( | 1379 void WebContentsImpl::RenderWidgetWasResized( |
| 1355 RenderWidgetHostImpl* render_widget_host, | 1380 RenderWidgetHostImpl* render_widget_host, |
| 1356 bool width_changed) { | 1381 bool width_changed) { |
| 1357 RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); | 1382 RenderFrameHostImpl* rfh = GetMainFrame(); |
| 1358 if (!rfh || render_widget_host != rfh->GetRenderWidgetHost()) | 1383 if (!rfh || render_widget_host != rfh->GetRenderWidgetHost()) |
| 1359 return; | 1384 return; |
| 1360 | 1385 |
| 1361 FOR_EACH_OBSERVER(WebContentsObserver, observers_, | 1386 FOR_EACH_OBSERVER(WebContentsObserver, observers_, |
| 1362 MainFrameWasResized(width_changed)); | 1387 MainFrameWasResized(width_changed)); |
| 1363 } | 1388 } |
| 1364 | 1389 |
| 1365 bool WebContentsImpl::PreHandleKeyboardEvent( | 1390 bool WebContentsImpl::PreHandleKeyboardEvent( |
| 1366 const NativeWebKeyboardEvent& event, | 1391 const NativeWebKeyboardEvent& event, |
| 1367 bool* is_keyboard_shortcut) { | 1392 bool* is_keyboard_shortcut) { |
| (...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 if (BrowserPluginGuest::IsGuest(new_contents)) | 1829 if (BrowserPluginGuest::IsGuest(new_contents)) |
| 1805 return new_contents; | 1830 return new_contents; |
| 1806 | 1831 |
| 1807 if (!new_contents->GetRenderProcessHost()->HasConnection() || | 1832 if (!new_contents->GetRenderProcessHost()->HasConnection() || |
| 1808 !new_contents->GetRenderViewHost()->GetView()) | 1833 !new_contents->GetRenderViewHost()->GetView()) |
| 1809 return NULL; | 1834 return NULL; |
| 1810 | 1835 |
| 1811 // Resume blocked requests for both the RenderViewHost and RenderFrameHost. | 1836 // Resume blocked requests for both the RenderViewHost and RenderFrameHost. |
| 1812 // TODO(brettw): It seems bogus to reach into here and initialize the host. | 1837 // TODO(brettw): It seems bogus to reach into here and initialize the host. |
| 1813 static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); | 1838 static_cast<RenderViewHostImpl*>(new_contents->GetRenderViewHost())->Init(); |
| 1814 static_cast<RenderFrameHostImpl*>(new_contents->GetMainFrame())->Init(); | 1839 new_contents->GetMainFrame()->Init(); |
| 1815 | 1840 |
| 1816 return new_contents; | 1841 return new_contents; |
| 1817 } | 1842 } |
| 1818 | 1843 |
| 1819 RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { | 1844 RenderWidgetHostView* WebContentsImpl::GetCreatedWidget(int route_id) { |
| 1820 PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); | 1845 PendingWidgetViews::iterator iter = pending_widget_views_.find(route_id); |
| 1821 if (iter == pending_widget_views_.end()) { | 1846 if (iter == pending_widget_views_.end()) { |
| 1822 DCHECK(false); | 1847 DCHECK(false); |
| 1823 return NULL; | 1848 return NULL; |
| 1824 } | 1849 } |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1921 delegate_->MoveValidationMessage(this, anchor_in_root_view); | 1946 delegate_->MoveValidationMessage(this, anchor_in_root_view); |
| 1922 } | 1947 } |
| 1923 | 1948 |
| 1924 void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { | 1949 void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { |
| 1925 if (browser_plugin_embedder_) | 1950 if (browser_plugin_embedder_) |
| 1926 browser_plugin_embedder_->DidSendScreenRects(); | 1951 browser_plugin_embedder_->DidSendScreenRects(); |
| 1927 } | 1952 } |
| 1928 | 1953 |
| 1929 BrowserAccessibilityManager* | 1954 BrowserAccessibilityManager* |
| 1930 WebContentsImpl::GetRootBrowserAccessibilityManager() { | 1955 WebContentsImpl::GetRootBrowserAccessibilityManager() { |
| 1931 RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); | 1956 RenderFrameHostImpl* rfh = GetMainFrame(); |
| 1932 return rfh ? rfh->browser_accessibility_manager() : NULL; | 1957 return rfh ? rfh->browser_accessibility_manager() : NULL; |
| 1933 } | 1958 } |
| 1934 | 1959 |
| 1935 BrowserAccessibilityManager* | 1960 BrowserAccessibilityManager* |
| 1936 WebContentsImpl::GetOrCreateRootBrowserAccessibilityManager() { | 1961 WebContentsImpl::GetOrCreateRootBrowserAccessibilityManager() { |
| 1937 RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); | 1962 RenderFrameHostImpl* rfh = GetMainFrame(); |
| 1938 return rfh ? rfh->GetOrCreateBrowserAccessibilityManager() : NULL; | 1963 return rfh ? rfh->GetOrCreateBrowserAccessibilityManager() : NULL; |
| 1939 } | 1964 } |
| 1940 | 1965 |
| 1941 void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { | 1966 void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { |
| 1942 const gfx::Size old_size = GetPreferredSize(); | 1967 const gfx::Size old_size = GetPreferredSize(); |
| 1943 preferred_size_ = pref_size; | 1968 preferred_size_ = pref_size; |
| 1944 OnPreferredSizeChanged(old_size); | 1969 OnPreferredSizeChanged(old_size); |
| 1945 } | 1970 } |
| 1946 | 1971 |
| 1947 void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { | 1972 void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) { |
| (...skipping 2140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4088 // Ignore renderer unresponsive event if debugger is attached to the tab | 4113 // Ignore renderer unresponsive event if debugger is attached to the tab |
| 4089 // since the event may be a result of the renderer sitting on a breakpoint. | 4114 // since the event may be a result of the renderer sitting on a breakpoint. |
| 4090 // See http://crbug.com/65458 | 4115 // See http://crbug.com/65458 |
| 4091 if (DevToolsAgentHost::IsDebuggerAttached(this)) | 4116 if (DevToolsAgentHost::IsDebuggerAttached(this)) |
| 4092 return; | 4117 return; |
| 4093 | 4118 |
| 4094 if (rfhi->IsWaitingForBeforeUnloadACK() || | 4119 if (rfhi->IsWaitingForBeforeUnloadACK() || |
| 4095 rfhi->IsWaitingForUnloadACK()) { | 4120 rfhi->IsWaitingForUnloadACK()) { |
| 4096 // Hang occurred while firing the beforeunload/unload handler. | 4121 // Hang occurred while firing the beforeunload/unload handler. |
| 4097 // Pretend the handler fired so tab closing continues as if it had. | 4122 // Pretend the handler fired so tab closing continues as if it had. |
| 4098 rvhi->set_sudden_termination_allowed(true); | 4123 frame_tree_.ForEach(base::Bind( |
| 4124 &EnableSuddenTermination, rvhi->GetSiteInstance()->GetId())); |
| 4099 | 4125 |
| 4100 if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer()) | 4126 if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer()) |
| 4101 return; | 4127 return; |
| 4102 | 4128 |
| 4103 // If the tab hangs in the beforeunload/unload handler there's really | 4129 // If the tab hangs in the beforeunload/unload handler there's really |
| 4104 // nothing we can do to recover. If the hang is in the beforeunload handler, | 4130 // nothing we can do to recover. If the hang is in the beforeunload handler, |
| 4105 // pretend the beforeunload listeners have all fired and allow the delegate | 4131 // pretend the beforeunload listeners have all fired and allow the delegate |
| 4106 // to continue closing; the user will not have the option of cancelling the | 4132 // to continue closing; the user will not have the option of cancelling the |
| 4107 // close. Otherwise, pretend the unload listeners have all fired and close | 4133 // close. Otherwise, pretend the unload listeners have all fired and close |
| 4108 // the tab. | 4134 // the tab. |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4516 node->render_manager()->ResumeResponseDeferredAtStart(); | 4542 node->render_manager()->ResumeResponseDeferredAtStart(); |
| 4517 } | 4543 } |
| 4518 | 4544 |
| 4519 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { | 4545 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { |
| 4520 force_disable_overscroll_content_ = force_disable; | 4546 force_disable_overscroll_content_ = force_disable; |
| 4521 if (view_) | 4547 if (view_) |
| 4522 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); | 4548 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
| 4523 } | 4549 } |
| 4524 | 4550 |
| 4525 } // namespace content | 4551 } // namespace content |
| OLD | NEW |