Reviewed by Oliver.
authorandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jun 2007 21:27:23 +0000 (21:27 +0000)
committerandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jun 2007 21:27:23 +0000 (21:27 +0000)
        <rdar://problem/5253950>
        When Shockwave plugin has been loaded, exiting crashes Safari

        Add a "load count" for plugin packages. When the load count is zero, unload the plugin.

        * plugins/win/PluginPackageWin.cpp:
        (WebCore::PluginPackageWin::PluginPackageWin):
        (WebCore::PluginPackageWin::load):
        (WebCore::PluginPackageWin::unload):
        (WebCore::PluginPackageWin::unloadWithoutShutdown):
        * plugins/win/PluginPackageWin.h:

        * plugins/win/PluginViewWin.cpp:
        (WebCore::PluginViewWin::~PluginViewWin):
        Make sure to unload the plugin package and clear any references to plugin script objects.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@23827 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/plugins/win/PluginPackageWin.cpp
WebCore/plugins/win/PluginPackageWin.h
WebCore/plugins/win/PluginViewWin.cpp

index 054f67ddd8e68cd75ed331e30921d3ea3a4f1d2b..f8466fd84a3ebd789a9c39cc585bb25d99eda788 100644 (file)
@@ -1,3 +1,23 @@
+2007-06-27  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Oliver.
+
+        <rdar://problem/5253950>
+        When Shockwave plugin has been loaded, exiting crashes Safari
+        
+        Add a "load count" for plugin packages. When the load count is zero, unload the plugin.
+        
+        * plugins/win/PluginPackageWin.cpp:
+        (WebCore::PluginPackageWin::PluginPackageWin):
+        (WebCore::PluginPackageWin::load):
+        (WebCore::PluginPackageWin::unload):
+        (WebCore::PluginPackageWin::unloadWithoutShutdown):
+        * plugins/win/PluginPackageWin.h:
+        
+        * plugins/win/PluginViewWin.cpp:
+        (WebCore::PluginViewWin::~PluginViewWin):
+        Make sure to unload the plugin package and clear any references to plugin script objects.
+
 2007-06-27  George Staikos  <staikos@kde.org>
 
         This was succeeding compile by luck.  Setup dependencies properly.
index 6d872d1f571ff522c4b2a1d65f5f960695b838f6..f29f3bfb984e09bca7f4d365f14a71b704cfc65a 100644 (file)
@@ -85,6 +85,7 @@ PluginPackageWin::PluginPackageWin(const String& path, const FILETIME& lastModif
     , m_module(0)
     , m_lastModified(lastModified)
     , m_isLoaded(false)
+    , m_loadCount(0)
 {
     int pos = m_path.deprecatedString().findRev('\\');
 
@@ -142,8 +143,10 @@ bool PluginPackageWin::fetchInfo()
 
 bool PluginPackageWin::load()
 {
-    if (m_isLoaded)
+    if (m_isLoaded) {
+        m_loadCount++;
         return true;
+    }
 
     WCHAR currentPath[MAX_PATH];
 
@@ -240,6 +243,7 @@ bool PluginPackageWin::load()
     if (npErr != NPERR_NO_ERROR)
         goto abort;
 
+    m_loadCount++;
     return true;
 abort:
     unloadWithoutShutdown();
@@ -251,6 +255,9 @@ void PluginPackageWin::unload()
     if (!m_isLoaded)
         return;
 
+    if (--m_loadCount > 0)
+        return;
+
     m_NPP_Shutdown();
 
     unloadWithoutShutdown();
@@ -261,6 +268,7 @@ void PluginPackageWin::unloadWithoutShutdown()
     if (!m_isLoaded)
         return;
 
+    ASSERT(m_loadCount == 0);
     ASSERT(m_module);
 
     FreeLibrary(m_module);
index 89556da652c30c36d83082adbc32a63f070dd9f2..c3703568fbab8a432039dc724c96a80095b42a10 100644 (file)
@@ -64,6 +64,7 @@ namespace WebCore {
         bool fetchInfo();
 
         bool m_isLoaded;
+        int m_loadCount;
 
         String m_description;
         String m_path;
index 8afcf49f2ef6a4169a6ce6c39ade06c0b718a148..74eda6bb1502532b4320efcd731621f36f8e940e 100644 (file)
@@ -1155,6 +1155,9 @@ PluginViewWin::~PluginViewWin()
 
     if (m_window)
         DestroyWindow(m_window);
+
+    m_parentFrame->cleanupScriptObjectsForPlugin(this);
+    m_plugin->unload();
 }
 
 void PluginViewWin::disconnectStream(PluginStreamWin* stream)