bool PluginPackage::isPluginBlacklisted() { if (name() == "Citrix ICA Client") { // The Citrix ICA Client plug-in requires a Mozilla-based browser; see <rdar://6418681>. return true; } if (name() == "Silverlight Plug-In") { // workaround for <rdar://5557379> Crash in Silverlight when opening microsoft.com. // the latest 1.0 version of Silverlight does not reproduce this crash, so allow it // and any newer versions static const PlatformModuleVersion slPluginMinRequired(0x51BE0000, 0x00010000); if (compareFileVersion(slPluginMinRequired) < 0) return true; } else if (equalIgnoringCase(fileName(), "npmozax.dll")) { // Bug 15217: Mozilla ActiveX control complains about missing xpcom_core.dll return true; } else if (equalIgnoringCase(fileName(), "npwpf.dll")) { // Bug 57119: Microsoft Windows Presentation Foundation (WPF) plug-in complains about missing xpcom.dll return true; } else if (name() == "Yahoo Application State Plugin") { // https://bugs.webkit.org/show_bug.cgi?id=26860 // Bug in Yahoo Application State plug-in earlier than 1.0.0.6 leads to heap corruption. static const PlatformModuleVersion yahooAppStatePluginMinRequired(0x00000006, 0x00010000); if (compareFileVersion(yahooAppStatePluginMinRequired) < 0) return true; } return false; }
void PluginPackage::determineQuirks(const String& mimeType) { if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) { // Because a single process cannot create multiple VMs, and we cannot reliably unload a // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM m_quirks.add(PluginQuirkDontUnloadPlugin); // Setting the window region to an empty region causes bad scrolling repaint problems // with the Java plug-in. m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling); return; } if (mimeType == "application/x-shockwave-flash") { static const PlatformModuleVersion flashTenVersion(0x0a000000); if (compareFileVersion(flashTenVersion) >= 0) { // Flash 10.0 b218 doesn't like having a NULL window handle m_quirks.add(PluginQuirkDontSetNullWindowHandleOnDestroy); } else { // Flash 9 and older requests windowless plugins if we return a mozilla user agent m_quirks.add(PluginQuirkWantsMozillaUserAgent); } m_quirks.add(PluginQuirkThrottleInvalidate); m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages); m_quirks.add(PluginQuirkFlashURLNotifyBug); } }
void PluginPackage::determineQuirks(const String& mimeType) { if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) { // Because a single process cannot create multiple VMs, and we cannot reliably unload a // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM m_quirks.add(PluginQuirkDontUnloadPlugin); // Setting the window region to an empty region causes bad scrolling repaint problems // with the Java plug-in. m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling); return; } if (mimeType == "application/x-shockwave-flash") { static const PlatformModuleVersion flashTenVersion(0x0a000000); if (compareFileVersion(flashTenVersion) >= 0) { // Flash 10.0 b218 doesn't like having a NULL window handle m_quirks.add(PluginQuirkDontSetNullWindowHandleOnDestroy); #if PLATFORM(QT) m_quirks.add(PluginQuirkRequiresGtkToolKit); #endif } else { // Flash 9 and older requests windowless plugins if we return a mozilla user agent m_quirks.add(PluginQuirkWantsMozillaUserAgent); } #if PLATFORM(QT) // Flash will crash on repeated calls to SetWindow in windowed mode m_quirks.add(PluginQuirkDontCallSetWindowMoreThanOnce); #if CPU(X86_64) // 64-bit Flash freezes if right-click is sent in windowless mode m_quirks.add(PluginQuirkIgnoreRightClickInWindowlessMode); #endif #endif m_quirks.add(PluginQuirkRequiresDefaultScreenDepth); m_quirks.add(PluginQuirkThrottleInvalidate); m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages); m_quirks.add(PluginQuirkFlashURLNotifyBug); } #if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) // Passing a 32-bit depth pixmap to NPAPI plugins is too inefficient. Instead, pass a X Pixmap // that has same depth as the screen depth since graphics operations are optimized // for this depth. m_quirks.add(PluginQuirkRequiresDefaultScreenDepth); #endif }
bool PluginPackage::isPluginBlacklisted() { if (name() == "Silverlight Plug-In") { // workaround for <rdar://5557379> Crash in Silverlight when opening microsoft.com. // the latest 1.0 version of Silverlight does not reproduce this crash, so allow it // and any newer versions static const PlatformModuleVersion slPluginMinRequired(0x51BE0000, 0x00010000); if (compareFileVersion(slPluginMinRequired) < 0) return true; } else if (fileName() == "npmozax.dll") // Bug 15217: Mozilla ActiveX control complains about missing xpcom_core.dll return true; return false; }
int PluginPackage::compare(const PluginPackage& compareTo) const { // Sort plug-ins that allow multiple instances first. bool AallowsMultipleInstances = !quirks().contains(PluginQuirkDontAllowMultipleInstances); bool BallowsMultipleInstances = !compareTo.quirks().contains(PluginQuirkDontAllowMultipleInstances); if (AallowsMultipleInstances != BallowsMultipleInstances) return AallowsMultipleInstances ? -1 : 1; // Sort plug-ins in a preferred path first. bool AisInPreferredDirectory = PluginDatabase::isPreferredPluginDirectory(parentDirectory()); bool BisInPreferredDirectory = PluginDatabase::isPreferredPluginDirectory(compareTo.parentDirectory()); if (AisInPreferredDirectory != BisInPreferredDirectory) return AisInPreferredDirectory ? -1 : 1; int diff = strcmp(name().utf8().data(), compareTo.name().utf8().data()); if (diff) return diff; if (diff = compareFileVersion(compareTo.version())) return diff; return strcmp(parentDirectory().utf8().data(), compareTo.parentDirectory().utf8().data()); }
void PluginPackage::determineQuirks(const String& mimeType) { if (mimeType == "application/x-shockwave-flash") { static const PlatformModuleVersion flashTenVersion(0x00000000, 0x000a0000); // Pre 10 Flash only requests windowless plugins if we return a mozilla user agent if (compareFileVersion(flashTenVersion) < 0) m_quirks.add(PluginQuirkWantsMozillaUserAgent); m_quirks.add(PluginQuirkThrottleInvalidate); m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages); m_quirks.add(PluginQuirkFlashURLNotifyBug); } if (name().contains("Microsoft") && name().contains("Windows Media")) { // The WMP plugin sets its size on the first NPP_SetWindow call and never updates its size, so // call SetWindow when the plugin view has a correct size m_quirks.add(PluginQuirkDeferFirstSetWindowCall); // Windowless mode does not work at all with the WMP plugin so just remove that parameter // and don't pass it to the plug-in. m_quirks.add(PluginQuirkRemoveWindowlessVideoParam); // WMP has a modal message loop that it enters whenever we call it or // ask it to paint. This modal loop can deliver messages to other // windows in WebKit at times when they are not expecting them (for // example, delivering a WM_PAINT message during a layout), and these // can cause crashes. m_quirks.add(PluginQuirkHasModalMessageLoop); } if (name() == "VLC Multimedia Plugin") { // VLC hangs on NPP_Destroy if we call NPP_SetWindow with a null window handle m_quirks.add(PluginQuirkDontSetNullWindowHandleOnDestroy); // VLC 0.8.6d and 0.8.6e crash if multiple instances are created. // <rdar://problem/5773070> tracks allowing multiple instances when this // bug is fixed. m_quirks.add(PluginQuirkDontAllowMultipleInstances); } // The DivX plugin sets its size on the first NPP_SetWindow call and never updates its size, so // call SetWindow when the plugin view has a correct size if (mimeType == "video/divx") m_quirks.add(PluginQuirkDeferFirstSetWindowCall); // FIXME: This is a workaround for a problem in our NPRuntime bindings; if a plug-in creates an // NPObject and passes it to a function it's not possible to see what root object that NPObject belongs to. // Thus, we don't know that the object should be invalidated when the plug-in instance goes away. // See <rdar://problem/5487742>. if (mimeType == "application/x-silverlight") m_quirks.add(PluginQuirkDontUnloadPlugin); if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) { // Because a single process cannot create multiple VMs, and we cannot reliably unload a // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM m_quirks.add(PluginQuirkDontUnloadPlugin); // Setting the window region to an empty region causes bad scrolling repaint problems // with the Java plug-in. m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling); } if (mimeType == "audio/x-pn-realaudio-plugin") { // Prevent the Real plugin from calling the Window Proc recursively, causing the stack to overflow. m_quirks.add(PluginQuirkDontCallWndProcForSameMessageRecursively); static const PlatformModuleVersion lastKnownUnloadableRealPlayerVersion(0x000B0B24, 0x00060000); // Unloading RealPlayer versions newer than 10.5 can cause a hang; see rdar://5669317. // FIXME: Resume unloading when this bug in the RealPlayer Plug-In is fixed (rdar://5713147) if (compareFileVersion(lastKnownUnloadableRealPlayerVersion) > 0) m_quirks.add(PluginQuirkDontUnloadPlugin); } }