Commit dc904a63 authored by erg@chromium.org's avatar erg@chromium.org

More work to make ash_unittests pass when we require context.

With the context checking DCHECK, ash_unittests and unit_tests now run on chromeos.

BUG=161882


Review URL: https://chromiumcodereview.appspot.com/11801027

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175892 0039d316-1c4b-4281-b951-d872f2087c98
parent 3159ca54
...@@ -629,7 +629,7 @@ bool AcceleratorController::PerformAction(int action, ...@@ -629,7 +629,7 @@ bool AcceleratorController::PerformAction(int action,
case SHOW_OAK: case SHOW_OAK:
if (CommandLine::ForCurrentProcess()->HasSwitch( if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kAshEnableOak)) { switches::kAshEnableOak)) {
oak::ShowOakWindow(); oak::ShowOakWindowWithContext(Shell::GetPrimaryRootWindow());
return true; return true;
} }
break; break;
......
...@@ -152,7 +152,7 @@ int DragDropController::StartDragAndDrop( ...@@ -152,7 +152,7 @@ int DragDropController::StartDragAndDrop(
drag_image_final_bounds_for_cancel_animation_ = gfx::Rect( drag_image_final_bounds_for_cancel_animation_ = gfx::Rect(
start_location - provider->GetDragImageOffset(), start_location - provider->GetDragImageOffset(),
provider->GetDragImage().size()); provider->GetDragImage().size());
drag_image_.reset(new DragImageView); drag_image_.reset(new DragImageView(source_window->GetRootWindow()));
drag_image_->SetImage(provider->GetDragImage()); drag_image_->SetImage(provider->GetDragImage());
drag_image_offset_ = provider->GetDragImageOffset(); drag_image_offset_ = provider->GetDragImageOffset();
gfx::Rect drag_image_bounds(start_location, drag_image_->GetPreferredSize()); gfx::Rect drag_image_bounds(start_location, drag_image_->GetPreferredSize());
......
...@@ -18,11 +18,12 @@ namespace internal { ...@@ -18,11 +18,12 @@ namespace internal {
namespace { namespace {
using views::Widget; using views::Widget;
Widget* CreateDragWidget() { Widget* CreateDragWidget(gfx::NativeView context) {
Widget* drag_widget = new Widget; Widget* drag_widget = new Widget;
Widget::InitParams params; Widget::InitParams params;
params.type = Widget::InitParams::TYPE_TOOLTIP; params.type = Widget::InitParams::TYPE_TOOLTIP;
params.keep_on_top = true; params.keep_on_top = true;
params.context = context;
params.accept_events = false; params.accept_events = false;
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.transparent = true; params.transparent = true;
...@@ -34,8 +35,8 @@ Widget* CreateDragWidget() { ...@@ -34,8 +35,8 @@ Widget* CreateDragWidget() {
} }
} }
DragImageView::DragImageView() : views::ImageView() { DragImageView::DragImageView(gfx::NativeView context) : views::ImageView() {
widget_.reset(CreateDragWidget()); widget_.reset(CreateDragWidget(context));
widget_->SetContentsView(this); widget_->SetContentsView(this);
widget_->SetAlwaysOnTop(true); widget_->SetAlwaysOnTop(true);
......
...@@ -16,7 +16,7 @@ namespace internal { ...@@ -16,7 +16,7 @@ namespace internal {
class DragImageView : public views::ImageView { class DragImageView : public views::ImageView {
public: public:
DragImageView(); explicit DragImageView(gfx::NativeView context);
virtual ~DragImageView(); virtual ~DragImageView();
// Sets the bounds of the native widget in screen // Sets the bounds of the native widget in screen
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "ash/root_window_controller.h" #include "ash/root_window_controller.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ash/test/ash_test_base.h" #include "ash/test/ash_test_base.h"
#include "ash/wm/shelf_layout_manager.h" #include "ash/wm/shelf_layout_manager.h"
#include "ash/wm/window_util.h" #include "ash/wm/window_util.h"
...@@ -51,12 +52,12 @@ class LauncherTooltipManagerTest : public AshTestBase { ...@@ -51,12 +52,12 @@ class LauncherTooltipManagerTest : public AshTestBase {
} }
void ShowDelayed() { void ShowDelayed() {
dummy_anchor_.reset(new views::View); CreateWidget();
tooltip_manager_->ShowDelayed(dummy_anchor_.get(), string16()); tooltip_manager_->ShowDelayed(dummy_anchor_.get(), string16());
} }
void ShowImmediately() { void ShowImmediately() {
dummy_anchor_.reset(new views::View); CreateWidget();
tooltip_manager_->ShowImmediately(dummy_anchor_.get(), string16()); tooltip_manager_->ShowImmediately(dummy_anchor_.get(), string16());
} }
...@@ -77,10 +78,27 @@ class LauncherTooltipManagerTest : public AshTestBase { ...@@ -77,10 +78,27 @@ class LauncherTooltipManagerTest : public AshTestBase {
} }
protected: protected:
scoped_ptr<views::Widget> widget_;
scoped_ptr<views::View> dummy_anchor_; scoped_ptr<views::View> dummy_anchor_;
scoped_ptr<internal::LauncherTooltipManager> tooltip_manager_; scoped_ptr<internal::LauncherTooltipManager> tooltip_manager_;
private: private:
void CreateWidget() {
dummy_anchor_.reset(new views::View);
widget_.reset(new views::Widget);
views::Widget::InitParams params(
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.transparent = true;
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = Shell::GetContainer(
Shell::GetPrimaryRootWindow(),
ash::internal::kShellWindowId_LauncherContainer);
widget_->Init(params);
widget_->SetContentsView(dummy_anchor_.get());
}
DISALLOW_COPY_AND_ASSIGN(LauncherTooltipManagerTest); DISALLOW_COPY_AND_ASSIGN(LauncherTooltipManagerTest);
}; };
...@@ -103,6 +121,7 @@ TEST_F(LauncherTooltipManagerTest, HideWhenShelfIsHidden) { ...@@ -103,6 +121,7 @@ TEST_F(LauncherTooltipManagerTest, HideWhenShelfIsHidden) {
scoped_ptr<views::Widget> widget(new views::Widget); scoped_ptr<views::Widget> widget(new views::Widget);
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.context = CurrentContext();
widget->Init(params); widget->Init(params);
widget->SetFullscreen(true); widget->SetFullscreen(true);
widget->Show(); widget->Show();
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "ash/launcher/launcher_tooltip_manager.h" #include "ash/launcher/launcher_tooltip_manager.h"
#include "ash/root_window_controller.h" #include "ash/root_window_controller.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ash/test/ash_test_base.h" #include "ash/test/ash_test_base.h"
#include "ash/test/launcher_view_test_api.h" #include "ash/test/launcher_view_test_api.h"
#include "ash/test/test_launcher_delegate.h" #include "ash/test/test_launcher_delegate.h"
...@@ -21,6 +22,7 @@ ...@@ -21,6 +22,7 @@
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "grit/ash_resources.h" #include "grit/ash_resources.h"
#include "ui/aura/root_window.h"
#include "ui/aura/test/aura_test_base.h" #include "ui/aura/test/aura_test_base.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/base/events/event.h" #include "ui/base/events/event.h"
...@@ -109,6 +111,7 @@ TEST_F(LauncherViewIconObserverTest, AddRemove) { ...@@ -109,6 +111,7 @@ TEST_F(LauncherViewIconObserverTest, AddRemove) {
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 200, 200); params.bounds = gfx::Rect(0, 0, 200, 200);
params.context = CurrentContext();
scoped_ptr<views::Widget> widget(new views::Widget()); scoped_ptr<views::Widget> widget(new views::Widget());
widget->Init(params); widget->Init(params);
...@@ -200,6 +203,20 @@ class LauncherViewTest : public AshTestBase { ...@@ -200,6 +203,20 @@ class LauncherViewTest : public AshTestBase {
} }
protected: protected:
void EnsureViewIsInWidget() {
widget_.reset(new views::Widget);
views::Widget::InitParams params(
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.transparent = true;
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = Shell::GetContainer(
Shell::GetPrimaryRootWindow(),
ash::internal::kShellWindowId_LauncherContainer);
widget_->Init(params);
widget_->SetContentsView(launcher_view_.get());
}
LauncherID AddAppShortcut() { LauncherID AddAppShortcut() {
LauncherItem item; LauncherItem item;
item.type = TYPE_APP_SHORTCUT; item.type = TYPE_APP_SHORTCUT;
...@@ -341,6 +358,7 @@ class LauncherViewTest : public AshTestBase { ...@@ -341,6 +358,7 @@ class LauncherViewTest : public AshTestBase {
MockLauncherDelegate delegate_; MockLauncherDelegate delegate_;
scoped_ptr<LauncherModel> model_; scoped_ptr<LauncherModel> model_;
scoped_ptr<views::Widget> widget_;
scoped_ptr<internal::LauncherView> launcher_view_; scoped_ptr<internal::LauncherView> launcher_view_;
scoped_ptr<LauncherViewTestAPI> test_api_; scoped_ptr<LauncherViewTestAPI> test_api_;
...@@ -682,6 +700,8 @@ TEST_F(LauncherViewTest, LauncherItemStatusPlatformApp) { ...@@ -682,6 +700,8 @@ TEST_F(LauncherViewTest, LauncherItemStatusPlatformApp) {
} }
TEST_F(LauncherViewTest, LauncherTooltipTest) { TEST_F(LauncherViewTest, LauncherTooltipTest) {
EnsureViewIsInWidget();
ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1, ASSERT_EQ(test_api_->GetLastVisibleIndex() + 1,
test_api_->GetButtonCount()); test_api_->GetButtonCount());
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "ash/shell.h"
#include "base/utf_string_conversions.h" // ASCIIToUTF16 #include "base/utf_string_conversions.h" // ASCIIToUTF16
#include "ui/aura/root_window.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/gfx/canvas.h" #include "ui/gfx/canvas.h"
#include "ui/views/controls/button/checkbox.h" #include "ui/views/controls/button/checkbox.h"
...@@ -131,7 +133,8 @@ namespace shell { ...@@ -131,7 +133,8 @@ namespace shell {
void CreateWidgetsWindow() { void CreateWidgetsWindow() {
gfx::Rect bounds(kWindowLeft, kWindowTop, kWindowWidth, kWindowHeight); gfx::Rect bounds(kWindowLeft, kWindowTop, kWindowWidth, kWindowHeight);
views::Widget* widget = views::Widget* widget =
views::Widget::CreateWindowWithBounds(new WidgetsWindow, bounds); views::Widget::CreateWindowWithContextAndBounds(
new WidgetsWindow, Shell::GetPrimaryRootWindow(), bounds);
widget->GetNativeView()->SetName("WidgetsWindow"); widget->GetNativeView()->SetName("WidgetsWindow");
widget->Show(); widget->Show();
} }
......
...@@ -183,8 +183,10 @@ void AddViewToLayout(views::GridLayout* layout, views::View* view) { ...@@ -183,8 +183,10 @@ void AddViewToLayout(views::GridLayout* layout, views::View* view) {
void InitWindowTypeLauncher() { void InitWindowTypeLauncher() {
views::Widget* widget = views::Widget* widget =
views::Widget::CreateWindowWithBounds(new WindowTypeLauncher, views::Widget::CreateWindowWithContextAndBounds(
gfx::Rect(120, 150, 300, 410)); new WindowTypeLauncher,
Shell::GetPrimaryRootWindow(),
gfx::Rect(120, 150, 300, 410));
widget->GetNativeView()->SetName("WindowTypeLauncher"); widget->GetNativeView()->SetName("WindowTypeLauncher");
views::corewm::SetShadowType(widget->GetNativeView(), views::corewm::SetShadowType(widget->GetNativeView(),
views::corewm::SHADOW_TYPE_RECTANGULAR); views::corewm::SHADOW_TYPE_RECTANGULAR);
......
...@@ -217,7 +217,8 @@ TEST_F(CandidateWindowViewTest, ShortcutSettingTest) { ...@@ -217,7 +217,8 @@ TEST_F(CandidateWindowViewTest, ShortcutSettingTest) {
const char* kExpectedHorizontalCustomizedLabel[] = { "a.", "s.", "d." }; const char* kExpectedHorizontalCustomizedLabel[] = { "a.", "s.", "d." };
views::Widget* widget = new views::Widget; views::Widget* widget = new views::Widget;
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); views::Widget::InitParams params =
CreateParams(views::Widget::InitParams::TYPE_WINDOW);
widget->Init(params); widget->Init(params);
CandidateWindowView candidate_window_view(widget); CandidateWindowView candidate_window_view(widget);
...@@ -423,7 +424,8 @@ TEST_F(CandidateWindowViewTest, DoNotChangeRowHeightWithLabelSwitchTest) { ...@@ -423,7 +424,8 @@ TEST_F(CandidateWindowViewTest, DoNotChangeRowHeightWithLabelSwitchTest) {
// We should NOT manually free widget by default, otherwise double free will // We should NOT manually free widget by default, otherwise double free will
// be occurred. So, we should instantiate widget class with "new" operation. // be occurred. So, we should instantiate widget class with "new" operation.
views::Widget* widget = new views::Widget; views::Widget* widget = new views::Widget;
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); views::Widget::InitParams params =
CreateParams(views::Widget::InitParams::TYPE_WINDOW);
widget->Init(params); widget->Init(params);
CandidateWindowView candidate_window_view(widget); CandidateWindowView candidate_window_view(widget);
......
...@@ -79,6 +79,9 @@ void NativeAppWindowViews::InitializeDefaultWindow( ...@@ -79,6 +79,9 @@ void NativeAppWindowViews::InitializeDefaultWindow(
init_params.delegate = this; init_params.delegate = this;
init_params.remove_standard_frame = true; init_params.remove_standard_frame = true;
init_params.use_system_default_icon = true; init_params.use_system_default_icon = true;
// TODO(erg): Conceptually, these are toplevel windows, but we theoretically
// could plumb context through to here in some cases.
init_params.top_level = true;
window_->Init(init_params); window_->Init(init_params);
gfx::Rect window_bounds = create_params.bounds; gfx::Rect window_bounds = create_params.bounds;
window_bounds.Inset(-GetFrameInsets()); window_bounds.Inset(-GetFrameInsets());
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
namespace oak { namespace oak {
// Shows the Oak window. Refocuses an existing one. // Shows the Oak window. Refocuses an existing one.
OAK_EXPORT void ShowOakWindow(); OAK_EXPORT void ShowOakWindowWithContext(gfx::NativeView context);
} // namespace oak } // namespace oak
......
...@@ -146,11 +146,14 @@ void OakWindow::Init() { ...@@ -146,11 +146,14 @@ void OakWindow::Init() {
} // namespace internal } // namespace internal
void ShowOakWindow() { void ShowOakWindowWithContext(gfx::NativeView context) {
if (!internal::OakWindow::instance) { if (!internal::OakWindow::instance) {
// TODO(erg): Do we want to reuse this window in times with a different
// context? For now, this is OK, but if we ever use Oak outside of the ash
// shell, we run into crbug.com/165759.
internal::OakWindow::instance = internal::OakWindow::instance =
views::Widget::CreateWindowWithBounds(new internal::OakWindow, views::Widget::CreateWindowWithContextAndBounds(
gfx::Rect(10, 10, 500, 500)); new internal::OakWindow, context, gfx::Rect(10, 10, 500, 500));
} }
internal::OakWindow::instance->Show(); internal::OakWindow::instance->Show();
} }
......
...@@ -17,8 +17,8 @@ ...@@ -17,8 +17,8 @@
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/models/table_model.h" #include "ui/base/models/table_model.h"
#include "ui/base/models/table_model_observer.h" #include "ui/base/models/table_model_observer.h"
#include "ui/base/win/scoped_ole_initializer.h"
#include "ui/views/controls/table/table_view.h" #include "ui/views/controls/table/table_view.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h" #include "ui/views/widget/widget_delegate.h"
...@@ -133,7 +133,7 @@ int TestTableModel::CompareValues(int row1, int row2, int column_id) { ...@@ -133,7 +133,7 @@ int TestTableModel::CompareValues(int row1, int row2, int column_id) {
// TableViewTest --------------------------------------------------------------- // TableViewTest ---------------------------------------------------------------
class TableViewTest : public testing::Test, views::WidgetDelegate { class TableViewTest : public ViewsTestBase, views::WidgetDelegate {
public: public:
virtual void SetUp() OVERRIDE; virtual void SetUp() OVERRIDE;
virtual void TearDown() OVERRIDE; virtual void TearDown() OVERRIDE;
...@@ -173,28 +173,29 @@ class TableViewTest : public testing::Test, views::WidgetDelegate { ...@@ -173,28 +173,29 @@ class TableViewTest : public testing::Test, views::WidgetDelegate {
TableView* table_; TableView* table_;
private: private:
MessageLoopForUI message_loop_;
views::Widget* window_; views::Widget* window_;
ui::ScopedOleInitializer ole_initializer_;
}; };
void TableViewTest::SetUp() { void TableViewTest::SetUp() {
ViewsTestBase::SetUp();
model_.reset(CreateModel()); model_.reset(CreateModel());
std::vector<ui::TableColumn> columns; std::vector<ui::TableColumn> columns;
columns.resize(2); columns.resize(2);
columns[0].id = 0; columns[0].id = 0;
columns[1].id = 1; columns[1].id = 1;
// TODO(erg): This crashes on windows. Try making this derive from ViewsTests.
table_ = new TableView(model_.get(), columns, views::ICON_AND_TEXT, table_ = new TableView(model_.get(), columns, views::ICON_AND_TEXT,
false, false, false); false, false, false);
window_ = views::Widget::CreateWindowWithBounds( window_ = views::Widget::CreateWindowWithContextAndBounds(
this, this, GetContext(), gfx::Rect(100, 100, 512, 512));
gfx::Rect(100, 100, 512, 512));
} }
void TableViewTest::TearDown() { void TableViewTest::TearDown() {
window_->Close(); window_->Close();
// Temporary workaround to avoid leak of RootView::pending_paint_task_.
message_loop_.RunUntilIdle(); ViewsTestBase::TearDown();
} }
void TableViewTest::VerifyViewOrder(int first, ...) { void TableViewTest::VerifyViewOrder(int first, ...) {
......
...@@ -69,4 +69,12 @@ Widget::InitParams ViewsTestBase::CreateParams( ...@@ -69,4 +69,12 @@ Widget::InitParams ViewsTestBase::CreateParams(
return params; return params;
} }
gfx::NativeView ViewsTestBase::GetContext() {
#if defined(USE_AURA)
return aura_test_helper_->root_window();
#else
return NULL;
#endif
}
} // namespace views } // namespace views
...@@ -48,6 +48,10 @@ class ViewsTestBase : public testing::Test { ...@@ -48,6 +48,10 @@ class ViewsTestBase : public testing::Test {
// cross-platform tests. // cross-platform tests.
Widget::InitParams CreateParams(Widget::InitParams::Type type); Widget::InitParams CreateParams(Widget::InitParams::Type type);
// Returns a context view. In aura builds, this will be the
// RootWindow. Everywhere else, NULL.
gfx::NativeView GetContext();
private: private:
MessageLoopForUI message_loop_; MessageLoopForUI message_loop_;
scoped_ptr<TestViewsDelegate> views_delegate_; scoped_ptr<TestViewsDelegate> views_delegate_;
......
...@@ -229,18 +229,18 @@ Widget* Widget::CreateWindow(WidgetDelegate* delegate) { ...@@ -229,18 +229,18 @@ Widget* Widget::CreateWindow(WidgetDelegate* delegate) {
return widget; return widget;
} }
// static
Widget* Widget::CreateWindowWithParent(WidgetDelegate* delegate,
gfx::NativeWindow parent) {
return CreateWindowWithParentAndBounds(delegate, parent, gfx::Rect());
}
// static // static
Widget* Widget::CreateWindowWithBounds(WidgetDelegate* delegate, Widget* Widget::CreateWindowWithBounds(WidgetDelegate* delegate,
const gfx::Rect& bounds) { const gfx::Rect& bounds) {
return CreateWindowWithParentAndBounds(delegate, NULL, bounds); return CreateWindowWithParentAndBounds(delegate, NULL, bounds);
} }
// static
Widget* Widget::CreateWindowWithParent(WidgetDelegate* delegate,
gfx::NativeWindow parent) {
return CreateWindowWithParentAndBounds(delegate, parent, gfx::Rect());
}
// static // static
Widget* Widget::CreateWindowWithParentAndBounds(WidgetDelegate* delegate, Widget* Widget::CreateWindowWithParentAndBounds(WidgetDelegate* delegate,
gfx::NativeWindow parent, gfx::NativeWindow parent,
......
...@@ -207,12 +207,20 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate, ...@@ -207,12 +207,20 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
Widget(); Widget();
virtual ~Widget(); virtual ~Widget();
// Creates a decorated window Widget with the specified properties. // Creates a toplevel window with no context. These methods should only be
// used in cases where there is no contextual information because we're
// creating a toplevel window connected to no other event.
//
// If you have any parenting or context information, or can pass that
// information, prefer the WithParent or WithContext versions of these
// methods.
static Widget* CreateWindow(WidgetDelegate* delegate); static Widget* CreateWindow(WidgetDelegate* delegate);
static Widget* CreateWindowWithParent(WidgetDelegate* delegate,
gfx::NativeWindow parent);
static Widget* CreateWindowWithBounds(WidgetDelegate* delegate, static Widget* CreateWindowWithBounds(WidgetDelegate* delegate,
const gfx::Rect& bounds); const gfx::Rect& bounds);
// Creates a decorated window Widget with the specified properties.
static Widget* CreateWindowWithParent(WidgetDelegate* delegate,
gfx::NativeWindow parent);
static Widget* CreateWindowWithParentAndBounds(WidgetDelegate* delegate, static Widget* CreateWindowWithParentAndBounds(WidgetDelegate* delegate,
gfx::NativeWindow parent, gfx::NativeWindow parent,
const gfx::Rect& bounds); const gfx::Rect& bounds);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment