Index: components/constrained_window/constrained_window_views_unittest.cc |
diff --git a/components/constrained_window/constrained_window_views_unittest.cc b/components/constrained_window/constrained_window_views_unittest.cc |
index e929867eb8175a7a8d8ebd8e0206e879f0b8dd0e..a0dd9dfddc3cca626e77cba1198e509f81d0cd0c 100644 |
--- a/components/constrained_window/constrained_window_views_unittest.cc |
+++ b/components/constrained_window/constrained_window_views_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <memory> |
#include "base/macros.h" |
+#include "components/constrained_window/constrained_window_views_client.h" |
#include "components/web_modal/test_web_contents_modal_dialog_host.h" |
#include "ui/gfx/geometry/point.h" |
#include "ui/gfx/geometry/rect.h" |
@@ -31,24 +32,82 @@ class DialogContents : public views::DialogDelegateView { |
preferred_size_ = preferred_size; |
} |
- // Overriden from DialogDelegateView: |
+ void set_modal_type(ui::ModalType modal_type) { modal_type_ = modal_type; } |
+ |
+ // DialogDelegateView: |
views::View* GetContentsView() override { return this; } |
gfx::Size GetPreferredSize() const override { return preferred_size_; } |
gfx::Size GetMinimumSize() const override { return gfx::Size(); } |
+ // WidgetDelegate: |
+ ui::ModalType GetModalType() const override { return modal_type_; } |
+ |
private: |
gfx::Size preferred_size_; |
+ ui::ModalType modal_type_ = ui::MODAL_TYPE_NONE; |
DISALLOW_COPY_AND_ASSIGN(DialogContents); |
}; |
+// Dummy client that returns a null modal dialog host and host view. |
+class TestConstrainedWindowViewsClient |
+ : public constrained_window::ConstrainedWindowViewsClient { |
+ public: |
+ TestConstrainedWindowViewsClient() {} |
+ |
+ // ConstrainedWindowViewsClient: |
+ web_modal::ModalDialogHost* GetModalDialogHost( |
+ gfx::NativeWindow parent) override { |
+ return nullptr; |
+ } |
+ gfx::NativeView GetDialogHostView(gfx::NativeWindow parent) override { |
+ return nullptr; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(TestConstrainedWindowViewsClient); |
+}; |
+ |
+// ViewsDelegate to provide context to dialog creation functions such as |
+// CreateBrowserModalDialogViews() which do not allow InitParams to be set, and |
+// pass a null |context| argument to DialogDelegate::CreateDialogWidget(). |
+class TestViewsDelegateWithContext : public views::TestViewsDelegate { |
+ public: |
+ TestViewsDelegateWithContext() {} |
+ |
+ void set_context(gfx::NativeWindow context) { context_ = context; } |
+ |
+ // ViewsDelegate: |
+ void OnBeforeWidgetInit( |
+ views::Widget::InitParams* params, |
+ views::internal::NativeWidgetDelegate* delegate) override { |
+ if (!params->context) |
+ params->context = context_; |
+ TestViewsDelegate::OnBeforeWidgetInit(params, delegate); |
+ } |
+ |
+ private: |
+ gfx::NativeWindow context_ = nullptr; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestViewsDelegateWithContext); |
+}; |
+ |
class ConstrainedWindowViewsTest : public views::ViewsTestBase { |
public: |
ConstrainedWindowViewsTest() : contents_(nullptr), dialog_(nullptr) {} |
~ConstrainedWindowViewsTest() override {} |
void SetUp() override { |
+ std::unique_ptr<TestViewsDelegateWithContext> views_delegate( |
+ new TestViewsDelegateWithContext); |
+ |
+ // set_views_delegate() must be called before SetUp(), and GetContext() is |
+ // null before that, so take a reference. |
+ TestViewsDelegateWithContext* views_delegate_weak = views_delegate.get(); |
+ set_views_delegate(std::move(views_delegate)); |
views::ViewsTestBase::SetUp(); |
+ views_delegate_weak->set_context(GetContext()); |
+ |
contents_ = new DialogContents; |
dialog_ = views::DialogDelegate::CreateDialogWidget( |
contents_, GetContext(), nullptr); |
@@ -154,4 +213,19 @@ TEST_F(ConstrainedWindowViewsTest, MaximumWebContentsDialogSize) { |
EXPECT_EQ(full_dialog_size.ToString(), GetDialogSize().ToString()); |
} |
+// Ensure CreateBrowserModalDialogViews() works correctly with a null parent. |
+TEST_F(ConstrainedWindowViewsTest, NullModalParent) { |
+ // Use desktop widgets (except on ChromeOS) for extra coverage. |
+ views_delegate()->set_use_desktop_native_widgets(true); |
+ |
+ SetConstrainedWindowViewsClient( |
+ base::MakeUnique<TestConstrainedWindowViewsClient>()); |
+ DialogContents* contents = new DialogContents; |
+ contents->set_modal_type(ui::MODAL_TYPE_WINDOW); |
+ views::Widget* widget = CreateBrowserModalDialogViews(contents, nullptr); |
+ widget->Show(); |
+ EXPECT_TRUE(widget->IsVisible()); |
+ widget->CloseNow(); |
+} |
+ |
} // namespace constrained_window |