--- a/webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp Wed Jun 09 10:52:50 2010 +0300
+++ b/webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp Mon Jun 21 16:54:17 2010 +0300
@@ -44,6 +44,7 @@
#include "WebPointerEventHandler.h"
#include "WebPageScrollHandler.h"
#include "WebKitLogger.h"
+#include "WebCoreGraphicsContext.h"
#include <rt_gestureif.h>
@@ -89,6 +90,9 @@
}
// Add the focus/foreground observer
ControlEnv()->AddForegroundObserverL( *this ) ;
+ m_pluginHasBitmap = false;
+ m_pausedBitmap = NULL;
+ m_BitmapSupported = false;
}
// -----------------------------------------------------------------------------
@@ -98,21 +102,21 @@
//
PluginWin::~PluginWin()
{
- CBrCtl* brCtl = control(m_pluginskin->frame());
- if (brCtl) {
- WebView* view = brCtl->webView();
- if (view) {
- int index = view->getVisiblePlugins().Find(m_pluginskin);
- if (index != KErrNotFound)
- view->getVisiblePlugins().Remove(index);
- }
- }
+ PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler();
+
+ int index = pluginHandler->getVisiblePlugins().Find(m_pluginskin);
+ if (index != KErrNotFound)
+ pluginHandler->getVisiblePlugins().Remove(index);
TRAP_IGNORE( setPluginFocusL( EFalse ) );
// Remove the foreground observer
ControlEnv()->RemoveForegroundObserver( *this );
delete m_bitmap;
+ if (m_pausedBitmap)
+ {
+ delete m_pausedBitmap;
+ }
}
// -----------------------------------------------------------------------------
@@ -161,6 +165,7 @@
void PluginWin::windowChangedL()
{
if (m_fullscreen) return;
+ PlayPausePluginL();
if (m_pluginskin->getNPPluginFucs() && m_pluginskin->getNPPluginFucs()->setwindow ){
NPWindow window;
TRect rect( m_pluginskin->getPluginWinRect() );
@@ -381,7 +386,11 @@
//
void PluginWin::makeVisible( TBool visible )
{
- if(IsVisible() != visible)
+ WebView* view = control(m_pluginskin->frame())->webView();
+ if(!view)
+ return;
+
+ if((!m_pluginHasBitmap) && (IsVisible() != visible) && (!view->isPinchZoom()))
{
CCoeControl::MakeVisible(visible);
}
@@ -394,14 +403,14 @@
HandleLosingForeground();
}
- WebView* view = control(m_pluginskin->frame())->webView();
- int index = view->getVisiblePlugins().Find(m_pluginskin);
+ PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler();
+ int index = pluginHandler->getVisiblePlugins().Find(m_pluginskin);
if (visible && (m_visibilty != visible) && (index == KErrNotFound)) {
- view->getVisiblePlugins().AppendL(m_pluginskin);
+ pluginHandler->getVisiblePlugins().AppendL(m_pluginskin);
m_visibilty = visible;
}
else if (!visible && (index != KErrNotFound)) {
- view->getVisiblePlugins().Remove(index);
+ pluginHandler->getVisiblePlugins().Remove(index);
m_visibilty = visible;
}
@@ -728,18 +737,51 @@
}
}
}
-void PluginWin::PlayPausePluginL (bool pause)
+void PluginWin::PlayPausePluginL ()
{
- if(m_notifier) {
- if (pause) {
- m_notifier->NotifyL( MPluginNotifier::EPluginPause, (void*)1 );
- }
- else {
- m_notifier->NotifyL( MPluginNotifier::EPluginPause, (void*)0 );
- }
+ if(m_notifier)
+ {
+ CBrCtl* brCtl = control(m_pluginskin->frame());
+ WebView* view = brCtl->webView();
+ TBool scrolling = view->viewIsScrolling();
+ if (scrolling) {
+ m_notifier->NotifyL( MPluginNotifier::EPluginPause, (void*)1 );
+ }
+ else {
+ m_notifier->NotifyL( MPluginNotifier::EPluginPause, (void*)0 );
+ }
}
}
+TBool PluginWin::IsCollectBitmapSupported ()
+{
+ if(m_notifier) {
+ m_BitmapSupported = m_notifier->NotifyL( MPluginNotifier::ECollectBitmapSupported, (void*)0 ) ;
+ }
+ return m_BitmapSupported;
+}
+
+
+void PluginWin::GetBitmapFromPlugin (bool status)
+ {
+ if(m_notifier) {
+ if (status) {
+ m_notifier->NotifyL( MPluginNotifier::ECollectBitmap, (void*)1 );
+ }
+ else {
+ m_notifier->NotifyL( MPluginNotifier::ECollectBitmap, (void*)0 );
+
+ m_pluginHasBitmap = 0;
+ if(m_pausedBitmap)
+ {
+ delete m_pausedBitmap;
+ m_pausedBitmap = NULL;
+ }
+ }
+ }
+}
+
+
void PluginWin::HandlePointerEventFromPluginL(const TPointerEvent& aEvent)
{
CBrCtl* brCtl = control(m_pluginskin->frame());
@@ -872,3 +914,77 @@
else
return false;
}
+// -----------------------------------------------------------------------------
+// PluginWin::SetBitmapFromPlugin
+// Plugin video is captured in CFBsBitmap and handle is passed to plugin window
+// Duplicate the bitmap handle and use it to draw while Panning or Pinch zoom
+// -----------------------------------------------------------------------------
+void PluginWin::SetBitmapFromPlugin(TInt aHandle)
+ {
+
+// m_pluginfocus = 1;
+
+ if (aHandle)
+ {
+ if (m_pausedBitmap)
+ {
+ delete m_pausedBitmap;
+ m_pausedBitmap = NULL;
+ }
+ m_pausedBitmap = new (ELeave) CFbsBitmap();
+ TInt dupStatus = m_pausedBitmap->Duplicate(aHandle);
+ if(dupStatus == KErrNone)
+ {
+ m_pluginHasBitmap = true;
+
+
+ if (IsVisible())
+ {
+ MakeVisible(false);
+ }
+ //setPluginFocusL(false);
+ drawBitmapToWebCoreContext();
+ }
+ }
+ else
+ {
+ if(m_pausedBitmap)
+ {
+ delete m_pausedBitmap;
+ m_pausedBitmap = NULL;
+ }
+ m_pluginHasBitmap = false;
+ }
+ }
+
+void PluginWin::ClearPluginBitmap()
+ {
+ if(m_pausedBitmap)
+ {
+ delete m_pausedBitmap;
+ m_pausedBitmap = NULL;
+ m_pluginHasBitmap = false; //clearing plugin bitmap
+ }
+ }
+
+void PluginWin::drawBitmapToWebCoreContext()
+ {
+ CBrCtl* brCtl = control(m_pluginskin->frame());
+ WebView* view = brCtl->webView();
+ WebCoreGraphicsContext* context = view->getGraphicsContext();
+ CFbsBitGc& gc = context->gc();
+ TRect plWinRect(m_pluginskin->getPluginWinRect());
+
+ TRect oldcontextrect = context->clippingRect();
+ TRect clippingRect = context->clippingRect();
+
+ // save the gc state
+ TWebCoreSavedContext saved(context->save());
+
+ if(plWinRect != clippingRect)
+ {
+ context->setClippingRect(plWinRect);
+ }
+ gc.DrawBitmap(plWinRect, m_pausedBitmap);
+ context->restore(saved);
+ }