blob: b827d78890dc1c805670c192c3de1d2243e9ff65 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/test/views_test_helper_mac.h"
#import <Cocoa/Cocoa.h>
#include "base/functional/bind.h"
#include "ui/base/test/scoped_fake_nswindow_focus.h"
#include "ui/base/test/scoped_fake_nswindow_fullscreen.h"
#include "ui/base/test/ui_controls.h"
#include "ui/events/test/event_generator.h"
#include "ui/views/test/event_generator_delegate_mac.h"
#include "ui/views/test/test_views_delegate.h"
#include "ui/views/widget/widget.h"
namespace views {
// static
std::unique_ptr<ViewsTestHelper> ViewsTestHelper::Create() {
return std::make_unique<ViewsTestHelperMac>();
}
ViewsTestHelperMac::ViewsTestHelperMac() {
// Unbundled applications (those without Info.plist) default to
// NSApplicationActivationPolicyProhibited, which prohibits the application
// obtaining key status or activating windows without user interaction.
NSApp.activationPolicy = NSApplicationActivationPolicyRegular;
ui::test::EventGeneratorDelegate::SetFactoryFunction(
base::BindRepeating(&test::CreateEventGeneratorDelegateMac));
// Assume that if the methods in the ui_controls.h test header are enabled
// then the test runner is in a non-sharded mode, and will use "real"
// activations and fullscreen mode. This allows interactive_ui_tests to test
// the actual OS window activation and fullscreen codepaths.
if (!ui_controls::IsUIControlsEnabled()) {
faked_focus_ = std::make_unique<ui::test::ScopedFakeNSWindowFocus>();
faked_fullscreen_ =
std::make_unique<ui::test::ScopedFakeNSWindowFullscreen>();
}
}
ViewsTestHelperMac::~ViewsTestHelperMac() {
// Ensure all Widgets are closed explicitly in tests. The Widget may be
// hosting a Compositor. If that's torn down after the test ContextFactory
// then a lot of confusing use-after-free errors result. In browser tests,
// this is handled automatically by views::Widget::CloseAllSecondaryWidgets().
// Unit tests on Aura may create Widgets owned by a RootWindow that gets torn
// down, but on Mac we need to be more explicit.
@autoreleasepool {
NSArray* native_windows = NSApp.windows;
for (NSWindow* window : native_windows) {
DCHECK(!Widget::GetWidgetForNativeWindow(gfx::NativeWindow(window)))
<< "Widget not closed.";
}
ui::test::EventGeneratorDelegate::SetFactoryFunction(
ui::test::EventGeneratorDelegate::FactoryFunction());
}
}
void ViewsTestHelperMac::SetUpTestViewsDelegate(
TestViewsDelegate* delegate,
std::optional<ViewsDelegate::NativeWidgetFactory> factory) {
ViewsTestHelper::SetUpTestViewsDelegate(delegate, std::move(factory));
delegate->set_context_factory(context_factories_.GetContextFactory());
}
void ViewsTestHelperMac::TearDownTestViewsDelegate(
TestViewsDelegate* delegate) {
delegate->set_context_factory(nullptr);
ViewsTestHelper::TearDownTestViewsDelegate(delegate);
}
} // namespace views