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

bweinstein at apple.com bweinstein at apple.com
Wed Dec 22 18:12:10 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit ff7b94c40d850b2096effb609574ba47388bf80c
Author: bweinstein at apple.com <bweinstein at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Dec 8 19:26:05 2010 +0000

    Layering Violation in ContextMenu - member variable of type HitTestResult
    https://bugs.webkit.org/show_bug.cgi?id=50586
    
    Reviewed by John Sullivan.
    
    WebCore:
    
    ContextMenu had a layering violation by having a member variable of type HitTestResult, because
    classes in WebCore/platform can't know about classes in WebCore.
    
    This patch moves the HitTestResult and all functions that use it out of ContextMenu into ContextMenuController.
    All of the functions that dealt with populating the ContextMenu are now in ContextMenuController, and this
    allowed us to delete the ContextMenu file, putting all of the cross-platform code that used to be it
    in ContextMenuController, and the rest of the code is in the platform-specific files.
    
    No change in behavior, no new tests.
    
    * Android.mk: Removed ContextMenu.cpp.
    * CMakeLists.txt: Ditto.
    * GNUmakefile.am: Ditto.
    * WebCore.gypi: Ditto.
    * WebCore.pro: Ditto.
    * WebCore.vcproj/WebCore.vcproj: Ditto.
    * WebCore.xcodeproj/project.pbxproj: Ditto.
    
    * page/ContextMenuController.cpp:
    (WebCore::ContextMenuController::ContextMenuController): Initialized m_hitTestResult to an empty HitTestResult.
    (WebCore::ContextMenuController::handleContextMenuEvent): Call populate on the ContextMenuController instead
        of the ContextMenu.
    (WebCore::ContextMenuController::createContextMenu): Fix some indination, and store the HitTestResult in a member
        variable.
    (WebCore::ContextMenuController::showContextMenu): Call addInspectElementItem on the ContextMenuController.
    (WebCore::ContextMenuController::contextMenuItemSelected): Use m_hitTestResult whenever we need a HitTestResult.
    (WebCore::ContextMenuController::appendItem): Validates the item for its state, and then appends it to the parent menu.
        This allowed us to move checkOrEnableIfNeeded from ContextMenu.
    
    These functions were all moved from ContextMenu, and changed slightly to fit in ContextMenuController.
    All calls to ContextMenu::appendItem were changed to ContextMenuController::appendItem, which takes care
    of validating the menu.
    (WebCore::separatorItem): Moved from ContextMenu.
    (WebCore::ContextMenuController::createAndAppendFontSubMenu): Ditto.
    (WebCore::ContextMenuController::createAndAppendSpellingAndGrammarSubMenu): Ditto.
    (WebCore::ContextMenuController::createAndAppendSpeechSubMenu): Ditto.
    (WebCore::ContextMenuController::createAndAppendWritingDirectionSubMenu): Ditto.
    (WebCore::ContextMenuController::createAndAppendTextDirectionSubMenu): Ditto.
    (WebCore::ContextMenuController::createAndAppendSubstitutionsSubMenu): Ditto.
    (WebCore::ContextMenuController::createAndAppendTransformationsSubMenu): Ditto.
    (WebCore::selectionContainsPossibleWord): Ditto.
    (WebCore::ContextMenuController::populate): Ditto.
    (WebCore::ContextMenuController::addInspectElementItem): Ditto.
    (WebCore::ContextMenuController::checkOrEnableIfNeeded): Ditto.
    
    * page/ContextMenuController.h:
    (WebCore::ContextMenuController::hitTestResult): Returns the HitTestResult of the current ContextMenu.
    
    * platform/ContextMenu.cpp: Removed.
    * platform/ContextMenu.h:
    * platform/efl/ContextMenuEfl.cpp:
    (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
    (WebCore::ContextMenu::appendItem): Removed the call to checkOrEnableIfNeeded.
    * platform/gtk/ContextMenuGtk.cpp:
    (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
    (WebCore::ContextMenu::appendItem): Ditto.
    * platform/haiku/ContextMenuHaiku.cpp:
    (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
    (WebCore::ContextMenu::appendItem): Ditto.
    (WebCore::ContextMenu::insertItem): Ditto.
    * platform/mac/ContextMenuMac.mm:
    (-[WebCoreMenuTarget validateMenuItem:]): Calls checkOrEnableIfNeeded on the controller instead of
        the context menu.
    (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
    (WebCore::ContextMenu::appendItem): Removed the call to checkOrEnableIfNeeded.
    (WebCore::ContextMenu::insertItem): Ditto.
    * platform/win/ContextMenuWin.cpp:
    (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
    (WebCore::ContextMenu::insertItem): Removed the call to checkOrEnableIfNeeded.
    * platform/wx/ContextMenuWx.cpp:
    (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
    (ContextMenu::appendItem): Ditto.
    
    WebKit/chromium:
    
    Update users of ContextMenu and ContextMenuController to match where the new functions
    are located.
    
    * src/ContextMenuClientImpl.cpp:
    (WebKit::selectMisspelledWord):
    (WebKit::ContextMenuClientImpl::getCustomMenuFromDefaultItems):
    
    WebKit/gtk:
    
    Update users of ContextMenu and ContextMenuController to match where the new functions
    are located.
    
    * WebCoreSupport/ContextMenuClientGtk.cpp:
    (WebKit::ContextMenuClient::getCustomMenuFromDefaultItems):
    
    WebKit/mac:
    
    Update users of ContextMenu and ContextMenuController to match where the new functions
    are located.
    
    * WebCoreSupport/WebContextMenuClient.mm:
    (WebContextMenuClient::getCustomMenuFromDefaultItems):
    (WebContextMenuClient::contextMenuItemSelected):
    * WebView/WebHTMLView.mm:
    (-[WebMenuTarget validateMenuItem:]):
    
    WebKit/qt:
    
    Update users of ContextMenu and ContextMenuController to match where the new functions
    are located.
    
    * Api/qwebpage.cpp:
    (QWebPagePrivate::createContextMenu):
    (QWebPage::updatePositionDependentActions):
    
    WebKit/win:
    
    Update users of ContextMenu and ContextMenuController to match where the new functions
    are located.
    
    * WebCoreSupport/WebContextMenuClient.cpp:
    (WebContextMenuClient::getCustomMenuFromDefaultItems): Get the HitTestResult and ContextMenu from the
        ContextMenuController (from the page).
    (WebContextMenuClient::contextMenuItemSelected): Get the HitTestResult from the ContextMenuController.
    * WebView.cpp:
    (WebView::handleContextMenuEvent): Ditto.
    
    WebKit2:
    
    Update users of ContextMenu and ContextMenuController to match where the new functions
    are located.
    
    * Shared/WebContextMenuItemData.cpp:
    (WebKit::WebContextMenuItemData::WebContextMenuItemData): Remove the call to checkOrEnableItem, that call will be made when
        the ContextMenuItem is added to the ContextMenu through the ContextMenuController.
    * WebProcess/WebPage/WebContextMenu.cpp:
    (WebKit::WebContextMenu::show):
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@73535 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/Android.mk b/WebCore/Android.mk
index 0916edb..ce67406 100644
--- a/WebCore/Android.mk
+++ b/WebCore/Android.mk
@@ -450,7 +450,6 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
 	\
 	platform/Arena.cpp \
 	platform/ContentType.cpp \
-	platform/ContextMenu.cpp \
 	platform/CrossThreadCopier.cpp \
 	platform/DeprecatedPtrListImpl.cpp \
 	platform/DragData.cpp \
diff --git a/WebCore/CMakeLists.txt b/WebCore/CMakeLists.txt
index 54b1f89..a4a6859 100644
--- a/WebCore/CMakeLists.txt
+++ b/WebCore/CMakeLists.txt
@@ -1270,7 +1270,6 @@ SET(WebCore_SOURCES
 
     platform/Arena.cpp
     platform/ContentType.cpp
-    platform/ContextMenu.cpp
     platform/CrossThreadCopier.cpp
     platform/DeprecatedPtrListImpl.cpp
     platform/DragData.cpp
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 1658f0a..cd77601 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,83 @@
+2010-12-07  Brian Weinstein  <bweinstein at apple.com>
+
+        Reviewed by John Sullivan.
+
+        Layering Violation in ContextMenu - member variable of type HitTestResult
+        https://bugs.webkit.org/show_bug.cgi?id=50586
+        
+        ContextMenu had a layering violation by having a member variable of type HitTestResult, because
+        classes in WebCore/platform can't know about classes in WebCore.
+        
+        This patch moves the HitTestResult and all functions that use it out of ContextMenu into ContextMenuController.
+        All of the functions that dealt with populating the ContextMenu are now in ContextMenuController, and this
+        allowed us to delete the ContextMenu file, putting all of the cross-platform code that used to be it
+        in ContextMenuController, and the rest of the code is in the platform-specific files.
+
+        No change in behavior, no new tests.
+
+        * Android.mk: Removed ContextMenu.cpp.
+        * CMakeLists.txt: Ditto.
+        * GNUmakefile.am: Ditto.
+        * WebCore.gypi: Ditto.
+        * WebCore.pro: Ditto.
+        * WebCore.vcproj/WebCore.vcproj: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+
+        * page/ContextMenuController.cpp:
+        (WebCore::ContextMenuController::ContextMenuController): Initialized m_hitTestResult to an empty HitTestResult.
+        (WebCore::ContextMenuController::handleContextMenuEvent): Call populate on the ContextMenuController instead
+            of the ContextMenu.
+        (WebCore::ContextMenuController::createContextMenu): Fix some indination, and store the HitTestResult in a member
+            variable.
+        (WebCore::ContextMenuController::showContextMenu): Call addInspectElementItem on the ContextMenuController.
+        (WebCore::ContextMenuController::contextMenuItemSelected): Use m_hitTestResult whenever we need a HitTestResult.
+        (WebCore::ContextMenuController::appendItem): Validates the item for its state, and then appends it to the parent menu.
+            This allowed us to move checkOrEnableIfNeeded from ContextMenu.
+
+        These functions were all moved from ContextMenu, and changed slightly to fit in ContextMenuController.
+        All calls to ContextMenu::appendItem were changed to ContextMenuController::appendItem, which takes care
+        of validating the menu.
+        (WebCore::separatorItem): Moved from ContextMenu.
+        (WebCore::ContextMenuController::createAndAppendFontSubMenu): Ditto.
+        (WebCore::ContextMenuController::createAndAppendSpellingAndGrammarSubMenu): Ditto.
+        (WebCore::ContextMenuController::createAndAppendSpeechSubMenu): Ditto.
+        (WebCore::ContextMenuController::createAndAppendWritingDirectionSubMenu): Ditto.
+        (WebCore::ContextMenuController::createAndAppendTextDirectionSubMenu): Ditto.
+        (WebCore::ContextMenuController::createAndAppendSubstitutionsSubMenu): Ditto.
+        (WebCore::ContextMenuController::createAndAppendTransformationsSubMenu): Ditto.
+        (WebCore::selectionContainsPossibleWord): Ditto.
+        (WebCore::ContextMenuController::populate): Ditto.
+        (WebCore::ContextMenuController::addInspectElementItem): Ditto.
+        (WebCore::ContextMenuController::checkOrEnableIfNeeded): Ditto.
+        
+        * page/ContextMenuController.h:
+        (WebCore::ContextMenuController::hitTestResult): Returns the HitTestResult of the current ContextMenu.
+
+        * platform/ContextMenu.cpp: Removed.
+        * platform/ContextMenu.h:
+        * platform/efl/ContextMenuEfl.cpp:
+        (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
+        (WebCore::ContextMenu::appendItem): Removed the call to checkOrEnableIfNeeded.
+        * platform/gtk/ContextMenuGtk.cpp:
+        (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
+        (WebCore::ContextMenu::appendItem): Ditto.
+        * platform/haiku/ContextMenuHaiku.cpp:
+        (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
+        (WebCore::ContextMenu::appendItem): Ditto.
+        (WebCore::ContextMenu::insertItem): Ditto.
+        * platform/mac/ContextMenuMac.mm:
+        (-[WebCoreMenuTarget validateMenuItem:]): Calls checkOrEnableIfNeeded on the controller instead of
+            the context menu.
+        (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
+        (WebCore::ContextMenu::appendItem): Removed the call to checkOrEnableIfNeeded.
+        (WebCore::ContextMenu::insertItem): Ditto.
+        * platform/win/ContextMenuWin.cpp:
+        (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
+        (WebCore::ContextMenu::insertItem): Removed the call to checkOrEnableIfNeeded.
+        * platform/wx/ContextMenuWx.cpp:
+        (WebCore::ContextMenu::ContextMenu): Removed m_hitTestResult from the constructor.
+        (ContextMenu::appendItem): Ditto.
+
 2010-12-08  Martin Robinson  <mrobinson at igalia.com>
 
         Reviewed by John Sullivan.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index 34038d7..f417a24 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -2258,7 +2258,6 @@ webcore_sources += \
 	WebCore/platform/AutodrainedPool.h \
 	WebCore/platform/ContentType.cpp \
 	WebCore/platform/ContentType.h \
-	WebCore/platform/ContextMenu.cpp \
 	WebCore/platform/ContextMenu.h \
 	WebCore/platform/ContextMenuItem.h \
 	WebCore/platform/Cookie.h \
diff --git a/WebCore/WebCore.exp.in b/WebCore/WebCore.exp.in
index e58d6fd..11e1287 100644
--- a/WebCore/WebCore.exp.in
+++ b/WebCore/WebCore.exp.in
@@ -1253,12 +1253,12 @@ __ZN7WebCore15ContextMenuItemC1ENS_19ContextMenuItemTypeENS_17ContextMenuActionE
 __ZN7WebCore15ContextMenuItemC1EP10NSMenuItem
 __ZN7WebCore15ContextMenuItemD1Ev
 __ZN7WebCore21ContextMenuController16clearContextMenuEv
+__ZNK7WebCore21ContextMenuController21checkOrEnableIfNeededERNS_15ContextMenuItemE
 __ZN7WebCore21ContextMenuController23contextMenuItemSelectedEPNS_15ContextMenuItemE
 __ZN7WebCore21contextMenuItemVectorEP14NSMutableArray
 __ZN7WebCore23platformMenuDescriptionERN3WTF6VectorINS_15ContextMenuItemELm0EEE
 __ZN7WebCore6Chrome15showContextMenuEv
 __ZNK7WebCore11ContextMenu19platformDescriptionEv
-__ZNK7WebCore11ContextMenu21checkOrEnableIfNeededERNS_15ContextMenuItemE
 __ZNK7WebCore15ContextMenuItem15platformSubMenuEv
 __ZNK7WebCore15ContextMenuItem4typeEv
 __ZNK7WebCore15ContextMenuItem5titleEv
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index 5884bf2..8d4ed02 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -3421,7 +3421,6 @@
             'platform/AutodrainedPool.h',
             'platform/ContentType.cpp',
             'platform/ContentType.h',
-            'platform/ContextMenu.cpp',
             'platform/ContextMenu.h',
             'platform/ContextMenuItem.h',
             'platform/Cookie.h',
diff --git a/WebCore/WebCore.pro b/WebCore/WebCore.pro
index 40a016c..0f88538 100644
--- a/WebCore/WebCore.pro
+++ b/WebCore/WebCore.pro
@@ -1151,7 +1151,6 @@ SOURCES += \
     platform/text/BidiContext.cpp \
     platform/text/Hyphenation.cpp \
     platform/ContentType.cpp \
-    platform/ContextMenu.cpp \
     platform/CrossThreadCopier.cpp \
     platform/DeprecatedPtrListImpl.cpp \
     platform/DragData.cpp \
diff --git a/WebCore/WebCore.vcproj/WebCore.vcproj b/WebCore/WebCore.vcproj/WebCore.vcproj
index 8132bc5..30051de 100755
--- a/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -25314,10 +25314,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\platform\ContextMenu.cpp"
-				>
-			</File>
-			<File
 				RelativePath="..\platform\ContextMenu.h"
 				>
 			</File>
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index 4f1616c..64133da 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -2839,7 +2839,6 @@
 		93B2D8160F9920D2006AE6B2 /* SuddenTermination.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B2D8150F9920D2006AE6B2 /* SuddenTermination.h */; };
 		93B2D8180F9920EE006AE6B2 /* SuddenTermination.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93B2D8170F9920EE006AE6B2 /* SuddenTermination.mm */; };
 		93B6A0E60B0BCA5C00F5027A /* ContextMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B6A0E50B0BCA5C00F5027A /* ContextMenu.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		93B6A0E80B0BCA6700F5027A /* ContextMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93B6A0E70B0BCA6700F5027A /* ContextMenu.cpp */; };
 		93B6A0EA0B0BCA8400F5027A /* ContextMenuMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93B6A0E90B0BCA8400F5027A /* ContextMenuMac.mm */; };
 		93B70D6309EB0C7C009D8468 /* JSDOMBinding.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93B70D4709EB0C7C009D8468 /* JSDOMBinding.cpp */; };
 		93B70D6409EB0C7C009D8468 /* JSDOMBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B70D4809EB0C7C009D8468 /* JSDOMBinding.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -9007,7 +9006,6 @@
 		93B2D8150F9920D2006AE6B2 /* SuddenTermination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SuddenTermination.h; sourceTree = "<group>"; };
 		93B2D8170F9920EE006AE6B2 /* SuddenTermination.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SuddenTermination.mm; sourceTree = "<group>"; };
 		93B6A0E50B0BCA5C00F5027A /* ContextMenu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ContextMenu.h; sourceTree = "<group>"; };
-		93B6A0E70B0BCA6700F5027A /* ContextMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ContextMenu.cpp; sourceTree = "<group>"; };
 		93B6A0E90B0BCA8400F5027A /* ContextMenuMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = ContextMenuMac.mm; sourceTree = "<group>"; };
 		93B70D4709EB0C7C009D8468 /* JSDOMBinding.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSDOMBinding.cpp; sourceTree = "<group>"; };
 		93B70D4809EB0C7C009D8468 /* JSDOMBinding.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSDOMBinding.h; sourceTree = "<group>"; };
@@ -17574,7 +17572,6 @@
 				BCC8CFCA0986CD2400140BF2 /* ColorData.gperf */,
 				41D015C90F4B5C71004A662F /* ContentType.cpp */,
 				41D015C80F4B5C71004A662F /* ContentType.h */,
-				93B6A0E70B0BCA6700F5027A /* ContextMenu.cpp */,
 				93B6A0E50B0BCA5C00F5027A /* ContextMenu.h */,
 				06027CAC0B1CBFC000884B2D /* ContextMenuItem.h */,
 				D8B6152E1032495100C8554A /* Cookie.h */,
@@ -21956,7 +21953,6 @@
 				A818721F0977D3C0005826D9 /* ContainerNode.cpp in Sources */,
 				BC5EB9800E82072500B25965 /* ContentData.cpp in Sources */,
 				41D015CB0F4B5C71004A662F /* ContentType.cpp in Sources */,
-				93B6A0E80B0BCA6700F5027A /* ContextMenu.cpp in Sources */,
 				065AD4F60B0C2EDA005A2B1D /* ContextMenuController.cpp in Sources */,
 				06027CB30B1CC03D00884B2D /* ContextMenuItemMac.mm in Sources */,
 				93B6A0EA0B0BCA8400F5027A /* ContextMenuMac.mm in Sources */,
diff --git a/WebCore/page/ContextMenuController.cpp b/WebCore/page/ContextMenuController.cpp
index 8f2f7ce..2f95cdf 100644
--- a/WebCore/page/ContextMenuController.cpp
+++ b/WebCore/page/ContextMenuController.cpp
@@ -33,6 +33,7 @@
 #include "Chrome.h"
 #include "ContextMenu.h"
 #include "ContextMenuClient.h"
+#include "ContextMenuItem.h"
 #include "ContextMenuProvider.h"
 #include "Document.h"
 #include "DocumentFragment.h"
@@ -50,6 +51,7 @@
 #include "HitTestRequest.h"
 #include "HitTestResult.h"
 #include "InspectorController.h"
+#include "LocalizedStrings.h"
 #include "MouseEvent.h"
 #include "NavigationAction.h"
 #include "Node.h"
@@ -63,6 +65,10 @@
 #include "TextIterator.h"
 #include "WindowFeatures.h"
 #include "markup.h"
+#include <wtf/unicode/Unicode.h>
+
+using namespace WTF;
+using namespace Unicode;
 
 namespace WebCore {
 
@@ -90,10 +96,12 @@ void ContextMenuController::clearContextMenu()
 
 void ContextMenuController::handleContextMenuEvent(Event* event)
 {
-    m_contextMenu.set(createContextMenu(event));
+    m_contextMenu = createContextMenu(event);
     if (!m_contextMenu)
         return;
-    m_contextMenu->populate();
+
+    populate();
+
     showContextMenu(event);
 }
 
@@ -101,7 +109,7 @@ void ContextMenuController::showContextMenu(Event* event, PassRefPtr<ContextMenu
 {
     m_menuProvider = menuProvider;
 
-    m_contextMenu.set(createContextMenu(event));
+    m_contextMenu = createContextMenu(event);
     if (!m_contextMenu) {
         clearContextMenu();
         return;
@@ -111,10 +119,11 @@ void ContextMenuController::showContextMenu(Event* event, PassRefPtr<ContextMenu
     showContextMenu(event);
 }
 
-ContextMenu* ContextMenuController::createContextMenu(Event* event)
+PassOwnPtr<ContextMenu> ContextMenuController::createContextMenu(Event* event)
 {
-   if (!event->isMouseEvent())
+    if (!event->isMouseEvent())
         return 0;
+
     MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
     HitTestResult result(mouseEvent->absoluteLocation());
 
@@ -123,14 +132,17 @@ ContextMenu* ContextMenuController::createContextMenu(Event* event)
 
     if (!result.innerNonSharedNode())
         return 0;
-    return new ContextMenu(result);
+
+    m_hitTestResult = result;
+
+    return new ContextMenu;
 }
 
 void ContextMenuController::showContextMenu(Event* event)
 {
 #if ENABLE(INSPECTOR)
     if (m_page->inspectorController()->enabled())
-        m_contextMenu->addInspectElementItem();
+        addInspectElementItem();
 #endif
     PlatformMenuDescription customMenu = m_client->getCustomMenuFromDefaultItems(m_contextMenu.get());
     m_contextMenu->setPlatformDescription(customMenu);
@@ -162,54 +174,53 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
         return;
     }
 
-    HitTestResult result = m_contextMenu->hitTestResult();
-    Frame* frame = result.innerNonSharedNode()->document()->frame();
+    Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame();
     if (!frame)
         return;
 
     switch (item->action()) {
     case ContextMenuItemTagOpenLinkInNewWindow:
-        openNewWindow(result.absoluteLinkURL(), frame);
+        openNewWindow(m_hitTestResult.absoluteLinkURL(), frame);
         break;
     case ContextMenuItemTagDownloadLinkToDisk:
         // FIXME: Some day we should be able to do this from within WebCore.
-        m_client->downloadURL(result.absoluteLinkURL());
+        m_client->downloadURL(m_hitTestResult.absoluteLinkURL());
         break;
     case ContextMenuItemTagCopyLinkToClipboard:
-        frame->editor()->copyURL(result.absoluteLinkURL(), result.textContent());
+        frame->editor()->copyURL(m_hitTestResult.absoluteLinkURL(), m_hitTestResult.textContent());
         break;
     case ContextMenuItemTagOpenImageInNewWindow:
-        openNewWindow(result.absoluteImageURL(), frame);
+        openNewWindow(m_hitTestResult.absoluteImageURL(), frame);
         break;
     case ContextMenuItemTagDownloadImageToDisk:
         // FIXME: Some day we should be able to do this from within WebCore.
-        m_client->downloadURL(result.absoluteImageURL());
+        m_client->downloadURL(m_hitTestResult.absoluteImageURL());
         break;
     case ContextMenuItemTagCopyImageToClipboard:
         // FIXME: The Pasteboard class is not written yet
         // For now, call into the client. This is temporary!
-        frame->editor()->copyImage(result);
+        frame->editor()->copyImage(m_hitTestResult);
         break;
     case ContextMenuItemTagOpenMediaInNewWindow:
-        openNewWindow(result.absoluteMediaURL(), frame);
+        openNewWindow(m_hitTestResult.absoluteMediaURL(), frame);
         break;
     case ContextMenuItemTagCopyMediaLinkToClipboard:
-        frame->editor()->copyURL(result.absoluteMediaURL(), result.textContent());
+        frame->editor()->copyURL(m_hitTestResult.absoluteMediaURL(), m_hitTestResult.textContent());
         break;
     case ContextMenuItemTagToggleMediaControls:
-        result.toggleMediaControlsDisplay();
+        m_hitTestResult.toggleMediaControlsDisplay();
         break;
     case ContextMenuItemTagToggleMediaLoop:
-        result.toggleMediaLoopPlayback();
+        m_hitTestResult.toggleMediaLoopPlayback();
         break;
     case ContextMenuItemTagEnterVideoFullscreen:
-        result.enterFullscreenForVideo();
+        m_hitTestResult.enterFullscreenForVideo();
         break;
     case ContextMenuItemTagMediaPlayPause:
-        result.toggleMediaPlayState();
+        m_hitTestResult.toggleMediaPlayState();
         break;
     case ContextMenuItemTagMediaMute:
-        result.toggleMediaMuteState();
+        m_hitTestResult.toggleMediaMuteState();
         break;
     case ContextMenuItemTagOpenFrameInNewWindow: {
         DocumentLoader* loader = frame->loader()->documentLoader();
@@ -273,10 +284,10 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
         m_client->lookUpInDictionary(frame);
         break;
     case ContextMenuItemTagOpenLink:
-        if (Frame* targetFrame = result.targetFrame())
-            targetFrame->loader()->loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(result.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0, SendReferrer);
+        if (Frame* targetFrame = m_hitTestResult.targetFrame())
+            targetFrame->loader()->loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(m_hitTestResult.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0, SendReferrer);
         else
-            openNewWindow(result.absoluteLinkURL(), frame);
+            openNewWindow(m_hitTestResult.absoluteLinkURL(), frame);
         break;
     case ContextMenuItemTagBold:
         frame->editor()->command("ToggleBold").execute();
@@ -295,7 +306,7 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
         ExceptionCode ec;
         RefPtr<Range> selectedRange = frame->selection()->toNormalizedRange();
         if (!selectedRange || selectedRange->collapsed(ec)) {
-            Document* document = result.innerNonSharedNode()->document();
+            Document* document = m_hitTestResult.innerNonSharedNode()->document();
             selectedRange = document->createRange();
             selectedRange->selectNode(document->documentElement(), ec);
         }
@@ -385,13 +396,13 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
         frame->editor()->toggleAutomaticSpellingCorrection();
         break;
     case ContextMenuItemTagChangeBack:
-        frame->editor()->changeBackToReplacedString(result.replacedString());
+        frame->editor()->changeBackToReplacedString(m_hitTestResult.replacedString());
         break;
 #endif
 #if ENABLE(INSPECTOR)
     case ContextMenuItemTagInspectElement:
         if (Page* page = frame->page())
-            page->inspectorController()->inspect(result.innerNonSharedNode());
+            page->inspectorController()->inspect(m_hitTestResult.innerNonSharedNode());
         break;
 #endif
     default:
@@ -399,6 +410,829 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
     }
 }
 
+void ContextMenuController::appendItem(ContextMenuItem& menuItem, ContextMenu* parentMenu)
+{
+    checkOrEnableIfNeeded(menuItem);
+    if (parentMenu)
+        parentMenu->appendItem(menuItem);
+}
+
+static PassOwnPtr<ContextMenuItem> separatorItem()
+{
+    return new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String());
+}
+
+void ContextMenuController::createAndAppendFontSubMenu(ContextMenuItem& fontMenuItem)
+{
+    ContextMenu fontMenu;
+
+#if PLATFORM(MAC)
+    ContextMenuItem showFonts(ActionType, ContextMenuItemTagShowFonts, contextMenuItemTagShowFonts());
+#endif
+    ContextMenuItem bold(CheckableActionType, ContextMenuItemTagBold, contextMenuItemTagBold());
+    ContextMenuItem italic(CheckableActionType, ContextMenuItemTagItalic, contextMenuItemTagItalic());
+    ContextMenuItem underline(CheckableActionType, ContextMenuItemTagUnderline, contextMenuItemTagUnderline());
+    ContextMenuItem outline(ActionType, ContextMenuItemTagOutline, contextMenuItemTagOutline());
+#if PLATFORM(MAC)
+    ContextMenuItem styles(ActionType, ContextMenuItemTagStyles, contextMenuItemTagStyles());
+    ContextMenuItem showColors(ActionType, ContextMenuItemTagShowColors, contextMenuItemTagShowColors());
+#endif
+
+#if PLATFORM(MAC)
+    appendItem(showFonts, &fontMenu);
+#endif
+    appendItem(bold, &fontMenu);
+    appendItem(italic, &fontMenu);
+    appendItem(underline, &fontMenu);
+    appendItem(outline, &fontMenu);
+#if PLATFORM(MAC)
+    appendItem(styles, &fontMenu);
+    appendItem(*separatorItem(), &fontMenu);
+    appendItem(showColors, &fontMenu);
+#endif
+
+    fontMenuItem.setSubMenu(&fontMenu);
+}
+
+#if !defined(BUILDING_ON_TIGER)
+
+#if !PLATFORM(GTK)
+
+void ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenuItem& spellingAndGrammarMenuItem)
+{
+    ContextMenu spellingAndGrammarMenu;
+
+    ContextMenuItem showSpellingPanel(ActionType, ContextMenuItemTagShowSpellingPanel, 
+        contextMenuItemTagShowSpellingPanel(true));
+    ContextMenuItem checkSpelling(ActionType, ContextMenuItemTagCheckSpelling, 
+        contextMenuItemTagCheckSpelling());
+    ContextMenuItem checkAsYouType(CheckableActionType, ContextMenuItemTagCheckSpellingWhileTyping, 
+        contextMenuItemTagCheckSpellingWhileTyping());
+    ContextMenuItem grammarWithSpelling(CheckableActionType, ContextMenuItemTagCheckGrammarWithSpelling, 
+        contextMenuItemTagCheckGrammarWithSpelling());
+#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
+    ContextMenuItem correctSpelling(CheckableActionType, ContextMenuItemTagCorrectSpellingAutomatically, 
+        contextMenuItemTagCorrectSpellingAutomatically());
+#endif
+
+    appendItem(showSpellingPanel, &spellingAndGrammarMenu);
+    appendItem(checkSpelling, &spellingAndGrammarMenu);
+#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
+    appendItem(*separatorItem(), &spellingAndGrammarMenu);
+#endif
+    appendItem(checkAsYouType, &spellingAndGrammarMenu);
+    appendItem(grammarWithSpelling, &spellingAndGrammarMenu);
+#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
+    appendItem(correctSpelling, &spellingAndGrammarMenu);
+#endif
+
+    spellingAndGrammarMenuItem.setSubMenu(&spellingAndGrammarMenu);
+}
+
+#endif // !PLATFORM(GTK)
+
+#else
+
+void ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenuItem& spellingAndGrammarMenuItem)
+{
+    ContextMenu spellingMenu;
+
+    ContextMenuItem showSpellingPanel(ActionType, ContextMenuItemTagShowSpellingPanel, 
+        contextMenuItemTagShowSpellingPanel(true));
+    ContextMenuItem checkSpelling(ActionType, ContextMenuItemTagCheckSpelling, 
+        contextMenuItemTagCheckSpelling());
+    ContextMenuItem checkAsYouType(CheckableActionType, ContextMenuItemTagCheckSpellingWhileTyping, 
+        contextMenuItemTagCheckSpellingWhileTyping());
+
+    appendItem(showSpellingPanel, &spellingMenu);
+    appendItem(checkSpelling, &spellingMenu);
+    appendItem(checkAsYouType, &spellingMenu);
+
+    spellingMenuItem.setSubMenu(&spellingMenu);
+}
+
+#endif
+
+#if PLATFORM(MAC)
+
+void ContextMenuController::createAndAppendSpeechSubMenu(ContextMenuItem& speechMenuItem)
+{
+    ContextMenu speechMenu;
+
+    ContextMenuItem start(ActionType, ContextMenuItemTagStartSpeaking, contextMenuItemTagStartSpeaking());
+    ContextMenuItem stop(ActionType, ContextMenuItemTagStopSpeaking, contextMenuItemTagStopSpeaking());
+
+    appendItem(start, &speechMenu);
+    appendItem(stop, &speechMenu);
+
+    speechMenuItem.setSubMenu(&speechMenu);
+}
+
+#endif
+ 
+#if !PLATFORM(GTK)
+
+void ContextMenuController::createAndAppendWritingDirectionSubMenu(ContextMenuItem& writingDirectionMenuItem)
+{
+    ContextMenu writingDirectionMenu;
+
+    ContextMenuItem defaultItem(ActionType, ContextMenuItemTagDefaultDirection, 
+        contextMenuItemTagDefaultDirection());
+    ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagLeftToRight, contextMenuItemTagLeftToRight());
+    ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagRightToLeft, contextMenuItemTagRightToLeft());
+
+    appendItem(defaultItem, &writingDirectionMenu);
+    appendItem(ltr, &writingDirectionMenu);
+    appendItem(rtl, &writingDirectionMenu);
+
+    writingDirectionMenuItem.setSubMenu(&writingDirectionMenu);
+}
+
+void ContextMenuController::createAndAppendTextDirectionSubMenu(ContextMenuItem& textDirectionMenuItem)
+{
+    ContextMenu textDirectionMenu;
+
+    ContextMenuItem defaultItem(ActionType, ContextMenuItemTagTextDirectionDefault, contextMenuItemTagDefaultDirection());
+    ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagTextDirectionLeftToRight, contextMenuItemTagLeftToRight());
+    ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagTextDirectionRightToLeft, contextMenuItemTagRightToLeft());
+
+    appendItem(defaultItem, &textDirectionMenu);
+    appendItem(ltr, &textDirectionMenu);
+    appendItem(rtl, &textDirectionMenu);
+
+    textDirectionMenuItem.setSubMenu(&textDirectionMenu);
+}
+
+#endif
+
+#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+
+void ContextMenuController::createAndAppendSubstitutionsSubMenu(ContextMenuItem& substitutionsMenuItem)
+{
+    ContextMenu substitutionsMenu;
+
+    ContextMenuItem showSubstitutions(ActionType, ContextMenuItemTagShowSubstitutions, contextMenuItemTagShowSubstitutions(true));
+    ContextMenuItem smartCopyPaste(CheckableActionType, ContextMenuItemTagSmartCopyPaste, contextMenuItemTagSmartCopyPaste());
+    ContextMenuItem smartQuotes(CheckableActionType, ContextMenuItemTagSmartQuotes, contextMenuItemTagSmartQuotes());
+    ContextMenuItem smartDashes(CheckableActionType, ContextMenuItemTagSmartDashes, contextMenuItemTagSmartDashes());
+    ContextMenuItem smartLinks(CheckableActionType, ContextMenuItemTagSmartLinks, contextMenuItemTagSmartLinks());
+    ContextMenuItem textReplacement(CheckableActionType, ContextMenuItemTagTextReplacement, contextMenuItemTagTextReplacement());
+
+    appendItem(showSubstitutions, &substitutionsMenu);
+    appendItem(*separatorItem(), &substitutionsMenu);
+    appendItem(smartCopyPaste, &substitutionsMenu);
+    appendItem(smartQuotes, &substitutionsMenu);
+    appendItem(smartDashes, &substitutionsMenu);
+    appendItem(smartLinks, &substitutionsMenu);
+    appendItem(textReplacement, &substitutionsMenu);
+
+    substitutionsMenuItem.setSubMenu(&substitutionsMenu);
+}
+
+void ContextMenuController::createAndAppendTransformationsSubMenu(ContextMenuItem& transformationsMenuItem)
+{
+    ContextMenu transformationsMenu;
+
+    ContextMenuItem makeUpperCase(ActionType, ContextMenuItemTagMakeUpperCase, contextMenuItemTagMakeUpperCase());
+    ContextMenuItem makeLowerCase(ActionType, ContextMenuItemTagMakeLowerCase, contextMenuItemTagMakeLowerCase());
+    ContextMenuItem capitalize(ActionType, ContextMenuItemTagCapitalize, contextMenuItemTagCapitalize());
+
+    appendItem(makeUpperCase, &transformationsMenu);
+    appendItem(makeLowerCase, &transformationsMenu);
+    appendItem(capitalize, &transformationsMenu);
+
+    transformationsMenuItem.setSubMenu(&transformationsMenu);
+}
+
+#endif
+
+static bool selectionContainsPossibleWord(Frame* frame)
+{
+    // Current algorithm: look for a character that's not just a separator.
+    for (TextIterator it(frame->selection()->toNormalizedRange().get()); !it.atEnd(); it.advance()) {
+        int length = it.length();
+        const UChar* characters = it.characters();
+        for (int i = 0; i < length; ++i)
+            if (!(category(characters[i]) & (Separator_Space | Separator_Line | Separator_Paragraph)))
+                return true;
+    }
+    return false;
+}
+
+void ContextMenuController::populate()
+{
+    ContextMenuItem OpenLinkItem(ActionType, ContextMenuItemTagOpenLink, contextMenuItemTagOpenLink());
+    ContextMenuItem OpenLinkInNewWindowItem(ActionType, ContextMenuItemTagOpenLinkInNewWindow, 
+        contextMenuItemTagOpenLinkInNewWindow());
+    ContextMenuItem DownloadFileItem(ActionType, ContextMenuItemTagDownloadLinkToDisk, 
+        contextMenuItemTagDownloadLinkToDisk());
+    ContextMenuItem CopyLinkItem(ActionType, ContextMenuItemTagCopyLinkToClipboard, 
+        contextMenuItemTagCopyLinkToClipboard());
+    ContextMenuItem OpenImageInNewWindowItem(ActionType, ContextMenuItemTagOpenImageInNewWindow, 
+        contextMenuItemTagOpenImageInNewWindow());
+    ContextMenuItem DownloadImageItem(ActionType, ContextMenuItemTagDownloadImageToDisk, 
+        contextMenuItemTagDownloadImageToDisk());
+    ContextMenuItem CopyImageItem(ActionType, ContextMenuItemTagCopyImageToClipboard, 
+        contextMenuItemTagCopyImageToClipboard());
+    ContextMenuItem OpenMediaInNewWindowItem(ActionType, ContextMenuItemTagOpenMediaInNewWindow, String());
+    ContextMenuItem CopyMediaLinkItem(ActionType, ContextMenuItemTagCopyMediaLinkToClipboard, 
+        String());
+    ContextMenuItem MediaPlayPause(ActionType, ContextMenuItemTagMediaPlayPause, 
+        contextMenuItemTagMediaPlay());
+    ContextMenuItem MediaMute(ActionType, ContextMenuItemTagMediaMute, 
+        contextMenuItemTagMediaMute());
+    ContextMenuItem ToggleMediaControls(CheckableActionType, ContextMenuItemTagToggleMediaControls, 
+        contextMenuItemTagToggleMediaControls());
+    ContextMenuItem ToggleMediaLoop(CheckableActionType, ContextMenuItemTagToggleMediaLoop, 
+        contextMenuItemTagToggleMediaLoop());
+    ContextMenuItem EnterVideoFullscreen(ActionType, ContextMenuItemTagEnterVideoFullscreen, 
+        contextMenuItemTagEnterVideoFullscreen());
+#if PLATFORM(MAC)
+    ContextMenuItem SearchSpotlightItem(ActionType, ContextMenuItemTagSearchInSpotlight, 
+        contextMenuItemTagSearchInSpotlight());
+    ContextMenuItem LookInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, 
+        contextMenuItemTagLookUpInDictionary());
+#endif
+#if !PLATFORM(GTK)
+    ContextMenuItem SearchWebItem(ActionType, ContextMenuItemTagSearchWeb, contextMenuItemTagSearchWeb());
+#endif
+    ContextMenuItem CopyItem(ActionType, ContextMenuItemTagCopy, contextMenuItemTagCopy());
+    ContextMenuItem BackItem(ActionType, ContextMenuItemTagGoBack, contextMenuItemTagGoBack());
+    ContextMenuItem ForwardItem(ActionType, ContextMenuItemTagGoForward,  contextMenuItemTagGoForward());
+    ContextMenuItem StopItem(ActionType, ContextMenuItemTagStop, contextMenuItemTagStop());
+    ContextMenuItem ReloadItem(ActionType, ContextMenuItemTagReload, contextMenuItemTagReload());
+    ContextMenuItem OpenFrameItem(ActionType, ContextMenuItemTagOpenFrameInNewWindow, 
+        contextMenuItemTagOpenFrameInNewWindow());
+    ContextMenuItem NoGuessesItem(ActionType, ContextMenuItemTagNoGuessesFound, 
+        contextMenuItemTagNoGuessesFound());
+    ContextMenuItem IgnoreSpellingItem(ActionType, ContextMenuItemTagIgnoreSpelling, 
+        contextMenuItemTagIgnoreSpelling());
+    ContextMenuItem LearnSpellingItem(ActionType, ContextMenuItemTagLearnSpelling, 
+        contextMenuItemTagLearnSpelling());
+    ContextMenuItem IgnoreGrammarItem(ActionType, ContextMenuItemTagIgnoreGrammar, 
+        contextMenuItemTagIgnoreGrammar());
+    ContextMenuItem CutItem(ActionType, ContextMenuItemTagCut, contextMenuItemTagCut());
+    ContextMenuItem PasteItem(ActionType, ContextMenuItemTagPaste, contextMenuItemTagPaste());
+#if PLATFORM(GTK)
+    ContextMenuItem DeleteItem(ActionType, ContextMenuItemTagDelete, contextMenuItemTagDelete());
+    ContextMenuItem SelectAllItem(ActionType, ContextMenuItemTagSelectAll, contextMenuItemTagSelectAll());
+#endif
+
+    Node* node = m_hitTestResult.innerNonSharedNode();
+    if (!node)
+        return;
+#if PLATFORM(GTK)
+    if (!m_hitTestResult.isContentEditable() && (node->isElementNode() && static_cast<Element*>(node)->isFormControlElement()))
+        return;
+#endif
+    Frame* frame = node->document()->frame();
+    if (!frame)
+        return;
+
+    if (!m_hitTestResult.isContentEditable()) {
+        FrameLoader* loader = frame->loader();
+        KURL linkURL = m_hitTestResult.absoluteLinkURL();
+        if (!linkURL.isEmpty()) {
+            if (loader->canHandleRequest(ResourceRequest(linkURL))) {
+                appendItem(OpenLinkItem, m_contextMenu.get());
+                appendItem(OpenLinkInNewWindowItem, m_contextMenu.get());
+                appendItem(DownloadFileItem, m_contextMenu.get());
+            }
+            appendItem(CopyLinkItem, m_contextMenu.get());
+        }
+
+        KURL imageURL = m_hitTestResult.absoluteImageURL();
+        if (!imageURL.isEmpty()) {
+            if (!linkURL.isEmpty())
+                appendItem(*separatorItem(), m_contextMenu.get());
+
+            appendItem(OpenImageInNewWindowItem, m_contextMenu.get());
+            appendItem(DownloadImageItem, m_contextMenu.get());
+            if (imageURL.isLocalFile() || m_hitTestResult.image())
+                appendItem(CopyImageItem, m_contextMenu.get());
+        }
+
+        KURL mediaURL = m_hitTestResult.absoluteMediaURL();
+        if (!mediaURL.isEmpty()) {
+            if (!linkURL.isEmpty() || !imageURL.isEmpty())
+                appendItem(*separatorItem(), m_contextMenu.get());
+
+            appendItem(MediaPlayPause, m_contextMenu.get());
+            appendItem(MediaMute, m_contextMenu.get());
+            appendItem(ToggleMediaControls, m_contextMenu.get());
+            appendItem(ToggleMediaLoop, m_contextMenu.get());
+            appendItem(EnterVideoFullscreen, m_contextMenu.get());
+
+            appendItem(*separatorItem(), m_contextMenu.get());
+            appendItem(CopyMediaLinkItem, m_contextMenu.get());
+            appendItem(OpenMediaInNewWindowItem, m_contextMenu.get());
+        }
+
+        if (imageURL.isEmpty() && linkURL.isEmpty() && mediaURL.isEmpty()) {
+            if (m_hitTestResult.isSelected()) {
+                if (selectionContainsPossibleWord(frame)) {
+#if PLATFORM(MAC)
+                    appendItem(SearchSpotlightItem, m_contextMenu.get());
+#endif
+#if !PLATFORM(GTK)
+                    appendItem(SearchWebItem, m_contextMenu.get());
+                    appendItem(*separatorItem(), m_contextMenu.get());
+#endif
+#if PLATFORM(MAC)
+                    appendItem(LookInDictionaryItem, m_contextMenu.get());
+                    appendItem(*separatorItem(), m_contextMenu.get());
+#endif
+                }
+                appendItem(CopyItem, m_contextMenu.get());
+#if PLATFORM(MAC)
+                appendItem(*separatorItem(), m_contextMenu.get());
+                ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu());
+                createAndAppendSpeechSubMenu(SpeechMenuItem);
+                appendItem(SpeechMenuItem, m_contextMenu.get());
+#endif                
+            } else {
+#if ENABLE(INSPECTOR)
+                if (!(frame->page() && frame->page()->inspectorController()->hasInspectorFrontendClient())) {
+#endif
+                if (frame->page() && frame->page()->backForward()->canGoBackOrForward(-1))
+                    appendItem(BackItem, m_contextMenu.get());
+
+                if (frame->page() && frame->page()->backForward()->canGoBackOrForward(1))
+                    appendItem(ForwardItem, m_contextMenu.get());
+
+                // use isLoadingInAPISense rather than isLoading because Stop/Reload are
+                // intended to match WebKit's API, not WebCore's internal notion of loading status
+                if (loader->documentLoader()->isLoadingInAPISense())
+                    appendItem(StopItem, m_contextMenu.get());
+                else
+                    appendItem(ReloadItem, m_contextMenu.get());
+#if ENABLE(INSPECTOR)
+                }
+#endif
+
+                if (frame->page() && frame != frame->page()->mainFrame())
+                    appendItem(OpenFrameItem, m_contextMenu.get());
+            }
+        }
+    } else { // Make an editing context menu
+        SelectionController* selection = frame->selection();
+        bool inPasswordField = selection->isInPasswordField();
+        bool spellCheckingEnabled = frame->editor()->isSpellCheckingEnabledFor(node);
+        
+        if (!inPasswordField && spellCheckingEnabled) {
+            // Consider adding spelling-related or grammar-related context menu items (never both, since a single selected range
+            // is never considered a misspelling and bad grammar at the same time)
+            bool misspelling;
+            bool badGrammar;
+            Vector<String> guesses = frame->editor()->guessesForMisspelledOrUngrammaticalSelection(misspelling, badGrammar);
+            if (misspelling || badGrammar) {
+                size_t size = guesses.size();
+                if (size == 0) {
+                    // If there's bad grammar but no suggestions (e.g., repeated word), just leave off the suggestions
+                    // list and trailing separator rather than adding a "No Guesses Found" item (matches AppKit)
+                    if (misspelling) {
+                        appendItem(NoGuessesItem, m_contextMenu.get());
+                        appendItem(*separatorItem(), m_contextMenu.get());
+                    }
+                } else {
+                    for (unsigned i = 0; i < size; i++) {
+                        const String &guess = guesses[i];
+                        if (!guess.isEmpty()) {
+                            ContextMenuItem item(ActionType, ContextMenuItemTagSpellingGuess, guess);
+                            appendItem(item, m_contextMenu.get());
+                        }
+                    }
+                    appendItem(*separatorItem(), m_contextMenu.get());                    
+                }
+                
+                if (misspelling) {
+                    appendItem(IgnoreSpellingItem, m_contextMenu.get());
+                    appendItem(LearnSpellingItem, m_contextMenu.get());
+                } else
+                    appendItem(IgnoreGrammarItem, m_contextMenu.get());
+                appendItem(*separatorItem(), m_contextMenu.get());
+#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            } else {
+                // If the string was autocorrected, generate a contextual menu item allowing it to be changed back.
+                String replacedString = m_hitTestResult.replacedString();
+                if (!replacedString.isEmpty()) {
+                    ContextMenuItem item(ActionType, ContextMenuItemTagChangeBack, contextMenuItemTagChangeBack(replacedString));
+                    appendItem(item, m_contextMenu.get());
+                    appendItem(*separatorItem(), m_contextMenu.get());
+                }
+#endif
+            }
+        }
+
+        FrameLoader* loader = frame->loader();
+        KURL linkURL = m_hitTestResult.absoluteLinkURL();
+        if (!linkURL.isEmpty()) {
+            if (loader->canHandleRequest(ResourceRequest(linkURL))) {
+                appendItem(OpenLinkItem, m_contextMenu.get());
+                appendItem(OpenLinkInNewWindowItem, m_contextMenu.get());
+                appendItem(DownloadFileItem, m_contextMenu.get());
+            }
+            appendItem(CopyLinkItem, m_contextMenu.get());
+            appendItem(*separatorItem(), m_contextMenu.get());
+        }
+
+        if (m_hitTestResult.isSelected() && !inPasswordField && selectionContainsPossibleWord(frame)) {
+#if PLATFORM(MAC)
+            appendItem(SearchSpotlightItem, m_contextMenu.get());
+#endif
+#if !PLATFORM(GTK)
+            appendItem(SearchWebItem, m_contextMenu.get());
+            appendItem(*separatorItem(), m_contextMenu.get());
+#endif
+     
+#if PLATFORM(MAC)
+            appendItem(LookInDictionaryItem, m_contextMenu.get());
+            appendItem(*separatorItem(), m_contextMenu.get());
+#endif
+        }
+
+        appendItem(CutItem, m_contextMenu.get());
+        appendItem(CopyItem, m_contextMenu.get());
+        appendItem(PasteItem, m_contextMenu.get());
+#if PLATFORM(GTK)
+        appendItem(DeleteItem, m_contextMenu.get());
+        appendItem(*separatorItem(), m_contextMenu.get());
+        appendItem(SelectAllItem, m_contextMenu.get());
+#endif
+
+        if (!inPasswordField) {
+            appendItem(*separatorItem(), m_contextMenu.get());
+#ifndef BUILDING_ON_TIGER
+#if !PLATFORM(GTK)
+            ContextMenuItem SpellingAndGrammarMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu, 
+                contextMenuItemTagSpellingMenu());
+            createAndAppendSpellingAndGrammarSubMenu(SpellingAndGrammarMenuItem);
+            appendItem(SpellingAndGrammarMenuItem, m_contextMenu.get());
+#endif
+#else
+            ContextMenuItem SpellingMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu, 
+                contextMenuItemTagSpellingMenu());
+            createAndAppendSpellingSubMenu(SpellingMenuItem);
+            appendItem(SpellingMenuItem, m_contextMenu.get());
+#endif
+#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            ContextMenuItem substitutionsMenuItem(SubmenuType, ContextMenuItemTagSubstitutionsMenu, 
+                contextMenuItemTagSubstitutionsMenu());
+            createAndAppendSubstitutionsSubMenu(substitutionsMenuItem);
+            appendItem(substitutionsMenuItem, m_contextMenu.get());
+            ContextMenuItem transformationsMenuItem(SubmenuType, ContextMenuItemTagTransformationsMenu, 
+                contextMenuItemTagTransformationsMenu());
+            createAndAppendTransformationsSubMenu(transformationsMenuItem);
+            appendItem(transformationsMenuItem, m_contextMenu.get());
+#endif
+#if PLATFORM(GTK)
+            bool shouldShowFontMenu = frame->editor()->canEditRichly();
+#else
+            bool shouldShowFontMenu = true;
+#endif
+            if (shouldShowFontMenu) {
+                ContextMenuItem FontMenuItem(SubmenuType, ContextMenuItemTagFontMenu, 
+                    contextMenuItemTagFontMenu());
+                createAndAppendFontSubMenu(FontMenuItem);
+                appendItem(FontMenuItem, m_contextMenu.get());
+            }
+#if PLATFORM(MAC)
+            ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu());
+            createAndAppendSpeechSubMenu(SpeechMenuItem);
+            appendItem(SpeechMenuItem, m_contextMenu.get());
+#endif
+#if !PLATFORM(GTK)
+            ContextMenuItem WritingDirectionMenuItem(SubmenuType, ContextMenuItemTagWritingDirectionMenu, 
+                contextMenuItemTagWritingDirectionMenu());
+            createAndAppendWritingDirectionSubMenu(WritingDirectionMenuItem);
+            appendItem(WritingDirectionMenuItem, m_contextMenu.get());
+            if (Page* page = frame->page()) {
+                if (Settings* settings = page->settings()) {
+                    bool includeTextDirectionSubmenu = settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAlwaysIncluded
+                        || (settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAutomaticallyIncluded && frame->editor()->hasBidiSelection());
+                    if (includeTextDirectionSubmenu) {
+                        ContextMenuItem TextDirectionMenuItem(SubmenuType, ContextMenuItemTagTextDirectionMenu, 
+                            contextMenuItemTagTextDirectionMenu());
+                        createAndAppendTextDirectionSubMenu(TextDirectionMenuItem);
+                        appendItem(TextDirectionMenuItem, m_contextMenu.get());
+                    }
+                }
+            }
+#endif
+        }
+    }
+}
+
+#if ENABLE(INSPECTOR)
+void ContextMenuController::addInspectElementItem()
+{
+    Node* node = m_hitTestResult.innerNonSharedNode();
+    if (!node)
+        return;
+
+    Frame* frame = node->document()->frame();
+    if (!frame)
+        return;
+
+    Page* page = frame->page();
+    if (!page)
+        return;
+
+    if (!page->inspectorController())
+        return;
+
+    ContextMenuItem InspectElementItem(ActionType, ContextMenuItemTagInspectElement, contextMenuItemTagInspectElement());
+    appendItem(*separatorItem(), m_contextMenu.get());
+    appendItem(InspectElementItem, m_contextMenu.get());
+}
+#endif // ENABLE(INSPECTOR)
+
+void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const
+{
+    if (item.type() == SeparatorType)
+        return;
+    
+    Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame();
+    if (!frame)
+        return;
+
+    // Custom items already have proper checked and enabled values.
+    if (ContextMenuItemBaseCustomTag <= item.action() && item.action() <= ContextMenuItemLastCustomTag)
+        return;
+
+    bool shouldEnable = true;
+    bool shouldCheck = false; 
+
+    switch (item.action()) {
+        case ContextMenuItemTagCheckSpelling:
+            shouldEnable = frame->editor()->canEdit();
+            break;
+        case ContextMenuItemTagDefaultDirection:
+            shouldCheck = false;
+            shouldEnable = false;
+            break;
+        case ContextMenuItemTagLeftToRight:
+        case ContextMenuItemTagRightToLeft: {
+            ExceptionCode ec = 0;
+            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
+            String direction = item.action() == ContextMenuItemTagLeftToRight ? "ltr" : "rtl";
+            style->setProperty(CSSPropertyDirection, direction, false, ec);
+            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
+            shouldEnable = true;
+            break;
+        }
+        case ContextMenuItemTagTextDirectionDefault: {
+            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionNatural");
+            shouldCheck = command.state() == TrueTriState;
+            shouldEnable = command.isEnabled();
+            break;
+        }
+        case ContextMenuItemTagTextDirectionLeftToRight: {
+            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionLeftToRight");
+            shouldCheck = command.state() == TrueTriState;
+            shouldEnable = command.isEnabled();
+            break;
+        }
+        case ContextMenuItemTagTextDirectionRightToLeft: {
+            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionRightToLeft");
+            shouldCheck = command.state() == TrueTriState;
+            shouldEnable = command.isEnabled();
+            break;
+        }
+        case ContextMenuItemTagCopy:
+            shouldEnable = frame->editor()->canDHTMLCopy() || frame->editor()->canCopy();
+            break;
+        case ContextMenuItemTagCut:
+            shouldEnable = frame->editor()->canDHTMLCut() || frame->editor()->canCut();
+            break;
+        case ContextMenuItemTagIgnoreSpelling:
+        case ContextMenuItemTagLearnSpelling:
+            shouldEnable = frame->selection()->isRange();
+            break;
+        case ContextMenuItemTagPaste:
+            shouldEnable = frame->editor()->canDHTMLPaste() || frame->editor()->canPaste();
+            break;
+#if PLATFORM(GTK)
+        case ContextMenuItemTagDelete:
+            shouldEnable = frame->editor()->canDelete();
+            break;
+        case ContextMenuItemTagSelectAll:
+        case ContextMenuItemTagInputMethods:
+        case ContextMenuItemTagUnicode:
+            shouldEnable = true;
+            break;
+#endif
+        case ContextMenuItemTagUnderline: {
+            ExceptionCode ec = 0;
+            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
+            style->setProperty(CSSPropertyWebkitTextDecorationsInEffect, "underline", false, ec);
+            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
+            shouldEnable = frame->editor()->canEditRichly();
+            break;
+        }
+        case ContextMenuItemTagLookUpInDictionary:
+            shouldEnable = frame->selection()->isRange();
+            break;
+        case ContextMenuItemTagCheckGrammarWithSpelling:
+#ifndef BUILDING_ON_TIGER
+            if (frame->editor()->isGrammarCheckingEnabled())
+                shouldCheck = true;
+            shouldEnable = true;
+#endif
+            break;
+        case ContextMenuItemTagItalic: {
+            ExceptionCode ec = 0;
+            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
+            style->setProperty(CSSPropertyFontStyle, "italic", false, ec);
+            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
+            shouldEnable = frame->editor()->canEditRichly();
+            break;
+        }
+        case ContextMenuItemTagBold: {
+            ExceptionCode ec = 0;
+            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
+            style->setProperty(CSSPropertyFontWeight, "bold", false, ec);
+            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
+            shouldEnable = frame->editor()->canEditRichly();
+            break;
+        }
+        case ContextMenuItemTagOutline:
+            shouldEnable = false;
+            break;
+        case ContextMenuItemTagShowSpellingPanel:
+#ifndef BUILDING_ON_TIGER
+            if (frame->editor()->spellingPanelIsShowing())
+                item.setTitle(contextMenuItemTagShowSpellingPanel(false));
+            else
+                item.setTitle(contextMenuItemTagShowSpellingPanel(true));
+#endif
+            shouldEnable = frame->editor()->canEdit();
+            break;
+        case ContextMenuItemTagNoGuessesFound:
+            shouldEnable = false;
+            break;
+        case ContextMenuItemTagCheckSpellingWhileTyping:
+            shouldCheck = frame->editor()->isContinuousSpellCheckingEnabled();
+            break;
+#if PLATFORM(MAC)
+        case ContextMenuItemTagSubstitutionsMenu:
+        case ContextMenuItemTagTransformationsMenu:
+            break;
+        case ContextMenuItemTagShowSubstitutions:
+#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            if (frame->editor()->substitutionsPanelIsShowing())
+                item.setTitle(contextMenuItemTagShowSubstitutions(false));
+            else
+                item.setTitle(contextMenuItemTagShowSubstitutions(true));
+            shouldEnable = frame->editor()->canEdit();
+#endif
+            break;
+        case ContextMenuItemTagMakeUpperCase:
+        case ContextMenuItemTagMakeLowerCase:
+        case ContextMenuItemTagCapitalize:
+        case ContextMenuItemTagChangeBack:
+            shouldEnable = frame->editor()->canEdit();
+            break;
+        case ContextMenuItemTagCorrectSpellingAutomatically:
+#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            shouldCheck = frame->editor()->isAutomaticSpellingCorrectionEnabled();
+#endif
+            break;
+        case ContextMenuItemTagSmartCopyPaste:
+#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            shouldCheck = frame->editor()->smartInsertDeleteEnabled();
+#endif
+            break;
+        case ContextMenuItemTagSmartQuotes:
+#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            shouldCheck = frame->editor()->isAutomaticQuoteSubstitutionEnabled();
+#endif
+            break;
+        case ContextMenuItemTagSmartDashes:
+#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            shouldCheck = frame->editor()->isAutomaticDashSubstitutionEnabled();
+#endif
+            break;
+        case ContextMenuItemTagSmartLinks:
+#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            shouldCheck = frame->editor()->isAutomaticLinkDetectionEnabled();
+#endif
+            break;
+        case ContextMenuItemTagTextReplacement:
+#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+            shouldCheck = frame->editor()->isAutomaticTextReplacementEnabled();
+#endif
+            break;
+        case ContextMenuItemTagStopSpeaking:
+            shouldEnable = client() && client()->isSpeaking();
+            break;
+#else // PLATFORM(MAC) ends here
+        case ContextMenuItemTagStopSpeaking:
+            break;
+#endif
+#if PLATFORM(GTK)
+        case ContextMenuItemTagGoBack:
+            shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(-1);
+            break;
+        case ContextMenuItemTagGoForward:
+            shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(1);
+            break;
+        case ContextMenuItemTagStop:
+            shouldEnable = frame->loader()->documentLoader()->isLoadingInAPISense();
+            break;
+        case ContextMenuItemTagReload:
+            shouldEnable = !frame->loader()->documentLoader()->isLoadingInAPISense();
+            break;
+        case ContextMenuItemTagFontMenu:
+            shouldEnable = frame->editor()->canEditRichly();
+            break;
+#else
+        case ContextMenuItemTagGoBack:
+        case ContextMenuItemTagGoForward:
+        case ContextMenuItemTagStop:
+        case ContextMenuItemTagReload:
+        case ContextMenuItemTagFontMenu:
+#endif
+        case ContextMenuItemTagNoAction:
+        case ContextMenuItemTagOpenLinkInNewWindow:
+        case ContextMenuItemTagDownloadLinkToDisk:
+        case ContextMenuItemTagCopyLinkToClipboard:
+        case ContextMenuItemTagOpenImageInNewWindow:
+        case ContextMenuItemTagDownloadImageToDisk:
+        case ContextMenuItemTagCopyImageToClipboard:
+            break;
+        case ContextMenuItemTagOpenMediaInNewWindow:
+            if (m_hitTestResult.mediaIsVideo())
+                item.setTitle(contextMenuItemTagOpenVideoInNewWindow());
+            else
+                item.setTitle(contextMenuItemTagOpenAudioInNewWindow());
+            break;
+        case ContextMenuItemTagCopyMediaLinkToClipboard:
+            if (m_hitTestResult.mediaIsVideo())
+                item.setTitle(contextMenuItemTagCopyVideoLinkToClipboard());
+            else
+                item.setTitle(contextMenuItemTagCopyAudioLinkToClipboard());
+            break;
+        case ContextMenuItemTagToggleMediaControls:
+            shouldCheck = m_hitTestResult.mediaControlsEnabled();
+            break;
+        case ContextMenuItemTagToggleMediaLoop:
+            shouldCheck = m_hitTestResult.mediaLoopEnabled();
+            break;
+        case ContextMenuItemTagEnterVideoFullscreen:
+            shouldEnable = m_hitTestResult.mediaSupportsFullscreen();
+            break;
+        case ContextMenuItemTagOpenFrameInNewWindow:
+        case ContextMenuItemTagSpellingGuess:
+        case ContextMenuItemTagOther:
+        case ContextMenuItemTagSearchInSpotlight:
+        case ContextMenuItemTagSearchWeb:
+        case ContextMenuItemTagOpenWithDefaultApplication:
+        case ContextMenuItemPDFActualSize:
+        case ContextMenuItemPDFZoomIn:
+        case ContextMenuItemPDFZoomOut:
+        case ContextMenuItemPDFAutoSize:
+        case ContextMenuItemPDFSinglePage:
+        case ContextMenuItemPDFFacingPages:
+        case ContextMenuItemPDFContinuous:
+        case ContextMenuItemPDFNextPage:
+        case ContextMenuItemPDFPreviousPage:
+        case ContextMenuItemTagOpenLink:
+        case ContextMenuItemTagIgnoreGrammar:
+        case ContextMenuItemTagSpellingMenu:
+        case ContextMenuItemTagShowFonts:
+        case ContextMenuItemTagStyles:
+        case ContextMenuItemTagShowColors:
+        case ContextMenuItemTagSpeechMenu:
+        case ContextMenuItemTagStartSpeaking:
+        case ContextMenuItemTagWritingDirectionMenu:
+        case ContextMenuItemTagTextDirectionMenu:
+        case ContextMenuItemTagPDFSinglePageScrolling:
+        case ContextMenuItemTagPDFFacingPagesScrolling:
+#if ENABLE(INSPECTOR)
+        case ContextMenuItemTagInspectElement:
+#endif
+        case ContextMenuItemBaseCustomTag:
+        case ContextMenuItemCustomTagNoAction:
+        case ContextMenuItemLastCustomTag:
+        case ContextMenuItemBaseApplicationTag:
+            break;
+        case ContextMenuItemTagMediaPlayPause:
+            if (m_hitTestResult.mediaPlaying())
+                item.setTitle(contextMenuItemTagMediaPause());
+            else
+                item.setTitle(contextMenuItemTagMediaPlay());
+            break;
+        case ContextMenuItemTagMediaMute:
+            shouldEnable = m_hitTestResult.mediaHasAudio();
+            shouldCheck = shouldEnable &&  m_hitTestResult.mediaMuted();
+            break;
+    }
+
+    item.setChecked(shouldCheck);
+    item.setEnabled(shouldEnable);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(CONTEXT_MENUS)
diff --git a/WebCore/page/ContextMenuController.h b/WebCore/page/ContextMenuController.h
index 833b909..ab92796 100644
--- a/WebCore/page/ContextMenuController.h
+++ b/WebCore/page/ContextMenuController.h
@@ -26,6 +26,7 @@
 #ifndef ContextMenuController_h
 #define ContextMenuController_h
 
+#include "HitTestResult.h"
 #include <wtf/Noncopyable.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassRefPtr.h>
@@ -45,7 +46,7 @@ namespace WebCore {
         ContextMenuController(Page*, ContextMenuClient*);
         ~ContextMenuController();
 
-        ContextMenuClient* client() { return m_client; }
+        ContextMenuClient* client() const { return m_client; }
 
         ContextMenu* contextMenu() const { return m_contextMenu.get(); }
         void clearContextMenu();
@@ -53,16 +54,35 @@ namespace WebCore {
         void handleContextMenuEvent(Event*);
         void showContextMenu(Event*, PassRefPtr<ContextMenuProvider>);
 
+        void populate();
         void contextMenuItemSelected(ContextMenuItem*);
+        void addInspectElementItem();
+
+        void checkOrEnableIfNeeded(ContextMenuItem&) const;
+
+        void setHitTestResult(const HitTestResult& result) { m_hitTestResult = result; }
+        const HitTestResult& hitTestResult() { return m_hitTestResult; }
 
     private:
-        ContextMenu* createContextMenu(Event*);
+        PassOwnPtr<ContextMenu> createContextMenu(Event*);
         void showContextMenu(Event*);
+        
+        void appendItem(ContextMenuItem&, ContextMenu* parentMenu);
+
+        void createAndAppendFontSubMenu(ContextMenuItem&);
+        void createAndAppendSpellingAndGrammarSubMenu(ContextMenuItem&);
+        void createAndAppendSpellingSubMenu(ContextMenuItem&);
+        void createAndAppendSpeechSubMenu(ContextMenuItem& );
+        void createAndAppendWritingDirectionSubMenu(ContextMenuItem&);
+        void createAndAppendTextDirectionSubMenu(ContextMenuItem&);
+        void createAndAppendSubstitutionsSubMenu(ContextMenuItem&);
+        void createAndAppendTransformationsSubMenu(ContextMenuItem&);
 
         Page* m_page;
         ContextMenuClient* m_client;
         OwnPtr<ContextMenu> m_contextMenu;
         RefPtr<ContextMenuProvider> m_menuProvider;
+        HitTestResult m_hitTestResult;
     };
 
 }
diff --git a/WebCore/platform/ContextMenu.cpp b/WebCore/platform/ContextMenu.cpp
deleted file mode 100644
index 93cdfdf..0000000
--- a/WebCore/platform/ContextMenu.cpp
+++ /dev/null
@@ -1,890 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Christian Dywan <christian at imendio.com>
- * Copyright (C) 2010 Igalia S.L
- *
- * 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 COMPUTER, INC. ``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 COMPUTER, INC. OR
- * 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 "config.h"
-#include "ContextMenu.h"
-
-#if ENABLE(CONTEXT_MENUS)
-
-#include "BackForwardController.h"
-#include "ContextMenuController.h"
-#include "ContextMenuClient.h"
-#include "CSSComputedStyleDeclaration.h"
-#include "CSSProperty.h"
-#include "CSSPropertyNames.h"
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "Editor.h"
-#include "Frame.h"
-#include "FrameLoader.h"
-#include "InspectorController.h"
-#include "KURL.h"
-#include "LocalizedStrings.h"
-#include "Node.h"
-#include "Page.h"
-#include "ResourceRequest.h"
-#include "SelectionController.h"
-#include "Settings.h"
-#include "TextIterator.h"
-#include <wtf/text/CString.h>
-
-using namespace std;
-using namespace WTF;
-using namespace Unicode;
-
-namespace WebCore {
-
-ContextMenuController* ContextMenu::controller() const
-{
-    if (Node* node = m_hitTestResult.innerNonSharedNode())
-        if (Frame* frame = node->document()->frame())
-            if (Page* page = frame->page())
-                return page->contextMenuController();
-    return 0;
-}
-
-static PassOwnPtr<ContextMenuItem> separatorItem()
-{
-    return new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String());
-}
-
-static void createAndAppendFontSubMenu(const HitTestResult& result, ContextMenuItem& fontMenuItem)
-{
-    ContextMenu fontMenu(result);
-
-#if PLATFORM(MAC)
-    ContextMenuItem showFonts(ActionType, ContextMenuItemTagShowFonts, contextMenuItemTagShowFonts());
-#endif
-    ContextMenuItem bold(CheckableActionType, ContextMenuItemTagBold, contextMenuItemTagBold());
-    ContextMenuItem italic(CheckableActionType, ContextMenuItemTagItalic, contextMenuItemTagItalic());
-    ContextMenuItem underline(CheckableActionType, ContextMenuItemTagUnderline, contextMenuItemTagUnderline());
-    ContextMenuItem outline(ActionType, ContextMenuItemTagOutline, contextMenuItemTagOutline());
-#if PLATFORM(MAC)
-    ContextMenuItem styles(ActionType, ContextMenuItemTagStyles, contextMenuItemTagStyles());
-    ContextMenuItem showColors(ActionType, ContextMenuItemTagShowColors, contextMenuItemTagShowColors());
-#endif
-
-#if PLATFORM(MAC)
-    fontMenu.appendItem(showFonts);
-#endif
-    fontMenu.appendItem(bold);
-    fontMenu.appendItem(italic);
-    fontMenu.appendItem(underline);
-    fontMenu.appendItem(outline);
-#if PLATFORM(MAC)
-    fontMenu.appendItem(styles);
-    fontMenu.appendItem(*separatorItem());
-    fontMenu.appendItem(showColors);
-#endif
-
-    fontMenuItem.setSubMenu(&fontMenu);
-}
-
-#if !defined(BUILDING_ON_TIGER)
-
-#if !PLATFORM(GTK)
-
-static void createAndAppendSpellingAndGrammarSubMenu(const HitTestResult& result, ContextMenuItem& spellingAndGrammarMenuItem)
-{
-    ContextMenu spellingAndGrammarMenu(result);
-
-    ContextMenuItem showSpellingPanel(ActionType, ContextMenuItemTagShowSpellingPanel, 
-        contextMenuItemTagShowSpellingPanel(true));
-    ContextMenuItem checkSpelling(ActionType, ContextMenuItemTagCheckSpelling, 
-        contextMenuItemTagCheckSpelling());
-    ContextMenuItem checkAsYouType(CheckableActionType, ContextMenuItemTagCheckSpellingWhileTyping, 
-        contextMenuItemTagCheckSpellingWhileTyping());
-    ContextMenuItem grammarWithSpelling(CheckableActionType, ContextMenuItemTagCheckGrammarWithSpelling, 
-        contextMenuItemTagCheckGrammarWithSpelling());
-#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
-    ContextMenuItem correctSpelling(CheckableActionType, ContextMenuItemTagCorrectSpellingAutomatically, 
-        contextMenuItemTagCorrectSpellingAutomatically());
-#endif
-
-    spellingAndGrammarMenu.appendItem(showSpellingPanel);
-    spellingAndGrammarMenu.appendItem(checkSpelling);
-#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
-    spellingAndGrammarMenu.appendItem(*separatorItem());
-#endif
-    spellingAndGrammarMenu.appendItem(checkAsYouType);
-    spellingAndGrammarMenu.appendItem(grammarWithSpelling);
-#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
-    spellingAndGrammarMenu.appendItem(correctSpelling);
-#endif
-
-    spellingAndGrammarMenuItem.setSubMenu(&spellingAndGrammarMenu);
-}
-
-#endif // !PLATFORM(GTK)
-
-#else
-
-static void createAndAppendSpellingSubMenu(const HitTestResult& result, ContextMenuItem& spellingMenuItem)
-{
-    ContextMenu spellingMenu(result);
-
-    ContextMenuItem showSpellingPanel(ActionType, ContextMenuItemTagShowSpellingPanel, 
-        contextMenuItemTagShowSpellingPanel(true));
-    ContextMenuItem checkSpelling(ActionType, ContextMenuItemTagCheckSpelling, 
-        contextMenuItemTagCheckSpelling());
-    ContextMenuItem checkAsYouType(CheckableActionType, ContextMenuItemTagCheckSpellingWhileTyping, 
-        contextMenuItemTagCheckSpellingWhileTyping());
-
-    spellingMenu.appendItem(showSpellingPanel);
-    spellingMenu.appendItem(checkSpelling);
-    spellingMenu.appendItem(checkAsYouType);
-
-    spellingMenuItem.setSubMenu(&spellingMenu);
-}
-
-#endif
-
-#if PLATFORM(MAC)
-
-static void createAndAppendSpeechSubMenu(const HitTestResult& result, ContextMenuItem& speechMenuItem)
-{
-    ContextMenu speechMenu(result);
-
-    ContextMenuItem start(ActionType, ContextMenuItemTagStartSpeaking, contextMenuItemTagStartSpeaking());
-    ContextMenuItem stop(ActionType, ContextMenuItemTagStopSpeaking, contextMenuItemTagStopSpeaking());
-
-    speechMenu.appendItem(start);
-    speechMenu.appendItem(stop);
-
-    speechMenuItem.setSubMenu(&speechMenu);
-}
-
-#endif
- 
-#if !PLATFORM(GTK)
-
-static void createAndAppendWritingDirectionSubMenu(const HitTestResult& result, ContextMenuItem& writingDirectionMenuItem)
-{
-    ContextMenu writingDirectionMenu(result);
-
-    ContextMenuItem defaultItem(ActionType, ContextMenuItemTagDefaultDirection, 
-        contextMenuItemTagDefaultDirection());
-    ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagLeftToRight, contextMenuItemTagLeftToRight());
-    ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagRightToLeft, contextMenuItemTagRightToLeft());
-
-    writingDirectionMenu.appendItem(defaultItem);
-    writingDirectionMenu.appendItem(ltr);
-    writingDirectionMenu.appendItem(rtl);
-
-    writingDirectionMenuItem.setSubMenu(&writingDirectionMenu);
-}
-
-static void createAndAppendTextDirectionSubMenu(const HitTestResult& result, ContextMenuItem& textDirectionMenuItem)
-{
-    ContextMenu textDirectionMenu(result);
-
-    ContextMenuItem defaultItem(ActionType, ContextMenuItemTagTextDirectionDefault, contextMenuItemTagDefaultDirection());
-    ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagTextDirectionLeftToRight, contextMenuItemTagLeftToRight());
-    ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagTextDirectionRightToLeft, contextMenuItemTagRightToLeft());
-
-    textDirectionMenu.appendItem(defaultItem);
-    textDirectionMenu.appendItem(ltr);
-    textDirectionMenu.appendItem(rtl);
-
-    textDirectionMenuItem.setSubMenu(&textDirectionMenu);
-}
-
-#endif
-
-#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-
-static void createAndAppendSubstitutionsSubMenu(const HitTestResult& result, ContextMenuItem& substitutionsMenuItem)
-{
-    ContextMenu substitutionsMenu(result);
-
-    ContextMenuItem showSubstitutions(ActionType, ContextMenuItemTagShowSubstitutions, contextMenuItemTagShowSubstitutions(true));
-    ContextMenuItem smartCopyPaste(CheckableActionType, ContextMenuItemTagSmartCopyPaste, contextMenuItemTagSmartCopyPaste());
-    ContextMenuItem smartQuotes(CheckableActionType, ContextMenuItemTagSmartQuotes, contextMenuItemTagSmartQuotes());
-    ContextMenuItem smartDashes(CheckableActionType, ContextMenuItemTagSmartDashes, contextMenuItemTagSmartDashes());
-    ContextMenuItem smartLinks(CheckableActionType, ContextMenuItemTagSmartLinks, contextMenuItemTagSmartLinks());
-    ContextMenuItem textReplacement(CheckableActionType, ContextMenuItemTagTextReplacement, contextMenuItemTagTextReplacement());
-
-    substitutionsMenu.appendItem(showSubstitutions);
-    substitutionsMenu.appendItem(*separatorItem());
-    substitutionsMenu.appendItem(smartCopyPaste);
-    substitutionsMenu.appendItem(smartQuotes);
-    substitutionsMenu.appendItem(smartDashes);
-    substitutionsMenu.appendItem(smartLinks);
-    substitutionsMenu.appendItem(textReplacement);
-
-    substitutionsMenuItem.setSubMenu(&substitutionsMenu);
-}
-
-static void createAndAppendTransformationsSubMenu(const HitTestResult& result, ContextMenuItem& transformationsMenuItem)
-{
-    ContextMenu transformationsMenu(result);
-
-    ContextMenuItem makeUpperCase(ActionType, ContextMenuItemTagMakeUpperCase, contextMenuItemTagMakeUpperCase());
-    ContextMenuItem makeLowerCase(ActionType, ContextMenuItemTagMakeLowerCase, contextMenuItemTagMakeLowerCase());
-    ContextMenuItem capitalize(ActionType, ContextMenuItemTagCapitalize, contextMenuItemTagCapitalize());
-
-    transformationsMenu.appendItem(makeUpperCase);
-    transformationsMenu.appendItem(makeLowerCase);
-    transformationsMenu.appendItem(capitalize);
-
-    transformationsMenuItem.setSubMenu(&transformationsMenu);
-}
-
-#endif
-
-static bool selectionContainsPossibleWord(Frame* frame)
-{
-    // Current algorithm: look for a character that's not just a separator.
-    for (TextIterator it(frame->selection()->toNormalizedRange().get()); !it.atEnd(); it.advance()) {
-        int length = it.length();
-        const UChar* characters = it.characters();
-        for (int i = 0; i < length; ++i)
-            if (!(category(characters[i]) & (Separator_Space | Separator_Line | Separator_Paragraph)))
-                return true;
-    }
-    return false;
-}
-
-void ContextMenu::populate()
-{
-    ContextMenuItem OpenLinkItem(ActionType, ContextMenuItemTagOpenLink, contextMenuItemTagOpenLink());
-    ContextMenuItem OpenLinkInNewWindowItem(ActionType, ContextMenuItemTagOpenLinkInNewWindow, 
-        contextMenuItemTagOpenLinkInNewWindow());
-    ContextMenuItem DownloadFileItem(ActionType, ContextMenuItemTagDownloadLinkToDisk, 
-        contextMenuItemTagDownloadLinkToDisk());
-    ContextMenuItem CopyLinkItem(ActionType, ContextMenuItemTagCopyLinkToClipboard, 
-        contextMenuItemTagCopyLinkToClipboard());
-    ContextMenuItem OpenImageInNewWindowItem(ActionType, ContextMenuItemTagOpenImageInNewWindow, 
-        contextMenuItemTagOpenImageInNewWindow());
-    ContextMenuItem DownloadImageItem(ActionType, ContextMenuItemTagDownloadImageToDisk, 
-        contextMenuItemTagDownloadImageToDisk());
-    ContextMenuItem CopyImageItem(ActionType, ContextMenuItemTagCopyImageToClipboard, 
-        contextMenuItemTagCopyImageToClipboard());
-    ContextMenuItem OpenMediaInNewWindowItem(ActionType, ContextMenuItemTagOpenMediaInNewWindow, String());
-    ContextMenuItem CopyMediaLinkItem(ActionType, ContextMenuItemTagCopyMediaLinkToClipboard, 
-        String());
-    ContextMenuItem MediaPlayPause(ActionType, ContextMenuItemTagMediaPlayPause, 
-        contextMenuItemTagMediaPlay());
-    ContextMenuItem MediaMute(ActionType, ContextMenuItemTagMediaMute, 
-        contextMenuItemTagMediaMute());
-    ContextMenuItem ToggleMediaControls(CheckableActionType, ContextMenuItemTagToggleMediaControls, 
-        contextMenuItemTagToggleMediaControls());
-    ContextMenuItem ToggleMediaLoop(CheckableActionType, ContextMenuItemTagToggleMediaLoop, 
-        contextMenuItemTagToggleMediaLoop());
-    ContextMenuItem EnterVideoFullscreen(ActionType, ContextMenuItemTagEnterVideoFullscreen, 
-        contextMenuItemTagEnterVideoFullscreen());
-#if PLATFORM(MAC)
-    ContextMenuItem SearchSpotlightItem(ActionType, ContextMenuItemTagSearchInSpotlight, 
-        contextMenuItemTagSearchInSpotlight());
-    ContextMenuItem LookInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, 
-        contextMenuItemTagLookUpInDictionary());
-#endif
-#if !PLATFORM(GTK)
-    ContextMenuItem SearchWebItem(ActionType, ContextMenuItemTagSearchWeb, contextMenuItemTagSearchWeb());
-#endif
-    ContextMenuItem CopyItem(ActionType, ContextMenuItemTagCopy, contextMenuItemTagCopy());
-    ContextMenuItem BackItem(ActionType, ContextMenuItemTagGoBack, contextMenuItemTagGoBack());
-    ContextMenuItem ForwardItem(ActionType, ContextMenuItemTagGoForward,  contextMenuItemTagGoForward());
-    ContextMenuItem StopItem(ActionType, ContextMenuItemTagStop, contextMenuItemTagStop());
-    ContextMenuItem ReloadItem(ActionType, ContextMenuItemTagReload, contextMenuItemTagReload());
-    ContextMenuItem OpenFrameItem(ActionType, ContextMenuItemTagOpenFrameInNewWindow, 
-        contextMenuItemTagOpenFrameInNewWindow());
-    ContextMenuItem NoGuessesItem(ActionType, ContextMenuItemTagNoGuessesFound, 
-        contextMenuItemTagNoGuessesFound());
-    ContextMenuItem IgnoreSpellingItem(ActionType, ContextMenuItemTagIgnoreSpelling, 
-        contextMenuItemTagIgnoreSpelling());
-    ContextMenuItem LearnSpellingItem(ActionType, ContextMenuItemTagLearnSpelling, 
-        contextMenuItemTagLearnSpelling());
-    ContextMenuItem IgnoreGrammarItem(ActionType, ContextMenuItemTagIgnoreGrammar, 
-        contextMenuItemTagIgnoreGrammar());
-    ContextMenuItem CutItem(ActionType, ContextMenuItemTagCut, contextMenuItemTagCut());
-    ContextMenuItem PasteItem(ActionType, ContextMenuItemTagPaste, contextMenuItemTagPaste());
-#if PLATFORM(GTK)
-    ContextMenuItem DeleteItem(ActionType, ContextMenuItemTagDelete, contextMenuItemTagDelete());
-    ContextMenuItem SelectAllItem(ActionType, ContextMenuItemTagSelectAll, contextMenuItemTagSelectAll());
-#endif
-    
-    HitTestResult result = hitTestResult();
-    
-    Node* node = m_hitTestResult.innerNonSharedNode();
-    if (!node)
-        return;
-#if PLATFORM(GTK)
-    if (!result.isContentEditable() && (node->isElementNode() && static_cast<Element*>(node)->isFormControlElement()))
-        return;
-#endif
-    Frame* frame = node->document()->frame();
-    if (!frame)
-        return;
-
-    if (!result.isContentEditable()) {
-        FrameLoader* loader = frame->loader();
-        KURL linkURL = result.absoluteLinkURL();
-        if (!linkURL.isEmpty()) {
-            if (loader->canHandleRequest(ResourceRequest(linkURL))) {
-                appendItem(OpenLinkItem);
-                appendItem(OpenLinkInNewWindowItem);
-                appendItem(DownloadFileItem);
-            }
-            appendItem(CopyLinkItem);
-        }
-
-        KURL imageURL = result.absoluteImageURL();
-        if (!imageURL.isEmpty()) {
-            if (!linkURL.isEmpty())
-                appendItem(*separatorItem());
-
-            appendItem(OpenImageInNewWindowItem);
-            appendItem(DownloadImageItem);
-            if (imageURL.isLocalFile() || m_hitTestResult.image())
-                appendItem(CopyImageItem);
-        }
-
-        KURL mediaURL = result.absoluteMediaURL();
-        if (!mediaURL.isEmpty()) {
-            if (!linkURL.isEmpty() || !imageURL.isEmpty())
-                appendItem(*separatorItem());
-
-            appendItem(MediaPlayPause);
-            appendItem(MediaMute);
-            appendItem(ToggleMediaControls);
-            appendItem(ToggleMediaLoop);
-            appendItem(EnterVideoFullscreen);
-
-            appendItem(*separatorItem());
-            appendItem(CopyMediaLinkItem);
-            appendItem(OpenMediaInNewWindowItem);
-        }
-
-        if (imageURL.isEmpty() && linkURL.isEmpty() && mediaURL.isEmpty()) {
-            if (result.isSelected()) {
-                if (selectionContainsPossibleWord(frame)) {
-#if PLATFORM(MAC)
-                    appendItem(SearchSpotlightItem);
-#endif
-#if !PLATFORM(GTK)
-                    appendItem(SearchWebItem);
-                    appendItem(*separatorItem());
-#endif
-#if PLATFORM(MAC)
-                    appendItem(LookInDictionaryItem);
-                    appendItem(*separatorItem());
-#endif
-                }
-                appendItem(CopyItem);
-#if PLATFORM(MAC)
-                appendItem(*separatorItem());
-                ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu());
-                createAndAppendSpeechSubMenu(m_hitTestResult, SpeechMenuItem);
-                appendItem(SpeechMenuItem);
-#endif                
-            } else {
-#if ENABLE(INSPECTOR)
-                if (!(frame->page() && frame->page()->inspectorController()->hasInspectorFrontendClient())) {
-#endif
-                if (frame->page() && frame->page()->backForward()->canGoBackOrForward(-1))
-                    appendItem(BackItem);
-
-                if (frame->page() && frame->page()->backForward()->canGoBackOrForward(1))
-                    appendItem(ForwardItem);
-
-                // use isLoadingInAPISense rather than isLoading because Stop/Reload are
-                // intended to match WebKit's API, not WebCore's internal notion of loading status
-                if (loader->documentLoader()->isLoadingInAPISense())
-                    appendItem(StopItem);
-                else
-                    appendItem(ReloadItem);
-#if ENABLE(INSPECTOR)
-                }
-#endif
-
-                if (frame->page() && frame != frame->page()->mainFrame())
-                    appendItem(OpenFrameItem);
-            }
-        }
-    } else { // Make an editing context menu
-        SelectionController* selection = frame->selection();
-        bool inPasswordField = selection->isInPasswordField();
-        bool spellCheckingEnabled = frame->editor()->isSpellCheckingEnabledFor(node);
-        
-        if (!inPasswordField && spellCheckingEnabled) {
-            // Consider adding spelling-related or grammar-related context menu items (never both, since a single selected range
-            // is never considered a misspelling and bad grammar at the same time)
-            bool misspelling;
-            bool badGrammar;
-            Vector<String> guesses = frame->editor()->guessesForMisspelledOrUngrammaticalSelection(misspelling, badGrammar);
-            if (misspelling || badGrammar) {
-                size_t size = guesses.size();
-                if (size == 0) {
-                    // If there's bad grammar but no suggestions (e.g., repeated word), just leave off the suggestions
-                    // list and trailing separator rather than adding a "No Guesses Found" item (matches AppKit)
-                    if (misspelling) {
-                        appendItem(NoGuessesItem);
-                        appendItem(*separatorItem());
-                    }
-                } else {
-                    for (unsigned i = 0; i < size; i++) {
-                        const String &guess = guesses[i];
-                        if (!guess.isEmpty()) {
-                            ContextMenuItem item(ActionType, ContextMenuItemTagSpellingGuess, guess);
-                            appendItem(item);
-                        }
-                    }
-                    appendItem(*separatorItem());                    
-                }
-                
-                if (misspelling) {
-                    appendItem(IgnoreSpellingItem);
-                    appendItem(LearnSpellingItem);
-                } else
-                    appendItem(IgnoreGrammarItem);
-                appendItem(*separatorItem());
-#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            } else {
-                // If the string was autocorrected, generate a contextual menu item allowing it to be changed back.
-                String replacedString = result.replacedString();
-                if (!replacedString.isEmpty()) {
-                    ContextMenuItem item(ActionType, ContextMenuItemTagChangeBack, contextMenuItemTagChangeBack(replacedString));
-                    appendItem(item);
-                    appendItem(*separatorItem());
-                }
-#endif
-            }
-        }
-
-        FrameLoader* loader = frame->loader();
-        KURL linkURL = result.absoluteLinkURL();
-        if (!linkURL.isEmpty()) {
-            if (loader->canHandleRequest(ResourceRequest(linkURL))) {
-                appendItem(OpenLinkItem);
-                appendItem(OpenLinkInNewWindowItem);
-                appendItem(DownloadFileItem);
-            }
-            appendItem(CopyLinkItem);
-            appendItem(*separatorItem());
-        }
-
-        if (result.isSelected() && !inPasswordField && selectionContainsPossibleWord(frame)) {
-#if PLATFORM(MAC)
-            appendItem(SearchSpotlightItem);
-#endif
-#if !PLATFORM(GTK)
-            appendItem(SearchWebItem);
-            appendItem(*separatorItem());
-#endif
-     
-#if PLATFORM(MAC)
-            appendItem(LookInDictionaryItem);
-            appendItem(*separatorItem());
-#endif
-        }
-
-        appendItem(CutItem);
-        appendItem(CopyItem);
-        appendItem(PasteItem);
-#if PLATFORM(GTK)
-        appendItem(DeleteItem);
-        appendItem(*separatorItem());
-        appendItem(SelectAllItem);
-#endif
-
-        if (!inPasswordField) {
-            appendItem(*separatorItem());
-#ifndef BUILDING_ON_TIGER
-#if !PLATFORM(GTK)
-            ContextMenuItem SpellingAndGrammarMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu, 
-                contextMenuItemTagSpellingMenu());
-            createAndAppendSpellingAndGrammarSubMenu(m_hitTestResult, SpellingAndGrammarMenuItem);
-            appendItem(SpellingAndGrammarMenuItem);
-#endif
-#else
-            ContextMenuItem SpellingMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu, 
-                contextMenuItemTagSpellingMenu());
-            createAndAppendSpellingSubMenu(m_hitTestResult, SpellingMenuItem);
-            appendItem(SpellingMenuItem);
-#endif
-#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            ContextMenuItem substitutionsMenuItem(SubmenuType, ContextMenuItemTagSubstitutionsMenu, 
-                contextMenuItemTagSubstitutionsMenu());
-            createAndAppendSubstitutionsSubMenu(m_hitTestResult, substitutionsMenuItem);
-            appendItem(substitutionsMenuItem);
-            ContextMenuItem transformationsMenuItem(SubmenuType, ContextMenuItemTagTransformationsMenu, 
-                contextMenuItemTagTransformationsMenu());
-            createAndAppendTransformationsSubMenu(m_hitTestResult, transformationsMenuItem);
-            appendItem(transformationsMenuItem);
-#endif
-#if PLATFORM(GTK)
-            bool shouldShowFontMenu = frame->editor()->canEditRichly();
-#else
-            bool shouldShowFontMenu = true;
-#endif
-            if (shouldShowFontMenu) {
-                ContextMenuItem FontMenuItem(SubmenuType, ContextMenuItemTagFontMenu, 
-                    contextMenuItemTagFontMenu());
-                createAndAppendFontSubMenu(m_hitTestResult, FontMenuItem);
-                appendItem(FontMenuItem);
-            }
-#if PLATFORM(MAC)
-            ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu());
-            createAndAppendSpeechSubMenu(m_hitTestResult, SpeechMenuItem);
-            appendItem(SpeechMenuItem);
-#endif
-#if !PLATFORM(GTK)
-            ContextMenuItem WritingDirectionMenuItem(SubmenuType, ContextMenuItemTagWritingDirectionMenu, 
-                contextMenuItemTagWritingDirectionMenu());
-            createAndAppendWritingDirectionSubMenu(m_hitTestResult, WritingDirectionMenuItem);
-            appendItem(WritingDirectionMenuItem);
-            if (Page* page = frame->page()) {
-                if (Settings* settings = page->settings()) {
-                    bool includeTextDirectionSubmenu = settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAlwaysIncluded
-                        || (settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAutomaticallyIncluded && frame->editor()->hasBidiSelection());
-                    if (includeTextDirectionSubmenu) {
-                        ContextMenuItem TextDirectionMenuItem(SubmenuType, ContextMenuItemTagTextDirectionMenu, 
-                            contextMenuItemTagTextDirectionMenu());
-                        createAndAppendTextDirectionSubMenu(m_hitTestResult, TextDirectionMenuItem);
-                        appendItem(TextDirectionMenuItem);
-                    }
-                }
-            }
-#endif
-        }
-    }
-}
-
-#if ENABLE(INSPECTOR)
-void ContextMenu::addInspectElementItem()
-{
-    Node* node = m_hitTestResult.innerNonSharedNode();
-    if (!node)
-        return;
-
-    Frame* frame = node->document()->frame();
-    if (!frame)
-        return;
-
-    Page* page = frame->page();
-    if (!page)
-        return;
-
-    if (!page->inspectorController())
-        return;
-
-    ContextMenuItem InspectElementItem(ActionType, ContextMenuItemTagInspectElement, contextMenuItemTagInspectElement());
-    appendItem(*separatorItem());
-    appendItem(InspectElementItem);
-}
-#endif // ENABLE(INSPECTOR)
-
-void ContextMenu::checkOrEnableIfNeeded(ContextMenuItem& item) const
-{
-    if (item.type() == SeparatorType)
-        return;
-    
-    Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame();
-    if (!frame)
-        return;
-
-    // Custom items already have proper checked and enabled values.
-    if (ContextMenuItemBaseCustomTag <= item.action() && item.action() <= ContextMenuItemLastCustomTag)
-        return;
-
-    bool shouldEnable = true;
-    bool shouldCheck = false; 
-
-    switch (item.action()) {
-        case ContextMenuItemTagCheckSpelling:
-            shouldEnable = frame->editor()->canEdit();
-            break;
-        case ContextMenuItemTagDefaultDirection:
-            shouldCheck = false;
-            shouldEnable = false;
-            break;
-        case ContextMenuItemTagLeftToRight:
-        case ContextMenuItemTagRightToLeft: {
-            ExceptionCode ec = 0;
-            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
-            String direction = item.action() == ContextMenuItemTagLeftToRight ? "ltr" : "rtl";
-            style->setProperty(CSSPropertyDirection, direction, false, ec);
-            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
-            shouldEnable = true;
-            break;
-        }
-        case ContextMenuItemTagTextDirectionDefault: {
-            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionNatural");
-            shouldCheck = command.state() == TrueTriState;
-            shouldEnable = command.isEnabled();
-            break;
-        }
-        case ContextMenuItemTagTextDirectionLeftToRight: {
-            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionLeftToRight");
-            shouldCheck = command.state() == TrueTriState;
-            shouldEnable = command.isEnabled();
-            break;
-        }
-        case ContextMenuItemTagTextDirectionRightToLeft: {
-            Editor::Command command = frame->editor()->command("MakeTextWritingDirectionRightToLeft");
-            shouldCheck = command.state() == TrueTriState;
-            shouldEnable = command.isEnabled();
-            break;
-        }
-        case ContextMenuItemTagCopy:
-            shouldEnable = frame->editor()->canDHTMLCopy() || frame->editor()->canCopy();
-            break;
-        case ContextMenuItemTagCut:
-            shouldEnable = frame->editor()->canDHTMLCut() || frame->editor()->canCut();
-            break;
-        case ContextMenuItemTagIgnoreSpelling:
-        case ContextMenuItemTagLearnSpelling:
-            shouldEnable = frame->selection()->isRange();
-            break;
-        case ContextMenuItemTagPaste:
-            shouldEnable = frame->editor()->canDHTMLPaste() || frame->editor()->canPaste();
-            break;
-#if PLATFORM(GTK)
-        case ContextMenuItemTagDelete:
-            shouldEnable = frame->editor()->canDelete();
-            break;
-        case ContextMenuItemTagSelectAll:
-        case ContextMenuItemTagInputMethods:
-        case ContextMenuItemTagUnicode:
-            shouldEnable = true;
-            break;
-#endif
-        case ContextMenuItemTagUnderline: {
-            ExceptionCode ec = 0;
-            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
-            style->setProperty(CSSPropertyWebkitTextDecorationsInEffect, "underline", false, ec);
-            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
-            shouldEnable = frame->editor()->canEditRichly();
-            break;
-        }
-        case ContextMenuItemTagLookUpInDictionary:
-            shouldEnable = frame->selection()->isRange();
-            break;
-        case ContextMenuItemTagCheckGrammarWithSpelling:
-#ifndef BUILDING_ON_TIGER
-            if (frame->editor()->isGrammarCheckingEnabled())
-                shouldCheck = true;
-            shouldEnable = true;
-#endif
-            break;
-        case ContextMenuItemTagItalic: {
-            ExceptionCode ec = 0;
-            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
-            style->setProperty(CSSPropertyFontStyle, "italic", false, ec);
-            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
-            shouldEnable = frame->editor()->canEditRichly();
-            break;
-        }
-        case ContextMenuItemTagBold: {
-            ExceptionCode ec = 0;
-            RefPtr<CSSStyleDeclaration> style = frame->document()->createCSSStyleDeclaration();
-            style->setProperty(CSSPropertyFontWeight, "bold", false, ec);
-            shouldCheck = frame->editor()->selectionHasStyle(style.get()) != FalseTriState;
-            shouldEnable = frame->editor()->canEditRichly();
-            break;
-        }
-        case ContextMenuItemTagOutline:
-            shouldEnable = false;
-            break;
-        case ContextMenuItemTagShowSpellingPanel:
-#ifndef BUILDING_ON_TIGER
-            if (frame->editor()->spellingPanelIsShowing())
-                item.setTitle(contextMenuItemTagShowSpellingPanel(false));
-            else
-                item.setTitle(contextMenuItemTagShowSpellingPanel(true));
-#endif
-            shouldEnable = frame->editor()->canEdit();
-            break;
-        case ContextMenuItemTagNoGuessesFound:
-            shouldEnable = false;
-            break;
-        case ContextMenuItemTagCheckSpellingWhileTyping:
-            shouldCheck = frame->editor()->isContinuousSpellCheckingEnabled();
-            break;
-#if PLATFORM(MAC)
-        case ContextMenuItemTagSubstitutionsMenu:
-        case ContextMenuItemTagTransformationsMenu:
-            break;
-        case ContextMenuItemTagShowSubstitutions:
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            if (frame->editor()->substitutionsPanelIsShowing())
-                item.setTitle(contextMenuItemTagShowSubstitutions(false));
-            else
-                item.setTitle(contextMenuItemTagShowSubstitutions(true));
-            shouldEnable = frame->editor()->canEdit();
-#endif
-            break;
-        case ContextMenuItemTagMakeUpperCase:
-        case ContextMenuItemTagMakeLowerCase:
-        case ContextMenuItemTagCapitalize:
-        case ContextMenuItemTagChangeBack:
-            shouldEnable = frame->editor()->canEdit();
-            break;
-        case ContextMenuItemTagCorrectSpellingAutomatically:
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            shouldCheck = frame->editor()->isAutomaticSpellingCorrectionEnabled();
-#endif
-            break;
-        case ContextMenuItemTagSmartCopyPaste:
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            shouldCheck = frame->editor()->smartInsertDeleteEnabled();
-#endif
-            break;
-        case ContextMenuItemTagSmartQuotes:
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            shouldCheck = frame->editor()->isAutomaticQuoteSubstitutionEnabled();
-#endif
-            break;
-        case ContextMenuItemTagSmartDashes:
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            shouldCheck = frame->editor()->isAutomaticDashSubstitutionEnabled();
-#endif
-            break;
-        case ContextMenuItemTagSmartLinks:
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            shouldCheck = frame->editor()->isAutomaticLinkDetectionEnabled();
-#endif
-            break;
-        case ContextMenuItemTagTextReplacement:
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
-            shouldCheck = frame->editor()->isAutomaticTextReplacementEnabled();
-#endif
-            break;
-        case ContextMenuItemTagStopSpeaking:
-            shouldEnable = controller() && controller()->client() && controller()->client()->isSpeaking();
-            break;
-#else // PLATFORM(MAC) ends here
-        case ContextMenuItemTagStopSpeaking:
-            break;
-#endif
-#if PLATFORM(GTK)
-        case ContextMenuItemTagGoBack:
-            shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(-1);
-            break;
-        case ContextMenuItemTagGoForward:
-            shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(1);
-            break;
-        case ContextMenuItemTagStop:
-            shouldEnable = frame->loader()->documentLoader()->isLoadingInAPISense();
-            break;
-        case ContextMenuItemTagReload:
-            shouldEnable = !frame->loader()->documentLoader()->isLoadingInAPISense();
-            break;
-        case ContextMenuItemTagFontMenu:
-            shouldEnable = frame->editor()->canEditRichly();
-            break;
-#else
-        case ContextMenuItemTagGoBack:
-        case ContextMenuItemTagGoForward:
-        case ContextMenuItemTagStop:
-        case ContextMenuItemTagReload:
-        case ContextMenuItemTagFontMenu:
-#endif
-        case ContextMenuItemTagNoAction:
-        case ContextMenuItemTagOpenLinkInNewWindow:
-        case ContextMenuItemTagDownloadLinkToDisk:
-        case ContextMenuItemTagCopyLinkToClipboard:
-        case ContextMenuItemTagOpenImageInNewWindow:
-        case ContextMenuItemTagDownloadImageToDisk:
-        case ContextMenuItemTagCopyImageToClipboard:
-            break;
-        case ContextMenuItemTagOpenMediaInNewWindow:
-            if (m_hitTestResult.mediaIsVideo())
-                item.setTitle(contextMenuItemTagOpenVideoInNewWindow());
-            else
-                item.setTitle(contextMenuItemTagOpenAudioInNewWindow());
-            break;
-        case ContextMenuItemTagCopyMediaLinkToClipboard:
-            if (m_hitTestResult.mediaIsVideo())
-                item.setTitle(contextMenuItemTagCopyVideoLinkToClipboard());
-            else
-                item.setTitle(contextMenuItemTagCopyAudioLinkToClipboard());
-            break;
-        case ContextMenuItemTagToggleMediaControls:
-            shouldCheck = m_hitTestResult.mediaControlsEnabled();
-            break;
-        case ContextMenuItemTagToggleMediaLoop:
-            shouldCheck = m_hitTestResult.mediaLoopEnabled();
-            break;
-        case ContextMenuItemTagEnterVideoFullscreen:
-            shouldEnable = m_hitTestResult.mediaSupportsFullscreen();
-            break;
-        case ContextMenuItemTagOpenFrameInNewWindow:
-        case ContextMenuItemTagSpellingGuess:
-        case ContextMenuItemTagOther:
-        case ContextMenuItemTagSearchInSpotlight:
-        case ContextMenuItemTagSearchWeb:
-        case ContextMenuItemTagOpenWithDefaultApplication:
-        case ContextMenuItemPDFActualSize:
-        case ContextMenuItemPDFZoomIn:
-        case ContextMenuItemPDFZoomOut:
-        case ContextMenuItemPDFAutoSize:
-        case ContextMenuItemPDFSinglePage:
-        case ContextMenuItemPDFFacingPages:
-        case ContextMenuItemPDFContinuous:
-        case ContextMenuItemPDFNextPage:
-        case ContextMenuItemPDFPreviousPage:
-        case ContextMenuItemTagOpenLink:
-        case ContextMenuItemTagIgnoreGrammar:
-        case ContextMenuItemTagSpellingMenu:
-        case ContextMenuItemTagShowFonts:
-        case ContextMenuItemTagStyles:
-        case ContextMenuItemTagShowColors:
-        case ContextMenuItemTagSpeechMenu:
-        case ContextMenuItemTagStartSpeaking:
-        case ContextMenuItemTagWritingDirectionMenu:
-        case ContextMenuItemTagTextDirectionMenu:
-        case ContextMenuItemTagPDFSinglePageScrolling:
-        case ContextMenuItemTagPDFFacingPagesScrolling:
-#if ENABLE(INSPECTOR)
-        case ContextMenuItemTagInspectElement:
-#endif
-        case ContextMenuItemBaseCustomTag:
-        case ContextMenuItemCustomTagNoAction:
-        case ContextMenuItemLastCustomTag:
-        case ContextMenuItemBaseApplicationTag:
-            break;
-        case ContextMenuItemTagMediaPlayPause:
-            if (m_hitTestResult.mediaPlaying())
-                item.setTitle(contextMenuItemTagMediaPause());
-            else
-                item.setTitle(contextMenuItemTagMediaPlay());
-            break;
-        case ContextMenuItemTagMediaMute:
-            shouldEnable = m_hitTestResult.mediaHasAudio();
-            shouldCheck = shouldEnable &&  m_hitTestResult.mediaMuted();
-            break;
-    }
-
-    item.setChecked(shouldCheck);
-    item.setEnabled(shouldEnable);
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(CONTEXT_MENUS)
diff --git a/WebCore/platform/ContextMenu.h b/WebCore/platform/ContextMenu.h
index 5321ed6..3393eab 100644
--- a/WebCore/platform/ContextMenu.h
+++ b/WebCore/platform/ContextMenu.h
@@ -29,7 +29,6 @@
 #include <wtf/Noncopyable.h>
 
 #include "ContextMenuItem.h"
-#include "HitTestResult.h"
 #include "PlatformMenuDescription.h"
 #include "PlatformString.h"
 #if PLATFORM(MAC)
@@ -48,14 +47,10 @@ namespace WebCore {
     class ContextMenu : public Noncopyable
     {
     public:
-        ContextMenu(const HitTestResult&);
-        ContextMenu(const HitTestResult&, const PlatformMenuDescription);
+        ContextMenu();
+        ContextMenu(const PlatformMenuDescription);
         ~ContextMenu();
 
-        void populate();
-        void addInspectElementItem();
-        void checkOrEnableIfNeeded(ContextMenuItem&) const;
-
         void insertItem(unsigned position, ContextMenuItem&);
         void appendItem(ContextMenuItem&);
         
@@ -64,9 +59,6 @@ namespace WebCore {
 
         unsigned itemCount() const;
 
-        HitTestResult hitTestResult() const { return m_hitTestResult; }
-        ContextMenuController* controller() const;
-
         PlatformMenuDescription platformDescription() const;
         void setPlatformDescription(PlatformMenuDescription);
 
@@ -75,7 +67,6 @@ namespace WebCore {
         static ContextMenuItem* itemWithId(int);
 #endif
     private:
-        HitTestResult m_hitTestResult;
 #if PLATFORM(MAC)
         // Keep this in sync with the PlatformMenuDescription typedef
         RetainPtr<NSMutableArray> m_platformDescription;
diff --git a/WebCore/platform/android/TemporaryLinkStubs.cpp b/WebCore/platform/android/TemporaryLinkStubs.cpp
index 5ae1b52..a88ab47 100644
--- a/WebCore/platform/android/TemporaryLinkStubs.cpp
+++ b/WebCore/platform/android/TemporaryLinkStubs.cpp
@@ -167,7 +167,7 @@ Pasteboard::~Pasteboard()
 }
 
 
-ContextMenu::ContextMenu(const HitTestResult& result) : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
     ASSERT_NOT_REACHED();
     notImplemented();
diff --git a/WebCore/platform/brew/ContextMenuBrew.cpp b/WebCore/platform/brew/ContextMenuBrew.cpp
index 924e9dd..56ac351 100644
--- a/WebCore/platform/brew/ContextMenuBrew.cpp
+++ b/WebCore/platform/brew/ContextMenuBrew.cpp
@@ -32,15 +32,13 @@
 
 namespace WebCore {
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
     ASSERT_NOT_REACHED();
     notImplemented();
 }
 
-ContextMenu::ContextMenu(const HitTestResult& result, const PlatformMenuDescription menu)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu(const PlatformMenuDescription menu)
 {
     ASSERT_NOT_REACHED();
     notImplemented();
diff --git a/WebCore/platform/chromium/ContextMenuChromium.cpp b/WebCore/platform/chromium/ContextMenuChromium.cpp
index 93c0ec4..9bddd28 100644
--- a/WebCore/platform/chromium/ContextMenuChromium.cpp
+++ b/WebCore/platform/chromium/ContextMenuChromium.cpp
@@ -36,13 +36,11 @@ namespace WebCore {
 // This is a stub implementation of WebKit's ContextMenu class that does
 // nothing.
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
 }
 
-ContextMenu::ContextMenu(const HitTestResult& result, const PlatformMenuDescription menu)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu(const PlatformMenuDescription menu)
 {
 }
 
diff --git a/WebCore/platform/efl/ContextMenuEfl.cpp b/WebCore/platform/efl/ContextMenuEfl.cpp
index 8d85608..b89e8e6 100644
--- a/WebCore/platform/efl/ContextMenuEfl.cpp
+++ b/WebCore/platform/efl/ContextMenuEfl.cpp
@@ -29,30 +29,25 @@
 
 namespace WebCore {
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
-    m_contextMenuClient = static_cast<ContextMenuClientEfl*>(controller()->client());
-    m_platformDescription = m_contextMenuClient->createPlatformDescription(this);
+    m_platformDescription = (PlatformMenuDescription) ewk_context_menu_new(m_view, menu->controller());
 }
 
-ContextMenu::ContextMenu(const HitTestResult& result, const PlatformMenuDescription menu)
-    : m_hitTestResult(result)
-    , m_platformDescription(menu)
+ContextMenu::ContextMenu(const PlatformMenuDescription menu)
+    : m_platformDescription(menu)
 {
-    m_contextMenuClient = static_cast<ContextMenuClientEfl*>(controller()->client());
 }
 
 ContextMenu::~ContextMenu()
 {
     if (m_platformDescription)
-        m_contextMenuClient->freePlatformDescription(m_platformDescription);
+        ewk_context_menu_free(static_cast<Ewk_Context_Menu*>(m_platformDescription));
 }
 
 void ContextMenu::appendItem(ContextMenuItem& item)
 {
-    checkOrEnableIfNeeded(item);
-    m_contextMenuClient->appendItem(m_platformDescription, item);
+    ewk_context_menu_item_append(static_cast<Ewk_Context_Menu*>(m_platformDescription), item);
 }
 
 void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
@@ -60,7 +55,7 @@ void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
     ASSERT(!m_platformDescription);
 
     m_platformDescription = menu;
-    m_contextMenuClient->show(m_platformDescription);
+    ewk_context_menu_show(static_cast<Ewk_Context_Menu*>(m_platformDescription));
 }
 
 PlatformMenuDescription ContextMenu::platformDescription() const
diff --git a/WebCore/platform/efl/ContextMenuItemEfl.cpp b/WebCore/platform/efl/ContextMenuItemEfl.cpp
index efa743f..493c1dc 100644
--- a/WebCore/platform/efl/ContextMenuItemEfl.cpp
+++ b/WebCore/platform/efl/ContextMenuItemEfl.cpp
@@ -116,8 +116,7 @@ void ContextMenuItem::setSubMenu(ContextMenu* subMenu)
         return;
 
     m_platformDescription.type = SubmenuType;
-    m_platformDescription.subMenu = new ContextMenu(subMenu->hitTestResult(),
-            subMenu->releasePlatformDescription());
+    m_platformDescription.subMenu = new ContextMenu(subMenu->releasePlatformDescription());
 }
 
 bool ContextMenuItem::checked() const
diff --git a/WebCore/platform/gtk/ContextMenuGtk.cpp b/WebCore/platform/gtk/ContextMenuGtk.cpp
index 31449bc..327167e 100644
--- a/WebCore/platform/gtk/ContextMenuGtk.cpp
+++ b/WebCore/platform/gtk/ContextMenuGtk.cpp
@@ -23,8 +23,7 @@
 
 namespace WebCore {
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
     m_platformDescription = GTK_MENU(gtk_menu_new());
 
@@ -40,7 +39,6 @@ ContextMenu::~ContextMenu()
 void ContextMenu::appendItem(ContextMenuItem& item)
 {
     ASSERT(m_platformDescription);
-    checkOrEnableIfNeeded(item);
 
     GtkMenuItem* platformItem = ContextMenuItem::createNativeMenuItem(item.releasePlatformDescription());
     ASSERT(platformItem);
diff --git a/WebCore/platform/haiku/ContextMenuHaiku.cpp b/WebCore/platform/haiku/ContextMenuHaiku.cpp
index b978433..aaff99b 100644
--- a/WebCore/platform/haiku/ContextMenuHaiku.cpp
+++ b/WebCore/platform/haiku/ContextMenuHaiku.cpp
@@ -75,9 +75,8 @@ private:
     int m_result;
 };
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
-    , m_platformDescription(new BMenu("context_menu"))
+ContextMenu::ContextMenu()
+    : m_platformDescription(new BMenu("context_menu"))
 {
 }
 
@@ -88,8 +87,6 @@ ContextMenu::~ContextMenu()
 
 void ContextMenu::appendItem(ContextMenuItem& item)
 {
-    checkOrEnableIfNeeded(item);
-
     BMenuItem* menuItem = item.releasePlatformDescription();
     if (menuItem)
         m_platformDescription->AddItem(menuItem);
@@ -102,8 +99,6 @@ unsigned ContextMenu::itemCount() const
 
 void ContextMenu::insertItem(unsigned position, ContextMenuItem& item)
 {
-    checkOrEnableIfNeeded(item);
-
     BMenuItem* menuItem = item.releasePlatformDescription();
     if (menuItem)
         m_platformDescription->AddItem(menuItem, position);
diff --git a/WebCore/platform/mac/ContextMenuMac.mm b/WebCore/platform/mac/ContextMenuMac.mm
index a3c0653..c9451b9 100644
--- a/WebCore/platform/mac/ContextMenuMac.mm
+++ b/WebCore/platform/mac/ContextMenuMac.mm
@@ -30,17 +30,15 @@
 
 namespace WebCore {
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
     NSMutableArray* array = [[NSMutableArray alloc] init];
     m_platformDescription = array;
     [array release];
 }
 
-ContextMenu::ContextMenu(const HitTestResult& result, const PlatformMenuDescription menu)
-    : m_hitTestResult(result)
-    , m_platformDescription(menu)
+ContextMenu::ContextMenu(const PlatformMenuDescription menu)
+    : m_platformDescription(menu)
 {
 }
 
@@ -50,8 +48,6 @@ ContextMenu::~ContextMenu()
 
 void ContextMenu::appendItem(ContextMenuItem& item)
 {
-    checkOrEnableIfNeeded(item);
-
     NSMenuItem* platformItem = item.releasePlatformDescription();
 
     [m_platformDescription.get() addObject:platformItem];
@@ -60,8 +56,6 @@ void ContextMenu::appendItem(ContextMenuItem& item)
 
 void ContextMenu::insertItem(unsigned position, ContextMenuItem& item)
 {
-    checkOrEnableIfNeeded(item);
-
     NSMenuItem* platformItem = item.releasePlatformDescription();
 
     [m_platformDescription.get() insertObject:platformItem atIndex:position];
diff --git a/WebCore/platform/qt/ContextMenuQt.cpp b/WebCore/platform/qt/ContextMenuQt.cpp
index e3715c9..c877642 100644
--- a/WebCore/platform/qt/ContextMenuQt.cpp
+++ b/WebCore/platform/qt/ContextMenuQt.cpp
@@ -35,8 +35,7 @@
 
 namespace WebCore {
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
 }
 
diff --git a/WebCore/platform/win/ContextMenuWin.cpp b/WebCore/platform/win/ContextMenuWin.cpp
index 10443aa..781fd6e 100644
--- a/WebCore/platform/win/ContextMenuWin.cpp
+++ b/WebCore/platform/win/ContextMenuWin.cpp
@@ -43,9 +43,8 @@
 
 namespace WebCore {
 
-ContextMenu::ContextMenu(const HitTestResult& result)
-    : m_hitTestResult(result)
-    , m_platformDescription(0)
+ContextMenu::ContextMenu()
+    : m_platformDescription(0)
 #if OS(WINCE)
     , m_itemCount(0)
 #endif
@@ -53,9 +52,8 @@ ContextMenu::ContextMenu(const HitTestResult& result)
     setPlatformDescription(::CreatePopupMenu());
 }
 
-ContextMenu::ContextMenu(const HitTestResult& result, const PlatformMenuDescription menu)
-    : m_hitTestResult(result)
-    , m_platformDescription(0)
+ContextMenu::ContextMenu(const PlatformMenuDescription menu)
+    : m_platformDescription(0)
 #if OS(WINCE)
     , m_itemCount(0)
 #endif
@@ -118,8 +116,6 @@ void ContextMenu::insertItem(unsigned int position, ContextMenuItem& item)
     if (!m_platformDescription)
         return;
 
-    checkOrEnableIfNeeded(item);
-
 #if OS(WINCE)
     if (insertMenuItem(m_platformDescription, position, item))
         ++m_itemCount;
diff --git a/WebCore/platform/wx/ContextMenuWx.cpp b/WebCore/platform/wx/ContextMenuWx.cpp
index b20d29e..a1bab37 100644
--- a/WebCore/platform/wx/ContextMenuWx.cpp
+++ b/WebCore/platform/wx/ContextMenuWx.cpp
@@ -42,7 +42,7 @@ ContextMenuItem* ContextMenu::itemWithId(int id)
     return new ContextMenuItem(ActionType, s_itemActions.get(id), "");
 }
 
-ContextMenu::ContextMenu(const HitTestResult& result) : m_hitTestResult(result)
+ContextMenu::ContextMenu()
 {
     m_platformDescription = new wxMenu(0);
 }
@@ -57,8 +57,6 @@ void ContextMenu::appendItem(ContextMenuItem& item)
 {
     if (!m_platformDescription)
         return;
-    
-    checkOrEnableIfNeeded(item);
         
     PlatformMenuItemDescription itemDescription = item.releasePlatformDescription();    
     wxItemKind menuKindWx = ( itemDescription.type == CheckableActionType ) ? wxITEM_CHECK : wxITEM_NORMAL;
diff --git a/WebCore/rendering/HitTestResult.cpp b/WebCore/rendering/HitTestResult.cpp
index 1bc238f..579042b 100644
--- a/WebCore/rendering/HitTestResult.cpp
+++ b/WebCore/rendering/HitTestResult.cpp
@@ -48,6 +48,16 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
+HitTestResult::HitTestResult()
+    : m_isOverWidget(false)
+    , m_isRectBased(false)
+    , m_topPadding(0)
+    , m_rightPadding(0)
+    , m_bottomPadding(0)
+    , m_leftPadding(0)
+{
+}
+
 HitTestResult::HitTestResult(const IntPoint& point)
     : m_point(point)
     , m_isOverWidget(false)
diff --git a/WebCore/rendering/HitTestResult.h b/WebCore/rendering/HitTestResult.h
index 8d9b18d..1545da9 100644
--- a/WebCore/rendering/HitTestResult.h
+++ b/WebCore/rendering/HitTestResult.h
@@ -43,6 +43,7 @@ class Scrollbar;
 
 class HitTestResult {
 public:
+    HitTestResult();
     HitTestResult(const IntPoint&);
     // Pass non-negative padding values to perform a rect-based hit test.
     HitTestResult(const IntPoint& centerPoint, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding);
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 56b9bce..03320bf 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,17 @@
+2010-12-07  Brian Weinstein  <bweinstein at apple.com>
+
+        Reviewed by John Sullivan.
+
+        Layering Violation in ContextMenu - member variable of type HitTestResult
+        https://bugs.webkit.org/show_bug.cgi?id=50586
+        
+        Update users of ContextMenu and ContextMenuController to match where the new functions 
+        are located.
+
+        * src/ContextMenuClientImpl.cpp:
+        (WebKit::selectMisspelledWord):
+        (WebKit::ContextMenuClientImpl::getCustomMenuFromDefaultItems):
+
 2010-12-06  Darin Adler  <darin at apple.com>
 
         Reviewed by Sam Weinig.
diff --git a/WebKit/chromium/src/ContextMenuClientImpl.cpp b/WebKit/chromium/src/ContextMenuClientImpl.cpp
index d33a06b..7bd1a2b 100644
--- a/WebKit/chromium/src/ContextMenuClientImpl.cpp
+++ b/WebKit/chromium/src/ContextMenuClientImpl.cpp
@@ -34,6 +34,7 @@
 #include "CSSPropertyNames.h"
 #include "CSSStyleDeclaration.h"
 #include "ContextMenu.h"
+#include "ContextMenuController.h"
 #include "Document.h"
 #include "DocumentLoader.h"
 #include "Editor.h"
@@ -45,6 +46,7 @@
 #include "HTMLNames.h"
 #include "KURL.h"
 #include "MediaError.h"
+#include "Page.h"
 #include "PlatformString.h"
 #include "RenderWidget.h"
 #include "TextBreakIterator.h"
@@ -110,7 +112,7 @@ static String selectMisspelledWord(const ContextMenu* defaultMenu, Frame* select
 
     // Selection is empty, so change the selection to the word under the cursor.
     HitTestResult hitTestResult = selectedFrame->eventHandler()->
-        hitTestResultAtPoint(defaultMenu->hitTestResult().point(), true);
+        hitTestResultAtPoint(selectedFrame->page()->contextMenuController()->hitTestResult().point(), true);
     Node* innerNode = hitTestResult.innerNode();
     VisiblePosition pos(innerNode->renderer()->positionForPoint(
         hitTestResult.localPoint()));
@@ -144,7 +146,7 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
     if (!m_webView->contextMenuAllowed())
         return 0;
 
-    HitTestResult r = defaultMenu->hitTestResult();
+    HitTestResult r = m_webView->page()->contextMenuController()->hitTestResult();
     Frame* selectedFrame = r.innerNonSharedNode()->document()->frame();
 
     WebContextMenuData data;
diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog
index e50c5ed..580fe13 100644
--- a/WebKit/gtk/ChangeLog
+++ b/WebKit/gtk/ChangeLog
@@ -1,3 +1,16 @@
+2010-12-08  Brian Weinstein  <bweinstein at apple.com>
+
+        Reviewed by John Sullivan.
+
+        Layering Violation in ContextMenu - member variable of type HitTestResult
+        https://bugs.webkit.org/show_bug.cgi?id=50586
+        
+        Update users of ContextMenu and ContextMenuController to match where the new functions 
+        are located.
+
+        * WebCoreSupport/ContextMenuClientGtk.cpp:
+        (WebKit::ContextMenuClient::getCustomMenuFromDefaultItems):
+
 2010-12-08  Martin Robinson  <mrobinson at igalia.com>
 
         Reviewed by John Sullivan.
diff --git a/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp b/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp
index 069fb19..28a3313 100644
--- a/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp
+++ b/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp
@@ -20,10 +20,12 @@
 #include "config.h"
 #include "ContextMenu.h"
 #include "ContextMenuClientGtk.h"
+#include "ContextMenuController.h"
 
 #include "HitTestResult.h"
 #include "KURL.h"
 #include "NotImplemented.h"
+#include "Page.h"
 #include <wtf/text/CString.h>
 
 #include <glib/gi18n-lib.h>
@@ -129,8 +131,8 @@ PlatformMenuDescription ContextMenuClient::getCustomMenuFromDefaultItems(Context
 {
     GtkMenu* gtkmenu = menu->releasePlatformDescription();
 
-    HitTestResult result = menu->hitTestResult();
     WebKitWebView* webView = m_webView;
+    HitTestResult result = core(webView)->contextMenuController()->hitTestResult();
 
     if (result.isContentEditable()) {
 
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index fb19ed6..1671ae4 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -2,6 +2,22 @@
 
         Reviewed by John Sullivan.
 
+        Layering Violation in ContextMenu - member variable of type HitTestResult
+        https://bugs.webkit.org/show_bug.cgi?id=50586
+        
+        Update users of ContextMenu and ContextMenuController to match where the new functions 
+        are located.
+
+        * WebCoreSupport/WebContextMenuClient.mm:
+        (WebContextMenuClient::getCustomMenuFromDefaultItems):
+        (WebContextMenuClient::contextMenuItemSelected):
+        * WebView/WebHTMLView.mm:
+        (-[WebMenuTarget validateMenuItem:]):
+
+2010-12-07  Brian Weinstein  <bweinstein at apple.com>
+
+        Reviewed by John Sullivan.
+
         Part of Layering Violation in ContextMenu
         https://bugs.webkit.org/show_bug.cgi?id=50586
         
diff --git a/WebKit/mac/WebCoreSupport/WebContextMenuClient.mm b/WebKit/mac/WebCoreSupport/WebContextMenuClient.mm
index f3a85f0..c5a1035 100644
--- a/WebKit/mac/WebCoreSupport/WebContextMenuClient.mm
+++ b/WebKit/mac/WebCoreSupport/WebContextMenuClient.mm
@@ -42,8 +42,10 @@
 #import "WebViewFactory.h"
 #import "WebViewInternal.h"
 #import <WebCore/ContextMenu.h>
+#import <WebCore/ContextMenuController.h>
 #import <WebCore/KURL.h>
 #import <WebCore/LocalizedStrings.h>
+#import <WebCore/Page.h>
 #import <WebCore/RuntimeApplicationChecks.h>
 #import <WebKit/DOMPrivate.h>
 
@@ -278,7 +280,7 @@ NSMutableArray* WebContextMenuClient::getCustomMenuFromDefaultItems(ContextMenu*
     if (![delegate respondsToSelector:selector])
         return defaultMenu->platformDescription();
 
-    NSDictionary *element = [[[WebElementDictionary alloc] initWithHitTestResult:defaultMenu->hitTestResult()] autorelease];
+    NSDictionary *element = [[[WebElementDictionary alloc] initWithHitTestResult:[m_webView page]->contextMenuController()->hitTestResult()] autorelease];
 
     BOOL preVersion3Client = isPreVersion3Client();
     if (preVersion3Client) {
@@ -308,7 +310,7 @@ void WebContextMenuClient::contextMenuItemSelected(ContextMenuItem* item, const
     id delegate = [m_webView UIDelegate];
     SEL selector = @selector(webView:contextMenuItemSelected:forElement:);
     if ([delegate respondsToSelector:selector]) {
-        NSDictionary *element = [[WebElementDictionary alloc] initWithHitTestResult:parentMenu->hitTestResult()];
+        NSDictionary *element = [[WebElementDictionary alloc] initWithHitTestResult:[m_webView page]->contextMenuController()->hitTestResult()];
         NSMenuItem *platformItem = item->releasePlatformDescription();
 
         CallUIDelegate(m_webView, selector, platformItem, element);
diff --git a/WebKit/mac/WebView/WebHTMLView.mm b/WebKit/mac/WebView/WebHTMLView.mm
index 7bd3727..b36d57a 100644
--- a/WebKit/mac/WebView/WebHTMLView.mm
+++ b/WebKit/mac/WebView/WebHTMLView.mm
@@ -170,7 +170,7 @@ static WebMenuTarget* target;
 {
     WebCore::ContextMenuItem coreItem(item);
     ASSERT(_menuController->contextMenu());
-    _menuController->contextMenu()->checkOrEnableIfNeeded(coreItem);
+    _menuController->checkOrEnableIfNeeded(coreItem);
     return coreItem.enabled();
 }
 
diff --git a/WebKit/qt/Api/qwebpage.cpp b/WebKit/qt/Api/qwebpage.cpp
index 40c5681..7eda04f 100644
--- a/WebKit/qt/Api/qwebpage.cpp
+++ b/WebKit/qt/Api/qwebpage.cpp
@@ -443,7 +443,7 @@ QMenu *QWebPagePrivate::createContextMenu(const WebCore::ContextMenu *webcoreMen
                 QAction *a = q->action(action);
                 if (a) {
                     ContextMenuItem it(item);
-                    webcoreMenu->checkOrEnableIfNeeded(it);
+                    page->contextMenuController()->checkOrEnableIfNeeded(it);
                     PlatformMenuItemDescription desc = it.releasePlatformDescription();
                     a->setEnabled(desc.enabled);
                     a->setChecked(desc.checked);
@@ -3209,12 +3209,13 @@ void QWebPage::updatePositionDependentActions(const QPoint &pos)
         d->hitTestResult = QWebHitTestResult();
     else
         d->hitTestResult = QWebHitTestResult(new QWebHitTestResultPrivate(result));
-    WebCore::ContextMenu menu(result);
-    menu.populate();
+
+    d->page->contextMenuController()->setHitTestResult(result);
+    d->page->contextMenuController()->populate();
     
 #if ENABLE(INSPECTOR)
     if (d->page->inspectorController()->enabled())
-        menu.addInspectElementItem();
+        d->page->contextMenuController()->addInspectElementItem();
 #endif
 
     QBitArray visitedWebActions(QWebPage::WebActionCount);
@@ -3223,7 +3224,7 @@ void QWebPage::updatePositionDependentActions(const QPoint &pos)
     delete d->currentContextMenu;
 
     // Then we let createContextMenu() enable the actions that are put into the menu
-    d->currentContextMenu = d->createContextMenu(&menu, menu.platformDescription(), &visitedWebActions);
+    d->currentContextMenu = d->createContextMenu(d->page->contextMenuController()->contextMenu(), d->page->contextMenuController()->contextMenu()->platformDescription(), &visitedWebActions);
 #endif // QT_NO_CONTEXTMENU
 
 #ifndef QT_NO_ACTION
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index 6d341ba..45d416d 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,17 @@
+2010-12-07  Brian Weinstein  <bweinstein at apple.com>
+
+        Reviewed by John Sullivan.
+
+        Layering Violation in ContextMenu - member variable of type HitTestResult
+        https://bugs.webkit.org/show_bug.cgi?id=50586
+        
+        Update users of ContextMenu and ContextMenuController to match where the new functions 
+        are located.
+
+        * Api/qwebpage.cpp:
+        (QWebPagePrivate::createContextMenu):
+        (QWebPage::updatePositionDependentActions):
+
 2010-12-07  Darin Adler  <darin at apple.com>
 
         Try to fix build.
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index c861f67..c0280ae 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,20 @@
+2010-12-07  Brian Weinstein  <bweinstein at apple.com>
+
+        Reviewed by John Sullivan.
+
+        Layering Violation in ContextMenu - member variable of type HitTestResult
+        https://bugs.webkit.org/show_bug.cgi?id=50586
+        
+        Update users of ContextMenu and ContextMenuController to match where the new functions 
+        are located.
+
+        * WebCoreSupport/WebContextMenuClient.cpp:
+        (WebContextMenuClient::getCustomMenuFromDefaultItems): Get the HitTestResult and ContextMenu from the 
+            ContextMenuController (from the page).
+        (WebContextMenuClient::contextMenuItemSelected): Get the HitTestResult from the ContextMenuController.
+        * WebView.cpp:
+        (WebView::handleContextMenuEvent): Ditto.
+
 2010-12-07  Jessie Berlin  <jberlin at apple.com>
 
         Build fix. Unreviewed.
diff --git a/WebKit/win/WebCoreSupport/WebContextMenuClient.cpp b/WebKit/win/WebCoreSupport/WebContextMenuClient.cpp
index ede44e2..ac92826 100644
--- a/WebKit/win/WebCoreSupport/WebContextMenuClient.cpp
+++ b/WebKit/win/WebCoreSupport/WebContextMenuClient.cpp
@@ -32,6 +32,7 @@
 #include "WebView.h"
 
 #include <WebCore/ContextMenu.h>
+#include <WebCore/ContextMenuController.h>
 #include <WebCore/Event.h>
 #include <WebCore/Frame.h>
 #include <WebCore/FrameLoader.h>
@@ -64,7 +65,7 @@ HMENU WebContextMenuClient::getCustomMenuFromDefaultItems(ContextMenu* menu)
 
     HMENU newMenu = 0;
     COMPtr<WebElementPropertyBag> propertyBag;
-    propertyBag.adoptRef(WebElementPropertyBag::createInstance(menu->hitTestResult()));
+    propertyBag.adoptRef(WebElementPropertyBag::createInstance(m_webView->page()->contextMenuController()->hitTestResult()));
     // FIXME: We need to decide whether to do the default before calling this delegate method
     if (FAILED(uiDelegate->contextMenuItemsForElement(m_webView, propertyBag.get(), (OLE_HANDLE)(ULONG64)menu->platformDescription(), (OLE_HANDLE*)&newMenu)))
         return menu->platformDescription();
@@ -82,7 +83,7 @@ void WebContextMenuClient::contextMenuItemSelected(ContextMenuItem* item, const
     ASSERT(uiDelegate);
 
     COMPtr<WebElementPropertyBag> propertyBag;
-    propertyBag.adoptRef(WebElementPropertyBag::createInstance(parentMenu->hitTestResult()));
+    propertyBag.adoptRef(WebElementPropertyBag::createInstance(m_webView->page()->contextMenuController()->hitTestResult()));
             
     uiDelegate->contextMenuItemSelected(m_webView, item->releasePlatformDescription(), propertyBag.get());
 }
diff --git a/WebKit/win/WebView.cpp b/WebKit/win/WebView.cpp
index 20c8d17..73311d5 100644
--- a/WebKit/win/WebView.cpp
+++ b/WebKit/win/WebView.cpp
@@ -1245,12 +1245,14 @@ bool WebView::handleContextMenuEvent(WPARAM wParam, LPARAM lParam)
     if (!handledEvent)
         return false;
 
+    ContextMenuController* contextMenuController = m_page->contextMenuController();
+
     // Show the menu
-    ContextMenu* coreMenu = m_page->contextMenuController()->contextMenu();
+    ContextMenu* coreMenu = contextMenuController->contextMenu();
     if (!coreMenu)
         return false;
 
-    Node* node = coreMenu->hitTestResult().innerNonSharedNode();
+    Node* node = contextMenuController->hitTestResult().innerNonSharedNode();
     if (!node)
         return false;
 
@@ -1262,7 +1264,7 @@ bool WebView::handleContextMenuEvent(WPARAM wParam, LPARAM lParam)
     if (!view)
         return false;
 
-    POINT point(view->contentsToWindow(coreMenu->hitTestResult().point()));
+    POINT point(view->contentsToWindow(contextMenuController->hitTestResult().point()));
 
     // Translate the point to screen coordinates
     if (!::ClientToScreen(m_viewWindow, &point))
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 638774b..b356e79 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,19 @@
+2010-12-07  Brian Weinstein  <bweinstein at apple.com>
+
+        Reviewed by John Sullivan.
+
+        Layering Violation in ContextMenu - member variable of type HitTestResult
+        https://bugs.webkit.org/show_bug.cgi?id=50586
+        
+        Update users of ContextMenu and ContextMenuController to match where the new functions 
+        are located.
+
+        * Shared/WebContextMenuItemData.cpp:
+        (WebKit::WebContextMenuItemData::WebContextMenuItemData): Remove the call to checkOrEnableItem, that call will be made when
+            the ContextMenuItem is added to the ContextMenu through the ContextMenuController.
+        * WebProcess/WebPage/WebContextMenu.cpp:
+        (WebKit::WebContextMenu::show):
+
 2010-12-08  Jessie Berlin  <jberlin at apple.com>
 
         Reviewed by Adam Roben.
diff --git a/WebKit2/Shared/WebContextMenuItemData.cpp b/WebKit2/Shared/WebContextMenuItemData.cpp
index 0fa8236..df6c7f2 100644
--- a/WebKit2/Shared/WebContextMenuItemData.cpp
+++ b/WebKit2/Shared/WebContextMenuItemData.cpp
@@ -73,8 +73,6 @@ WebContextMenuItemData::WebContextMenuItemData(WebCore::ContextMenuItem& item, W
         m_submenu = kitItems(coreSubmenu, menu);
     }
     
-    menu->checkOrEnableIfNeeded(item);
-    
     m_enabled = item.enabled();
     m_checked = item.checked();
 }
diff --git a/WebKit2/WebProcess/WebPage/WebContextMenu.cpp b/WebKit2/WebProcess/WebPage/WebContextMenu.cpp
index 8418905..c335fe2 100644
--- a/WebKit2/WebProcess/WebPage/WebContextMenu.cpp
+++ b/WebKit2/WebProcess/WebPage/WebContextMenu.cpp
@@ -47,10 +47,13 @@ WebContextMenu::~WebContextMenu()
 
 void WebContextMenu::show()
 {
-    ContextMenu* menu = m_page->corePage()->contextMenuController()->contextMenu();
+    ContextMenuController* controller = m_page->corePage()->contextMenuController();
+    if (!controller)
+        return;
+    ContextMenu* menu = controller->contextMenu();
     if (!menu)
         return;
-    Node* node = menu->hitTestResult().innerNonSharedNode();
+    Node* node = controller->hitTestResult().innerNonSharedNode();
     if (!node)
         return;
     Frame* frame = node->document()->frame();
@@ -65,12 +68,12 @@ void WebContextMenu::show()
     Vector<WebContextMenuItemData> proposedMenu = kitItems(coreItems, menu);
     Vector<WebContextMenuItemData> newMenu;
     RefPtr<APIObject> userData;
-    RefPtr<InjectedBundleHitTestResult> hitTestResult = InjectedBundleHitTestResult::create(menu->hitTestResult());
+    RefPtr<InjectedBundleHitTestResult> hitTestResult = InjectedBundleHitTestResult::create(controller->hitTestResult());
     if (m_page->injectedBundleContextMenuClient().getCustomMenuFromDefaultItems(m_page, hitTestResult.get(), proposedMenu, newMenu, userData))
         proposedMenu = newMenu;
 
     // Notify the UIProcess.
-    m_page->send(Messages::WebPageProxy::ShowContextMenu(view->contentsToWindow(menu->hitTestResult().point()), proposedMenu, InjectedBundleUserMessageEncoder(userData.get())));
+    m_page->send(Messages::WebPageProxy::ShowContextMenu(view->contentsToWindow(controller->hitTestResult().point()), proposedMenu, InjectedBundleUserMessageEncoder(userData.get())));
 }
 
 void WebContextMenu::itemSelected(const WebContextMenuItemData& item)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list