diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/page/ContextMenuController.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/page/ContextMenuController.cpp')
-rw-r--r-- | Source/WebCore/page/ContextMenuController.cpp | 369 |
1 files changed, 173 insertions, 196 deletions
diff --git a/Source/WebCore/page/ContextMenuController.cpp b/Source/WebCore/page/ContextMenuController.cpp index 890da8827..04a06d11d 100644 --- a/Source/WebCore/page/ContextMenuController.cpp +++ b/Source/WebCore/page/ContextMenuController.cpp @@ -11,10 +11,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * 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 INC. OR + * 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 @@ -49,7 +49,6 @@ #include "FrameLoader.h" #include "FrameLoaderClient.h" #include "FrameSelection.h" -#include "HTMLFormControlElement.h" #include "HTMLFormElement.h" #include "HitTestRequest.h" #include "HitTestResult.h" @@ -61,7 +60,6 @@ #include "Node.h" #include "Page.h" #include "PlatformEvent.h" -#include "RenderImage.h" #include "ReplaceSelectionCommand.h" #include "ResourceRequest.h" #include "Settings.h" @@ -71,6 +69,7 @@ #include "WindowFeatures.h" #include "markup.h" #include <wtf/unicode/CharacterNames.h> +#include <wtf/unicode/Unicode.h> using namespace WTF; using namespace Unicode; @@ -90,15 +89,15 @@ ContextMenuController::~ContextMenuController() void ContextMenuController::clearContextMenu() { - m_contextMenu = nullptr; + m_contextMenu.clear(); if (m_menuProvider) m_menuProvider->contextMenuCleared(); - m_menuProvider = nullptr; + m_menuProvider = 0; } void ContextMenuController::handleContextMenuEvent(Event* event) { - m_contextMenu = maybeCreateContextMenu(event); + m_contextMenu = createContextMenu(event); if (!m_contextMenu) return; @@ -107,96 +106,80 @@ void ContextMenuController::handleContextMenuEvent(Event* event) showContextMenu(event); } -static std::unique_ptr<ContextMenuItem> separatorItem() +static PassOwnPtr<ContextMenuItem> separatorItem() { - return std::unique_ptr<ContextMenuItem>(new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String())); + return adoptPtr(new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String())); } void ContextMenuController::showContextMenu(Event* event, PassRefPtr<ContextMenuProvider> menuProvider) { m_menuProvider = menuProvider; - m_contextMenu = maybeCreateContextMenu(event); + m_contextMenu = createContextMenu(event); if (!m_contextMenu) { clearContextMenu(); return; } m_menuProvider->populateContextMenu(m_contextMenu.get()); - if (m_context.hitTestResult().isSelected()) { + if (m_hitTestResult.isSelected()) { appendItem(*separatorItem(), m_contextMenu.get()); populate(); } showContextMenu(event); } -#if ENABLE(SERVICE_CONTROLS) -static Image* imageFromImageElementNode(Node& node) -{ - RenderObject* renderer = node.renderer(); - if (!is<RenderImage>(renderer)) - return nullptr; - CachedImage* image = downcast<RenderImage>(*renderer).cachedImage(); - if (!image || image->errorOccurred()) - return nullptr; - - return image->imageForRenderer(renderer); -} -#endif - -std::unique_ptr<ContextMenu> ContextMenuController::maybeCreateContextMenu(Event* event) +PassOwnPtr<ContextMenu> ContextMenuController::createContextMenu(Event* event) { ASSERT(event); - if (!is<MouseEvent>(*event)) + if (!event->isMouseEvent()) return nullptr; - MouseEvent& mouseEvent = downcast<MouseEvent>(*event); - HitTestResult result(mouseEvent.absoluteLocation()); + MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); + HitTestResult result(mouseEvent->absoluteLocation()); + + if (Frame* frame = event->target()->toNode()->document().frame()) + result = frame->eventHandler().hitTestResultAtPoint(mouseEvent->absoluteLocation()); - Node* node = event->target()->toNode(); - if (Frame* frame = node->document().frame()) - result = frame->eventHandler().hitTestResultAtPoint(mouseEvent.absoluteLocation()); - if (!result.innerNonSharedNode()) return nullptr; - m_context = ContextMenuContext(result); + m_hitTestResult = result; -#if ENABLE(SERVICE_CONTROLS) - if (node->isImageControlsButtonElement()) { - if (Image* image = imageFromImageElementNode(*result.innerNonSharedNode())) - m_context.setControlledImage(image); - - // FIXME: If we couldn't get the image then we shouldn't try to show the image controls menu for it. - return nullptr; - } -#endif - - return std::unique_ptr<ContextMenu>(new ContextMenu); + return adoptPtr(new ContextMenu); } void ContextMenuController::showContextMenu(Event* event) { +#if ENABLE(INSPECTOR) if (m_page.inspectorController().enabled()) addInspectElementItem(); +#endif +#if USE(CROSS_PLATFORM_CONTEXT_MENUS) + m_contextMenu = m_client.customizeMenu(m_contextMenu.release()); +#else + PlatformMenuDescription customMenu = m_client.getCustomMenuFromDefaultItems(m_contextMenu.get()); + m_contextMenu->setPlatformDescription(customMenu); +#endif event->setDefaultHandled(); } -static void openNewWindow(const URL& urlToLoad, Frame* frame, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy) +static void openNewWindow(const URL& urlToLoad, Frame* frame) { Page* oldPage = frame->page(); if (!oldPage) return; + + FrameLoadRequest request(frame->document()->securityOrigin(), ResourceRequest(urlToLoad, frame->loader().outgoingReferrer())); + Page* newPage = oldPage; - FrameLoadRequest request(frame->document()->securityOrigin(), ResourceRequest(urlToLoad, frame->loader().outgoingReferrer()), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, shouldOpenExternalURLsPolicy); - - Page* newPage = oldPage->chrome().createWindow(frame, request, WindowFeatures(), NavigationAction(request.resourceRequest())); + newPage = oldPage->chrome().createWindow(frame, request, WindowFeatures(), NavigationAction(request.resourceRequest())); if (!newPage) return; newPage->chrome().show(); - newPage->mainFrame().loader().loadFrameRequest(request, nullptr, nullptr); + newPage->mainFrame().loader().loadFrameRequest(request, false, false, 0, 0, MaybeSendReferrer); } #if PLATFORM(GTK) @@ -211,80 +194,87 @@ static void insertUnicodeCharacter(UChar character, Frame* frame) } #endif -void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, const String& title) +void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) { - if (action >= ContextMenuItemBaseCustomTag) { + ASSERT(item->type() == ActionType || item->type() == CheckableActionType); + + if (item->action() >= ContextMenuItemBaseApplicationTag) { + m_client.contextMenuItemSelected(item, m_contextMenu.get()); + return; + } + + if (item->action() >= ContextMenuItemBaseCustomTag) { ASSERT(m_menuProvider); - m_menuProvider->contextMenuItemSelected(action, title); + m_menuProvider->contextMenuItemSelected(item); return; } - Frame* frame = m_context.hitTestResult().innerNonSharedNode()->document().frame(); + Frame* frame = m_hitTestResult.innerNonSharedNode()->document().frame(); if (!frame) return; - switch (action) { + switch (item->action()) { case ContextMenuItemTagOpenLinkInNewWindow: - openNewWindow(m_context.hitTestResult().absoluteLinkURL(), frame, ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes); + openNewWindow(m_hitTestResult.absoluteLinkURL(), frame); break; case ContextMenuItemTagDownloadLinkToDisk: // FIXME: Some day we should be able to do this from within WebCore. (Bug 117709) - m_client.downloadURL(m_context.hitTestResult().absoluteLinkURL()); + m_client.downloadURL(m_hitTestResult.absoluteLinkURL()); break; case ContextMenuItemTagCopyLinkToClipboard: - frame->editor().copyURL(m_context.hitTestResult().absoluteLinkURL(), m_context.hitTestResult().textContent()); + frame->editor().copyURL(m_hitTestResult.absoluteLinkURL(), m_hitTestResult.textContent()); break; case ContextMenuItemTagOpenImageInNewWindow: - openNewWindow(m_context.hitTestResult().absoluteImageURL(), frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); + openNewWindow(m_hitTestResult.absoluteImageURL(), frame); break; case ContextMenuItemTagDownloadImageToDisk: // FIXME: Some day we should be able to do this from within WebCore. (Bug 117709) - m_client.downloadURL(m_context.hitTestResult().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(m_context.hitTestResult()); + frame->editor().copyImage(m_hitTestResult); break; #if PLATFORM(GTK) || PLATFORM(EFL) case ContextMenuItemTagCopyImageUrlToClipboard: - frame->editor().copyURL(m_context.hitTestResult().absoluteImageURL(), m_context.hitTestResult().textContent()); + frame->editor().copyURL(m_hitTestResult.absoluteImageURL(), m_hitTestResult.textContent()); break; #endif case ContextMenuItemTagOpenMediaInNewWindow: - openNewWindow(m_context.hitTestResult().absoluteMediaURL(), frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); + openNewWindow(m_hitTestResult.absoluteMediaURL(), frame); break; case ContextMenuItemTagDownloadMediaToDisk: // FIXME: Some day we should be able to do this from within WebCore. (Bug 117709) - m_client.downloadURL(m_context.hitTestResult().absoluteMediaURL()); + m_client.downloadURL(m_hitTestResult.absoluteMediaURL()); break; case ContextMenuItemTagCopyMediaLinkToClipboard: - frame->editor().copyURL(m_context.hitTestResult().absoluteMediaURL(), m_context.hitTestResult().textContent()); + frame->editor().copyURL(m_hitTestResult.absoluteMediaURL(), m_hitTestResult.textContent()); break; case ContextMenuItemTagToggleMediaControls: - m_context.hitTestResult().toggleMediaControlsDisplay(); + m_hitTestResult.toggleMediaControlsDisplay(); break; case ContextMenuItemTagToggleMediaLoop: - m_context.hitTestResult().toggleMediaLoopPlayback(); + m_hitTestResult.toggleMediaLoopPlayback(); break; case ContextMenuItemTagToggleVideoFullscreen: - m_context.hitTestResult().toggleMediaFullscreenState(); + m_hitTestResult.toggleMediaFullscreenState(); break; case ContextMenuItemTagEnterVideoFullscreen: - m_context.hitTestResult().enterFullscreenForVideo(); + m_hitTestResult.enterFullscreenForVideo(); break; case ContextMenuItemTagMediaPlayPause: - m_context.hitTestResult().toggleMediaPlayState(); + m_hitTestResult.toggleMediaPlayState(); break; case ContextMenuItemTagMediaMute: - m_context.hitTestResult().toggleMediaMuteState(); + m_hitTestResult.toggleMediaMuteState(); break; case ContextMenuItemTagOpenFrameInNewWindow: { DocumentLoader* loader = frame->loader().documentLoader(); if (!loader->unreachableURL().isEmpty()) - openNewWindow(loader->unreachableURL(), frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); + openNewWindow(loader->unreachableURL(), frame); else - openNewWindow(loader->url(), frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); + openNewWindow(loader->url(), frame); break; } case ContextMenuItemTagCopy: @@ -351,15 +341,15 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co break; #endif case ContextMenuItemTagSpellingGuess: { - VisibleSelection selection = frame->selection().selection(); - if (frame->editor().shouldInsertText(title, selection.toNormalizedRange().get(), EditorInsertActionPasted)) { + FrameSelection& frameSelection = frame->selection(); + if (frame->editor().shouldInsertText(item->title(), frameSelection.toNormalizedRange().get(), EditorInsertActionPasted)) { ReplaceSelectionCommand::CommandOptions replaceOptions = ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting; if (frame->editor().behavior().shouldAllowSpellingSuggestionsWithoutSelection()) { - ASSERT(selection.isCaretOrRange()); - VisibleSelection wordSelection(selection.base()); + ASSERT(frameSelection.isCaretOrRange()); + VisibleSelection wordSelection(frameSelection.base()); wordSelection.expandUsingGranularity(WordGranularity); - frame->selection().setSelection(wordSelection); + frameSelection.setSelection(wordSelection); } else { ASSERT(frame->editor().selectedText().length()); replaceOptions |= ReplaceSelectionCommand::SelectReplacement; @@ -367,9 +357,9 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co Document* document = frame->document(); ASSERT(document); - RefPtr<ReplaceSelectionCommand> command = ReplaceSelectionCommand::create(*document, createFragmentFromMarkup(*document, title, ""), replaceOptions); + RefPtr<ReplaceSelectionCommand> command = ReplaceSelectionCommand::create(*document, createFragmentFromMarkup(*document, item->title(), ""), replaceOptions); applyCommand(command); - frame->selection().revealSelection(ScrollAlignment::alignToEdgeIfNeeded); + frameSelection.revealSelection(ScrollAlignment::alignToEdgeIfNeeded); } break; } @@ -387,10 +377,13 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co m_client.lookUpInDictionary(frame); break; case ContextMenuItemTagOpenLink: - if (Frame* targetFrame = m_context.hitTestResult().targetFrame()) - targetFrame->loader().loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(m_context.hitTestResult().absoluteLinkURL(), frame->loader().outgoingReferrer()), LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress, targetFrame->isMainFrame() ? ShouldOpenExternalURLsPolicy::ShouldAllow : ShouldOpenExternalURLsPolicy::ShouldNotAllow), nullptr, nullptr); + if (Frame* targetFrame = m_hitTestResult.targetFrame()) + targetFrame->loader().loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(m_hitTestResult.absoluteLinkURL(), frame->loader().outgoingReferrer())), false, false, 0, 0, MaybeSendReferrer); else - openNewWindow(m_context.hitTestResult().absoluteLinkURL(), frame, ShouldOpenExternalURLsPolicy::ShouldAllow); + openNewWindow(m_hitTestResult.absoluteLinkURL(), frame); + break; + case ContextMenuItemTagOpenLinkInThisWindow: + frame->loader().loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(m_hitTestResult.absoluteLinkURL(), frame->loader().outgoingReferrer())), false, false, 0, 0, MaybeSendReferrer); break; case ContextMenuItemTagBold: frame->editor().command("ToggleBold").execute(); @@ -407,8 +400,8 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co break; case ContextMenuItemTagStartSpeaking: { RefPtr<Range> selectedRange = frame->selection().toNormalizedRange(); - if (!selectedRange || selectedRange->collapsed()) { - Document& document = m_context.hitTestResult().innerNonSharedNode()->document(); + if (!selectedRange || selectedRange->collapsed(IGNORE_EXCEPTION)) { + Document& document = m_hitTestResult.innerNonSharedNode()->document(); selectedRange = document.createRange(); selectedRange->selectNode(document.documentElement(), IGNORE_EXCEPTION); } @@ -436,7 +429,7 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co case ContextMenuItemTagTextDirectionRightToLeft: frame->editor().command("MakeTextWritingDirectionRightToLeft").execute(); break; -#if PLATFORM(COCOA) +#if PLATFORM(MAC) case ContextMenuItemTagSearchInSpotlight: m_client.searchWithSpotlight(); break; @@ -453,7 +446,7 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co case ContextMenuItemTagCheckGrammarWithSpelling: frame->editor().toggleGrammarChecking(); break; -#if PLATFORM(COCOA) +#if PLATFORM(MAC) case ContextMenuItemTagShowFonts: frame->editor().showFontPanel(); break; @@ -475,9 +468,9 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co frame->editor().capitalizeWord(); break; #endif -#if PLATFORM(COCOA) +#if PLATFORM(MAC) case ContextMenuItemTagChangeBack: - frame->editor().changeBackToReplacedString(m_context.hitTestResult().replacedString()); + frame->editor().changeBackToReplacedString(m_hitTestResult.replacedString()); break; #endif #if USE(AUTOMATIC_TEXT_REPLACEMENT) @@ -503,12 +496,14 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, co frame->editor().toggleAutomaticSpellingCorrection(); break; #endif +#if ENABLE(INSPECTOR) case ContextMenuItemTagInspectElement: if (Page* page = frame->page()) - page->inspectorController().inspect(m_context.hitTestResult().innerNonSharedNode()); + page->inspectorController().inspect(m_hitTestResult.innerNonSharedNode()); break; +#endif case ContextMenuItemTagDictationAlternative: - frame->editor().applyDictationAlternativelternative(title); + frame->editor().applyDictationAlternativelternative(item->title()); break; default: break; @@ -526,26 +521,26 @@ void ContextMenuController::createAndAppendFontSubMenu(ContextMenuItem& fontMenu { ContextMenu fontMenu; -#if PLATFORM(COCOA) +#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(COCOA) +#if PLATFORM(MAC) ContextMenuItem styles(ActionType, ContextMenuItemTagStyles, contextMenuItemTagStyles()); ContextMenuItem showColors(ActionType, ContextMenuItemTagShowColors, contextMenuItemTagShowColors()); #endif -#if PLATFORM(COCOA) +#if PLATFORM(MAC) appendItem(showFonts, &fontMenu); #endif appendItem(bold, &fontMenu); appendItem(italic, &fontMenu); appendItem(underline, &fontMenu); appendItem(outline, &fontMenu); -#if PLATFORM(COCOA) +#if PLATFORM(MAC) appendItem(styles, &fontMenu); appendItem(*separatorItem(), &fontMenu); appendItem(showColors, &fontMenu); @@ -569,19 +564,19 @@ void ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenu contextMenuItemTagCheckSpellingWhileTyping()); ContextMenuItem grammarWithSpelling(CheckableActionType, ContextMenuItemTagCheckGrammarWithSpelling, contextMenuItemTagCheckGrammarWithSpelling()); -#if PLATFORM(COCOA) +#if PLATFORM(MAC) ContextMenuItem correctSpelling(CheckableActionType, ContextMenuItemTagCorrectSpellingAutomatically, contextMenuItemTagCorrectSpellingAutomatically()); #endif appendItem(showSpellingPanel, &spellingAndGrammarMenu); appendItem(checkSpelling, &spellingAndGrammarMenu); -#if PLATFORM(COCOA) +#if PLATFORM(MAC) appendItem(*separatorItem(), &spellingAndGrammarMenu); #endif appendItem(checkAsYouType, &spellingAndGrammarMenu); appendItem(grammarWithSpelling, &spellingAndGrammarMenu); -#if PLATFORM(COCOA) +#if PLATFORM(MAC) appendItem(correctSpelling, &spellingAndGrammarMenu); #endif @@ -591,7 +586,7 @@ void ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenu #endif // !PLATFORM(GTK) -#if PLATFORM(COCOA) +#if PLATFORM(MAC) void ContextMenuController::createAndAppendSpeechSubMenu(ContextMenuItem& speechMenuItem) { @@ -674,7 +669,7 @@ void ContextMenuController::createAndAppendTextDirectionSubMenu(ContextMenuItem& #endif -#if PLATFORM(COCOA) +#if PLATFORM(MAC) void ContextMenuController::createAndAppendSubstitutionsSubMenu(ContextMenuItem& substitutionsMenuItem) { @@ -715,13 +710,26 @@ void ContextMenuController::createAndAppendTransformationsSubMenu(ContextMenuIte #endif -#if PLATFORM(COCOA) +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(); + for (int i = 0; i < length; ++i) { + if (!(U_GET_GC_MASK(it.characterAt(i)) & U_GC_Z_MASK)) + return true; + } + } + return false; +} + +#if PLATFORM(MAC) #define SUPPORTS_TOGGLE_VIDEO_FULLSCREEN 1 #else #define SUPPORTS_TOGGLE_VIDEO_FULLSCREEN 0 #endif -#if PLATFORM(COCOA) +#if PLATFORM(MAC) #define SUPPORTS_TOGGLE_SHOW_HIDE_MEDIA_CONTROLS 1 #else #define SUPPORTS_TOGGLE_SHOW_HIDE_MEDIA_CONTROLS 0 @@ -766,7 +774,7 @@ void ContextMenuController::populate() contextMenuItemTagEnterVideoFullscreen()); ContextMenuItem ToggleVideoFullscreen(ActionType, ContextMenuItemTagToggleVideoFullscreen, contextMenuItemTagEnterVideoFullscreen()); -#if PLATFORM(COCOA) +#if PLATFORM(MAC) ContextMenuItem SearchSpotlightItem(ActionType, ContextMenuItemTagSearchInSpotlight, contextMenuItemTagSearchInSpotlight()); #endif @@ -797,35 +805,20 @@ void ContextMenuController::populate() ContextMenuItem SelectAllItem(ActionType, ContextMenuItemTagSelectAll, contextMenuItemTagSelectAll()); #endif -#if PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN) - ContextMenuItem ShareMenuItem; -#else - ContextMenuItem ShareMenuItem(SubmenuType, ContextMenuItemTagShareMenu, emptyString()); -#endif - - Node* node = m_context.hitTestResult().innerNonSharedNode(); + Node* node = m_hitTestResult.innerNonSharedNode(); if (!node) return; #if PLATFORM(GTK) - if (!m_context.hitTestResult().isContentEditable() && is<HTMLFormControlElement>(*node)) + if (!m_hitTestResult.isContentEditable() && (node->isElementNode() && toElement(node)->isFormControlElement())) return; #endif Frame* frame = node->document().frame(); if (!frame) return; -#if ENABLE(SERVICE_CONTROLS) - // The default image control menu gets populated solely by the platform. - if (m_context.controlledImage()) - return; -#endif - - if (!m_context.hitTestResult().isContentEditable()) { - String selectedString = m_context.hitTestResult().selectedText(); - m_context.setSelectedText(selectedString); - + if (!m_hitTestResult.isContentEditable()) { FrameLoader& loader = frame->loader(); - URL linkURL = m_context.hitTestResult().absoluteLinkURL(); + URL linkURL = m_hitTestResult.absoluteLinkURL(); if (!linkURL.isEmpty()) { if (loader.client().canHandleRequest(ResourceRequest(linkURL))) { appendItem(OpenLinkItem, m_contextMenu.get()); @@ -835,21 +828,21 @@ void ContextMenuController::populate() appendItem(CopyLinkItem, m_contextMenu.get()); } - URL imageURL = m_context.hitTestResult().absoluteImageURL(); + URL 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_context.hitTestResult().image()) + if (imageURL.isLocalFile() || m_hitTestResult.image()) appendItem(CopyImageItem, m_contextMenu.get()); #if PLATFORM(GTK) || PLATFORM(EFL) appendItem(CopyImageUrlItem, m_contextMenu.get()); #endif } - URL mediaURL = m_context.hitTestResult().absoluteMediaURL(); + URL mediaURL = m_hitTestResult.absoluteMediaURL(); if (!mediaURL.isEmpty()) { if (!linkURL.isEmpty() || !imageURL.isEmpty()) appendItem(*separatorItem(), m_contextMenu.get()); @@ -866,14 +859,15 @@ void ContextMenuController::populate() appendItem(*separatorItem(), m_contextMenu.get()); appendItem(CopyMediaLinkItem, m_contextMenu.get()); appendItem(OpenMediaInNewWindowItem, m_contextMenu.get()); - if (m_context.hitTestResult().isDownloadableMedia() && loader.client().canHandleRequest(ResourceRequest(mediaURL))) + if (loader.client().canHandleRequest(ResourceRequest(mediaURL))) appendItem(DownloadMediaItem, m_contextMenu.get()); } if (imageURL.isEmpty() && linkURL.isEmpty() && mediaURL.isEmpty()) { - if (m_context.hitTestResult().isSelected()) { - if (!selectedString.isEmpty()) { -#if PLATFORM(COCOA) + if (m_hitTestResult.isSelected()) { + if (selectionContainsPossibleWord(frame)) { +#if PLATFORM(MAC) + String selectedString = frame->displayStringModifiedByEncoding(frame->editor().selectedText()); ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString)); appendItem(LookUpInDictionaryItem, m_contextMenu.get()); @@ -886,10 +880,7 @@ void ContextMenuController::populate() } appendItem(CopyItem, m_contextMenu.get()); -#if PLATFORM(COCOA) - appendItem(*separatorItem(), m_contextMenu.get()); - - appendItem(ShareMenuItem, m_contextMenu.get()); +#if PLATFORM(MAC) appendItem(*separatorItem(), m_contextMenu.get()); ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu()); @@ -897,7 +888,9 @@ void ContextMenuController::populate() appendItem(SpeechMenuItem, m_contextMenu.get()); #endif } else { - if (!(frame->page() && (frame->page()->inspectorController().inspectionLevel() > 0 || frame->page()->inspectorController().hasRemoteFrontend()))) { +#if ENABLE(INSPECTOR) + if (!(frame->page() && (frame->page()->inspectorController().hasInspectorFrontendClient() || frame->page()->inspectorController().hasRemoteFrontend()))) { +#endif // In GTK+ unavailable items are not hidden but insensitive. #if PLATFORM(GTK) @@ -919,22 +912,16 @@ void ContextMenuController::populate() else appendItem(ReloadItem, m_contextMenu.get()); #endif +#if ENABLE(INSPECTOR) } +#endif if (frame->page() && !frame->isMainFrame()) appendItem(OpenFrameItem, m_contextMenu.get()); - - if (!ShareMenuItem.isNull()) { - appendItem(*separatorItem(), m_contextMenu.get()); - appendItem(ShareMenuItem, m_contextMenu.get()); - } } - } else if (!ShareMenuItem.isNull()) { - appendItem(*separatorItem(), m_contextMenu.get()); - appendItem(ShareMenuItem, m_contextMenu.get()); } } else { // Make an editing context menu - bool inPasswordField = frame->selection().selection().isInPasswordField(); + bool inPasswordField = frame->selection().isInPasswordField(); if (!inPasswordField) { bool haveContextMenuItemsForMisspellingOrGrammer = false; bool spellCheckingEnabled = frame->editor().isSpellCheckingEnabledFor(node); @@ -945,7 +932,8 @@ void ContextMenuController::populate() bool badGrammar; Vector<String> guesses = frame->editor().guessesForMisspelledOrUngrammatical(misspelling, badGrammar); if (misspelling || badGrammar) { - if (guesses.isEmpty()) { + size_t size = guesses.size(); + if (!size) { // 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) { @@ -953,7 +941,8 @@ void ContextMenuController::populate() appendItem(*separatorItem(), m_contextMenu.get()); } } else { - for (const auto& guess : guesses) { + 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()); @@ -968,10 +957,10 @@ void ContextMenuController::populate() appendItem(IgnoreGrammarItem, m_contextMenu.get()); appendItem(*separatorItem(), m_contextMenu.get()); haveContextMenuItemsForMisspellingOrGrammer = true; -#if PLATFORM(COCOA) +#if PLATFORM(MAC) } else { // If the string was autocorrected, generate a contextual menu item allowing it to be changed back. - String replacedString = m_context.hitTestResult().replacedString(); + String replacedString = m_hitTestResult.replacedString(); if (!replacedString.isEmpty()) { ContextMenuItem item(ActionType, ContextMenuItemTagChangeBack, contextMenuItemTagChangeBack(replacedString)); appendItem(item, m_contextMenu.get()); @@ -984,10 +973,10 @@ void ContextMenuController::populate() if (!haveContextMenuItemsForMisspellingOrGrammer) { // Spelling and grammar checking is mutually exclusive with dictation alternatives. - Vector<String> dictationAlternatives = m_context.hitTestResult().dictationAlternatives(); + Vector<String> dictationAlternatives = m_hitTestResult.dictationAlternatives(); if (!dictationAlternatives.isEmpty()) { - for (auto& alternative : dictationAlternatives) { - ContextMenuItem item(ActionType, ContextMenuItemTagDictationAlternative, alternative); + for (size_t i = 0; i < dictationAlternatives.size(); ++i) { + ContextMenuItem item(ActionType, ContextMenuItemTagDictationAlternative, dictationAlternatives[i]); appendItem(item, m_contextMenu.get()); } appendItem(*separatorItem(), m_contextMenu.get()); @@ -996,7 +985,7 @@ void ContextMenuController::populate() } FrameLoader& loader = frame->loader(); - URL linkURL = m_context.hitTestResult().absoluteLinkURL(); + URL linkURL = m_hitTestResult.absoluteLinkURL(); if (!linkURL.isEmpty()) { if (loader.client().canHandleRequest(ResourceRequest(linkURL))) { appendItem(OpenLinkItem, m_contextMenu.get()); @@ -1007,10 +996,10 @@ void ContextMenuController::populate() appendItem(*separatorItem(), m_contextMenu.get()); } - String selectedText = m_context.hitTestResult().selectedText(); - if (m_context.hitTestResult().isSelected() && !inPasswordField && !selectedText.isEmpty()) { -#if PLATFORM(COCOA) - ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedText)); + if (m_hitTestResult.isSelected() && !inPasswordField && selectionContainsPossibleWord(frame)) { +#if PLATFORM(MAC) + String selectedString = frame->displayStringModifiedByEncoding(frame->editor().selectedText()); + ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString)); appendItem(LookUpInDictionaryItem, m_contextMenu.get()); #endif @@ -1040,7 +1029,7 @@ void ContextMenuController::populate() createAndAppendSpellingAndGrammarSubMenu(SpellingAndGrammarMenuItem); appendItem(SpellingAndGrammarMenuItem, m_contextMenu.get()); #endif -#if PLATFORM(COCOA) +#if PLATFORM(MAC) ContextMenuItem substitutionsMenuItem(SubmenuType, ContextMenuItemTagSubstitutionsMenu, contextMenuItemTagSubstitutionsMenu()); createAndAppendSubstitutionsSubMenu(substitutionsMenuItem); @@ -1061,7 +1050,7 @@ void ContextMenuController::populate() createAndAppendFontSubMenu(FontMenuItem); appendItem(FontMenuItem, m_contextMenu.get()); } -#if PLATFORM(COCOA) +#if PLATFORM(MAC) ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu()); createAndAppendSpeechSubMenu(SpeechMenuItem); appendItem(SpeechMenuItem, m_contextMenu.get()); @@ -1090,17 +1079,13 @@ void ContextMenuController::populate() } #endif } - - if (!ShareMenuItem.isNull()) { - appendItem(*separatorItem(), m_contextMenu.get()); - appendItem(ShareMenuItem, m_contextMenu.get()); - } } } +#if ENABLE(INSPECTOR) void ContextMenuController::addInspectElementItem() { - Node* node = m_context.hitTestResult().innerNonSharedNode(); + Node* node = m_hitTestResult.innerNonSharedNode(); if (!node) return; @@ -1113,17 +1098,22 @@ void ContextMenuController::addInspectElementItem() return; ContextMenuItem InspectElementItem(ActionType, ContextMenuItemTagInspectElement, contextMenuItemTagInspectElement()); +#if USE(CROSS_PLATFORM_CONTEXT_MENUS) if (m_contextMenu && !m_contextMenu->items().isEmpty()) +#else + if (m_contextMenu && m_contextMenu->itemCount()) +#endif 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_context.hitTestResult().innerNonSharedNode()->document().frame(); + Frame* frame = m_hitTestResult.innerNonSharedNode()->document().frame(); if (!frame) return; @@ -1243,7 +1233,7 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const case ContextMenuItemTagCheckSpellingWhileTyping: shouldCheck = frame->editor().isContinuousSpellCheckingEnabled(); break; -#if PLATFORM(COCOA) +#if PLATFORM(MAC) case ContextMenuItemTagSubstitutionsMenu: case ContextMenuItemTagTransformationsMenu: break; @@ -1281,7 +1271,7 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const case ContextMenuItemTagStopSpeaking: shouldEnable = m_client.isSpeaking(); break; -#else // PLATFORM(COCOA) ends here +#else // PLATFORM(MAC) ends here case ContextMenuItemTagStopSpeaking: break; #endif @@ -1310,57 +1300,51 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const #endif case ContextMenuItemTagNoAction: case ContextMenuItemTagOpenLinkInNewWindow: + case ContextMenuItemTagOpenLinkInThisWindow: case ContextMenuItemTagDownloadLinkToDisk: case ContextMenuItemTagCopyLinkToClipboard: case ContextMenuItemTagOpenImageInNewWindow: + case ContextMenuItemTagDownloadImageToDisk: case ContextMenuItemTagCopyImageToClipboard: #if PLATFORM(GTK) || PLATFORM(EFL) case ContextMenuItemTagCopyImageUrlToClipboard: #endif break; - case ContextMenuItemTagDownloadImageToDisk: -#if PLATFORM(MAC) - if (WebCore::protocolIs(m_context.hitTestResult().absoluteImageURL(), "file")) - shouldEnable = false; -#endif - break; case ContextMenuItemTagOpenMediaInNewWindow: - if (m_context.hitTestResult().mediaIsVideo()) + if (m_hitTestResult.mediaIsVideo()) item.setTitle(contextMenuItemTagOpenVideoInNewWindow()); else item.setTitle(contextMenuItemTagOpenAudioInNewWindow()); break; case ContextMenuItemTagDownloadMediaToDisk: - if (m_context.hitTestResult().mediaIsVideo()) + if (m_hitTestResult.mediaIsVideo()) item.setTitle(contextMenuItemTagDownloadVideoToDisk()); else item.setTitle(contextMenuItemTagDownloadAudioToDisk()); - if (WebCore::protocolIs(m_context.hitTestResult().absoluteImageURL(), "file")) - shouldEnable = false; break; case ContextMenuItemTagCopyMediaLinkToClipboard: - if (m_context.hitTestResult().mediaIsVideo()) + if (m_hitTestResult.mediaIsVideo()) item.setTitle(contextMenuItemTagCopyVideoLinkToClipboard()); else item.setTitle(contextMenuItemTagCopyAudioLinkToClipboard()); break; case ContextMenuItemTagToggleMediaControls: #if SUPPORTS_TOGGLE_SHOW_HIDE_MEDIA_CONTROLS - item.setTitle(m_context.hitTestResult().mediaControlsEnabled() ? contextMenuItemTagHideMediaControls() : contextMenuItemTagShowMediaControls()); + item.setTitle(m_hitTestResult.mediaControlsEnabled() ? contextMenuItemTagHideMediaControls() : contextMenuItemTagShowMediaControls()); #else - shouldCheck = m_context.hitTestResult().mediaControlsEnabled(); + shouldCheck = m_hitTestResult.mediaControlsEnabled(); #endif break; case ContextMenuItemTagToggleMediaLoop: - shouldCheck = m_context.hitTestResult().mediaLoopEnabled(); + shouldCheck = m_hitTestResult.mediaLoopEnabled(); break; case ContextMenuItemTagToggleVideoFullscreen: #if SUPPORTS_TOGGLE_VIDEO_FULLSCREEN - item.setTitle(m_context.hitTestResult().mediaIsInFullscreen() ? contextMenuItemTagExitVideoFullscreen() : contextMenuItemTagEnterVideoFullscreen()); + item.setTitle(m_hitTestResult.mediaIsInFullscreen() ? contextMenuItemTagExitVideoFullscreen() : contextMenuItemTagEnterVideoFullscreen()); break; #endif case ContextMenuItemTagEnterVideoFullscreen: - shouldEnable = m_context.hitTestResult().mediaSupportsFullscreen(); + shouldEnable = m_hitTestResult.mediaSupportsFullscreen(); break; case ContextMenuItemTagOpenFrameInNewWindow: case ContextMenuItemTagSpellingGuess: @@ -1389,22 +1373,24 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const case ContextMenuItemTagTextDirectionMenu: case ContextMenuItemTagPDFSinglePageScrolling: case ContextMenuItemTagPDFFacingPagesScrolling: +#if ENABLE(INSPECTOR) case ContextMenuItemTagInspectElement: +#endif case ContextMenuItemBaseCustomTag: + case ContextMenuItemCustomTagNoAction: case ContextMenuItemLastCustomTag: case ContextMenuItemBaseApplicationTag: case ContextMenuItemTagDictationAlternative: - case ContextMenuItemTagShareMenu: break; case ContextMenuItemTagMediaPlayPause: - if (m_context.hitTestResult().mediaPlaying()) + if (m_hitTestResult.mediaPlaying()) item.setTitle(contextMenuItemTagMediaPause()); else item.setTitle(contextMenuItemTagMediaPlay()); break; case ContextMenuItemTagMediaMute: - shouldEnable = m_context.hitTestResult().mediaHasAudio(); - shouldCheck = shouldEnable && m_context.hitTestResult().mediaMuted(); + shouldEnable = m_hitTestResult.mediaHasAudio(); + shouldCheck = shouldEnable && m_hitTestResult.mediaMuted(); break; } @@ -1418,7 +1404,7 @@ void ContextMenuController::showContextMenuAt(Frame* frame, const IntPoint& clic clearContextMenu(); // Simulate a click in the middle of the accessibility object. - PlatformMouseEvent mouseEvent(clickPoint, clickPoint, RightButton, PlatformEvent::MousePressed, 1, false, false, false, false, currentTime(), ForceAtClick); + PlatformMouseEvent mouseEvent(clickPoint, clickPoint, RightButton, PlatformEvent::MousePressed, 1, false, false, false, false, currentTime()); frame->eventHandler().handleMousePressEvent(mouseEvent); bool handled = frame->eventHandler().sendContextMenuEvent(mouseEvent); if (handled) @@ -1426,15 +1412,6 @@ void ContextMenuController::showContextMenuAt(Frame* frame, const IntPoint& clic } #endif -#if ENABLE(SERVICE_CONTROLS) -void ContextMenuController::showImageControlsMenu(Event* event) -{ - clearContextMenu(); - handleContextMenuEvent(event); - m_client.showContextMenu(); -} -#endif - } // namespace WebCore #endif // ENABLE(CONTEXT_MENUS) |