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