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

Unified Diff: chrome/browser/apps/guest_view/web_view_browsertest.cc

Issue 1026383003: <webview>: make context menus cancellable using JS API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments from yoz@ 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
« no previous file with comments | « no previous file | chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/apps/guest_view/web_view_browsertest.cc
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index f2a225c902b1a9cd510f37d4275c6d62bb6ee170..672f033c4a0c375a0e96b732c661a4daa0d39b72 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -130,6 +130,39 @@ class WebContentsHiddenObserver : public content::WebContentsObserver {
DISALLOW_COPY_AND_ASSIGN(WebContentsHiddenObserver);
};
+// Watches for context menu to be shown, records count of how many times
+// context menu was shown.
+class ContextMenuCallCountObserver {
+ public:
+ ContextMenuCallCountObserver ()
+ : num_times_shown_(0),
+ menu_observer_(chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN,
+ base::Bind(&ContextMenuCallCountObserver::OnMenuShown,
+ base::Unretained(this))) {
+ }
+ ~ContextMenuCallCountObserver() {}
+
+ bool OnMenuShown(const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ ++num_times_shown_;
+ auto context_menu = content::Source<RenderViewContextMenu>(source).ptr();
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&RenderViewContextMenuBase::Cancel,
+ base::Unretained(context_menu)));
+ return true;
+ }
+
+ void Wait() { menu_observer_.Wait(); }
+
+ int num_times_shown() { return num_times_shown_; }
+
+ private:
+ int num_times_shown_;
+ content::WindowedNotificationObserver menu_observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(ContextMenuCallCountObserver);
+};
+
class EmbedderWebContentsObserver : public content::WebContentsObserver {
public:
explicit EmbedderWebContentsObserver(content::WebContents* web_contents)
@@ -699,6 +732,17 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
}
}
+ void OpenContextMenu(content::WebContents* web_contents) {
+ blink::WebMouseEvent mouse_event;
+ mouse_event.type = blink::WebInputEvent::MouseDown;
+ mouse_event.button = blink::WebMouseEvent::ButtonRight;
+ mouse_event.x = 1;
+ mouse_event.y = 1;
+ web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
+ mouse_event.type = blink::WebInputEvent::MouseUp;
+ web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
+ }
+
content::WebContents* GetGuestWebContents() {
return guest_web_contents_;
}
@@ -1973,6 +2017,36 @@ static bool ContextMenuNotificationCallback(
return true;
}
+IN_PROC_BROWSER_TEST_F(WebViewTest, ContextMenusAPI_PreventDefault) {
+ LoadAppWithGuest("web_view/context_menus/basic");
+
+ content::WebContents* guest_web_contents = GetGuestWebContents();
+ content::WebContents* embedder = GetEmbedderWebContents();
+ ASSERT_TRUE(embedder);
+
+ // Add a preventDefault() call on context menu event so context menu
+ // does not show up.
+ ExtensionTestMessageListener prevent_default_listener(
+ "WebViewTest.CONTEXT_MENU_DEFAULT_PREVENTED", false);
+ EXPECT_TRUE(content::ExecuteScript(embedder, "registerPreventDefault()"));
+ ContextMenuCallCountObserver context_menu_shown_observer;
+
+ OpenContextMenu(guest_web_contents);
+
+ EXPECT_TRUE(prevent_default_listener.WaitUntilSatisfied());
+ // Expect the menu to not show up.
+ EXPECT_EQ(0, context_menu_shown_observer.num_times_shown());
+
+ // Now remove the preventDefault() and expect context menu to be shown.
+ ExecuteScriptWaitForTitle(
+ embedder, "removePreventDefault()", "PREVENT_DEFAULT_LISTENER_REMOVED");
+ OpenContextMenu(guest_web_contents);
+
+ // We expect to see a context menu for the second call to |OpenContextMenu|.
+ context_menu_shown_observer.Wait();
+ EXPECT_EQ(1, context_menu_shown_observer.num_times_shown());
+}
+
// Tests that a context menu is created when right-clicking in the webview. This
// also tests that the 'contextmenu' event is handled correctly.
IN_PROC_BROWSER_TEST_F(WebViewTest, TestContextMenu) {
@@ -1984,15 +2058,7 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, TestContextMenu) {
chrome::NOTIFICATION_RENDER_VIEW_CONTEXT_MENU_SHOWN,
base::Bind(ContextMenuNotificationCallback));
- // Open a context menu.
- blink::WebMouseEvent mouse_event;
- mouse_event.type = blink::WebInputEvent::MouseDown;
- mouse_event.button = blink::WebMouseEvent::ButtonRight;
- mouse_event.x = 1;
- mouse_event.y = 1;
- guest_web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
- mouse_event.type = blink::WebInputEvent::MouseUp;
- guest_web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
+ OpenContextMenu(guest_web_contents);
// Wait for the context menu to be visible.
menu_observer.Wait();
« no previous file with comments | « no previous file | chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698