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