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