Changeset 185717 in webkit
- Timestamp:
- Jun 18, 2015, 12:32:15 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
-
ChangeLog (modified) (1 diff)
-
plugins/DOMMimeType.cpp (modified) (4 diffs)
-
plugins/DOMMimeType.h (modified) (1 diff)
-
plugins/DOMPlugin.cpp (modified) (2 diffs)
-
plugins/DOMPlugin.h (modified) (2 diffs)
-
plugins/DOMPluginArray.cpp (modified) (2 diffs)
-
plugins/PluginData.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r185714 r185717 1 2015-06-17 Conrad Shultz <conrad_shultz@apple.com> 2 3 REGRESSION: js/dom/navigator-plugins-crash.html asserts a lot 4 https://bugs.webkit.org/show_bug.cgi?id=144399 5 6 Reviewed by Darin Adler. 7 8 Earlier work made the array of web-visible plug-ins dynamic, but allowed DOMPlugin (and, indirectly by extension, 9 DOMMimeType) to continue keeping a reference to a plug-in in terms of an index into that array. This superficially 10 appeared correct since DOMPlugin immutably holds onto a PluginData instance, which in turn immutably holds onto a 11 Page instance. PluginStrategy::getWebVisiblePluginInfo() is passed this Page, which is used to determine the contents 12 of the plugin array. The expectation was that keeping an index would still be safe since the Page is not changing, 13 but this is not strictly correct since relevant attributes of the Page and/or the available plugins may still change. 14 15 It's not entirely clear why the test failures are intermittent and occur only on certain configurations, but address 16 them by eliminating the incorrect storage of indexes in favor of keeping copies of the relevant plugin info itself. 17 18 * plugins/DOMMimeType.cpp: 19 (WebCore::DOMMimeType::DOMMimeType): 20 Instead of storing the MIME type index, retrieve and store the MIME class info and plugin info. 21 (WebCore::DOMMimeType::type): 22 Directly access the m_mimeClassInfo member. 23 (WebCore::DOMMimeType::suffixes): 24 Ditto. 25 (WebCore::DOMMimeType::description): 26 Ditto. 27 (WebCore::DOMMimeType::enabledPlugin): 28 Directly access the m_pluginInfo member. 29 (WebCore::DOMMimeType::mimeClassInfo): Deleted. 30 31 * plugins/DOMMimeType.h: 32 Update member variables. 33 34 * plugins/DOMPlugin.cpp: 35 (WebCore::DOMPlugin::DOMPlugin): 36 Instead of storing the plugin index, store the plugin info directly. 37 (WebCore::DOMPlugin::name): 38 Directly access m_pluginInfo. 39 (WebCore::DOMPlugin::filename): 40 Ditto. 41 (WebCore::DOMPlugin::description): 42 Ditto. 43 (WebCore::DOMPlugin::length): 44 Ditto. 45 (WebCore::DOMPlugin::item): 46 Access m_pluginInfo directly; find the matching plug-in based on matching PluginInfo (for which an overloaded 47 comparator is supplied below). 48 (WebCore::DOMPlugin::pluginInfo): Deleted. 49 50 * plugins/DOMPlugin.h: 51 Update member variables. 52 (WebCore::DOMPlugin::create): 53 Accept a PluginInfo instead of a plugin index. 54 55 * plugins/DOMPluginArray.cpp: 56 (WebCore::DOMPluginArray::item): 57 (WebCore::DOMPluginArray::namedItem): 58 59 * plugins/PluginData.h: 60 (WebCore::operator==): 61 Added; compare PluginInfo structs on the basis of member equality. 62 1 63 2015-06-17 Alex Christensen <achristensen@webkit.org> 2 64 -
trunk/Source/WebCore/plugins/DOMMimeType.cpp
r182617 r185717 33 33 : FrameDestructionObserver(frame) 34 34 , m_pluginData(pluginData) 35 , m_index(index)36 35 { 36 Vector<MimeClassInfo> mimes; 37 Vector<size_t> mimePluginIndices; 38 m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices); 39 m_mimeClassInfo = mimes[index]; 40 m_pluginInfo = m_pluginData->webVisiblePlugins()[mimePluginIndices[index]]; 37 41 } 38 42 … … 43 47 String DOMMimeType::type() const 44 48 { 45 return m imeClassInfo().type;49 return m_mimeClassInfo.type; 46 50 } 47 51 48 52 String DOMMimeType::suffixes() const 49 53 { 50 const Vector<String>& extensions = m imeClassInfo().extensions;54 const Vector<String>& extensions = m_mimeClassInfo.extensions; 51 55 52 56 StringBuilder builder; … … 61 65 String DOMMimeType::description() const 62 66 { 63 return mimeClassInfo().desc; 64 } 65 66 MimeClassInfo DOMMimeType::mimeClassInfo() const 67 { 68 Vector<MimeClassInfo> mimes; 69 Vector<size_t> mimePluginIndices; 70 m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices); 71 return mimes[m_index]; 67 return m_mimeClassInfo.desc; 72 68 } 73 69 … … 80 76 Vector<size_t> mimePluginIndices; 81 77 m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices); 82 return DOMPlugin::create(m_pluginData.get(), m_frame, m imePluginIndices[m_index]);78 return DOMPlugin::create(m_pluginData.get(), m_frame, m_pluginInfo); 83 79 } 84 80 -
trunk/Source/WebCore/plugins/DOMMimeType.h
r182617 r185717 43 43 44 44 private: 45 MimeClassInfo mimeClassInfo() const;46 47 45 DOMMimeType(PassRefPtr<PluginData>, Frame*, unsigned index); 46 MimeClassInfo m_mimeClassInfo; 48 47 RefPtr<PluginData> m_pluginData; 49 unsigned m_index;48 PluginInfo m_pluginInfo; 50 49 }; 51 50 -
trunk/Source/WebCore/plugins/DOMPlugin.cpp
r184990 r185717 26 26 namespace WebCore { 27 27 28 DOMPlugin::DOMPlugin(PluginData* pluginData, Frame* frame, unsigned index)28 DOMPlugin::DOMPlugin(PluginData* pluginData, Frame* frame, PluginInfo pluginInfo) 29 29 : FrameDestructionObserver(frame) 30 30 , m_pluginData(pluginData) 31 , m_ index(index)31 , m_pluginInfo(WTF::move(pluginInfo)) 32 32 { 33 33 } … … 39 39 String DOMPlugin::name() const 40 40 { 41 return pluginInfo().name;41 return m_pluginInfo.name; 42 42 } 43 43 44 44 String DOMPlugin::filename() const 45 45 { 46 return pluginInfo().file;46 return m_pluginInfo.file; 47 47 } 48 48 49 49 String DOMPlugin::description() const 50 50 { 51 return pluginInfo().desc;51 return m_pluginInfo.desc; 52 52 } 53 53 54 54 unsigned DOMPlugin::length() const 55 55 { 56 return pluginInfo().mimes.size(); 57 } 58 59 PluginInfo DOMPlugin::pluginInfo() const 60 { 61 return m_pluginData->webVisiblePlugins()[m_index]; 56 return m_pluginInfo.mimes.size(); 62 57 } 63 58 64 59 PassRefPtr<DOMMimeType> DOMPlugin::item(unsigned index) 65 60 { 66 if (index >= pluginInfo().mimes.size())61 if (index >= m_pluginInfo.mimes.size()) 67 62 return 0; 68 63 69 MimeClassInfo mime = pluginInfo().mimes[index];64 MimeClassInfo mime = m_pluginInfo.mimes[index]; 70 65 71 66 Vector<MimeClassInfo> mimes; 72 67 Vector<size_t> mimePluginIndices; 68 Vector<PluginInfo> plugins = m_pluginData->webVisiblePlugins(); 73 69 m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices); 74 70 for (unsigned i = 0; i < mimes.size(); ++i) { 75 if (mimes[i] == mime && mimePluginIndices[i] == m_index)71 if (mimes[i] == mime && plugins[mimePluginIndices[i]] == m_pluginInfo) 76 72 return DOMMimeType::create(m_pluginData.get(), m_frame, i); 77 73 } -
trunk/Source/WebCore/plugins/DOMPlugin.h
r182617 r185717 34 34 class DOMPlugin : public ScriptWrappable, public RefCounted<DOMPlugin>, public FrameDestructionObserver { 35 35 public: 36 static Ref<DOMPlugin> create(PluginData* pluginData, Frame* frame, unsigned index) { return adoptRef(*new DOMPlugin(pluginData, frame, index)); }36 static Ref<DOMPlugin> create(PluginData* pluginData, Frame* frame, PluginInfo pluginInfo) { return adoptRef(*new DOMPlugin(pluginData, frame, WTF::move(pluginInfo))); } 37 37 ~DOMPlugin(); 38 38 … … 48 48 49 49 private: 50 PluginInfo pluginInfo() const; 51 52 DOMPlugin(PluginData*, Frame*, unsigned index); 50 DOMPlugin(PluginData*, Frame*, PluginInfo); 53 51 RefPtr<PluginData> m_pluginData; 54 unsigned m_index;52 PluginInfo m_pluginInfo; 55 53 }; 56 54 -
trunk/Source/WebCore/plugins/DOMPluginArray.cpp
r184990 r185717 62 62 if (index >= plugins.size()) 63 63 return 0; 64 return DOMPlugin::create(data, m_frame, index);64 return DOMPlugin::create(data, m_frame, plugins[index]); 65 65 } 66 66 … … 84 84 return 0; 85 85 86 const Vector<PluginInfo>& plugins = data->webVisiblePlugins(); 87 for (unsigned i = 0; i < plugins.size(); ++i) { 88 if (plugins[i].name == propertyName) 89 return DOMPlugin::create(data, m_frame, i); 86 for (auto& plugin : data->webVisiblePlugins()) { 87 if (plugin.name == propertyName) 88 return DOMPlugin::create(data, m_frame, plugin); 90 89 } 91 90 return 0; -
trunk/Source/WebCore/plugins/PluginData.h
r182617 r185717 74 74 }; 75 75 76 inline bool operator==(PluginInfo& a, PluginInfo& b) 77 { 78 bool result = a.name == b.name && a.file == b.file && a.desc == b.desc && a.mimes == b.mimes && a.isApplicationPlugin == b.isApplicationPlugin && a.clientLoadPolicy == b.clientLoadPolicy; 79 #if PLATFORM(MAC) 80 result = result && a.bundleIdentifier == b.bundleIdentifier && a.versionString == b.versionString; 81 #endif 82 return result; 83 } 84 76 85 // FIXME: merge with PluginDatabase in the future 77 86 class PluginData : public RefCounted<PluginData> {
Note:
See TracChangeset
for help on using the changeset viewer.