зеркало из https://github.com/mozilla/gecko-dev.git
Clean up nsPluginHostImpl. Removes an old workaround for mac Flash 6. Stop using the phrase "active plugin" to refer to plugin instances. Dead code and spelling fixes. b=476409 r/sr=jst
This commit is contained in:
Родитель
9dbf2ddbd8
Коммит
2bd6866a70
|
@ -38,7 +38,7 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* nsPluginHostImpl.cpp - bulk of code for managing plugins */
|
||||
/* nsPluginHostImpl.cpp - top-level plugin management code */
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsPluginHostImpl.h"
|
||||
|
@ -96,23 +96,12 @@
|
|||
#include "nsVersionComparator.h"
|
||||
#include "nsIPrivateBrowsingService.h"
|
||||
|
||||
// Friggin' X11 has to "#define None". Lame!
|
||||
#ifdef None
|
||||
#undef None
|
||||
#endif
|
||||
|
||||
#ifdef CursorShape
|
||||
#undef CursorShape /*X.h defines it as 0,
|
||||
qnamespace.h makes an enum type by that name
|
||||
*/
|
||||
#endif
|
||||
|
||||
//#include "nsIRegistry.h"
|
||||
#include "nsEnumeratorUtils.h"
|
||||
#include "nsXPCOM.h"
|
||||
#include "nsXPCOMCID.h"
|
||||
#include "nsICategoryManager.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
// for the dialog
|
||||
#include "nsIStringBundle.h"
|
||||
#include "nsIWindowWatcher.h"
|
||||
|
@ -134,11 +123,6 @@
|
|||
#include "nsIInterfaceInfoManager.h"
|
||||
#include "xptinfo.h"
|
||||
|
||||
#if defined(XP_WIN)
|
||||
#include "windows.h"
|
||||
#include "winbase.h"
|
||||
#endif
|
||||
|
||||
#include "nsIMIMEService.h"
|
||||
#include "nsCExternalHandlerService.h"
|
||||
#include "nsILocalFile.h"
|
||||
|
@ -177,12 +161,16 @@
|
|||
#include "nsContentPolicyUtils.h"
|
||||
#include "nsContentErrors.h"
|
||||
|
||||
#if defined(XP_WIN)
|
||||
#include "windows.h"
|
||||
#include "winbase.h"
|
||||
#endif
|
||||
|
||||
#if defined(XP_UNIX) && defined(MOZ_WIDGET_GTK2) & defined(MOZ_X11)
|
||||
#include <gdk/gdkx.h> // for GDK_DISPLAY()
|
||||
#endif
|
||||
|
||||
#ifdef XP_MACOSX
|
||||
#include <Carbon/Carbon.h> // for ::UseInputWindow()
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/fat.h>
|
||||
#endif
|
||||
|
@ -242,12 +230,6 @@ PRLogModuleInfo* nsPluginLogging::gPluginLog = nsnull;
|
|||
|
||||
#define BRAND_PROPERTIES_URL "chrome://branding/locale/brand.properties"
|
||||
#define PLUGIN_PROPERTIES_URL "chrome://global/locale/downloadProgress.properties"
|
||||
#define PLUGIN_REGIONAL_URL "chrome://global-region/locale/region.properties"
|
||||
|
||||
// #defines for reading prefs and extra search plugin paths from windows registry
|
||||
#define _MAXKEYVALUE_ 8196
|
||||
#define _NS_PREF_COMMON_PLUGIN_REG_KEY_ "browser.plugins.registry_plugins_folder_key_location"
|
||||
#define _NS_COMMON_PLUGIN_KEY_NAME_ "Plugins Folders"
|
||||
|
||||
// #defines for plugin cache and prefs
|
||||
#define NS_PREF_MAX_NUM_CACHED_PLUGINS "browser.plugins.max_num_cached_plugins"
|
||||
|
@ -257,7 +239,7 @@ PRLogModuleInfo* nsPluginLogging::gPluginLog = nsnull;
|
|||
|
||||
nsresult PostPluginUnloadEvent(PRLibrary * aLibrary);
|
||||
|
||||
static nsActivePluginList *gActivePluginList;
|
||||
static nsPluginInstanceTagList *gActivePluginList;
|
||||
|
||||
#ifdef CALL_SAFETY_ON
|
||||
PRBool gSkipPluginSafeCalls = PR_FALSE;
|
||||
|
@ -338,7 +320,7 @@ NS_IMETHODIMP nsPluginDocReframeEvent::Run() {
|
|||
return mDocs->Clear();
|
||||
}
|
||||
|
||||
nsActivePlugin::nsActivePlugin(nsPluginTag* aPluginTag,
|
||||
nsPluginInstanceTag::nsPluginInstanceTag(nsPluginTag* aPluginTag,
|
||||
nsIPluginInstance* aInstance,
|
||||
const char * url,
|
||||
PRBool aDefaultPlugin,
|
||||
|
@ -361,7 +343,7 @@ nsActivePlugin::nsActivePlugin(nsPluginTag* aPluginTag,
|
|||
mllStopTime = LL_ZERO;
|
||||
}
|
||||
|
||||
nsActivePlugin::~nsActivePlugin()
|
||||
nsPluginInstanceTag::~nsPluginInstanceTag()
|
||||
{
|
||||
mPluginTag = nsnull;
|
||||
if (mInstance) {
|
||||
|
@ -376,7 +358,7 @@ nsActivePlugin::~nsActivePlugin()
|
|||
|
||||
// now check for cached plugins because they haven't had nsIPluginInstance::Destroy()
|
||||
// called yet. For non-cached plugins, nsIPluginInstance::Destroy() is called
|
||||
// in either nsObjectFrame::Destroy() or nsActivePluginList::stopRunning()
|
||||
// in either nsObjectFrame::Destroy() or nsPluginInstanceTagList::stopRunning()
|
||||
PRBool doCache = PR_TRUE;
|
||||
mInstance->GetValue(nsPluginInstanceVariable_DoCacheBool, (void *) &doCache);
|
||||
if (doCache)
|
||||
|
@ -388,7 +370,7 @@ nsActivePlugin::~nsActivePlugin()
|
|||
PL_strfree(mURL);
|
||||
}
|
||||
|
||||
void nsActivePlugin::setStopped(PRBool stopped)
|
||||
void nsPluginInstanceTag::setStopped(PRBool stopped)
|
||||
{
|
||||
mStopped = stopped;
|
||||
if (mStopped) // plugin instance is told to stop
|
||||
|
@ -397,27 +379,27 @@ void nsActivePlugin::setStopped(PRBool stopped)
|
|||
mllStopTime = LL_ZERO;
|
||||
}
|
||||
|
||||
nsActivePluginList::nsActivePluginList()
|
||||
nsPluginInstanceTagList::nsPluginInstanceTagList()
|
||||
{
|
||||
mFirst = nsnull;
|
||||
mLast = nsnull;
|
||||
mCount = 0;
|
||||
}
|
||||
|
||||
nsActivePluginList::~nsActivePluginList()
|
||||
nsPluginInstanceTagList::~nsPluginInstanceTagList()
|
||||
{
|
||||
if (mFirst == nsnull)
|
||||
if (!mFirst)
|
||||
return;
|
||||
shut();
|
||||
shutdown();
|
||||
}
|
||||
|
||||
void nsActivePluginList::shut()
|
||||
void nsPluginInstanceTagList::shutdown()
|
||||
{
|
||||
if (!mFirst)
|
||||
return;
|
||||
|
||||
for (nsActivePlugin * plugin = mFirst; plugin != nsnull;) {
|
||||
nsActivePlugin * next = plugin->mNext;
|
||||
for (nsPluginInstanceTag * plugin = mFirst; plugin != nsnull;) {
|
||||
nsPluginInstanceTag * next = plugin->mNext;
|
||||
remove(plugin);
|
||||
plugin = next;
|
||||
}
|
||||
|
@ -425,7 +407,7 @@ void nsActivePluginList::shut()
|
|||
mLast = nsnull;
|
||||
}
|
||||
|
||||
PRInt32 nsActivePluginList::add(nsActivePlugin * plugin)
|
||||
PRInt32 nsPluginInstanceTagList::add(nsPluginInstanceTag * plugin)
|
||||
{
|
||||
if (!mFirst) {
|
||||
mFirst = plugin;
|
||||
|
@ -441,7 +423,7 @@ PRInt32 nsActivePluginList::add(nsActivePlugin * plugin)
|
|||
return mCount;
|
||||
}
|
||||
|
||||
PRBool nsActivePluginList::IsLastInstance(nsActivePlugin * plugin)
|
||||
PRBool nsPluginInstanceTagList::IsLastInstance(nsPluginInstanceTag * plugin)
|
||||
{
|
||||
if (!plugin)
|
||||
return PR_FALSE;
|
||||
|
@ -449,20 +431,20 @@ PRBool nsActivePluginList::IsLastInstance(nsActivePlugin * plugin)
|
|||
if (!plugin->mPluginTag)
|
||||
return PR_FALSE;
|
||||
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
if ((p->mPluginTag == plugin->mPluginTag) && (p != plugin))
|
||||
return PR_FALSE;
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool nsActivePluginList::remove(nsActivePlugin * plugin)
|
||||
PRBool nsPluginInstanceTagList::remove(nsPluginInstanceTag * plugin)
|
||||
{
|
||||
if (mFirst == nsnull)
|
||||
if (!mFirst)
|
||||
return PR_FALSE;
|
||||
|
||||
nsActivePlugin * prev = nsnull;
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
nsPluginInstanceTag * prev = nsnull;
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
if (p == plugin) {
|
||||
PRBool lastInstance = IsLastInstance(p);
|
||||
|
||||
|
@ -471,7 +453,7 @@ PRBool nsActivePluginList::remove(nsActivePlugin * plugin)
|
|||
else
|
||||
prev->mNext = p->mNext;
|
||||
|
||||
if ((prev != nsnull) && (prev->mNext == nsnull))
|
||||
if (prev && !prev->mNext)
|
||||
mLast = prev;
|
||||
|
||||
// see if this is going to be the last instance of a plugin
|
||||
|
@ -504,15 +486,15 @@ PRBool nsActivePluginList::remove(nsActivePlugin * plugin)
|
|||
// documents to be returned through an array. This method is used
|
||||
// when we are shutting down or when a plugins.refresh(1) happens.
|
||||
// If aPluginTag is given, then only that plugin is terminated
|
||||
void nsActivePluginList::stopRunning(nsISupportsArray* aReloadDocs,
|
||||
void nsPluginInstanceTagList::stopRunning(nsISupportsArray* aReloadDocs,
|
||||
nsPluginTag* aPluginTag)
|
||||
{
|
||||
if (mFirst == nsnull)
|
||||
if (!mFirst)
|
||||
return;
|
||||
|
||||
PRBool doCallSetWindowAfterDestroy = PR_FALSE;
|
||||
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
if (!p->mStopped && p->mInstance &&
|
||||
(!aPluginTag || aPluginTag == p->mPluginTag)) {
|
||||
// then determine if the plugin wants Destroy to be called after
|
||||
|
@ -550,14 +532,14 @@ void nsActivePluginList::stopRunning(nsISupportsArray* aReloadDocs,
|
|||
}
|
||||
}
|
||||
|
||||
void nsActivePluginList::removeAllStopped()
|
||||
void nsPluginInstanceTagList::removeAllStopped()
|
||||
{
|
||||
if (mFirst == nsnull)
|
||||
if (!mFirst)
|
||||
return;
|
||||
|
||||
nsActivePlugin * next = nsnull;
|
||||
nsPluginInstanceTag * next = nsnull;
|
||||
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull;) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull;) {
|
||||
next = p->mNext;
|
||||
|
||||
if (p->mStopped)
|
||||
|
@ -568,9 +550,9 @@ void nsActivePluginList::removeAllStopped()
|
|||
return;
|
||||
}
|
||||
|
||||
nsActivePlugin * nsActivePluginList::find(nsIPluginInstance* instance)
|
||||
nsPluginInstanceTag * nsPluginInstanceTagList::find(nsIPluginInstance* instance)
|
||||
{
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
if (p->mInstance == instance) {
|
||||
#ifdef NS_DEBUG
|
||||
PRBool doCache = PR_TRUE;
|
||||
|
@ -583,11 +565,11 @@ nsActivePlugin * nsActivePluginList::find(nsIPluginInstance* instance)
|
|||
return nsnull;
|
||||
}
|
||||
|
||||
nsActivePlugin * nsActivePluginList::find(const char * mimetype)
|
||||
nsPluginInstanceTag * nsPluginInstanceTagList::find(const char * mimetype)
|
||||
{
|
||||
PRBool defaultplugin = (PL_strcmp(mimetype, "*") == 0);
|
||||
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
// give it some special treatment for the default plugin first
|
||||
// because we cannot tell the default plugin by asking peer for a mime type
|
||||
if (defaultplugin && p->mDefaultPlugin)
|
||||
|
@ -615,9 +597,9 @@ nsActivePlugin * nsActivePluginList::find(const char * mimetype)
|
|||
return nsnull;
|
||||
}
|
||||
|
||||
nsActivePlugin * nsActivePluginList::findStopped(const char * url)
|
||||
nsPluginInstanceTag * nsPluginInstanceTagList::findStopped(const char * url)
|
||||
{
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
if (!PL_strcmp(url, p->mURL) && p->mStopped) {
|
||||
#ifdef NS_DEBUG
|
||||
PRBool doCache = PR_TRUE;
|
||||
|
@ -630,21 +612,21 @@ nsActivePlugin * nsActivePluginList::findStopped(const char * url)
|
|||
return nsnull;
|
||||
}
|
||||
|
||||
PRUint32 nsActivePluginList::getStoppedCount()
|
||||
PRUint32 nsPluginInstanceTagList::getStoppedCount()
|
||||
{
|
||||
PRUint32 stoppedCount = 0;
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
if (p->mStopped)
|
||||
stoppedCount++;
|
||||
}
|
||||
return stoppedCount;
|
||||
}
|
||||
|
||||
nsActivePlugin * nsActivePluginList::findOldestStopped()
|
||||
nsPluginInstanceTag * nsPluginInstanceTagList::findOldestStopped()
|
||||
{
|
||||
nsActivePlugin * res = nsnull;
|
||||
nsPluginInstanceTag * res = nsnull;
|
||||
PRInt64 llTime = LL_MAXINT;
|
||||
for (nsActivePlugin * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
for (nsPluginInstanceTag * p = mFirst; p != nsnull; p = p->mNext) {
|
||||
if (!p->mStopped)
|
||||
continue;
|
||||
|
||||
|
@ -1033,7 +1015,7 @@ nsPluginTag::SetBlocklisted(PRBool aBlocklisted)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
// helper struct for asynchronous handeling of plugin unloading
|
||||
// helper struct for asynchronous handling of plugin unloading
|
||||
class nsPluginUnloadEvent : public nsRunnable {
|
||||
public:
|
||||
nsPluginUnloadEvent(PRLibrary* aLibrary)
|
||||
|
@ -1048,7 +1030,7 @@ public:
|
|||
NS_IMETHODIMP nsPluginUnloadEvent::Run()
|
||||
{
|
||||
if (mLibrary) {
|
||||
// put our unload call in a saftey wrapper
|
||||
// put our unload call in a safety wrapper
|
||||
NS_TRY_SAFE_CALL_VOID(PR_UnloadLibrary(mLibrary), nsnull, nsnull);
|
||||
} else {
|
||||
NS_WARNING("missing library from nsPluginUnloadEvent");
|
||||
|
@ -1289,13 +1271,8 @@ public:
|
|||
nsPluginByteRangeStreamListener(nsIWeakReference* aWeakPtr);
|
||||
virtual ~nsPluginByteRangeStreamListener();
|
||||
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsIRequestObserver methods:
|
||||
NS_DECL_NSIREQUESTOBSERVER
|
||||
|
||||
// nsIStreamListener methods:
|
||||
NS_DECL_NSISTREAMLISTENER
|
||||
|
||||
private:
|
||||
|
@ -1544,7 +1521,6 @@ public:
|
|||
virtual ~nsPluginCacheListener();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_DECL_NSIREQUESTOBSERVER
|
||||
NS_DECL_NSISTREAMLISTENER
|
||||
|
||||
|
@ -1805,7 +1781,7 @@ nsPluginStreamListenerPeer::SetupPluginCacheFile(nsIChannel* channel)
|
|||
// in |::OnFileAvailable()| calls w/o rewriting the file again.
|
||||
// The file will be deleted in |nsPluginStreamListenerPeer::~nsPluginStreamListenerPeer|
|
||||
PRBool useExistingCacheFile = PR_FALSE;
|
||||
nsActivePlugin *pActivePlugins = gActivePluginList->mFirst;
|
||||
nsPluginInstanceTag *pActivePlugins = gActivePluginList->mFirst;
|
||||
while (pActivePlugins && pActivePlugins->mStreams && !useExistingCacheFile) {
|
||||
// most recent streams are at the end of list
|
||||
PRInt32 cnt;
|
||||
|
@ -1872,7 +1848,7 @@ nsPluginStreamListenerPeer::SetupPluginCacheFile(nsIChannel* channel)
|
|||
}
|
||||
|
||||
// add this listenerPeer to list of stream peers for this instance
|
||||
// it'll delay release of listenerPeer until nsActivePlugin::~nsActivePlugin
|
||||
// it'll delay release of listenerPeer until nsPluginInstanceTag::~nsPluginInstanceTag
|
||||
// and the temp file is going to stay alive until then
|
||||
pActivePlugins = gActivePluginList->find(mInstance);
|
||||
if (pActivePlugins) {
|
||||
|
@ -2486,7 +2462,7 @@ nsPluginHostImpl::nsPluginHostImpl()
|
|||
mDefaultPluginDisabled = PR_FALSE;
|
||||
mJavaEnabled = PR_TRUE;
|
||||
|
||||
gActivePluginList = &mActivePluginList;
|
||||
gActivePluginList = &mPluginInstanceTagList;
|
||||
|
||||
// check to see if pref is set at startup to let plugins take over in
|
||||
// full page mode for certain image mime types that we handle internally
|
||||
|
@ -2582,7 +2558,7 @@ nsPluginHostImpl::GetInst()
|
|||
const char *
|
||||
nsPluginHostImpl::GetPluginName(nsIPluginInstance *aPluginInstance)
|
||||
{
|
||||
nsActivePlugin *plugin =
|
||||
nsPluginInstanceTag *plugin =
|
||||
gActivePluginList ? gActivePluginList->find(aPluginInstance) : nsnull;
|
||||
|
||||
if (plugin && plugin->mPluginTag)
|
||||
|
@ -2623,12 +2599,12 @@ PRBool nsPluginHostImpl::IsRunningPlugin(nsPluginTag * plugin)
|
|||
return PR_FALSE;
|
||||
|
||||
// we can check for mLibrary to be non-zero and then querry nsIPluginInstancePeer
|
||||
// in nsActivePluginList to see if plugin with matching mime type is not stopped
|
||||
// in nsPluginInstanceTagList to see if plugin with matching mime type is not stopped
|
||||
if (!plugin->mLibrary)
|
||||
return PR_FALSE;
|
||||
|
||||
for (int i = 0; i < plugin->mVariants; i++) {
|
||||
nsActivePlugin * p = mActivePluginList.find(plugin->mMimeTypeArray[i]);
|
||||
nsPluginInstanceTag * p = mPluginInstanceTagList.find(plugin->mMimeTypeArray[i]);
|
||||
if (p && !p->mStopped)
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
@ -2640,7 +2616,7 @@ nsresult nsPluginHostImpl::ReloadPlugins(PRBool reloadPages)
|
|||
{
|
||||
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
||||
("nsPluginHostImpl::ReloadPlugins Begin reloadPages=%d, active_instance_count=%d\n",
|
||||
reloadPages, mActivePluginList.mCount));
|
||||
reloadPages, mPluginInstanceTagList.mCount));
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
|
@ -2671,11 +2647,11 @@ nsresult nsPluginHostImpl::ReloadPlugins(PRBool reloadPages)
|
|||
|
||||
// Then stop any running plugin instances but hold on to the documents in the array
|
||||
// We are going to need to restart the instances in these documents later
|
||||
mActivePluginList.stopRunning(instsToReload, nsnull);
|
||||
mPluginInstanceTagList.stopRunning(instsToReload, nsnull);
|
||||
}
|
||||
|
||||
// clean active plugin list
|
||||
mActivePluginList.removeAllStopped();
|
||||
mPluginInstanceTagList.removeAllStopped();
|
||||
|
||||
// shutdown plugins and kill the list if there are no running plugins
|
||||
nsRefPtr<nsPluginTag> prev;
|
||||
|
@ -2725,7 +2701,7 @@ nsresult nsPluginHostImpl::ReloadPlugins(PRBool reloadPages)
|
|||
|
||||
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
||||
("nsPluginHostImpl::ReloadPlugins End active_instance_count=%d\n",
|
||||
mActivePluginList.mCount));
|
||||
mPluginInstanceTagList.mCount));
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
@ -3081,11 +3057,6 @@ NS_IMETHODIMP nsPluginHostImpl::HasAllocatedMenuID(nsIEventHandler* handler, PRI
|
|||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsPluginHostImpl::ProcessNextEvent(PRBool *bEventHandled)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsPluginHostImpl::CreateInstance(nsISupports *aOuter,
|
||||
REFNSIID aIID,
|
||||
void **aResult)
|
||||
|
@ -3116,10 +3087,10 @@ NS_IMETHODIMP nsPluginHostImpl::Destroy(void)
|
|||
|
||||
// we should call nsIPluginInstance::Stop and nsIPluginInstance::SetWindow
|
||||
// for those plugins who want it
|
||||
mActivePluginList.stopRunning(nsnull, nsnull);
|
||||
mPluginInstanceTagList.stopRunning(nsnull, nsnull);
|
||||
|
||||
// at this point nsIPlugin::Shutdown calls will be performed if needed
|
||||
mActivePluginList.shut();
|
||||
mPluginInstanceTagList.shutdown();
|
||||
|
||||
if (mPluginPath) {
|
||||
PR_Free(mPluginPath);
|
||||
|
@ -3517,7 +3488,7 @@ nsresult nsPluginHostImpl::FindStoppedPluginForURL(nsIURI* aURL,
|
|||
|
||||
aURL->GetAsciiSpec(url);
|
||||
|
||||
nsActivePlugin * plugin = mActivePluginList.findStopped(url.get());
|
||||
nsPluginInstanceTag * plugin = mPluginInstanceTagList.findStopped(url.get());
|
||||
|
||||
if (plugin && plugin->mStopped) {
|
||||
nsIPluginInstance* instance = plugin->mInstance;
|
||||
|
@ -3572,12 +3543,12 @@ nsresult nsPluginHostImpl::AddInstanceToActiveList(nsCOMPtr<nsIPlugin> aPlugin,
|
|||
NS_ASSERTION(pluginTag, "Plugin tag not found");
|
||||
}
|
||||
|
||||
nsActivePlugin * plugin = new nsActivePlugin(pluginTag, aInstance, url.get(), aDefaultPlugin, peer);
|
||||
nsPluginInstanceTag * plugin = new nsPluginInstanceTag(pluginTag, aInstance, url.get(), aDefaultPlugin, peer);
|
||||
|
||||
if (!plugin)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
mActivePluginList.add(plugin);
|
||||
mPluginInstanceTagList.add(plugin);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -4539,21 +4510,6 @@ NS_IMETHODIMP nsPluginHostImpl::GetPluginFactory(const char *aMimeType, nsIPlugi
|
|||
}
|
||||
}
|
||||
|
||||
#if defined (XP_MACOSX)
|
||||
/* Flash 6.0 r50 and older on Mac has a bug which calls ::UseInputWindow(NULL, true)
|
||||
which turn off all our inline IME. Turn it back after the plugin
|
||||
initializtion and hope that future versions will be fixed. See bug 159016
|
||||
*/
|
||||
if (StringBeginsWith(pluginTag->mDescription,
|
||||
NS_LITERAL_CSTRING("Shockwave Flash 6.0"),
|
||||
nsCaseInsensitiveCStringComparator()) &&
|
||||
pluginTag->mDescription.Length() > 21) {
|
||||
int ver = atoi(pluginTag->mDescription.get() + 21);
|
||||
if (ver && ver <= 50)
|
||||
::UseInputWindow(NULL, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (plugin) {
|
||||
*aPlugin = plugin;
|
||||
plugin->AddRef();
|
||||
|
@ -5249,8 +5205,8 @@ nsPluginHostImpl::UpdatePluginInfo(nsPluginTag* aPluginTag)
|
|||
|
||||
nsCOMPtr<nsISupportsArray> instsToReload;
|
||||
NS_NewISupportsArray(getter_AddRefs(instsToReload));
|
||||
mActivePluginList.stopRunning(instsToReload, aPluginTag);
|
||||
mActivePluginList.removeAllStopped();
|
||||
mPluginInstanceTagList.stopRunning(instsToReload, aPluginTag);
|
||||
mPluginInstanceTagList.removeAllStopped();
|
||||
|
||||
PRUint32 c;
|
||||
if (instsToReload && NS_SUCCEEDED(instsToReload->Count(&c)) && c > 0) {
|
||||
|
@ -5876,7 +5832,7 @@ nsPluginHostImpl::StopPluginInstance(nsIPluginInstance* aInstance)
|
|||
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
||||
("nsPluginHostImpl::StopPluginInstance called instance=%p\n",aInstance));
|
||||
|
||||
nsActivePlugin * plugin = mActivePluginList.find(aInstance);
|
||||
nsPluginInstanceTag * plugin = mPluginInstanceTagList.find(aInstance);
|
||||
|
||||
if (plugin) {
|
||||
plugin->setStopped(PR_TRUE); // be sure we set the "stop" bit
|
||||
|
@ -5890,7 +5846,7 @@ nsPluginHostImpl::StopPluginInstance(nsIPluginInstance* aInstance)
|
|||
if (plugin->mPluginTag)
|
||||
library = plugin->mPluginTag->mLibrary;
|
||||
|
||||
mActivePluginList.remove(plugin);
|
||||
mPluginInstanceTagList.remove(plugin);
|
||||
} else {
|
||||
// if it is allowed to be cached simply stop it, but first we should check
|
||||
// if we haven't exceeded the maximum allowed number of cached instances
|
||||
|
@ -5903,10 +5859,10 @@ nsPluginHostImpl::StopPluginInstance(nsIPluginInstance* aInstance)
|
|||
if (NS_FAILED(rv))
|
||||
max_num = DEFAULT_NUMBER_OF_STOPPED_PLUGINS;
|
||||
|
||||
if (mActivePluginList.getStoppedCount() >= max_num) {
|
||||
nsActivePlugin * oldest = mActivePluginList.findOldestStopped();
|
||||
if (mPluginInstanceTagList.getStoppedCount() >= max_num) {
|
||||
nsPluginInstanceTag * oldest = mPluginInstanceTagList.findOldestStopped();
|
||||
if (oldest != nsnull)
|
||||
mActivePluginList.remove(oldest);
|
||||
mPluginInstanceTagList.remove(oldest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5995,7 +5951,7 @@ nsresult nsPluginHostImpl::NewFullPagePluginStream(nsIStreamListener *&aStreamLi
|
|||
NS_ADDREF(listener);
|
||||
|
||||
// add peer to list of stream peers for this instance
|
||||
nsActivePlugin * p = mActivePluginList.find(aInstance);
|
||||
nsPluginInstanceTag * p = mPluginInstanceTagList.find(aInstance);
|
||||
if (p) {
|
||||
if (!p->mStreams && (NS_FAILED(rv = NS_NewISupportsArray(getter_AddRefs(p->mStreams)))))
|
||||
return rv;
|
||||
|
@ -6145,7 +6101,7 @@ NS_IMETHODIMP nsPluginHostImpl::Observe(nsISupports *aSubject,
|
|||
}
|
||||
if (!nsCRT::strcmp(NS_PRIVATE_BROWSING_SWITCH_TOPIC, aTopic)) {
|
||||
// inform all active NPAPI plugins of changed private mode state
|
||||
for (nsActivePlugin* ap = mActivePluginList.mFirst; ap; ap = ap->mNext) {
|
||||
for (nsPluginInstanceTag* ap = mPluginInstanceTagList.mFirst; ap; ap = ap->mNext) {
|
||||
nsPluginTag* pt = ap->mPluginTag;
|
||||
if (pt->HasFlag(NS_PLUGIN_FLAG_NPAPI)) {
|
||||
nsNPAPIPluginInstance* pi = static_cast<nsNPAPIPluginInstance*>(ap->mInstance);
|
||||
|
@ -6240,7 +6196,7 @@ nsPluginHostImpl::HandleBadPlugin(PRLibrary* aLibrary, nsIPluginInstance *aInsta
|
|||
|
||||
// add plugin name to the message
|
||||
nsCString pluginname;
|
||||
nsActivePlugin * p = mActivePluginList.find(aInstance);
|
||||
nsPluginInstanceTag * p = mPluginInstanceTagList.find(aInstance);
|
||||
if (p) {
|
||||
nsPluginTag * tag = p->mPluginTag;
|
||||
if (tag) {
|
||||
|
@ -6275,7 +6231,7 @@ nsPluginHostImpl::HandleBadPlugin(PRLibrary* aLibrary, nsIPluginInstance *aInsta
|
|||
NS_IMETHODIMP
|
||||
nsPluginHostImpl::SetIsScriptableInstance(nsIPluginInstance * aPluginInstance, PRBool aScriptable)
|
||||
{
|
||||
nsActivePlugin * p = mActivePluginList.find(aPluginInstance);
|
||||
nsPluginInstanceTag * p = mPluginInstanceTagList.find(aPluginInstance);
|
||||
if (p == nsnull)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
|
|
|
@ -35,8 +35,8 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsPluginHostImpl_h__
|
||||
#define nsPluginHostImpl_h__
|
||||
#ifndef nsPluginHostImpl_h_
|
||||
#define nsPluginHostImpl_h_
|
||||
|
||||
#include "nsIPluginManager.h"
|
||||
#include "nsIPluginManager2.h"
|
||||
|
@ -84,11 +84,8 @@ class nsPluginHostImpl;
|
|||
#define NS_PLUGIN_FLAG_UNWANTED 0x0008 // this is an unwanted plugin
|
||||
#define NS_PLUGIN_FLAG_BLOCKLISTED 0x0010 // this is a blocklisted plugin
|
||||
|
||||
/**
|
||||
* A linked-list of plugin information that is used for
|
||||
* instantiating plugins and reflecting plugin information
|
||||
* into JavaScript.
|
||||
*/
|
||||
// A linked-list of plugin information that is used for instantiating plugins
|
||||
// and reflecting plugin information into JavaScript.
|
||||
class nsPluginTag : public nsIPluginTag
|
||||
{
|
||||
public:
|
||||
|
@ -173,9 +170,9 @@ private:
|
|||
nsresult EnsureMembersAreUTF8();
|
||||
};
|
||||
|
||||
struct nsActivePlugin
|
||||
struct nsPluginInstanceTag
|
||||
{
|
||||
nsActivePlugin* mNext;
|
||||
nsPluginInstanceTag* mNext;
|
||||
char* mURL;
|
||||
nsIPluginInstancePeer* mPeer;
|
||||
nsRefPtr<nsPluginTag> mPluginTag;
|
||||
|
@ -185,39 +182,39 @@ struct nsActivePlugin
|
|||
PRPackedBool mDefaultPlugin;
|
||||
PRPackedBool mXPConnected;
|
||||
// Array holding all opened stream listeners for this entry
|
||||
nsCOMPtr <nsISupportsArray> mStreams;
|
||||
nsCOMPtr <nsISupportsArray> mStreams;
|
||||
|
||||
nsActivePlugin(nsPluginTag* aPluginTag,
|
||||
nsIPluginInstance* aInstance,
|
||||
const char * url,
|
||||
PRBool aDefaultPlugin,
|
||||
nsIPluginInstancePeer *peer);
|
||||
~nsActivePlugin();
|
||||
nsPluginInstanceTag(nsPluginTag* aPluginTag,
|
||||
nsIPluginInstance* aInstance,
|
||||
const char * url,
|
||||
PRBool aDefaultPlugin,
|
||||
nsIPluginInstancePeer *peer);
|
||||
~nsPluginInstanceTag();
|
||||
|
||||
void setStopped(PRBool stopped);
|
||||
};
|
||||
|
||||
class nsActivePluginList
|
||||
class nsPluginInstanceTagList
|
||||
{
|
||||
public:
|
||||
nsActivePlugin * mFirst;
|
||||
nsActivePlugin * mLast;
|
||||
nsPluginInstanceTag *mFirst;
|
||||
nsPluginInstanceTag *mLast;
|
||||
PRInt32 mCount;
|
||||
|
||||
nsActivePluginList();
|
||||
~nsActivePluginList();
|
||||
nsPluginInstanceTagList();
|
||||
~nsPluginInstanceTagList();
|
||||
|
||||
void shut();
|
||||
PRBool add(nsActivePlugin * plugin);
|
||||
PRBool remove(nsActivePlugin * plugin);
|
||||
nsActivePlugin * find(nsIPluginInstance* instance);
|
||||
nsActivePlugin * find(const char * mimetype);
|
||||
nsActivePlugin * findStopped(const char * url);
|
||||
void shutdown();
|
||||
PRBool add(nsPluginInstanceTag *plugin);
|
||||
PRBool remove(nsPluginInstanceTag *plugin);
|
||||
nsPluginInstanceTag *find(nsIPluginInstance *instance);
|
||||
nsPluginInstanceTag *find(const char *mimetype);
|
||||
nsPluginInstanceTag *findStopped(const char *url);
|
||||
PRUint32 getStoppedCount();
|
||||
nsActivePlugin * findOldestStopped();
|
||||
nsPluginInstanceTag *findOldestStopped();
|
||||
void removeAllStopped();
|
||||
void stopRunning(nsISupportsArray* aReloadDocs, nsPluginTag* aPluginTag);
|
||||
PRBool IsLastInstance(nsActivePlugin * plugin);
|
||||
void stopRunning(nsISupportsArray *aReloadDocs, nsPluginTag *aPluginTag);
|
||||
PRBool IsLastInstance(nsPluginInstanceTag *plugin);
|
||||
};
|
||||
|
||||
class nsPluginHostImpl : public nsIPluginManager2,
|
||||
|
@ -297,15 +294,8 @@ public:
|
|||
NS_IMETHOD
|
||||
UnregisterPlugin(REFNSIID aCID);
|
||||
|
||||
//nsIPluginHost interface - used to communicate to the nsPluginInstanceOwner
|
||||
|
||||
NS_DECL_NSIPLUGINHOST
|
||||
NS_DECL_NSIPLUGINMANAGER2
|
||||
|
||||
NS_IMETHOD
|
||||
ProcessNextEvent(PRBool *bEventHandled);
|
||||
|
||||
// XXX not currently used?
|
||||
NS_DECL_NSIFACTORY
|
||||
NS_DECL_NSIFILEUTILITIES
|
||||
NS_DECL_NSICOOKIESTORAGE
|
||||
|
@ -452,14 +442,14 @@ private:
|
|||
// Whether java is enabled
|
||||
PRPackedBool mJavaEnabled;
|
||||
|
||||
nsActivePluginList mActivePluginList;
|
||||
nsPluginInstanceTagList mPluginInstanceTagList;
|
||||
nsVoidArray mUnusedLibraries;
|
||||
|
||||
nsCOMPtr<nsIFile> mPluginRegFile;
|
||||
nsCOMPtr<nsIPrefBranch> mPrefService;
|
||||
nsCOMPtr<nsIFile> mPluginRegFile;
|
||||
nsCOMPtr<nsIPrefBranch> mPrefService;
|
||||
#ifdef XP_WIN
|
||||
nsRefPtr<nsPluginDirServiceProvider> mPrivateDirServiceProvider;
|
||||
#endif /* XP_WIN */
|
||||
#endif
|
||||
|
||||
nsWeakPtr mCurrentDocument; // weak reference, we use it to id document only
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче