Chromium Code Reviews| Index: components/constrained_window/constrained_window_views.cc |
| diff --git a/components/constrained_window/constrained_window_views.cc b/components/constrained_window/constrained_window_views.cc |
| index def5232fc9782603559d380c6499264f1c8ac6b5..4e79e52cc3eadbcb8ebb8b116afa79317b50705d 100644 |
| --- a/components/constrained_window/constrained_window_views.cc |
| +++ b/components/constrained_window/constrained_window_views.cc |
| @@ -22,6 +22,9 @@ using web_modal::ModalDialogHost; |
| using web_modal::ModalDialogHostObserver; |
| namespace constrained_window { |
| + |
| +const char kHasIndependentBoundsKey[] = "__INDEPENDENT_BOUNDS__"; |
|
Mike Wittman
2016/08/05 16:03:46
If I understood Scott correctly in the off-review
rbpotter
2016/08/12 16:36:07
Done.
|
| + |
| namespace { |
| ConstrainedWindowViewsClient* constrained_window_views_client = NULL; |
| @@ -91,13 +94,24 @@ void UpdateModalDialogPosition(views::Widget* widget, |
| // 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(); |
| + } else { |
| + bool * independent_bounds = NULL; |
| + independent_bounds = reinterpret_cast<bool*>( |
|
Mike Wittman
2016/08/05 16:03:46
static_cast<> is preferred when casting from void*
rbpotter
2016/08/12 16:36:07
Done.
|
| + widget->GetNativeWindowProperty(kHasIndependentBoundsKey)); |
| + if (independent_bounds && *independent_bounds) { |
| + gfx::Rect bound = |
| + views::Widget::GetWidgetForNativeView(dialog_host->GetHostView())-> |
| + GetClientAreaBoundsInScreen(); |
| + if (bound.width() - border->GetInsets().left() < size.width()) { |
| + position.set_x(position.x() + (size.width()-bound.width())/2 + |
| + border->GetInsets().left()); |
| + } |
| + } |
| } |
| - |
| widget->SetBounds(gfx::Rect(position, size)); |
| } |
| @@ -122,7 +136,12 @@ void UpdateWebContentsModalDialogPosition( |
| // Border may be null during widget initialization. |
| if (border) |
| max_size.Enlarge(0, border->GetInsets().top()); |
| - size.SetToMin(max_size); |
| + bool * independent_bounds = NULL; |
| + independent_bounds = reinterpret_cast<bool*>( |
| + widget->GetNativeWindowProperty(kHasIndependentBoundsKey)); |
| + if (!(independent_bounds && *independent_bounds)) { |
| + size.SetToMin(max_size); |
| + } |
| UpdateModalDialogPosition(widget, dialog_host, size); |
| } |
| @@ -142,7 +161,23 @@ views::Widget* ShowWebModalDialogViews( |
| guest_view::GuestViewBase::GetTopLevelWebContents(initiator_web_contents); |
| views::Widget* widget = CreateWebModalDialogViews(dialog, web_contents); |
| web_modal::WebContentsModalDialogManager::FromWebContents(web_contents) |
| - ->ShowModalDialog(widget->GetNativeWindow()); |
| + ->ShowModalDialog(widget->GetNativeWindow(), NULL, NULL); |
| + return widget; |
| +} |
| + |
| +views::Widget* ShowWebModalDialogWithIndBoundsViews( |
| + views::WidgetDelegate* dialog, |
| + content::WebContents* initiator_web_contents, |
| + bool * independent_bounds) { |
| + DCHECK(constrained_window_views_client); |
| + // For embedded WebContents, use the embedder's WebContents for constrained |
| + // window. |
| + content::WebContents* web_contents = |
| + guest_view::GuestViewBase::GetTopLevelWebContents(initiator_web_contents); |
| + views::Widget* widget = CreateWebModalDialogViews(dialog, web_contents); |
| + web_modal::WebContentsModalDialogManager::FromWebContents(web_contents) |
| + ->ShowModalDialog(widget->GetNativeWindow(), independent_bounds, |
| + kHasIndependentBoundsKey); |
| return widget; |
| } |