diff options
Diffstat (limited to 'WebCore/plugins')
-rw-r--r-- | WebCore/plugins/PluginPackage.cpp | 4 | ||||
-rw-r--r-- | WebCore/plugins/PluginQuirkSet.h | 3 | ||||
-rw-r--r-- | WebCore/plugins/gtk/PluginViewGtk.cpp | 17 | ||||
-rw-r--r-- | WebCore/plugins/qt/PluginViewQt.cpp | 19 | ||||
-rw-r--r-- | WebCore/plugins/symbian/PluginViewSymbian.cpp | 14 |
5 files changed, 32 insertions, 25 deletions
diff --git a/WebCore/plugins/PluginPackage.cpp b/WebCore/plugins/PluginPackage.cpp index 278be30..c7d8b22 100644 --- a/WebCore/plugins/PluginPackage.cpp +++ b/WebCore/plugins/PluginPackage.cpp @@ -195,6 +195,10 @@ void PluginPackage::determineQuirks(const String& mimeType) } else { // Flash 9 and older requests windowless plugins if we return a mozilla user agent m_quirks.add(PluginQuirkWantsMozillaUserAgent); +#if PLATFORM(QT) + // Flash 9 and older would crash on repeated calls to SetWindow in windowed mode + m_quirks.add(PluginQuirkDontCallSetWindowMoreThanOnce); +#endif } m_quirks.add(PluginQuirkThrottleInvalidate); diff --git a/WebCore/plugins/PluginQuirkSet.h b/WebCore/plugins/PluginQuirkSet.h index de29baf..7f52f6a 100644 --- a/WebCore/plugins/PluginQuirkSet.h +++ b/WebCore/plugins/PluginQuirkSet.h @@ -46,7 +46,8 @@ namespace WebCore { PluginQuirkDontSetNullWindowHandleOnDestroy = 1 << 10, PluginQuirkDontAllowMultipleInstances = 1 << 11, PluginQuirkRequiresGtkToolKit = 1 << 12, - PluginQuirkRequiresDefaultScreenDepth = 1 << 13 + PluginQuirkRequiresDefaultScreenDepth = 1 << 13, + PluginQuirkDontCallSetWindowMoreThanOnce = 1 << 14 }; class PluginQuirkSet { diff --git a/WebCore/plugins/gtk/PluginViewGtk.cpp b/WebCore/plugins/gtk/PluginViewGtk.cpp index dca7dad..78c6636 100644 --- a/WebCore/plugins/gtk/PluginViewGtk.cpp +++ b/WebCore/plugins/gtk/PluginViewGtk.cpp @@ -506,10 +506,10 @@ void PluginView::setNPWindowIfNeeded() m_npWindow.width = m_windowRect.width(); m_npWindow.height = m_windowRect.height(); - m_npWindow.clipRect.left = m_clipRect.x(); - m_npWindow.clipRect.top = m_clipRect.y(); - m_npWindow.clipRect.right = m_clipRect.width(); - m_npWindow.clipRect.bottom = m_clipRect.height(); + m_npWindow.clipRect.left = max(0, m_clipRect.x()); + m_npWindow.clipRect.top = max(0, m_clipRect.y()); + m_npWindow.clipRect.right = m_clipRect.x() + m_clipRect.width(); + m_npWindow.clipRect.bottom = m_clipRect.y() + m_clipRect.height(); GtkAllocation allocation = { m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height() }; gtk_widget_size_allocate(platformPluginWidget(), &allocation); @@ -522,6 +522,8 @@ void PluginView::setNPWindowIfNeeded() } else { m_npWindow.x = 0; m_npWindow.y = 0; + m_npWindow.width = m_windowRect.width(); + m_npWindow.height = m_windowRect.height(); m_npWindow.clipRect.left = 0; m_npWindow.clipRect.top = 0; @@ -529,13 +531,6 @@ void PluginView::setNPWindowIfNeeded() m_npWindow.clipRect.bottom = 0; } - // FLASH WORKAROUND: Only set initially. Multiple calls to - // setNPWindow() cause the plugin to crash in windowed mode. - if (!m_isWindowed || m_npWindow.width == (unsigned int)-1 || m_npWindow.height == (unsigned int)-1) { - m_npWindow.width = m_windowRect.width(); - m_npWindow.height = m_windowRect.height(); - } - PluginView::setCurrentPluginView(this); JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); setCallingPlugin(true); diff --git a/WebCore/plugins/qt/PluginViewQt.cpp b/WebCore/plugins/qt/PluginViewQt.cpp index 6a0fa39..0ca356b 100644 --- a/WebCore/plugins/qt/PluginViewQt.cpp +++ b/WebCore/plugins/qt/PluginViewQt.cpp @@ -493,10 +493,10 @@ void PluginView::setNPWindowIfNeeded() m_npWindow.x = m_windowRect.x(); m_npWindow.y = m_windowRect.y(); - m_npWindow.clipRect.left = m_clipRect.x(); - m_npWindow.clipRect.top = m_clipRect.y(); - m_npWindow.clipRect.right = m_clipRect.width(); - m_npWindow.clipRect.bottom = m_clipRect.height(); + m_npWindow.clipRect.left = max(0, m_clipRect.x()); + m_npWindow.clipRect.top = max(0, m_clipRect.y()); + m_npWindow.clipRect.right = m_clipRect.x() + m_clipRect.width(); + m_npWindow.clipRect.bottom = m_clipRect.y() + m_clipRect.height(); } else { m_npWindow.x = 0; m_npWindow.y = 0; @@ -507,9 +507,14 @@ void PluginView::setNPWindowIfNeeded() m_npWindow.clipRect.bottom = 0; } - // FLASH WORKAROUND: Only set initially. Multiple calls to - // setNPWindow() cause the plugin to crash in windowed mode. - if (!m_isWindowed || m_npWindow.width == -1 || m_npWindow.height == -1) { + if (m_plugin->quirks().contains(PluginQuirkDontCallSetWindowMoreThanOnce)) { + // FLASH WORKAROUND: Only set initially. Multiple calls to + // setNPWindow() cause the plugin to crash in windowed mode. + if (!m_isWindowed || m_npWindow.width == -1 || m_npWindow.height == -1) { + m_npWindow.width = m_windowRect.width(); + m_npWindow.height = m_windowRect.height(); + } + } else { m_npWindow.width = m_windowRect.width(); m_npWindow.height = m_windowRect.height(); } diff --git a/WebCore/plugins/symbian/PluginViewSymbian.cpp b/WebCore/plugins/symbian/PluginViewSymbian.cpp index 361f946..baa9839 100644 --- a/WebCore/plugins/symbian/PluginViewSymbian.cpp +++ b/WebCore/plugins/symbian/PluginViewSymbian.cpp @@ -267,10 +267,10 @@ void PluginView::setNPWindowIfNeeded() m_npWindow.x = m_windowRect.x(); m_npWindow.y = m_windowRect.y(); - m_npWindow.clipRect.left = m_clipRect.x(); - m_npWindow.clipRect.top = m_clipRect.y(); - m_npWindow.clipRect.right = m_clipRect.width(); - m_npWindow.clipRect.bottom = m_clipRect.height(); + m_npWindow.clipRect.left = max(0, m_clipRect.x()); + m_npWindow.clipRect.top = max(0, m_clipRect.y()); + m_npWindow.clipRect.right = m_clipRect.x() + m_clipRect.width(); + m_npWindow.clipRect.bottom = m_clipRect.y() + m_clipRect.height(); } else { // always call this method before painting. @@ -418,8 +418,10 @@ void PluginView::platformDestroy() { if (platformPluginWidget()) { PluginContainerSymbian* container = static_cast<PluginContainerSymbian*>(platformPluginWidget()); - delete container->proxy(); - delete container; + if (container && container->proxy()) + delete container->proxy(); + else + delete container; } } |