2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2010 Igalia S.L
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "ContextMenuController.h"
30 #if ENABLE(CONTEXT_MENUS)
32 #include "BackForwardController.h"
34 #include "ContextMenu.h"
35 #include "ContextMenuClient.h"
36 #include "ContextMenuItem.h"
37 #include "ContextMenuProvider.h"
39 #include "DocumentFragment.h"
40 #include "DocumentLoader.h"
42 #include "EditorClient.h"
44 #include "EventHandler.h"
45 #include "EventNames.h"
46 #include "FormState.h"
48 #include "FrameLoadRequest.h"
49 #include "FrameLoader.h"
50 #include "FrameLoaderClient.h"
51 #include "FrameSelection.h"
52 #include "HTMLFormElement.h"
53 #include "HitTestRequest.h"
54 #include "HitTestResult.h"
55 #include "InspectorController.h"
56 #include "LocalizedStrings.h"
57 #include "MouseEvent.h"
58 #include "NavigationAction.h"
61 #include "RenderLayer.h"
62 #include "RenderObject.h"
63 #include "ReplaceSelectionCommand.h"
64 #include "ResourceRequest.h"
66 #include "TextIterator.h"
67 #include "UserTypingGestureIndicator.h"
68 #include "WindowFeatures.h"
70 #include <wtf/unicode/Unicode.h>
73 using namespace Unicode;
77 ContextMenuController::ContextMenuController(Page* page, ContextMenuClient* client)
81 ASSERT_ARG(page, page);
82 ASSERT_ARG(client, client);
85 ContextMenuController::~ContextMenuController()
87 m_client->contextMenuDestroyed();
90 void ContextMenuController::clearContextMenu()
92 m_contextMenu.clear();
94 m_menuProvider->contextMenuCleared();
98 void ContextMenuController::handleContextMenuEvent(Event* event)
100 m_contextMenu = createContextMenu(event);
106 showContextMenu(event);
109 void ContextMenuController::showContextMenu(Event* event, PassRefPtr<ContextMenuProvider> menuProvider)
111 m_menuProvider = menuProvider;
113 m_contextMenu = createContextMenu(event);
114 if (!m_contextMenu) {
119 m_menuProvider->populateContextMenu(m_contextMenu.get());
120 showContextMenu(event);
123 PassOwnPtr<ContextMenu> ContextMenuController::createContextMenu(Event* event)
125 if (!event->isMouseEvent())
128 MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
129 HitTestResult result(mouseEvent->absoluteLocation());
131 if (Frame* frame = event->target()->toNode()->document()->frame())
132 result = frame->eventHandler()->hitTestResultAtPoint(mouseEvent->absoluteLocation(), false);
134 if (!result.innerNonSharedNode())
137 m_hitTestResult = result;
139 return adoptPtr(new ContextMenu);
142 void ContextMenuController::showContextMenu(Event* event)
144 #if ENABLE(INSPECTOR)
145 if (m_page->inspectorController()->enabled())
146 addInspectElementItem();
149 #if USE(CROSS_PLATFORM_CONTEXT_MENUS)
150 m_contextMenu = m_client->customizeMenu(m_contextMenu.release());
152 PlatformMenuDescription customMenu = m_client->getCustomMenuFromDefaultItems(m_contextMenu.get());
153 m_contextMenu->setPlatformDescription(customMenu);
155 event->setDefaultHandled();
158 static void openNewWindow(const KURL& urlToLoad, Frame* frame)
160 if (Page* oldPage = frame->page()) {
161 FrameLoadRequest request(frame->document()->securityOrigin(), ResourceRequest(urlToLoad, frame->loader()->outgoingReferrer()));
162 if (Page* newPage = oldPage->chrome()->createWindow(frame, request, WindowFeatures(), NavigationAction())) {
163 newPage->mainFrame()->loader()->loadFrameRequest(request, false, false, 0, 0, SendReferrer);
164 newPage->chrome()->show();
169 void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
171 ASSERT(item->type() == ActionType || item->type() == CheckableActionType);
173 if (item->action() >= ContextMenuItemBaseApplicationTag) {
174 m_client->contextMenuItemSelected(item, m_contextMenu.get());
178 if (item->action() >= ContextMenuItemBaseCustomTag) {
179 ASSERT(m_menuProvider);
180 m_menuProvider->contextMenuItemSelected(item);
184 Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame();
188 switch (item->action()) {
189 case ContextMenuItemTagOpenLinkInNewWindow:
190 openNewWindow(m_hitTestResult.absoluteLinkURL(), frame);
192 case ContextMenuItemTagDownloadLinkToDisk:
193 // FIXME: Some day we should be able to do this from within WebCore.
194 m_client->downloadURL(m_hitTestResult.absoluteLinkURL());
196 case ContextMenuItemTagCopyLinkToClipboard:
197 frame->editor()->copyURL(m_hitTestResult.absoluteLinkURL(), m_hitTestResult.textContent());
199 case ContextMenuItemTagOpenImageInNewWindow:
200 openNewWindow(m_hitTestResult.absoluteImageURL(), frame);
202 case ContextMenuItemTagDownloadImageToDisk:
203 // FIXME: Some day we should be able to do this from within WebCore.
204 m_client->downloadURL(m_hitTestResult.absoluteImageURL());
206 case ContextMenuItemTagCopyImageToClipboard:
207 // FIXME: The Pasteboard class is not written yet
208 // For now, call into the client. This is temporary!
209 frame->editor()->copyImage(m_hitTestResult);
211 #if PLATFORM(QT) || PLATFORM(GTK)
212 case ContextMenuItemTagCopyImageUrlToClipboard:
213 frame->editor()->copyURL(m_hitTestResult.absoluteImageURL(), m_hitTestResult.textContent());
216 case ContextMenuItemTagOpenMediaInNewWindow:
217 openNewWindow(m_hitTestResult.absoluteMediaURL(), frame);
219 case ContextMenuItemTagCopyMediaLinkToClipboard:
220 frame->editor()->copyURL(m_hitTestResult.absoluteMediaURL(), m_hitTestResult.textContent());
222 case ContextMenuItemTagToggleMediaControls:
223 m_hitTestResult.toggleMediaControlsDisplay();
225 case ContextMenuItemTagToggleMediaLoop:
226 m_hitTestResult.toggleMediaLoopPlayback();
228 case ContextMenuItemTagEnterVideoFullscreen:
229 m_hitTestResult.enterFullscreenForVideo();
231 case ContextMenuItemTagMediaPlayPause:
232 m_hitTestResult.toggleMediaPlayState();
234 case ContextMenuItemTagMediaMute:
235 m_hitTestResult.toggleMediaMuteState();
237 case ContextMenuItemTagOpenFrameInNewWindow: {
238 DocumentLoader* loader = frame->loader()->documentLoader();
239 if (!loader->unreachableURL().isEmpty())
240 openNewWindow(loader->unreachableURL(), frame);
242 openNewWindow(loader->url(), frame);
245 case ContextMenuItemTagCopy:
246 frame->editor()->copy();
248 case ContextMenuItemTagGoBack:
249 if (Page* page = frame->page())
250 page->backForward()->goBackOrForward(-1);
252 case ContextMenuItemTagGoForward:
253 if (Page* page = frame->page())
254 page->backForward()->goBackOrForward(1);
256 case ContextMenuItemTagStop:
257 frame->loader()->stop();
259 case ContextMenuItemTagReload:
260 frame->loader()->reload();
262 case ContextMenuItemTagCut:
263 frame->editor()->command("Cut").execute();
265 case ContextMenuItemTagPaste:
266 frame->editor()->command("Paste").execute();
269 case ContextMenuItemTagDelete:
270 frame->editor()->performDelete();
273 #if PLATFORM(GTK) || PLATFORM(QT)
274 case ContextMenuItemTagSelectAll:
275 frame->editor()->command("SelectAll").execute();
278 case ContextMenuItemTagSpellingGuess:
279 ASSERT(frame->editor()->selectedText().length());
280 if (frame->editor()->shouldInsertText(item->title(), frame->selection()->toNormalizedRange().get(), EditorInsertActionPasted)) {
281 Document* document = frame->document();
282 RefPtr<ReplaceSelectionCommand> command = ReplaceSelectionCommand::create(document, createFragmentFromMarkup(document, item->title(), ""), ReplaceSelectionCommand::SelectReplacement | ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting);
283 applyCommand(command);
284 frame->selection()->revealSelection(ScrollAlignment::alignToEdgeIfNeeded);
287 case ContextMenuItemTagIgnoreSpelling:
288 frame->editor()->ignoreSpelling();
290 case ContextMenuItemTagLearnSpelling:
291 frame->editor()->learnSpelling();
293 case ContextMenuItemTagSearchWeb:
294 m_client->searchWithGoogle(frame);
296 case ContextMenuItemTagLookUpInDictionary:
297 // FIXME: Some day we may be able to do this from within WebCore.
298 m_client->lookUpInDictionary(frame);
300 case ContextMenuItemTagOpenLink:
301 if (Frame* targetFrame = m_hitTestResult.targetFrame())
302 targetFrame->loader()->loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(m_hitTestResult.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0, SendReferrer);
304 openNewWindow(m_hitTestResult.absoluteLinkURL(), frame);
306 case ContextMenuItemTagBold:
307 frame->editor()->command("ToggleBold").execute();
309 case ContextMenuItemTagItalic:
310 frame->editor()->command("ToggleItalic").execute();
312 case ContextMenuItemTagUnderline:
313 frame->editor()->toggleUnderline();
315 case ContextMenuItemTagOutline:
316 // We actually never enable this because CSS does not have a way to specify an outline font,
317 // which may make this difficult to implement. Maybe a special case of text-shadow?
319 case ContextMenuItemTagStartSpeaking: {
321 RefPtr<Range> selectedRange = frame->selection()->toNormalizedRange();
322 if (!selectedRange || selectedRange->collapsed(ec)) {
323 Document* document = m_hitTestResult.innerNonSharedNode()->document();
324 selectedRange = document->createRange();
325 selectedRange->selectNode(document->documentElement(), ec);
327 m_client->speak(plainText(selectedRange.get()));
330 case ContextMenuItemTagStopSpeaking:
331 m_client->stopSpeaking();
333 case ContextMenuItemTagDefaultDirection:
334 frame->editor()->setBaseWritingDirection(NaturalWritingDirection);
336 case ContextMenuItemTagLeftToRight:
337 frame->editor()->setBaseWritingDirection(LeftToRightWritingDirection);
339 case ContextMenuItemTagRightToLeft:
340 frame->editor()->setBaseWritingDirection(RightToLeftWritingDirection);
342 case ContextMenuItemTagTextDirectionDefault:
343 frame->editor()->command("MakeTextWritingDirectionNatural").execute();
345 case ContextMenuItemTagTextDirectionLeftToRight:
346 frame->editor()->command("MakeTextWritingDirectionLeftToRight").execute();
348 case ContextMenuItemTagTextDirectionRightToLeft:
349 frame->editor()->command("MakeTextWritingDirectionRightToLeft").execute();
352 case ContextMenuItemTagSearchInSpotlight:
353 m_client->searchWithSpotlight();
356 case ContextMenuItemTagShowSpellingPanel:
357 frame->editor()->showSpellingGuessPanel();
359 case ContextMenuItemTagCheckSpelling:
360 frame->editor()->advanceToNextMisspelling();
362 case ContextMenuItemTagCheckSpellingWhileTyping:
363 frame->editor()->toggleContinuousSpellChecking();
365 case ContextMenuItemTagCheckGrammarWithSpelling:
366 frame->editor()->toggleGrammarChecking();
369 case ContextMenuItemTagShowFonts:
370 frame->editor()->showFontPanel();
372 case ContextMenuItemTagStyles:
373 frame->editor()->showStylesPanel();
375 case ContextMenuItemTagShowColors:
376 frame->editor()->showColorPanel();
379 #if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
380 case ContextMenuItemTagMakeUpperCase:
381 frame->editor()->uppercaseWord();
383 case ContextMenuItemTagMakeLowerCase:
384 frame->editor()->lowercaseWord();
386 case ContextMenuItemTagCapitalize:
387 frame->editor()->capitalizeWord();
389 case ContextMenuItemTagShowSubstitutions:
390 frame->editor()->showSubstitutionsPanel();
392 case ContextMenuItemTagSmartCopyPaste:
393 frame->editor()->toggleSmartInsertDelete();
395 case ContextMenuItemTagSmartQuotes:
396 frame->editor()->toggleAutomaticQuoteSubstitution();
398 case ContextMenuItemTagSmartDashes:
399 frame->editor()->toggleAutomaticDashSubstitution();
401 case ContextMenuItemTagSmartLinks:
402 frame->editor()->toggleAutomaticLinkDetection();
404 case ContextMenuItemTagTextReplacement:
405 frame->editor()->toggleAutomaticTextReplacement();
407 case ContextMenuItemTagCorrectSpellingAutomatically:
408 frame->editor()->toggleAutomaticSpellingCorrection();
410 case ContextMenuItemTagChangeBack:
411 frame->editor()->changeBackToReplacedString(m_hitTestResult.replacedString());
414 #if ENABLE(INSPECTOR)
415 case ContextMenuItemTagInspectElement:
416 if (Page* page = frame->page())
417 page->inspectorController()->inspect(m_hitTestResult.innerNonSharedNode());
425 void ContextMenuController::appendItem(ContextMenuItem& menuItem, ContextMenu* parentMenu)
427 checkOrEnableIfNeeded(menuItem);
429 parentMenu->appendItem(menuItem);
432 static PassOwnPtr<ContextMenuItem> separatorItem()
434 return adoptPtr(new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String()));
437 void ContextMenuController::createAndAppendFontSubMenu(ContextMenuItem& fontMenuItem)
439 ContextMenu fontMenu;
442 ContextMenuItem showFonts(ActionType, ContextMenuItemTagShowFonts, contextMenuItemTagShowFonts());
444 ContextMenuItem bold(CheckableActionType, ContextMenuItemTagBold, contextMenuItemTagBold());
445 ContextMenuItem italic(CheckableActionType, ContextMenuItemTagItalic, contextMenuItemTagItalic());
446 ContextMenuItem underline(CheckableActionType, ContextMenuItemTagUnderline, contextMenuItemTagUnderline());
447 ContextMenuItem outline(ActionType, ContextMenuItemTagOutline, contextMenuItemTagOutline());
449 ContextMenuItem styles(ActionType, ContextMenuItemTagStyles, contextMenuItemTagStyles());
450 ContextMenuItem showColors(ActionType, ContextMenuItemTagShowColors, contextMenuItemTagShowColors());
454 appendItem(showFonts, &fontMenu);
456 appendItem(bold, &fontMenu);
457 appendItem(italic, &fontMenu);
458 appendItem(underline, &fontMenu);
459 appendItem(outline, &fontMenu);
461 appendItem(styles, &fontMenu);
462 appendItem(*separatorItem(), &fontMenu);
463 appendItem(showColors, &fontMenu);
466 fontMenuItem.setSubMenu(&fontMenu);
472 void ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenuItem& spellingAndGrammarMenuItem)
474 ContextMenu spellingAndGrammarMenu;
476 ContextMenuItem showSpellingPanel(ActionType, ContextMenuItemTagShowSpellingPanel,
477 contextMenuItemTagShowSpellingPanel(true));
478 ContextMenuItem checkSpelling(ActionType, ContextMenuItemTagCheckSpelling,
479 contextMenuItemTagCheckSpelling());
480 ContextMenuItem checkAsYouType(CheckableActionType, ContextMenuItemTagCheckSpellingWhileTyping,
481 contextMenuItemTagCheckSpellingWhileTyping());
482 ContextMenuItem grammarWithSpelling(CheckableActionType, ContextMenuItemTagCheckGrammarWithSpelling,
483 contextMenuItemTagCheckGrammarWithSpelling());
484 #if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
485 ContextMenuItem correctSpelling(CheckableActionType, ContextMenuItemTagCorrectSpellingAutomatically,
486 contextMenuItemTagCorrectSpellingAutomatically());
489 appendItem(showSpellingPanel, &spellingAndGrammarMenu);
490 appendItem(checkSpelling, &spellingAndGrammarMenu);
491 #if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
492 appendItem(*separatorItem(), &spellingAndGrammarMenu);
494 appendItem(checkAsYouType, &spellingAndGrammarMenu);
495 appendItem(grammarWithSpelling, &spellingAndGrammarMenu);
496 #if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
497 appendItem(correctSpelling, &spellingAndGrammarMenu);
500 spellingAndGrammarMenuItem.setSubMenu(&spellingAndGrammarMenu);
503 #endif // !PLATFORM(GTK)
508 void ContextMenuController::createAndAppendSpeechSubMenu(ContextMenuItem& speechMenuItem)
510 ContextMenu speechMenu;
512 ContextMenuItem start(ActionType, ContextMenuItemTagStartSpeaking, contextMenuItemTagStartSpeaking());
513 ContextMenuItem stop(ActionType, ContextMenuItemTagStopSpeaking, contextMenuItemTagStopSpeaking());
515 appendItem(start, &speechMenu);
516 appendItem(stop, &speechMenu);
518 speechMenuItem.setSubMenu(&speechMenu);
525 void ContextMenuController::createAndAppendWritingDirectionSubMenu(ContextMenuItem& writingDirectionMenuItem)
527 ContextMenu writingDirectionMenu;
529 ContextMenuItem defaultItem(ActionType, ContextMenuItemTagDefaultDirection,
530 contextMenuItemTagDefaultDirection());
531 ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagLeftToRight, contextMenuItemTagLeftToRight());
532 ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagRightToLeft, contextMenuItemTagRightToLeft());
534 appendItem(defaultItem, &writingDirectionMenu);
535 appendItem(ltr, &writingDirectionMenu);
536 appendItem(rtl, &writingDirectionMenu);
538 writingDirectionMenuItem.setSubMenu(&writingDirectionMenu);
541 void ContextMenuController::createAndAppendTextDirectionSubMenu(ContextMenuItem& textDirectionMenuItem)
543 ContextMenu textDirectionMenu;
545 ContextMenuItem defaultItem(ActionType, ContextMenuItemTagTextDirectionDefault, contextMenuItemTagDefaultDirection());
546 ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagTextDirectionLeftToRight, contextMenuItemTagLeftToRight());
547 ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagTextDirectionRightToLeft, contextMenuItemTagRightToLeft());
549 appendItem(defaultItem, &textDirectionMenu);
550 appendItem(ltr, &textDirectionMenu);
551 appendItem(rtl, &textDirectionMenu);
553 textDirectionMenuItem.setSubMenu(&textDirectionMenu);
558 #if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
560 void ContextMenuController::createAndAppendSubstitutionsSubMenu(ContextMenuItem& substitutionsMenuItem)
562 ContextMenu substitutionsMenu;
564 ContextMenuItem showSubstitutions(ActionType, ContextMenuItemTagShowSubstitutions, contextMenuItemTagShowSubstitutions(true));
565 ContextMenuItem smartCopyPaste(CheckableActionType, ContextMenuItemTagSmartCopyPaste, contextMenuItemTagSmartCopyPaste());
566 ContextMenuItem smartQuotes(CheckableActionType, ContextMenuItemTagSmartQuotes, contextMenuItemTagSmartQuotes());
567 ContextMenuItem smartDashes(CheckableActionType, ContextMenuItemTagSmartDashes, contextMenuItemTagSmartDashes());
568 ContextMenuItem smartLinks(CheckableActionType, ContextMenuItemTagSmartLinks, contextMenuItemTagSmartLinks());
569 ContextMenuItem textReplacement(CheckableActionType, ContextMenuItemTagTextReplacement, contextMenuItemTagTextReplacement());
571 appendItem(showSubstitutions, &substitutionsMenu);
572 appendItem(*separatorItem(), &substitutionsMenu);
573 appendItem(smartCopyPaste, &substitutionsMenu);
574 appendItem(smartQuotes, &substitutionsMenu);
575 appendItem(smartDashes, &substitutionsMenu);
576 appendItem(smartLinks, &substitutionsMenu);
577 appendItem(textReplacement, &substitutionsMenu);
579 substitutionsMenuItem.setSubMenu(&substitutionsMenu);
582 void ContextMenuController::createAndAppendTransformationsSubMenu(ContextMenuItem& transformationsMenuItem)
584 ContextMenu transformationsMenu;
586 ContextMenuItem makeUpperCase(ActionType, ContextMenuItemTagMakeUpperCase, contextMenuItemTagMakeUpperCase());
587 ContextMenuItem makeLowerCase(ActionType, ContextMenuItemTagMakeLowerCase, contextMenuItemTagMakeLowerCase());
588 ContextMenuItem capitalize(ActionType, ContextMenuItemTagCapitalize, contextMenuItemTagCapitalize());
590 appendItem(makeUpperCase, &transformationsMenu);
591 appendItem(makeLowerCase, &transformationsMenu);
592 appendItem(capitalize, &transformationsMenu);
594 transformationsMenuItem.setSubMenu(&transformationsMenu);
599 static bool selectionContainsPossibleWord(Frame* frame)
601 // Current algorithm: look for a character that's not just a separator.
602 for (TextIterator it(frame->selection()->toNormalizedRange().get()); !it.atEnd(); it.advance()) {
603 int length = it.length();
604 const UChar* characters = it.characters();
605 for (int i = 0; i < length; ++i)
606 if (!(category(characters[i]) & (Separator_Space | Separator_Line | Separator_Paragraph)))
613 #if defined(BUILDING_ON_LEOPARD) || defined(BUILDING_ON_SNOW_LEOPARD)
614 #define INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 1
616 #define INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 0
620 void ContextMenuController::populate()
622 ContextMenuItem OpenLinkItem(ActionType, ContextMenuItemTagOpenLink, contextMenuItemTagOpenLink());
623 ContextMenuItem OpenLinkInNewWindowItem(ActionType, ContextMenuItemTagOpenLinkInNewWindow,
624 contextMenuItemTagOpenLinkInNewWindow());
625 ContextMenuItem DownloadFileItem(ActionType, ContextMenuItemTagDownloadLinkToDisk,
626 contextMenuItemTagDownloadLinkToDisk());
627 ContextMenuItem CopyLinkItem(ActionType, ContextMenuItemTagCopyLinkToClipboard,
628 contextMenuItemTagCopyLinkToClipboard());
629 ContextMenuItem OpenImageInNewWindowItem(ActionType, ContextMenuItemTagOpenImageInNewWindow,
630 contextMenuItemTagOpenImageInNewWindow());
631 ContextMenuItem DownloadImageItem(ActionType, ContextMenuItemTagDownloadImageToDisk,
632 contextMenuItemTagDownloadImageToDisk());
633 ContextMenuItem CopyImageItem(ActionType, ContextMenuItemTagCopyImageToClipboard,
634 contextMenuItemTagCopyImageToClipboard());
635 #if PLATFORM(QT) || PLATFORM(GTK)
636 ContextMenuItem CopyImageUrlItem(ActionType, ContextMenuItemTagCopyImageUrlToClipboard,
637 contextMenuItemTagCopyImageUrlToClipboard());
639 ContextMenuItem OpenMediaInNewWindowItem(ActionType, ContextMenuItemTagOpenMediaInNewWindow, String());
640 ContextMenuItem CopyMediaLinkItem(ActionType, ContextMenuItemTagCopyMediaLinkToClipboard,
642 ContextMenuItem MediaPlayPause(ActionType, ContextMenuItemTagMediaPlayPause,
643 contextMenuItemTagMediaPlay());
644 ContextMenuItem MediaMute(ActionType, ContextMenuItemTagMediaMute,
645 contextMenuItemTagMediaMute());
646 ContextMenuItem ToggleMediaControls(CheckableActionType, ContextMenuItemTagToggleMediaControls,
647 contextMenuItemTagToggleMediaControls());
648 ContextMenuItem ToggleMediaLoop(CheckableActionType, ContextMenuItemTagToggleMediaLoop,
649 contextMenuItemTagToggleMediaLoop());
650 ContextMenuItem EnterVideoFullscreen(ActionType, ContextMenuItemTagEnterVideoFullscreen,
651 contextMenuItemTagEnterVideoFullscreen());
653 ContextMenuItem SearchSpotlightItem(ActionType, ContextMenuItemTagSearchInSpotlight,
654 contextMenuItemTagSearchInSpotlight());
657 ContextMenuItem SearchWebItem(ActionType, ContextMenuItemTagSearchWeb, contextMenuItemTagSearchWeb());
659 ContextMenuItem CopyItem(ActionType, ContextMenuItemTagCopy, contextMenuItemTagCopy());
660 ContextMenuItem BackItem(ActionType, ContextMenuItemTagGoBack, contextMenuItemTagGoBack());
661 ContextMenuItem ForwardItem(ActionType, ContextMenuItemTagGoForward, contextMenuItemTagGoForward());
662 ContextMenuItem StopItem(ActionType, ContextMenuItemTagStop, contextMenuItemTagStop());
663 ContextMenuItem ReloadItem(ActionType, ContextMenuItemTagReload, contextMenuItemTagReload());
664 ContextMenuItem OpenFrameItem(ActionType, ContextMenuItemTagOpenFrameInNewWindow,
665 contextMenuItemTagOpenFrameInNewWindow());
666 ContextMenuItem NoGuessesItem(ActionType, ContextMenuItemTagNoGuessesFound,
667 contextMenuItemTagNoGuessesFound());
668 ContextMenuItem IgnoreSpellingItem(ActionType, ContextMenuItemTagIgnoreSpelling,
669 contextMenuItemTagIgnoreSpelling());
670 ContextMenuItem LearnSpellingItem(ActionType, ContextMenuItemTagLearnSpelling,
671 contextMenuItemTagLearnSpelling());
672 ContextMenuItem IgnoreGrammarItem(ActionType, ContextMenuItemTagIgnoreGrammar,
673 contextMenuItemTagIgnoreGrammar());
674 ContextMenuItem CutItem(ActionType, ContextMenuItemTagCut, contextMenuItemTagCut());
675 ContextMenuItem PasteItem(ActionType, ContextMenuItemTagPaste, contextMenuItemTagPaste());
677 ContextMenuItem DeleteItem(ActionType, ContextMenuItemTagDelete, contextMenuItemTagDelete());
679 #if PLATFORM(GTK) || PLATFORM(QT)
680 ContextMenuItem SelectAllItem(ActionType, ContextMenuItemTagSelectAll, contextMenuItemTagSelectAll());
683 Node* node = m_hitTestResult.innerNonSharedNode();
687 if (!m_hitTestResult.isContentEditable() && (node->isElementNode() && static_cast<Element*>(node)->isFormControlElement()))
690 Frame* frame = node->document()->frame();
694 if (!m_hitTestResult.isContentEditable()) {
695 FrameLoader* loader = frame->loader();
696 KURL linkURL = m_hitTestResult.absoluteLinkURL();
697 if (!linkURL.isEmpty()) {
698 if (loader->client()->canHandleRequest(ResourceRequest(linkURL))) {
699 appendItem(OpenLinkItem, m_contextMenu.get());
700 appendItem(OpenLinkInNewWindowItem, m_contextMenu.get());
701 appendItem(DownloadFileItem, m_contextMenu.get());
704 if (m_hitTestResult.isSelected())
705 appendItem(CopyItem, m_contextMenu.get());
707 appendItem(CopyLinkItem, m_contextMenu.get());
710 KURL imageURL = m_hitTestResult.absoluteImageURL();
711 if (!imageURL.isEmpty()) {
712 if (!linkURL.isEmpty())
713 appendItem(*separatorItem(), m_contextMenu.get());
715 appendItem(OpenImageInNewWindowItem, m_contextMenu.get());
716 appendItem(DownloadImageItem, m_contextMenu.get());
717 if (imageURL.isLocalFile() || m_hitTestResult.image())
718 appendItem(CopyImageItem, m_contextMenu.get());
719 #if PLATFORM(QT) || PLATFORM(GTK)
720 appendItem(CopyImageUrlItem, m_contextMenu.get());
724 KURL mediaURL = m_hitTestResult.absoluteMediaURL();
725 if (!mediaURL.isEmpty()) {
726 if (!linkURL.isEmpty() || !imageURL.isEmpty())
727 appendItem(*separatorItem(), m_contextMenu.get());
729 appendItem(MediaPlayPause, m_contextMenu.get());
730 appendItem(MediaMute, m_contextMenu.get());
731 appendItem(ToggleMediaControls, m_contextMenu.get());
732 appendItem(ToggleMediaLoop, m_contextMenu.get());
733 appendItem(EnterVideoFullscreen, m_contextMenu.get());
735 appendItem(*separatorItem(), m_contextMenu.get());
736 appendItem(CopyMediaLinkItem, m_contextMenu.get());
737 appendItem(OpenMediaInNewWindowItem, m_contextMenu.get());
740 if (imageURL.isEmpty() && linkURL.isEmpty() && mediaURL.isEmpty()) {
741 if (m_hitTestResult.isSelected()) {
742 if (selectionContainsPossibleWord(frame)) {
744 String selectedString = frame->displayStringModifiedByEncoding(frame->editor()->selectedText());
745 ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString));
747 #if INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM
748 appendItem(SearchSpotlightItem, m_contextMenu.get());
750 appendItem(LookUpInDictionaryItem, m_contextMenu.get());
755 appendItem(SearchWebItem, m_contextMenu.get());
756 appendItem(*separatorItem(), m_contextMenu.get());
759 #if PLATFORM(MAC) && INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM
760 appendItem(LookUpInDictionaryItem, m_contextMenu.get());
761 appendItem(*separatorItem(), m_contextMenu.get());
765 appendItem(CopyItem, m_contextMenu.get());
767 appendItem(*separatorItem(), m_contextMenu.get());
769 ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu());
770 createAndAppendSpeechSubMenu(SpeechMenuItem);
771 appendItem(SpeechMenuItem, m_contextMenu.get());
774 #if ENABLE(INSPECTOR)
775 if (!(frame->page() && frame->page()->inspectorController()->hasInspectorFrontendClient())) {
778 // In GTK+ unavailable items are not hidden but insensitive
780 appendItem(BackItem, m_contextMenu.get());
781 appendItem(ForwardItem, m_contextMenu.get());
782 appendItem(StopItem, m_contextMenu.get());
783 appendItem(ReloadItem, m_contextMenu.get());
785 if (frame->page() && frame->page()->backForward()->canGoBackOrForward(-1))
786 appendItem(BackItem, m_contextMenu.get());
788 if (frame->page() && frame->page()->backForward()->canGoBackOrForward(1))
789 appendItem(ForwardItem, m_contextMenu.get());
791 // use isLoadingInAPISense rather than isLoading because Stop/Reload are
792 // intended to match WebKit's API, not WebCore's internal notion of loading status
793 if (loader->documentLoader()->isLoadingInAPISense())
794 appendItem(StopItem, m_contextMenu.get());
796 appendItem(ReloadItem, m_contextMenu.get());
798 #if ENABLE(INSPECTOR)
802 if (frame->page() && frame != frame->page()->mainFrame())
803 appendItem(OpenFrameItem, m_contextMenu.get());
806 } else { // Make an editing context menu
807 FrameSelection* selection = frame->selection();
808 bool inPasswordField = selection->isInPasswordField();
809 bool spellCheckingEnabled = frame->editor()->isSpellCheckingEnabledFor(node);
811 if (!inPasswordField && spellCheckingEnabled) {
812 // Consider adding spelling-related or grammar-related context menu items (never both, since a single selected range
813 // is never considered a misspelling and bad grammar at the same time)
816 Vector<String> guesses = frame->editor()->guessesForMisspelledOrUngrammaticalSelection(misspelling, badGrammar);
817 if (misspelling || badGrammar) {
818 size_t size = guesses.size();
820 // If there's bad grammar but no suggestions (e.g., repeated word), just leave off the suggestions
821 // list and trailing separator rather than adding a "No Guesses Found" item (matches AppKit)
823 appendItem(NoGuessesItem, m_contextMenu.get());
824 appendItem(*separatorItem(), m_contextMenu.get());
827 for (unsigned i = 0; i < size; i++) {
828 const String &guess = guesses[i];
829 if (!guess.isEmpty()) {
830 ContextMenuItem item(ActionType, ContextMenuItemTagSpellingGuess, guess);
831 appendItem(item, m_contextMenu.get());
834 appendItem(*separatorItem(), m_contextMenu.get());
838 appendItem(IgnoreSpellingItem, m_contextMenu.get());
839 appendItem(LearnSpellingItem, m_contextMenu.get());
841 appendItem(IgnoreGrammarItem, m_contextMenu.get());
842 appendItem(*separatorItem(), m_contextMenu.get());
843 #if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
845 // If the string was autocorrected, generate a contextual menu item allowing it to be changed back.
846 String replacedString = m_hitTestResult.replacedString();
847 if (!replacedString.isEmpty()) {
848 ContextMenuItem item(ActionType, ContextMenuItemTagChangeBack, contextMenuItemTagChangeBack(replacedString));
849 appendItem(item, m_contextMenu.get());
850 appendItem(*separatorItem(), m_contextMenu.get());
856 FrameLoader* loader = frame->loader();
857 KURL linkURL = m_hitTestResult.absoluteLinkURL();
858 if (!linkURL.isEmpty()) {
859 if (loader->client()->canHandleRequest(ResourceRequest(linkURL))) {
860 appendItem(OpenLinkItem, m_contextMenu.get());
861 appendItem(OpenLinkInNewWindowItem, m_contextMenu.get());
862 appendItem(DownloadFileItem, m_contextMenu.get());
864 appendItem(CopyLinkItem, m_contextMenu.get());
865 appendItem(*separatorItem(), m_contextMenu.get());
868 if (m_hitTestResult.isSelected() && !inPasswordField && selectionContainsPossibleWord(frame)) {
870 String selectedString = frame->displayStringModifiedByEncoding(frame->editor()->selectedText());
871 ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString));
873 #if INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM
874 appendItem(SearchSpotlightItem, m_contextMenu.get());
876 appendItem(LookUpInDictionaryItem, m_contextMenu.get());
881 appendItem(SearchWebItem, m_contextMenu.get());
882 appendItem(*separatorItem(), m_contextMenu.get());
885 #if PLATFORM(MAC) && INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM
886 appendItem(LookUpInDictionaryItem, m_contextMenu.get());
887 appendItem(*separatorItem(), m_contextMenu.get());
891 appendItem(CutItem, m_contextMenu.get());
892 appendItem(CopyItem, m_contextMenu.get());
893 appendItem(PasteItem, m_contextMenu.get());
895 appendItem(DeleteItem, m_contextMenu.get());
896 appendItem(*separatorItem(), m_contextMenu.get());
898 #if PLATFORM(GTK) || PLATFORM(QT)
899 appendItem(SelectAllItem, m_contextMenu.get());
902 if (!inPasswordField) {
904 appendItem(*separatorItem(), m_contextMenu.get());
905 ContextMenuItem SpellingAndGrammarMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu,
906 contextMenuItemTagSpellingMenu());
907 createAndAppendSpellingAndGrammarSubMenu(SpellingAndGrammarMenuItem);
908 appendItem(SpellingAndGrammarMenuItem, m_contextMenu.get());
910 #if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD)
911 ContextMenuItem substitutionsMenuItem(SubmenuType, ContextMenuItemTagSubstitutionsMenu,
912 contextMenuItemTagSubstitutionsMenu());
913 createAndAppendSubstitutionsSubMenu(substitutionsMenuItem);
914 appendItem(substitutionsMenuItem, m_contextMenu.get());
915 ContextMenuItem transformationsMenuItem(SubmenuType, ContextMenuItemTagTransformationsMenu,
916 contextMenuItemTagTransformationsMenu());
917 createAndAppendTransformationsSubMenu(transformationsMenuItem);
918 appendItem(transformationsMenuItem, m_contextMenu.get());
921 bool shouldShowFontMenu = frame->editor()->canEditRichly();
923 bool shouldShowFontMenu = true;
925 if (shouldShowFontMenu) {
926 ContextMenuItem FontMenuItem(SubmenuType, ContextMenuItemTagFontMenu,
927 contextMenuItemTagFontMenu());
928 createAndAppendFontSubMenu(FontMenuItem);
929 appendItem(FontMenuItem, m_contextMenu.get());
932 ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu());
933 createAndAppendSpeechSubMenu(SpeechMenuItem);
934 appendItem(SpeechMenuItem, m_contextMenu.get());
937 ContextMenuItem WritingDirectionMenuItem(SubmenuType, ContextMenuItemTagWritingDirectionMenu,
938 contextMenuItemTagWritingDirectionMenu());
939 createAndAppendWritingDirectionSubMenu(WritingDirectionMenuItem);
940 appendItem(WritingDirectionMenuItem, m_contextMenu.get());
941 if (Page* page = frame->page()) {
942 if (Settings* settings = page->settings()) {
943 bool includeTextDirectionSubmenu = settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAlwaysIncluded
944 || (settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAutomaticallyIncluded && frame->editor()->hasBidiSelection());
945 if (includeTextDirectionSubmenu) {
946 ContextMenuItem TextDirectionMenuItem(SubmenuType, ContextMenuItemTagTextDirectionMenu,
947 contextMenuItemTagTextDirectionMenu());
948 createAndAppendTextDirectionSubMenu(TextDirectionMenuItem);
949 appendItem(TextDirectionMenuItem, m_contextMenu.get());
958 #if ENABLE(INSPECTOR)
959 void ContextMenuController::addInspectElementItem()
961 Node* node = m_hitTestResult.innerNonSharedNode();
965 Frame* frame = node->document()->frame();
969 Page* page = frame->page();
973 if (!page->inspectorController())
976 ContextMenuItem InspectElementItem(ActionType, ContextMenuItemTagInspectElement, contextMenuItemTagInspectElement());
977 appendItem(*separatorItem(), m_contextMenu.get());
978 appendItem(InspectElementItem, m_contextMenu.get());
980 #endif // ENABLE(INSPECTOR)
982 void ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const
984 if (item.type() == SeparatorType)
987 Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame();
991 // Custom items already have proper checked and enabled values.
992 if (ContextMenuItemBaseCustomTag <= item.action() && item.action() <= ContextMenuItemLastCustomTag)
995 bool shouldEnable = true;
996 bool shouldCheck = false;
998 switch (item.action()) {
999 case ContextMenuItemTagCheckSpelling:
1000 shouldEnable = frame->editor()->canEdit();
1002 case ContextMenuItemTagDefaultDirection:
1003 shouldCheck = false;
1004 shouldEnable = false;
1006 case ContextMenuItemTagLeftToRight:
1007 case ContextMenuItemTagRightToLeft: {
1008 String direction = item.action() == ContextMenuItemTagLeftToRight ? "ltr" : "rtl";
1009 shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyDirection, direction) != FalseTriState;
1010 shouldEnable = true;
1013 case ContextMenuItemTagTextDirectionDefault: {
1014 Editor::Command command = frame->editor()->command("MakeTextWritingDirectionNatural");
1015 shouldCheck = command.state() == TrueTriState;
1016 shouldEnable = command.isEnabled();
1019 case ContextMenuItemTagTextDirectionLeftToRight: {
1020 Editor::Command command = frame->editor()->command("MakeTextWritingDirectionLeftToRight");
1021 shouldCheck = command.state() == TrueTriState;
1022 shouldEnable = command.isEnabled();
1025 case ContextMenuItemTagTextDirectionRightToLeft: {
1026 Editor::Command command = frame->editor()->command("MakeTextWritingDirectionRightToLeft");
1027 shouldCheck = command.state() == TrueTriState;
1028 shouldEnable = command.isEnabled();
1031 case ContextMenuItemTagCopy:
1032 shouldEnable = frame->editor()->canDHTMLCopy() || frame->editor()->canCopy();
1034 case ContextMenuItemTagCut:
1035 shouldEnable = frame->editor()->canDHTMLCut() || frame->editor()->canCut();
1037 case ContextMenuItemTagIgnoreSpelling:
1038 case ContextMenuItemTagLearnSpelling:
1039 shouldEnable = frame->selection()->isRange();
1041 case ContextMenuItemTagPaste:
1042 shouldEnable = frame->editor()->canDHTMLPaste() || frame->editor()->canPaste();
1045 case ContextMenuItemTagDelete:
1046 shouldEnable = frame->editor()->canDelete();
1048 case ContextMenuItemTagSelectAll:
1049 case ContextMenuItemTagInputMethods:
1050 case ContextMenuItemTagUnicode:
1051 shouldEnable = true;
1054 case ContextMenuItemTagUnderline: {
1055 shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyWebkitTextDecorationsInEffect, "underline") != FalseTriState;
1056 shouldEnable = frame->editor()->canEditRichly();
1059 case ContextMenuItemTagLookUpInDictionary:
1060 shouldEnable = frame->selection()->isRange();
1062 case ContextMenuItemTagCheckGrammarWithSpelling:
1063 if (frame->editor()->isGrammarCheckingEnabled())
1065 shouldEnable = true;
1067 case ContextMenuItemTagItalic: {
1068 shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyFontStyle, "italic") != FalseTriState;
1069 shouldEnable = frame->editor()->canEditRichly();
1072 case ContextMenuItemTagBold: {
1073 shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyFontWeight, "bold") != FalseTriState;
1074 shouldEnable = frame->editor()->canEditRichly();
1077 case ContextMenuItemTagOutline:
1078 shouldEnable = false;
1080 case ContextMenuItemTagShowSpellingPanel:
1081 if (frame->editor()->spellingPanelIsShowing())
1082 item.setTitle(contextMenuItemTagShowSpellingPanel(false));
1084 item.setTitle(contextMenuItemTagShowSpellingPanel(true));
1085 shouldEnable = frame->editor()->canEdit();
1087 case ContextMenuItemTagNoGuessesFound:
1088 shouldEnable = false;
1090 case ContextMenuItemTagCheckSpellingWhileTyping:
1091 shouldCheck = frame->editor()->isContinuousSpellCheckingEnabled();
1094 case ContextMenuItemTagSubstitutionsMenu:
1095 case ContextMenuItemTagTransformationsMenu:
1097 case ContextMenuItemTagShowSubstitutions:
1098 #ifndef BUILDING_ON_LEOPARD
1099 if (frame->editor()->substitutionsPanelIsShowing())
1100 item.setTitle(contextMenuItemTagShowSubstitutions(false));
1102 item.setTitle(contextMenuItemTagShowSubstitutions(true));
1103 shouldEnable = frame->editor()->canEdit();
1106 case ContextMenuItemTagMakeUpperCase:
1107 case ContextMenuItemTagMakeLowerCase:
1108 case ContextMenuItemTagCapitalize:
1109 case ContextMenuItemTagChangeBack:
1110 shouldEnable = frame->editor()->canEdit();
1112 case ContextMenuItemTagCorrectSpellingAutomatically:
1113 #ifndef BUILDING_ON_LEOPARD
1114 shouldCheck = frame->editor()->isAutomaticSpellingCorrectionEnabled();
1117 case ContextMenuItemTagSmartCopyPaste:
1118 #ifndef BUILDING_ON_LEOPARD
1119 shouldCheck = frame->editor()->smartInsertDeleteEnabled();
1122 case ContextMenuItemTagSmartQuotes:
1123 #ifndef BUILDING_ON_LEOPARD
1124 shouldCheck = frame->editor()->isAutomaticQuoteSubstitutionEnabled();
1127 case ContextMenuItemTagSmartDashes:
1128 #ifndef BUILDING_ON_LEOPARD
1129 shouldCheck = frame->editor()->isAutomaticDashSubstitutionEnabled();
1132 case ContextMenuItemTagSmartLinks:
1133 #ifndef BUILDING_ON_LEOPARD
1134 shouldCheck = frame->editor()->isAutomaticLinkDetectionEnabled();
1137 case ContextMenuItemTagTextReplacement:
1138 #ifndef BUILDING_ON_LEOPARD
1139 shouldCheck = frame->editor()->isAutomaticTextReplacementEnabled();
1142 case ContextMenuItemTagStopSpeaking:
1143 shouldEnable = client() && client()->isSpeaking();
1145 #else // PLATFORM(MAC) ends here
1146 case ContextMenuItemTagStopSpeaking:
1150 case ContextMenuItemTagGoBack:
1151 shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(-1);
1153 case ContextMenuItemTagGoForward:
1154 shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(1);
1156 case ContextMenuItemTagStop:
1157 shouldEnable = frame->loader()->documentLoader()->isLoadingInAPISense();
1159 case ContextMenuItemTagReload:
1160 shouldEnable = !frame->loader()->documentLoader()->isLoadingInAPISense();
1162 case ContextMenuItemTagFontMenu:
1163 shouldEnable = frame->editor()->canEditRichly();
1166 case ContextMenuItemTagGoBack:
1167 case ContextMenuItemTagGoForward:
1168 case ContextMenuItemTagStop:
1169 case ContextMenuItemTagReload:
1170 case ContextMenuItemTagFontMenu:
1172 case ContextMenuItemTagNoAction:
1173 case ContextMenuItemTagOpenLinkInNewWindow:
1174 case ContextMenuItemTagDownloadLinkToDisk:
1175 case ContextMenuItemTagCopyLinkToClipboard:
1176 case ContextMenuItemTagOpenImageInNewWindow:
1177 case ContextMenuItemTagDownloadImageToDisk:
1178 case ContextMenuItemTagCopyImageToClipboard:
1179 #if PLATFORM(QT) || PLATFORM(GTK)
1180 case ContextMenuItemTagCopyImageUrlToClipboard:
1183 case ContextMenuItemTagOpenMediaInNewWindow:
1184 if (m_hitTestResult.mediaIsVideo())
1185 item.setTitle(contextMenuItemTagOpenVideoInNewWindow());
1187 item.setTitle(contextMenuItemTagOpenAudioInNewWindow());
1189 case ContextMenuItemTagCopyMediaLinkToClipboard:
1190 if (m_hitTestResult.mediaIsVideo())
1191 item.setTitle(contextMenuItemTagCopyVideoLinkToClipboard());
1193 item.setTitle(contextMenuItemTagCopyAudioLinkToClipboard());
1195 case ContextMenuItemTagToggleMediaControls:
1196 shouldCheck = m_hitTestResult.mediaControlsEnabled();
1198 case ContextMenuItemTagToggleMediaLoop:
1199 shouldCheck = m_hitTestResult.mediaLoopEnabled();
1201 case ContextMenuItemTagEnterVideoFullscreen:
1202 shouldEnable = m_hitTestResult.mediaSupportsFullscreen();
1204 case ContextMenuItemTagOpenFrameInNewWindow:
1205 case ContextMenuItemTagSpellingGuess:
1206 case ContextMenuItemTagOther:
1207 case ContextMenuItemTagSearchInSpotlight:
1208 case ContextMenuItemTagSearchWeb:
1209 case ContextMenuItemTagOpenWithDefaultApplication:
1210 case ContextMenuItemPDFActualSize:
1211 case ContextMenuItemPDFZoomIn:
1212 case ContextMenuItemPDFZoomOut:
1213 case ContextMenuItemPDFAutoSize:
1214 case ContextMenuItemPDFSinglePage:
1215 case ContextMenuItemPDFFacingPages:
1216 case ContextMenuItemPDFContinuous:
1217 case ContextMenuItemPDFNextPage:
1218 case ContextMenuItemPDFPreviousPage:
1219 case ContextMenuItemTagOpenLink:
1220 case ContextMenuItemTagIgnoreGrammar:
1221 case ContextMenuItemTagSpellingMenu:
1222 case ContextMenuItemTagShowFonts:
1223 case ContextMenuItemTagStyles:
1224 case ContextMenuItemTagShowColors:
1225 case ContextMenuItemTagSpeechMenu:
1226 case ContextMenuItemTagStartSpeaking:
1227 case ContextMenuItemTagWritingDirectionMenu:
1228 case ContextMenuItemTagTextDirectionMenu:
1229 case ContextMenuItemTagPDFSinglePageScrolling:
1230 case ContextMenuItemTagPDFFacingPagesScrolling:
1231 #if ENABLE(INSPECTOR)
1232 case ContextMenuItemTagInspectElement:
1234 case ContextMenuItemBaseCustomTag:
1235 case ContextMenuItemCustomTagNoAction:
1236 case ContextMenuItemLastCustomTag:
1237 case ContextMenuItemBaseApplicationTag:
1239 case ContextMenuItemTagMediaPlayPause:
1240 if (m_hitTestResult.mediaPlaying())
1241 item.setTitle(contextMenuItemTagMediaPause());
1243 item.setTitle(contextMenuItemTagMediaPlay());
1245 case ContextMenuItemTagMediaMute:
1246 shouldEnable = m_hitTestResult.mediaHasAudio();
1247 shouldCheck = shouldEnable && m_hitTestResult.mediaMuted();
1251 item.setChecked(shouldCheck);
1252 item.setEnabled(shouldEnable);
1255 } // namespace WebCore
1257 #endif // ENABLE(CONTEXT_MENUS)