[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 15:20:37 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 3a0329aa99af87a90e6d8f98504a1785860efd96
Author: beidson at apple.com <beidson at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Nov 1 18:34:04 2010 +0000

    <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
    Context menu support for WebKit 2.
    
    Reviewed by Anders Carlsson.
    
    WebCore:
    
    Add a "showContextMenu" call to Chrome/ChromeClient:
    * loader/EmptyClients.h:
    (WebCore::EmptyChromeClient::showContextMenu):
    * page/Chrome.cpp:
    (WebCore::Chrome::showContextMenu):
    * page/Chrome.h:
    * page/ChromeClient.h:
    
    Add a "platform description to ContextMenuItem" creator, will be needed by WebKit2
    * platform/ContextMenu.h:
    * platform/mac/ContextMenuMac.mm:
    (WebCore::contextMenuItemVector):
    
    * platform/mac/ContextMenuItemMac.mm:
    (WebCore::ContextMenuItem::checked): WebKit2 ports now need this implemented.
    
    Stub these out to keep their WK2 ports building:
    * platform/qt/ContextMenuItemQt.cpp:
    (WebCore::ContextMenuItem::checked):
    * platform/qt/ContextMenuQt.cpp:
    (WebCore::contextMenuItemVector):
    * platform/win/ContextMenuItemWin.cpp:
    (WebCore::ContextMenuItem::checked):
    * platform/win/ContextMenuWin.cpp:
    (WebCore::contextMenuItemVector):
    
    WebKit/chromium:
    
    * src/ChromeClientImpl.h:
    (WebKit::ChromeClientImpl::showContextMenu):
    
    WebKit/efl:
    
    * WebCoreSupport/ChromeClientEfl.h:
    (WebCore::ChromeClientEfl::showContextMenu):
    
    WebKit/gtk:
    
    * WebCoreSupport/ChromeClientGtk.h:
    (WebKit::ChromeClient::showContextMenu):
    
    WebKit/haiku:
    
    * WebCoreSupport/ChromeClientHaiku.h:
    (WebCore::ChromeClientHaiku::showContextMenu):
    
    WebKit/mac:
    
    * WebCoreSupport/WebChromeClient.h:
    (WebChromeClient::showContextMenu):
    
    WebKit/qt:
    
    * WebCoreSupport/ChromeClientQt.h:
    (WebCore::ChromeClientQt::showContextMenu):
    
    WebKit/win:
    
    * WebCoreSupport/WebChromeClient.h:
    (WebChromeClient::showContextMenu):
    
    WebKit/wx:
    
    * WebKitSupport/ChromeClientWx.h:
    (WebCore::ChromeClientWx::showContextMenu):
    
    WebKit2:
    
    * WebKit2.pro:
    * WebKit2.xcodeproj/project.pbxproj:
    * win/WebKit2.vcproj:
    
    * Shared/WebContextMenuItem.cpp: Added.
    (WebKit::WebContextMenuItem::WebContextMenuItem):
    (WebKit::WebContextMenuItem::encode):
    (WebKit::WebContextMenuItem::decode):
    (WebKit::kitItems):
    * Shared/WebContextMenuItem.h: Added.
    
    * UIProcess/API/mac/PageClientImpl.h:
    * UIProcess/API/mac/PageClientImpl.mm:
    (WebKit::PageClientImpl::createContextMenuProxy):
    * UIProcess/API/qt/qwkpage.cpp:
    (QWKPagePrivate::createContextMenuProxy): Stub to keep the build working.
    * UIProcess/API/qt/qwkpage_p.h:
    * UIProcess/PageClient.h:
    
    * UIProcess/WebContextMenuProxy.cpp: Added.
    (WebKit::WebContextMenuProxy::~WebContextMenuProxy):
    (WebKit::WebContextMenuProxy::WebContextMenuProxy):
    * UIProcess/WebContextMenuProxy.h: Added.
    
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::showContextMenu): Shows the menu after receiving the message from the WebProcess.
    (WebKit::WebPageProxy::contextMenuItemSelected): Sends info about the selected menu item to the WebProcess
    * UIProcess/WebPageProxy.h:
    * UIProcess/WebPageProxy.messages.in:
    
    * UIProcess/mac/WebContextMenuProxyMac.h: Added.
    (WebKit::WebContextMenuProxyMac::create):
    * UIProcess/mac/WebContextMenuProxyMac.mm: Added.
    (+[WebMenuTarget sharedMenuTarget]):
    (-[WebMenuTarget WebKit::]):
    (-[WebMenuTarget setMenuProxy:WebKit::]):
    (-[WebMenuTarget forwardContextMenuAction:]):
    (WebKit::WebContextMenuProxyMac::WebContextMenuProxyMac):
    (WebKit::WebContextMenuProxyMac::~WebContextMenuProxyMac):
    (WebKit::WebContextMenuProxyMac::contextMenuItemSelected):
    (WebKit::populateNSMenu):
    (WebKit::nsMenuItemVector):
    (WebKit::WebContextMenuProxyMac::populate):
    (WebKit::WebContextMenuProxyMac::showContextMenu):
    (WebKit::WebContextMenuProxyMac::hideContextMenu):
    
    * UIProcess/win/WebView.cpp:
    (WebKit::WebView::createContextMenuProxy): Stub for now.
    * UIProcess/win/WebView.h:
    
    * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    (WebKit::WebChromeClient::showContextMenu):
    * WebProcess/WebCoreSupport/WebChromeClient.h:
    
    * WebProcess/WebCoreSupport/WebContextMenuClient.cpp:
    (WebKit::WebContextMenuClient::getCustomMenuFromDefaultItems): Return the WebCore-provided default
      menu for now. Embedding app customization will come later (see bug 48720)
    
    * WebProcess/WebPage/WebContextMenu.cpp: Added.
    (WebKit::WebContextMenu::WebContextMenu):
    (WebKit::WebContextMenu::~WebContextMenu):
    (WebKit::WebContextMenu::show):
    (WebKit::WebContextMenu::itemSelected):
    * WebProcess/WebPage/WebContextMenu.h: Added.
    (WebKit::WebContextMenu::create):
    
    * WebProcess/WebPage/WebPage.cpp:
    (WebKit::WebPage::contextMenu):
    (WebKit::handleMouseEvent): Pass right mouse presses along to WebCore as both a mouse event and context menu event,
      the same way WebKit1 does.
    (WebKit::WebPage::didSelectItemFromActiveContextMenu):
    * WebProcess/WebPage/WebPage.h:
    * WebProcess/WebPage/WebPage.messages.in:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@71041 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index ea759e2..eb8c777 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,36 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        Add a "showContextMenu" call to Chrome/ChromeClient:
+        * loader/EmptyClients.h:
+        (WebCore::EmptyChromeClient::showContextMenu):
+        * page/Chrome.cpp:
+        (WebCore::Chrome::showContextMenu):
+        * page/Chrome.h:
+        * page/ChromeClient.h:
+
+        Add a "platform description to ContextMenuItem" creator, will be needed by WebKit2
+        * platform/ContextMenu.h:
+        * platform/mac/ContextMenuMac.mm:
+        (WebCore::contextMenuItemVector):
+
+        * platform/mac/ContextMenuItemMac.mm:
+        (WebCore::ContextMenuItem::checked): WebKit2 ports now need this implemented.
+
+        Stub these out to keep their WK2 ports building:
+        * platform/qt/ContextMenuItemQt.cpp:
+        (WebCore::ContextMenuItem::checked):
+        * platform/qt/ContextMenuQt.cpp:
+        (WebCore::contextMenuItemVector):
+        * platform/win/ContextMenuItemWin.cpp:
+        (WebCore::ContextMenuItem::checked):
+        * platform/win/ContextMenuWin.cpp:
+        (WebCore::contextMenuItemVector):
+
 2010-11-01  Eric Carlson  <eric.carlson at apple.com>
 
         Reviewed by Adam Roben.
diff --git a/WebCore/WebCore.exp.in b/WebCore/WebCore.exp.in
index a4d5dbc..dc207bf 100644
--- a/WebCore/WebCore.exp.in
+++ b/WebCore/WebCore.exp.in
@@ -1225,9 +1225,22 @@ __ZNK7WebCore18RenderLayerBacking20compositingLayerTypeEv
 #if ENABLE(CONTEXT_MENUS)
 __ZN7WebCore11ContextMenu22setPlatformDescriptionEP14NSMutableArray
 __ZN7WebCore12EventHandler20sendContextMenuEventEP7NSEvent
+__ZN7WebCore12EventHandler20sendContextMenuEventERKNS_18PlatformMouseEventE
 __ZN7WebCore15ContextMenuItem26releasePlatformDescriptionEv
+__ZN7WebCore15ContextMenuItemC1ENS_19ContextMenuItemTypeENS_17ContextMenuActionERKN3WTF6StringEPNS_11ContextMenuE
+__ZN7WebCore15ContextMenuItemD1Ev
 __ZN7WebCore21ContextMenuController16clearContextMenuEv
+__ZN7WebCore21ContextMenuController23contextMenuItemSelectedEPNS_15ContextMenuItemE
+__ZN7WebCore21contextMenuItemVectorEP14NSMutableArray
+__ZN7WebCore6Chrome15showContextMenuEv
 __ZNK7WebCore11ContextMenu19platformDescriptionEv
+__ZNK7WebCore11ContextMenu21checkOrEnableIfNeededERNS_15ContextMenuItemE
+__ZNK7WebCore15ContextMenuItem15platformSubMenuEv
+__ZNK7WebCore15ContextMenuItem4typeEv
+__ZNK7WebCore15ContextMenuItem5titleEv
+__ZNK7WebCore15ContextMenuItem6actionEv
+__ZNK7WebCore15ContextMenuItem7checkedEv
+__ZNK7WebCore15ContextMenuItem7enabledEv
 #endif
 
 #if ENABLE(DASHBOARD_SUPPORT)
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index b3a8d86..d2d683b 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -21298,6 +21298,7 @@
 			isa = PBXProject;
 			buildConfigurationList = 149C284308902B11008A9EFC /* Build configuration list for PBXProject "WebCore" */;
 			compatibilityVersion = "Xcode 2.4";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
 			knownRegions = (
 				English,
diff --git a/WebCore/loader/EmptyClients.h b/WebCore/loader/EmptyClients.h
index 0dba4ee..6d37907 100644
--- a/WebCore/loader/EmptyClients.h
+++ b/WebCore/loader/EmptyClients.h
@@ -139,6 +139,10 @@ public:
     virtual PassRefPtr<PopupMenu> createPopupMenu(PopupMenuClient*) const { return adoptRef(new EmptyPopupMenu()); }
     virtual PassRefPtr<SearchPopupMenu> createSearchPopupMenu(PopupMenuClient*) const { return adoptRef(new EmptySearchPopupMenu()); }
 
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu() { }
+#endif
+
     virtual void setStatusbarText(const String&) { }
 
     virtual bool tabsToLinks() const { return false; }
diff --git a/WebCore/page/Chrome.cpp b/WebCore/page/Chrome.cpp
index 762b087..aed2784 100644
--- a/WebCore/page/Chrome.cpp
+++ b/WebCore/page/Chrome.cpp
@@ -502,4 +502,11 @@ PassRefPtr<SearchPopupMenu> Chrome::createSearchPopupMenu(PopupMenuClient* clien
     return m_client->createSearchPopupMenu(client);
 }
 
+#if ENABLE(CONTEXT_MENUS)
+void Chrome::showContextMenu()
+{
+    m_client->showContextMenu();
+}
+#endif
+
 } // namespace WebCore
diff --git a/WebCore/page/Chrome.h b/WebCore/page/Chrome.h
index 9f43b11..97665da 100644
--- a/WebCore/page/Chrome.h
+++ b/WebCore/page/Chrome.h
@@ -155,6 +155,10 @@ namespace WebCore {
         PassRefPtr<PopupMenu> createPopupMenu(PopupMenuClient*) const;
         PassRefPtr<SearchPopupMenu> createSearchPopupMenu(PopupMenuClient*) const;
 
+#if ENABLE(CONTEXT_MENUS)
+        void showContextMenu();
+#endif
+
     private:
         Page* m_page;
         ChromeClient* m_client;
diff --git a/WebCore/page/ChromeClient.h b/WebCore/page/ChromeClient.h
index abeabf9..22f1814 100644
--- a/WebCore/page/ChromeClient.h
+++ b/WebCore/page/ChromeClient.h
@@ -269,6 +269,10 @@ namespace WebCore {
         virtual PassRefPtr<PopupMenu> createPopupMenu(PopupMenuClient*) const = 0;
         virtual PassRefPtr<SearchPopupMenu> createSearchPopupMenu(PopupMenuClient*) const = 0;
 
+#if ENABLE(CONTEXT_MENUS)
+        virtual void showContextMenu() = 0;
+#endif
+
         virtual void postAccessibilityNotification(AccessibilityObject*, AXObjectCache::AXNotification) { }
 
     protected:
diff --git a/WebCore/platform/ContextMenu.h b/WebCore/platform/ContextMenu.h
index ca21f29..2a2a017 100644
--- a/WebCore/platform/ContextMenu.h
+++ b/WebCore/platform/ContextMenu.h
@@ -91,6 +91,8 @@ namespace WebCore {
 #endif
     };
 
+Vector<ContextMenuItem> contextMenuItemVector(PlatformMenuDescription);
+
 }
 
 #endif // ContextMenu_h
diff --git a/WebCore/platform/mac/ContextMenuItemMac.mm b/WebCore/platform/mac/ContextMenuItemMac.mm
index 48da786..ce779ec 100644
--- a/WebCore/platform/mac/ContextMenuItemMac.mm
+++ b/WebCore/platform/mac/ContextMenuItemMac.mm
@@ -154,6 +154,11 @@ bool ContextMenuItem::enabled() const
     return [m_platformDescription.get() isEnabled];
 }
 
+bool ContextMenuItem::checked() const
+{
+    return [m_platformDescription.get() state] == NSOnState;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(CONTEXT_MENUS)
diff --git a/WebCore/platform/mac/ContextMenuMac.mm b/WebCore/platform/mac/ContextMenuMac.mm
index 8ced8cb..c427e3c 100644
--- a/WebCore/platform/mac/ContextMenuMac.mm
+++ b/WebCore/platform/mac/ContextMenuMac.mm
@@ -153,6 +153,19 @@ NSMutableArray* ContextMenu::releasePlatformDescription()
     return m_platformDescription.releaseRef();
 }
 
+Vector<ContextMenuItem> contextMenuItemVector(PlatformMenuDescription menu)
+{
+    Vector<ContextMenuItem> items;
+    unsigned count = [menu count];
+    if (menu)
+        items.reserveCapacity(count);
+    
+    for (unsigned i = 0; i < count; ++i)
+        items.append(ContextMenuItem([menu objectAtIndex:i]));
+    
+    return items;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(CONTEXT_MENUS)
diff --git a/WebCore/platform/qt/ContextMenuItemQt.cpp b/WebCore/platform/qt/ContextMenuItemQt.cpp
index b91a2a7..a65e50c 100644
--- a/WebCore/platform/qt/ContextMenuItemQt.cpp
+++ b/WebCore/platform/qt/ContextMenuItemQt.cpp
@@ -104,6 +104,12 @@ void ContextMenuItem::setChecked(bool on)
     m_platformDescription.checked = on;
 }
 
+bool ContextMenuItem::checked() const
+{
+    // FIXME - Implement
+    return false;
+}
+
 void ContextMenuItem::setEnabled(bool on)
 {
     m_platformDescription.enabled = on;
diff --git a/WebCore/platform/qt/ContextMenuQt.cpp b/WebCore/platform/qt/ContextMenuQt.cpp
index 30c4c2d..2c1a6cb 100644
--- a/WebCore/platform/qt/ContextMenuQt.cpp
+++ b/WebCore/platform/qt/ContextMenuQt.cpp
@@ -74,6 +74,11 @@ PlatformMenuDescription ContextMenu::releasePlatformDescription()
     return PlatformMenuDescription();
 }
 
+Vector<ContextMenuItem> contextMenuItemVector(PlatformMenuDescription)
+{
+    // FIXME - Implement    
+    return Vector<ContextMenuItem>();
+}
 
 }
 // vim: ts=4 sw=4 et
diff --git a/WebCore/platform/win/ContextMenuItemWin.cpp b/WebCore/platform/win/ContextMenuItemWin.cpp
index ade0db0..d2ce76d 100644
--- a/WebCore/platform/win/ContextMenuItemWin.cpp
+++ b/WebCore/platform/win/ContextMenuItemWin.cpp
@@ -184,6 +184,12 @@ void ContextMenuItem::setChecked(bool checked)
     }
 }
 
+bool ContextMenuItem::checked() const
+{
+    // FIXME - Implement
+    return false;
+}
+
 void ContextMenuItem::setEnabled(bool enabled)
 {
     m_platformDescription->fMask |= MIIM_STATE;
diff --git a/WebCore/platform/win/ContextMenuWin.cpp b/WebCore/platform/win/ContextMenuWin.cpp
index 5260866..82511e4 100644
--- a/WebCore/platform/win/ContextMenuWin.cpp
+++ b/WebCore/platform/win/ContextMenuWin.cpp
@@ -155,4 +155,10 @@ HMENU ContextMenu::releasePlatformDescription()
     return description;
 }
 
+Vector<ContextMenuItem> contextMenuItemVector(PlatformMenuDescription)
+{
+    // FIXME - Implement    
+    return Vector<ContextMenuItem>();
+}
+
 }
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 5450843..ff509a9 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * src/ChromeClientImpl.h:
+        (WebKit::ChromeClientImpl::showContextMenu):
+
 2010-11-01  Pavel Feldman  <pfeldman at chromium.org>
 
         Not reviewed: Chromium build fix.
diff --git a/WebKit/chromium/src/ChromeClientImpl.h b/WebKit/chromium/src/ChromeClientImpl.h
index 039fc1b..fbebf62 100644
--- a/WebKit/chromium/src/ChromeClientImpl.h
+++ b/WebKit/chromium/src/ChromeClientImpl.h
@@ -174,6 +174,10 @@ public:
     virtual PassRefPtr<WebCore::PopupMenu> createPopupMenu(WebCore::PopupMenuClient*) const;
     virtual PassRefPtr<WebCore::SearchPopupMenu> createSearchPopupMenu(WebCore::PopupMenuClient*) const;
 
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu() { }
+#endif
+
 private:
     void getPopupMenuInfo(WebCore::PopupContainer*, WebPopupMenuInfo*);
 
diff --git a/WebKit/efl/ChangeLog b/WebKit/efl/ChangeLog
index d9b5222..f46c247 100644
--- a/WebKit/efl/ChangeLog
+++ b/WebKit/efl/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebCoreSupport/ChromeClientEfl.h:
+        (WebCore::ChromeClientEfl::showContextMenu):
+
 2010-10-29  Daniel Bates  <dbates at rim.com>
 
         No review, rolling out 70971.
diff --git a/WebKit/efl/WebCoreSupport/ChromeClientEfl.h b/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
index f0aeb8d..53cac59 100644
--- a/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
+++ b/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
@@ -115,6 +115,10 @@ public:
     virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*);
 #endif
 
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu() { }
+#endif
+
     virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
     virtual void chooseIconForFiles(const Vector<String>&, FileChooser*);
     virtual void formStateDidChange(const Node*);
diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog
index c8e3df3..b6d4e9b 100644
--- a/WebKit/gtk/ChangeLog
+++ b/WebKit/gtk/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebCoreSupport/ChromeClientGtk.h:
+        (WebKit::ChromeClient::showContextMenu):
+
 2010-11-01  Martin Robinson  <mrobinson at igalia.com>
 
         Reviewed by Xan Lopez.
diff --git a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
index b925313..87f1dab 100644
--- a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
+++ b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
@@ -117,6 +117,9 @@ namespace WebKit {
         virtual void reachedMaxAppCacheSize(int64_t spaceNeeded);
         virtual void reachedApplicationCacheOriginQuota(WebCore::SecurityOrigin*);
 #endif
+#if ENABLE(CONTEXT_MENUS)
+        virtual void showContextMenu() { }
+#endif
         virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
         virtual void chooseIconForFiles(const Vector<WTF::String>&, WebCore::FileChooser*);
 
diff --git a/WebKit/haiku/ChangeLog b/WebKit/haiku/ChangeLog
index 7ed4fad..6d43561 100644
--- a/WebKit/haiku/ChangeLog
+++ b/WebKit/haiku/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebCoreSupport/ChromeClientHaiku.h:
+        (WebCore::ChromeClientHaiku::showContextMenu):
+
 2010-10-29  Alexey Proskuryakov  <ap at apple.com>
 
         Reviewed by Darin Adler.
diff --git a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
index 9409c69..e8f488e 100644
--- a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
+++ b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
@@ -137,6 +137,9 @@ namespace WebCore {
         virtual void reachedMaxAppCacheSize(int64_t spaceNeeded);
         virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*);
 #endif
+#if ENABLE(CONTEXT_MENUS)
+        virtual void showContextMenu() { }
+#endif
 
         // This is an asynchronous call. The ChromeClient can display UI asking the user for permission
         // to use Geolococation.
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index cec4718..f328e4e 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebCoreSupport/WebChromeClient.h:
+        (WebChromeClient::showContextMenu):
+
 2010-10-29  Daniel Bates  <dbates at rim.com>
 
         No review, rolling out 70971.
diff --git a/WebKit/mac/WebCoreSupport/WebChromeClient.h b/WebKit/mac/WebCoreSupport/WebChromeClient.h
index 209c2b9..890637e 100644
--- a/WebKit/mac/WebCoreSupport/WebChromeClient.h
+++ b/WebKit/mac/WebCoreSupport/WebChromeClient.h
@@ -178,6 +178,9 @@ public:
     virtual PassRefPtr<WebCore::PopupMenu> createPopupMenu(WebCore::PopupMenuClient*) const;
     virtual PassRefPtr<WebCore::SearchPopupMenu> createSearchPopupMenu(WebCore::PopupMenuClient*) const;
 
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu() { }
+#endif
 private:
     WebView *m_webView;
 };
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index 8bffa0b..320fc88 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebCoreSupport/ChromeClientQt.h:
+        (WebCore::ChromeClientQt::showContextMenu):
+
 2010-10-31  Robert Hogan  <robert at webkit.org>
 
         Reviewed by Antonio Gomes.
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.h b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
index bbd2452..71b9626 100644
--- a/WebKit/qt/WebCoreSupport/ChromeClientQt.h
+++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
@@ -134,6 +134,9 @@ namespace WebCore {
         virtual void reachedMaxAppCacheSize(int64_t spaceNeeded);
         virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*);
 #endif
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu() { }
+#endif
 
 #if ENABLE(NOTIFICATIONS)
         virtual NotificationPresenter* notificationPresenter() const;
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index 6af6b3e..cb65428 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebCoreSupport/WebChromeClient.h:
+        (WebChromeClient::showContextMenu):
+
 2010-11-01  Adam Roben  <aroben at apple.com>
 
         Cancel main resource loads after we hand them off to the media engine
diff --git a/WebKit/win/WebCoreSupport/WebChromeClient.h b/WebKit/win/WebCoreSupport/WebChromeClient.h
index 5167c06..bfa3c80 100644
--- a/WebKit/win/WebCoreSupport/WebChromeClient.h
+++ b/WebKit/win/WebCoreSupport/WebChromeClient.h
@@ -122,6 +122,10 @@ public:
     virtual void reachedApplicationCacheOriginQuota(WebCore::SecurityOrigin*);
 #endif
 
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu() { }
+#endif
+
     virtual void populateVisitedLinks();
 
     virtual bool paintCustomScrollbar(WebCore::GraphicsContext*, const WebCore::FloatRect&, WebCore::ScrollbarControlSize, 
diff --git a/WebKit/wx/ChangeLog b/WebKit/wx/ChangeLog
index 123b839..3895a2e 100644
--- a/WebKit/wx/ChangeLog
+++ b/WebKit/wx/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebKitSupport/ChromeClientWx.h:
+        (WebCore::ChromeClientWx::showContextMenu):
+
 2010-10-29  Darin Adler  <darin at apple.com>
 
         Reviewed by Sam Weinig.
diff --git a/WebKit/wx/WebKitSupport/ChromeClientWx.h b/WebKit/wx/WebKitSupport/ChromeClientWx.h
index 755beb7..3ca763e 100644
--- a/WebKit/wx/WebKitSupport/ChromeClientWx.h
+++ b/WebKit/wx/WebKitSupport/ChromeClientWx.h
@@ -129,6 +129,10 @@ public:
     virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*);
 #endif
 
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu() { }
+#endif
+
     virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
     virtual void chooseIconForFiles(const Vector<String>&, FileChooser*);
 
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 8b690a6..adc5b4d 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,84 @@
+2010-11-01  Brady Eidson  <beidson at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/7660547> and https://bugs.webkit.org/show_bug.cgi?id=48699
+        Context menu support for WebKit 2.
+
+        * WebKit2.pro:
+        * WebKit2.xcodeproj/project.pbxproj:
+        * win/WebKit2.vcproj:
+
+        * Shared/WebContextMenuItem.cpp: Added.
+        (WebKit::WebContextMenuItem::WebContextMenuItem):
+        (WebKit::WebContextMenuItem::encode):
+        (WebKit::WebContextMenuItem::decode):
+        (WebKit::kitItems):
+        * Shared/WebContextMenuItem.h: Added.
+
+        * UIProcess/API/mac/PageClientImpl.h:
+        * UIProcess/API/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::createContextMenuProxy):
+        * UIProcess/API/qt/qwkpage.cpp:
+        (QWKPagePrivate::createContextMenuProxy): Stub to keep the build working.
+        * UIProcess/API/qt/qwkpage_p.h:
+        * UIProcess/PageClient.h:
+
+        * UIProcess/WebContextMenuProxy.cpp: Added.
+        (WebKit::WebContextMenuProxy::~WebContextMenuProxy):
+        (WebKit::WebContextMenuProxy::WebContextMenuProxy):
+        * UIProcess/WebContextMenuProxy.h: Added.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::showContextMenu): Shows the menu after receiving the message from the WebProcess.
+        (WebKit::WebPageProxy::contextMenuItemSelected): Sends info about the selected menu item to the WebProcess
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+
+        * UIProcess/mac/WebContextMenuProxyMac.h: Added.
+        (WebKit::WebContextMenuProxyMac::create):
+        * UIProcess/mac/WebContextMenuProxyMac.mm: Added.
+        (+[WebMenuTarget sharedMenuTarget]):
+        (-[WebMenuTarget WebKit::]):
+        (-[WebMenuTarget setMenuProxy:WebKit::]):
+        (-[WebMenuTarget forwardContextMenuAction:]):
+        (WebKit::WebContextMenuProxyMac::WebContextMenuProxyMac):
+        (WebKit::WebContextMenuProxyMac::~WebContextMenuProxyMac):
+        (WebKit::WebContextMenuProxyMac::contextMenuItemSelected):
+        (WebKit::populateNSMenu):
+        (WebKit::nsMenuItemVector):
+        (WebKit::WebContextMenuProxyMac::populate):
+        (WebKit::WebContextMenuProxyMac::showContextMenu):
+        (WebKit::WebContextMenuProxyMac::hideContextMenu):
+
+        * UIProcess/win/WebView.cpp:
+        (WebKit::WebView::createContextMenuProxy): Stub for now.
+        * UIProcess/win/WebView.h:
+
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::showContextMenu):
+        * WebProcess/WebCoreSupport/WebChromeClient.h:
+
+        * WebProcess/WebCoreSupport/WebContextMenuClient.cpp:
+        (WebKit::WebContextMenuClient::getCustomMenuFromDefaultItems): Return the WebCore-provided default
+          menu for now. Embedding app customization will come later (see bug 48720)
+
+        * WebProcess/WebPage/WebContextMenu.cpp: Added.
+        (WebKit::WebContextMenu::WebContextMenu):
+        (WebKit::WebContextMenu::~WebContextMenu):
+        (WebKit::WebContextMenu::show):
+        (WebKit::WebContextMenu::itemSelected):
+        * WebProcess/WebPage/WebContextMenu.h: Added.
+        (WebKit::WebContextMenu::create):
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::contextMenu):
+        (WebKit::handleMouseEvent): Pass right mouse presses along to WebCore as both a mouse event and context menu event, 
+          the same way WebKit1 does.
+        (WebKit::WebPage::didSelectItemFromActiveContextMenu):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+
 2010-11-01  Adam Roben  <aroben at apple.com>
 
         Cancel main resource loads after we hand them off to the media engine
diff --git a/WebKit2/Shared/WebContextMenuItem.cpp b/WebKit2/Shared/WebContextMenuItem.cpp
new file mode 100644
index 0000000..ea83426
--- /dev/null
+++ b/WebKit2/Shared/WebContextMenuItem.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2010 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 "WebContextMenuItem.h"
+
+#include "ArgumentCoders.h"
+#include "Arguments.h"
+#include <wtf/text/CString.h>
+#include <WebCore/ContextMenu.h>
+
+namespace WebKit {
+
+WebContextMenuItem::WebContextMenuItem()
+    : m_type(WebCore::ActionType)
+    , m_action(WebCore::ContextMenuItemTagNoAction)
+    , m_enabled(true)
+    , m_checked(false)
+{
+}
+
+WebContextMenuItem::WebContextMenuItem(WebCore::ContextMenuItemType type, WebCore::ContextMenuAction action, const String& title, bool enabled, bool checked)
+    : m_type(type)
+    , m_action(action)
+    , m_title(title)
+    , m_enabled(enabled)
+    , m_checked(checked)
+{
+    ASSERT(type == WebCore::ActionType || type == WebCore::CheckableActionType || type == WebCore::SeparatorType);
+}
+
+WebContextMenuItem::WebContextMenuItem(WebCore::ContextMenuAction action, const String& title, bool enabled, const Vector<WebContextMenuItem>& submenu)
+    : m_type(WebCore::SubmenuType)
+    , m_action(action)
+    , m_title(title)
+    , m_enabled(enabled)
+    , m_checked(false)
+    , m_submenu(submenu)
+{
+}
+
+WebContextMenuItem::WebContextMenuItem(WebCore::ContextMenuItem& item, WebCore::ContextMenu* menu)
+    : m_type(item.type())
+    , m_action(item.action())
+    , m_title(item.title())
+{
+    if (m_type == WebCore::SubmenuType) {
+        Vector<WebCore::ContextMenuItem> coreSubmenu = WebCore::contextMenuItemVector(item.platformSubMenu());
+        m_submenu = kitItems(coreSubmenu, menu);
+    }
+    
+    menu->checkOrEnableIfNeeded(item);
+    
+    m_enabled = item.enabled();
+    m_checked = item.checked();
+}
+
+void WebContextMenuItem::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));
+}
+
+bool WebContextMenuItem::decode(CoreIPC::ArgumentDecoder* decoder, WebContextMenuItem& item)
+{
+    uint32_t type;
+    uint32_t action;
+    String title;
+    bool checked;
+    bool enabled;
+    Vector<WebContextMenuItem> submenu;
+
+    if (!decoder->decode(CoreIPC::Out(type, action, title, checked, enabled, submenu)))
+        return false;
+
+    switch (type) {
+    case WebCore::ActionType:
+    case WebCore::SeparatorType:
+    case WebCore::CheckableActionType:
+        item = WebContextMenuItem(static_cast<WebCore::ContextMenuItemType>(type), static_cast<WebCore::ContextMenuAction>(action), title, enabled, checked);
+        break;
+    case WebCore::SubmenuType:
+        item = WebContextMenuItem(static_cast<WebCore::ContextMenuAction>(action), title, enabled, submenu);
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+        return false;
+    }
+
+    return true;
+}
+
+Vector<WebContextMenuItem> kitItems(Vector<WebCore::ContextMenuItem>& coreItems, WebCore::ContextMenu* menu)
+{
+    Vector<WebContextMenuItem> result;
+    result.reserveCapacity(coreItems.size());
+    for (unsigned i = 0; i < coreItems.size(); ++i)
+        result.append(WebContextMenuItem(coreItems[i], menu));
+    
+    return result;
+}
+
+} // namespace WebKit
diff --git a/WebKit2/Shared/WebContextMenuItem.h b/WebKit2/Shared/WebContextMenuItem.h
new file mode 100644
index 0000000..de98b9d
--- /dev/null
+++ b/WebKit2/Shared/WebContextMenuItem.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+#ifndef WebContextMenuItem_h
+#define WebContextMenuItem_h
+
+#include <WebCore/ContextMenuItem.h>
+#include <wtf/text/WTFString.h>
+
+namespace CoreIPC {
+    class ArgumentDecoder;
+    class ArgumentEncoder;
+}
+
+namespace WebCore {
+    class ContextMenu;
+}
+
+namespace WebKit {
+
+class WebContextMenuItem {
+public:
+    WebContextMenuItem();
+    WebContextMenuItem(WebCore::ContextMenuItem&, WebCore::ContextMenu* menu);
+    WebContextMenuItem(WebCore::ContextMenuItemType, WebCore::ContextMenuAction, const String& title, bool enabled, bool checked);
+    WebContextMenuItem(WebCore::ContextMenuAction, const String& title, bool enabled, const Vector<WebContextMenuItem>& submenu);
+
+    WebCore::ContextMenuItemType type() const { return m_type; }
+    WebCore::ContextMenuAction action() const { return m_action; }
+    const String& title() const { return m_title; }
+    bool enabled() const { return m_enabled; }
+    bool checked() const { return m_checked; }
+    const Vector<WebContextMenuItem>& submenu() const { return m_submenu; }
+    
+    void encode(CoreIPC::ArgumentEncoder*) const;
+    static bool decode(CoreIPC::ArgumentDecoder*, WebContextMenuItem&);
+
+private:
+    WebCore::ContextMenuItemType m_type;
+    WebCore::ContextMenuAction m_action;
+    String m_title;
+    bool m_enabled;
+    bool m_checked;
+    Vector<WebContextMenuItem> m_submenu;
+};
+
+Vector<WebContextMenuItem> kitItems(Vector<WebCore::ContextMenuItem>&, WebCore::ContextMenu*);
+
+} // namespace WebKit
+
+#endif // WebContextMenuItem_h
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.h b/WebKit2/UIProcess/API/mac/PageClientImpl.h
index 8fc7376..236a274 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.h
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.h
@@ -66,6 +66,7 @@ private:
     virtual void didNotHandleKeyEvent(const NativeWebKeyboardEvent&);
 
     virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy();
+    virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
 
     void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut);
 
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.mm b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
index 0f25121..3532cd2 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.mm
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
@@ -30,6 +30,7 @@
 #import "WKAPICast.h"
 #import "WKStringCF.h"
 #import "WKViewInternal.h"
+#import "WebContextMenuProxyMac.h"
 #import "WebEditCommandProxy.h"
 #import "WebPopupMenuProxyMac.h"
 #import <WebCore/Cursor.h>
@@ -245,6 +246,11 @@ PassRefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy()
     return WebPopupMenuProxyMac::create(m_wkView);
 }
 
+PassRefPtr<WebContextMenuProxy> PageClientImpl::createContextMenuProxy(WebPageProxy* page)
+{
+    return WebContextMenuProxyMac::create(m_wkView, page);
+}
+
 void PageClientImpl::setFindIndicator(PassRefPtr<FindIndicator> findIndicator, bool fadeOut)
 {
     [m_wkView _setFindIndicator:findIndicator fadeOut:fadeOut];
diff --git a/WebKit2/UIProcess/API/qt/qwkpage.cpp b/WebKit2/UIProcess/API/qt/qwkpage.cpp
index 67603b0..6cefcc2 100644
--- a/WebKit2/UIProcess/API/qt/qwkpage.cpp
+++ b/WebKit2/UIProcess/API/qt/qwkpage.cpp
@@ -30,6 +30,7 @@
 #include "LocalizedStrings.h"
 #include "NativeWebKeyboardEvent.h"
 #include "WebContext.h"
+#include "WebContextMenuProxy.h"
 #include "WebEventFactoryQt.h"
 #include "WebPlatformStrategies.h"
 #include "WebPopupMenuProxyQt.h"
@@ -134,6 +135,12 @@ PassRefPtr<WebPopupMenuProxy> QWKPagePrivate::createPopupMenuProxy()
     return WebPopupMenuProxyQt::create();
 }
 
+PassRefPtr<WebContextMenuProxy> QWKPagePrivate::createContextMenuProxy(WebPageProxy*)
+{
+    // FIXME: Implement;
+    return 0;
+}
+
 void QWKPagePrivate::setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut)
 {
 }
diff --git a/WebKit2/UIProcess/API/qt/qwkpage_p.h b/WebKit2/UIProcess/API/qt/qwkpage_p.h
index 73fbe33..531b085 100644
--- a/WebKit2/UIProcess/API/qt/qwkpage_p.h
+++ b/WebKit2/UIProcess/API/qt/qwkpage_p.h
@@ -61,6 +61,7 @@ public:
     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
     virtual void didNotHandleKeyEvent(const WebKit::NativeWebKeyboardEvent&);
     virtual PassRefPtr<WebKit::WebPopupMenuProxy> createPopupMenuProxy();
+    virtual PassRefPtr<WebKit::WebContextMenuProxy> createContextMenuProxy(WebKit::WebPageProxy*);
 
     virtual void setFindIndicator(PassRefPtr<WebKit::FindIndicator>, bool fadeOut);
 
diff --git a/WebKit2/UIProcess/PageClient.h b/WebKit2/UIProcess/PageClient.h
index b94f0ad..0bee10c 100644
--- a/WebKit2/UIProcess/PageClient.h
+++ b/WebKit2/UIProcess/PageClient.h
@@ -39,8 +39,9 @@ namespace WebKit {
 
 class FindIndicator;
 class NativeWebKeyboardEvent;
-class WebEditCommandProxy;
 class NativeWebKeyboardEvent;
+class WebContextMenuProxy;
+class WebEditCommandProxy;
 class WebPopupMenuProxy;
 
 class PageClient {
@@ -72,6 +73,7 @@ public:
     virtual void didNotHandleKeyEvent(const NativeWebKeyboardEvent&) = 0;
 
     virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy() = 0;
+    virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*) = 0;
 
     virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut) = 0;
 
diff --git a/WebKit2/UIProcess/WebContextMenuProxy.cpp b/WebKit2/UIProcess/WebContextMenuProxy.cpp
new file mode 100644
index 0000000..887a260
--- /dev/null
+++ b/WebKit2/UIProcess/WebContextMenuProxy.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2010 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 "WebContextMenuProxy.h"
+
+namespace WebKit {
+
+WebContextMenuProxy::WebContextMenuProxy()
+{
+}
+
+WebContextMenuProxy::~WebContextMenuProxy()
+{
+}
+
+} // namespace WebKit
diff --git a/WebKit2/UIProcess/WebContextMenuProxy.h b/WebKit2/UIProcess/WebContextMenuProxy.h
new file mode 100644
index 0000000..6af9b40
--- /dev/null
+++ b/WebKit2/UIProcess/WebContextMenuProxy.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+#ifndef WebContextMenuProxy_h
+#define WebContextMenuProxy_h
+
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+    class IntPoint;
+}
+
+namespace WebKit {
+
+struct WebContextMenuItem;
+
+class WebContextMenuProxy : public RefCounted<WebContextMenuProxy> {
+public:
+    virtual ~WebContextMenuProxy();
+
+    virtual void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItem>& items) = 0;
+    virtual void hideContextMenu() = 0;
+
+protected:
+    WebContextMenuProxy();
+};
+
+} // namespace WebKit
+
+#endif // WebPopupMenuProxy_h
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index 828367f..c91bc00 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -36,6 +36,7 @@
 #include "WebBackForwardListItem.h"
 #include "WebCertificateInfo.h"
 #include "WebContext.h"
+#include "WebContextMenuProxy.h"
 #include "WebContextUserMessageCoders.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebData.h"
@@ -1124,6 +1125,21 @@ void WebPageProxy::hidePopupMenu()
     m_activePopupMenu = 0;
 }
 
+void WebPageProxy::showContextMenu(const WebCore::IntPoint& menuLocation, const Vector<WebContextMenuItem>& items)
+{
+    if (m_activeContextMenu)
+        m_activeContextMenu->hideContextMenu();
+    else
+        m_activeContextMenu = m_pageClient->createContextMenuProxy(this);
+      
+    m_activeContextMenu->showContextMenu(menuLocation, items);
+}
+
+void WebPageProxy::contextMenuItemSelected(const WebContextMenuItem& item)
+{
+    process()->send(Messages::WebPage::DidSelectItemFromActiveContextMenu(item), m_pageID);
+}
+
 void WebPageProxy::registerEditCommand(PassRefPtr<WebEditCommandProxy> commandProxy, UndoOrRedo undoOrRedo)
 {
     m_pageClient->registerEditCommand(commandProxy, undoOrRedo);
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index 77b0dca..03a1bbb 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -32,6 +32,7 @@
 #include "GenericCallback.h"
 #include "SharedMemory.h"
 #include "WKBase.h"
+#include "WebContextMenuItem.h"
 #include "WebEvent.h"
 #include "WebFindClient.h"
 #include "WebFormClient.h"
@@ -77,6 +78,7 @@ class PlatformCertificateInfo;
 class StringPairVector;
 class WebBackForwardList;
 class WebBackForwardListItem;
+class WebContextMenuProxy;
 class WebData;
 class WebEditCommandProxy;
 class WebKeyboardEvent;
@@ -231,6 +233,8 @@ public:
 
     void getStatistics(WKContextStatistics*);
 
+    void contextMenuItemSelected(const WebContextMenuItem&);
+
 private:
     WebPageProxy(WebPageNamespace*, uint64_t pageID);
 
@@ -321,6 +325,9 @@ private:
     void showPopupMenu(const WebCore::IntRect& rect, const Vector<WebPopupItem>& items, int32_t selectedIndex);
     void hidePopupMenu();
 
+    // Context Menu.
+    void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItem>& items);
+
     void takeFocus(bool direction);
     void setToolTip(const String&);
     void setCursor(const WebCore::Cursor&);
@@ -361,6 +368,7 @@ private:
     HashSet<WebEditCommandProxy*> m_editCommandSet;
 
     RefPtr<WebPopupMenuProxy> m_activePopupMenu;
+    RefPtr<WebContextMenuProxy> m_activeContextMenu;
 
     double m_estimatedProgress;
 
diff --git a/WebKit2/UIProcess/WebPageProxy.messages.in b/WebKit2/UIProcess/WebPageProxy.messages.in
index 4059b9d..b484b96 100644
--- a/WebKit2/UIProcess/WebPageProxy.messages.in
+++ b/WebKit2/UIProcess/WebPageProxy.messages.in
@@ -118,6 +118,9 @@ messages -> WebPageProxy {
     # PopupMenu.
     ShowPopupMenu(WebCore::IntRect rect, Vector<WebKit::WebPopupItem> items, int32_t selectedIndex)
     HidePopupMenu()
+    
+    # ContextMenu
+    ShowContextMenu(WebCore::IntPoint point, Vector<WebKit::WebContextMenuItem> items)
 
 #if USE(ACCELERATED_COMPOSITING)
     # Accelerated compsiting messages.
diff --git a/WebKit2/UIProcess/mac/WebContextMenuProxyMac.h b/WebKit2/UIProcess/mac/WebContextMenuProxyMac.h
new file mode 100644
index 0000000..4fcff09
--- /dev/null
+++ b/WebKit2/UIProcess/mac/WebContextMenuProxyMac.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+#ifndef WebContextMenuProxyMac_h
+#define WebContextMenuProxyMac_h
+
+#include "WebContextMenuProxy.h"
+#include <wtf/RetainPtr.h>
+
+#ifdef __OBJC__
+ at class NSPopUpButtonCell;
+ at class WKView;
+#else
+class NSPopUpButtonCell;
+class WKView;
+#endif
+
+namespace WebKit {
+
+class WebPageProxy;
+
+class WebContextMenuProxyMac : public WebContextMenuProxy {
+public:
+    static PassRefPtr<WebContextMenuProxyMac> create(WKView* webView, WebPageProxy* page)
+    {
+        return adoptRef(new WebContextMenuProxyMac(webView, page));
+    }
+    ~WebContextMenuProxyMac();
+
+    virtual void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItem>&);
+    virtual void hideContextMenu();
+    
+    void contextMenuItemSelected(const WebContextMenuItem&);
+
+private:
+    WebContextMenuProxyMac(WKView*, WebPageProxy*);
+
+    void populate(const Vector<WebContextMenuItem>&);
+
+    RetainPtr<NSPopUpButtonCell> m_popup;
+    WKView* m_webView;
+    WebPageProxy* m_page;
+};
+
+} // namespace WebKit
+
+#endif // WebContextMenuProxyMac_h
diff --git a/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm b/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm
new file mode 100644
index 0000000..c0eac65
--- /dev/null
+++ b/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2010 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 "WebContextMenuProxyMac.h"
+
+#include "PageClientImpl.h"
+#include "WebContextMenuItem.h"
+#include "WKView.h"
+
+#include <WebCore/IntRect.h>
+#include <WebKitSystemInterface.h>
+
+using namespace WebCore;
+
+ at interface WebMenuTarget : NSObject {
+    WebKit::WebContextMenuProxyMac* _menuProxy;
+}
++ (WebMenuTarget*)sharedMenuTarget;
+- (WebKit::WebContextMenuProxyMac*)menuProxy;
+- (void)setMenuProxy:(WebKit::WebContextMenuProxyMac*)menuProxy;
+- (void)forwardContextMenuAction:(id)sender;
+ at end
+
+ at implementation WebMenuTarget
+
++ (WebMenuTarget*)sharedMenuTarget
+{
+    static WebMenuTarget* target = [[WebMenuTarget alloc] init];
+    return target;
+}
+
+- (WebKit::WebContextMenuProxyMac*)menuProxy
+{
+    return _menuProxy;
+}
+
+- (void)setMenuProxy:(WebKit::WebContextMenuProxyMac*)menuProxy
+{
+    _menuProxy = menuProxy;
+}
+
+- (void)forwardContextMenuAction:(id)sender
+{
+    WebKit::WebContextMenuItem item(ActionType, static_cast<ContextMenuAction>([sender tag]), [sender title], [sender isEnabled], [sender state] == NSOnState);
+    _menuProxy->contextMenuItemSelected(item);
+}
+
+ at end
+
+namespace WebKit {
+
+WebContextMenuProxyMac::WebContextMenuProxyMac(WKView* webView, WebPageProxy* page)
+    : m_webView(webView)
+    , m_page(page)
+{
+}
+
+WebContextMenuProxyMac::~WebContextMenuProxyMac()
+{
+    if (m_popup)
+        [m_popup.get() setControlView:nil];
+}
+
+void WebContextMenuProxyMac::contextMenuItemSelected(const WebContextMenuItem& item)
+{
+    m_page->contextMenuItemSelected(item);
+}
+
+static void populateNSMenu(NSMenu* menu, const Vector<RetainPtr<NSMenuItem> >& menuItemVector)
+{
+    for (unsigned i = 0; i < menuItemVector.size(); ++i) {
+        NSInteger oldState = [menuItemVector[i].get() state];
+        [menu addItem:menuItemVector[i].get()];
+        [menuItemVector[i].get() setState:oldState];
+    }
+}
+
+static Vector<RetainPtr<NSMenuItem> > nsMenuItemVector(const Vector<WebContextMenuItem>& items)
+{
+    Vector<RetainPtr<NSMenuItem> > result;
+
+    unsigned size = items.size();
+    result.reserveCapacity(size);
+    for (unsigned i = 0; i < size; i++) {
+        switch (items[i].type()) {
+        case ActionType:
+        case CheckableActionType: {
+            NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:nsStringFromWebCoreString(items[i].title()) action:@selector(forwardContextMenuAction:) keyEquivalent:@""];
+            [menuItem setTag:items[i].action()];
+            [menuItem setEnabled:items[i].enabled()];
+            [menuItem setState:items[i].checked() ? NSOnState : NSOffState];
+                        
+            result.append(RetainPtr<NSMenuItem>(AdoptNS, menuItem));
+            break;
+        }
+        case SeparatorType:
+            result.append([NSMenuItem separatorItem]);
+            break;
+        case SubmenuType: {
+            NSMenu* menu = [[NSMenu alloc] initWithTitle:nsStringFromWebCoreString(items[i].title())];
+            [menu setAutoenablesItems:NO];
+            populateNSMenu(menu, nsMenuItemVector(items[i].submenu()));
+                
+            NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:nsStringFromWebCoreString(items[i].title()) action:@selector(forwardContextMenuAction:) keyEquivalent:@""];
+            [menuItem setEnabled:items[i].enabled()];
+            [menuItem setSubmenu:menu];
+            [menu release];
+
+            result.append(RetainPtr<NSMenuItem>(AdoptNS, menuItem));
+            
+            break;
+        }
+        default:
+            ASSERT_NOT_REACHED();
+        }
+    }
+
+    WebMenuTarget* target = [WebMenuTarget sharedMenuTarget];
+    for (unsigned i = 0; i < size; ++i)
+        [result[i].get() setTarget:target];
+    
+    return result;
+}
+
+void WebContextMenuProxyMac::populate(const Vector<WebContextMenuItem>& items)
+{
+    if (m_popup)
+        [m_popup.get() removeAllItems];
+    else {
+        m_popup.adoptNS([[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:NO]);
+        [m_popup.get() setUsesItemFromMenu:NO];
+        [m_popup.get() setAutoenablesItems:NO];
+    }
+
+    NSMenu* menu = [m_popup.get() menu];
+    populateNSMenu(menu, nsMenuItemVector(items));
+}
+
+void WebContextMenuProxyMac::showContextMenu(const IntPoint& menuLocation, const Vector<WebContextMenuItem>& items)
+{
+    populate(items);
+    [[WebMenuTarget sharedMenuTarget] setMenuProxy:this];
+    
+    NSRect menuRect = NSMakeRect(menuLocation.x(), menuLocation.y(), 0, 0);
+    
+    [m_popup.get() attachPopUpWithFrame:menuRect inView:m_webView];
+
+    NSMenu* menu = [m_popup.get() menu];
+
+    // These values were borrowed from AppKit to match their placement of the menu.
+    NSRect titleFrame = [m_popup.get()  titleRectForBounds:menuRect];
+    if (titleFrame.size.width <= 0 || titleFrame.size.height <= 0)
+        titleFrame = menuRect;
+    float vertOffset = roundf((NSMaxY(menuRect) - NSMaxY(titleFrame)) + NSHeight(titleFrame));
+    NSPoint location = NSMakePoint(NSMinX(menuRect), NSMaxY(menuRect) - vertOffset);
+
+    RetainPtr<NSView> dummyView(AdoptNS, [[NSView alloc] initWithFrame:menuRect]);
+    [m_webView addSubview:dummyView.get()];
+    location = [dummyView.get() convertPoint:location fromView:m_webView];
+
+    WKPopupMenu(menu, location, roundf(NSWidth(menuRect)), dummyView.get(), -1, nil);
+
+    [m_popup.get() dismissPopUp];
+    [dummyView.get() removeFromSuperview];
+}
+
+void WebContextMenuProxyMac::hideContextMenu()
+{
+    [m_popup.get() dismissPopUp];
+}
+
+} // namespace WebKit
diff --git a/WebKit2/UIProcess/win/WebView.cpp b/WebKit2/UIProcess/win/WebView.cpp
index dfee2aa..f13cccc 100644
--- a/WebKit2/UIProcess/win/WebView.cpp
+++ b/WebKit2/UIProcess/win/WebView.cpp
@@ -625,6 +625,12 @@ PassRefPtr<WebPopupMenuProxy> WebView::createPopupMenuProxy()
     return WebPopupMenuProxyWin::create();
 }
 
+PassRefPtr<WebContextMenuProxy> WebView::createContextMenuProxy(WebPageProxy*)
+{
+    // FIXME: Implement.
+    return 0;
+}
+
 void WebView::setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut)
 {
     // FIXME: Implement.
diff --git a/WebKit2/UIProcess/win/WebView.h b/WebKit2/UIProcess/win/WebView.h
index 054c650..b0860df 100644
--- a/WebKit2/UIProcess/win/WebView.h
+++ b/WebKit2/UIProcess/win/WebView.h
@@ -105,6 +105,7 @@ private:
     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
     virtual void didNotHandleKeyEvent(const NativeWebKeyboardEvent&);
     virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy();
+    virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
     virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut);
 
 #if USE(ACCELERATED_COMPOSITING)
diff --git a/WebKit2/WebKit2.pro b/WebKit2/WebKit2.pro
index 9001eb3..0725811 100644
--- a/WebKit2/WebKit2.pro
+++ b/WebKit2/WebKit2.pro
@@ -214,6 +214,7 @@ HEADERS += \
     Shared/UserMessageCoders.h \
     Shared/VisitedLinkTable.h \
     Shared/WebCertificateInfo.h \
+    Shared/WebContextMenuItem.h \
     Shared/WebEvent.h \
     Shared/WebError.h \
     Shared/WebEventConversion.h \
@@ -264,6 +265,7 @@ HEADERS += \
     UIProcess/VisitedLinkProvider.h \
     UIProcess/WebContext.h \
     UIProcess/WebContextInjectedBundleClient.h \
+    UIProcess/WebContextMenuProxy.h \
     UIProcess/WebContextUserMessageCoders.h \
     UIProcess/WebEditCommandProxy.h \
     UIProcess/WebFindClient.h \
@@ -329,6 +331,7 @@ HEADERS += \
     WebProcess/WebPage/FindController.h \
     WebProcess/WebPage/FindPageOverlay.h \
     WebProcess/WebPage/PageOverlay.h \
+    WebProcess/WebPage/WebContextMenu.h \
     WebProcess/WebPage/WebEditCommand.h \
     WebProcess/WebPage/WebFrame.h \
     WebProcess/WebPage/WebInspector.h \
@@ -376,6 +379,7 @@ SOURCES += \
     Shared/qt/WebURLRequestQt.cpp \
     Shared/qt/WebURLResponseQt.cpp \
     Shared/VisitedLinkTable.cpp \
+    Shared/WebContextMenuItem.cpp \
     Shared/WebError.cpp \
     Shared/WebEvent.cpp \
     Shared/WebEventConversion.cpp \
@@ -421,6 +425,7 @@ SOURCES += \
     UIProcess/WebBackForwardList.cpp \
     UIProcess/WebBackForwardListItem.cpp \
     UIProcess/WebContext.cpp \
+    UIProcess/WebContextMenuProxy.cpp \
     UIProcess/WebContextInjectedBundleClient.cpp \
     UIProcess/WebEditCommandProxy.cpp \
     UIProcess/WebFindClient.cpp \
@@ -492,6 +497,7 @@ SOURCES += \
     WebProcess/WebPage/FindController.cpp \
     WebProcess/WebPage/FindPageOverlay.cpp \
     WebProcess/WebPage/PageOverlay.cpp \
+    WebProcess/WebPage/WebContextMenu.cpp \
     WebProcess/WebPage/WebEditCommand.cpp \
     WebProcess/WebPage/WebFrame.cpp \
     WebProcess/WebPage/WebInspector.cpp \
diff --git a/WebKit2/WebKit2.xcodeproj/project.pbxproj b/WebKit2/WebKit2.xcodeproj/project.pbxproj
index 630afe6..7c5a495 100644
--- a/WebKit2/WebKit2.xcodeproj/project.pbxproj
+++ b/WebKit2/WebKit2.xcodeproj/project.pbxproj
@@ -164,8 +164,16 @@
 		1C8E293A12761E5B00BC7BD0 /* WKInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C8E293812761E5B00BC7BD0 /* WKInspector.cpp */; };
 		51578B831209ECEF00A37C4A /* WebData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51578B821209ECEF00A37C4A /* WebData.h */; };
 		516A4A5D120A2CCD00C05B7F /* WebError.h in Headers */ = {isa = PBXBuildFile; fileRef = 516A4A5B120A2CCD00C05B7F /* WebError.h */; };
+		51871B5B127CB89D00F76232 /* WebContextMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51871B59127CB89D00F76232 /* WebContextMenu.cpp */; };
+		51871B5C127CB89D00F76232 /* WebContextMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 51871B5A127CB89D00F76232 /* WebContextMenu.h */; };
 		51A7F2F3125BF820008AEB1D /* Logging.h in Headers */ = {isa = PBXBuildFile; fileRef = 51A7F2F2125BF820008AEB1D /* Logging.h */; };
 		51A7F2F5125BF8D4008AEB1D /* Logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51A7F2F4125BF8D4008AEB1D /* Logging.cpp */; };
+		51A84CE3127F386B00CA6EA4 /* WebContextMenuProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51A84CE2127F386B00CA6EA4 /* WebContextMenuProxy.cpp */; };
+		51ACBA151279E8C300D203B9 /* WebContextMenuItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51ACBA131279E8C300D203B9 /* WebContextMenuItem.cpp */; };
+		51ACBA161279E8C300D203B9 /* WebContextMenuItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ACBA141279E8C300D203B9 /* WebContextMenuItem.h */; };
+		51ACBB82127A8BAD00D203B9 /* WebContextMenuProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ACBB81127A8BAD00D203B9 /* WebContextMenuProxy.h */; };
+		51ACBBA0127A8F2C00D203B9 /* WebContextMenuProxyMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ACBB9E127A8F2C00D203B9 /* WebContextMenuProxyMac.h */; };
+		51ACBBA1127A8F2C00D203B9 /* WebContextMenuProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51ACBB9F127A8F2C00D203B9 /* WebContextMenuProxyMac.mm */; };
 		51B3005012529D0E000B5CA0 /* WebBackForwardListCF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51B3004E12529D0E000B5CA0 /* WebBackForwardListCF.cpp */; };
 		51B3005112529D0E000B5CA0 /* WebPageProxyCF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51B3004F12529D0E000B5CA0 /* WebPageProxyCF.cpp */; };
 		6D8A91A611F0EFD100DD01FE /* com.apple.WebProcess.sb in Resources */ = {isa = PBXBuildFile; fileRef = 6D8A91A511F0EFD100DD01FE /* com.apple.WebProcess.sb */; };
@@ -670,8 +678,16 @@
 		32DBCF5E0370ADEE00C91783 /* WebKit2Prefix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKit2Prefix.h; sourceTree = "<group>"; };
 		51578B821209ECEF00A37C4A /* WebData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebData.h; sourceTree = "<group>"; };
 		516A4A5B120A2CCD00C05B7F /* WebError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebError.h; sourceTree = "<group>"; };
+		51871B59127CB89D00F76232 /* WebContextMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebContextMenu.cpp; sourceTree = "<group>"; };
+		51871B5A127CB89D00F76232 /* WebContextMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebContextMenu.h; sourceTree = "<group>"; };
 		51A7F2F2125BF820008AEB1D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logging.h; sourceTree = "<group>"; };
 		51A7F2F4125BF8D4008AEB1D /* Logging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Logging.cpp; sourceTree = "<group>"; };
+		51A84CE2127F386B00CA6EA4 /* WebContextMenuProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebContextMenuProxy.cpp; sourceTree = "<group>"; };
+		51ACBA131279E8C300D203B9 /* WebContextMenuItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebContextMenuItem.cpp; sourceTree = "<group>"; };
+		51ACBA141279E8C300D203B9 /* WebContextMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebContextMenuItem.h; sourceTree = "<group>"; };
+		51ACBB81127A8BAD00D203B9 /* WebContextMenuProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebContextMenuProxy.h; sourceTree = "<group>"; };
+		51ACBB9E127A8F2C00D203B9 /* WebContextMenuProxyMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebContextMenuProxyMac.h; sourceTree = "<group>"; };
+		51ACBB9F127A8F2C00D203B9 /* WebContextMenuProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebContextMenuProxyMac.mm; sourceTree = "<group>"; };
 		51B3004E12529D0E000B5CA0 /* WebBackForwardListCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebBackForwardListCF.cpp; path = cf/WebBackForwardListCF.cpp; sourceTree = "<group>"; };
 		51B3004F12529D0E000B5CA0 /* WebPageProxyCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebPageProxyCF.cpp; path = cf/WebPageProxyCF.cpp; sourceTree = "<group>"; };
 		5DAD7294116FF70B00EE5396 /* WebProcess.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = WebProcess.xcconfig; sourceTree = "<group>"; };
@@ -1274,12 +1290,14 @@
 				BCB0AEE7122F53E300B1341E /* MutableDictionary.h */,
 				C02BFF1512514FD8009CCBEA /* NativeWebKeyboardEvent.h */,
 				BCC57161115ADB42001CCAF9 /* NotImplemented.h */,
+				BCBD3C3A125BFA7A00D2C29F /* StringPairVector.h */,
 				BCB0B0DF12305AB100B1341E /* UserMessageCoders.h */,
 				1A0F29C9120B37160053D1B9 /* VisitedLinkTable.cpp */,
 				1A0F29CA120B37160053D1B9 /* VisitedLinkTable.h */,
 				BC1DD7B1114DC396005ADAF3 /* WebCoreArgumentCoders.h */,
 				BCF50726124329AA005955AE /* WebCertificateInfo.h */,
-				BCBD3C3A125BFA7A00D2C29F /* StringPairVector.h */,
+				51ACBA131279E8C300D203B9 /* WebContextMenuItem.cpp */,
+				51ACBA141279E8C300D203B9 /* WebContextMenuItem.h */,
 				51578B821209ECEF00A37C4A /* WebData.h */,
 				BC575612126E0138006F0F12 /* WebError.cpp */,
 				516A4A5B120A2CCD00C05B7F /* WebError.h */,
@@ -1451,6 +1469,8 @@
 		BC032D5E10F4372B0058C15A /* WebPage */ = {
 			isa = PBXGroup;
 			children = (
+				51871B59127CB89D00F76232 /* WebContextMenu.cpp */,
+				51871B5A127CB89D00F76232 /* WebContextMenu.h */,
 				BC963D6C113DD19500574BE2 /* mac */,
 				BC5F7BB21182376C0052C02C /* ChunkedUpdateDrawingArea.cpp */,
 				BC5F7BB31182376C0052C02C /* ChunkedUpdateDrawingArea.h */,
@@ -1508,6 +1528,8 @@
 				BC646BF611DD377B006455B0 /* WebBackForwardListItem.h */,
 				BCB9E2421120DACA00A137E0 /* WebContext.cpp */,
 				BCB9E2411120DACA00A137E0 /* WebContext.h */,
+				51A84CE2127F386B00CA6EA4 /* WebContextMenuProxy.cpp */,
+				51ACBB81127A8BAD00D203B9 /* WebContextMenuProxy.h */,
 				BCDE059A11CDA8AE00E41AF1 /* WebContextInjectedBundleClient.cpp */,
 				BCDE059911CDA8AE00E41AF1 /* WebContextInjectedBundleClient.h */,
 				BCB0B0DB12305A2500B1341E /* WebContextUserMessageCoders.h */,
@@ -1861,6 +1883,8 @@
 				BC2651F511825EF800243E12 /* ChunkedUpdateDrawingAreaProxyMac.mm */,
 				0F5265BB11DD37860006D33C /* LayerBackedDrawingAreaProxyMac.mm */,
 				1A1C648611F415B700553C19 /* WebContextMac.mm */,
+				51ACBB9E127A8F2C00D203B9 /* WebContextMenuProxyMac.h */,
+				51ACBB9F127A8F2C00D203B9 /* WebContextMenuProxyMac.mm */,
 				BC5750951268F3C6006F0F12 /* WebPopupMenuProxyMac.h */,
 				BC5750961268F3C6006F0F12 /* WebPopupMenuProxyMac.mm */,
 			);
@@ -2211,7 +2235,11 @@
 				935EEBA4127761D6003322B8 /* InjectedBundleBackForwardListItem.h in Headers */,
 				1A616150127798B5003ACD86 /* DownloadManager.h in Headers */,
 				1A6161D41278981C003ACD86 /* Download.h in Headers */,
+				51ACBA161279E8C300D203B9 /* WebContextMenuItem.h in Headers */,
+				51ACBB82127A8BAD00D203B9 /* WebContextMenuProxy.h in Headers */,
+				51ACBBA0127A8F2C00D203B9 /* WebContextMenuProxyMac.h in Headers */,
 				1A119A95127B796200A9ECB1 /* MessageSender.h in Headers */,
+				51871B5C127CB89D00F76232 /* WebContextMenu.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2534,12 +2562,16 @@
 				1A61614F127798B5003ACD86 /* DownloadManager.cpp in Sources */,
 				1A6161D51278981C003ACD86 /* Download.cpp in Sources */,
 				1A61639612789B2F003ACD86 /* DownloadMac.mm in Sources */,
+				51ACBA151279E8C300D203B9 /* WebContextMenuItem.cpp in Sources */,
+				51ACBBA1127A8F2C00D203B9 /* WebContextMenuProxyMac.mm in Sources */,
 				C0337DAE127A24FE008FF4F4 /* WebEvent.cpp in Sources */,
 				C0337DB0127A28D0008FF4F4 /* WebMouseEvent.cpp in Sources */,
 				C0337DD1127A2980008FF4F4 /* WebWheelEvent.cpp in Sources */,
 				C0337DD3127A2A0E008FF4F4 /* WebKeyboardEvent.cpp in Sources */,
 				C0337DD8127A51B6008FF4F4 /* WebTouchEvent.cpp in Sources */,
 				C0337DDD127A521C008FF4F4 /* WebPlatformTouchPoint.cpp in Sources */,
+				51871B5B127CB89D00F76232 /* WebContextMenu.cpp in Sources */,
+				51A84CE3127F386B00CA6EA4 /* WebContextMenuProxy.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
index 59a95e7..034bb90 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
@@ -31,6 +31,7 @@
 
 #include "DrawingArea.h"
 #include "InjectedBundleUserMessageCoders.h"
+#include "WebContextMenu.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebFrame.h"
 #include "WebFrameLoaderClient.h"
@@ -525,6 +526,13 @@ PassRefPtr<WebCore::SearchPopupMenu> WebChromeClient::createSearchPopupMenu(WebC
     return WebSearchPopupMenu::create(m_page, client);
 }
 
+#if ENABLE(CONTEXT_MENUS)
+void WebChromeClient::showContextMenu()
+{
+    m_page->contextMenu()->show();
+}
+#endif
+
 PassOwnPtr<HTMLParserQuirks> WebChromeClient::createHTMLParserQuirks()
 {
     notImplemented();
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
index be8a7ab..e82581e 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
@@ -170,6 +170,10 @@ private:
     virtual PassRefPtr<WebCore::PopupMenu> createPopupMenu(WebCore::PopupMenuClient*) const;
     virtual PassRefPtr<WebCore::SearchPopupMenu> createSearchPopupMenu(WebCore::PopupMenuClient*) const;
 
+#if ENABLE(CONTEXT_MENUS)
+    virtual void showContextMenu();
+#endif
+
 #if USE(ACCELERATED_COMPOSITING)
     virtual void attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*);
     virtual void setNeedsOneShotDrawingSynchronization();
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebContextMenuClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebContextMenuClient.cpp
index e93fa96..4e9f430 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebContextMenuClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebContextMenuClient.cpp
@@ -25,6 +25,8 @@
 
 #include "WebContextMenuClient.h"
 
+#include <WebCore/ContextMenu.h>
+
 #define DISABLE_NOT_IMPLEMENTED_WARNINGS 1
 #include "NotImplemented.h"
 
@@ -37,10 +39,13 @@ void WebContextMenuClient::contextMenuDestroyed()
     delete this;
 }
 
-PlatformMenuDescription WebContextMenuClient::getCustomMenuFromDefaultItems(ContextMenu*)
+PlatformMenuDescription WebContextMenuClient::getCustomMenuFromDefaultItems(ContextMenu* menu)
 {
-    notImplemented();
-    return 0;
+    // FIXME:  The embedded app needs a chance to customize the context menu, and that will probably happen
+    // via an injected bundle. <rdar://problem/8613727> and https://bugs.webkit.org/show_bug.cgi?id=48720 cover this task.
+
+    ASSERT(menu);
+    return menu->platformDescription();
 }
 
 void WebContextMenuClient::contextMenuItemSelected(ContextMenuItem*, const ContextMenu*)
diff --git a/WebKit2/WebProcess/WebPage/WebContextMenu.cpp b/WebKit2/WebProcess/WebPage/WebContextMenu.cpp
new file mode 100644
index 0000000..60d0341
--- /dev/null
+++ b/WebKit2/WebProcess/WebPage/WebContextMenu.cpp
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "WebContextMenu.h"
+
+#include "WebCoreArgumentCoders.h"
+#include "WebPage.h"
+#include "WebPageProxyMessages.h"
+#include "WebProcess.h"
+#include <WebCore/ContextMenu.h>
+#include <WebCore/ContextMenuController.h>
+#include <WebCore/Page.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebContextMenu::WebContextMenu(WebPage* page)
+    : m_page(page)
+{
+}
+
+WebContextMenu::~WebContextMenu()
+{
+}
+
+void WebContextMenu::show()
+{
+    WebCore::ContextMenu* menu = m_page->corePage()->contextMenuController()->contextMenu();
+    if (!menu)
+        return;
+    
+    Vector<WebCore::ContextMenuItem> coreItems = WebCore::contextMenuItemVector(menu->platformDescription());
+        
+    WebProcess::shared().connection()->send(Messages::WebPageProxy::ShowContextMenu(menu->hitTestResult().point(), kitItems(coreItems, menu)), m_page->pageID());
+}
+
+void WebContextMenu::itemSelected(const WebContextMenuItem& item)
+{
+    WebCore::ContextMenuItem coreItem(WebCore::ActionType, static_cast<WebCore::ContextMenuAction>(item.action()), item.title());
+    m_page->corePage()->contextMenuController()->contextMenuItemSelected(&coreItem);
+}
+
+} // namespace WebKit
diff --git a/WebKit2/WebProcess/WebPage/WebContextMenu.h b/WebKit2/WebProcess/WebPage/WebContextMenu.h
new file mode 100644
index 0000000..380b5e2
--- /dev/null
+++ b/WebKit2/WebProcess/WebPage/WebContextMenu.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef WebContextMenu_h
+#define WebContextMenu_h
+
+#include "WebContextMenuItem.h"
+
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+
+namespace WebKit {
+
+class WebPage;
+
+class WebContextMenu : public RefCounted<WebContextMenu> {
+public:
+    static PassRefPtr<WebContextMenu> create(WebPage* page) 
+    {
+        return adoptRef(new WebContextMenu(page));
+    }
+    
+    ~WebContextMenu();
+
+    void show();
+    void itemSelected(const WebContextMenuItem&);
+
+private:
+    WebContextMenu(WebPage*);
+    
+    WebPage* m_page;
+};
+
+} // namespace WebKit
+
+#endif // WebPopupMenu_h
diff --git a/WebKit2/WebProcess/WebPage/WebPage.cpp b/WebKit2/WebProcess/WebPage/WebPage.cpp
index b11149d..d77dac2 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.cpp
+++ b/WebKit2/WebProcess/WebPage/WebPage.cpp
@@ -38,6 +38,7 @@
 #include "PluginView.h"
 #include "WebBackForwardListProxy.h"
 #include "WebChromeClient.h"
+#include "WebContextMenu.h"
 #include "WebContextMenuClient.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebDragClient.h"
@@ -53,6 +54,8 @@
 #include "WebPreferencesStore.h"
 #include "WebProcess.h"
 #include "WebProcessProxyMessageKinds.h"
+#include <WebCore/Chrome.h>
+#include <WebCore/ContextMenuController.h>
 #include <WebCore/EventHandler.h>
 #include <WebCore/FocusController.h>
 #include <WebCore/Frame.h>
@@ -480,6 +483,13 @@ void WebPage::pageDidScroll()
     send(Messages::WebPageProxy::PageDidScroll());
 }
 
+WebContextMenu* WebPage::contextMenu()
+{
+    if (!m_contextMenu)
+        m_contextMenu = WebContextMenu::create(this);
+    return m_contextMenu.get();
+}
+
 // Events 
 
 static const WebEvent* g_currentEvent = 0;
@@ -519,7 +529,20 @@ static bool handleMouseEvent(const WebMouseEvent& mouseEvent, Page* page)
 
     switch (platformMouseEvent.eventType()) {
         case WebCore::MouseEventPressed:
-            return frame->eventHandler()->handleMousePressEvent(platformMouseEvent);
+        {
+            if (platformMouseEvent.button() == WebCore::RightButton)
+                page->contextMenuController()->clearContextMenu();
+            
+            bool handled = frame->eventHandler()->handleMousePressEvent(platformMouseEvent);
+            
+            if (platformMouseEvent.button() == WebCore::RightButton) {
+                handled = frame->eventHandler()->sendContextMenuEvent(platformMouseEvent);
+                if (handled)
+                    page->chrome()->showContextMenu();
+            }
+
+            return handled;
+        }
         case WebCore::MouseEventReleased:
             return frame->eventHandler()->handleMouseReleaseEvent(platformMouseEvent);
         case WebCore::MouseEventMoved:
@@ -883,6 +906,13 @@ void WebPage::didChangeSelectedIndexForActivePopupMenu(int32_t newIndex)
     m_activePopupMenu = 0;
 }
 
+void WebPage::didSelectItemFromActiveContextMenu(const WebContextMenuItem& item)
+{
+    ASSERT(m_contextMenu);
+    m_contextMenu->itemSelected(item);
+    m_contextMenu = 0;
+}
+
 #if PLATFORM(MAC)
 void WebPage::addPluginView(PluginView* pluginView)
 {
diff --git a/WebKit2/WebProcess/WebPage/WebPage.h b/WebKit2/WebProcess/WebPage/WebPage.h
index 8c0c58e..0c881c3 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.h
+++ b/WebKit2/WebProcess/WebPage/WebPage.h
@@ -68,6 +68,8 @@ class DrawingArea;
 class InjectedBundleBackForwardList;
 class PageOverlay;
 class PluginView;
+class WebContextMenu;
+class WebContextMenuItem;
 class WebEvent;
 class WebFrame;
 class WebInspector;
@@ -186,6 +188,8 @@ public:
     FindController& findController() { return m_findController; }
 
     void pageDidScroll();
+    
+    WebContextMenu* contextMenu();
 
 private:
     WebPage(uint64_t pageID, const WebPageCreationParameters&);
@@ -252,6 +256,10 @@ private:
 
     void didChangeSelectedIndexForActivePopupMenu(int32_t newIndex);
 
+#if ENABLE(CONTEXT_MENUS)
+    void didSelectItemFromActiveContextMenu(const WebContextMenuItem&);
+#endif
+
     OwnPtr<WebCore::Page> m_page;
     RefPtr<WebFrame> m_mainFrame;
     RefPtr<InjectedBundleBackForwardList> m_backForwardList;
@@ -294,6 +302,8 @@ private:
 
     RefPtr<WebPopupMenu> m_activePopupMenu;
 
+    RefPtr<WebContextMenu> m_contextMenu;
+
     uint64_t m_pageID;
 };
 
diff --git a/WebKit2/WebProcess/WebPage/WebPage.messages.in b/WebKit2/WebProcess/WebPage/WebPage.messages.in
index f076371..5a62913 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.messages.in
+++ b/WebKit2/WebProcess/WebPage/WebPage.messages.in
@@ -78,6 +78,9 @@ messages -> WebPage {
 
     # Popup menu.
     DidChangeSelectedIndexForActivePopupMenu(int32_t newIndex);
+    
+    # Context menu.
+    DidSelectItemFromActiveContextMenu(WebKit::WebContextMenuItem menuItem);
 
     SetWindowResizerSize(WebCore::IntSize intersectsView)
 
diff --git a/WebKit2/win/WebKit2.vcproj b/WebKit2/win/WebKit2.vcproj
index cce7e06..ccd3e95 100755
--- a/WebKit2/win/WebKit2.vcproj
+++ b/WebKit2/win/WebKit2.vcproj
@@ -489,6 +489,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\Shared\WebContextMenuItem.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Shared\WebContextMenuItem.h"
+				>
+			</File>
+			<File
 				RelativePath="..\Shared\WebCoreArgumentCoders.h"
 				>
 			</File>
@@ -1188,6 +1196,14 @@
 					>
 				</File>
 				<File
+					RelativePath="..\WebProcess\WebPage\WebContextMenu.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\WebProcess\WebPage\WebContextMenu.h"
+					>
+				</File>
+				<File
 					RelativePath="..\WebProcess\WebPage\WebEditCommand.cpp"
 					>
 				</File>
@@ -1685,6 +1701,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\UIProcess\WebContextMenuProxy.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\UIProcess\WebContextMenuProxy.h"
+				>
+			</File>
+			<File
 				RelativePath="..\UIProcess\WebContextUserMessageCoders.h"
 				>
 			</File>

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list