Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5051)

Unified Diff: chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_browsertest.mm

Issue 986333006: Center permission bubble if location bar is hidden in MacOS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Apply Feedback Part 1 Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_browsertest.mm
diff --git a/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_browsertest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..c5f1deff2a49d85ef5cde6f4a21b35c66e4d8ba2
--- /dev/null
+++ b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_browsertest.mm
@@ -0,0 +1,297 @@
+// Copyright 2015 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 "base/command_line.h"
+#include "base/stl_util.h"
+#include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/extensions/extension_util.h"
+#include "chrome/browser/first_run/first_run.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_iterator.h"
+#import "chrome/browser/ui/cocoa/browser_window_controller.h"
+#import "chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa.h"
+#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
+#include "chrome/browser/ui/startup/startup_types.h"
+#include "chrome/browser/ui/website_settings/mock_permission_bubble_request.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/grit/generated_resources.h"
+#include "extensions/browser/extension_registry.h"
+#include "net/dns/mock_host_resolver.h"
+#import "ui/base/cocoa/fullscreen_window_manager.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+
+// To be used when getting the anchor with a location bar. The bubble should be
+// in the top-right corner.
+const int kTolerance = 200;
groby-ooo-7-16 2015/04/02 22:21:13 I don't think 200 pixels is an acceptable toleranc
hcarmona 2015/04/04 01:04:23 Made tolerance smaller and moved my expected point
+
+class TestPermissionBubbleCocoa : public PermissionBubbleCocoa {
+ public:
+ TestPermissionBubbleCocoa(NSWindow* parent_window)
+ : PermissionBubbleCocoa(parent_window) {}
+
+ // Returns the base class value for testing |HasLocationBar|.
+ bool HasLocationBar() override {
+ return PermissionBubbleCocoa::HasLocationBar();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestPermissionBubbleCocoa);
+};
+
+class MockPermissionBubbleCocoa : public PermissionBubbleCocoa {
groby-ooo-7-16 2015/04/02 22:21:12 FWIW: You can just add a mock class via gmock.h c
hcarmona 2015/04/04 01:04:22 Awesome! Done.
+ public:
+ MockPermissionBubbleCocoa(NSWindow* parent_window)
+ : PermissionBubbleCocoa(parent_window), location_bar_present_(false) {}
+
+ // Sets the delegate value for testing |GetAnchorPoint|.
+ void set_location_bar_present(bool value) { location_bar_present_ = value; }
+
+ protected:
+ bool location_bar_present_;
+
+ // Override to mock location bar in tests.
+ bool HasLocationBar() override { return location_bar_present_; }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockPermissionBubbleCocoa);
+};
+
+class TestPermissionBubbleViewDelegate : public PermissionBubbleView::Delegate {
groby-ooo-7-16 2015/04/02 22:21:12 Since this does exactly squat, gmock to the rescue
hcarmona 2015/04/04 01:04:22 Done.
+ public:
+ TestPermissionBubbleViewDelegate() : PermissionBubbleView::Delegate() {}
+
+ void ToggleAccept(int, bool) override {}
+ void Accept() override {}
+ void Deny() override {}
+ void Closing() override {}
+ void SetView(PermissionBubbleView* view) override {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestPermissionBubbleViewDelegate);
+};
+
+// Inherit from ExtensionBrowserTest instead of InProcessBrowserTest because
+// testing app mode requires extensions.
+class PermissionBubbleCocoaBrowsertest : public ExtensionBrowserTest {
+ public:
+ PermissionBubbleCocoaBrowsertest()
+ : ExtensionBrowserTest(), controller_(nullptr) {}
+
+ void SetUpOnMainThread() override {
+ ExtensionBrowserTest::SetUpOnMainThread();
+
+ // Add a single permission request
+ MockPermissionBubbleRequest* request = new MockPermissionBubbleRequest(
+ "Request 1", l10n_util::GetStringUTF8(IDS_PERMISSION_ALLOW),
+ l10n_util::GetStringUTF8(IDS_PERMISSION_DENY));
+ requests_.push_back(request);
+ }
+
+ void TearDownOnMainThread() override {
+ if (browser()->tab_strip_model())
+ browser()->tab_strip_model()->CloseSelectedTabs();
+
+ if (controller_)
+ [controller_ close];
+
+ STLDeleteElements(&requests_);
groby-ooo-7-16 2015/04/02 22:21:12 Use a ScopedVector instead.
hcarmona 2015/04/04 01:04:22 Done.
+ ExtensionBrowserTest::TearDownOnMainThread();
+ }
+
+ virtual PermissionBubbleCocoa* CreatePermissionBubble(
+ NSWindow* parent_window) {
+ return new TestPermissionBubbleCocoa(parent_window);
+ }
+
+ bool HasLocationBar() {
+ return static_cast<TestPermissionBubbleCocoa*>(permission_bubble_.get())
+ ->HasLocationBar();
+ }
+
+ void ShowPermissionBubble(Browser* cur_browser) {
+ controller_ = [[BrowserWindowController alloc] initWithBrowser:cur_browser
groby-ooo-7-16 2015/04/02 22:21:13 Why create one? This sequence should yield the BW
hcarmona 2015/04/04 01:04:22 Done.
+ takeOwnership:NO];
+ [controller_ showWindow:nil];
+
+ permission_bubble_.reset(CreatePermissionBubble([controller_ window]));
+ permission_delegate_.reset(new TestPermissionBubbleViewDelegate());
groby-ooo-7-16 2015/04/02 22:21:12 The mock already takes care of this, but: Why do y
hcarmona 2015/04/04 01:04:22 Done.
+ permission_bubble_->SetDelegate(permission_delegate_.get());
+
+ permission_bubble_->Show(requests_, accept_states_);
+ }
+
+ protected:
+ BrowserWindowController* controller_;
+ scoped_ptr<PermissionBubbleCocoa> permission_bubble_;
+ scoped_ptr<TestPermissionBubbleViewDelegate> permission_delegate_;
+ std::vector<PermissionBubbleRequest*> requests_;
+ std::vector<bool> accept_states_;
+};
+
+// Default Window Test /////////////////////////////////////////////////////////
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaBrowsertest,
+ HasLocationBarByDefault) {
+ ShowPermissionBubble(browser());
+ EXPECT_TRUE(HasLocationBar());
+}
+
+// Fullscreen Test /////////////////////////////////////////////////////////////
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaBrowsertest,
+ FullscreenHasLocationBar) {
+ ShowPermissionBubble(browser());
+
+ base::scoped_nsobject<FullscreenWindowManager> manager(
+ [[FullscreenWindowManager alloc] initWithWindow:[controller_ window]
+ desiredScreen:[NSScreen mainScreen]]);
+ EXPECT_TRUE(HasLocationBar());
+ [manager enterFullscreenMode];
+ EXPECT_TRUE(HasLocationBar());
+ [manager exitFullscreenMode];
+ EXPECT_TRUE(HasLocationBar());
+}
+
+// App Test ////////////////////////////////////////////////////////////////////
+
+class PermissionBubbleCocoaAppTest : public PermissionBubbleCocoaBrowsertest {
+ public:
+ PermissionBubbleCocoaAppTest()
+ : PermissionBubbleCocoaBrowsertest(), app_browser_(nullptr) {}
+
+ void TearDownOnMainThread() override {
+ if (app_browser_)
+ app_browser_->tab_strip_model()->CloseSelectedTabs();
+
+ PermissionBubbleCocoaBrowsertest::TearDownOnMainThread();
+ }
+
+ // Only one app can be opened per test.
+ bool OpenExtensionAppWindow(const extensions::Extension* extension) {
groby-ooo-7-16 2015/04/02 22:21:13 Question: Can this code be shared in a util place?
hcarmona 2015/04/04 01:04:23 Would it make sense to move it to the ExtensionBro
+ // On MacOS, it's not possible to enter app mode with the new bookmark apps
+ // enabled.
hcarmona 2015/04/02 01:30:14 I'm currently looking into this. Spoke with benwel
groby-ooo-7-16 2015/04/02 22:21:12 Well, then let's not land this until we know we're
hcarmona 2015/04/04 01:04:22 Issue is not related to this change, created bug 4
+ if (extensions::util::IsNewBookmarkAppsEnabled())
+ return false;
+
+ base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+ command_line.AppendSwitchASCII(switches::kAppId, extension->id());
+
+ chrome::startup::IsFirstRun first_run =
groby-ooo-7-16 2015/04/02 22:21:13 Why do we care about first_run status? Just launch
hcarmona 2015/04/04 01:04:22 Code no longer needed in this test.
+ first_run::IsChromeFirstRun() ? chrome::startup::IS_FIRST_RUN
+ : chrome::startup::IS_NOT_FIRST_RUN;
+ StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
+
+ if (!launch.OpenApplicationWindow(browser()->profile(), NULL))
+ return false;
+
+ unsigned int browser_count = chrome::GetBrowserCount(
+ browser()->profile(), browser()->host_desktop_type());
+
+ if (browser_count != 2)
groby-ooo-7-16 2015/04/02 22:21:12 Please ASSERT here - that way, we know what exactl
hcarmona 2015/04/04 01:04:22 Code changed so we get the browser and don't need
+ return false;
+
+ for (chrome::BrowserIterator it; !it.done(); it.Next()) {
+ if (*it != browser()) {
+ app_browser_ = *it;
+ return true;
+ }
+ }
+
+ NOTREACHED();
+ return false;
+ }
+
+ Browser* app_browser() { return app_browser_; }
+
+ private:
+ Browser* app_browser_;
+};
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaAppTest, AppHasNoLocationBar) {
+ auto extension = LoadExtension(test_data_dir_.AppendASCII("packaged_app/"));
+
+ ASSERT_TRUE(extension);
+ ASSERT_TRUE(OpenExtensionAppWindow(extension));
+
+ ShowPermissionBubble(app_browser());
+
+ EXPECT_TRUE(app_browser()->is_app());
+ EXPECT_FALSE(HasLocationBar());
+}
+
+// Kiosk Test //////////////////////////////////////////////////////////////////
+
+class PermissionBubbleCocoaKioskTest : public PermissionBubbleCocoaBrowsertest {
+ public:
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ PermissionBubbleCocoaBrowsertest::SetUpCommandLine(command_line);
+ command_line->AppendSwitch(switches::kKioskMode);
+ }
+};
+
+// http://crbug.com/470724
+// Kiosk mode on Mac has a location bar but it shouldn't.
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaKioskTest,
+ DISABLED_KioskHasNoLocationBar) {
+ ShowPermissionBubble(browser());
+ EXPECT_FALSE(HasLocationBar());
+}
+
+// Anchor Position Tests ///////////////////////////////////////////////////////
+
+class PermissionBubbleCocoaAnchorBrowsertest
+ : public PermissionBubbleCocoaBrowsertest {
+ protected:
+ PermissionBubbleCocoa* CreatePermissionBubble(
+ NSWindow* parent_window) override {
+ return new MockPermissionBubbleCocoa(parent_window);
+ }
+
+ void SetLocationBarPresent(bool present) {
+ static_cast<MockPermissionBubbleCocoa*>(permission_bubble_.get())
+ ->set_location_bar_present(present);
+ }
+};
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaAnchorBrowsertest,
+ AnchorPositionWithLocationBar) {
+ ShowPermissionBubble(browser());
+ SetLocationBarPresent(true);
+
+ NSPoint anchor = permission_bubble_->GetAnchorPoint();
+ NSWindow* window = [controller_ window];
+ NSRect frame = [window frame];
+
+ // Expected anchor location will be top left when there's a location bar.
+ NSPoint expected = NSMakePoint(0, frame.size.height);
groby-ooo-7-16 2015/04/02 22:21:13 You want NSMinX(frame), NSMaxY(frame) (it's not gu
hcarmona 2015/04/04 01:04:22 Done.
+ expected = [window convertBaseToScreen:expected];
+
+ // Anchor should be close to the left of the screen.
+ EXPECT_GE(expected.x + kTolerance, anchor.x);
+ EXPECT_LE(expected.x, anchor.x);
+
+ // Anchor should be close to the top of the screen.
+ EXPECT_GE(expected.y, anchor.y);
+ EXPECT_LE(expected.y - kTolerance, anchor.y);
groby-ooo-7-16 2015/04/02 22:21:12 That means exepcted.y should be within kTolerance
hcarmona 2015/04/04 01:04:22 Done.
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaAnchorBrowsertest,
+ AnchorPositionWithoutLocationBar) {
+ ShowPermissionBubble(browser());
+ SetLocationBarPresent(false);
+
+ NSPoint anchor = permission_bubble_->GetAnchorPoint();
+ NSWindow* window = [controller_ window];
+ NSRect frame = [window frame];
+
+ // Expected anchor location will be top center when there's no location bar.
+ NSPoint expected = NSMakePoint(frame.size.width / 2, frame.size.height);
+ expected = [window convertBaseToScreen:expected];
+
+ // Anchor should be centered.
+ EXPECT_EQ(expected.x, anchor.x);
groby-ooo-7-16 2015/04/02 22:21:12 EXPECT_TRUE(NSEqualPoints(expected, anchor));
hcarmona 2015/04/04 01:04:23 Done.
+ EXPECT_EQ(expected.y, anchor.y);
+}

Powered by Google App Engine
This is Rietveld 408576698