18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Apple Computer, 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 "WebPluginDatabase.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebBaseNetscapePluginView.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebBasePluginPackage.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDataSourcePrivate.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrame.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameViewInternal.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLRepresentation.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLView.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSFileManagerExtras.h" 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebNetscapePluginPackage.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPluginController.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPluginPackage.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewPrivate.h" 4421939df44de1705786c545cd1bf519d47250322dBen Murdoch#import "WebViewInternal.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h> 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace WebCore; 4906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void checkCandidate(WebBasePluginPackage **currentPlugin, WebBasePluginPackage **candidatePlugin); 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebPluginDatabase (Internal) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)_defaultPlugInPaths; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)_plugInPaths; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addPlugin:(WebBasePluginPackage *)plugin; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_removePlugin:(WebBasePluginPackage *)plugin; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSMutableSet *)_scanForNewPlugins; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebPluginDatabase 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WebPluginDatabase *sharedDatabase = nil; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (WebPluginDatabase *)sharedDatabase 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!sharedDatabase) { 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sharedDatabase = [[WebPluginDatabase alloc] init]; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [sharedDatabase setPlugInPaths:[self _defaultPlugInPaths]]; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [sharedDatabase refresh]; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return sharedDatabase; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)closeSharedDatabase 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [sharedDatabase close]; 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void checkCandidate(WebBasePluginPackage **currentPlugin, WebBasePluginPackage **candidatePlugin) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!*currentPlugin) { 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *currentPlugin = *candidatePlugin; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if ([*currentPlugin bundleIdentifier] == [*candidatePlugin bundleIdentifier] && [*candidatePlugin versionNumber] > [*currentPlugin versionNumber]) 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *currentPlugin = *candidatePlugin; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstruct PluginPackageCandidates { 9206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PluginPackageCandidates() 9306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen : webPlugin(nil) 9406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , machoPlugin(nil) 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM 9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , CFMPlugin(nil) 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void update(WebBasePluginPackage *plugin) 10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if ([plugin isKindOfClass:[WebPluginPackage class]]) { 10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen checkCandidate(&webPlugin, &plugin); 10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return; 10606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 10706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API) 10906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if([plugin isKindOfClass:[WebNetscapePluginPackage class]]) { 11006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebExecutableType executableType = [(WebNetscapePluginPackage *)plugin executableType]; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM 11206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (executableType == WebCFMExecutableType) { 11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen checkCandidate(&CFMPlugin, &plugin); 11406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return; 11506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // SUPPORT_CFM 11706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (executableType == WebMachOExecutableType) { 11806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen checkCandidate(&machoPlugin, &plugin); 11906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 12306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT_NOT_REACHED(); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebBasePluginPackage *bestCandidate() 12706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen { 12806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // Allow other plug-ins to win over QT because if the user has installed a plug-in that can handle a type 12906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // that the QT plug-in can handle, they probably intended to override QT. 13006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (webPlugin && ![webPlugin isQuickTimePlugIn]) 13106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return webPlugin; 13206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 13306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (machoPlugin && ![machoPlugin isQuickTimePlugIn]) 13406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return machoPlugin; 13506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM 13706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (CFMPlugin && ![CFMPlugin isQuickTimePlugIn]) 13806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return CFMPlugin; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // SUPPORT_CFM 14006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 14106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (webPlugin) 14206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return webPlugin; 14306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (machoPlugin) 14406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return machoPlugin; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM 14606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (CFMPlugin) 14706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return CFMPlugin; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 14906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return nil; 15006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 15106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 15206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebBasePluginPackage *webPlugin; 15306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebBasePluginPackage *machoPlugin; 15406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifdef SUPPORT_CFM 15506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebBasePluginPackage *CFMPlugin; 15606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 15706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebBasePluginPackage *)pluginForMIMEType:(NSString *)MIMEType 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PluginPackageCandidates candidates; 16206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 16306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen MIMEType = [MIMEType lowercaseString]; 16406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSEnumerator *pluginEnumerator = [plugins objectEnumerator]; 16506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 16606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen while (WebBasePluginPackage *plugin = [pluginEnumerator nextObject]) { 16706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if ([plugin supportsMIMEType:MIMEType]) 16806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen candidates.update(plugin); 16906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 17006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 17106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return candidates.bestCandidate(); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebBasePluginPackage *)pluginForExtension:(NSString *)extension 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PluginPackageCandidates candidates; 17706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 17806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen extension = [extension lowercaseString]; 17906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSEnumerator *pluginEnumerator = [plugins objectEnumerator]; 18006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 18106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen while (WebBasePluginPackage *plugin = [pluginEnumerator nextObject]) { 18206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if ([plugin supportsExtension:extension]) 18306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen candidates.update(plugin); 18406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 18506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 18606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen WebBasePluginPackage *plugin = candidates.bestCandidate(); 18706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!plugin) { 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If no plug-in was found from the extension, attempt to map from the extension to a MIME type 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // and find the a plug-in from the MIME type. This is done in case the plug-in has not fully specified 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // an extension <-> MIME type mapping. 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *MIMEType = WKGetMIMETypeForExtension(extension); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([MIMEType length] > 0) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project plugin = [self pluginForMIMEType:MIMEType]; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return plugin; 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)plugins 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [plugins allValues]; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSArray *additionalWebPlugInPaths; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)setAdditionalWebPlugInPaths:(NSArray *)additionalPaths 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (additionalPaths == additionalWebPlugInPaths) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [additionalWebPlugInPaths release]; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project additionalWebPlugInPaths = [additionalPaths copy]; 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // One might be tempted to add additionalWebPlugInPaths to the global WebPluginDatabase here. 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For backward compatibility with earlier versions of the +setAdditionalWebPlugInPaths: SPI, 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we need to save a copy of the additional paths and not cause a refresh of the plugin DB 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // at this time. 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See Radars 4608487 and 4609047. 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setPlugInPaths:(NSArray *)newPaths 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (plugInPaths == newPaths) 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugInPaths release]; 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project plugInPaths = [newPaths copy]; 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)close 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *pluginEnumerator = [[self plugins] objectEnumerator]; 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebBasePluginPackage *plugin; 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((plugin = [pluginEnumerator nextObject]) != nil) 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _removePlugin:plugin]; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugins release]; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project plugins = nil; 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)init 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(self = [super init])) 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project registeredMIMETypes = [[NSMutableSet alloc] init]; 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginInstanceViews = [[NSMutableSet alloc] init]; 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugInPaths release]; 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugins release]; 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [registeredMIMETypes release]; 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginInstanceViews release]; 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)refresh 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This method does a bit of autoreleasing, so create an autorelease pool to ensure that calling 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -refresh multiple times does not bloat the default pool. 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create map from plug-in path to WebBasePluginPackage 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!plugins) 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project plugins = [[NSMutableDictionary alloc] initWithCapacity:12]; 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Find all plug-ins on disk 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableSet *newPlugins = [self _scanForNewPlugins]; 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Find plug-ins to remove from database (i.e., plug-ins that no longer exist on disk) 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableSet *pluginsToRemove = [NSMutableSet set]; 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *pluginEnumerator = [plugins objectEnumerator]; 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebBasePluginPackage *plugin; 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((plugin = [pluginEnumerator nextObject]) != nil) { 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Any plug-ins that were removed from disk since the last refresh should be removed from 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the database. 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (![newPlugins containsObject:plugin]) 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginsToRemove addObject:plugin]; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Remove every member of 'plugins' from 'newPlugins'. After this loop exits, 'newPlugins' 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // will be the set of new plug-ins that should be added to the database. 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [newPlugins removeObject:plugin]; 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([newPlugins count] > 0) 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(Plugins, "New plugins:\n%@", newPlugins); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([pluginsToRemove count] > 0) 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(Plugins, "Removed plugins:\n%@", pluginsToRemove); 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Remove plugins from database 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginEnumerator = [pluginsToRemove objectEnumerator]; 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((plugin = [pluginEnumerator nextObject]) != nil) 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _removePlugin:plugin]; 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Add new plugins to database 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginEnumerator = [newPlugins objectEnumerator]; 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((plugin = [pluginEnumerator nextObject]) != nil) 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _addPlugin:plugin]; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Build a list of MIME types. 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableSet *MIMETypes = [[NSMutableSet alloc] init]; 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginEnumerator = [plugins objectEnumerator]; 30906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen while ((plugin = [pluginEnumerator nextObject])) { 31006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const PluginInfo& pluginInfo = [plugin pluginInfo]; 31106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen for (size_t i = 0; i < pluginInfo.mimes.size(); ++i) 31206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen [MIMETypes addObject:pluginInfo.mimes[i].type]; 31306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Register plug-in views and representations. 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *MIMEEnumerator = [MIMETypes objectEnumerator]; 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *MIMEType; 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((MIMEType = [MIMEEnumerator nextObject]) != nil) { 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [registeredMIMETypes addObject:MIMEType]; 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([WebView canShowMIMETypeAsHTML:MIMEType]) 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't allow plug-ins to override our core HTML types. 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project plugin = [self pluginForMIMEType:MIMEType]; 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([plugin isJavaPlugIn]) 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't register the Java plug-in for a document view since Java files should be downloaded when not embedded. 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([plugin isQuickTimePlugIn] && [[WebFrameView _viewTypesAllowImageTypeOmission:NO] objectForKey:MIMEType]) 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't allow the QT plug-in to override any types because it claims many that we can handle ourselves. 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (self == sharedDatabase) 33321939df44de1705786c545cd1bf519d47250322dBen Murdoch [WebView _registerPluginMIMEType:MIMEType]; 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [MIMETypes release]; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pool drain]; 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isMIMETypeRegistered:(NSString *)MIMEType 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [registeredMIMETypes containsObject:MIMEType]; 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)addPluginInstanceView:(NSView *)view 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginInstanceViews addObject:view]; 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removePluginInstanceView:(NSView *)view 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginInstanceViews removeObject:view]; 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removePluginInstanceViewsFor:(WebFrame*)webFrame 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This handles handles the case where a frame or view is being destroyed and the plugin needs to be removed from the list first 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if( [pluginInstanceViews count] == 0 ) 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView <WebDocumentView> *documentView = [[webFrame frameView] documentView]; 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([documentView isKindOfClass:[WebHTMLView class]]) { 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSArray *subviews = [documentView subviews]; 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned int subviewCount = [subviews count]; 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned int subviewIndex; 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (subviewIndex = 0; subviewIndex < subviewCount; subviewIndex++) { 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *subview = [subviews objectAtIndex:subviewIndex]; 3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(NETSCAPE_PLUGIN_API) 3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if ([subview isKindOfClass:[WebBaseNetscapePluginView class]] || [WebPluginController isPlugInView:subview]) 3720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if ([WebPluginController isPlugInView:subview]) 3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginInstanceViews removeObject:subview]; 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)destroyAllPluginInstanceViews 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *view; 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSArray *pli = [pluginInstanceViews allObjects]; 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *enumerator = [pli objectEnumerator]; 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((view = [enumerator nextObject]) != nil) { 3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(NETSCAPE_PLUGIN_API) 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([view isKindOfClass:[WebBaseNetscapePluginView class]]) { 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([view respondsToSelector:@selector(stop)]); 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view performSelector:@selector(stop)]; 3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } else 3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if ([WebPluginController isPlugInView:view]) { 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([[view superview] isKindOfClass:[WebHTMLView class]]); 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([[view superview] respondsToSelector:@selector(_destroyAllWebPlugins)]); 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this will actually destroy all plugin instances for a webHTMLView and remove them from this list 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[view superview] performSelector:@selector(_destroyAllWebPlugins)]; 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebPluginDatabase (Internal) 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)_defaultPlugInPaths 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Plug-ins are found in order of precedence. 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If there are duplicates, the first found plug-in is used. 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For example, if there is a QuickTime.plugin in the users's home directory 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that is used instead of the /Library/Internet Plug-ins version. 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The purpose is to allow non-admin users to update their plug-ins. 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [NSArray arrayWithObjects: 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Internet Plug-Ins"], 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project @"/Library/Internet Plug-Ins", 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[NSBundle mainBundle] builtInPlugInsPath], 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nil]; 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)_plugInPaths 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (self == sharedDatabase && additionalWebPlugInPaths) { 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Add additionalWebPlugInPaths to the global WebPluginDatabase. We do this here for 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // backward compatibility with earlier versions of the +setAdditionalWebPlugInPaths: SPI, 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // which simply saved a copy of the additional paths and did not cause the plugin DB to 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // refresh. See Radars 4608487 and 4609047. 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *modifiedPlugInPaths = [[plugInPaths mutableCopy] autorelease]; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [modifiedPlugInPaths addObjectsFromArray:additionalWebPlugInPaths]; 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return modifiedPlugInPaths; 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return plugInPaths; 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addPlugin:(WebBasePluginPackage *)plugin 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(plugin); 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *pluginPath = [plugin path]; 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(pluginPath); 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugins setObject:plugin forKey:pluginPath]; 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugin wasAddedToPluginDatabase:self]; 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_removePlugin:(WebBasePluginPackage *)plugin 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(plugin); 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Unregister plug-in's MIME type registrations 44706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const PluginInfo& pluginInfo = [plugin pluginInfo]; 44806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen for (size_t i = 0; i < pluginInfo.mimes.size(); ++i) { 44906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSString *MIMEType = pluginInfo.mimes[i].type; 45006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([registeredMIMETypes containsObject:MIMEType]) { 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (self == sharedDatabase) 45321939df44de1705786c545cd1bf519d47250322dBen Murdoch [WebView _unregisterPluginMIMEType:MIMEType]; 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [registeredMIMETypes removeObject:MIMEType]; 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Remove plug-in from database 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *pluginPath = [plugin path]; 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(pluginPath); 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugin retain]; 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugins removeObjectForKey:pluginPath]; 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugin wasRemovedFromPluginDatabase:self]; 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [plugin release]; 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSMutableSet *)_scanForNewPlugins 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableSet *newPlugins = [NSMutableSet set]; 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *directoryEnumerator = [[self _plugInPaths] objectEnumerator]; 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableSet *uniqueFilenames = [[NSMutableSet alloc] init]; 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSFileManager *fileManager = [NSFileManager defaultManager]; 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *pluginDirectory; 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((pluginDirectory = [directoryEnumerator nextObject]) != nil) { 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get contents of each plug-in directory 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *filenameEnumerator = [[fileManager contentsOfDirectoryAtPath:pluginDirectory error:NULL] objectEnumerator]; 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *filename; 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((filename = [filenameEnumerator nextObject]) != nil) { 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Unique plug-ins by filename 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([uniqueFilenames containsObject:filename]) 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continue; 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [uniqueFilenames addObject:filename]; 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a plug-in package for this path 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *pluginPath = [pluginDirectory stringByAppendingPathComponent:filename]; 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebBasePluginPackage *pluginPackage = [plugins objectForKey:pluginPath]; 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pluginPackage) 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginPackage = [WebBasePluginPackage pluginWithPath:pluginPath]; 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pluginPackage) 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [newPlugins addObject:pluginPackage]; 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [uniqueFilenames release]; 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return newPlugins; 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 499