| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <cmath> | 9 #include <cmath> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 1556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1567 | 1567 |
| 1568 static_cast<RenderWidgetHostViewChildFrame*>( | 1568 static_cast<RenderWidgetHostViewChildFrame*>( |
| 1569 render_manager->GetRenderWidgetHostView()) | 1569 render_manager->GetRenderWidgetHostView()) |
| 1570 ->RegisterFrameSinkId(); | 1570 ->RegisterFrameSinkId(); |
| 1571 | 1571 |
| 1572 if (outer_web_contents_impl->frame_tree_.GetFocusedFrame() == | 1572 if (outer_web_contents_impl->frame_tree_.GetFocusedFrame() == |
| 1573 outer_contents_frame_impl->frame_tree_node()) { | 1573 outer_contents_frame_impl->frame_tree_node()) { |
| 1574 SetFocusedFrame(frame_tree_.root(), nullptr); | 1574 SetFocusedFrame(frame_tree_.root(), nullptr); |
| 1575 } | 1575 } |
| 1576 | 1576 |
| 1577 // Set up the the guest's AX tree to point back at the embedder's AX tree. |
| 1578 auto* parent_frame = outer_contents_frame->GetParent(); |
| 1579 GetMainFrame()->set_browser_plugin_embedder_ax_tree_id( |
| 1580 parent_frame->GetAXTreeID()); |
| 1581 GetMainFrame()->UpdateAXTreeData(); |
| 1582 |
| 1577 // At this point, we should destroy the TextInputManager which will notify all | 1583 // At this point, we should destroy the TextInputManager which will notify all |
| 1578 // the RWHV in this WebContents. The RWHV in this WebContents should use the | 1584 // the RWHV in this WebContents. The RWHV in this WebContents should use the |
| 1579 // TextInputManager owned by the outer WebContents. | 1585 // TextInputManager owned by the outer WebContents. |
| 1580 // TODO(ekaramad): Is it possible to have TextInputState before attaching to | 1586 // TODO(ekaramad): Is it possible to have TextInputState before attaching to |
| 1581 // outer WebContents? In such a case, is this still the right way to hand off | 1587 // outer WebContents? In such a case, is this still the right way to hand off |
| 1582 // state tracking from inner WebContents's TextInputManager to that of the | 1588 // state tracking from inner WebContents's TextInputManager to that of the |
| 1583 // outer WebContent (crbug.com/609846)? | 1589 // outer WebContent (crbug.com/609846)? |
| 1584 text_input_manager_.reset(nullptr); | 1590 text_input_manager_.reset(nullptr); |
| 1585 } | 1591 } |
| 1586 | 1592 |
| (...skipping 3010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4597 return false; | 4603 return false; |
| 4598 } | 4604 } |
| 4599 | 4605 |
| 4600 WebContentsImpl* WebContentsImpl::GetOutermostWebContents() { | 4606 WebContentsImpl* WebContentsImpl::GetOutermostWebContents() { |
| 4601 WebContentsImpl* root = this; | 4607 WebContentsImpl* root = this; |
| 4602 while (root->GetOuterWebContents()) | 4608 while (root->GetOuterWebContents()) |
| 4603 root = root->GetOuterWebContents(); | 4609 root = root->GetOuterWebContents(); |
| 4604 return root; | 4610 return root; |
| 4605 } | 4611 } |
| 4606 | 4612 |
| 4613 void WebContentsImpl::FocusOuterAttachmentFrameChain() { |
| 4614 WebContentsImpl* outer_contents = GetOuterWebContents(); |
| 4615 if (!outer_contents) |
| 4616 return; |
| 4617 |
| 4618 FrameTreeNode* outer_node = |
| 4619 FrameTreeNode::GloballyFindByID(GetOuterDelegateFrameTreeNodeId()); |
| 4620 outer_contents->frame_tree_.SetFocusedFrame(outer_node, nullptr); |
| 4621 |
| 4622 // For a browser initiated focus change, let embedding renderer know of the |
| 4623 // change. Otherwise, if the currently focused element is just across a |
| 4624 // process boundary in focus order, it will not be possible to move across |
| 4625 // that boundary. This is because the target element will already be focused |
| 4626 // (that renderer was not notified) and drop the event. |
| 4627 if (GetRenderManager()->GetProxyToOuterDelegate()) |
| 4628 GetRenderManager()->GetProxyToOuterDelegate()->SetFocusedFrame(); |
| 4629 |
| 4630 outer_contents->FocusOuterAttachmentFrameChain(); |
| 4631 } |
| 4632 |
| 4607 void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { | 4633 void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { |
| 4608 // Don't send notifications if we are just creating a swapped-out RVH for | 4634 // Don't send notifications if we are just creating a swapped-out RVH for |
| 4609 // the opener chain. These won't be used for view-source or WebUI, so it's | 4635 // the opener chain. These won't be used for view-source or WebUI, so it's |
| 4610 // ok to return early. | 4636 // ok to return early. |
| 4611 if (!static_cast<RenderViewHostImpl*>(render_view_host)->is_active()) | 4637 if (!static_cast<RenderViewHostImpl*>(render_view_host)->is_active()) |
| 4612 return; | 4638 return; |
| 4613 | 4639 |
| 4614 if (delegate_) | 4640 if (delegate_) |
| 4615 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); | 4641 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
| 4616 | 4642 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5007 return; | 5033 return; |
| 5008 | 5034 |
| 5009 // Send a page level blur to the old contents so that it displays inactive UI | 5035 // Send a page level blur to the old contents so that it displays inactive UI |
| 5010 // and focus this contents to activate it. | 5036 // and focus this contents to activate it. |
| 5011 if (old_contents) | 5037 if (old_contents) |
| 5012 old_contents->GetMainFrame()->GetRenderWidgetHost()->SetPageFocus(false); | 5038 old_contents->GetMainFrame()->GetRenderWidgetHost()->SetPageFocus(false); |
| 5013 | 5039 |
| 5014 // Make sure the outer web contents knows our frame is focused. Otherwise, the | 5040 // Make sure the outer web contents knows our frame is focused. Otherwise, the |
| 5015 // outer renderer could have the element before or after the frame element | 5041 // outer renderer could have the element before or after the frame element |
| 5016 // focused which would return early without actually advancing focus. | 5042 // focused which would return early without actually advancing focus. |
| 5017 if (GetRenderManager()->GetProxyToOuterDelegate()) | 5043 FocusOuterAttachmentFrameChain(); |
| 5018 GetRenderManager()->GetProxyToOuterDelegate()->SetFocusedFrame(); | |
| 5019 | 5044 |
| 5020 if (ShowingInterstitialPage()) { | 5045 if (ShowingInterstitialPage()) { |
| 5021 static_cast<RenderFrameHostImpl*>( | 5046 static_cast<RenderFrameHostImpl*>( |
| 5022 GetRenderManager()->interstitial_page()->GetMainFrame()) | 5047 GetRenderManager()->interstitial_page()->GetMainFrame()) |
| 5023 ->GetRenderWidgetHost() | 5048 ->GetRenderWidgetHost() |
| 5024 ->SetPageFocus(true); | 5049 ->SetPageFocus(true); |
| 5025 } else { | 5050 } else { |
| 5026 GetMainFrame()->GetRenderWidgetHost()->SetPageFocus(true); | 5051 GetMainFrame()->GetRenderWidgetHost()->SetPageFocus(true); |
| 5027 } | 5052 } |
| 5028 } | 5053 } |
| 5029 | 5054 |
| 5030 void WebContentsImpl::SetFocusedFrame(FrameTreeNode* node, | 5055 void WebContentsImpl::SetFocusedFrame(FrameTreeNode* node, |
| 5031 SiteInstance* source) { | 5056 SiteInstance* source) { |
| 5032 SetAsFocusedWebContentsIfNecessary(); | 5057 SetAsFocusedWebContentsIfNecessary(); |
| 5058 |
| 5033 frame_tree_.SetFocusedFrame(node, source); | 5059 frame_tree_.SetFocusedFrame(node, source); |
| 5060 |
| 5061 WebContentsImpl* inner_contents = node_.GetInnerWebContentsInFrame(node); |
| 5062 |
| 5063 WebContentsImpl* contents_to_focus = inner_contents ? inner_contents : this; |
| 5064 contents_to_focus->SetAsFocusedWebContentsIfNecessary(); |
| 5065 } |
| 5066 |
| 5067 RenderFrameHost* WebContentsImpl::GetFocusedFrameIncludingInnerWebContents() { |
| 5068 WebContentsImpl* contents = this; |
| 5069 FrameTreeNode* focused_node = contents->frame_tree_.GetFocusedFrame(); |
| 5070 |
| 5071 // If there is no focused frame in the outer WebContents, we need to return |
| 5072 // null. |
| 5073 if (!focused_node) |
| 5074 return nullptr; |
| 5075 |
| 5076 // If the focused frame is embedding an inner WebContents, we must descend |
| 5077 // into that contents. If the current WebContents does not have a focused |
| 5078 // frame, return the main frame of this contents instead of the focused empty |
| 5079 // frame embedding this contents. |
| 5080 while (true) { |
| 5081 contents = contents->node_.GetInnerWebContentsInFrame(focused_node); |
| 5082 if (!contents) |
| 5083 return focused_node->current_frame_host(); |
| 5084 |
| 5085 focused_node = contents->frame_tree_.GetFocusedFrame(); |
| 5086 if (!focused_node) |
| 5087 return contents->GetMainFrame(); |
| 5088 } |
| 5034 } | 5089 } |
| 5035 | 5090 |
| 5036 void WebContentsImpl::OnFocusedElementChangedInFrame( | 5091 void WebContentsImpl::OnFocusedElementChangedInFrame( |
| 5037 RenderFrameHostImpl* frame, | 5092 RenderFrameHostImpl* frame, |
| 5038 const gfx::Rect& bounds_in_root_view) { | 5093 const gfx::Rect& bounds_in_root_view) { |
| 5039 RenderWidgetHostViewBase* root_view = | 5094 RenderWidgetHostViewBase* root_view = |
| 5040 static_cast<RenderWidgetHostViewBase*>(GetRenderWidgetHostView()); | 5095 static_cast<RenderWidgetHostViewBase*>(GetRenderWidgetHostView()); |
| 5041 if (!root_view || !frame->GetView()) | 5096 if (!root_view || !frame->GetView()) |
| 5042 return; | 5097 return; |
| 5043 | 5098 |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5745 new_root->SetOriginalOpener(opener->frame_tree()->root()); | 5800 new_root->SetOriginalOpener(opener->frame_tree()->root()); |
| 5746 | 5801 |
| 5747 if (!opener_suppressed) { | 5802 if (!opener_suppressed) { |
| 5748 new_root->SetOpener(opener); | 5803 new_root->SetOpener(opener); |
| 5749 created_with_opener_ = true; | 5804 created_with_opener_ = true; |
| 5750 } | 5805 } |
| 5751 } | 5806 } |
| 5752 } | 5807 } |
| 5753 | 5808 |
| 5754 } // namespace content | 5809 } // namespace content |
| OLD | NEW |