Index: chrome/browser/chromeos/options/network_config_view.cc |
diff --git a/chrome/browser/chromeos/options/network_config_view.cc b/chrome/browser/chromeos/options/network_config_view.cc |
index 2208aa05b59c7ab110a99061fb86d4ff2bbae47d..85b47fd4da2d6cd8ac46648159638a58e61d6cdf 100644 |
--- a/chrome/browser/chromeos/options/network_config_view.cc |
+++ b/chrome/browser/chromeos/options/network_config_view.cc |
@@ -15,6 +15,7 @@ |
#include "chrome/browser/chromeos/options/wifi_config_view.h" |
#include "chrome/browser/chromeos/options/wimax_config_view.h" |
#include "chrome/browser/profiles/profile_manager.h" |
+#include "chrome/browser/ui/ash/ash_util.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/ui/browser_window.h" |
@@ -25,7 +26,10 @@ |
#include "chromeos/network/network_state_handler.h" |
#include "components/device_event_log/device_event_log.h" |
#include "components/user_manager/user.h" |
+#include "services/ui/public/cpp/property_type_converters.h" |
+#include "services/ui/public/interfaces/window_manager.mojom.h" |
#include "ui/accessibility/ax_view_state.h" |
+#include "ui/aura/mus/mus_util.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/gfx/color_palette.h" |
@@ -38,8 +42,10 @@ |
#include "ui/views/layout/fill_layout.h" |
#include "ui/views/layout/layout_constants.h" |
#include "ui/views/widget/widget.h" |
+#include "ui/views/widget/widget_parent.h" |
using views::Widget; |
+using views::WidgetParent; |
namespace chromeos { |
@@ -120,7 +126,7 @@ NetworkConfigView::~NetworkConfigView() { |
// static |
void NetworkConfigView::Show(const std::string& service_path, |
- gfx::NativeWindow parent) { |
+ const views::WidgetParent& widget_parent) { |
if (GetActiveDialog() != nullptr) |
return; |
NetworkConfigView* view = new NetworkConfigView(); |
@@ -137,12 +143,12 @@ void NetworkConfigView::Show(const std::string& service_path, |
return; |
} |
NET_LOG(USER) << "NetworkConfigView::Show: " << service_path; |
- view->ShowDialog(parent); |
+ view->ShowDialog(widget_parent); |
} |
// static |
void NetworkConfigView::ShowForType(const std::string& type, |
- gfx::NativeWindow parent) { |
+ const views::WidgetParent& widget_parent) { |
if (GetActiveDialog() != nullptr) |
return; |
NetworkConfigView* view = new NetworkConfigView(); |
@@ -153,7 +159,7 @@ void NetworkConfigView::ShowForType(const std::string& type, |
return; |
} |
NET_LOG(USER) << "NetworkConfigView::ShowForType: " << type; |
- view->ShowDialog(parent); |
+ view->ShowDialog(widget_parent); |
} |
gfx::NativeWindow NetworkConfigView::GetNativeWindow() const { |
@@ -274,17 +280,62 @@ void NetworkConfigView::ViewHierarchyChanged( |
} |
} |
-void NetworkConfigView::ShowDialog(gfx::NativeWindow parent) { |
- if (parent == nullptr) |
- parent = GetParentForUnhostedDialog(); |
+void NetworkConfigView::ShowDialog(const views::WidgetParent& widget_parent) { |
+ Widget::InitParams params = GetDialogWidgetInitParams(widget_parent); |
+ Widget* window = new Widget; |
+ window->Init(params); |
+ window->SetAlwaysOnTop(true); |
+ window->Show(); |
+} |
+ |
+Widget::InitParams NetworkConfigView::GetDialogWidgetInitParams( |
+ const views::WidgetParent& widget_parent) { |
+ // Start with the usual params for a dialog. |
+ Widget::InitParams params = DialogDelegate::GetDialogWidgetInitParams( |
+ this, nullptr, nullptr, gfx::Rect()); |
+ |
+ if (chrome::IsRunningInMash()) { |
+ // If the native window maps to a mus window, use that. |
+ if (widget_parent.native_parent) { |
+ params.parent_mus = aura::GetMusWindow(widget_parent.native_parent); |
+ if (params.parent_mus) |
+ return params; |
+ } |
+ |
+ // Use ash container id if available. |
+ if (widget_parent.container_id != WidgetParent::kInvalidContainerId) { |
+ using ui::mojom::WindowManager; |
+ params.mus_properties[WindowManager::kInitialContainerId_Property] = |
+ mojo::ConvertTo<std::vector<uint8_t>>(widget_parent.container_id); |
+ return params; |
+ } |
+ |
+ // Use a fallback window. |parent_mus| may still be null, which will result |
+ // in the default window placement based on type and last active display. |
+ params.parent_mus = aura::GetMusWindow(GetParentForUnhostedDialog()); |
+ return params; |
+ } |
+ |
+ if (widget_parent.native_parent) { |
+ params.parent = widget_parent.native_parent; |
+ return params; |
+ } |
+ |
+ // Use ash container id if available. |
+ if (widget_parent.container_id != WidgetParent::kInvalidContainerId) { |
+ params.parent = ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), |
+ widget_parent.container_id); |
+ return params; |
+ } |
+ |
+ // Use a fallback parent. |
+ params.parent = GetParentForUnhostedDialog(); |
// Failed connections may result in a pop-up with no natural parent window, |
// so provide a fallback context on the primary display. This is necessary |
// becase one of parent or context must be non nullptr. |
- gfx::NativeWindow context = |
- parent ? nullptr : ash::Shell::GetPrimaryRootWindow(); |
- Widget* window = DialogDelegate::CreateDialogWidget(this, context, parent); |
- window->SetAlwaysOnTop(true); |
- window->Show(); |
+ if (!params.parent) |
+ params.context = ash::Shell::GetPrimaryRootWindow(); |
+ return params; |
} |
stevenjb
2016/10/19 17:40:07
This doesn't feel like it belongs here. I'm sure w
James Cook
2016/10/19 18:05:27
Yeah, I know. Copy/pasting what I said to sky in t
stevenjb
2016/10/19 18:23:38
Hrmm. Can we at least put this in an anonymous nam
|
// ChildNetworkConfigView |