Chromium Code Reviews| Index: chrome/browser/ui/cocoa/tab_contents/web_contents_view_mac_interactive_uitest.mm |
| diff --git a/chrome/browser/ui/cocoa/tab_contents/web_contents_view_mac_interactive_uitest.mm b/chrome/browser/ui/cocoa/tab_contents/web_contents_view_mac_interactive_uitest.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d4a67ce75dd3f20a5bf5e94f3ca952b79b415817 |
| --- /dev/null |
| +++ b/chrome/browser/ui/cocoa/tab_contents/web_contents_view_mac_interactive_uitest.mm |
| @@ -0,0 +1,79 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
|
tapted
2017/05/17 12:08:55
I don't really know where this file should live..
Avi (use Gerrit)
2017/05/17 15:35:59
Ack.
I'm not really sure, either. I'm happy to ha
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#import <Cocoa/Cocoa.h> |
| + |
| +#import "base/mac/scoped_nsobject.h" |
| +#include "base/run_loop.h" |
| +#include "chrome/browser/ui/browser.h" |
| +#include "chrome/browser/ui/browser_window.h" |
| +#include "chrome/browser/ui/tabs/tab_strip_model.h" |
| +#include "chrome/test/base/in_process_browser_test.h" |
| +#include "chrome/test/base/interactive_test_utils.h" |
| +#include "content/public/browser/native_web_keyboard_event.h" |
| +#include "content/public/browser/render_widget_host.h" |
| +#include "content/public/browser/render_widget_host_view.h" |
| +#include "content/public/browser/web_contents.h" |
| +#import "testing/gtest_mac.h" |
| + |
| +using WebContentsViewMacInteractiveTest = InProcessBrowserTest; |
| + |
| +// Integration test for a <select> popup run by the Mac-specific |
| +// content::PopupMenuHelper, owned by a WebContentsViewMac. |
| +IN_PROC_BROWSER_TEST_F(WebContentsViewMacInteractiveTest, SelectMenuLifetime) { |
| + EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); |
| + EXPECT_TRUE(embedded_test_server()->Start()); |
| + |
| + // Open a tab with a <select> element, which starts focused. |
| + AddTabAtIndex(1, GURL(embedded_test_server()->GetURL("/select.html")), |
| + ui::PAGE_TRANSITION_LINK); |
| + |
| + base::RunLoop outer_run_loop; |
| + base::RunLoop* outer_run_loop_for_block = &outer_run_loop; |
| + __block base::scoped_nsobject<NSString> first_item; |
| + |
| + // Wait for a native menu to open. |
| + id token = [[NSNotificationCenter defaultCenter] |
| + addObserverForName:NSMenuDidBeginTrackingNotification |
| + object:nil |
| + queue:nil |
| + usingBlock:^(NSNotification* notification) { |
| + first_item.reset( |
| + [[[[notification object] itemAtIndex:0] title] copy]); |
| + // The nested run loop runs next. Ensure the outer run loop |
| + // exits once the inner run loop quits. |
| + outer_run_loop_for_block->Quit(); |
| + |
| + // We can't cancel tracking until after |
| + // NSMenuDidBeginTrackingNotification is processed (i.e. after |
| + // this block returns). So post a task to run on the inner run |
| + // loop which will close the tab (and cancel tracking in |
| + // ~PopupMenuHelper()). |
| + base::ThreadTaskRunnerHandle::Get()->PostTask( |
| + FROM_HERE, |
| + base::Bind( |
| + base::IgnoreResult(&TabStripModel::CloseWebContentsAt), |
| + base::Unretained(browser()->tab_strip_model()), 1, 0)); |
| + }]; |
| + |
| + // Send a space key to open the <select>. |
| + content::NativeWebKeyboardEvent event( |
| + blink::WebKeyboardEvent::kChar, blink::WebInputEvent::kNoModifiers, |
| + blink::WebInputEvent::kTimeStampForTesting); |
| + event.text[0] = ' '; |
| + browser() |
| + ->tab_strip_model() |
| + ->GetActiveWebContents() |
| + ->GetRenderWidgetHostView() |
| + ->GetRenderWidgetHost() |
| + ->ForwardKeyboardEvent(event); |
| + |
| + EXPECT_EQ(2, browser()->tab_strip_model()->count()); |
| + outer_run_loop.Run(); |
| + |
| + [[NSNotificationCenter defaultCenter] removeObserver:token]; |
| + |
| + EXPECT_NSEQ(@"Apple", first_item); // Was it the menu we expected? |
| + EXPECT_EQ(1, browser()->tab_strip_model()->count()); |
| +} |