diff options
author | sky <sky@chromium.org> | 2015-09-01 17:12:18 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-02 00:12:58 +0000 |
commit | 19644b33d97a68c53621eca83f34ccc9097fcd8c (patch) | |
tree | 5d9ba3834e9ed73835e7f3bf2d987ad4b07ef017 /components/html_viewer/html_frame_tree_manager.cc | |
parent | b9a8751fe3056400f7f524a9e7538f9493f51298 (diff) | |
download | chromium_src-19644b33d97a68c53621eca83f34ccc9097fcd8c.zip chromium_src-19644b33d97a68c53621eca83f34ccc9097fcd8c.tar.gz chromium_src-19644b33d97a68c53621eca83f34ccc9097fcd8c.tar.bz2 |
Makes html_viewer only swap to remote when necessary
Previously on navigation the code preemptively swapped from local to
remote. This is wrong and problematic if the frame was going to be
local after the navigate.
The fix is to change the frame server code to consult the content
handler id when doing a navigation. If the id is the same as the
existing id, then the same renderer is going to be used. If the same
renderer is used OnConnect() is supplied a different argument to indicate the
new connection corresponds to an existing frame. Additionally a
ViewTreeClient is not obtained for the frame (this is because the
html_viewer already has a View for the frame).
BUG=479172,490221,523408
TEST=covered by tests
R=ben@chromium.org
Review URL: https://codereview.chromium.org/1327673004
Cr-Commit-Position: refs/heads/master@{#346794}
Diffstat (limited to 'components/html_viewer/html_frame_tree_manager.cc')
-rw-r--r-- | components/html_viewer/html_frame_tree_manager.cc | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/components/html_viewer/html_frame_tree_manager.cc b/components/html_viewer/html_frame_tree_manager.cc index 93bbfcb..e2c64c3 100644 --- a/components/html_viewer/html_frame_tree_manager.cc +++ b/components/html_viewer/html_frame_tree_manager.cc @@ -15,8 +15,8 @@ #include "components/html_viewer/html_factory.h" #include "components/html_viewer/html_frame.h" #include "components/html_viewer/html_frame_delegate.h" -#include "components/html_viewer/html_viewer_switches.h" #include "components/view_manager/public/cpp/view_tree_connection.h" +#include "mandoline/tab/web_view_switches.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebRemoteFrame.h" #include "third_party/WebKit/public/web/WebTreeScopeType.h" @@ -59,16 +59,28 @@ HTMLFrame* HTMLFrameTreeManager::CreateFrameAndAttachToTree( mandoline::FrameTreeServerPtr frame_tree_server; mojo::Array<mandoline::FrameDataPtr> frame_data; uint32_t change_id; + uint32_t view_id; + mandoline::ViewConnectType view_connect_type; + mandoline::FrameTreeClient::OnConnectCallback on_connect_callback; resource_waiter->Release(&frame_tree_client_request, &frame_tree_server, - &frame_data, &change_id); + &frame_data, &change_id, &view_id, + &view_connect_type, &on_connect_callback); resource_waiter.reset(); + on_connect_callback.Run(); + HTMLFrameTreeManager* frame_tree = nullptr; if (!base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kOOPIFAlwaysCreateNewFrameTree)) { - if (instances_->count(frame_data[0]->frame_id)) - frame_tree = (*instances_)[frame_data[0]->frame_id]; + web_view::switches::kOOPIFAlwaysCreateNewFrameTree) && + instances_->count(frame_data[0]->frame_id)) { + frame_tree = (*instances_)[frame_data[0]->frame_id]; + } + + if (view_connect_type == mandoline::VIEW_CONNECT_TYPE_USE_EXISTING && + !frame_tree) { + DVLOG(1) << "was told to use existing view but do not have frame tree"; + return nullptr; } if (!frame_tree) { @@ -76,6 +88,17 @@ HTMLFrame* HTMLFrameTreeManager::CreateFrameAndAttachToTree( frame_tree->Init(delegate, view, frame_data, change_id); if (frame_data[0]->frame_id == view->id()) (*instances_)[frame_data[0]->frame_id] = frame_tree; + } else if (view_connect_type == mandoline::VIEW_CONNECT_TYPE_USE_EXISTING) { + HTMLFrame* existing_frame = frame_tree->root_->FindFrame(view_id); + if (!existing_frame) { + DVLOG(1) << "was told to use existing view but could not find view"; + return nullptr; + } + if (!existing_frame->IsLocal()) { + DVLOG(1) << "was told to use existing view, but frame is remote"; + return nullptr; + } + existing_frame->SwapDelegate(delegate); } else { // We're going to share a frame tree. There are two possibilities: // . We already know about the frame, in which case we swap it to local. @@ -111,7 +134,7 @@ HTMLFrame* HTMLFrameTreeManager::CreateFrameAndAttachToTree( } } - HTMLFrame* frame = frame_tree->root_->FindFrame(view->id()); + HTMLFrame* frame = frame_tree->root_->FindFrame(view_id); DCHECK(frame); frame->Bind(frame_tree_server.Pass(), frame_tree_client_request.Pass()); return frame; |