diff options
Diffstat (limited to 'Source/WebCore/page/ContextMenuController.cpp')
-rw-r--r-- | Source/WebCore/page/ContextMenuController.cpp | 466 |
1 files changed, 256 insertions, 210 deletions
diff --git a/Source/WebCore/page/ContextMenuController.cpp b/Source/WebCore/page/ContextMenuController.cpp index 04a06d11d..cb078cd98 100644 --- a/Source/WebCore/page/ContextMenuController.cpp +++ b/Source/WebCore/page/ContextMenuController.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2006-2016 Apple Inc. All rights reserved. * Copyright (C) 2010 Igalia S.L * * Redistribution and use in source and binary forms, with or without @@ -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 COMPUTER, INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE 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 + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE 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 @@ -42,13 +42,12 @@ #include "EditorClient.h" #include "Event.h" #include "EventHandler.h" -#include "EventNames.h" -#include "ExceptionCodePlaceholder.h" #include "FormState.h" #include "FrameLoadRequest.h" #include "FrameLoader.h" #include "FrameLoaderClient.h" #include "FrameSelection.h" +#include "HTMLFormControlElement.h" #include "HTMLFormElement.h" #include "HitTestRequest.h" #include "HitTestResult.h" @@ -60,6 +59,7 @@ #include "Node.h" #include "Page.h" #include "PlatformEvent.h" +#include "RenderImage.h" #include "ReplaceSelectionCommand.h" #include "ResourceRequest.h" #include "Settings.h" @@ -69,7 +69,6 @@ #include "WindowFeatures.h" #include "markup.h" #include <wtf/unicode/CharacterNames.h> -#include <wtf/unicode/Unicode.h> using namespace WTF; using namespace Unicode; @@ -89,15 +88,15 @@ ContextMenuController::~ContextMenuController() void ContextMenuController::clearContextMenu() { - m_contextMenu.clear(); + m_contextMenu = nullptr; if (m_menuProvider) m_menuProvider->contextMenuCleared(); - m_menuProvider = 0; + m_menuProvider = nullptr; } -void ContextMenuController::handleContextMenuEvent(Event* event) +void ContextMenuController::handleContextMenuEvent(Event& event) { - m_contextMenu = createContextMenu(event); + m_contextMenu = maybeCreateContextMenu(event); if (!m_contextMenu) return; @@ -106,175 +105,192 @@ void ContextMenuController::handleContextMenuEvent(Event* event) showContextMenu(event); } -static PassOwnPtr<ContextMenuItem> separatorItem() +static std::unique_ptr<ContextMenuItem> separatorItem() { - return adoptPtr(new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String())); + return std::unique_ptr<ContextMenuItem>(new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String())); } -void ContextMenuController::showContextMenu(Event* event, PassRefPtr<ContextMenuProvider> menuProvider) +void ContextMenuController::showContextMenu(Event& event, ContextMenuProvider& provider) { - m_menuProvider = menuProvider; + m_menuProvider = &provider; - m_contextMenu = createContextMenu(event); + m_contextMenu = maybeCreateContextMenu(event); if (!m_contextMenu) { clearContextMenu(); return; } - m_menuProvider->populateContextMenu(m_contextMenu.get()); - if (m_hitTestResult.isSelected()) { + provider.populateContextMenu(m_contextMenu.get()); + if (m_context.hitTestResult().isSelected()) { appendItem(*separatorItem(), m_contextMenu.get()); populate(); } showContextMenu(event); } -PassOwnPtr<ContextMenu> ContextMenuController::createContextMenu(Event* event) +#if ENABLE(SERVICE_CONTROLS) + +static Image* imageFromImageElementNode(Node& node) { - ASSERT(event); - - if (!event->isMouseEvent()) + auto* renderer = node.renderer(); + if (!is<RenderImage>(renderer)) return nullptr; + auto* image = downcast<RenderImage>(*renderer).cachedImage(); + if (!image || image->errorOccurred()) + return nullptr; + return image->imageForRenderer(renderer); +} - MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); - HitTestResult result(mouseEvent->absoluteLocation()); +#endif + +std::unique_ptr<ContextMenu> ContextMenuController::maybeCreateContextMenu(Event& event) +{ + if (!is<MouseEvent>(event)) + return nullptr; - if (Frame* frame = event->target()->toNode()->document().frame()) - result = frame->eventHandler().hitTestResultAtPoint(mouseEvent->absoluteLocation()); + auto& mouseEvent = downcast<MouseEvent>(event); + auto* node = mouseEvent.target()->toNode(); + if (!node) + return nullptr; + auto* frame = node->document().frame(); + if (!frame) + return nullptr; + auto result = frame->eventHandler().hitTestResultAtPoint(mouseEvent.absoluteLocation()); if (!result.innerNonSharedNode()) return nullptr; - m_hitTestResult = result; + m_context = ContextMenuContext(result); + +#if ENABLE(SERVICE_CONTROLS) + if (node->isImageControlsButtonElement()) { + if (auto* image = imageFromImageElementNode(*result.innerNonSharedNode())) + m_context.setControlledImage(image); - return adoptPtr(new ContextMenu); + // 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::make_unique<ContextMenu>(); } -void ContextMenuController::showContextMenu(Event* event) +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(); + event.setDefaultHandled(); } -static void openNewWindow(const URL& urlToLoad, Frame* frame) +static void openNewWindow(const URL& urlToLoad, Frame& frame, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy) { - Page* oldPage = frame->page(); + Page* oldPage = frame.page(); if (!oldPage) return; - - FrameLoadRequest request(frame->document()->securityOrigin(), ResourceRequest(urlToLoad, frame->loader().outgoingReferrer())); - Page* newPage = oldPage; - newPage = oldPage->chrome().createWindow(frame, request, WindowFeatures(), NavigationAction(request.resourceRequest())); + 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())); if (!newPage) return; newPage->chrome().show(); - newPage->mainFrame().loader().loadFrameRequest(request, false, false, 0, 0, MaybeSendReferrer); + newPage->mainFrame().loader().loadFrameRequest(request, nullptr, nullptr); } #if PLATFORM(GTK) -static void insertUnicodeCharacter(UChar character, Frame* frame) + +static void insertUnicodeCharacter(UChar character, Frame& frame) { String text(&character, 1); - if (!frame->editor().shouldInsertText(text, frame->selection().toNormalizedRange().get(), EditorInsertActionTyped)) + if (!frame.editor().shouldInsertText(text, frame.selection().toNormalizedRange().get(), EditorInsertAction::Typed)) return; - ASSERT(frame->document()); - TypingCommand::insertText(*frame->document(), text, 0, TypingCommand::TextCompositionNone); + ASSERT(frame.document()); + TypingCommand::insertText(*frame.document(), text, 0, TypingCommand::TextCompositionNone); } + #endif -void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) +void ContextMenuController::contextMenuItemSelected(ContextMenuAction action, const String& title) { - ASSERT(item->type() == ActionType || item->type() == CheckableActionType); - - if (item->action() >= ContextMenuItemBaseApplicationTag) { - m_client.contextMenuItemSelected(item, m_contextMenu.get()); - return; - } - - if (item->action() >= ContextMenuItemBaseCustomTag) { + if (action >= ContextMenuItemBaseCustomTag) { ASSERT(m_menuProvider); - m_menuProvider->contextMenuItemSelected(item); + m_menuProvider->contextMenuItemSelected(action, title); return; } - Frame* frame = m_hitTestResult.innerNonSharedNode()->document().frame(); + Frame* frame = m_context.hitTestResult().innerNonSharedNode()->document().frame(); if (!frame) return; - switch (item->action()) { + Ref<Frame> protector(*frame); + + switch (action) { case ContextMenuItemTagOpenLinkInNewWindow: - openNewWindow(m_hitTestResult.absoluteLinkURL(), frame); + openNewWindow(m_context.hitTestResult().absoluteLinkURL(), *frame, ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes); break; case ContextMenuItemTagDownloadLinkToDisk: // FIXME: Some day we should be able to do this from within WebCore. (Bug 117709) - m_client.downloadURL(m_hitTestResult.absoluteLinkURL()); + m_client.downloadURL(m_context.hitTestResult().absoluteLinkURL()); break; case ContextMenuItemTagCopyLinkToClipboard: - frame->editor().copyURL(m_hitTestResult.absoluteLinkURL(), m_hitTestResult.textContent()); + frame->editor().copyURL(m_context.hitTestResult().absoluteLinkURL(), m_context.hitTestResult().textContent()); break; case ContextMenuItemTagOpenImageInNewWindow: - openNewWindow(m_hitTestResult.absoluteImageURL(), frame); + openNewWindow(m_context.hitTestResult().absoluteImageURL(), *frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); break; case ContextMenuItemTagDownloadImageToDisk: // FIXME: Some day we should be able to do this from within WebCore. (Bug 117709) - m_client.downloadURL(m_hitTestResult.absoluteImageURL()); + m_client.downloadURL(m_context.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_hitTestResult); + frame->editor().copyImage(m_context.hitTestResult()); break; -#if PLATFORM(GTK) || PLATFORM(EFL) +#if PLATFORM(GTK) case ContextMenuItemTagCopyImageUrlToClipboard: - frame->editor().copyURL(m_hitTestResult.absoluteImageURL(), m_hitTestResult.textContent()); + frame->editor().copyURL(m_context.hitTestResult().absoluteImageURL(), m_context.hitTestResult().textContent()); break; #endif case ContextMenuItemTagOpenMediaInNewWindow: - openNewWindow(m_hitTestResult.absoluteMediaURL(), frame); + openNewWindow(m_context.hitTestResult().absoluteMediaURL(), *frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); break; case ContextMenuItemTagDownloadMediaToDisk: // FIXME: Some day we should be able to do this from within WebCore. (Bug 117709) - m_client.downloadURL(m_hitTestResult.absoluteMediaURL()); + m_client.downloadURL(m_context.hitTestResult().absoluteMediaURL()); break; case ContextMenuItemTagCopyMediaLinkToClipboard: - frame->editor().copyURL(m_hitTestResult.absoluteMediaURL(), m_hitTestResult.textContent()); + frame->editor().copyURL(m_context.hitTestResult().absoluteMediaURL(), m_context.hitTestResult().textContent()); break; case ContextMenuItemTagToggleMediaControls: - m_hitTestResult.toggleMediaControlsDisplay(); + m_context.hitTestResult().toggleMediaControlsDisplay(); break; case ContextMenuItemTagToggleMediaLoop: - m_hitTestResult.toggleMediaLoopPlayback(); + m_context.hitTestResult().toggleMediaLoopPlayback(); break; case ContextMenuItemTagToggleVideoFullscreen: - m_hitTestResult.toggleMediaFullscreenState(); + m_context.hitTestResult().toggleMediaFullscreenState(); break; case ContextMenuItemTagEnterVideoFullscreen: - m_hitTestResult.enterFullscreenForVideo(); + m_context.hitTestResult().enterFullscreenForVideo(); break; case ContextMenuItemTagMediaPlayPause: - m_hitTestResult.toggleMediaPlayState(); + m_context.hitTestResult().toggleMediaPlayState(); break; case ContextMenuItemTagMediaMute: - m_hitTestResult.toggleMediaMuteState(); + m_context.hitTestResult().toggleMediaMuteState(); + break; + case ContextMenuItemTagToggleVideoEnhancedFullscreen: + m_context.hitTestResult().toggleEnhancedFullscreenForVideo(); break; case ContextMenuItemTagOpenFrameInNewWindow: { DocumentLoader* loader = frame->loader().documentLoader(); if (!loader->unreachableURL().isEmpty()) - openNewWindow(loader->unreachableURL(), frame); + openNewWindow(loader->unreachableURL(), *frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); else - openNewWindow(loader->url(), frame); + openNewWindow(loader->url(), *frame, ShouldOpenExternalURLsPolicy::ShouldNotAllow); break; } case ContextMenuItemTagCopy: @@ -305,51 +321,51 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) frame->editor().performDelete(); break; case ContextMenuItemTagUnicodeInsertLRMMark: - insertUnicodeCharacter(leftToRightMark, frame); + insertUnicodeCharacter(leftToRightMark, *frame); break; case ContextMenuItemTagUnicodeInsertRLMMark: - insertUnicodeCharacter(rightToLeftMark, frame); + insertUnicodeCharacter(rightToLeftMark, *frame); break; case ContextMenuItemTagUnicodeInsertLREMark: - insertUnicodeCharacter(leftToRightEmbed, frame); + insertUnicodeCharacter(leftToRightEmbed, *frame); break; case ContextMenuItemTagUnicodeInsertRLEMark: - insertUnicodeCharacter(rightToLeftEmbed, frame); + insertUnicodeCharacter(rightToLeftEmbed, *frame); break; case ContextMenuItemTagUnicodeInsertLROMark: - insertUnicodeCharacter(leftToRightOverride, frame); + insertUnicodeCharacter(leftToRightOverride, *frame); break; case ContextMenuItemTagUnicodeInsertRLOMark: - insertUnicodeCharacter(rightToLeftOverride, frame); + insertUnicodeCharacter(rightToLeftOverride, *frame); break; case ContextMenuItemTagUnicodeInsertPDFMark: - insertUnicodeCharacter(popDirectionalFormatting, frame); + insertUnicodeCharacter(popDirectionalFormatting, *frame); break; case ContextMenuItemTagUnicodeInsertZWSMark: - insertUnicodeCharacter(zeroWidthSpace, frame); + insertUnicodeCharacter(zeroWidthSpace, *frame); break; case ContextMenuItemTagUnicodeInsertZWJMark: - insertUnicodeCharacter(zeroWidthJoiner, frame); + insertUnicodeCharacter(zeroWidthJoiner, *frame); break; case ContextMenuItemTagUnicodeInsertZWNJMark: - insertUnicodeCharacter(zeroWidthNonJoiner, frame); + insertUnicodeCharacter(zeroWidthNonJoiner, *frame); break; #endif -#if PLATFORM(GTK) || PLATFORM(EFL) +#if PLATFORM(GTK) case ContextMenuItemTagSelectAll: frame->editor().command("SelectAll").execute(); break; #endif case ContextMenuItemTagSpellingGuess: { - FrameSelection& frameSelection = frame->selection(); - if (frame->editor().shouldInsertText(item->title(), frameSelection.toNormalizedRange().get(), EditorInsertActionPasted)) { + VisibleSelection selection = frame->selection().selection(); + if (frame->editor().shouldInsertText(title, selection.toNormalizedRange().get(), EditorInsertAction::Pasted)) { ReplaceSelectionCommand::CommandOptions replaceOptions = ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting; if (frame->editor().behavior().shouldAllowSpellingSuggestionsWithoutSelection()) { - ASSERT(frameSelection.isCaretOrRange()); - VisibleSelection wordSelection(frameSelection.base()); + ASSERT(selection.isCaretOrRange()); + VisibleSelection wordSelection(selection.base()); wordSelection.expandUsingGranularity(WordGranularity); - frameSelection.setSelection(wordSelection); + frame->selection().setSelection(wordSelection); } else { ASSERT(frame->editor().selectedText().length()); replaceOptions |= ReplaceSelectionCommand::SelectReplacement; @@ -357,9 +373,9 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) Document* document = frame->document(); ASSERT(document); - RefPtr<ReplaceSelectionCommand> command = ReplaceSelectionCommand::create(*document, createFragmentFromMarkup(*document, item->title(), ""), replaceOptions); + RefPtr<ReplaceSelectionCommand> command = ReplaceSelectionCommand::create(*document, createFragmentFromMarkup(*document, title, emptyString()), replaceOptions); applyCommand(command); - frameSelection.revealSelection(ScrollAlignment::alignToEdgeIfNeeded); + frame->selection().revealSelection(SelectionRevealMode::Reveal, ScrollAlignment::alignToEdgeIfNeeded); } break; } @@ -377,13 +393,10 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) m_client.lookUpInDictionary(frame); break; case ContextMenuItemTagOpenLink: - 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); + 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); else - 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); + openNewWindow(m_context.hitTestResult().absoluteLinkURL(), *frame, ShouldOpenExternalURLsPolicy::ShouldAllow); break; case ContextMenuItemTagBold: frame->editor().command("ToggleBold").execute(); @@ -400,10 +413,11 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) break; case ContextMenuItemTagStartSpeaking: { RefPtr<Range> selectedRange = frame->selection().toNormalizedRange(); - if (!selectedRange || selectedRange->collapsed(IGNORE_EXCEPTION)) { - Document& document = m_hitTestResult.innerNonSharedNode()->document(); + if (!selectedRange || selectedRange->collapsed()) { + auto& document = m_context.hitTestResult().innerNonSharedNode()->document(); selectedRange = document.createRange(); - selectedRange->selectNode(document.documentElement(), IGNORE_EXCEPTION); + if (auto* element = document.documentElement()) + selectedRange->selectNode(*element); } m_client.speak(plainText(selectedRange.get())); break; @@ -429,7 +443,7 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) case ContextMenuItemTagTextDirectionRightToLeft: frame->editor().command("MakeTextWritingDirectionRightToLeft").execute(); break; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) case ContextMenuItemTagSearchInSpotlight: m_client.searchWithSpotlight(); break; @@ -446,7 +460,7 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) case ContextMenuItemTagCheckGrammarWithSpelling: frame->editor().toggleGrammarChecking(); break; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) case ContextMenuItemTagShowFonts: frame->editor().showFontPanel(); break; @@ -468,9 +482,9 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) frame->editor().capitalizeWord(); break; #endif -#if PLATFORM(MAC) +#if PLATFORM(COCOA) case ContextMenuItemTagChangeBack: - frame->editor().changeBackToReplacedString(m_hitTestResult.replacedString()); + frame->editor().changeBackToReplacedString(m_context.hitTestResult().replacedString()); break; #endif #if USE(AUTOMATIC_TEXT_REPLACEMENT) @@ -496,14 +510,12 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) frame->editor().toggleAutomaticSpellingCorrection(); break; #endif -#if ENABLE(INSPECTOR) case ContextMenuItemTagInspectElement: if (Page* page = frame->page()) - page->inspectorController().inspect(m_hitTestResult.innerNonSharedNode()); + page->inspectorController().inspect(m_context.hitTestResult().innerNonSharedNode()); break; -#endif case ContextMenuItemTagDictationAlternative: - frame->editor().applyDictationAlternativelternative(item->title()); + frame->editor().applyDictationAlternativelternative(title); break; default: break; @@ -521,26 +533,26 @@ void ContextMenuController::createAndAppendFontSubMenu(ContextMenuItem& fontMenu { ContextMenu fontMenu; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) 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) +#if PLATFORM(COCOA) ContextMenuItem styles(ActionType, ContextMenuItemTagStyles, contextMenuItemTagStyles()); ContextMenuItem showColors(ActionType, ContextMenuItemTagShowColors, contextMenuItemTagShowColors()); #endif -#if PLATFORM(MAC) +#if PLATFORM(COCOA) appendItem(showFonts, &fontMenu); #endif appendItem(bold, &fontMenu); appendItem(italic, &fontMenu); appendItem(underline, &fontMenu); appendItem(outline, &fontMenu); -#if PLATFORM(MAC) +#if PLATFORM(COCOA) appendItem(styles, &fontMenu); appendItem(*separatorItem(), &fontMenu); appendItem(showColors, &fontMenu); @@ -564,19 +576,19 @@ void ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenu contextMenuItemTagCheckSpellingWhileTyping()); ContextMenuItem grammarWithSpelling(CheckableActionType, ContextMenuItemTagCheckGrammarWithSpelling, contextMenuItemTagCheckGrammarWithSpelling()); -#if PLATFORM(MAC) +#if PLATFORM(COCOA) ContextMenuItem correctSpelling(CheckableActionType, ContextMenuItemTagCorrectSpellingAutomatically, contextMenuItemTagCorrectSpellingAutomatically()); #endif appendItem(showSpellingPanel, &spellingAndGrammarMenu); appendItem(checkSpelling, &spellingAndGrammarMenu); -#if PLATFORM(MAC) +#if PLATFORM(COCOA) appendItem(*separatorItem(), &spellingAndGrammarMenu); #endif appendItem(checkAsYouType, &spellingAndGrammarMenu); appendItem(grammarWithSpelling, &spellingAndGrammarMenu); -#if PLATFORM(MAC) +#if PLATFORM(COCOA) appendItem(correctSpelling, &spellingAndGrammarMenu); #endif @@ -586,7 +598,7 @@ void ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenu #endif // !PLATFORM(GTK) -#if PLATFORM(MAC) +#if PLATFORM(COCOA) void ContextMenuController::createAndAppendSpeechSubMenu(ContextMenuItem& speechMenuItem) { @@ -669,7 +681,7 @@ void ContextMenuController::createAndAppendTextDirectionSubMenu(ContextMenuItem& #endif -#if PLATFORM(MAC) +#if PLATFORM(COCOA) void ContextMenuController::createAndAppendSubstitutionsSubMenu(ContextMenuItem& substitutionsMenuItem) { @@ -710,26 +722,13 @@ void ContextMenuController::createAndAppendTransformationsSubMenu(ContextMenuIte #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(); - 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) +#if PLATFORM(COCOA) #define SUPPORTS_TOGGLE_VIDEO_FULLSCREEN 1 #else #define SUPPORTS_TOGGLE_VIDEO_FULLSCREEN 0 #endif -#if PLATFORM(MAC) +#if PLATFORM(COCOA) #define SUPPORTS_TOGGLE_SHOW_HIDE_MEDIA_CONTROLS 1 #else #define SUPPORTS_TOGGLE_SHOW_HIDE_MEDIA_CONTROLS 0 @@ -750,7 +749,7 @@ void ContextMenuController::populate() contextMenuItemTagDownloadImageToDisk()); ContextMenuItem CopyImageItem(ActionType, ContextMenuItemTagCopyImageToClipboard, contextMenuItemTagCopyImageToClipboard()); -#if PLATFORM(GTK) || PLATFORM(EFL) +#if PLATFORM(GTK) ContextMenuItem CopyImageUrlItem(ActionType, ContextMenuItemTagCopyImageUrlToClipboard, contextMenuItemTagCopyImageUrlToClipboard()); #endif @@ -774,7 +773,10 @@ void ContextMenuController::populate() contextMenuItemTagEnterVideoFullscreen()); ContextMenuItem ToggleVideoFullscreen(ActionType, ContextMenuItemTagToggleVideoFullscreen, contextMenuItemTagEnterVideoFullscreen()); -#if PLATFORM(MAC) +#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE) + ContextMenuItem ToggleVideoEnhancedFullscreen(ActionType, ContextMenuItemTagToggleVideoEnhancedFullscreen, contextMenuItemTagEnterVideoEnhancedFullscreen()); +#endif +#if PLATFORM(COCOA) ContextMenuItem SearchSpotlightItem(ActionType, ContextMenuItemTagSearchInSpotlight, contextMenuItemTagSearchInSpotlight()); #endif @@ -801,24 +803,39 @@ void ContextMenuController::populate() #if PLATFORM(GTK) ContextMenuItem DeleteItem(ActionType, ContextMenuItemTagDelete, contextMenuItemTagDelete()); #endif -#if PLATFORM(GTK) || PLATFORM(EFL) +#if PLATFORM(GTK) ContextMenuItem SelectAllItem(ActionType, ContextMenuItemTagSelectAll, contextMenuItemTagSelectAll()); #endif - Node* node = m_hitTestResult.innerNonSharedNode(); +#if PLATFORM(GTK) || PLATFORM(WIN) + ContextMenuItem ShareMenuItem; +#else + ContextMenuItem ShareMenuItem(SubmenuType, ContextMenuItemTagShareMenu, emptyString()); +#endif + + Node* node = m_context.hitTestResult().innerNonSharedNode(); if (!node) return; #if PLATFORM(GTK) - if (!m_hitTestResult.isContentEditable() && (node->isElementNode() && toElement(node)->isFormControlElement())) + if (!m_context.hitTestResult().isContentEditable() && is<HTMLFormControlElement>(*node)) return; #endif Frame* frame = node->document().frame(); if (!frame) return; - if (!m_hitTestResult.isContentEditable()) { +#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); + FrameLoader& loader = frame->loader(); - URL linkURL = m_hitTestResult.absoluteLinkURL(); + URL linkURL = m_context.hitTestResult().absoluteLinkURL(); if (!linkURL.isEmpty()) { if (loader.client().canHandleRequest(ResourceRequest(linkURL))) { appendItem(OpenLinkItem, m_contextMenu.get()); @@ -828,21 +845,21 @@ void ContextMenuController::populate() appendItem(CopyLinkItem, m_contextMenu.get()); } - URL imageURL = m_hitTestResult.absoluteImageURL(); + URL imageURL = m_context.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()) + if (imageURL.isLocalFile() || m_context.hitTestResult().image()) appendItem(CopyImageItem, m_contextMenu.get()); -#if PLATFORM(GTK) || PLATFORM(EFL) +#if PLATFORM(GTK) appendItem(CopyImageUrlItem, m_contextMenu.get()); #endif } - URL mediaURL = m_hitTestResult.absoluteMediaURL(); + URL mediaURL = m_context.hitTestResult().absoluteMediaURL(); if (!mediaURL.isEmpty()) { if (!linkURL.isEmpty() || !imageURL.isEmpty()) appendItem(*separatorItem(), m_contextMenu.get()); @@ -856,18 +873,20 @@ void ContextMenuController::populate() #else appendItem(EnterVideoFullscreen, m_contextMenu.get()); #endif +#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE) + appendItem(ToggleVideoEnhancedFullscreen, m_contextMenu.get()); +#endif appendItem(*separatorItem(), m_contextMenu.get()); appendItem(CopyMediaLinkItem, m_contextMenu.get()); appendItem(OpenMediaInNewWindowItem, m_contextMenu.get()); - if (loader.client().canHandleRequest(ResourceRequest(mediaURL))) + if (m_context.hitTestResult().isDownloadableMedia() && loader.client().canHandleRequest(ResourceRequest(mediaURL))) appendItem(DownloadMediaItem, m_contextMenu.get()); } if (imageURL.isEmpty() && linkURL.isEmpty() && mediaURL.isEmpty()) { - if (m_hitTestResult.isSelected()) { - if (selectionContainsPossibleWord(frame)) { -#if PLATFORM(MAC) - String selectedString = frame->displayStringModifiedByEncoding(frame->editor().selectedText()); + if (m_context.hitTestResult().isSelected()) { + if (!selectedString.isEmpty()) { +#if PLATFORM(COCOA) ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString)); appendItem(LookUpInDictionaryItem, m_contextMenu.get()); @@ -880,7 +899,10 @@ void ContextMenuController::populate() } appendItem(CopyItem, m_contextMenu.get()); -#if PLATFORM(MAC) +#if PLATFORM(COCOA) + appendItem(*separatorItem(), m_contextMenu.get()); + + appendItem(ShareMenuItem, m_contextMenu.get()); appendItem(*separatorItem(), m_contextMenu.get()); ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu()); @@ -888,9 +910,7 @@ void ContextMenuController::populate() appendItem(SpeechMenuItem, m_contextMenu.get()); #endif } else { -#if ENABLE(INSPECTOR) - if (!(frame->page() && (frame->page()->inspectorController().hasInspectorFrontendClient() || frame->page()->inspectorController().hasRemoteFrontend()))) { -#endif + if (!(frame->page() && (frame->page()->inspectorController().inspectionLevel() > 0 || frame->page()->inspectorController().hasRemoteFrontend()))) { // In GTK+ unavailable items are not hidden but insensitive. #if PLATFORM(GTK) @@ -912,16 +932,22 @@ 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().isInPasswordField(); + bool inPasswordField = frame->selection().selection().isInPasswordField(); if (!inPasswordField) { bool haveContextMenuItemsForMisspellingOrGrammer = false; bool spellCheckingEnabled = frame->editor().isSpellCheckingEnabledFor(node); @@ -932,8 +958,7 @@ void ContextMenuController::populate() bool badGrammar; Vector<String> guesses = frame->editor().guessesForMisspelledOrUngrammatical(misspelling, badGrammar); if (misspelling || badGrammar) { - size_t size = guesses.size(); - if (!size) { + if (guesses.isEmpty()) { // 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) { @@ -941,8 +966,7 @@ void ContextMenuController::populate() appendItem(*separatorItem(), m_contextMenu.get()); } } else { - for (unsigned i = 0; i < size; i++) { - const String &guess = guesses[i]; + for (const auto& guess : guesses) { if (!guess.isEmpty()) { ContextMenuItem item(ActionType, ContextMenuItemTagSpellingGuess, guess); appendItem(item, m_contextMenu.get()); @@ -957,10 +981,10 @@ void ContextMenuController::populate() appendItem(IgnoreGrammarItem, m_contextMenu.get()); appendItem(*separatorItem(), m_contextMenu.get()); haveContextMenuItemsForMisspellingOrGrammer = true; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) } else { // If the string was autocorrected, generate a contextual menu item allowing it to be changed back. - String replacedString = m_hitTestResult.replacedString(); + String replacedString = m_context.hitTestResult().replacedString(); if (!replacedString.isEmpty()) { ContextMenuItem item(ActionType, ContextMenuItemTagChangeBack, contextMenuItemTagChangeBack(replacedString)); appendItem(item, m_contextMenu.get()); @@ -973,10 +997,10 @@ void ContextMenuController::populate() if (!haveContextMenuItemsForMisspellingOrGrammer) { // Spelling and grammar checking is mutually exclusive with dictation alternatives. - Vector<String> dictationAlternatives = m_hitTestResult.dictationAlternatives(); + Vector<String> dictationAlternatives = m_context.hitTestResult().dictationAlternatives(); if (!dictationAlternatives.isEmpty()) { - for (size_t i = 0; i < dictationAlternatives.size(); ++i) { - ContextMenuItem item(ActionType, ContextMenuItemTagDictationAlternative, dictationAlternatives[i]); + for (auto& alternative : dictationAlternatives) { + ContextMenuItem item(ActionType, ContextMenuItemTagDictationAlternative, alternative); appendItem(item, m_contextMenu.get()); } appendItem(*separatorItem(), m_contextMenu.get()); @@ -985,7 +1009,7 @@ void ContextMenuController::populate() } FrameLoader& loader = frame->loader(); - URL linkURL = m_hitTestResult.absoluteLinkURL(); + URL linkURL = m_context.hitTestResult().absoluteLinkURL(); if (!linkURL.isEmpty()) { if (loader.client().canHandleRequest(ResourceRequest(linkURL))) { appendItem(OpenLinkItem, m_contextMenu.get()); @@ -996,10 +1020,10 @@ void ContextMenuController::populate() appendItem(*separatorItem(), m_contextMenu.get()); } - if (m_hitTestResult.isSelected() && !inPasswordField && selectionContainsPossibleWord(frame)) { -#if PLATFORM(MAC) - String selectedString = frame->displayStringModifiedByEncoding(frame->editor().selectedText()); - ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString)); + String selectedText = m_context.hitTestResult().selectedText(); + if (m_context.hitTestResult().isSelected() && !inPasswordField && !selectedText.isEmpty()) { +#if PLATFORM(COCOA) + ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedText)); appendItem(LookUpInDictionaryItem, m_contextMenu.get()); #endif @@ -1017,7 +1041,7 @@ void ContextMenuController::populate() appendItem(DeleteItem, m_contextMenu.get()); appendItem(*separatorItem(), m_contextMenu.get()); #endif -#if PLATFORM(GTK) || PLATFORM(EFL) +#if PLATFORM(GTK) appendItem(SelectAllItem, m_contextMenu.get()); #endif @@ -1029,7 +1053,7 @@ void ContextMenuController::populate() createAndAppendSpellingAndGrammarSubMenu(SpellingAndGrammarMenuItem); appendItem(SpellingAndGrammarMenuItem, m_contextMenu.get()); #endif -#if PLATFORM(MAC) +#if PLATFORM(COCOA) ContextMenuItem substitutionsMenuItem(SubmenuType, ContextMenuItemTagSubstitutionsMenu, contextMenuItemTagSubstitutionsMenu()); createAndAppendSubstitutionsSubMenu(substitutionsMenuItem); @@ -1050,7 +1074,7 @@ void ContextMenuController::populate() createAndAppendFontSubMenu(FontMenuItem); appendItem(FontMenuItem, m_contextMenu.get()); } -#if PLATFORM(MAC) +#if PLATFORM(COCOA) ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu()); createAndAppendSpeechSubMenu(SpeechMenuItem); appendItem(SpeechMenuItem, m_contextMenu.get()); @@ -1079,13 +1103,17 @@ 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_hitTestResult.innerNonSharedNode(); + Node* node = m_context.hitTestResult().innerNonSharedNode(); if (!node) return; @@ -1098,22 +1126,17 @@ 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_hitTestResult.innerNonSharedNode()->document().frame(); + Frame* frame = m_context.hitTestResult().innerNonSharedNode()->document().frame(); if (!frame) return; @@ -1189,7 +1212,7 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const shouldEnable = true; break; #endif -#if PLATFORM(GTK) || PLATFORM(EFL) +#if PLATFORM(GTK) case ContextMenuItemTagSelectAll: shouldEnable = true; break; @@ -1233,7 +1256,7 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const case ContextMenuItemTagCheckSpellingWhileTyping: shouldCheck = frame->editor().isContinuousSpellCheckingEnabled(); break; -#if PLATFORM(MAC) +#if PLATFORM(COCOA) case ContextMenuItemTagSubstitutionsMenu: case ContextMenuItemTagTransformationsMenu: break; @@ -1271,7 +1294,7 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const case ContextMenuItemTagStopSpeaking: shouldEnable = m_client.isSpeaking(); break; -#else // PLATFORM(MAC) ends here +#else // PLATFORM(COCOA) ends here case ContextMenuItemTagStopSpeaking: break; #endif @@ -1300,51 +1323,63 @@ 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) +#if PLATFORM(GTK) 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_hitTestResult.mediaIsVideo()) + if (m_context.hitTestResult().mediaIsVideo()) item.setTitle(contextMenuItemTagOpenVideoInNewWindow()); else item.setTitle(contextMenuItemTagOpenAudioInNewWindow()); break; case ContextMenuItemTagDownloadMediaToDisk: - if (m_hitTestResult.mediaIsVideo()) + if (m_context.hitTestResult().mediaIsVideo()) item.setTitle(contextMenuItemTagDownloadVideoToDisk()); else item.setTitle(contextMenuItemTagDownloadAudioToDisk()); + if (WebCore::protocolIs(m_context.hitTestResult().absoluteImageURL(), "file")) + shouldEnable = false; break; case ContextMenuItemTagCopyMediaLinkToClipboard: - if (m_hitTestResult.mediaIsVideo()) + if (m_context.hitTestResult().mediaIsVideo()) item.setTitle(contextMenuItemTagCopyVideoLinkToClipboard()); else item.setTitle(contextMenuItemTagCopyAudioLinkToClipboard()); break; case ContextMenuItemTagToggleMediaControls: #if SUPPORTS_TOGGLE_SHOW_HIDE_MEDIA_CONTROLS - item.setTitle(m_hitTestResult.mediaControlsEnabled() ? contextMenuItemTagHideMediaControls() : contextMenuItemTagShowMediaControls()); + item.setTitle(m_context.hitTestResult().mediaControlsEnabled() ? contextMenuItemTagHideMediaControls() : contextMenuItemTagShowMediaControls()); #else - shouldCheck = m_hitTestResult.mediaControlsEnabled(); + shouldCheck = m_context.hitTestResult().mediaControlsEnabled(); #endif break; case ContextMenuItemTagToggleMediaLoop: - shouldCheck = m_hitTestResult.mediaLoopEnabled(); + shouldCheck = m_context.hitTestResult().mediaLoopEnabled(); break; case ContextMenuItemTagToggleVideoFullscreen: #if SUPPORTS_TOGGLE_VIDEO_FULLSCREEN - item.setTitle(m_hitTestResult.mediaIsInFullscreen() ? contextMenuItemTagExitVideoFullscreen() : contextMenuItemTagEnterVideoFullscreen()); + item.setTitle(m_context.hitTestResult().mediaIsInFullscreen() ? contextMenuItemTagExitVideoFullscreen() : contextMenuItemTagEnterVideoFullscreen()); break; #endif case ContextMenuItemTagEnterVideoFullscreen: - shouldEnable = m_hitTestResult.mediaSupportsFullscreen(); + shouldEnable = m_context.hitTestResult().mediaSupportsFullscreen(); + break; + case ContextMenuItemTagToggleVideoEnhancedFullscreen: +#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE) + item.setTitle(m_context.hitTestResult().mediaIsInEnhancedFullscreen() ? contextMenuItemTagExitVideoEnhancedFullscreen() : contextMenuItemTagEnterVideoEnhancedFullscreen()); +#endif + shouldEnable = m_context.hitTestResult().mediaSupportsEnhancedFullscreen(); break; case ContextMenuItemTagOpenFrameInNewWindow: case ContextMenuItemTagSpellingGuess: @@ -1373,24 +1408,22 @@ 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_hitTestResult.mediaPlaying()) + if (m_context.hitTestResult().mediaPlaying()) item.setTitle(contextMenuItemTagMediaPause()); else item.setTitle(contextMenuItemTagMediaPlay()); break; case ContextMenuItemTagMediaMute: - shouldEnable = m_hitTestResult.mediaHasAudio(); - shouldCheck = shouldEnable && m_hitTestResult.mediaMuted(); + shouldEnable = m_context.hitTestResult().mediaHasAudio(); + shouldCheck = shouldEnable && m_context.hitTestResult().mediaMuted(); break; } @@ -1399,17 +1432,30 @@ void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const } #if USE(ACCESSIBILITY_CONTEXT_MENUS) -void ContextMenuController::showContextMenuAt(Frame* frame, const IntPoint& clickPoint) + +void ContextMenuController::showContextMenuAt(Frame& frame, const IntPoint& clickPoint) { clearContextMenu(); // Simulate a click in the middle of the accessibility object. - PlatformMouseEvent mouseEvent(clickPoint, clickPoint, RightButton, PlatformEvent::MousePressed, 1, false, false, false, false, currentTime()); - frame->eventHandler().handleMousePressEvent(mouseEvent); - bool handled = frame->eventHandler().sendContextMenuEvent(mouseEvent); + PlatformMouseEvent mouseEvent(clickPoint, clickPoint, RightButton, PlatformEvent::MousePressed, 1, false, false, false, false, currentTime(), ForceAtClick, NoTap); + frame.eventHandler().handleMousePressEvent(mouseEvent); + bool handled = frame.eventHandler().sendContextMenuEvent(mouseEvent); if (handled) m_client.showContextMenu(); } + +#endif + +#if ENABLE(SERVICE_CONTROLS) + +void ContextMenuController::showImageControlsMenu(Event& event) +{ + clearContextMenu(); + handleContextMenuEvent(event); + m_client.showContextMenu(); +} + #endif } // namespace WebCore |