blob: b72680b466e558c24b8b922c900b9d97c2119267 [file] [log] [blame]
// Copyright 2017 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/native_widget_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/views/theme_profile_key.h"
#include "ui/aura/window.h"
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
#include "ui/views/widget/native_widget_aura.h"
views::NativeWidget* CreateNativeWidget(
NativeWidgetType type,
views::Widget::InitParams* params,
views::internal::NativeWidgetDelegate* delegate) {
// While the majority of the time, context wasn't plumbed through due to the
// existence of a global WindowParentingClient, if this window is toplevel,
// it's possible that there is no contextual state that we can use.
gfx::NativeWindow parent_or_context =
params->parent ? params->parent : params->context;
Profile* profile = nullptr;
if (parent_or_context)
profile = GetThemeProfileForWindow(parent_or_context);
views::NativeWidget* native_widget = nullptr;
aura::Window* window = nullptr;
if (type == NativeWidgetType::DESKTOP_NATIVE_WIDGET_AURA ||
(!params->parent && !params->context && !params->child)) {
// In the desktop case, do not always set the profile window
// property from the parent since there are windows (like the task
// manager) that are not associated with a specific profile.
views::DesktopNativeWidgetAura* desktop_native_widget =
new views::DesktopNativeWidgetAura(delegate);
window = desktop_native_widget->GetNativeWindow();
native_widget = desktop_native_widget;
} else {
views::NativeWidgetAura* native_widget_aura =
new views::NativeWidgetAura(delegate);
if (params->parent) {
Profile* parent_profile = reinterpret_cast<Profile*>(
params->parent->GetNativeWindowProperty(Profile::kProfileKey));
native_widget_aura->SetNativeWindowProperty(Profile::kProfileKey,
parent_profile);
}
window = native_widget_aura->GetNativeWindow();
native_widget = native_widget_aura;
}
// Use the original profile because |window| may outlive the profile
// of the context window. This can happen with incognito profiles.
// However, the original profile will stick around until shutdown.
SetThemeProfileForWindow(window,
profile ? profile->GetOriginalProfile() : nullptr);
return native_widget;
}