void WebPluginInfoProvider::getWebVisiblePluginInfo(WebCore::Page& page, Vector<WebCore::PluginInfo>& plugins)
{
    ASSERT_ARG(plugins, plugins.isEmpty());

    getPluginInfo(page, plugins);

#if PLATFORM(MAC)
    if (auto* document = page.mainFrame().document()) {
        if (auto* securityOrigin = document->securityOrigin()) {
            if (securityOrigin->isLocal())
                return;
        }
    }

    for (int32_t i = plugins.size() - 1; i >= 0; --i) {
        auto& info = plugins.at(i);

        // Allow built-in plugins. Also tentatively allow plugins that the client might later selectively permit.
        if (info.isApplicationPlugin || info.clientLoadPolicy == WebCore::PluginLoadClientPolicyAsk)
            continue;

        if (info.clientLoadPolicy == WebCore::PluginLoadClientPolicyBlock)
            plugins.remove(i);
    }
#endif
}
Example #2
0
void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
{
    ASSERT_ARG(page, page);
    ASSERT_ARG(plugins, plugins.isEmpty());

    getPluginInfo(page, plugins);

#if PLATFORM(MAC)
    if (Document* document = page->mainFrame().document()) {
        if (SecurityOrigin* securityOrigin = document->securityOrigin()) {
            if (securityOrigin->isLocal())
                return;
        }
    }
    
    for (int32_t i = plugins.size() - 1; i >= 0; --i) {
        PluginInfo& info = plugins.at(i);
        PluginLoadClientPolicy clientPolicy = info.clientLoadPolicy;
        // Allow built-in plugins. Also tentatively allow plugins that the client might later selectively permit.
        if (info.isApplicationPlugin || clientPolicy == PluginLoadClientPolicyAsk)
            continue;

        if (clientPolicy == PluginLoadClientPolicyBlock)
            plugins.remove(i);
    }
#endif
}
Example #3
0
void PluginInfoStore::loadPlugin(Vector<PluginModuleInfo>& plugins, const String& pluginPath)
{
    PluginModuleInfo plugin;

    if (!getPluginInfo(pluginPath, plugin))
        return;

    if (!shouldUsePlugin(plugins, plugin))
        return;

    plugins.append(plugin);
}
Example #4
0
void PluginInfoStore::loadPlugin(const String& pluginPath)
{
    Plugin plugin;
    
    if (!getPluginInfo(pluginPath, plugin))
        return;

    if (!shouldUsePlugin(plugin))
        return;
    
    // Add the plug-in.
    m_plugins.append(plugin);
}
Example #5
0
void NetscapePluginModule::determineQuirks()
{
    PluginInfoStore::Plugin plugin;
    getPluginInfo(m_pluginPath, plugin);

    Vector<MimeClassInfo> mimeTypes = plugin.info.mimes;
    for (size_t i = 0; i < mimeTypes.size(); ++i) {
        // FIXME: It seems strange to assume that any plugin that handles this MIME type needs this quirk. Should
        // we be be checking the plugin's name instead?
        if (mimeTypes[i].type == "application/x-shockwave-flash") {
            uint64_t flashTenVersion = fileVersion(0x00000000, 0x000a0000);
            uint64_t version = plugin.fileVersion;

            // Pre Flash v10 only requests windowless plugins if we use a Mozilla user agent.
            // For testing information, see: https://bugs.webkit.org/show_bug.cgi?id=60726.
            if (version < flashTenVersion)
                m_pluginQuirks.add(PluginQuirks::WantsMozillaUserAgent);

            break;
        }
    }
}
PluginInfoList& PluginFactory::rescan()
{
    //remove plugins that are not loaded

    PluginInfoList::Iterator it = infoList.begin();
    while( it != infoList.end() ) {
        PluginInfo *info = (*it).first;
        if( !info ) continue;

        //plugin is not loaded
        if( !info->get() ) {
            QLibrary *lib = (*it).second;
            lib->unload();
            delete lib;
            it = infoList.remove(it);
            continue;
        }
        ++it;
    }

    //load all plugins (and avoid collisions)

    QRegExp libRxp = QRegExp( "^lib.*\\.so[0-9.]*$" );
    //QRegExp libRxp = QRegExp( "^lib.*" );

    PluginInfoList pluginList;

    QStringList libraryPaths = ancaConf->readListEntry( LIBRARY_PATHS, LIBRARY_PATHS_DEFAULT );
#ifdef PREL
    libraryPaths.append( PREL "/share/anca/plugins");
#endif
    libraryPaths.append(QDir::homeDirPath() + "/.anca/plugins");

    //iterate all paths where plugins should be
    for ( QStringList::iterator it = libraryPaths.begin(); it != libraryPaths.end(); ++it ) {
        PTRACE( 3, "Searching directory " << ( *it ).latin1() << " for plugins" );
        QDir dir( *it );
        if ( !dir.exists() ) continue;

        dir.setFilter( QDir::Files | QDir::NoSymLinks );

        const QFileInfoList *fileList = dir.entryInfoList();
        QFileInfo *file;
        QLibrary *lib;
        //iterate all files in the directory
        for ( QFileInfoListIterator fit( *fileList ); ( file = *fit ); ++fit ) {
            //is the file plugin?
            if ( !file->fileName().contains( libRxp ) ) continue;

            //open plugin
            lib = new QLibrary( file->filePath().latin1() );

            if( !lib->load() ) {
                PTRACE( 3, "Library " << file->fileName().latin1() << " could not be loaded" );
                continue;
            }

            //resolve symbol 'getPluginInfo'
            if ( GetPluginInfo * getPluginInfo = ( GetPluginInfo* ) lib->resolve( "getPluginInfo" ) ) {
                PluginInfo * pluginInfo = getPluginInfo();

                pluginList.append( PluginInfoPair(pluginInfo, lib) );
            } else {
                PTRACE( 3, "Symbol \"getPluginInfo\" not found in library " << file->fileName().latin1() );
                delete lib;
            }
        }
    }

    //insert that pluginInfo to class infoList that in not already there
    for( PluginInfoList::iterator it = pluginList.begin(); it != pluginList.end(); ++it ) {
        QLibrary *lib = (*it).second;
        if( !lib ) continue;

        if( !infoList.contains( *it ) )
            infoList.append( *it );
        else {
            lib->unload();
            delete lib;
        }
    }

    // sort plugins according to type
    qHeapSort(infoList);

    return infoList;
}