<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[182581] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/182581">182581</a></dd>
<dt>Author</dt> <dd>bfulgham@apple.com</dd>
<dt>Date</dt> <dd>2015-04-08 19:41:31 -0700 (Wed, 08 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Mac] WebKit is not honoring OS preferences for secondary click behaviors
https://bugs.webkit.org/show_bug.cgi?id=143452
&lt;rdar://problem/20437483&gt;

Reviewed by Tim Horton.

Source/WebCore:

We cannot rely on the event's button number to decide behavior. The OS settings might have
mapped middle button to context menu, etc. Instead, we should ask the OS (via NSMenu) what
the proper button press behavior is.

* platform/mac/PlatformEventFactoryMac.mm:
(WebCore::mouseButtonForEvent): Ask NSMenu what kind of button press we have received.

Source/WebKit/mac:

We were improperly intercepting contextual menu clicks and passing them through
the mouseDown handler, rather than processing via NSView's menu handling code.

* WebView/WebHTMLView.mm:
(-[WebHTMLView otherMouseDown:]): Treat context menu events the same as the action
menu case, and pass it to AppKit for normal menu processing. 

Source/WebKit2:

We cannot rely on the event's button number to decide behavior. The OS settings might have
mapped middle button to context menu, etc. Instead, we should ask the OS (via NSMenu) what
the proper button press behavior is.

* Shared/mac/WebEventFactory.mm:
(WebKit::mouseButtonForEvent): Ask NSMenu what kind of button press we have received.

Tools:

Add a new API test to confirm that Cocoa mouse button press events are properly
tagged with the desired menu behavior (i.e., 'None', 'Context', or 'Action'.)

The WK2 test dispatches mouse down events to a PlatformWebView, and checks with
some registered event handlers that the expected button press and context menu
events are received.

The WK1 unit test creates an NSEvent with the desired button press state, and then
uses WebCore::PlatformEventFactory::createPlatformMouseEvent to create a WebCore event.
We check the resulting PlatformMouseEvent for proper state.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Add new test files.
* TestWebKitAPI/Tests/WebKit2/MenuTypesForMouseEvents.cpp: Added.
(TestWebKitAPI::buildAndPerformTest): Helper function to build/run an individual test.
* TestWebKitAPI/Tests/WebKit2/mouse-button-listener.html: Added.
* TestWebKitAPI/Tests/mac/MenuTypesForMouseEvents.mm: Added.
(TestWebKitAPI::canCallMenuTypeForEvent): Helper function.
(TestWebKitAPI::buildAndPerformTest): Helper function to build/run an individual test.
* TestWebKitAPI/mac/PlatformWebViewMac.mm:
(TestWebKitAPI::PlatformWebView::simulateButtonClick): Added method to support firing
mouse down events.
* TestWebKitAPI/mac/PlatformWebViewMac.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformPlatformMouseEventh">trunk/Source/WebCore/platform/PlatformMouseEvent.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmacPlatformEventFactoryMacmm">trunk/Source/WebCore/platform/mac/PlatformEventFactoryMac.mm</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebHTMLViewmm">trunk/Source/WebKit/mac/WebView/WebHTMLView.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedWebEventh">trunk/Source/WebKit2/Shared/WebEvent.h</a></li>
<li><a href="#trunkSourceWebKit2SharedWebEventConversioncpp">trunk/Source/WebKit2/Shared/WebEventConversion.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebMouseEventcpp">trunk/Source/WebKit2/Shared/WebMouseEvent.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedmacWebEventFactoryh">trunk/Source/WebKit2/Shared/mac/WebEventFactory.h</a></li>
<li><a href="#trunkSourceWebKit2SharedmacWebEventFactorymm">trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPIPlatformWebViewh">trunk/Tools/TestWebKitAPI/PlatformWebView.h</a></li>
<li><a href="#trunkToolsTestWebKitAPITestWebKitAPIxcodeprojprojectpbxproj">trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkToolsTestWebKitAPImacPlatformWebViewMacmm">trunk/Tools/TestWebKitAPI/mac/PlatformWebViewMac.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2MenuTypesForMouseEventscpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2/MenuTypesForMouseEvents.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2mousebuttonlistenerhtml">trunk/Tools/TestWebKitAPI/Tests/WebKit2/mouse-button-listener.html</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsmacMenuTypesForMouseEventsmm">trunk/Tools/TestWebKitAPI/Tests/mac/MenuTypesForMouseEvents.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebCore/ChangeLog        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-04-08  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Mac] WebKit is not honoring OS preferences for secondary click behaviors
+        https://bugs.webkit.org/show_bug.cgi?id=143452
+        &lt;rdar://problem/20437483&gt;
+
+        Reviewed by Tim Horton.
+
+        We cannot rely on the event's button number to decide behavior. The OS settings might have
+        mapped middle button to context menu, etc. Instead, we should ask the OS (via NSMenu) what
+        the proper button press behavior is.
+
+        * platform/mac/PlatformEventFactoryMac.mm:
+        (WebCore::mouseButtonForEvent): Ask NSMenu what kind of button press we have received.
+
</ins><span class="cx"> 2015-04-08  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix -Wformat in AnimationBase.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformPlatformMouseEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/PlatformMouseEvent.h (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/PlatformMouseEvent.h        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebCore/platform/PlatformMouseEvent.h        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx">             , m_modifierFlags(0)
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">             , m_eventNumber(0)
</span><ins>+            , m_menuTypeForEvent(0)
</ins><span class="cx"> #elif PLATFORM(WIN)
</span><span class="cx">             , m_didActivateWebView(false)
</span><span class="cx"> #endif
</span><span class="lines">@@ -71,6 +72,7 @@
</span><span class="cx">             , m_modifierFlags(0)
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">             , m_eventNumber(0)
</span><ins>+            , m_menuTypeForEvent(0)
</ins><span class="cx"> #elif PLATFORM(WIN)
</span><span class="cx">             , m_didActivateWebView(false)
</span><span class="cx"> #endif
</span><span class="lines">@@ -103,6 +105,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">         int eventNumber() const { return m_eventNumber; }
</span><ins>+        int menuTypeForEvent() const { return m_menuTypeForEvent; }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(WIN)
</span><span class="lines">@@ -123,6 +126,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">         int m_eventNumber;
</span><ins>+        int m_menuTypeForEvent;
</ins><span class="cx"> #elif PLATFORM(WIN)
</span><span class="cx">         bool m_didActivateWebView;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacPlatformEventFactoryMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/PlatformEventFactoryMac.mm (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/PlatformEventFactoryMac.mm        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebCore/platform/mac/PlatformEventFactoryMac.mm        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #import &quot;KeyEventCocoa.h&quot;
</span><span class="cx"> #import &quot;Logging.h&quot;
</span><ins>+#import &quot;NSMenuSPI.h&quot;
</ins><span class="cx"> #import &quot;PlatformScreen.h&quot;
</span><span class="cx"> #import &quot;Scrollbar.h&quot;
</span><span class="cx"> #import &quot;WebCoreSystemInterface.h&quot;
</span><span class="lines">@@ -394,7 +395,20 @@
</span><span class="cx">     return (PlatformEvent::Modifiers)modifiers;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static int typeForEvent(NSEvent *event)
+{
+    if ([NSMenu respondsToSelector:@selector(menuTypeForEvent:)])
+        return static_cast&lt;int&gt;([NSMenu menuTypeForEvent:event]);
</ins><span class="cx"> 
</span><ins>+    if (mouseButtonForEvent(event) == RightButton)
+        return static_cast&lt;int&gt;(NSMenuTypeContextMenu);
+
+    if (mouseButtonForEvent(event) == LeftButton &amp;&amp; (modifiersForEvent(event) &amp; NSControlKeyMask))
+        return static_cast&lt;int&gt;(NSMenuTypeContextMenu);
+
+    return static_cast&lt;int&gt;(NSMenuTypeNone);
+}
+    
</ins><span class="cx"> class PlatformMouseEventBuilder : public PlatformMouseEvent {
</span><span class="cx"> public:
</span><span class="cx">     PlatformMouseEventBuilder(NSEvent *event, NSView *windowView)
</span><span class="lines">@@ -413,6 +427,7 @@
</span><span class="cx">         // Mac specific
</span><span class="cx">         m_modifierFlags                     = [event modifierFlags];
</span><span class="cx">         m_eventNumber                       = [event eventNumber];
</span><ins>+        m_menuTypeForEvent                  = typeForEvent(event);
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit/mac/ChangeLog        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-04-08  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Mac] WebKit is not honoring OS preferences for secondary click behaviors
+        https://bugs.webkit.org/show_bug.cgi?id=143452
+        &lt;rdar://problem/20437483&gt;
+
+        Reviewed by Tim Horton.
+
+        We were improperly intercepting contextual menu clicks and passing them through
+        the mouseDown handler, rather than processing via NSView's menu handling code.
+
+        * WebView/WebHTMLView.mm:
+        (-[WebHTMLView otherMouseDown:]): Treat context menu events the same as the action
+        menu case, and pass it to AppKit for normal menu processing. 
+
</ins><span class="cx"> 2015-04-08  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Expose the &quot;Share&quot; menu for links, images, and media.
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebHTMLViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebHTMLView.mm (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebHTMLView.mm        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit/mac/WebView/WebHTMLView.mm        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -5392,7 +5392,8 @@
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx"> - (void)otherMouseDown:(NSEvent *)event
</span><span class="cx"> {
</span><del>-    if ([event buttonNumber] != 2 || ([NSMenu respondsToSelector:@selector(menuTypeForEvent:)] &amp;&amp; [NSMenu menuTypeForEvent:event] == NSMenuTypeActionMenu)) {
</del><ins>+    if ([event buttonNumber] != 2 || ([NSMenu respondsToSelector:@selector(menuTypeForEvent:)]
+        &amp;&amp; ([NSMenu menuTypeForEvent:event] == NSMenuTypeActionMenu || [NSMenu menuTypeForEvent:event] == NSMenuTypeContextMenu))) {
</ins><span class="cx">         [super otherMouseDown:event];
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-04-08  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Mac] WebKit is not honoring OS preferences for secondary click behaviors
+        https://bugs.webkit.org/show_bug.cgi?id=143452
+        &lt;rdar://problem/20437483&gt;
+
+        Reviewed by Tim Horton.
+
+        We cannot rely on the event's button number to decide behavior. The OS settings might have
+        mapped middle button to context menu, etc. Instead, we should ask the OS (via NSMenu) what
+        the proper button press behavior is.
+
+        * Shared/mac/WebEventFactory.mm:
+        (WebKit::mouseButtonForEvent): Ask NSMenu what kind of button press we have received.
+
</ins><span class="cx"> 2015-04-08  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Expose the &quot;Share&quot; menu for links, images, and media.
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebEvent.h (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebEvent.h        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit2/Shared/WebEvent.h        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -124,7 +124,7 @@
</span><span class="cx">     WebMouseEvent();
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(MAC)
</span><del>-    WebMouseEvent(Type, Button, const WebCore::IntPoint&amp; position, const WebCore::IntPoint&amp; globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, double timestamp, int eventNumber = -1);
</del><ins>+    WebMouseEvent(Type, Button, const WebCore::IntPoint&amp; position, const WebCore::IntPoint&amp; globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, double timestamp, int eventNumber = -1, int menuType = 0);
</ins><span class="cx"> #else
</span><span class="cx">     WebMouseEvent(Type, Button, const WebCore::IntPoint&amp; position, const WebCore::IntPoint&amp; globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, double timestamp);
</span><span class="cx"> #endif
</span><span class="lines">@@ -138,6 +138,7 @@
</span><span class="cx">     int32_t clickCount() const { return m_clickCount; }
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     int32_t eventNumber() const { return m_eventNumber; }
</span><ins>+    int32_t menuTypeForEvent() const { return m_menuTypeForEvent; }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void encode(IPC::ArgumentEncoder&amp;) const;
</span><span class="lines">@@ -155,6 +156,7 @@
</span><span class="cx">     int32_t m_clickCount;
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     int32_t m_eventNumber;
</span><ins>+    int32_t m_menuTypeForEvent;
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebEventConversioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebEventConversion.cpp (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebEventConversion.cpp        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit2/Shared/WebEventConversion.cpp        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -84,6 +84,7 @@
</span><span class="cx">         m_clickCount = webEvent.clickCount();
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">         m_eventNumber = webEvent.eventNumber();
</span><ins>+        m_menuTypeForEvent = webEvent.menuTypeForEvent();
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">         m_modifierFlags = 0;
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebMouseEventcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebMouseEvent.cpp (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebMouseEvent.cpp        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit2/Shared/WebMouseEvent.cpp        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -42,12 +42,13 @@
</span><span class="cx">     , m_clickCount(0)
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     , m_eventNumber(-1)
</span><ins>+    , m_menuTypeForEvent(0)
</ins><span class="cx"> #endif
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(MAC)
</span><del>-WebMouseEvent::WebMouseEvent(Type type, Button button, const IntPoint&amp; position, const IntPoint&amp; globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, double timestamp, int eventNumber)
</del><ins>+WebMouseEvent::WebMouseEvent(Type type, Button button, const IntPoint&amp; position, const IntPoint&amp; globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, double timestamp, int eventNumber, int menuType)
</ins><span class="cx"> #else
</span><span class="cx"> WebMouseEvent::WebMouseEvent(Type type, Button button, const IntPoint&amp; position, const IntPoint&amp; globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers modifiers, double timestamp)
</span><span class="cx"> #endif
</span><span class="lines">@@ -61,6 +62,7 @@
</span><span class="cx">     , m_clickCount(clickCount)
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     , m_eventNumber(eventNumber)
</span><ins>+    , m_menuTypeForEvent(menuType)
</ins><span class="cx"> #endif
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMouseEventType(type));
</span><span class="lines">@@ -79,6 +81,7 @@
</span><span class="cx">     encoder &lt;&lt; m_clickCount;
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     encoder &lt;&lt; m_eventNumber;
</span><ins>+    encoder &lt;&lt; m_menuTypeForEvent;
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -104,6 +107,8 @@
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     if (!decoder.decode(result.m_eventNumber))
</span><span class="cx">         return false;
</span><ins>+    if (!decoder.decode(result.m_menuTypeForEvent))
+        return false;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedmacWebEventFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/mac/WebEventFactory.h (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/mac/WebEventFactory.h        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit2/Shared/mac/WebEventFactory.h        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -28,6 +28,12 @@
</span><span class="cx"> 
</span><span class="cx"> #import &quot;WebEvent.h&quot;
</span><span class="cx"> 
</span><ins>+#if USE(APPKIT)
+namespace WebCore {
+class PlatformMouseEvent;
+}
+#endif
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> // FIXME: This is not needed in the WebProcess and should be moved to be a peer
</span><span class="lines">@@ -39,6 +45,7 @@
</span><span class="cx">     static WebMouseEvent createWebMouseEvent(NSEvent *, NSView *windowView);
</span><span class="cx">     static WebWheelEvent createWebWheelEvent(NSEvent *, NSView *windowView);
</span><span class="cx">     static WebKeyboardEvent createWebKeyboardEvent(NSEvent *, bool handledByInputMethod, const Vector&lt;WebCore::KeypressCommand&gt;&amp;);
</span><ins>+    static bool shouldBeHandledAsContextClick(const WebCore::PlatformMouseEvent&amp;);
</ins><span class="cx"> #endif // USE(APPKIT)
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedmacWebEventFactorymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #import &quot;WebKitSystemInterface.h&quot;
</span><span class="cx"> #import &lt;WebCore/KeyboardEvent.h&gt;
</span><ins>+#import &lt;WebCore/NSMenuSPI.h&gt;
</ins><span class="cx"> #import &lt;WebCore/PlatformEventFactoryMac.h&gt;
</span><span class="cx"> #import &lt;WebCore/Scrollbar.h&gt;
</span><span class="cx"> #import &lt;WebCore/WindowsKeyboardCodes.h&gt;
</span><span class="lines">@@ -338,6 +339,25 @@
</span><span class="cx">     return (WebEvent::Modifiers)modifiers;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static int typeForEvent(NSEvent *event)
+{
+    if ([NSMenu respondsToSelector:@selector(menuTypeForEvent:)])
+        return static_cast&lt;int&gt;([NSMenu menuTypeForEvent:event]);
+    
+    if (mouseButtonForEvent(event) == WebMouseEvent::RightButton)
+        return static_cast&lt;int&gt;(NSMenuTypeContextMenu);
+    
+    if (mouseButtonForEvent(event) == WebMouseEvent::LeftButton &amp;&amp; (modifiersForEvent(event) &amp; NSControlKeyMask))
+        return static_cast&lt;int&gt;(NSMenuTypeContextMenu);
+    
+    return static_cast&lt;int&gt;(NSMenuTypeNone);
+}
+
+bool WebEventFactory::shouldBeHandledAsContextClick(const WebCore::PlatformMouseEvent&amp; event)
+{
+    return (static_cast&lt;NSMenuType&gt;(event.menuTypeForEvent()) == NSMenuTypeContextMenu);
+}
+
</ins><span class="cx"> WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSView *windowView)
</span><span class="cx"> {
</span><span class="cx">     NSPoint position = pointForEvent(event, windowView);
</span><span class="lines">@@ -352,8 +372,9 @@
</span><span class="cx">     WebEvent::Modifiers modifiers           = modifiersForEvent(event);
</span><span class="cx">     double timestamp                        = eventTimeStampSince1970(event);
</span><span class="cx">     int eventNumber                         = [event eventNumber];
</span><ins>+    int menuTypeForEvent                    = typeForEvent(event);
</ins><span class="cx"> 
</span><del>-    return WebMouseEvent(type, button, IntPoint(position), IntPoint(globalPosition), deltaX, deltaY, deltaZ, clickCount, modifiers, timestamp, eventNumber);
</del><ins>+    return WebMouseEvent(type, button, IntPoint(position), IntPoint(globalPosition), deltaX, deltaY, deltaZ, clickCount, modifiers, timestamp, eventNumber, menuTypeForEvent);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebWheelEvent WebEventFactory::createWebWheelEvent(NSEvent *event, NSView *windowView)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -71,6 +71,7 @@
</span><span class="cx"> #include &quot;WebEditorClient.h&quot;
</span><span class="cx"> #include &quot;WebEvent.h&quot;
</span><span class="cx"> #include &quot;WebEventConversion.h&quot;
</span><ins>+#include &quot;WebEventFactory.h&quot;
</ins><span class="cx"> #include &quot;WebFrame.h&quot;
</span><span class="cx"> #include &quot;WebFrameLoaderClient.h&quot;
</span><span class="cx"> #include &quot;WebFullScreenManager.h&quot;
</span><span class="lines">@@ -1822,16 +1823,11 @@
</span><span class="cx"> #if ENABLE(CONTEXT_MENUS)
</span><span class="cx"> static bool isContextClick(const PlatformMouseEvent&amp; event)
</span><span class="cx"> {
</span><del>-    if (event.button() == WebCore::RightButton)
-        return true;
-
</del><span class="cx"> #if PLATFORM(COCOA)
</span><del>-    // FIXME: this really should be about OSX-style UI, not about the Mac port
-    if (event.button() == WebCore::LeftButton &amp;&amp; event.ctrlKey())
-        return true;
</del><ins>+    return WebEventFactory::shouldBeHandledAsContextClick(event);
+#else
+    return event.button() == WebCore::RightButton;
</ins><span class="cx"> #endif
</span><del>-
-    return false;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static bool handleContextMenuEvent(const PlatformMouseEvent&amp; platformMouseEvent, WebPage* page)
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Tools/ChangeLog        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2015-04-08  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Mac] WebKit is not honoring OS preferences for secondary click behaviors
+        https://bugs.webkit.org/show_bug.cgi?id=143452
+        &lt;rdar://problem/20437483&gt;
+
+        Reviewed by Tim Horton.
+
+        Add a new API test to confirm that Cocoa mouse button press events are properly
+        tagged with the desired menu behavior (i.e., 'None', 'Context', or 'Action'.)
+
+        The WK2 test dispatches mouse down events to a PlatformWebView, and checks with
+        some registered event handlers that the expected button press and context menu
+        events are received.
+
+        The WK1 unit test creates an NSEvent with the desired button press state, and then
+        uses WebCore::PlatformEventFactory::createPlatformMouseEvent to create a WebCore event.
+        We check the resulting PlatformMouseEvent for proper state.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Add new test files.
+        * TestWebKitAPI/Tests/WebKit2/MenuTypesForMouseEvents.cpp: Added.
+        (TestWebKitAPI::buildAndPerformTest): Helper function to build/run an individual test.
+        * TestWebKitAPI/Tests/WebKit2/mouse-button-listener.html: Added.
+        * TestWebKitAPI/Tests/mac/MenuTypesForMouseEvents.mm: Added.
+        (TestWebKitAPI::canCallMenuTypeForEvent): Helper function.
+        (TestWebKitAPI::buildAndPerformTest): Helper function to build/run an individual test.
+        * TestWebKitAPI/mac/PlatformWebViewMac.mm:
+        (TestWebKitAPI::PlatformWebView::simulateButtonClick): Added method to support firing
+        mouse down events.
+        * TestWebKitAPI/mac/PlatformWebViewMac.h:
+
</ins><span class="cx"> 2015-04-08  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Add pango to jhbuild-optional.modules
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPIPlatformWebViewh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/PlatformWebView.h (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/PlatformWebView.h        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Tools/TestWebKitAPI/PlatformWebView.h        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -73,6 +73,9 @@
</span><span class="cx">     void simulateAltKeyPress();
</span><span class="cx">     void simulateRightClick(unsigned x, unsigned y);
</span><span class="cx">     void simulateMouseMove(unsigned x, unsigned y);
</span><ins>+#if PLATFORM(MAC)
+    void simulateButtonClick(WKEventMouseButton, unsigned x, unsigned y, WKEventModifiers);
+#endif
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx"> #if PLATFORM(MAC)
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestWebKitAPIxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -57,6 +57,9 @@
</span><span class="cx">                 7673499D1930C5BB00E44DF9 /* StopLoadingDuringDidFailProvisionalLoad_bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7673499A1930182E00E44DF9 /* StopLoadingDuringDidFailProvisionalLoad_bundle.cpp */; };
</span><span class="cx">                 76E182DD1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76E182DC1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp */; };
</span><span class="cx">                 76E182DF154767E600F1FADD /* auto-submitting-form.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 76E182DE15475A8300F1FADD /* auto-submitting-form.html */; };
</span><ins>+                7A1458FC1AD5C07000E06772 /* mouse-button-listener.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 7A1458FB1AD5C03500E06772 /* mouse-button-listener.html */; };
+                7A5623111AD5AF3E0096B920 /* MenuTypesForMouseEvents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7A5623101AD5AF3E0096B920 /* MenuTypesForMouseEvents.cpp */; };
+                7A99D9941AD4A29D00373141 /* MenuTypesForMouseEvents.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A99D9931AD4A29D00373141 /* MenuTypesForMouseEvents.mm */; };
</ins><span class="cx">                 7AA021BB1AB09EA70052953F /* DateMath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7AA021BA1AB09EA70052953F /* DateMath.cpp */; };
</span><span class="cx">                 7AA6A1521AAC0B31002B2ED3 /* WorkQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7AA6A1511AAC0B31002B2ED3 /* WorkQueue.cpp */; };
</span><span class="cx">                 7C486BA11AA12567003F6F9B /* bundle-file.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 7C486BA01AA1254B003F6F9B /* bundle-file.html */; };
</span><span class="lines">@@ -325,6 +328,7 @@
</span><span class="cx">                         dstPath = TestWebKitAPI.resources;
</span><span class="cx">                         dstSubfolderSpec = 7;
</span><span class="cx">                         files = (
</span><ins>+                                7A1458FC1AD5C07000E06772 /* mouse-button-listener.html in Copy Resources */,
</ins><span class="cx">                                 7C486BA11AA12567003F6F9B /* bundle-file.html in Copy Resources */,
</span><span class="cx">                                 1A9E52C913E65EF4006917F5 /* 18-characters.html in Copy Resources */,
</span><span class="cx">                                 379028B914FAC24C007E6B43 /* acceptsFirstMouse.html in Copy Resources */,
</span><span class="lines">@@ -521,6 +525,9 @@
</span><span class="cx">                 76E182D91547550100F1FADD /* WillSendSubmitEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WillSendSubmitEvent.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 76E182DC1547569100F1FADD /* WillSendSubmitEvent_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WillSendSubmitEvent_Bundle.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 76E182DE15475A8300F1FADD /* auto-submitting-form.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = &quot;auto-submitting-form.html&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                7A1458FB1AD5C03500E06772 /* mouse-button-listener.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = &quot;mouse-button-listener.html&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7A5623101AD5AF3E0096B920 /* MenuTypesForMouseEvents.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MenuTypesForMouseEvents.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7A99D9931AD4A29D00373141 /* MenuTypesForMouseEvents.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MenuTypesForMouseEvents.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 7AA021BA1AB09EA70052953F /* DateMath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DateMath.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7AA6A1511AAC0B31002B2ED3 /* WorkQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkQueue.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C486BA01AA1254B003F6F9B /* bundle-file.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = &quot;bundle-file.html&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -1011,6 +1018,7 @@
</span><span class="cx">                                 7C54A4BC1AA11CCA00380F78 /* WKBundleFileHandle.cpp */,
</span><span class="cx">                                 7C54A4BF1AA11CE400380F78 /* WKBundleFileHandle_Bundle.cpp */,
</span><span class="cx">                                 A1FDFD2E19C288BB005148A4 /* WKImageCreateCGImageCrash.cpp */,
</span><ins>+                                7A5623101AD5AF3E0096B920 /* MenuTypesForMouseEvents.cpp */,
</ins><span class="cx">                                 7C89D2AA1A69B80D003A5FDE /* WKPageConfiguration.cpp */,
</span><span class="cx">                                 51E93016156B13E1004C99DF /* WKPageGetScaleFactorNotZero.cpp */,
</span><span class="cx">                                 524BBC9C19DF377A002F1AF1 /* WKPageIsPlayingAudio.cpp */,
</span><span class="lines">@@ -1068,6 +1076,7 @@
</span><span class="cx">                 BC90977B125571AE00083756 /* Resources */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                7A1458FB1AD5C03500E06772 /* mouse-button-listener.html */,
</ins><span class="cx">                                 C045F9461385C2F800C0F3CD /* 18-characters.html */,
</span><span class="cx">                                 2D950FBF1A230C1E00012434 /* action-menu-targets.html */,
</span><span class="cx">                                 93D3D19B17B1A7B000C7C415 /* all-content-in-one-iframe.html */,
</span><span class="lines">@@ -1174,6 +1183,7 @@
</span><span class="cx">                                 4BB4160116815B2600824238 /* JSWrapperForNodeInWebFrame.mm */,
</span><span class="cx">                                 E1220D9F155B25480013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.mm */,
</span><span class="cx">                                 517E7DFB15110EA600D0B008 /* MemoryCachePruneWithinResourceLoadDelegate.mm */,
</span><ins>+                                7A99D9931AD4A29D00373141 /* MenuTypesForMouseEvents.mm */,
</ins><span class="cx">                                 A57A34EF16AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm */,
</span><span class="cx">                                 00BC16851680FE810065F1E5 /* PublicSuffix.mm */,
</span><span class="cx">                                 37C784DE197C8F2E0010A496 /* RenderedImageFromDOMNode.mm */,
</span><span class="lines">@@ -1570,6 +1580,8 @@
</span><span class="cx">                                 2E7765CD16C4D80A00BA2BB1 /* mainIOS.mm in Sources */,
</span><span class="cx">                                 7AA6A1521AAC0B31002B2ED3 /* WorkQueue.cpp in Sources */,
</span><span class="cx">                                 2E7765CF16C4D81100BA2BB1 /* mainMac.mm in Sources */,
</span><ins>+                                7A5623111AD5AF3E0096B920 /* MenuTypesForMouseEvents.cpp in Sources */,
+                                7A99D9941AD4A29D00373141 /* MenuTypesForMouseEvents.mm in Sources */,
</ins><span class="cx">                         );
</span><span class="cx">                         runOnlyForDeploymentPostprocessing = 0;
</span><span class="cx">                 };
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2MenuTypesForMouseEventscpp"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2/MenuTypesForMouseEvents.cpp (0 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/MenuTypesForMouseEvents.cpp                                (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/MenuTypesForMouseEvents.cpp        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -0,0 +1,149 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+
+#if WK_HAVE_C_SPI
+
+#include &quot;JavaScriptTest.h&quot;
+#include &quot;PlatformUtilities.h&quot;
+#include &quot;PlatformWebView.h&quot;
+
+namespace TestWebKitAPI {
+
+static bool didFinishLoad;
+
+static void didFinishLoadForFrame(WKPageRef, WKFrameRef, WKTypeRef, const void*)
+{
+    didFinishLoad = true;
+}
+
+static void setPageLoaderClient(WKPageRef page)
+{
+    WKPageLoaderClientV0 loaderClient;
+    memset(&amp;loaderClient, 0, sizeof(loaderClient));
+
+    loaderClient.base.version = 0;
+    loaderClient.didFinishLoadForFrame = didFinishLoadForFrame;
+
+    WKPageSetPageLoaderClient(page, &amp;loaderClient.base);
+}
+
+static void buildAndPerformTest(WKEventMouseButton button, WKEventModifiers modifiers, const char* expectedButton, const char* expectedMenuType)
+{
+    WKRetainPtr&lt;WKContextRef&gt; context(AdoptWK, WKContextCreate());
+    PlatformWebView webView(context.get());
+    setPageLoaderClient(webView.page());
+
+    WKRetainPtr&lt;WKURLRef&gt; url(AdoptWK, Util::createURLForResource(&quot;mouse-button-listener&quot;, &quot;html&quot;));
+    WKPageLoadURL(webView.page(), url.get());
+    Util::run(&amp;didFinishLoad);
+
+    didFinishLoad = false;
+
+    webView.simulateButtonClick(button, 10, 10, modifiers);
+
+    EXPECT_JS_EQ(webView.page(), &quot;pressedMouseButton()&quot;, expectedButton);
+    EXPECT_JS_EQ(webView.page(), &quot;displayedMenu()&quot;, expectedMenuType);
+}
+
+TEST(WebKit2, MenuAndButtonForNormalLeftClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonLeftButton, 0, &quot;0&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForNormalRightClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonRightButton, 0, &quot;2&quot;, &quot;context&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForNormalMiddleClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonMiddleButton, 0, &quot;1&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForControlLeftClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonLeftButton, kWKEventModifiersControlKey, &quot;0&quot;, &quot;context&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForControlRightClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonRightButton, kWKEventModifiersControlKey, &quot;2&quot;, &quot;context&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForControlMiddleClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonMiddleButton, kWKEventModifiersControlKey, &quot;1&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForShiftLeftClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonLeftButton, kWKEventModifiersShiftKey, &quot;0&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForShiftRightClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonRightButton, kWKEventModifiersShiftKey, &quot;2&quot;, &quot;context&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForShiftMiddleClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonMiddleButton, kWKEventModifiersShiftKey, &quot;1&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForCommandLeftClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonLeftButton, kWKEventModifiersMetaKey, &quot;0&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForCommandRightClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonRightButton, kWKEventModifiersMetaKey, &quot;2&quot;, &quot;context&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForCommandMiddleClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonMiddleButton, kWKEventModifiersMetaKey, &quot;1&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForAltLeftClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonLeftButton, kWKEventModifiersAltKey, &quot;0&quot;, &quot;none&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForAltRightClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonRightButton, kWKEventModifiersAltKey, &quot;2&quot;, &quot;context&quot;);
+}
+
+TEST(WebKit2, MenuAndButtonForAltMiddleClick)
+{
+    buildAndPerformTest(kWKEventMouseButtonMiddleButton, kWKEventModifiersAltKey, &quot;1&quot;, &quot;none&quot;);
+}
+    
+} // namespace TestWebKitAPI
+
+#endif
</ins></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2mousebuttonlistenerhtml"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2/mouse-button-listener.html (0 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/mouse-button-listener.html                                (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/mouse-button-listener.html        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;script&gt;
+    var mouseButton = -1;
+    var menuType = &quot;none&quot;;
+
+    function mouseDownHandler(event)
+    {
+        mouseButton = event.button;
+        event.preventDefault();
+    }
+    
+    function pressedMouseButton()
+    {
+        return mouseButton;
+    }

+    function contextMenuHandler(event)
+    {
+        menuType = &quot;context&quot;;
+        event.preventDefault();
+    }
+  
+    function displayedMenu()
+    {
+        return menuType;
+    }
+
+    addEventListener(&quot;mousedown&quot;, mouseDownHandler);
+    addEventListener(&quot;contextmenu&quot;, contextMenuHandler);
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsmacMenuTypesForMouseEventsmm"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestWebKitAPI/Tests/mac/MenuTypesForMouseEvents.mm (0 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/mac/MenuTypesForMouseEvents.mm                                (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/mac/MenuTypesForMouseEvents.mm        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -0,0 +1,140 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import &quot;config.h&quot;
+#import &quot;PlatformUtilities.h&quot;
+#import &lt;Carbon/Carbon.h&gt; // For GetCurrentEventTime
+#import &lt;WebCore/NSMenuSPI.h&gt;
+#import &lt;WebCore/PlatformEventFactoryMac.h&gt;
+#import &lt;wtf/AutodrainedPool.h&gt;
+#import &lt;wtf/RetainPtr.h&gt;
+
+namespace TestWebKitAPI {
+
+static bool canCallMenuTypeForEvent()
+{
+    return [NSMenu respondsToSelector:@selector(menuTypeForEvent:)];
+}
+
+static void buildAndPerformTest(NSEventType buttonEvent, NSEventModifierFlags modifierFlags, WebCore::MouseButton expectedButton, NSMenuType expectedMenu)
+{
+    AutodrainedPool pool;
+    RetainPtr&lt;WebView&gt; webView = adoptNS([[WebView alloc] init]);
+    NSEvent *event = [NSEvent mouseEventWithType:buttonEvent
+                                        location:NSMakePoint(100, 100)
+                                   modifierFlags:modifierFlags
+                                       timestamp:GetCurrentEventTime()
+                                    windowNumber:[[webView window] windowNumber]
+                                         context:[NSGraphicsContext currentContext]
+                                     eventNumber:0
+                                      clickCount:0
+                                        pressure:0];
+    
+    auto pme = WebCore::PlatformEventFactory::createPlatformMouseEvent(event, webView.get());
+    
+    EXPECT_EQ(expectedButton, pme.button());
+    EXPECT_TRUE(!modifierFlags || pme.modifierFlags() &amp; modifierFlags);
+    EXPECT_EQ(expectedMenu, pme.menuTypeForEvent());
+    if (canCallMenuTypeForEvent())
+        EXPECT_EQ(expectedMenu, [NSMenu menuTypeForEvent:event]);
+}
+
+TEST(WebKit1, MenuAndButtonForNormalLeftClick)
+{
+    buildAndPerformTest(NSLeftMouseDown, 0, WebCore::LeftButton, NSMenuTypeNone);
+}
+
+TEST(WebKit1, MenuAndButtonForNormalRightClick)
+{
+    buildAndPerformTest(NSRightMouseDown, 0, WebCore::RightButton, NSMenuTypeContextMenu);
+}
+
+TEST(WebKit1, MenuAndButtonForNormalMiddleClick)
+{
+    buildAndPerformTest(NSOtherMouseDown, 0, WebCore::MiddleButton, NSMenuTypeNone);
+}
+
+TEST(WebKit1, MenuAndButtonForControlLeftClick)
+{
+    buildAndPerformTest(NSLeftMouseDown, NSControlKeyMask, WebCore::LeftButton, NSMenuTypeContextMenu);
+}
+
+TEST(WebKit1, MenuAndButtonForControlRightClick)
+{
+    buildAndPerformTest(NSRightMouseDown, NSControlKeyMask, WebCore::RightButton, NSMenuTypeContextMenu);
+}
+
+TEST(WebKit1, MenuAndButtonForControlMiddleClick)
+{
+    buildAndPerformTest(NSOtherMouseDown, NSControlKeyMask, WebCore::MiddleButton, NSMenuTypeNone);
+}
+    
+TEST(WebKit1, MenuAndButtonForShiftLeftClick)
+{
+    buildAndPerformTest(NSLeftMouseDown, NSShiftKeyMask, WebCore::LeftButton, NSMenuTypeNone);
+}
+
+TEST(WebKit1, MenuAndButtonForShiftRightClick)
+{
+    buildAndPerformTest(NSRightMouseDown, NSShiftKeyMask, WebCore::RightButton, NSMenuTypeContextMenu);
+}
+
+TEST(WebKit1, MenuAndButtonForShiftMiddleClick)
+{
+    buildAndPerformTest(NSOtherMouseDown, NSShiftKeyMask, WebCore::MiddleButton, NSMenuTypeNone);
+}
+
+TEST(WebKit1, MenuAndButtonForCommandLeftClick)
+{
+    buildAndPerformTest(NSLeftMouseDown, NSCommandKeyMask, WebCore::LeftButton, NSMenuTypeNone);
+}
+
+TEST(WebKit1, MenuAndButtonForCommandRightClick)
+{
+    buildAndPerformTest(NSRightMouseDown, NSCommandKeyMask, WebCore::RightButton, NSMenuTypeContextMenu);
+}
+
+TEST(WebKit1, MenuAndButtonForCommandMiddleClick)
+{
+    buildAndPerformTest(NSOtherMouseDown, NSCommandKeyMask, WebCore::MiddleButton, NSMenuTypeNone);
+}
+
+TEST(WebKit1, MenuAndButtonForAltLeftClick)
+{
+    buildAndPerformTest(NSLeftMouseDown, NSAlternateKeyMask, WebCore::LeftButton, NSMenuTypeNone);
+}
+
+TEST(WebKit1, MenuAndButtonForAltRightClick)
+{
+    buildAndPerformTest(NSRightMouseDown, NSAlternateKeyMask, WebCore::RightButton, NSMenuTypeContextMenu);
+}
+
+TEST(WebKit1, MenuAndButtonForAltMiddleClick)
+{
+    buildAndPerformTest(NSOtherMouseDown, NSAlternateKeyMask, WebCore::MiddleButton, NSMenuTypeNone);
+}
+
+
+} // namespace TestWebKitAPI
</ins></span></pre></div>
<a id="trunkToolsTestWebKitAPImacPlatformWebViewMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/mac/PlatformWebViewMac.mm (182580 => 182581)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/mac/PlatformWebViewMac.mm        2015-04-09 02:15:36 UTC (rev 182580)
+++ trunk/Tools/TestWebKitAPI/mac/PlatformWebViewMac.mm        2015-04-09 02:41:31 UTC (rev 182581)
</span><span class="lines">@@ -193,4 +193,50 @@
</span><span class="cx">     
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static NSEventType eventTypeForButton(WKEventMouseButton button)
+{
+    switch (button) {
+    case kWKEventMouseButtonLeftButton:
+        return NSLeftMouseDown;
+    case kWKEventMouseButtonRightButton:
+        return NSRightMouseDown;
+    case kWKEventMouseButtonMiddleButton:
+        return NSOtherMouseDown;
+    case kWKEventMouseButtonNoButton:
+        return NSLeftMouseDown;
+    }
+
+    return NSLeftMouseDown;
+}
+
+static NSEventModifierFlags modifierFlagsForWKModifiers(WKEventModifiers modifiers)
+{
+    NSEventModifierFlags returnVal = 0;
+    if (modifiers &amp; kWKEventModifiersShiftKey)
+        returnVal |= NSShiftKeyMask;
+    if (modifiers &amp; kWKEventModifiersControlKey)
+        returnVal |= NSControlKeyMask;
+    if (modifiers &amp; kWKEventModifiersAltKey)
+        returnVal |= NSAlternateKeyMask;
+    if (modifiers &amp; kWKEventModifiersMetaKey)
+        returnVal |= NSCommandKeyMask;
+
+    return returnVal;
+}
+    
+void PlatformWebView::simulateButtonClick(WKEventMouseButton button, unsigned x, unsigned y, WKEventModifiers modifiers)
+{
+    NSEvent *event = [NSEvent mouseEventWithType:eventTypeForButton(button)
+                                        location:NSMakePoint(x, y)
+                                   modifierFlags:modifierFlagsForWKModifiers(modifiers)
+                                       timestamp:GetCurrentEventTime()
+                                    windowNumber:[m_window windowNumber]
+                                         context:[NSGraphicsContext currentContext]
+                                     eventNumber:0
+                                      clickCount:0
+                                        pressure:0];
+
+    [m_view mouseDown:event];
+}
+
</ins><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>

</body>
</html>