summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/ContextMenuController.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/page/ContextMenuController.cpp')
-rw-r--r--Source/WebCore/page/ContextMenuController.cpp466
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