[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

beidson at apple.com beidson at apple.com
Wed Dec 22 16:31:20 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit c76ecacd2c3443c7e9aaaadbde93019dab250101
Author: beidson at apple.com <beidson at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Nov 25 00:53:10 2010 +0000

    More of <rdar://problem/8613727> and https://bugs.webkit.org/show_bug.cgi?id=50042
    WK2 Context Menu Items need a user data object and a client callback for selection.
    
    Reviewed by Dan Bernstein.
    
    * Shared/API/c/WKContextMenuItem.cpp:
    (WKContextMenuItemGetUserData):
    (WKContextMenuItemSetUserData):
    * Shared/API/c/WKContextMenuItem.h:
    
    * Shared/WebContextMenuItem.cpp:
    (WebKit::WebContextMenuItem::userData):
    (WebKit::WebContextMenuItem::setUserData):
    * Shared/WebContextMenuItem.h:
    
    * Shared/WebContextMenuItemData.cpp:
    (WebKit::WebContextMenuItemData::userData):
    (WebKit::WebContextMenuItemData::setUserData):
    * Shared/WebContextMenuItemData.h:
    
    * UIProcess/API/C/WKPage.h:
    
    * UIProcess/WebPageContextMenuClient.cpp:
    (WebKit::WebPageContextMenuClient::customContextMenuItemSelected): Added for WK2 apps to get a callback.
    * UIProcess/WebPageContextMenuClient.h:
    
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::contextMenuItemSelected):
    * UIProcess/mac/WebContextMenuProxyMac.mm:
    (-[WebUserDataWrapper initWithUserData:WebKit::]): Add an "APIObject" user data wrapper class to associate with the NSMenuItem.
    (-[WebUserDataWrapper WebKit::]):
    (-[WebMenuTarget forwardContextMenuAction:]): Include the user data object in the created ContextMenuItemData.
    (WebKit::nsMenuItemVector):
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72707 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 9d30437..8a9e335 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,39 @@
+2010-11-24  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        More of <rdar://problem/8613727> and https://bugs.webkit.org/show_bug.cgi?id=50042
+        WK2 Context Menu Items need a user data object and a client callback for selection.
+
+        * Shared/API/c/WKContextMenuItem.cpp:
+        (WKContextMenuItemGetUserData):
+        (WKContextMenuItemSetUserData):
+        * Shared/API/c/WKContextMenuItem.h:
+
+        * Shared/WebContextMenuItem.cpp:
+        (WebKit::WebContextMenuItem::userData):
+        (WebKit::WebContextMenuItem::setUserData):
+        * Shared/WebContextMenuItem.h:
+
+        * Shared/WebContextMenuItemData.cpp:
+        (WebKit::WebContextMenuItemData::userData):
+        (WebKit::WebContextMenuItemData::setUserData):
+        * Shared/WebContextMenuItemData.h:
+
+        * UIProcess/API/C/WKPage.h:
+
+        * UIProcess/WebPageContextMenuClient.cpp:
+        (WebKit::WebPageContextMenuClient::customContextMenuItemSelected): Added for WK2 apps to get a callback.
+        * UIProcess/WebPageContextMenuClient.h:
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::contextMenuItemSelected):
+        * UIProcess/mac/WebContextMenuProxyMac.mm:
+        (-[WebUserDataWrapper initWithUserData:WebKit::]): Add an "APIObject" user data wrapper class to associate with the NSMenuItem.
+        (-[WebUserDataWrapper WebKit::]):
+        (-[WebMenuTarget forwardContextMenuAction:]): Include the user data object in the created ContextMenuItemData.
+        (WebKit::nsMenuItemVector):
+
 2010-11-24  Andras Becsi  <abecsi at inf.u-szeged.hu>
 
         Reviewed by Kenneth Rohde Christiansen.
diff --git a/WebKit2/Shared/API/c/WKContextMenuItem.cpp b/WebKit2/Shared/API/c/WKContextMenuItem.cpp
index 5dfa9f4..a4eaa53 100644
--- a/WebKit2/Shared/API/c/WKContextMenuItem.cpp
+++ b/WebKit2/Shared/API/c/WKContextMenuItem.cpp
@@ -88,3 +88,13 @@ WKArrayRef WKContextMenuCopySubmenuItems(WKContextMenuItemRef itemRef)
 {
     return toAPI(toImpl(itemRef)->submenuItemsAsImmutableArray().leakRef());
 }
+
+WKTypeRef WKContextMenuItemGetUserData(WKContextMenuItemRef itemRef)
+{
+    return toAPI(toImpl(itemRef)->userData());
+}
+
+void WKContextMenuItemSetUserData(WKContextMenuItemRef itemRef, WKTypeRef userDataRef)
+{
+    toImpl(itemRef)->setUserData(toImpl(userDataRef));
+}
diff --git a/WebKit2/Shared/API/c/WKContextMenuItem.h b/WebKit2/Shared/API/c/WKContextMenuItem.h
index c6a21eb..9b97840 100644
--- a/WebKit2/Shared/API/c/WKContextMenuItem.h
+++ b/WebKit2/Shared/API/c/WKContextMenuItem.h
@@ -47,6 +47,9 @@ WK_EXPORT bool WKContextMenuItemGetEnabled(WKContextMenuItemRef);
 WK_EXPORT bool WKContextMenuItemGetChecked(WKContextMenuItemRef);
 WK_EXPORT WKArrayRef WKContextMenuCopySubmenuItems(WKContextMenuItemRef);
 
+WK_EXPORT WKTypeRef WKContextMenuItemGetUserData(WKContextMenuItemRef);
+WK_EXPORT void WKContextMenuItemSetUserData(WKContextMenuItemRef, WKTypeRef);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/WebKit2/Shared/WebContextMenuItem.cpp b/WebKit2/Shared/WebContextMenuItem.cpp
index bca6c8f..55fa70a 100644
--- a/WebKit2/Shared/WebContextMenuItem.cpp
+++ b/WebKit2/Shared/WebContextMenuItem.cpp
@@ -74,5 +74,15 @@ PassRefPtr<ImmutableArray> WebContextMenuItem::submenuItemsAsImmutableArray() co
     return ImmutableArray::adopt(result);
 }
 
+APIObject* WebContextMenuItem::userData() const
+{
+    return m_webContextMenuItemData.userData();
+}
+
+void WebContextMenuItem::setUserData(APIObject* userData)
+{
+    m_webContextMenuItemData.setUserData(userData);
+}
+
 } // namespace WebKit
 
diff --git a/WebKit2/Shared/WebContextMenuItem.h b/WebKit2/Shared/WebContextMenuItem.h
index b2e6115..142b811 100644
--- a/WebKit2/Shared/WebContextMenuItem.h
+++ b/WebKit2/Shared/WebContextMenuItem.h
@@ -46,6 +46,9 @@ public:
     
     PassRefPtr<ImmutableArray> submenuItemsAsImmutableArray() const;
     
+    APIObject* userData() const;
+    void setUserData(APIObject*);
+    
     WebContextMenuItemData* data() { return &m_webContextMenuItemData; }
 
 private:
diff --git a/WebKit2/Shared/WebContextMenuItemData.cpp b/WebKit2/Shared/WebContextMenuItemData.cpp
index af87998..0fa8236 100644
--- a/WebKit2/Shared/WebContextMenuItemData.cpp
+++ b/WebKit2/Shared/WebContextMenuItemData.cpp
@@ -25,6 +25,7 @@
 
 #include "WebContextMenuItemData.h"
 
+#include "APIObject.h"
 #include "ArgumentCoders.h"
 #include "Arguments.h"
 #include <wtf/text/CString.h>
@@ -87,6 +88,16 @@ ContextMenuItem WebContextMenuItemData::core() const
     return ContextMenuItem(m_action, m_title, m_enabled, m_checked, subMenuItems);
 }
 
+APIObject* WebContextMenuItemData::userData() const
+{
+    return m_userData.get();
+}
+
+void WebContextMenuItemData::setUserData(APIObject* userData)
+{
+    m_userData = userData;
+}
+    
 void WebContextMenuItemData::encode(CoreIPC::ArgumentEncoder* encoder) const
 {
     encoder->encode(CoreIPC::In(static_cast<uint32_t>(m_type), static_cast<uint32_t>(m_action), m_title, m_checked, m_enabled, m_submenu));
diff --git a/WebKit2/Shared/WebContextMenuItemData.h b/WebKit2/Shared/WebContextMenuItemData.h
index a10c70c..0aa9e5c 100644
--- a/WebKit2/Shared/WebContextMenuItemData.h
+++ b/WebKit2/Shared/WebContextMenuItemData.h
@@ -40,6 +40,8 @@ namespace WebCore {
 
 namespace WebKit {
 
+class APIObject;
+
 class WebContextMenuItemData {
 public:
     WebContextMenuItemData();
@@ -56,6 +58,9 @@ public:
     
     WebCore::ContextMenuItem core() const;
     
+    APIObject* userData() const;
+    void setUserData(APIObject*);
+    
     void encode(CoreIPC::ArgumentEncoder*) const;
     static bool decode(CoreIPC::ArgumentDecoder*, WebContextMenuItemData&);
 
@@ -66,6 +71,7 @@ private:
     bool m_enabled;
     bool m_checked;
     Vector<WebContextMenuItemData> m_submenu;
+    RefPtr<APIObject> m_userData;
 };
 
 Vector<WebContextMenuItemData> kitItems(Vector<WebCore::ContextMenuItem>&, WebCore::ContextMenu*);
diff --git a/WebKit2/UIProcess/API/C/WKPage.h b/WebKit2/UIProcess/API/C/WKPage.h
index 1a7f5ed..1b4eb44 100644
--- a/WebKit2/UIProcess/API/C/WKPage.h
+++ b/WebKit2/UIProcess/API/C/WKPage.h
@@ -205,11 +205,13 @@ enum {
 
 // ContextMenu client
 typedef void (*WKPageGetContextMenuFromProposedContextMenuCallback)(WKPageRef page, WKArrayRef proposedMenu, WKArrayRef* newMenu, WKTypeRef userData, const void* clientInfo);
+typedef void (*WKPageCustomContextMenuItemSelectedCallback)(WKPageRef page, WKContextMenuItemRef contextMenuItem, const void* clientInfo);
 
 struct WKPageContextMenuClient {
     int                                                                 version;
     const void *                                                        clientInfo;
     WKPageGetContextMenuFromProposedContextMenuCallback                 getContextMenuFromProposedMenu;
+    WKPageCustomContextMenuItemSelectedCallback                         customContextMenuItemSelected;
 };
 typedef struct WKPageContextMenuClient WKPageContextMenuClient;
 
diff --git a/WebKit2/UIProcess/WebPageContextMenuClient.cpp b/WebKit2/UIProcess/WebPageContextMenuClient.cpp
index 08bbd28..73220b2 100644
--- a/WebKit2/UIProcess/WebPageContextMenuClient.cpp
+++ b/WebKit2/UIProcess/WebPageContextMenuClient.cpp
@@ -64,4 +64,13 @@ bool WebPageContextMenuClient::getContextMenuFromProposedMenu(WebPageProxy* page
     return true;
 }
 
+void WebPageContextMenuClient::customContextMenuItemSelected(WebPageProxy* page, const WebContextMenuItemData& itemData)
+{
+    if (!m_client.customContextMenuItemSelected)
+        return;
+
+    RefPtr<WebContextMenuItem> item = WebContextMenuItem::create(itemData);
+    m_client.customContextMenuItemSelected(toAPI(page), toAPI(item.get()), m_client.clientInfo);
+}
+
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageContextMenuClient.h b/WebKit2/UIProcess/WebPageContextMenuClient.h
index 33019bd..e0fff3d 100644
--- a/WebKit2/UIProcess/WebPageContextMenuClient.h
+++ b/WebKit2/UIProcess/WebPageContextMenuClient.h
@@ -39,6 +39,7 @@ class WebPageProxy;
 class WebPageContextMenuClient : public APIClient<WKPageContextMenuClient> {
 public:
     bool getContextMenuFromProposedMenu(WebPageProxy*, const Vector<WebContextMenuItemData>& proposedMenu, Vector<WebContextMenuItemData>& customMenu, APIObject* userData);
+    void customContextMenuItemSelected(WebPageProxy*, const WebContextMenuItemData&);
 };
 
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index 29ce9b9..b0e9974 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -1291,6 +1291,12 @@ void WebPageProxy::showContextMenu(const WebCore::IntPoint& menuLocation, const
 
 void WebPageProxy::contextMenuItemSelected(const WebContextMenuItemData& item)
 {
+    // Application custom items don't need to round-trip through to WebCore in the WebProcess.
+    if (item.action() >= ContextMenuItemBaseApplicationTag) {
+        m_contextMenuClient.customContextMenuItemSelected(this, item);
+        return;
+    }
+    
     process()->send(Messages::WebPage::DidSelectItemFromActiveContextMenu(item), m_pageID);
 }
 
diff --git a/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm b/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm
index 388c5b0..dbdd803 100644
--- a/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm
+++ b/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm
@@ -34,6 +34,28 @@
 
 using namespace WebCore;
 
+ at interface WebUserDataWrapper : NSObject {
+    RefPtr<WebKit::APIObject> _webUserData;
+}
+- (id)initWithUserData:(WebKit::APIObject*)userData;
+- (WebKit::APIObject*)userData;
+ at end
+
+ at implementation WebUserDataWrapper
+
+- (id)initWithUserData:(WebKit::APIObject*)userData
+{
+    _webUserData = userData;
+    return self;
+}
+
+- (WebKit::APIObject*)userData
+{
+    return _webUserData.get();
+}
+
+ at end
+
 @interface WebMenuTarget : NSObject {
     WebKit::WebContextMenuProxyMac* _menuProxy;
 }
@@ -64,6 +86,12 @@ using namespace WebCore;
 - (void)forwardContextMenuAction:(id)sender
 {
     WebKit::WebContextMenuItemData item(ActionType, static_cast<ContextMenuAction>([sender tag]), [sender title], [sender isEnabled], [sender state] == NSOnState);
+    
+    if (id representedObject = [sender representedObject]) {
+        ASSERT([representedObject isKindOfClass:[WebUserDataWrapper class]]);
+        item.setUserData([static_cast<WebUserDataWrapper *>(representedObject) userData]);
+    }
+            
     _menuProxy->contextMenuItemSelected(item);
 }
 
@@ -112,6 +140,12 @@ static Vector<RetainPtr<NSMenuItem> > nsMenuItemVector(const Vector<WebContextMe
             [menuItem setEnabled:items[i].enabled()];
             [menuItem setState:items[i].checked() ? NSOnState : NSOffState];
                         
+            if (items[i].userData()) {
+                WebUserDataWrapper *wrapper = [[WebUserDataWrapper alloc] initWithUserData:items[i].userData()];
+                [menuItem setRepresentedObject:wrapper];
+                [wrapper release];
+            }
+
             result.append(RetainPtr<NSMenuItem>(AdoptNS, menuItem));
             break;
         }

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list