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

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: Attempt to fix failures in new tests 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..6a3daff60c83080d1229c3a95564a7d12c4c229b
--- /dev/null
+++ b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_browsertest.mm
@@ -0,0 +1,271 @@
+// 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
groby-ooo-7-16 2015/04/01 00:19:14 General Q: How much of this testing framework (for
hcarmona 2015/04/02 01:30:14 Most of these classes look like they can be shared
hcarmona 2015/04/04 01:04:22 These classes are now split so only the tests are
+// in the top-right corner.
+const int kTolerance = 200;
+
+class TestPermissionBubbleCocoa: public PermissionBubbleCocoa {
groby-ooo-7-16 2015/04/01 00:19:14 Space in front of ':'. Does git cl format not cat
hcarmona 2015/04/02 01:30:14 Had not run git cl format. I've fixed the formatti
+ public:
+ TestPermissionBubbleCocoa(NSWindow* parent_window):
groby-ooo-7-16 2015/04/01 00:19:14 space in front of ':'
hcarmona 2015/04/02 01:30:14 Done.
+ PermissionBubbleCocoa(parent_window),
+ location_bar_present_(false) {}
+
+ // Returns the base class value for testing |HasLocationBar|.
groby-ooo-7-16 2015/04/01 00:19:14 It seems you either want to mock, or you don't, bu
hcarmona 2015/04/02 01:30:14 Done.
+ bool BaseHasLocationBar() { return PermissionBubbleCocoa::HasLocationBar(); }
+
+ // 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_; }
groby-ooo-7-16 2015/04/01 00:19:14 private: DISALLOW_COPY_AND_ASSIGN...
hcarmona 2015/04/02 01:30:14 Done.
+};
+
+class TestPermissionBubbleViewDelegate: public PermissionBubbleView::Delegate {
+ void ToggleAccept(int, bool) override {};
+ void Accept() override {};
+ void Deny() override {};
+ void Closing() override {};
+ void SetView(PermissionBubbleView* view) override {};
+};
+
+// Inherit from ExtensionBrowserTest instead of InProcessBrowserTest because
+// testing app mode requires extensions.
+class PermissionBubbleCocoaBrowsertest : public ExtensionBrowserTest {
groby-ooo-7-16 2015/04/01 00:19:14 Huh. I had no idea ExtensionBrowserTest stuff live
hcarmona 2015/04/02 01:30:14 I'm a bit confused about what I should do here...
groby-ooo-7-16 2015/04/02 22:21:12 Nothing. I would've just expected ExtensionBrowser
+ 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_);
+ ExtensionBrowserTest::TearDownOnMainThread();
+ }
+
+ void ShowPermissionBubble(Browser* cur_browser) {
+ controller_ = [[BrowserWindowController alloc] initWithBrowser:cur_browser
+ takeOwnership:NO];
+ [controller_ showWindow:nil];
+
+ permission_bubble_.reset(
+ new TestPermissionBubbleCocoa([controller_ window]));
+ permission_delegate_.reset(new TestPermissionBubbleViewDelegate());
+ permission_bubble_->SetDelegate(permission_delegate_.get());
+
+ permission_bubble_->Show(requests_, accept_states_);
+ }
+
+ protected:
+ BrowserWindowController* controller_;
+ scoped_ptr<TestPermissionBubbleCocoa> permission_bubble_;
+ scoped_ptr<TestPermissionBubbleViewDelegate> permission_delegate_;
+ std::vector<PermissionBubbleRequest*> requests_;
+ std::vector<bool> accept_states_;
+};
+
+// Normal Window Test //////////////////////////////////////////////////////////
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaBrowsertest, NormalHasLocationBar) {
groby-ooo-7-16 2015/04/01 00:19:14 "Normal" is an unclear naming choice. "HasLocation
hcarmona 2015/04/02 01:30:14 Done.
+ ShowPermissionBubble(browser());
+ EXPECT_TRUE(permission_bubble_->BaseHasLocationBar());
+}
+
+// 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(permission_bubble_->BaseHasLocationBar());
+ [manager enterFullscreenMode];
+ EXPECT_TRUE(permission_bubble_->BaseHasLocationBar());
+ [manager exitFullscreenMode];
+ EXPECT_TRUE(permission_bubble_->BaseHasLocationBar());
+}
+
+// App Test ////////////////////////////////////////////////////////////////////
+
+class PermissionBubbleCocoaAppTest : public PermissionBubbleCocoaBrowsertest {
+ public:
+ PermissionBubbleCocoaAppTest():
+ PermissionBubbleCocoaBrowsertest() {}
+
+ // Returns the app extension aptly named "App Test".
+ const extensions::Extension* GetExtension() {
groby-ooo-7-16 2015/04/01 00:19:14 GetTestExtension? Also, are we guaranteed to have
hcarmona 2015/04/02 01:30:14 Refactored so this method is no longer needed. Als
+ extensions::ExtensionRegistry* registry =
+ extensions::ExtensionRegistry::Get(browser()->profile());
+ for (const scoped_refptr<const extensions::Extension>& extension :
+ registry->enabled_extensions()) {
+ if (extension->name() == "App Test")
+ return extension.get();
+ }
+ NOTREACHED();
+ return NULL;
+ }
+};
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaAppTest, AppHasNoLocationBar) {
+ ASSERT_TRUE(test_server()->Start());
+
+ // There should be one tab to start with.
+ ASSERT_EQ(1, browser()->tab_strip_model()->count());
+
+ // Load an app.
+ host_resolver()->AddRule("www.example.com", "127.0.0.1");
+ ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
+ const extensions::Extension* extension_app = GetExtension();
+
+ base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+ command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
+
+ chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
+ chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
+ StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
+
+ bool new_bookmark_apps_enabled = extensions::util::IsNewBookmarkAppsEnabled();
+
+ // If the new bookmark app flow is enabled, the app should open as a tab.
+ // Otherwise the app should open as an app window.
+ EXPECT_EQ(!new_bookmark_apps_enabled,
+ launch.OpenApplicationWindow(browser()->profile(), NULL));
+ EXPECT_EQ(new_bookmark_apps_enabled,
+ launch.OpenApplicationTab(browser()->profile()));
+
+ // Check that a the number of browsers and tabs is correct.
+ unsigned int expected_browsers = 1;
+ int expected_tabs = 1;
+ new_bookmark_apps_enabled ? expected_tabs++ : expected_browsers++;
+
+ EXPECT_EQ(expected_browsers,
+ chrome::GetBrowserCount(browser()->profile(),
+ browser()->host_desktop_type()));
+ EXPECT_EQ(expected_tabs, browser()->tab_strip_model()->count());
+
+ Browser* cur_browser = browser();
+ if (expected_browsers == 2) {
+ for (chrome::BrowserIterator it; !it.done(); it.Next()) {
+ if (*it == browser())
+ continue;
+ else
+ cur_browser = *it;
+ }
+
+ EXPECT_NE(browser(), cur_browser);
+ }
+
+ ShowPermissionBubble(cur_browser);
groby-ooo-7-16 2015/04/01 00:19:14 Up until here, this seems to be a verbatim copy fr
hcarmona 2015/04/02 01:30:14 No, not everything is necessary. Refactored test t
groby-ooo-7-16 2015/04/02 22:21:12 Follow-up CL is fine, but please file a crbug for
hcarmona 2015/04/13 21:13:24 The test that goes into app mode is now its own cl
groby-ooo-7-16 2015/04/13 21:19:45 Possibly, if others are using it. I wouldn't mind
+
+ // When bookmark apps are enabled, the browser that we have will not be an
+ // app: this means that it should have a location bar.
+ EXPECT_NE(new_bookmark_apps_enabled, cur_browser->is_app());
groby-ooo-7-16 2015/04/01 00:19:14 So this doesn't quite know if it tests in app mode
hcarmona 2015/04/02 01:30:14 Updated test so it doesn't try to guess if app mod
+ EXPECT_EQ(new_bookmark_apps_enabled,
+ permission_bubble_->BaseHasLocationBar());
groby-ooo-7-16 2015/04/01 00:19:14 Wait, the name says "AppHasNoLocationBar", but thi
hcarmona 2015/04/02 01:30:14 Updated test so test matches the name.
+
+ if (cur_browser->tab_strip_model())
+ cur_browser->tab_strip_model()->CloseSelectedTabs();
groby-ooo-7-16 2015/04/01 00:19:14 Why?
hcarmona 2015/04/02 01:30:14 This should be in TearDownOnMainThread: moved ther
groby-ooo-7-16 2015/04/02 22:21:12 It already was there, that's why I asked :)
+}
+
+// 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(permission_bubble_->BaseHasLocationBar());
+}
+
+// Anchor Position Tests ///////////////////////////////////////////////////////
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaBrowsertest,
+ AnchorPositionWithLocationBar) {
+ ShowPermissionBubble(browser());
+ permission_bubble_->set_location_bar_present(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);
+ 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);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionBubbleCocoaBrowsertest,
+ AnchorPositionWithoutLocationBar) {
+ ShowPermissionBubble(browser());
+ permission_bubble_->set_location_bar_present(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);
+ EXPECT_EQ(expected.y, anchor.y);
+}

Powered by Google App Engine
This is Rietveld 408576698