18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
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 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebContextMenuClient.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebDelegateImplementationCaching.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebElementDictionary.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrame.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLView.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLViewInternal.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitVersionChecks.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSPasteboardExtras.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebUIDelegate.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebUIDelegatePrivate.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebView.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewFactory.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewInternal.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ContextMenu.h>
45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import <WebCore/ContextMenuController.h>
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/KURL.h>
470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#import <WebCore/LocalizedStrings.h>
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import <WebCore/Page.h>
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/RuntimeApplicationChecks.h>
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMPrivate.h>
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSApplication (AppKitSecretsIKnowAbout)
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)speakString:(NSString *)string;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebContextMenuClient::WebContextMenuClient(WebView *webView)
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_webView(webView)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::contextMenuDestroyed()
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic BOOL isPreVersion3Client(void)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL preVersion3Client = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_3_0_CONTEXT_MENU_TAGS);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return preVersion3Client;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic BOOL isPreInspectElementTagClient(void)
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL preInspectElementTagClient = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_INSPECT_ELEMENT_MENU_TAG);
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return preInspectElementTagClient;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSMutableArray *fixMenusToSendToOldClients(NSMutableArray *defaultMenuItems)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray *savedItems = nil;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned defaultItemsCount = [defaultMenuItems count];
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isPreInspectElementTagClient() && defaultItemsCount >= 2) {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSMenuItem *secondToLastItem = [defaultMenuItems objectAtIndex:defaultItemsCount - 2];
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSMenuItem *lastItem = [defaultMenuItems objectAtIndex:defaultItemsCount - 1];
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([secondToLastItem isSeparatorItem] && [lastItem tag] == WebMenuItemTagInspectElement) {
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            savedItems = [NSMutableArray arrayWithCapacity:2];
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [savedItems addObject:secondToLastItem];
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [savedItems addObject:lastItem];
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [defaultMenuItems removeObject:secondToLastItem];
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [defaultMenuItems removeObject:lastItem];
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            defaultItemsCount -= 2;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL preVersion3Client = isPreVersion3Client();
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!preVersion3Client)
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return savedItems;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    BOOL isMail = applicationIsAppleMail();
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < defaultItemsCount; ++i) {
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSMenuItem *item = [defaultMenuItems objectAtIndex:i];
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int tag = [item tag];
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int oldStyleTag = tag;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (preVersion3Client && isMail && tag == WebMenuItemTagOpenLink) {
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Tiger Mail changes our "Open Link in New Window" item to "Open Link"
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // and doesn't expect us to include an "Open Link" item at all. (5011905)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [defaultMenuItems removeObjectAtIndex:i];
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            i--;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            defaultItemsCount--;
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tag >= WEBMENUITEMTAG_WEBKIT_3_0_SPI_START) {
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Change all editing-related SPI tags listed in WebUIDelegatePrivate.h to WebMenuItemTagOther
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // to match our old WebKit context menu behavior.
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            oldStyleTag = WebMenuItemTagOther;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // All items are expected to have useful tags coming into this method.
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(tag != WebMenuItemTagOther);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Use the pre-3.0 tags for the few items that changed tags as they moved from SPI to API. We
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // do this only for old clients; new Mail already expects the new symbols in this case.
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (preVersion3Client) {
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (tag) {
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case WebMenuItemTagSearchInSpotlight:
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        oldStyleTag = OldWebMenuItemTagSearchInSpotlight;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case WebMenuItemTagSearchWeb:
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        oldStyleTag = OldWebMenuItemTagSearchWeb;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case WebMenuItemTagLookUpInDictionary:
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        oldStyleTag = OldWebMenuItemTagLookUpInDictionary;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    default:
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (oldStyleTag != tag)
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [item setTag:oldStyleTag];
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return savedItems;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void fixMenusReceivedFromOldClients(NSMutableArray *newMenuItems, NSMutableArray *savedItems)
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (savedItems)
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [newMenuItems addObjectsFromArray:savedItems];
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL preVersion3Client = isPreVersion3Client();
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!preVersion3Client)
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Restore the modern tags to the menu items whose tags we altered in fixMenusToSendToOldClients.
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned newItemsCount = [newMenuItems count];
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < newItemsCount; ++i) {
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSMenuItem *item = [newMenuItems objectAtIndex:i];
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int tag = [item tag];
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int modernTag = tag;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tag == WebMenuItemTagOther) {
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Restore the specific tag for items on which we temporarily set WebMenuItemTagOther to match old behavior.
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSString *title = [item title];
1740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            if ([title isEqualToString:contextMenuItemTagOpenLink()])
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagOpenLink;
1760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagIgnoreGrammar()])
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagIgnoreGrammar;
1780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagSpellingMenu()])
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagSpellingMenu;
1800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagShowSpellingPanel(true)]
1810617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     || [title isEqualToString:contextMenuItemTagShowSpellingPanel(false)])
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagShowSpellingPanel;
1830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagCheckSpelling()])
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagCheckSpelling;
1850617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagCheckSpellingWhileTyping()])
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagCheckSpellingWhileTyping;
1870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagCheckGrammarWithSpelling()])
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagCheckGrammarWithSpelling;
1890617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagFontMenu()])
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagFontMenu;
1910617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagShowFonts()])
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagShowFonts;
1930617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagBold()])
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagBold;
1950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagItalic()])
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagItalic;
1970617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagUnderline()])
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagUnderline;
1990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagOutline()])
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagOutline;
2010617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagStyles()])
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagStyles;
2030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagShowColors()])
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagShowColors;
2050617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagSpeechMenu()])
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagSpeechMenu;
2070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagStartSpeaking()])
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagStartSpeaking;
2090617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagStopSpeaking()])
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagStopSpeaking;
2110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagWritingDirectionMenu()])
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagWritingDirectionMenu;
2130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagDefaultDirection()])
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagDefaultDirection;
2150617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagLeftToRight()])
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagLeftToRight;
2170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagRightToLeft()])
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                modernTag = WebMenuItemTagRightToLeft;
2190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagInspectElement()])
220545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                modernTag = WebMenuItemTagInspectElement;
2210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagCorrectSpellingAutomatically()])
2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagCorrectSpellingAutomatically;
2230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagSubstitutionsMenu()])
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagSubstitutionsMenu;
2250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagShowSubstitutions(true)]
2260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                     || [title isEqualToString:contextMenuItemTagShowSubstitutions(false)])
2270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagShowSubstitutions;
2280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagSmartCopyPaste()])
2290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagSmartCopyPaste;
2300617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagSmartQuotes()])
2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagSmartQuotes;
2320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagSmartDashes()])
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagSmartDashes;
2340617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagSmartLinks()])
2350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagSmartLinks;
2360617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagTextReplacement()])
2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagTextReplacement;
2380617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagTransformationsMenu()])
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagTransformationsMenu;
2400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagMakeUpperCase()])
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagMakeUpperCase;
2420617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagMakeLowerCase()])
2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagMakeLowerCase;
2440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            else if ([title isEqualToString:contextMenuItemTagCapitalize()])
2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                modernTag = WebMenuItemTagCapitalize;
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We don't expect WebMenuItemTagOther for any items other than the ones we explicitly handle.
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // There's nothing to prevent an app from applying this tag, but they are supposed to only
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // use tags in the range starting with WebMenuItemBaseApplicationTag=10000
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (preVersion3Client) {
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Restore the new API tag for items on which we temporarily set the old SPI tag. The old SPI tag was
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // needed to avoid confusing clients linked against earlier WebKits; the new API tag is needed for
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // WebCore to handle the menu items appropriately (without needing to know about the old SPI tags).
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (tag) {
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case OldWebMenuItemTagSearchInSpotlight:
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    modernTag = WebMenuItemTagSearchInSpotlight;
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case OldWebMenuItemTagSearchWeb:
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    modernTag = WebMenuItemTagSearchWeb;
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case OldWebMenuItemTagLookUpInDictionary:
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    modernTag = WebMenuItemTagLookUpInDictionary;
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (modernTag != tag)
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [item setTag:modernTag];
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSMutableArray* WebContextMenuClient::getCustomMenuFromDefaultItems(ContextMenu* defaultMenu)
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id delegate = [m_webView UIDelegate];
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SEL selector = @selector(webView:contextMenuItemsForElement:defaultMenuItems:);
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![delegate respondsToSelector:selector])
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return defaultMenu->platformDescription();
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
283f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSDictionary *element = [[[WebElementDictionary alloc] initWithHitTestResult:[m_webView page]->contextMenuController()->hitTestResult()] autorelease];
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL preVersion3Client = isPreVersion3Client();
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (preVersion3Client) {
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DOMNode *node = [element objectForKey:WebElementDOMNodeKey];
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([node isKindOfClass:[DOMHTMLInputElement class]] && [(DOMHTMLInputElement *)node _isTextField])
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return defaultMenu->platformDescription();
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([node isKindOfClass:[DOMHTMLTextAreaElement class]])
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return defaultMenu->platformDescription();
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray *defaultMenuItems = defaultMenu->platformDescription();
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned defaultItemsCount = [defaultMenuItems count];
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < defaultItemsCount; ++i)
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[defaultMenuItems objectAtIndex:i] setRepresentedObject:element];
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray *savedItems = [fixMenusToSendToOldClients(defaultMenuItems) retain];
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *delegateSuppliedItems = CallUIDelegate(m_webView, selector, element, defaultMenuItems);
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray *newMenuItems = [delegateSuppliedItems mutableCopy];
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fixMenusReceivedFromOldClients(newMenuItems, savedItems);
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [savedItems release];
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [newMenuItems autorelease];
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::contextMenuItemSelected(ContextMenuItem* item, const ContextMenu* parentMenu)
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id delegate = [m_webView UIDelegate];
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SEL selector = @selector(webView:contextMenuItemSelected:forElement:);
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([delegate respondsToSelector:selector]) {
313f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        NSDictionary *element = [[WebElementDictionary alloc] initWithHitTestResult:[m_webView page]->contextMenuController()->hitTestResult()];
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSMenuItem *platformItem = item->releasePlatformDescription();
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CallUIDelegate(m_webView, selector, platformItem, element);
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [element release];
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [platformItem release];
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::downloadURL(const KURL& url)
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_webView _downloadURL:url];
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::searchWithSpotlight()
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_webView _searchWithSpotlightFromMenu:nil];
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::searchWithGoogle(const Frame*)
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_webView _searchWithGoogleFromMenu:nil];
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::lookUpInDictionary(Frame* frame)
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebHTMLView* htmlView = (WebHTMLView*)[[kit(frame) frameView] documentView];
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if(![htmlView isKindOfClass:[WebHTMLView class]])
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [htmlView _lookUpInDictionaryFromMenu:nil];
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WebContextMenuClient::isSpeaking()
3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [NSApp isSpeaking];
3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::speak(const String& string)
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSApp speakString:[[(NSString*)string copy] autorelease]];
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebContextMenuClient::stopSpeaking()
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [NSApp stopSpeaking:nil];
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
360