WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
[PATCH] Fix - Win, Qt, Mac
context_menu_layering_violation_fix.patch (text/plain), 121.25 KB, created by
Brian Weinstein
on 2010-12-07 16:55:06 PST
(
hide
)
Description:
[PATCH] Fix - Win, Qt, Mac
Filename:
MIME Type:
Creator:
Brian Weinstein
Created:
2010-12-07 16:55:06 PST
Size:
121.25 KB
patch
obsolete
>Index: WebCore/ChangeLog >=================================================================== >--- WebCore/ChangeLog (revision 73469) >+++ WebCore/ChangeLog (working copy) >@@ -1,3 +1,83 @@ >+2010-12-07 Brian Weinstein <bweinstein@apple.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-07 Brian Weinstein <bweinstein@apple.com> > > Reviewed by John Sullivan. >Index: WebCore/Android.mk >=================================================================== >--- WebCore/Android.mk (revision 73469) >+++ WebCore/Android.mk (working copy) >@@ -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 \ >Index: WebCore/CMakeLists.txt >=================================================================== >--- WebCore/CMakeLists.txt (revision 73469) >+++ WebCore/CMakeLists.txt (working copy) >@@ -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 >Index: WebCore/GNUmakefile.am >=================================================================== >--- WebCore/GNUmakefile.am (revision 73469) >+++ WebCore/GNUmakefile.am (working copy) >@@ -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 \ >Index: WebCore/WebCore.exp.in >=================================================================== >--- WebCore/WebCore.exp.in (revision 73469) >+++ WebCore/WebCore.exp.in (working copy) >@@ -1252,12 +1252,12 @@ __ZN7WebCore15ContextMenuItemC1ENS_19Con > __ZN7WebCore15ContextMenuItemC1EP10NSMenuItem > __ZN7WebCore15ContextMenuItemD1Ev > __ZN7WebCore21ContextMenuController16clearContextMenuEv >+__ZNK7WebCore21ContextMenuController21checkOrEnableIfNeededERNS_15ContextMenuItemE > __ZN7WebCore21ContextMenuController23contextMenuItemSelectedEPNS_15ContextMenuItemE > __ZN7WebCore21contextMenuItemVectorEP14NSMutableArray > __ZN7WebCore23platformMenuDescriptionERN3WTF6VectorINS_15ContextMenuItemELm0EEE > __ZN7WebCore6Chrome15showContextMenuEv > __ZNK7WebCore11ContextMenu19platformDescriptionEv >-__ZNK7WebCore11ContextMenu21checkOrEnableIfNeededERNS_15ContextMenuItemE > __ZNK7WebCore15ContextMenuItem15platformSubMenuEv > __ZNK7WebCore15ContextMenuItem4typeEv > __ZNK7WebCore15ContextMenuItem5titleEv >Index: WebCore/WebCore.gypi >=================================================================== >--- WebCore/WebCore.gypi (revision 73469) >+++ WebCore/WebCore.gypi (working copy) >@@ -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', >Index: WebCore/WebCore.pro >=================================================================== >--- WebCore/WebCore.pro (revision 73469) >+++ WebCore/WebCore.pro (working copy) >@@ -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 \ >Index: WebCore/WebCore.vcproj/WebCore.vcproj >=================================================================== >--- WebCore/WebCore.vcproj/WebCore.vcproj (revision 73469) >+++ WebCore/WebCore.vcproj/WebCore.vcproj (working copy) >@@ -25314,10 +25314,6 @@ > > > </File> > <File >- RelativePath="..\platform\ContextMenu.cpp" >- > >- </File> >- <File > RelativePath="..\platform\ContextMenu.h" > > > </File> >Index: WebCore/WebCore.xcodeproj/project.pbxproj >=================================================================== >--- WebCore/WebCore.xcodeproj/project.pbxproj (revision 73469) >+++ WebCore/WebCore.xcodeproj/project.pbxproj (working copy) >@@ -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 */, >Index: WebCore/page/ContextMenuController.cpp >=================================================================== >--- WebCore/page/ContextMenuController.cpp (revision 73469) >+++ WebCore/page/ContextMenuController.cpp (working copy) >@@ -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 { > >@@ -70,6 +76,7 @@ ContextMenuController::ContextMenuContro > : m_page(page) > , m_client(client) > , m_contextMenu(0) >+ , m_hitTestResult(HitTestResult(IntPoint())) > { > ASSERT_ARG(page, page); > ASSERT_ARG(client, client); >@@ -93,7 +100,9 @@ void ContextMenuController::handleContex > m_contextMenu.set(createContextMenu(event)); > if (!m_contextMenu) > return; >- m_contextMenu->populate(); >+ >+ populate(); >+ > showContextMenu(event); > } > >@@ -113,8 +122,9 @@ void ContextMenuController::showContextM > > 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 +133,17 @@ ContextMenu* ContextMenuController::crea > > 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 +175,53 @@ void ContextMenuController::contextMenuI > 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 +285,10 @@ void ContextMenuController::contextMenuI > 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 +307,7 @@ void ContextMenuController::contextMenuI > 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 +397,13 @@ void ContextMenuController::contextMenuI > 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 +411,829 @@ void ContextMenuController::contextMenuI > } > } > >+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) >Index: WebCore/page/ContextMenuController.h >=================================================================== >--- WebCore/page/ContextMenuController.h (revision 73469) >+++ WebCore/page/ContextMenuController.h (working copy) >@@ -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*); > void showContextMenu(Event*); >+ >+ void appendItem(ContextMenuItem&, ContextMenu* parentMenu); >+ >+ void createAndAppendFontSubMenu(ContextMenuItem& fontMenuItem); >+ void createAndAppendSpellingAndGrammarSubMenu(ContextMenuItem& spellingAndGrammarMenuItem); >+ void createAndAppendSpellingSubMenu(ContextMenuItem& spellingMenuItem); >+ void createAndAppendSpeechSubMenu(ContextMenuItem& speechMenuItem); >+ void createAndAppendWritingDirectionSubMenu(ContextMenuItem& writingDirectionMenuItem); >+ void createAndAppendTextDirectionSubMenu(ContextMenuItem& textDirectionMenuItem); >+ void createAndAppendSubstitutionsSubMenu(ContextMenuItem& substitutionsMenuItem); >+ void createAndAppendTransformationsSubMenu(ContextMenuItem& transformationsMenuItem); > > Page* m_page; > ContextMenuClient* m_client; > OwnPtr<ContextMenu> m_contextMenu; > RefPtr<ContextMenuProvider> m_menuProvider; >+ HitTestResult m_hitTestResult; > }; > > } >Index: WebCore/platform/ContextMenu.cpp >=================================================================== >--- WebCore/platform/ContextMenu.cpp (revision 73469) >+++ WebCore/platform/ContextMenu.cpp (working copy) >@@ -1,890 +0,0 @@ >-/* >- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. >- * Copyright (C) 2008 Christian Dywan <christian@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) >Index: WebCore/platform/ContextMenu.h >=================================================================== >--- WebCore/platform/ContextMenu.h (revision 73469) >+++ WebCore/platform/ContextMenu.h (working copy) >@@ -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; >Index: WebCore/platform/android/TemporaryLinkStubs.cpp >=================================================================== >--- WebCore/platform/android/TemporaryLinkStubs.cpp (revision 73469) >+++ WebCore/platform/android/TemporaryLinkStubs.cpp (working copy) >@@ -167,7 +167,7 @@ Pasteboard::~Pasteboard() > } > > >-ContextMenu::ContextMenu(const HitTestResult& result) : m_hitTestResult(result) >+ContextMenu::ContextMenu() > { > ASSERT_NOT_REACHED(); > notImplemented(); >Index: WebCore/platform/brew/ContextMenuBrew.cpp >=================================================================== >--- WebCore/platform/brew/ContextMenuBrew.cpp (revision 73469) >+++ WebCore/platform/brew/ContextMenuBrew.cpp (working copy) >@@ -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(); >Index: WebCore/platform/chromium/ContextMenuChromium.cpp >=================================================================== >--- WebCore/platform/chromium/ContextMenuChromium.cpp (revision 73469) >+++ WebCore/platform/chromium/ContextMenuChromium.cpp (working copy) >@@ -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) > { > } > >Index: WebCore/platform/efl/ContextMenuEfl.cpp >=================================================================== >--- WebCore/platform/efl/ContextMenuEfl.cpp (revision 73469) >+++ WebCore/platform/efl/ContextMenuEfl.cpp (working copy) >@@ -29,16 +29,14 @@ > > 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); > } > >-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()); > } >@@ -51,7 +49,6 @@ ContextMenu::~ContextMenu() > > void ContextMenu::appendItem(ContextMenuItem& item) > { >- checkOrEnableIfNeeded(item); > m_contextMenuClient->appendItem(m_platformDescription, item); > } > >Index: WebCore/platform/efl/ContextMenuItemEfl.cpp >=================================================================== >--- WebCore/platform/efl/ContextMenuItemEfl.cpp (revision 73469) >+++ WebCore/platform/efl/ContextMenuItemEfl.cpp (working copy) >@@ -116,8 +116,7 @@ void ContextMenuItem::setSubMenu(Context > 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 >Index: WebCore/platform/gtk/ContextMenuGtk.cpp >=================================================================== >--- WebCore/platform/gtk/ContextMenuGtk.cpp (revision 73469) >+++ WebCore/platform/gtk/ContextMenuGtk.cpp (working copy) >@@ -34,8 +34,7 @@ static void menuItemActivated(GtkMenuIte > controller->contextMenuItemSelected(&contextItem); > } > >-ContextMenu::ContextMenu(const HitTestResult& result) >- : m_hitTestResult(result) >+ContextMenu::ContextMenu() > { > m_platformDescription = GTK_MENU(gtk_menu_new()); > >@@ -51,7 +50,6 @@ ContextMenu::~ContextMenu() > void ContextMenu::appendItem(ContextMenuItem& item) > { > ASSERT(m_platformDescription); >- checkOrEnableIfNeeded(item); > > ContextMenuItemType type = item.type(); > GtkMenuItem* platformItem = ContextMenuItem::createNativeMenuItem(item.releasePlatformDescription()); >Index: WebCore/platform/haiku/ContextMenuHaiku.cpp >=================================================================== >--- WebCore/platform/haiku/ContextMenuHaiku.cpp (revision 73469) >+++ WebCore/platform/haiku/ContextMenuHaiku.cpp (working copy) >@@ -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); >Index: WebCore/platform/mac/ContextMenuMac.mm >=================================================================== >--- WebCore/platform/mac/ContextMenuMac.mm (revision 73469) >+++ WebCore/platform/mac/ContextMenuMac.mm (working copy) >@@ -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(ContextMenu > > void ContextMenu::insertItem(unsigned position, ContextMenuItem& item) > { >- checkOrEnableIfNeeded(item); >- > NSMenuItem* platformItem = item.releasePlatformDescription(); > > [m_platformDescription.get() insertObject:platformItem atIndex:position]; >Index: WebCore/platform/qt/ContextMenuQt.cpp >=================================================================== >--- WebCore/platform/qt/ContextMenuQt.cpp (revision 73469) >+++ WebCore/platform/qt/ContextMenuQt.cpp (working copy) >@@ -35,8 +35,7 @@ > > namespace WebCore { > >-ContextMenu::ContextMenu(const HitTestResult& result) >- : m_hitTestResult(result) >+ContextMenu::ContextMenu() > { > } > >Index: WebCore/platform/win/ContextMenuWin.cpp >=================================================================== >--- WebCore/platform/win/ContextMenuWin.cpp (revision 73469) >+++ WebCore/platform/win/ContextMenuWin.cpp (working copy) >@@ -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 HitTestRe > 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 in > if (!m_platformDescription) > return; > >- checkOrEnableIfNeeded(item); >- > #if OS(WINCE) > if (insertMenuItem(m_platformDescription, position, item)) > ++m_itemCount; >Index: WebCore/platform/wx/ContextMenuWx.cpp >=================================================================== >--- WebCore/platform/wx/ContextMenuWx.cpp (revision 73469) >+++ WebCore/platform/wx/ContextMenuWx.cpp (working copy) >@@ -42,7 +42,7 @@ ContextMenuItem* ContextMenu::itemWithId > 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(ContextMenu > { > if (!m_platformDescription) > return; >- >- checkOrEnableIfNeeded(item); > > PlatformMenuItemDescription itemDescription = item.releasePlatformDescription(); > wxItemKind menuKindWx = ( itemDescription.type == CheckableActionType ) ? wxITEM_CHECK : wxITEM_NORMAL; >Index: WebKit2/ChangeLog >=================================================================== >--- WebKit2/ChangeLog (revision 73469) >+++ WebKit2/ChangeLog (working copy) >@@ -1,3 +1,19 @@ >+2010-12-07 Brian Weinstein <bweinstein@apple.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-07 Anders Carlsson <andersca@apple.com> > > Reviewed by Sam Weinig. >Index: WebKit2/Shared/WebContextMenuItemData.cpp >=================================================================== >--- WebKit2/Shared/WebContextMenuItemData.cpp (revision 73469) >+++ WebKit2/Shared/WebContextMenuItemData.cpp (working copy) >@@ -73,8 +73,6 @@ WebContextMenuItemData::WebContextMenuIt > m_submenu = kitItems(coreSubmenu, menu); > } > >- menu->checkOrEnableIfNeeded(item); >- > m_enabled = item.enabled(); > m_checked = item.checked(); > } >Index: WebKit2/WebProcess/WebPage/WebContextMenu.cpp >=================================================================== >--- WebKit2/WebProcess/WebPage/WebContextMenu.cpp (revision 73469) >+++ WebKit2/WebProcess/WebPage/WebContextMenu.cpp (working copy) >@@ -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) >Index: WebKit/mac/ChangeLog >=================================================================== >--- WebKit/mac/ChangeLog (revision 73478) >+++ WebKit/mac/ChangeLog (working copy) >@@ -1,3 +1,19 @@ >+2010-12-07 Brian Weinstein <bweinstein@apple.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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@apple.com> > > Reviewed by John Sullivan. >Index: WebKit/mac/WebCoreSupport/WebContextMenuClient.mm >=================================================================== >--- WebKit/mac/WebCoreSupport/WebContextMenuClient.mm (revision 73469) >+++ WebKit/mac/WebCoreSupport/WebContextMenuClient.mm (working copy) >@@ -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::ge > 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::contextMenuIt > 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); >Index: WebKit/mac/WebView/WebHTMLView.mm >=================================================================== >--- WebKit/mac/WebView/WebHTMLView.mm (revision 73469) >+++ WebKit/mac/WebView/WebHTMLView.mm (working copy) >@@ -170,7 +170,7 @@ - (BOOL)validateMenuItem:(NSMenuItem *)i > { > WebCore::ContextMenuItem coreItem(item); > ASSERT(_menuController->contextMenu()); >- _menuController->contextMenu()->checkOrEnableIfNeeded(coreItem); >+ _menuController->checkOrEnableIfNeeded(coreItem); > return coreItem.enabled(); > } > >Index: WebKit/qt/ChangeLog >=================================================================== >--- WebKit/qt/ChangeLog (revision 73469) >+++ WebKit/qt/ChangeLog (working copy) >@@ -1,3 +1,17 @@ >+2010-12-07 Brian Weinstein <bweinstein@apple.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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@apple.com> > > Try to fix build. >Index: WebKit/qt/Api/qwebpage.cpp >=================================================================== >--- WebKit/qt/Api/qwebpage.cpp (revision 73469) >+++ WebKit/qt/Api/qwebpage.cpp (working copy) >@@ -443,7 +443,7 @@ QMenu *QWebPagePrivate::createContextMen > 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::updatePositionDependentAc > 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::updatePositionDependentAc > 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 >Index: WebKit/win/ChangeLog >=================================================================== >--- WebKit/win/ChangeLog (revision 73469) >+++ WebKit/win/ChangeLog (working copy) >@@ -1,3 +1,20 @@ >+2010-12-07 Brian Weinstein <bweinstein@apple.com> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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@apple.com> > > Build fix. Unreviewed. >Index: WebKit/win/WebView.cpp >=================================================================== >--- WebKit/win/WebView.cpp (revision 73469) >+++ WebKit/win/WebView.cpp (working copy) >@@ -1245,12 +1245,14 @@ bool WebView::handleContextMenuEvent(WPA > 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(WPA > 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)) >Index: WebKit/win/WebCoreSupport/WebContextMenuClient.cpp >=================================================================== >--- WebKit/win/WebCoreSupport/WebContextMenuClient.cpp (revision 73469) >+++ WebKit/win/WebCoreSupport/WebContextMenuClient.cpp (working copy) >@@ -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::getCustomMen > > 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::contextMenuIt > 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()); > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 50586
:
75776
|
75778
|
75781
|
75839
|
75850
|
75864
|
75868
|
75877
|
75879
|
75920
|
75925