summaryrefslogtreecommitdiffstats
path: root/WebCore/plugins/win/PluginPackageWin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/plugins/win/PluginPackageWin.cpp')
-rw-r--r--WebCore/plugins/win/PluginPackageWin.cpp342
1 files changed, 0 insertions, 342 deletions
diff --git a/WebCore/plugins/win/PluginPackageWin.cpp b/WebCore/plugins/win/PluginPackageWin.cpp
deleted file mode 100644
index 74bd2a9..0000000
--- a/WebCore/plugins/win/PluginPackageWin.cpp
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
- * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "config.h"
-#include "PluginPackage.h"
-
-#include "MIMETypeRegistry.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-#include "Timer.h"
-#include "npruntime_impl.h"
-#include <string.h>
-#include <wtf/OwnArrayPtr.h>
-#include <wtf/text/CString.h>
-#include <shlwapi.h>
-
-namespace WebCore {
-
-static String getVersionInfo(const LPVOID versionInfoData, const String& info)
-{
- LPVOID buffer;
- UINT bufferLength;
- String subInfo = "\\StringfileInfo\\040904E4\\" + info;
- bool retval = VerQueryValueW(versionInfoData,
- const_cast<UChar*>(subInfo.charactersWithNullTermination()),
- &buffer, &bufferLength);
- if (!retval || bufferLength == 0)
- return String();
-
- // Subtract 1 from the length; we don't want the trailing null character.
- return String(reinterpret_cast<UChar*>(buffer), bufferLength - 1);
-}
-
-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 (fileName() == "npmozax.dll") {
- // Bug 15217: Mozilla ActiveX control complains about missing xpcom_core.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 (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" || name() == "VLC Multimedia Plug-in") {
- // 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);
- }
-}
-
-bool PluginPackage::fetchInfo()
-{
- DWORD versionInfoSize, zeroHandle;
- versionInfoSize = GetFileVersionInfoSizeW(const_cast<UChar*>(m_path.charactersWithNullTermination()), &zeroHandle);
- if (versionInfoSize == 0)
- return false;
-
- OwnArrayPtr<char> versionInfoData(new char[versionInfoSize]);
-
- if (!GetFileVersionInfoW(const_cast<UChar*>(m_path.charactersWithNullTermination()),
- 0, versionInfoSize, versionInfoData.get()))
- return false;
-
- m_name = getVersionInfo(versionInfoData.get(), "ProductName");
- m_description = getVersionInfo(versionInfoData.get(), "FileDescription");
- if (m_name.isNull() || m_description.isNull())
- return false;
-
- VS_FIXEDFILEINFO* info;
- UINT infoSize;
- if (!VerQueryValueW(versionInfoData.get(), L"\\", (LPVOID*) &info, &infoSize) || infoSize < sizeof(VS_FIXEDFILEINFO))
- return false;
- m_moduleVersion.leastSig = info->dwFileVersionLS;
- m_moduleVersion.mostSig = info->dwFileVersionMS;
-
- if (isPluginBlacklisted())
- return false;
-
- Vector<String> types;
- getVersionInfo(versionInfoData.get(), "MIMEType").split('|', types);
- Vector<String> extensionLists;
- getVersionInfo(versionInfoData.get(), "FileExtents").split('|', extensionLists);
- Vector<String> descriptions;
- getVersionInfo(versionInfoData.get(), "FileOpenName").split('|', descriptions);
-
- for (unsigned i = 0; i < types.size(); i++) {
- String type = types[i].lower();
- String description = i < descriptions.size() ? descriptions[i] : "";
- String extensionList = i < extensionLists.size() ? extensionLists[i] : "";
-
- Vector<String> extensionsVector;
- extensionList.split(',', extensionsVector);
-
- // Get rid of the extension list that may be at the end of the description string.
- int pos = description.find("(*");
- if (pos != -1) {
- // There might be a space that we need to get rid of.
- if (pos > 1 && description[pos - 1] == ' ')
- pos--;
- description = description.left(pos);
- }
-
- // Determine the quirks for the MIME types this plug-in supports
- determineQuirks(type);
-
- m_mimeToExtensions.add(type, extensionsVector);
- m_mimeToDescriptions.add(type, description);
- }
-
- return true;
-}
-
-bool PluginPackage::load()
-{
- if (m_freeLibraryTimer.isActive()) {
- ASSERT(m_module);
- m_freeLibraryTimer.stop();
- } else if (m_isLoaded) {
- if (m_quirks.contains(PluginQuirkDontAllowMultipleInstances))
- return false;
- m_loadCount++;
- return true;
- } else {
-#if OS(WINCE)
- m_module = ::LoadLibraryW(m_path.charactersWithNullTermination());
-#else
- WCHAR currentPath[MAX_PATH];
-
- if (!::GetCurrentDirectoryW(MAX_PATH, currentPath))
- return false;
-
- String path = m_path.substring(0, m_path.reverseFind('\\'));
-
- if (!::SetCurrentDirectoryW(path.charactersWithNullTermination()))
- return false;
-
- // Load the library
- m_module = ::LoadLibraryExW(m_path.charactersWithNullTermination(), 0, LOAD_WITH_ALTERED_SEARCH_PATH);
-
- if (!::SetCurrentDirectoryW(currentPath)) {
- if (m_module)
- ::FreeLibrary(m_module);
- return false;
- }
-#endif
- }
-
- if (!m_module)
- return false;
-
- m_isLoaded = true;
-
- NP_GetEntryPointsFuncPtr NP_GetEntryPoints = 0;
- NP_InitializeFuncPtr NP_Initialize = 0;
- NPError npErr;
-
-#if OS(WINCE)
- NP_Initialize = (NP_InitializeFuncPtr)GetProcAddress(m_module, L"NP_Initialize");
- NP_GetEntryPoints = (NP_GetEntryPointsFuncPtr)GetProcAddress(m_module, L"NP_GetEntryPoints");
- m_NPP_Shutdown = (NPP_ShutdownProcPtr)GetProcAddress(m_module, L"NP_Shutdown");
-#else
- NP_Initialize = (NP_InitializeFuncPtr)GetProcAddress(m_module, "NP_Initialize");
- NP_GetEntryPoints = (NP_GetEntryPointsFuncPtr)GetProcAddress(m_module, "NP_GetEntryPoints");
- m_NPP_Shutdown = (NPP_ShutdownProcPtr)GetProcAddress(m_module, "NP_Shutdown");
-#endif
-
- if (!NP_Initialize || !NP_GetEntryPoints || !m_NPP_Shutdown)
- goto abort;
-
- memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
- m_pluginFuncs.size = sizeof(m_pluginFuncs);
-
- npErr = NP_GetEntryPoints(&m_pluginFuncs);
- LOG_NPERROR(npErr);
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- initializeBrowserFuncs();
-
- npErr = NP_Initialize(&m_browserFuncs);
- LOG_NPERROR(npErr);
-
- if (npErr != NPERR_NO_ERROR)
- goto abort;
-
- m_loadCount++;
- return true;
-
-abort:
- unloadWithoutShutdown();
- return false;
-}
-
-unsigned PluginPackage::hash() const
-{
- const unsigned hashCodes[] = {
- m_name.impl()->hash(),
- m_description.impl()->hash(),
- m_mimeToExtensions.size()
- };
-
- return WTF::StringHasher::createBlobHash<sizeof(hashCodes)>(hashCodes);
-}
-
-bool PluginPackage::equal(const PluginPackage& a, const PluginPackage& b)
-{
- if (a.m_name != b.m_name)
- return false;
-
- if (a.m_description != b.m_description)
- return false;
-
- if (a.m_mimeToExtensions.size() != b.m_mimeToExtensions.size())
- return false;
-
- MIMEToExtensionsMap::const_iterator::Keys end = a.m_mimeToExtensions.end().keys();
- for (MIMEToExtensionsMap::const_iterator::Keys it = a.m_mimeToExtensions.begin().keys(); it != end; ++it) {
- if (!b.m_mimeToExtensions.contains(*it))
- return false;
- }
-
- return true;
-}
-
-uint16_t PluginPackage::NPVersion() const
-{
- return NP_VERSION_MINOR;
-}
-}