18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 3bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Copyright (C) 2010 Igalia S.L 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ContextMenuController.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(CONTEXT_MENUS) 31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "BackForwardController.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Chrome.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ContextMenu.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ContextMenuClient.h" 36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ContextMenuItem.h" 37d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ContextMenuProvider.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentFragment.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Editor.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditorClient.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventHandler.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h" 465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "FormState.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h" 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FrameLoader.h" 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLFormElement.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HitTestRequest.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HitTestResult.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "InspectorController.h" 54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "LocalizedStrings.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MouseEvent.h" 56e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "NavigationAction.h" 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderLayer.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderObject.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ReplaceSelectionCommand.h" 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceRequest.h" 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextIterator.h" 662bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "UserTypingGestureIndicator.h" 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WindowFeatures.h" 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "markup.h" 69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include <wtf/unicode/Unicode.h> 70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochusing namespace WTF; 72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochusing namespace Unicode; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectContextMenuController::ContextMenuController(Page* page, ContextMenuClient* client) 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_page(page) 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_client(client) 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_contextMenu(0) 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_ARG(page, page); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_ARG(client, client); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectContextMenuController::~ContextMenuController() 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->contextMenuDestroyed(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ContextMenuController::clearContextMenu() 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_contextMenu.set(0); 93d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_menuProvider) 94d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuProvider->contextMenuCleared(); 95d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuProvider = 0; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ContextMenuController::handleContextMenuEvent(Event* event) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_contextMenu = createContextMenu(event); 101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_contextMenu) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 103f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch populate(); 105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showContextMenu(event); 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 109d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid ContextMenuController::showContextMenu(Event* event, PassRefPtr<ContextMenuProvider> menuProvider) 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 111d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuProvider = menuProvider; 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_contextMenu = createContextMenu(event); 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_contextMenu) { 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block clearContextMenu(); 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 118d0825bca7fe65beaee391d30da42e937db621564Steve Block 119d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuProvider->populateContextMenu(m_contextMenu.get()); 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block showContextMenu(event); 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 123f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassOwnPtr<ContextMenu> ContextMenuController::createContextMenu(Event* event) 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 125f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!event->isMouseEvent()) 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); 1298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian HitTestResult result(mouseEvent->absoluteLocation()); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Frame* frame = event->target()->toNode()->document()->frame()) 1328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian result = frame->eventHandler()->hitTestResultAtPoint(mouseEvent->absoluteLocation(), false); 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result.innerNonSharedNode()) 135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_hitTestResult = result; 138f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return new ContextMenu; 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 142643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ContextMenuController::showContextMenu(Event* event) 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(INSPECTOR) 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_page->inspectorController()->enabled()) 146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch addInspectElementItem(); 147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 148f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if USE(CROSS_PLATFORM_CONTEXT_MENUS) 150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_contextMenu = m_client->customizeMenu(m_contextMenu.release()); 151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PlatformMenuDescription customMenu = m_client->getCustomMenuFromDefaultItems(m_contextMenu.get()); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_contextMenu->setPlatformDescription(customMenu); 154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->setDefaultHandled(); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void openNewWindow(const KURL& urlToLoad, Frame* frame) 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* oldPage = frame->page()) { 161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FrameLoadRequest request(frame->document()->securityOrigin(), ResourceRequest(urlToLoad, frame->loader()->outgoingReferrer())); 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (Page* newPage = oldPage->chrome()->createWindow(frame, request, WindowFeatures(), NavigationAction())) { 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch newPage->mainFrame()->loader()->loadFrameRequest(request, false, false, 0, 0, SendReferrer); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newPage->chrome()->show(); 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(item->type() == ActionType || item->type() == CheckableActionType); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (item->action() >= ContextMenuItemBaseApplicationTag) { 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->contextMenuItemSelected(item, m_contextMenu.get()); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (item->action() >= ContextMenuItemBaseCustomTag) { 179d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(m_menuProvider); 180d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuProvider->contextMenuItemSelected(item); 181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame(); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frame) 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (item->action()) { 1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagOpenLinkInNewWindow: 190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch openNewWindow(m_hitTestResult.absoluteLinkURL(), frame); 1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagDownloadLinkToDisk: 1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: Some day we should be able to do this from within WebCore. 194f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_client->downloadURL(m_hitTestResult.absoluteLinkURL()); 1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCopyLinkToClipboard: 197f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frame->editor()->copyURL(m_hitTestResult.absoluteLinkURL(), m_hitTestResult.textContent()); 1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagOpenImageInNewWindow: 200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch openNewWindow(m_hitTestResult.absoluteImageURL(), frame); 2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagDownloadImageToDisk: 2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: Some day we should be able to do this from within WebCore. 204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_client->downloadURL(m_hitTestResult.absoluteImageURL()); 2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCopyImageToClipboard: 2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: The Pasteboard class is not written yet 2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // For now, call into the client. This is temporary! 209f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frame->editor()->copyImage(m_hitTestResult); 2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 21181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(QT) || PLATFORM(GTK) 2122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block case ContextMenuItemTagCopyImageUrlToClipboard: 2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block frame->editor()->copyURL(m_hitTestResult.absoluteImageURL(), m_hitTestResult.textContent()); 2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block break; 2152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case ContextMenuItemTagOpenMediaInNewWindow: 217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch openNewWindow(m_hitTestResult.absoluteMediaURL(), frame); 218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case ContextMenuItemTagCopyMediaLinkToClipboard: 220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frame->editor()->copyURL(m_hitTestResult.absoluteMediaURL(), m_hitTestResult.textContent()); 221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case ContextMenuItemTagToggleMediaControls: 223f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_hitTestResult.toggleMediaControlsDisplay(); 224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case ContextMenuItemTagToggleMediaLoop: 226f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_hitTestResult.toggleMediaLoopPlayback(); 227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case ContextMenuItemTagEnterVideoFullscreen: 229f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_hitTestResult.enterFullscreenForVideo(); 230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case ContextMenuItemTagMediaPlayPause: 232f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_hitTestResult.toggleMediaPlayState(); 233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 234bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case ContextMenuItemTagMediaMute: 235f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_hitTestResult.toggleMediaMuteState(); 236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagOpenFrameInNewWindow: { 2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch DocumentLoader* loader = frame->loader()->documentLoader(); 2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!loader->unreachableURL().isEmpty()) 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch openNewWindow(loader->unreachableURL(), frame); 2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch else 2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch openNewWindow(loader->url(), frame); 2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCopy: 2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->copy(); 2470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagGoBack: 249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (Page* page = frame->page()) 25028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->goBackOrForward(-1); 2510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagGoForward: 253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (Page* page = frame->page()) 25428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->goBackOrForward(1); 2550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagStop: 2570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->loader()->stop(); 2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagReload: 2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->loader()->reload(); 2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCut: 2632bde8e466a4451c7319e3a072d118917957d6554Steve Block frame->editor()->command("Cut").execute(); 2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagPaste: 2662bde8e466a4451c7319e3a072d118917957d6554Steve Block frame->editor()->command("Paste").execute(); 2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(GTK) 2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagDelete: 2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->performDelete(); 2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 272cad810f21b803229eb11403f9209855525a25d57Steve Block#endif 273cad810f21b803229eb11403f9209855525a25d57Steve Block#if PLATFORM(GTK) || PLATFORM(QT) 2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSelectAll: 2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->command("SelectAll").execute(); 2760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSpellingGuess: 2795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ASSERT(frame->editor()->selectedText().length()); 2800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (frame->editor()->shouldInsertText(item->title(), frame->selection()->toNormalizedRange().get(), EditorInsertActionPasted)) { 2810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Document* document = frame->document(); 28281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RefPtr<ReplaceSelectionCommand> command = ReplaceSelectionCommand::create(document, createFragmentFromMarkup(document, item->title(), ""), ReplaceSelectionCommand::SelectReplacement | ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting); 2830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch applyCommand(command); 28468513a70bcd92384395513322f1b801e7bf9c729Steve Block frame->selection()->revealSelection(ScrollAlignment::alignToEdgeIfNeeded); 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagIgnoreSpelling: 2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->ignoreSpelling(); 2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagLearnSpelling: 2910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->learnSpelling(); 2920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSearchWeb: 2940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_client->searchWithGoogle(frame); 2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 2960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagLookUpInDictionary: 2970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: Some day we may be able to do this from within WebCore. 2980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_client->lookUpInDictionary(frame); 2990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagOpenLink: 301f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (Frame* targetFrame = m_hitTestResult.targetFrame()) 302f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch targetFrame->loader()->loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(m_hitTestResult.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0, SendReferrer); 3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch else 304f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch openNewWindow(m_hitTestResult.absoluteLinkURL(), frame); 3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagBold: 3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->command("ToggleBold").execute(); 3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagItalic: 3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->command("ToggleItalic").execute(); 3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagUnderline: 3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleUnderline(); 3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagOutline: 3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // We actually never enable this because CSS does not have a way to specify an outline font, 3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // which may make this difficult to implement. Maybe a special case of text-shadow? 3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagStartSpeaking: { 3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ExceptionCode ec; 3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RefPtr<Range> selectedRange = frame->selection()->toNormalizedRange(); 3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!selectedRange || selectedRange->collapsed(ec)) { 323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Document* document = m_hitTestResult.innerNonSharedNode()->document(); 3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch selectedRange = document->createRange(); 3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch selectedRange->selectNode(document->documentElement(), ec); 3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_client->speak(plainText(selectedRange.get())); 3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagStopSpeaking: 3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_client->stopSpeaking(); 3320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagDefaultDirection: 3340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->setBaseWritingDirection(NaturalWritingDirection); 3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagLeftToRight: 3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->setBaseWritingDirection(LeftToRightWritingDirection); 3380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagRightToLeft: 3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->setBaseWritingDirection(RightToLeftWritingDirection); 3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagTextDirectionDefault: 3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->command("MakeTextWritingDirectionNatural").execute(); 3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagTextDirectionLeftToRight: 3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->command("MakeTextWritingDirectionLeftToRight").execute(); 3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagTextDirectionRightToLeft: 3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->command("MakeTextWritingDirectionRightToLeft").execute(); 3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSearchInSpotlight: 3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_client->searchWithSpotlight(); 3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagShowSpellingPanel: 3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->showSpellingGuessPanel(); 3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCheckSpelling: 3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->advanceToNextMisspelling(); 3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCheckSpellingWhileTyping: 3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleContinuousSpellChecking(); 3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER 3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCheckGrammarWithSpelling: 3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleGrammarChecking(); 3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagShowFonts: 3720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->showFontPanel(); 3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagStyles: 3750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->showStylesPanel(); 3760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagShowColors: 3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->showColorPanel(); 3790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagMakeUpperCase: 3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->uppercaseWord(); 3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagMakeLowerCase: 3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->lowercaseWord(); 3870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCapitalize: 3890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->capitalizeWord(); 3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagShowSubstitutions: 3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->showSubstitutionsPanel(); 3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSmartCopyPaste: 3950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleSmartInsertDelete(); 3960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 3970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSmartQuotes: 3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleAutomaticQuoteSubstitution(); 3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 4000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSmartDashes: 4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleAutomaticDashSubstitution(); 4020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 4030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagSmartLinks: 4040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleAutomaticLinkDetection(); 4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 4060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagTextReplacement: 4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleAutomaticTextReplacement(); 4080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagCorrectSpellingAutomatically: 4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->editor()->toggleAutomaticSpellingCorrection(); 4110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagChangeBack: 413f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frame->editor()->changeBackToReplacedString(m_hitTestResult.replacedString()); 4140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 4155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 416231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(INSPECTOR) 4170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case ContextMenuItemTagInspectElement: 4180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (Page* page = frame->page()) 419f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch page->inspectorController()->inspect(m_hitTestResult.innerNonSharedNode()); 4200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 421231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 4220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch default: 4230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 427f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::appendItem(ContextMenuItem& menuItem, ContextMenu* parentMenu) 428f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 429f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch checkOrEnableIfNeeded(menuItem); 430f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (parentMenu) 431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch parentMenu->appendItem(menuItem); 432f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 433f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic PassOwnPtr<ContextMenuItem> separatorItem() 435f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String()); 437f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 438f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 439f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendFontSubMenu(ContextMenuItem& fontMenuItem) 440f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 441f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu fontMenu; 442f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 443f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 444f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem showFonts(ActionType, ContextMenuItemTagShowFonts, contextMenuItemTagShowFonts()); 445f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 446f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem bold(CheckableActionType, ContextMenuItemTagBold, contextMenuItemTagBold()); 447f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem italic(CheckableActionType, ContextMenuItemTagItalic, contextMenuItemTagItalic()); 448f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem underline(CheckableActionType, ContextMenuItemTagUnderline, contextMenuItemTagUnderline()); 449f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem outline(ActionType, ContextMenuItemTagOutline, contextMenuItemTagOutline()); 450f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 451f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem styles(ActionType, ContextMenuItemTagStyles, contextMenuItemTagStyles()); 452f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem showColors(ActionType, ContextMenuItemTagShowColors, contextMenuItemTagShowColors()); 453f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 454f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 455f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 456f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(showFonts, &fontMenu); 457f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 458f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(bold, &fontMenu); 459f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(italic, &fontMenu); 460f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(underline, &fontMenu); 461f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(outline, &fontMenu); 462f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 463f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(styles, &fontMenu); 464f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), &fontMenu); 465f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(showColors, &fontMenu); 466f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 467f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 468f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch fontMenuItem.setSubMenu(&fontMenu); 469f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 470f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 471f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) 472f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 473f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(GTK) 474f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 475f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenuItem& spellingAndGrammarMenuItem) 476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu spellingAndGrammarMenu; 478f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 479f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem showSpellingPanel(ActionType, ContextMenuItemTagShowSpellingPanel, 480f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagShowSpellingPanel(true)); 481f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem checkSpelling(ActionType, ContextMenuItemTagCheckSpelling, 482f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCheckSpelling()); 483f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem checkAsYouType(CheckableActionType, ContextMenuItemTagCheckSpellingWhileTyping, 484f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCheckSpellingWhileTyping()); 485f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem grammarWithSpelling(CheckableActionType, ContextMenuItemTagCheckGrammarWithSpelling, 486f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCheckGrammarWithSpelling()); 487f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD) 488f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem correctSpelling(CheckableActionType, ContextMenuItemTagCorrectSpellingAutomatically, 489f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCorrectSpellingAutomatically()); 490f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 491f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 492f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(showSpellingPanel, &spellingAndGrammarMenu); 493f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(checkSpelling, &spellingAndGrammarMenu); 494f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD) 495f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), &spellingAndGrammarMenu); 496f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 497f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(checkAsYouType, &spellingAndGrammarMenu); 498f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(grammarWithSpelling, &spellingAndGrammarMenu); 499f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD) 500f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(correctSpelling, &spellingAndGrammarMenu); 501f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 502f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 503f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch spellingAndGrammarMenuItem.setSubMenu(&spellingAndGrammarMenu); 504f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 505f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 506f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif // !PLATFORM(GTK) 507f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 508f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else 509f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 510f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendSpellingAndGrammarSubMenu(ContextMenuItem& spellingAndGrammarMenuItem) 511f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 512f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu spellingMenu; 513f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 514f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem showSpellingPanel(ActionType, ContextMenuItemTagShowSpellingPanel, 515f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagShowSpellingPanel(true)); 516f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem checkSpelling(ActionType, ContextMenuItemTagCheckSpelling, 517f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCheckSpelling()); 518f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem checkAsYouType(CheckableActionType, ContextMenuItemTagCheckSpellingWhileTyping, 519f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCheckSpellingWhileTyping()); 520f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 521f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(showSpellingPanel, &spellingMenu); 522f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(checkSpelling, &spellingMenu); 523f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(checkAsYouType, &spellingMenu); 524f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 525f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch spellingMenuItem.setSubMenu(&spellingMenu); 526f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 527f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 528f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 529f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 530f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 531f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 532f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendSpeechSubMenu(ContextMenuItem& speechMenuItem) 533f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 534f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu speechMenu; 535f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 536f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem start(ActionType, ContextMenuItemTagStartSpeaking, contextMenuItemTagStartSpeaking()); 537f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem stop(ActionType, ContextMenuItemTagStopSpeaking, contextMenuItemTagStopSpeaking()); 538f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 539f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(start, &speechMenu); 540f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(stop, &speechMenu); 541f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 542f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch speechMenuItem.setSubMenu(&speechMenu); 543f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 544f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 545f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 546f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 547f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(GTK) 548f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 549f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendWritingDirectionSubMenu(ContextMenuItem& writingDirectionMenuItem) 550f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 551f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu writingDirectionMenu; 552f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 553f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem defaultItem(ActionType, ContextMenuItemTagDefaultDirection, 554f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagDefaultDirection()); 555f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagLeftToRight, contextMenuItemTagLeftToRight()); 556f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagRightToLeft, contextMenuItemTagRightToLeft()); 557f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 558f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(defaultItem, &writingDirectionMenu); 559f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(ltr, &writingDirectionMenu); 560f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(rtl, &writingDirectionMenu); 561f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 562f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch writingDirectionMenuItem.setSubMenu(&writingDirectionMenu); 563f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 564f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 565f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendTextDirectionSubMenu(ContextMenuItem& textDirectionMenuItem) 566f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 567f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu textDirectionMenu; 568f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 569f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem defaultItem(ActionType, ContextMenuItemTagTextDirectionDefault, contextMenuItemTagDefaultDirection()); 570f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem ltr(CheckableActionType, ContextMenuItemTagTextDirectionLeftToRight, contextMenuItemTagLeftToRight()); 571f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem rtl(CheckableActionType, ContextMenuItemTagTextDirectionRightToLeft, contextMenuItemTagRightToLeft()); 572f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 573f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(defaultItem, &textDirectionMenu); 574f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(ltr, &textDirectionMenu); 575f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(rtl, &textDirectionMenu); 576f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 577f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch textDirectionMenuItem.setSubMenu(&textDirectionMenu); 578f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 579f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 580f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 581f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 582f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 583f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 584f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendSubstitutionsSubMenu(ContextMenuItem& substitutionsMenuItem) 585f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 586f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu substitutionsMenu; 587f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 588f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem showSubstitutions(ActionType, ContextMenuItemTagShowSubstitutions, contextMenuItemTagShowSubstitutions(true)); 589f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem smartCopyPaste(CheckableActionType, ContextMenuItemTagSmartCopyPaste, contextMenuItemTagSmartCopyPaste()); 590f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem smartQuotes(CheckableActionType, ContextMenuItemTagSmartQuotes, contextMenuItemTagSmartQuotes()); 591f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem smartDashes(CheckableActionType, ContextMenuItemTagSmartDashes, contextMenuItemTagSmartDashes()); 592f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem smartLinks(CheckableActionType, ContextMenuItemTagSmartLinks, contextMenuItemTagSmartLinks()); 593f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem textReplacement(CheckableActionType, ContextMenuItemTagTextReplacement, contextMenuItemTagTextReplacement()); 594f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 595f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(showSubstitutions, &substitutionsMenu); 596f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), &substitutionsMenu); 597f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(smartCopyPaste, &substitutionsMenu); 598f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(smartQuotes, &substitutionsMenu); 599f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(smartDashes, &substitutionsMenu); 600f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(smartLinks, &substitutionsMenu); 601f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(textReplacement, &substitutionsMenu); 602f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 603f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch substitutionsMenuItem.setSubMenu(&substitutionsMenu); 604f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 605f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 606f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::createAndAppendTransformationsSubMenu(ContextMenuItem& transformationsMenuItem) 607f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 608f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenu transformationsMenu; 609f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 610f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem makeUpperCase(ActionType, ContextMenuItemTagMakeUpperCase, contextMenuItemTagMakeUpperCase()); 611f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem makeLowerCase(ActionType, ContextMenuItemTagMakeLowerCase, contextMenuItemTagMakeLowerCase()); 612f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem capitalize(ActionType, ContextMenuItemTagCapitalize, contextMenuItemTagCapitalize()); 613f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 614f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(makeUpperCase, &transformationsMenu); 615f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(makeLowerCase, &transformationsMenu); 616f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(capitalize, &transformationsMenu); 617f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 618f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch transformationsMenuItem.setSubMenu(&transformationsMenu); 619f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 620f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 621f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 622f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 623f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic bool selectionContainsPossibleWord(Frame* frame) 624f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 625f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Current algorithm: look for a character that's not just a separator. 626f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch for (TextIterator it(frame->selection()->toNormalizedRange().get()); !it.atEnd(); it.advance()) { 627f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch int length = it.length(); 628f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch const UChar* characters = it.characters(); 629f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch for (int i = 0; i < length; ++i) 630f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!(category(characters[i]) & (Separator_Space | Separator_Line | Separator_Paragraph))) 631f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return true; 632f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 633f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return false; 634f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 635f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 6362bde8e466a4451c7319e3a072d118917957d6554Steve Block#if PLATFORM(MAC) 6372bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD) || defined(BUILDING_ON_SNOW_LEOPARD) 6382bde8e466a4451c7319e3a072d118917957d6554Steve Block#define INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 1 6392bde8e466a4451c7319e3a072d118917957d6554Steve Block#else 6402bde8e466a4451c7319e3a072d118917957d6554Steve Block#define INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 0 6412bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 6422bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 6432bde8e466a4451c7319e3a072d118917957d6554Steve Block 644f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::populate() 645f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 646f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem OpenLinkItem(ActionType, ContextMenuItemTagOpenLink, contextMenuItemTagOpenLink()); 647f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem OpenLinkInNewWindowItem(ActionType, ContextMenuItemTagOpenLinkInNewWindow, 648f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagOpenLinkInNewWindow()); 649f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem DownloadFileItem(ActionType, ContextMenuItemTagDownloadLinkToDisk, 650f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagDownloadLinkToDisk()); 651f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem CopyLinkItem(ActionType, ContextMenuItemTagCopyLinkToClipboard, 652f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCopyLinkToClipboard()); 653f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem OpenImageInNewWindowItem(ActionType, ContextMenuItemTagOpenImageInNewWindow, 654f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagOpenImageInNewWindow()); 655f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem DownloadImageItem(ActionType, ContextMenuItemTagDownloadImageToDisk, 656f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagDownloadImageToDisk()); 657f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem CopyImageItem(ActionType, ContextMenuItemTagCopyImageToClipboard, 658f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagCopyImageToClipboard()); 65981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(QT) || PLATFORM(GTK) 6602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ContextMenuItem CopyImageUrlItem(ActionType, ContextMenuItemTagCopyImageUrlToClipboard, 6612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block contextMenuItemTagCopyImageUrlToClipboard()); 6622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 663f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem OpenMediaInNewWindowItem(ActionType, ContextMenuItemTagOpenMediaInNewWindow, String()); 664f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem CopyMediaLinkItem(ActionType, ContextMenuItemTagCopyMediaLinkToClipboard, 665f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch String()); 666f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem MediaPlayPause(ActionType, ContextMenuItemTagMediaPlayPause, 667f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagMediaPlay()); 668f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem MediaMute(ActionType, ContextMenuItemTagMediaMute, 669f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagMediaMute()); 670f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem ToggleMediaControls(CheckableActionType, ContextMenuItemTagToggleMediaControls, 671f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagToggleMediaControls()); 672f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem ToggleMediaLoop(CheckableActionType, ContextMenuItemTagToggleMediaLoop, 673f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagToggleMediaLoop()); 674f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem EnterVideoFullscreen(ActionType, ContextMenuItemTagEnterVideoFullscreen, 675f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagEnterVideoFullscreen()); 676f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 677f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem SearchSpotlightItem(ActionType, ContextMenuItemTagSearchInSpotlight, 678f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagSearchInSpotlight()); 679f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 680f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(GTK) 681f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem SearchWebItem(ActionType, ContextMenuItemTagSearchWeb, contextMenuItemTagSearchWeb()); 682f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 683f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem CopyItem(ActionType, ContextMenuItemTagCopy, contextMenuItemTagCopy()); 684f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem BackItem(ActionType, ContextMenuItemTagGoBack, contextMenuItemTagGoBack()); 685f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem ForwardItem(ActionType, ContextMenuItemTagGoForward, contextMenuItemTagGoForward()); 686f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem StopItem(ActionType, ContextMenuItemTagStop, contextMenuItemTagStop()); 687f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem ReloadItem(ActionType, ContextMenuItemTagReload, contextMenuItemTagReload()); 688f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem OpenFrameItem(ActionType, ContextMenuItemTagOpenFrameInNewWindow, 689f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagOpenFrameInNewWindow()); 690f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem NoGuessesItem(ActionType, ContextMenuItemTagNoGuessesFound, 691f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagNoGuessesFound()); 692f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem IgnoreSpellingItem(ActionType, ContextMenuItemTagIgnoreSpelling, 693f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagIgnoreSpelling()); 694f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem LearnSpellingItem(ActionType, ContextMenuItemTagLearnSpelling, 695f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagLearnSpelling()); 696f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem IgnoreGrammarItem(ActionType, ContextMenuItemTagIgnoreGrammar, 697f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagIgnoreGrammar()); 698f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem CutItem(ActionType, ContextMenuItemTagCut, contextMenuItemTagCut()); 699f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem PasteItem(ActionType, ContextMenuItemTagPaste, contextMenuItemTagPaste()); 700f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(GTK) 701f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem DeleteItem(ActionType, ContextMenuItemTagDelete, contextMenuItemTagDelete()); 702cad810f21b803229eb11403f9209855525a25d57Steve Block#endif 703cad810f21b803229eb11403f9209855525a25d57Steve Block#if PLATFORM(GTK) || PLATFORM(QT) 704f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem SelectAllItem(ActionType, ContextMenuItemTagSelectAll, contextMenuItemTagSelectAll()); 705f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 706f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 707f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Node* node = m_hitTestResult.innerNonSharedNode(); 708f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!node) 709f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 710f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(GTK) 711f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!m_hitTestResult.isContentEditable() && (node->isElementNode() && static_cast<Element*>(node)->isFormControlElement())) 712f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 713f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 714f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* frame = node->document()->frame(); 715f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!frame) 716f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 717f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 718f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!m_hitTestResult.isContentEditable()) { 719f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FrameLoader* loader = frame->loader(); 720f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch KURL linkURL = m_hitTestResult.absoluteLinkURL(); 721f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!linkURL.isEmpty()) { 722f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (loader->canHandleRequest(ResourceRequest(linkURL))) { 723f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(OpenLinkItem, m_contextMenu.get()); 724f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(OpenLinkInNewWindowItem, m_contextMenu.get()); 725f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(DownloadFileItem, m_contextMenu.get()); 726f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 7272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if PLATFORM(QT) 7282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_hitTestResult.isSelected()) 7292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block appendItem(CopyItem, m_contextMenu.get()); 7302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 731f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(CopyLinkItem, m_contextMenu.get()); 732f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 733f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 734f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch KURL imageURL = m_hitTestResult.absoluteImageURL(); 735f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!imageURL.isEmpty()) { 736f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!linkURL.isEmpty()) 737f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 738f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 739f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(OpenImageInNewWindowItem, m_contextMenu.get()); 740f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(DownloadImageItem, m_contextMenu.get()); 741f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (imageURL.isLocalFile() || m_hitTestResult.image()) 742f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(CopyImageItem, m_contextMenu.get()); 74381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(QT) || PLATFORM(GTK) 7442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block appendItem(CopyImageUrlItem, m_contextMenu.get()); 7452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 746f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 747f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 748f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch KURL mediaURL = m_hitTestResult.absoluteMediaURL(); 749f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!mediaURL.isEmpty()) { 750f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!linkURL.isEmpty() || !imageURL.isEmpty()) 751f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 752f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 753f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(MediaPlayPause, m_contextMenu.get()); 754f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(MediaMute, m_contextMenu.get()); 755f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(ToggleMediaControls, m_contextMenu.get()); 756f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(ToggleMediaLoop, m_contextMenu.get()); 757f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(EnterVideoFullscreen, m_contextMenu.get()); 758f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 759f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 760f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(CopyMediaLinkItem, m_contextMenu.get()); 761f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(OpenMediaInNewWindowItem, m_contextMenu.get()); 762f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 763f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 764f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (imageURL.isEmpty() && linkURL.isEmpty() && mediaURL.isEmpty()) { 765f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_hitTestResult.isSelected()) { 766f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (selectionContainsPossibleWord(frame)) { 767f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 7682bde8e466a4451c7319e3a072d118917957d6554Steve Block String selectedString = frame->displayStringModifiedByEncoding(frame->editor()->selectedText()); 7692bde8e466a4451c7319e3a072d118917957d6554Steve Block ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString)); 7702bde8e466a4451c7319e3a072d118917957d6554Steve Block 7712bde8e466a4451c7319e3a072d118917957d6554Steve Block#if INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 772f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SearchSpotlightItem, m_contextMenu.get()); 7732bde8e466a4451c7319e3a072d118917957d6554Steve Block#else 7742bde8e466a4451c7319e3a072d118917957d6554Steve Block appendItem(LookUpInDictionaryItem, m_contextMenu.get()); 7752bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 776f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 7772bde8e466a4451c7319e3a072d118917957d6554Steve Block 778f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(GTK) 779f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SearchWebItem, m_contextMenu.get()); 780f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 781f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 7822bde8e466a4451c7319e3a072d118917957d6554Steve Block 7832bde8e466a4451c7319e3a072d118917957d6554Steve Block#if PLATFORM(MAC) && INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 7842bde8e466a4451c7319e3a072d118917957d6554Steve Block appendItem(LookUpInDictionaryItem, m_contextMenu.get()); 785f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 786f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 787f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 7882bde8e466a4451c7319e3a072d118917957d6554Steve Block 789f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(CopyItem, m_contextMenu.get()); 790f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 791f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 7922bde8e466a4451c7319e3a072d118917957d6554Steve Block 793f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu()); 794f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendSpeechSubMenu(SpeechMenuItem); 795f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SpeechMenuItem, m_contextMenu.get()); 796f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 797f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else { 798f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(INSPECTOR) 799f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!(frame->page() && frame->page()->inspectorController()->hasInspectorFrontendClient())) { 800f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 80181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 80281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // In GTK+ unavailable items are not hidden but insensitive 80381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(GTK) 80481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch appendItem(BackItem, m_contextMenu.get()); 80581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch appendItem(ForwardItem, m_contextMenu.get()); 80681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch appendItem(StopItem, m_contextMenu.get()); 80781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch appendItem(ReloadItem, m_contextMenu.get()); 80881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#else 809f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame->page() && frame->page()->backForward()->canGoBackOrForward(-1)) 810f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(BackItem, m_contextMenu.get()); 811f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 812f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame->page() && frame->page()->backForward()->canGoBackOrForward(1)) 813f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(ForwardItem, m_contextMenu.get()); 814f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 815f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // use isLoadingInAPISense rather than isLoading because Stop/Reload are 816f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // intended to match WebKit's API, not WebCore's internal notion of loading status 817f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (loader->documentLoader()->isLoadingInAPISense()) 818f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(StopItem, m_contextMenu.get()); 819f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 820f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(ReloadItem, m_contextMenu.get()); 82181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 822f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(INSPECTOR) 823f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 824f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 825f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 826f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame->page() && frame != frame->page()->mainFrame()) 827f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(OpenFrameItem, m_contextMenu.get()); 828f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 829f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 830f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else { // Make an editing context menu 831f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch SelectionController* selection = frame->selection(); 832f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool inPasswordField = selection->isInPasswordField(); 833f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool spellCheckingEnabled = frame->editor()->isSpellCheckingEnabledFor(node); 8342bde8e466a4451c7319e3a072d118917957d6554Steve Block 835f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!inPasswordField && spellCheckingEnabled) { 836f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Consider adding spelling-related or grammar-related context menu items (never both, since a single selected range 837f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // is never considered a misspelling and bad grammar at the same time) 838f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool misspelling; 839f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool badGrammar; 840f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Vector<String> guesses = frame->editor()->guessesForMisspelledOrUngrammaticalSelection(misspelling, badGrammar); 841f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (misspelling || badGrammar) { 842f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch size_t size = guesses.size(); 843f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (size == 0) { 844f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // If there's bad grammar but no suggestions (e.g., repeated word), just leave off the suggestions 845f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // list and trailing separator rather than adding a "No Guesses Found" item (matches AppKit) 846f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (misspelling) { 847f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(NoGuessesItem, m_contextMenu.get()); 848f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 849f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 850f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else { 851f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch for (unsigned i = 0; i < size; i++) { 852f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch const String &guess = guesses[i]; 853f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!guess.isEmpty()) { 854f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem item(ActionType, ContextMenuItemTagSpellingGuess, guess); 855f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(item, m_contextMenu.get()); 856f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 857f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 858f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 859f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 860f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 861f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (misspelling) { 862f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(IgnoreSpellingItem, m_contextMenu.get()); 863f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(LearnSpellingItem, m_contextMenu.get()); 864f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else 865f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(IgnoreGrammarItem, m_contextMenu.get()); 866f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 867f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 868f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else { 869f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // If the string was autocorrected, generate a contextual menu item allowing it to be changed back. 870f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch String replacedString = m_hitTestResult.replacedString(); 871f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!replacedString.isEmpty()) { 872f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem item(ActionType, ContextMenuItemTagChangeBack, contextMenuItemTagChangeBack(replacedString)); 873f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(item, m_contextMenu.get()); 874f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 875f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 876f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 877f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 878f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 879f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 880f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FrameLoader* loader = frame->loader(); 881f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch KURL linkURL = m_hitTestResult.absoluteLinkURL(); 882f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!linkURL.isEmpty()) { 883f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (loader->canHandleRequest(ResourceRequest(linkURL))) { 884f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(OpenLinkItem, m_contextMenu.get()); 885f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(OpenLinkInNewWindowItem, m_contextMenu.get()); 886f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(DownloadFileItem, m_contextMenu.get()); 887f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 888f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(CopyLinkItem, m_contextMenu.get()); 889f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 890f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 891f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 892f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_hitTestResult.isSelected() && !inPasswordField && selectionContainsPossibleWord(frame)) { 893f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 8942bde8e466a4451c7319e3a072d118917957d6554Steve Block String selectedString = frame->displayStringModifiedByEncoding(frame->editor()->selectedText()); 8952bde8e466a4451c7319e3a072d118917957d6554Steve Block ContextMenuItem LookUpInDictionaryItem(ActionType, ContextMenuItemTagLookUpInDictionary, contextMenuItemTagLookUpInDictionary(selectedString)); 8962bde8e466a4451c7319e3a072d118917957d6554Steve Block 8972bde8e466a4451c7319e3a072d118917957d6554Steve Block#if INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 898f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SearchSpotlightItem, m_contextMenu.get()); 8992bde8e466a4451c7319e3a072d118917957d6554Steve Block#else 9002bde8e466a4451c7319e3a072d118917957d6554Steve Block appendItem(LookUpInDictionaryItem, m_contextMenu.get()); 9012bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 902f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 9032bde8e466a4451c7319e3a072d118917957d6554Steve Block 904f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(GTK) 905f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SearchWebItem, m_contextMenu.get()); 906f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 907f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 9082bde8e466a4451c7319e3a072d118917957d6554Steve Block 9092bde8e466a4451c7319e3a072d118917957d6554Steve Block#if PLATFORM(MAC) && INCLUDE_SPOTLIGHT_CONTEXT_MENU_ITEM 9102bde8e466a4451c7319e3a072d118917957d6554Steve Block appendItem(LookUpInDictionaryItem, m_contextMenu.get()); 911f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 912f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 913f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 914f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 915f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(CutItem, m_contextMenu.get()); 916f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(CopyItem, m_contextMenu.get()); 917f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(PasteItem, m_contextMenu.get()); 918f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(GTK) 919f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(DeleteItem, m_contextMenu.get()); 920f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 921cad810f21b803229eb11403f9209855525a25d57Steve Block#endif 922cad810f21b803229eb11403f9209855525a25d57Steve Block#if PLATFORM(GTK) || PLATFORM(QT) 923f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SelectAllItem, m_contextMenu.get()); 924f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 925f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 926f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!inPasswordField) { 927f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 928f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#ifndef BUILDING_ON_TIGER 929f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(GTK) 930f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem SpellingAndGrammarMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu, 931f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagSpellingMenu()); 932f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendSpellingAndGrammarSubMenu(SpellingAndGrammarMenuItem); 933f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SpellingAndGrammarMenuItem, m_contextMenu.get()); 934f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 935f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else 936f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem SpellingMenuItem(SubmenuType, ContextMenuItemTagSpellingMenu, 937f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagSpellingMenu()); 938f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendSpellingSubMenu(SpellingMenuItem); 939f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SpellingMenuItem, m_contextMenu.get()); 940f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 941f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) && !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 942f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem substitutionsMenuItem(SubmenuType, ContextMenuItemTagSubstitutionsMenu, 943f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagSubstitutionsMenu()); 944f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendSubstitutionsSubMenu(substitutionsMenuItem); 945f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(substitutionsMenuItem, m_contextMenu.get()); 946f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem transformationsMenuItem(SubmenuType, ContextMenuItemTagTransformationsMenu, 947f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagTransformationsMenu()); 948f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendTransformationsSubMenu(transformationsMenuItem); 949f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(transformationsMenuItem, m_contextMenu.get()); 950f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 951f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(GTK) 952f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool shouldShowFontMenu = frame->editor()->canEditRichly(); 953f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else 954f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool shouldShowFontMenu = true; 955f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 956f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (shouldShowFontMenu) { 957f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem FontMenuItem(SubmenuType, ContextMenuItemTagFontMenu, 958f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagFontMenu()); 959f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendFontSubMenu(FontMenuItem); 960f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(FontMenuItem, m_contextMenu.get()); 961f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 962f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 963f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem SpeechMenuItem(SubmenuType, ContextMenuItemTagSpeechMenu, contextMenuItemTagSpeechMenu()); 964f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendSpeechSubMenu(SpeechMenuItem); 965f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(SpeechMenuItem, m_contextMenu.get()); 966f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 967f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(GTK) 968f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem WritingDirectionMenuItem(SubmenuType, ContextMenuItemTagWritingDirectionMenu, 969f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagWritingDirectionMenu()); 970f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendWritingDirectionSubMenu(WritingDirectionMenuItem); 971f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(WritingDirectionMenuItem, m_contextMenu.get()); 972f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (Page* page = frame->page()) { 973f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (Settings* settings = page->settings()) { 974f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool includeTextDirectionSubmenu = settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAlwaysIncluded 975f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch || (settings->textDirectionSubmenuInclusionBehavior() == TextDirectionSubmenuAutomaticallyIncluded && frame->editor()->hasBidiSelection()); 976f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (includeTextDirectionSubmenu) { 977f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem TextDirectionMenuItem(SubmenuType, ContextMenuItemTagTextDirectionMenu, 978f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch contextMenuItemTagTextDirectionMenu()); 979f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch createAndAppendTextDirectionSubMenu(TextDirectionMenuItem); 980f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(TextDirectionMenuItem, m_contextMenu.get()); 981f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 982f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 983f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 984f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 985f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 986f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 987f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 988f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 989f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(INSPECTOR) 990f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::addInspectElementItem() 991f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 992f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Node* node = m_hitTestResult.innerNonSharedNode(); 993f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!node) 994f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 995f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 996f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* frame = node->document()->frame(); 997f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!frame) 998f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 999f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1000f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Page* page = frame->page(); 1001f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!page) 1002f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1003f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1004f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!page->inspectorController()) 1005f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1006f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1007f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ContextMenuItem InspectElementItem(ActionType, ContextMenuItemTagInspectElement, contextMenuItemTagInspectElement()); 1008f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(*separatorItem(), m_contextMenu.get()); 1009f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch appendItem(InspectElementItem, m_contextMenu.get()); 1010f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1011f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif // ENABLE(INSPECTOR) 1012f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1013f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid ContextMenuController::checkOrEnableIfNeeded(ContextMenuItem& item) const 1014f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 1015f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (item.type() == SeparatorType) 1016f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1017f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1018f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Frame* frame = m_hitTestResult.innerNonSharedNode()->document()->frame(); 1019f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!frame) 1020f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1021f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1022f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Custom items already have proper checked and enabled values. 1023f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (ContextMenuItemBaseCustomTag <= item.action() && item.action() <= ContextMenuItemLastCustomTag) 1024f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1025f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1026f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool shouldEnable = true; 1027f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool shouldCheck = false; 1028f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1029f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch switch (item.action()) { 1030f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCheckSpelling: 1031f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEdit(); 1032f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1033f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagDefaultDirection: 1034f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = false; 1035f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = false; 1036f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1037f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagLeftToRight: 1038f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagRightToLeft: { 1039f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch String direction = item.action() == ContextMenuItemTagLeftToRight ? "ltr" : "rtl"; 104081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyDirection, direction) != FalseTriState; 1041f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = true; 1042f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1043f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1044f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagTextDirectionDefault: { 1045f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Editor::Command command = frame->editor()->command("MakeTextWritingDirectionNatural"); 1046f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = command.state() == TrueTriState; 1047f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = command.isEnabled(); 1048f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1049f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1050f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagTextDirectionLeftToRight: { 1051f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Editor::Command command = frame->editor()->command("MakeTextWritingDirectionLeftToRight"); 1052f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = command.state() == TrueTriState; 1053f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = command.isEnabled(); 1054f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1055f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1056f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagTextDirectionRightToLeft: { 1057f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Editor::Command command = frame->editor()->command("MakeTextWritingDirectionRightToLeft"); 1058f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = command.state() == TrueTriState; 1059f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = command.isEnabled(); 1060f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1061f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1062f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCopy: 1063f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canDHTMLCopy() || frame->editor()->canCopy(); 1064f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1065f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCut: 1066f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canDHTMLCut() || frame->editor()->canCut(); 1067f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1068f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagIgnoreSpelling: 1069f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagLearnSpelling: 1070f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->selection()->isRange(); 1071f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1072f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagPaste: 1073f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canDHTMLPaste() || frame->editor()->canPaste(); 1074f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1075f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(GTK) 1076f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagDelete: 1077f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canDelete(); 1078f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1079f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSelectAll: 1080f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagInputMethods: 1081f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagUnicode: 1082f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = true; 1083f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1084f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1085f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagUnderline: { 108681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyWebkitTextDecorationsInEffect, "underline") != FalseTriState; 1087f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEditRichly(); 1088f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1089f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1090f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagLookUpInDictionary: 1091f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->selection()->isRange(); 1092f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1093f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCheckGrammarWithSpelling: 1094f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#ifndef BUILDING_ON_TIGER 1095f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame->editor()->isGrammarCheckingEnabled()) 1096f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = true; 1097f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = true; 1098f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1099f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagItalic: { 110181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyFontStyle, "italic") != FalseTriState; 1102f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEditRichly(); 1103f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagBold: { 110681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch shouldCheck = frame->editor()->selectionHasStyle(CSSPropertyFontWeight, "bold") != FalseTriState; 1107f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEditRichly(); 1108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1110f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOutline: 1111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = false; 1112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagShowSpellingPanel: 1114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#ifndef BUILDING_ON_TIGER 1115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame->editor()->spellingPanelIsShowing()) 1116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagShowSpellingPanel(false)); 1117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 1118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagShowSpellingPanel(true)); 1119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEdit(); 1121f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagNoGuessesFound: 1123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = false; 1124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1125f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCheckSpellingWhileTyping: 1126f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = frame->editor()->isContinuousSpellCheckingEnabled(); 1127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1128f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(MAC) 1129f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSubstitutionsMenu: 1130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagTransformationsMenu: 1131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1132f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagShowSubstitutions: 1133f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1134f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frame->editor()->substitutionsPanelIsShowing()) 1135f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagShowSubstitutions(false)); 1136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 1137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagShowSubstitutions(true)); 1138f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEdit(); 1139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1140f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1141f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagMakeUpperCase: 1142f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagMakeLowerCase: 1143f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCapitalize: 1144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagChangeBack: 1145f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEdit(); 1146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1147f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCorrectSpellingAutomatically: 1148f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = frame->editor()->isAutomaticSpellingCorrectionEnabled(); 1150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1152f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSmartCopyPaste: 1153f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = frame->editor()->smartInsertDeleteEnabled(); 1155f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1157f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSmartQuotes: 1158f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1159f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = frame->editor()->isAutomaticQuoteSubstitutionEnabled(); 1160f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1162f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSmartDashes: 1163f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1164f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = frame->editor()->isAutomaticDashSubstitutionEnabled(); 1165f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1167f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSmartLinks: 1168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = frame->editor()->isAutomaticLinkDetectionEnabled(); 1170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1172f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagTextReplacement: 1173f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1174f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = frame->editor()->isAutomaticTextReplacementEnabled(); 1175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1176f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagStopSpeaking: 1178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = client() && client()->isSpeaking(); 1179f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1180f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else // PLATFORM(MAC) ends here 1181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagStopSpeaking: 1182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1183f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if PLATFORM(GTK) 1185f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagGoBack: 1186f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(-1); 1187f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagGoForward: 1189f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->page() && frame->page()->backForward()->canGoBackOrForward(1); 1190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1191f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagStop: 1192f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->loader()->documentLoader()->isLoadingInAPISense(); 1193f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1194f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagReload: 1195f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = !frame->loader()->documentLoader()->isLoadingInAPISense(); 1196f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1197f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagFontMenu: 1198f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = frame->editor()->canEditRichly(); 1199f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else 1201f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagGoBack: 1202f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagGoForward: 1203f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagStop: 1204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagReload: 1205f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagFontMenu: 1206f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1207f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagNoAction: 1208f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOpenLinkInNewWindow: 1209f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagDownloadLinkToDisk: 1210f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCopyLinkToClipboard: 1211f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOpenImageInNewWindow: 1212f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagDownloadImageToDisk: 1213f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCopyImageToClipboard: 121481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if PLATFORM(QT) || PLATFORM(GTK) 12152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block case ContextMenuItemTagCopyImageUrlToClipboard: 12162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 1217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1218f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOpenMediaInNewWindow: 1219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_hitTestResult.mediaIsVideo()) 1220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagOpenVideoInNewWindow()); 1221f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 1222f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagOpenAudioInNewWindow()); 1223f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1224f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagCopyMediaLinkToClipboard: 1225f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_hitTestResult.mediaIsVideo()) 1226f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagCopyVideoLinkToClipboard()); 1227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 1228f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagCopyAudioLinkToClipboard()); 1229f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1230f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagToggleMediaControls: 1231f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = m_hitTestResult.mediaControlsEnabled(); 1232f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1233f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagToggleMediaLoop: 1234f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = m_hitTestResult.mediaLoopEnabled(); 1235f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1236f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagEnterVideoFullscreen: 1237f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = m_hitTestResult.mediaSupportsFullscreen(); 1238f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1239f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOpenFrameInNewWindow: 1240f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSpellingGuess: 1241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOther: 1242f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSearchInSpotlight: 1243f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSearchWeb: 1244f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOpenWithDefaultApplication: 1245f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFActualSize: 1246f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFZoomIn: 1247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFZoomOut: 1248f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFAutoSize: 1249f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFSinglePage: 1250f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFFacingPages: 1251f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFContinuous: 1252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFNextPage: 1253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemPDFPreviousPage: 1254f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagOpenLink: 1255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagIgnoreGrammar: 1256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSpellingMenu: 1257f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagShowFonts: 1258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagStyles: 1259f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagShowColors: 1260f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagSpeechMenu: 1261f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagStartSpeaking: 1262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagWritingDirectionMenu: 1263f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagTextDirectionMenu: 1264f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagPDFSinglePageScrolling: 1265f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagPDFFacingPagesScrolling: 1266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(INSPECTOR) 1267f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagInspectElement: 1268f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 1269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemBaseCustomTag: 1270f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemCustomTagNoAction: 1271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemLastCustomTag: 1272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemBaseApplicationTag: 1273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1274f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagMediaPlayPause: 1275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_hitTestResult.mediaPlaying()) 1276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagMediaPause()); 1277f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 1278f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setTitle(contextMenuItemTagMediaPlay()); 1279f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1280f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch case ContextMenuItemTagMediaMute: 1281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldEnable = m_hitTestResult.mediaHasAudio(); 1282f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch shouldCheck = shouldEnable && m_hitTestResult.mediaMuted(); 1283f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch break; 1284f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1285f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 1286f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setChecked(shouldCheck); 1287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch item.setEnabled(shouldEnable); 1288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 1289f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 1291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // ENABLE(CONTEXT_MENUS) 1293