Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(313)

Unified Diff: chrome/browser/ui/views/constrained_window_views.cc

Issue 658383003: Componentize Constrained Window Views (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: rebase Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/constrained_window_views.cc
diff --git a/chrome/browser/ui/views/constrained_window_views.cc b/chrome/browser/ui/views/constrained_window_views.cc
deleted file mode 100644
index 12505294de9f17564b4e38751921d880bc722092..0000000000000000000000000000000000000000
--- a/chrome/browser/ui/views/constrained_window_views.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright (c) 2012 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 "chrome/browser/ui/views/constrained_window_views.h"
-
-#include <algorithm>
-
-#include "chrome/browser/ui/browser_finder.h"
-#include "components/web_modal/popup_manager.h"
-#include "components/web_modal/web_contents_modal_dialog_host.h"
-#include "extensions/browser/guest_view/guest_view_base.h"
-#include "ui/views/border.h"
-#include "ui/views/widget/widget.h"
-#include "ui/views/widget/widget_observer.h"
-#include "ui/views/window/dialog_delegate.h"
-
-using web_modal::ModalDialogHost;
-using web_modal::ModalDialogHostObserver;
-
-namespace {
-// The name of a key to store on the window handle to associate
-// BrowserModalDialogHostObserverViews with the Widget.
-const char* const kBrowserModalDialogHostObserverViewsKey =
- "__BROWSER_MODAL_DIALOG_HOST_OBSERVER_VIEWS__";
-
-// Applies positioning changes from the ModalDialogHost to the Widget.
-class BrowserModalDialogHostObserverViews
- : public views::WidgetObserver,
- public ModalDialogHostObserver {
- public:
- BrowserModalDialogHostObserverViews(ModalDialogHost* host,
- views::Widget* target_widget,
- const char *const native_window_property)
- : host_(host),
- target_widget_(target_widget),
- native_window_property_(native_window_property) {
- DCHECK(host_);
- DCHECK(target_widget_);
- host_->AddObserver(this);
- target_widget_->AddObserver(this);
- }
-
- virtual ~BrowserModalDialogHostObserverViews() {
- if (host_)
- host_->RemoveObserver(this);
- target_widget_->RemoveObserver(this);
- target_widget_->SetNativeWindowProperty(native_window_property_, NULL);
- }
-
- // WidgetObserver overrides
- virtual void OnWidgetClosing(views::Widget* widget) override {
- delete this;
- }
-
- // WebContentsModalDialogHostObserver overrides
- virtual void OnPositionRequiresUpdate() override {
- UpdateBrowserModalDialogPosition(target_widget_, host_);
- }
-
- virtual void OnHostDestroying() override {
- host_->RemoveObserver(this);
- host_ = NULL;
- }
-
- private:
- ModalDialogHost* host_;
- views::Widget* target_widget_;
- const char* const native_window_property_;
-
- DISALLOW_COPY_AND_ASSIGN(BrowserModalDialogHostObserverViews);
-};
-
-void UpdateModalDialogPosition(views::Widget* widget,
- web_modal::ModalDialogHost* dialog_host,
- const gfx::Size& size) {
- // Do not forcibly update the dialog widget position if it is being dragged.
- if (widget->HasCapture())
- return;
-
- gfx::Point position = dialog_host->GetDialogPosition(size);
- views::Border* border = widget->non_client_view()->frame_view()->border();
- // Border may be null during widget initialization.
- if (border) {
- // Align the first row of pixels inside the border. This is the apparent
- // top of the dialog.
- position.set_y(position.y() - border->GetInsets().top());
- }
-
- if (widget->is_top_level()) {
- position +=
- views::Widget::GetWidgetForNativeView(dialog_host->GetHostView())->
- GetClientAreaBoundsInScreen().OffsetFromOrigin();
- }
-
- widget->SetBounds(gfx::Rect(position, size));
-}
-
-} // namespace
-
-void UpdateWebContentsModalDialogPosition(
- views::Widget* widget,
- web_modal::WebContentsModalDialogHost* dialog_host) {
- gfx::Size size = widget->GetRootView()->GetPreferredSize();
- gfx::Size max_size = dialog_host->GetMaximumDialogSize();
- // Enlarge the max size by the top border, as the dialog will be shifted
- // outside the area specified by the dialog host by this amount later.
- views::Border* border =
- widget->non_client_view()->frame_view()->border();
- // Border may be null during widget initialization.
- if (border)
- max_size.Enlarge(0, border->GetInsets().top());
- size.SetToMin(max_size);
- UpdateModalDialogPosition(widget, dialog_host, size);
-}
-
-void UpdateBrowserModalDialogPosition(views::Widget* widget,
- web_modal::ModalDialogHost* dialog_host) {
- UpdateModalDialogPosition(widget, dialog_host,
- widget->GetRootView()->GetPreferredSize());
-}
-
-views::Widget* ShowWebModalDialogViews(
- views::WidgetDelegate* dialog,
- content::WebContents* initiator_web_contents) {
- extensions::GuestViewBase* guest_view =
- extensions::GuestViewBase::FromWebContents(initiator_web_contents);
- // For embedded WebContents, use the embedder's WebContents for constrained
- // window.
- content::WebContents* web_contents =
- guest_view && guest_view->embedder_web_contents() ?
- guest_view->embedder_web_contents() : initiator_web_contents;
- views::Widget* widget = CreateWebModalDialogViews(dialog, web_contents);
- web_modal::PopupManager* popup_manager =
- web_modal::PopupManager::FromWebContents(web_contents);
- popup_manager->ShowModalDialog(widget->GetNativeWindow(), web_contents);
- return widget;
-}
-
-views::Widget* CreateWebModalDialogViews(views::WidgetDelegate* dialog,
- content::WebContents* web_contents) {
- DCHECK_EQ(ui::MODAL_TYPE_CHILD, dialog->GetModalType());
- web_modal::PopupManager* popup_manager =
- web_modal::PopupManager::FromWebContents(web_contents);
- const gfx::NativeWindow parent = popup_manager->GetHostView();
- return views::DialogDelegate::CreateDialogWidget(dialog, NULL, parent);
-}
-
-// TODO(gbillock): Replace this with PopupManager calls.
-views::Widget* CreateBrowserModalDialogViews(views::DialogDelegate* dialog,
- gfx::NativeWindow parent) {
- views::Widget* widget =
- views::DialogDelegate::CreateDialogWidget(dialog, NULL, parent);
- if (!dialog->UseNewStyleForThisDialog())
- return widget;
-
- // Get the browser dialog management and hosting components from |parent|.
- Browser* browser = chrome::FindBrowserWithWindow(parent);
- if (browser) {
- ChromeWebModalDialogManagerDelegate* manager = browser;
- ModalDialogHost* host = manager->GetWebContentsModalDialogHost();
- DCHECK_EQ(parent, host->GetHostView());
- ModalDialogHostObserver* dialog_host_observer =
- new BrowserModalDialogHostObserverViews(
- host, widget, kBrowserModalDialogHostObserverViewsKey);
- dialog_host_observer->OnPositionRequiresUpdate();
- }
- return widget;
-}

Powered by Google App Engine
This is Rietveld 408576698