⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webplugindatabase.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 2 页
字号:
- (void)refresh{    // This method does a bit of autoreleasing, so create an autorelease pool to ensure that calling    // -refresh multiple times does not bloat the default pool.    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];        // Create map from plug-in path to WebBasePluginPackage    if (!plugins)        plugins = [[NSMutableDictionary alloc] initWithCapacity:12];    // Find all plug-ins on disk    NSMutableSet *newPlugins = [self _scanForNewPlugins];    // Find plug-ins to remove from database (i.e., plug-ins that no longer exist on disk)    NSMutableSet *pluginsToRemove = [NSMutableSet set];    NSEnumerator *pluginEnumerator = [plugins objectEnumerator];    WebBasePluginPackage *plugin;    while ((plugin = [pluginEnumerator nextObject]) != nil) {        // Any plug-ins that were removed from disk since the last refresh should be removed from        // the database.        if (![newPlugins containsObject:plugin])            [pluginsToRemove addObject:plugin];                    // Remove every member of 'plugins' from 'newPlugins'.  After this loop exits, 'newPlugins'        // will be the set of new plug-ins that should be added to the database.        [newPlugins removeObject:plugin];    }#if !LOG_DISABLED    if ([newPlugins count] > 0)        LOG(Plugins, "New plugins:\n%@", newPlugins);    if ([pluginsToRemove count] > 0)        LOG(Plugins, "Removed plugins:\n%@", pluginsToRemove);#endif    // Remove plugins from database    pluginEnumerator = [pluginsToRemove objectEnumerator];    while ((plugin = [pluginEnumerator nextObject]) != nil)         [self _removePlugin:plugin];        // Add new plugins to database    pluginEnumerator = [newPlugins objectEnumerator];    while ((plugin = [pluginEnumerator nextObject]) != nil)        [self _addPlugin:plugin];    // Build a list of MIME types.    NSMutableSet *MIMETypes = [[NSMutableSet alloc] init];    pluginEnumerator = [plugins objectEnumerator];    while ((plugin = [pluginEnumerator nextObject]) != nil)        [MIMETypes addObjectsFromArray:[[plugin MIMETypeEnumerator] allObjects]];        // Register plug-in views and representations.    NSEnumerator *MIMEEnumerator = [MIMETypes objectEnumerator];    NSString *MIMEType;    while ((MIMEType = [MIMEEnumerator nextObject]) != nil) {        [registeredMIMETypes addObject:MIMEType];        if ([WebView canShowMIMETypeAsHTML:MIMEType])            // Don't allow plug-ins to override our core HTML types.            continue;        plugin = [self pluginForMIMEType:MIMEType];        if ([plugin isJavaPlugIn])            // Don't register the Java plug-in for a document view since Java files should be downloaded when not embedded.            continue;        if ([plugin isQuickTimePlugIn] && [[WebFrameView _viewTypesAllowImageTypeOmission:NO] objectForKey:MIMEType])            // Don't allow the QT plug-in to override any types because it claims many that we can handle ourselves.            continue;                if (self == sharedDatabase)            [WebView registerViewClass:[WebHTMLView class] representationClass:[WebHTMLRepresentation class] forMIMEType:MIMEType];    }    [MIMETypes release];        [pool drain];}- (BOOL)isMIMETypeRegistered:(NSString *)MIMEType{    return [registeredMIMETypes containsObject:MIMEType];}- (void)addPluginInstanceView:(NSView *)view{    [pluginInstanceViews addObject:view];}- (void)removePluginInstanceView:(NSView *)view{    [pluginInstanceViews removeObject:view];}- (void)removePluginInstanceViewsFor:(WebFrame*)webFrame{    // This handles handles the case where a frame or view is being destroyed and the plugin needs to be removed from the list first        if( [pluginInstanceViews count] == 0 )        return;    NSView <WebDocumentView> *documentView = [[webFrame frameView] documentView];     if ([documentView isKindOfClass:[WebHTMLView class]]) {        NSArray *subviews = [documentView subviews];         unsigned int subviewCount = [subviews count];         unsigned int subviewIndex;                 for (subviewIndex = 0; subviewIndex < subviewCount; subviewIndex++) {             NSView *subview = [subviews objectAtIndex:subviewIndex];             if ([subview isKindOfClass:[WebBaseNetscapePluginView class]] || [WebPluginController isPlugInView:subview])                 [pluginInstanceViews removeObject:subview];         }    }}- (void)destroyAllPluginInstanceViews{    NSView *view;    NSArray *pli = [pluginInstanceViews allObjects];    NSEnumerator *enumerator = [pli objectEnumerator];    while ((view = [enumerator nextObject]) != nil) {        if ([view isKindOfClass:[WebBaseNetscapePluginView class]]) {            ASSERT([view respondsToSelector:@selector(stop)]);            [view performSelector:@selector(stop)];        } else if ([WebPluginController isPlugInView:view]) {            ASSERT([[view superview] isKindOfClass:[WebHTMLView class]]);            ASSERT([[view superview] respondsToSelector:@selector(_destroyAllWebPlugins)]);            // this will actually destroy all plugin instances for a webHTMLView and remove them from this list            [[view superview] performSelector:@selector(_destroyAllWebPlugins)];         }    }}    @end@implementation WebPluginDatabase (Internal)+ (NSArray *)_defaultPlugInPaths{    // Plug-ins are found in order of precedence.    // If there are duplicates, the first found plug-in is used.    // For example, if there is a QuickTime.plugin in the users's home directory    // that is used instead of the /Library/Internet Plug-ins version.    // The purpose is to allow non-admin users to update their plug-ins.    return [NSArray arrayWithObjects:        [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Internet Plug-Ins"],        @"/Library/Internet Plug-Ins",        [[NSBundle mainBundle] builtInPlugInsPath],        nil];}- (NSArray *)_plugInPaths{    if (self == sharedDatabase && additionalWebPlugInPaths) {        // Add additionalWebPlugInPaths to the global WebPluginDatabase.  We do this here for        // backward compatibility with earlier versions of the +setAdditionalWebPlugInPaths: SPI,        // which simply saved a copy of the additional paths and did not cause the plugin DB to         // refresh.  See Radars 4608487 and 4609047.        NSMutableArray *modifiedPlugInPaths = [[plugInPaths mutableCopy] autorelease];        [modifiedPlugInPaths addObjectsFromArray:additionalWebPlugInPaths];        return modifiedPlugInPaths;    } else        return plugInPaths;}- (void)_addPlugin:(WebBasePluginPackage *)plugin{    ASSERT(plugin);    NSString *pluginPath = [plugin path];    ASSERT(pluginPath);    [plugins setObject:plugin forKey:pluginPath];    [plugin wasAddedToPluginDatabase:self];}- (void)_removePlugin:(WebBasePluginPackage *)plugin{        ASSERT(plugin);    // Unregister plug-in's MIME type registrations    NSEnumerator *MIMETypeEnumerator = [plugin MIMETypeEnumerator];    NSString *MIMEType;    while ((MIMEType = [MIMETypeEnumerator nextObject])) {        if ([registeredMIMETypes containsObject:MIMEType]) {            if (self == sharedDatabase)                [WebView _unregisterViewClassAndRepresentationClassForMIMEType:MIMEType];            [registeredMIMETypes removeObject:MIMEType];        }    }    // Remove plug-in from database    NSString *pluginPath = [plugin path];    ASSERT(pluginPath);    [plugin retain];    [plugins removeObjectForKey:pluginPath];    [plugin wasRemovedFromPluginDatabase:self];    [plugin release];}- (NSMutableSet *)_scanForNewPlugins{    NSMutableSet *newPlugins = [NSMutableSet set];    NSEnumerator *directoryEnumerator = [[self _plugInPaths] objectEnumerator];    NSMutableSet *uniqueFilenames = [[NSMutableSet alloc] init];    NSFileManager *fileManager = [NSFileManager defaultManager];    NSString *pluginDirectory;    while ((pluginDirectory = [directoryEnumerator nextObject]) != nil) {        // Get contents of each plug-in directory        NSEnumerator *filenameEnumerator = [[fileManager contentsOfDirectoryAtPath:pluginDirectory error:NULL] objectEnumerator];        NSString *filename;        while ((filename = [filenameEnumerator nextObject]) != nil) {            // Unique plug-ins by filename            if ([uniqueFilenames containsObject:filename])                continue;            [uniqueFilenames addObject:filename];                        // Create a plug-in package for this path            NSString *pluginPath = [pluginDirectory stringByAppendingPathComponent:filename];            WebBasePluginPackage *pluginPackage = [plugins objectForKey:pluginPath];            if (!pluginPackage)                pluginPackage = [WebBasePluginPackage pluginWithPath:pluginPath];            if (pluginPackage)                [newPlugins addObject:pluginPackage];        }    }    [uniqueFilenames release];        return newPlugins;}@end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -