[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