Skip to content

Commit

Permalink
Remove the native view host when CustomTab is closed.
Browse files Browse the repository at this point in the history
Bug: b/169014289
Test: covered by unittest

Change-Id: I769addac4e172eb16d5c363c8edca96c1877a346
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2637415
Reviewed-by: Yuichiro Hanada <yhanada@chromium.org>
Reviewed-by: David Jacobo <djacobo@chromium.org>
Commit-Queue: Mitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#846018}
  • Loading branch information
mitoshima authored and Chromium LUCI CQ committed Jan 22, 2021
1 parent 46bbd54 commit cf6a978
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 1 deletion.
3 changes: 3 additions & 0 deletions components/arc/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@ source_set("unit_tests") {
"ime/key_event_result_receiver_unittest.cc",
"intent_helper/activity_icon_loader_unittest.cc",
"intent_helper/arc_intent_helper_bridge_unittest.cc",
"intent_helper/custom_tab_unittest.cc",
"intent_helper/intent_filter_unittest.cc",
"intent_helper/link_handler_model_unittest.cc",
"metrics/arc_metrics_service_unittest.cc",
Expand Down Expand Up @@ -470,6 +471,8 @@ source_set("unit_tests") {
"//ui/events",
"//ui/events:dom_keycode_converter",
"//ui/ozone",
"//ui/views",
"//ui/views:test_support",
"//url:url",
]
}
Expand Down
5 changes: 4 additions & 1 deletion components/arc/intent_helper/custom_tab.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ CustomTab::CustomTab(aura::Window* arc_app_window)
widget->GetContentsView()->AddChildView(host_.get());
}

CustomTab::~CustomTab() = default;
CustomTab::~CustomTab() {
if (host_->GetWidget())
host_->GetWidget()->GetContentsView()->RemoveChildView(host_.get());
}

void CustomTab::Attach(gfx::NativeView view) {
DCHECK(view);
Expand Down
51 changes: 51 additions & 0 deletions components/arc/intent_helper/custom_tab_unittest.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/arc/intent_helper/custom_tab.h"

#include <memory>

#include "ui/aura/test/aura_test_base.h"
#include "ui/views/test/test_views_delegate.h"
#include "ui/views/widget/widget.h"

namespace arc {

using CustomTabTest = aura::test::AuraTestBase;

// Make sure resizing the widget after closing custom tab will not crash.
// b/169014289
TEST_F(CustomTabTest, ResizeAfterClose) {
views::TestViewsDelegate views_delegate;

views::Widget toplevel_widget;
{
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
params.bounds = gfx::Rect(0, 0, 200, 200);
params.parent = root_window();
toplevel_widget.Init(std::move(params));
}
auto custom_tab =
std::make_unique<CustomTab>(toplevel_widget.GetNativeWindow());

views::Widget embedded_widget;
{
views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.context = root_window();
embedded_widget.Init(std::move(params));
embedded_widget.Show();
}
custom_tab->Attach(embedded_widget.GetNativeWindow());
toplevel_widget.Show();

custom_tab.reset();
// Resize to force re-layout child views to make sure that deleting the custom
// tab removes the native view host inside upon deletion.
toplevel_widget.SetSize(gfx::Size(250, 250));
}

} // namespace arc

0 comments on commit cf6a978

Please sign in to comment.