OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ui/views/widget/native_widget_mac.h" | 5 #import "ui/views/widget/native_widget_mac.h" |
6 | 6 |
7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 | 8 |
9 #import "base/mac/scoped_nsobject.h" | 9 #import "base/mac/scoped_nsobject.h" |
10 #import "base/mac/scoped_objc_class_swizzler.h" | 10 #import "base/mac/scoped_objc_class_swizzler.h" |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 | 402 |
403 id hit = [widget->GetNativeWindow() accessibilityHitTest:midpoint]; | 403 id hit = [widget->GetNativeWindow() accessibilityHitTest:midpoint]; |
404 id title = [hit accessibilityAttributeValue:NSAccessibilityTitleAttribute]; | 404 id title = [hit accessibilityAttributeValue:NSAccessibilityTitleAttribute]; |
405 EXPECT_NSEQ(title, @"Green"); | 405 EXPECT_NSEQ(title, @"Green"); |
406 } | 406 } |
407 | 407 |
408 // Tests creating a views::Widget parented off a native NSWindow. | 408 // Tests creating a views::Widget parented off a native NSWindow. |
409 TEST_F(NativeWidgetMacTest, NonWidgetParent) { | 409 TEST_F(NativeWidgetMacTest, NonWidgetParent) { |
410 NSWindow* native_parent = MakeNativeParent(); | 410 NSWindow* native_parent = MakeNativeParent(); |
411 | 411 |
| 412 base::scoped_nsobject<NSView> anchor_view( |
| 413 [[NSView alloc] initWithFrame:[[native_parent contentView] bounds]]); |
| 414 [[native_parent contentView] addSubview:anchor_view]; |
| 415 |
412 // Note: Don't use WidgetTest::CreateChildPlatformWidget because that makes | 416 // Note: Don't use WidgetTest::CreateChildPlatformWidget because that makes |
413 // windows of TYPE_CONTROL which are automatically made visible. But still | 417 // windows of TYPE_CONTROL which are automatically made visible. But still |
414 // mark it as a child to test window positioning. | 418 // mark it as a child to test window positioning. |
415 Widget* child = new Widget; | 419 Widget* child = new Widget; |
416 Widget::InitParams init_params; | 420 Widget::InitParams init_params; |
417 init_params.parent = [native_parent contentView]; | 421 init_params.parent = anchor_view; |
418 init_params.child = true; | 422 init_params.child = true; |
419 child->Init(init_params); | 423 child->Init(init_params); |
420 | 424 |
421 TestWidgetObserver child_observer(child); | 425 TestWidgetObserver child_observer(child); |
422 | 426 |
423 // GetTopLevelNativeWidget() only goes as far as there exists a Widget (i.e. | 427 // GetTopLevelNativeWidget() only goes as far as there exists a Widget (i.e. |
424 // must stop at |child|. | 428 // must stop at |child|. |
425 internal::NativeWidgetPrivate* top_level_widget = | 429 internal::NativeWidgetPrivate* top_level_widget = |
426 internal::NativeWidgetPrivate::GetTopLevelNativeWidget( | 430 internal::NativeWidgetPrivate::GetTopLevelNativeWidget( |
427 child->GetNativeView()); | 431 child->GetNativeView()); |
428 EXPECT_EQ(child, top_level_widget->GetWidget()); | 432 EXPECT_EQ(child, top_level_widget->GetWidget()); |
429 | 433 |
430 // To verify the parent, we need to use NativeWidgetMac APIs. | 434 // To verify the parent, we need to use NativeWidgetMac APIs. |
431 BridgedNativeWidget* bridged_native_widget = | 435 BridgedNativeWidget* bridged_native_widget = |
432 NativeWidgetMac::GetBridgeForNativeWindow(child->GetNativeWindow()); | 436 NativeWidgetMac::GetBridgeForNativeWindow(child->GetNativeWindow()); |
433 EXPECT_EQ(native_parent, bridged_native_widget->parent()->GetNSWindow()); | 437 EXPECT_EQ(native_parent, bridged_native_widget->parent()->GetNSWindow()); |
434 | 438 |
435 child->SetBounds(gfx::Rect(50, 50, 200, 100)); | 439 child->SetBounds(gfx::Rect(50, 50, 200, 100)); |
436 EXPECT_FALSE(child->IsVisible()); | 440 EXPECT_FALSE(child->IsVisible()); |
437 EXPECT_EQ(0u, [[native_parent childWindows] count]); | 441 EXPECT_EQ(0u, [[native_parent childWindows] count]); |
438 | 442 |
439 child->Show(); | 443 child->Show(); |
440 EXPECT_TRUE(child->IsVisible()); | 444 EXPECT_TRUE(child->IsVisible()); |
441 EXPECT_EQ(1u, [[native_parent childWindows] count]); | 445 EXPECT_EQ(1u, [[native_parent childWindows] count]); |
442 EXPECT_EQ(child->GetNativeWindow(), | 446 EXPECT_EQ(child->GetNativeWindow(), |
443 [[native_parent childWindows] objectAtIndex:0]); | 447 [[native_parent childWindows] objectAtIndex:0]); |
444 EXPECT_EQ(native_parent, [child->GetNativeWindow() parentWindow]); | 448 EXPECT_EQ(native_parent, [child->GetNativeWindow() parentWindow]); |
445 | 449 |
446 // Child should be positioned on screen relative to the parent, but note we | 450 // Child should be positioned on screen relative to the parent, but note we |
447 // positioned the parent in Cooca coordinates, so we need to convert. | 451 // positioned the parent in Cocoa coordinates, so we need to convert. |
448 gfx::Point parent_origin = gfx::ScreenRectFromNSRect(ParentRect()).origin(); | 452 gfx::Point parent_origin = gfx::ScreenRectFromNSRect(ParentRect()).origin(); |
449 EXPECT_EQ(gfx::Rect(150, parent_origin.y() + 50, 200, 100), | 453 EXPECT_EQ(gfx::Rect(150, parent_origin.y() + 50, 200, 100), |
450 child->GetWindowBoundsInScreen()); | 454 child->GetWindowBoundsInScreen()); |
451 | 455 |
| 456 // Removing the anchor_view from its view hierarchy is permitted. This should |
| 457 // not break the relationship between the two windows. |
| 458 [anchor_view removeFromSuperview]; |
| 459 anchor_view.reset(); |
| 460 EXPECT_EQ(native_parent, bridged_native_widget->parent()->GetNSWindow()); |
| 461 |
452 // Closing the parent should close and destroy the child. | 462 // Closing the parent should close and destroy the child. |
453 EXPECT_FALSE(child_observer.widget_closed()); | 463 EXPECT_FALSE(child_observer.widget_closed()); |
454 [native_parent close]; | 464 [native_parent close]; |
455 EXPECT_TRUE(child_observer.widget_closed()); | 465 EXPECT_TRUE(child_observer.widget_closed()); |
456 | 466 |
457 EXPECT_EQ(0u, [[native_parent childWindows] count]); | 467 EXPECT_EQ(0u, [[native_parent childWindows] count]); |
458 } | 468 } |
459 | 469 |
460 // Use Native APIs to query the tooltip text that would be shown once the | 470 // Use Native APIs to query the tooltip text that would be shown once the |
461 // tooltip delay had elapsed. | 471 // tooltip delay had elapsed. |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 } | 703 } |
694 | 704 |
695 } // namespace test | 705 } // namespace test |
696 } // namespace views | 706 } // namespace views |
697 | 707 |
698 @implementation TestStopAnimationWaiter | 708 @implementation TestStopAnimationWaiter |
699 - (void)setWindowStateForEnd { | 709 - (void)setWindowStateForEnd { |
700 views::test::ScopedSwizzleWaiter::GetMethodAndMarkCalled()(self, _cmd); | 710 views::test::ScopedSwizzleWaiter::GetMethodAndMarkCalled()(self, _cmd); |
701 } | 711 } |
702 @end | 712 @end |
OLD | NEW |