+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.
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")
+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.
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;
};
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 };
/*
/*******************************************************************/
-PluginBase::PluginBase(ExecState *exec)
- : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype() )
+void PluginBase::cachePluginDataIfNecessary()
{
if (!plugins) {
plugins = new Vector<PluginInfo*>;
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();
}