2006-03-20 Eric Seidel <eseidel@apple.com>
authoreseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Mar 2006 04:23:44 +0000 (04:23 +0000)
committereseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Mar 2006 04:23:44 +0000 (04:23 +0000)
        Reviewed by adele & ggaren.

        Added new cachePluginDataIfNecessary function to update
        plugins and mimes arrays.  Made sure to call this in
        constructor as well as refresh.  The crash was caused by
        a refresh rendering a "plugins" object invalid.
        Changed existing test case to depend on this new correct behavior.

        <rdar://problem/4480571> Safari crashed at exit at KXMLCore::deleteAllValues + 24

        * khtml/ecma/kjs_navigator.cpp:
        (KJS::PluginBase::cachePluginDataIfNecessary):
        (KJS::PluginBase::PluginBase):
        (KJS::PluginBase::~PluginBase):
        (KJS::PluginBase::refresh):

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

LayoutTests/ChangeLog
LayoutTests/plugins/plugin-javascript-access.html
WebCore/ChangeLog
WebCore/khtml/ecma/kjs_navigator.cpp

index 4c8ea3e..ee96787 100644 (file)
@@ -1,5 +1,14 @@
 2006-03-20  Eric Seidel  <eseidel@apple.com>
 
+        Reviewed by adele & ggaren.
+
+        Modified test case to cover crasher:
+         <rdar://problem/4480571> Safari crashed at exit at KXMLCore::deleteAllValues + 24
+
+        * plugins/plugin-javascript-access.html:
+
+2006-03-20  Eric Seidel  <eseidel@apple.com>
+
         Reviewed by justing.
 
         Re-enable previously failing test.
index f30dfa6..223d928 100644 (file)
@@ -8,12 +8,14 @@
 if (window.layoutTestController)
     layoutTestController.dumpAsText()
 
-navigator.plugins.refresh(false); // Supposedly helps if new plug-ins were added.
+var plugins = navigator.plugins;
+
+plugins.refresh(false); // Supposedly helps if new plug-ins were added.
 
 var foundTestPlugin = false;
 
-for (var pi = 0; pi != navigator.plugins.length; pi++) {
-    var plugin = navigator.plugins[pi];
+for (var pi = 0; pi != plugins.length; pi++) {
+    var plugin = plugins[pi];
     
     // We can only guarantee that the Test PlugIn is installed.
     if (plugin.name != "WebKit Test PlugIn")
index 38ef9c1..67d3668 100644 (file)
@@ -1,3 +1,21 @@
+2006-03-20  Eric Seidel  <eseidel@apple.com>
+
+        Reviewed by adele & ggaren.
+
+        Added new cachePluginDataIfNecessary function to update
+        plugins and mimes arrays.  Made sure to call this in
+        constructor as well as refresh.  The crash was caused by
+        a refresh rendering a "plugins" object invalid.
+        Changed existing test case to depend on this new correct behavior.
+        
+        <rdar://problem/4480571> Safari crashed at exit at KXMLCore::deleteAllValues + 24
+
+        * khtml/ecma/kjs_navigator.cpp:
+        (KJS::PluginBase::cachePluginDataIfNecessary):
+        (KJS::PluginBase::PluginBase):
+        (KJS::PluginBase::~PluginBase):
+        (KJS::PluginBase::refresh):
+
 2006-03-20  Adele Peterson  <adele@apple.com>
 
         Reviewed by Justin.
index fe4bb30..8b9da0b 100644 (file)
@@ -43,11 +43,13 @@ namespace KJS {
         
         void refresh(bool reload);
 
+    protected:
+        static void cachePluginDataIfNecessary();
         static Vector<PluginInfo*> *plugins;
         static Vector<MimeClassInfo*> *mimes;
 
     private:
-        static int m_refCount;
+        static int m_plugInCacheRefCount;
     };
 
 
@@ -117,7 +119,7 @@ const ClassInfo MimeType::info = { "MimeType", 0, &MimeTypeTable, 0 };
 
 Vector<PluginInfo*> *KJS::PluginBase::plugins = 0;
 Vector<MimeClassInfo*> *KJS::PluginBase::mimes = 0;
-int KJS::PluginBase::m_refCount = 0;
+int KJS::PluginBase::m_plugInCacheRefCount = 0;
 
 const ClassInfo Navigator::info = { "Navigator", 0, &NavigatorTable, 0 };
 /*
@@ -196,8 +198,7 @@ JSValue *Navigator::getValueProperty(ExecState *exec, int token) const
 
 /*******************************************************************/
 
-PluginBase::PluginBase(ExecState *exec)
-  : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype() )
+void PluginBase::cachePluginDataIfNecessary()
 {
     if (!plugins) {
         plugins = new Vector<PluginInfo*>;
@@ -220,32 +221,47 @@ PluginBase::PluginBase(ExecState *exec)
                 mimes->append(*itr);
         }
     }
+}
 
-    m_refCount++;
+PluginBase::PluginBase(ExecState *exec)
+  : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype() )
+{
+    cachePluginDataIfNecessary();
+    m_plugInCacheRefCount++;
 }
 
 PluginBase::~PluginBase()
 {
-    m_refCount--;
-    if ( m_refCount==0 ) {
+    m_plugInCacheRefCount--;
+    if (!m_plugInCacheRefCount) {
+        if (plugins) {
+            deleteAllValues(*plugins);
+            delete plugins;
+            plugins = 0;
+        }
+        if (mimes) {
+            deleteAllValues(*mimes);
+            delete mimes;
+            mimes = 0;
+        }
+    }
+}
+
+void PluginBase::refresh(bool reload)
+{
+    if (plugins) {
         deleteAllValues(*plugins);
         delete plugins;
+        plugins = 0;
+    }
+    if (mimes) {
         deleteAllValues(*mimes);
         delete mimes;
-        plugins = 0;
         mimes = 0;
     }
-}
-
-void PluginBase::refresh(bool reload)
-{
-    deleteAllValues(*plugins);
-    delete plugins;
-    deleteAllValues(*mimes);
-    delete mimes;
-    plugins = 0;
-    mimes = 0;
+    
     refreshPlugins(reload);
+    cachePluginDataIfNecessary();
 }