Revert "[Tizen] Update web-engine-plugin to sync with LWE library and dali-adaptor"
authorSeoyeon Kim <seoyeon2.kim@samsung.com>
Mon, 5 Nov 2018 07:49:17 +0000 (16:49 +0900)
committerSeoyeon Kim <seoyeon2.kim@samsung.com>
Mon, 5 Nov 2018 07:49:17 +0000 (16:49 +0900)
This reverts commit b7817793581f881a2d0d0f1856204cfd9c70ad6d.

build/tizen/web-engine-lite/Makefile.am
build/tizen/web-engine-lite/configure.ac
dali-extension/web-engine-lite/tizen-web-engine-lite.cpp
dali-extension/web-engine-lite/tizen-web-engine-lite.h
packaging/dali-extension.spec

index d06f9b2..7496c3d 100644 (file)
@@ -31,11 +31,13 @@ libdali_web_engine_lite_plugin_la_DEPENDENCIES =
 
 libdali_web_engine_lite_plugin_la_CXXFLAGS = \
                       $(DALI_CFLAGS) \
+                      $(LIBTUV_CFLAGS) \
                       $(WEB_ENGINE_LITE_CFLAGS) \
                       -Werror -Wall
 
 libdali_web_engine_lite_plugin_la_LIBADD = \
                       $(DALI_LIBS) \
+                      $(LIBTUV_LIBS) \
                       $(WEB_ENGINE_LITE_LIBS)
 
 libdali_web_engine_lite_plugin_la_LDFLAGS = \
index 9ed046f..cb6a397 100644 (file)
@@ -16,6 +16,7 @@ AC_SUBST(DALI_EXTENSION_VERSION)
 
 PKG_CHECK_MODULES([DALI], [dali-core dali-adaptor dali-toolkit])
 PKG_CHECK_MODULES(WAYLAND, libtbm)
+PKG_CHECK_MODULES([LIBTUV], [libtuv])
 PKG_CHECK_MODULES([WEB_ENGINE_LITE], [lightweight-web-engine-dali-plugin])
 
 devincludepath=${includedir}
index 0ef0afd..28d246c 100644 (file)
@@ -24,8 +24,8 @@
 #include <dali/public-api/events/key-event.h>
 #include <dali/public-api/events/touch-data.h>
 
+#include <libtuv/uv.h>
 #include <unistd.h>
-#include <pthread.h>
 
 // The plugin factories
 extern "C" DALI_EXPORT_API Dali::WebEnginePlugin* CreateWebEnginePlugin( void )
@@ -41,7 +41,54 @@ extern "C" DALI_EXPORT_API void DestroyWebEnginePlugin( Dali::WebEnginePlugin* p
   }
 }
 
-static LWE::KeyValue KeyStringToKeyValue( const char* DALIKeyString, bool isShiftPressed )
+#define TO_CONTAINER(ptr) (((TizenWebEngineLite*)ptr)->mWebContainer)
+
+static bool gIsNeedsUpdate = false;
+static bool gIsFirstTime = true;
+static uv_async_t gLauncherHandle;
+static pthread_mutex_t gMutex;
+static bool gIsAliveMainLoop = false;
+static int gDaliNumber = 0;
+
+class Locker {
+public:
+  Locker(pthread_mutex_t& lock)
+    : m_lock( lock )
+  {
+    pthread_mutex_lock( &m_lock );
+  }
+
+  ~Locker()
+  {
+    pthread_mutex_unlock( &m_lock );
+  }
+protected:
+  pthread_mutex_t m_lock;
+};
+
+struct UVAsyncHandleData {
+  std::function<void(void*)> cb;
+  void* data;
+};
+
+static bool IsAliveMainThread()
+{
+  return gIsAliveMainLoop;
+}
+
+static void InitMainThread( void* (*f)(void*), pthread_t& t )
+{
+  pthread_mutex_init(&gMutex, NULL);
+
+  pthread_mutex_lock(&gMutex);
+  pthread_attr_t attr;
+  pthread_attr_init(&attr);
+  pthread_create(&t, &attr, f, NULL);
+  pthread_mutex_lock(&gMutex);
+  pthread_mutex_unlock(&gMutex);
+}
+
+LWE::KeyValue KeyStringToKeyValue( const char* DALIKeyString, bool isShiftPressed )
 {
   LWE::KeyValue keyValue = LWE::KeyValue::UnidentifiedKey;
   if( strcmp( "Left", DALIKeyString ) == 0 )
@@ -255,21 +302,6 @@ static LWE::KeyValue KeyStringToKeyValue( const char* DALIKeyString, bool isShif
   return keyValue;
 }
 
-class Locker {
-public:
-  Locker(pthread_mutex_t& lock)
-    : m_lock( lock )
-  {
-    pthread_mutex_lock( &m_lock );
-  }
-
-  ~Locker()
-  {
-    pthread_mutex_unlock( &m_lock );
-  }
-protected:
-  pthread_mutex_t m_lock;
-};
 
 namespace Dali
 {
@@ -285,7 +317,8 @@ const int TIMER_INTERVAL( 20 );
 } // unnamed namespace
 
 TizenWebEngineLite::TizenWebEngineLite()
-: mIsMouseLbuttonDown( false ),
+: mThreadHandle(),
+  mIsMouseLbuttonDown( false ),
   mTimer(),
   mUrl( "" ),
   mOutputWidth( 0 ),
@@ -295,7 +328,6 @@ TizenWebEngineLite::TizenWebEngineLite()
   mCanGoBack( false ),
   mCanGoForward( false ),
   mIsRunning( false ),
-  mIsNeedsUpdate( true ),
   mWebContainer( NULL ),
 #ifdef STARFISH_DALI_TBMSURFACE
   mTbmSurface( NULL ),
@@ -304,12 +336,10 @@ TizenWebEngineLite::TizenWebEngineLite()
   mBufferImage( NULL )
 #endif
 {
-  pthread_mutex_init(&mOutputBufferMutex, NULL);
 }
 
 TizenWebEngineLite::~TizenWebEngineLite()
 {
-  pthread_mutex_destroy(&mOutputBufferMutex);
 }
 
 bool TizenWebEngineLite::UpdateBuffer()
@@ -319,9 +349,9 @@ bool TizenWebEngineLite::UpdateBuffer()
     return true;
   }
 
-  if( mIsNeedsUpdate )
+  if( gIsNeedsUpdate )
   {
-    Locker l(mOutputBufferMutex);
+    Locker l( gMutex );
 #ifdef STARFISH_DALI_TBMSURFACE
     Dali::Stage::GetCurrent().KeepRendering( 0.0f );
 #else
@@ -331,137 +361,173 @@ bool TizenWebEngineLite::UpdateBuffer()
     }
     mBufferImage.Update();
 #endif
-    mIsNeedsUpdate = false;
+    gIsNeedsUpdate = false;
   }
 
   return true;
 }
 
+void TizenWebEngineLite::StartMainThreadIfNeeds()
+{
+  if ( !IsAliveMainThread() )
+  {
+    InitMainThread( StartMainThread, mThreadHandle );
+  }
+}
+
+void TizenWebEngineLite::CreateInstance()
+{
+  gDaliNumber++;
+  auto cb = []( void* data )
+  {
+    TizenWebEngineLite* engine = static_cast< TizenWebEngineLite* >( data );
+    if ( !LWE::LWE::IsInitialized() )
+    {
+      LWE::LWE::Initialize("/tmp/StarFish_localStorage.txt",
+                           "/tmp/StarFish_Cookies.txt", "/tmp/StarFish-cache");
+    }
+    engine->mWebContainer = LWE::WebContainer::Create(
+        engine->mOutputBuffer, engine->mOutputWidth, engine->mOutputHeight,
+        engine->mOutputStride, 1.0, "SamsungOne", "ko-KR", "Asia/Seoul" );
+    TO_CONTAINER( data )->RegisterOnRenderedHandler(
+        [ engine ]( LWE::WebContainer* container, const LWE::WebContainer::RenderResult& renderResult )
+        {
+          engine->onRenderedHandler( container, renderResult );
+        } );
+    TO_CONTAINER( data )->RegisterOnReceivedErrorHandler(
+        [ engine ]( LWE::WebContainer* container, LWE::ResourceError error )
+        {
+          engine->mCanGoBack = container->CanGoBack();
+          engine->mCanGoForward = container->CanGoForward();
+          engine->onReceivedError( container, error );
+        });
+    TO_CONTAINER( data )->RegisterOnPageStartedHandler(
+        [ engine ]( LWE::WebContainer* container, const std::string& url )
+        {
+          engine->mUrl = url;
+          engine->mCanGoBack = container->CanGoBack();
+          engine->mCanGoForward = container->CanGoForward();
+          engine->onPageStartedHandler( container, url );
+        });
+    TO_CONTAINER( data )->RegisterOnPageLoadedHandler(
+        [ engine ]( LWE::WebContainer* container, const std::string& url )
+        {
+          engine->mUrl = url;
+          engine->mCanGoBack = container->CanGoBack();
+          engine->mCanGoForward = container->CanGoForward();
+          engine->onPageFinishedHandler( container, url );
+        });
+    TO_CONTAINER( data )->RegisterOnLoadResourceHandler(
+        [ engine ]( LWE::WebContainer* container, const std::string& url )
+        {
+          engine->mUrl = url;
+          engine->mCanGoBack = container->CanGoBack();
+          engine->mCanGoForward = container->CanGoForward();
+          engine->onLoadResourceHandler( container, url );
+        });
+    };
+    SendAsyncHandle( cb );
+}
+
 void TizenWebEngineLite::Create( int width, int height, const std::string& locale, const std::string& timezoneId )
 {
   mTimer = Dali::Timer::New( TIMER_INTERVAL );
   mTimer.TickSignal().Connect( this, &TizenWebEngineLite::UpdateBuffer );
   mTimer.Start();
 
+  StartMainThreadIfNeeds();
+
   mIsRunning = true;
   mOutputWidth = width;
   mOutputHeight = height;
   mOutputStride = width * sizeof( uint32_t );
   mOutputBuffer = ( uint8_t* )malloc( width * height * sizeof( uint32_t ) );
 
-  onRenderedHandler = [this]( LWE::WebContainer* c, const LWE::WebContainer::RenderResult& renderResult )
+  if( gIsFirstTime == true )
   {
-    size_t w = mOutputWidth;
-    size_t h = mOutputHeight;
-    if( renderResult.updatedWidth != w || renderResult.updatedHeight != h )
+    gIsFirstTime = false;
+
+    onRenderedHandler = [this]( LWE::WebContainer* c, const LWE::WebContainer::RenderResult& renderResult )
     {
-      return;
-    }
-    Locker l(mOutputBufferMutex);
-    uint8_t* dstBuffer;
-    size_t dstStride;
+      Locker l( gMutex );
+      size_t w = mOutputWidth;
+      size_t h = mOutputHeight;
+      if( renderResult.updatedWidth != w || renderResult.updatedHeight != h )
+      {
+        return;
+      }
+
+      uint8_t* dstBuffer;
+      size_t dstStride;
 
 #ifdef STARFISH_DALI_TBMSURFACE
-    tbm_surface_info_s tbmSurfaceInfo;
-    if( tbm_surface_map( mTbmSurface, TBM_SURF_OPTION_READ | TBM_SURF_OPTION_WRITE, &tbmSurfaceInfo ) != TBM_SURFACE_ERROR_NONE )
-    {
-      DALI_LOG_ERROR( "Fail to map tbm_surface\n" );
-    }
+      tbm_surface_info_s tbmSurfaceInfo;
+      if( tbm_surface_map( mTbmSurface, TBM_SURF_OPTION_READ | TBM_SURF_OPTION_WRITE, &tbmSurfaceInfo ) != TBM_SURFACE_ERROR_NONE )
+      {
+        DALI_LOG_ERROR( "Fail to map tbm_surface\n" );
+      }
+
+      DALI_ASSERT_ALWAYS( tbmSurfaceInfo.format == TBM_FORMAT_ABGR8888 && "Unsupported TizenWebEngineLite tbm format" );
+
+      dstBuffer = tbmSurfaceInfo.planes[0].ptr;
+      dstStride = tbmSurfaceInfo.planes[0].stride;
 
-    DALI_ASSERT_ALWAYS( tbmSurfaceInfo.format == TBM_FORMAT_ARGB8888 && "Unsupported TizenWebEngineLite tbm format" );
-    dstBuffer = tbmSurfaceInfo.planes[0].ptr;
-    dstStride = tbmSurfaceInfo.planes[0].stride;
 #else
-    dstBuffer = mBufferImage.GetBuffer();
-    dstStride = mBufferImage.GetBufferStride();
+      dstBuffer = mBufferImage.GetBuffer();
+      dstStride = mBufferImage.GetBufferStride();
 #endif
 
-    uint32_t srcStride = renderResult.updatedWidth * sizeof(uint32_t);
-    uint8_t* srcBuffer = static_cast< uint8_t* >( renderResult.updatedBufferAddress );
+      uint32_t srcStride = renderResult.updatedWidth * sizeof(uint32_t);
+      uint8_t* srcBuffer = static_cast< uint8_t* >( renderResult.updatedBufferAddress );
 
-    if (dstStride == srcStride)
-    {
-      memcpy( dstBuffer, srcBuffer, tbmSurfaceInfo.planes[0].size );
-    }
-    else
-    {
-      for ( auto y = renderResult.updatedY; y < ( renderResult.updatedHeight + renderResult.updatedY ); y++ )
+      if (dstStride == srcStride)
       {
-        auto start = renderResult.updatedX;
-        memcpy( dstBuffer + ( y * dstStride ) + ( start * 4 ), srcBuffer + ( y * srcStride ) + ( start * 4 ), srcStride );
+        memcpy( dstBuffer, srcBuffer, tbmSurfaceInfo.planes[0].size );
+      }
+      else
+      {
+        for ( auto y = renderResult.updatedY; y < ( renderResult.updatedHeight + renderResult.updatedY ); y++ )
+        {
+          auto start = renderResult.updatedX;
+          memcpy( dstBuffer + ( y * dstStride ) + ( start * 4 ), srcBuffer + ( y * srcStride ) + ( start * 4 ), srcStride );
+        }
       }
-    }
 
 #ifdef STARFISH_DALI_TBMSURFACE
-    if( tbm_surface_unmap( mTbmSurface ) != TBM_SURFACE_ERROR_NONE )
-    {
-      DALI_LOG_ERROR( "Fail to unmap tbm_surface\n" );
-    }
+      if( tbm_surface_unmap( mTbmSurface ) != TBM_SURFACE_ERROR_NONE )
+      {
+        DALI_LOG_ERROR( "Fail to unmap tbm_surface\n" );
+      }
 #endif
-    mIsNeedsUpdate = true;
-  };
+      gIsNeedsUpdate = true;
+    };
 
-  onReceivedError = []( LWE::WebContainer* container, LWE::ResourceError error ) {
-  };
-  onPageStartedHandler = []( LWE::WebContainer* container, const std::string& url ) {
-  };
-  onPageFinishedHandler = []( LWE::WebContainer* container, const std::string& url ) {
-  };
-  onLoadResourceHandler = []( LWE::WebContainer* container, const std::string& url ) {
-  };
+    onReceivedError = []( LWE::WebContainer* container, LWE::ResourceError error ) {
+    };
+    onPageStartedHandler = []( LWE::WebContainer* container, const std::string& url ) {
+    };
+    onPageFinishedHandler = []( LWE::WebContainer* container, const std::string& url ) {
+    };
+    onLoadResourceHandler = []( LWE::WebContainer* container, const std::string& url ) {
+    };
+  }
 
 #ifdef STARFISH_DALI_TBMSURFACE
-  mTbmSurface = tbm_surface_create( width, height, TBM_FORMAT_ARGB8888 );
+  mTbmSurface = tbm_surface_create( width, height, TBM_FORMAT_ABGR8888 );
   mNativeImageSourcePtr = Dali::NativeImageSource::New( mTbmSurface );
 #else
-  mBufferImage = Dali::BufferImage::New( width, height, Dali::Pixel::BGRA8888 );
+  mBufferImage = Dali::BufferImage::New( width, height, Dali::Pixel::RGBA8888 );
 #endif
 
-  if ( !LWE::LWE::IsInitialized() )
+  CreateInstance();
+  while ( true )
   {
-    LWE::LWE::Initialize("/tmp/StarFish_localStorage.txt",
-                         "/tmp/StarFish_Cookies.txt", "/tmp/StarFish-cache");
-  }
-  mWebContainer = LWE::WebContainer::Create(
-      mOutputBuffer, mOutputWidth, mOutputHeight,
-      mOutputStride, 1.0, "SamsungOne", locale.data(), timezoneId.data() );
-  mWebContainer->RegisterOnRenderedHandler(
-      [ this ]( LWE::WebContainer* container, const LWE::WebContainer::RenderResult& renderResult )
-      {
-        onRenderedHandler( container, renderResult );
-      } );
-  mWebContainer->RegisterOnReceivedErrorHandler(
-      [ this ]( LWE::WebContainer* container, LWE::ResourceError error )
+      if ( mWebContainer )
       {
-        mCanGoBack = container->CanGoBack();
-        mCanGoForward = container->CanGoForward();
-        onReceivedError( container, error );
-      });
-  mWebContainer->RegisterOnPageStartedHandler(
-      [ this ]( LWE::WebContainer* container, const std::string& url )
-      {
-        mUrl = url;
-        mCanGoBack = container->CanGoBack();
-        mCanGoForward = container->CanGoForward();
-        onPageStartedHandler( container, url );
-      });
-  mWebContainer->RegisterOnPageLoadedHandler(
-      [ this ]( LWE::WebContainer* container, const std::string& url )
-      {
-        mUrl = url;
-        mCanGoBack = container->CanGoBack();
-        mCanGoForward = container->CanGoForward();
-        onPageFinishedHandler( container, url );
-      });
-  mWebContainer->RegisterOnLoadResourceHandler(
-      [ this ]( LWE::WebContainer* container, const std::string& url )
-      {
-        mUrl = url;
-        mCanGoBack = container->CanGoBack();
-        mCanGoForward = container->CanGoForward();
-        onLoadResourceHandler( container, url );
-      });
-
+          break;
+      }
+      usleep( 100 );
+  }
 }
 
 void TizenWebEngineLite::Destroy()
@@ -483,14 +549,41 @@ void TizenWebEngineLite::Destroy()
 #endif
 
     DestroyInstance();
+    StopLoop();
+
+    int status;
+    pthread_join( mThreadHandle, ( void** )&status );
+
     mWebContainer = NULL;
   }
 }
 
 void TizenWebEngineLite::DestroyInstance()
 {
-  DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->Destroy();
+       DALI_ASSERT_ALWAYS( mWebContainer );
+       auto cb = []( void* data )
+       {
+         TizenWebEngineLite* engine = static_cast< TizenWebEngineLite* >( data );
+
+         TO_CONTAINER( data )->Destroy();
+
+         while ( !engine->mAsyncHandlePool.empty() )
+         {
+           UVAsyncHandleData* handleData = NULL;
+           {
+             Locker l( gMutex );
+             handleData = ( UVAsyncHandleData* )*engine->mAsyncHandlePool.begin();
+             engine->mAsyncHandlePool.erase( engine->mAsyncHandlePool.begin() );
+           }
+
+           if ( handleData ) {
+             handleData->cb( handleData->data );
+             delete handleData;
+           }
+         }
+         gDaliNumber--;
+       };
+       SendAsyncHandle( cb );
 }
 
 Dali::NativeImageInterfacePtr TizenWebEngineLite::GetNativeImageSource()
@@ -501,7 +594,11 @@ Dali::NativeImageInterfacePtr TizenWebEngineLite::GetNativeImageSource()
 void TizenWebEngineLite::LoadUrl( const std::string& url )
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->LoadURL( url );
+  auto cb = [url]( void* data )
+  {
+    TO_CONTAINER( data )->LoadURL( url );
+  };
+  SendAsyncHandle( cb );
 }
 
 const std::string& TizenWebEngineLite::GetUrl()
@@ -513,31 +610,51 @@ const std::string& TizenWebEngineLite::GetUrl()
 void TizenWebEngineLite::LoadHTMLString( const std::string& str )
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->LoadData( str );
+  auto cb = [str]( void* data )
+  {
+    TO_CONTAINER( data )->LoadData( str );
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::Reload()
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->Reload();
+  auto cb = []( void* data )
+  {
+    TO_CONTAINER( data )->Reload();
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::StopLoading()
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->StopLoading();
+  auto cb = []( void* data )
+  {
+    TO_CONTAINER( data )->StopLoading();
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::GoBack()
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->GoBack();
+  auto cb = []( void* data )
+  {
+    TO_CONTAINER( data )->GoBack();
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::GoForward()
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->GoForward();
+  auto cb = []( void* data )
+  {
+    TO_CONTAINER( data )->GoForward();
+  };
+  SendAsyncHandle( cb );
 }
 
 bool TizenWebEngineLite::CanGoBack()
@@ -555,32 +672,52 @@ bool TizenWebEngineLite::CanGoForward()
 void TizenWebEngineLite::EvaluateJavaScript( const std::string& script )
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->EvaluateJavaScript( script );
+  auto cb = [script]( void* data ) {
+      TO_CONTAINER( data )->EvaluateJavaScript( script );
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::AddJavaScriptInterface( const std::string& exposedObjectName, const std::string& jsFunctionName, std::function< std::string(const std::string&) > callback )
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->AddJavaScriptInterface( exposedObjectName, jsFunctionName, callback );
+  auto cb = [exposedObjectName, jsFunctionName, callback]( void* data )
+  {
+    TO_CONTAINER( data )->AddJavaScriptInterface( exposedObjectName, jsFunctionName, callback );
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::RemoveJavascriptInterface( const std::string& exposedObjectName, const std::string& jsFunctionName )
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->RemoveJavascriptInterface( exposedObjectName, jsFunctionName );
+  auto cb = [exposedObjectName, jsFunctionName]( void* data )
+  {
+    TO_CONTAINER( data )->RemoveJavascriptInterface( exposedObjectName, jsFunctionName );
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::ClearHistory()
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->ClearHistory();
-  mCanGoBack = mWebContainer->CanGoBack();
+  auto cb = []( void* data )
+  {
+    TizenWebEngineLite* engine = static_cast< TizenWebEngineLite* >( data );
+    TO_CONTAINER( data )->ClearHistory();
+    engine->mCanGoBack = TO_CONTAINER( data )->CanGoBack();
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::ClearCache()
 {
   DALI_ASSERT_ALWAYS( mWebContainer );
-  mWebContainer->ClearCache();
+  auto cb = []( void* data )
+  {
+    TO_CONTAINER( data )->ClearCache();
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::SetSize( int width, int height )
@@ -589,13 +726,14 @@ void TizenWebEngineLite::SetSize( int width, int height )
 
   if( mOutputWidth != ( size_t )width || mOutputHeight != ( size_t )height )
   {
+    Locker l( gMutex );
          mOutputWidth = width;
          mOutputHeight = height;
          mOutputStride = width * sizeof(uint32_t);
 
 #ifdef STARFISH_DALI_TBMSURFACE
          tbm_surface_h prevTbmSurface = mTbmSurface;
-         mTbmSurface = tbm_surface_create( width, height, TBM_FORMAT_ARGB8888 );
+         mTbmSurface = tbm_surface_create( width, height, TBM_FORMAT_ABGR8888 );
          Dali::Any source( mTbmSurface );
          mNativeImageSourcePtr->SetSource( source );
          if( prevTbmSurface != NULL && tbm_surface_destroy( prevTbmSurface ) != TBM_SURFACE_ERROR_NONE )
@@ -604,27 +742,38 @@ void TizenWebEngineLite::SetSize( int width, int height )
          }
 #endif
 
-    auto oldOutputBuffer = mOutputBuffer;
-    mOutputBuffer = ( uint8_t* )malloc( mOutputWidth * mOutputHeight * sizeof( uint32_t ) );
-    mOutputStride = mOutputWidth * sizeof( uint32_t );
-         mWebContainer->UpdateBuffer( mOutputBuffer, mOutputWidth,
-               mOutputHeight, mOutputStride );
+         auto cb = []( void* data )
+    {
+           TizenWebEngineLite* engine = static_cast< TizenWebEngineLite* >( data );
 
-    if (oldOutputBuffer) {
-             free(oldOutputBuffer);
-         }
+           Locker l( gMutex );
+           if (engine->mOutputBuffer) {
+             free(engine->mOutputBuffer);
+             engine->mOutputBuffer = NULL;
+           }
+
+                 engine->mOutputBuffer = ( uint8_t* )malloc( engine->mOutputWidth * engine->mOutputHeight * sizeof( uint32_t ) );
+                 engine->mOutputStride = engine->mOutputWidth * sizeof( uint32_t );
+                 engine->mWebContainer->UpdateBuffer( engine->mOutputBuffer, engine->mOutputWidth,
+                     engine->mOutputHeight, engine->mOutputStride );
+         };
+         SendAsyncHandle( cb );
   }
 }
 
 void TizenWebEngineLite::DispatchMouseDownEvent( float x, float y )
 {
-  DALI_ASSERT_ALWAYS( mWebContainer );
-  if (!mIsRunning)
-  {
-    return;
-  }
+       DALI_ASSERT_ALWAYS( mWebContainer );
+       if (!mIsRunning)
+       {
+         return;
+       }
 
-  mWebContainer->DispatchMouseDownEvent( LWE::MouseButtonValue::LeftButton, LWE::MouseButtonsValue::LeftButtonDown, x, y );
+       auto cb = [x, y]( void* data )
+  {
+         TO_CONTAINER( data )->DispatchMouseDownEvent( LWE::MouseButtonValue::LeftButton, LWE::MouseButtonsValue::LeftButtonDown, x, y );
+  };
+       SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::DispatchMouseUpEvent( float x, float y )
@@ -635,22 +784,30 @@ void TizenWebEngineLite::DispatchMouseUpEvent( float x, float y )
     return;
   }
 
-  mWebContainer->DispatchMouseUpEvent( LWE::MouseButtonValue::NoButton, LWE::MouseButtonsValue::NoButtonDown, x, y );
+  auto cb = [x, y]( void* data )
+  {
+    TO_CONTAINER( data )->DispatchMouseUpEvent( LWE::MouseButtonValue::NoButton, LWE::MouseButtonsValue::NoButtonDown, x, y );
+  };
+  SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::DispatchMouseMoveEvent( float x, float y, bool isLButtonPressed, bool isRButtonPressed )
 {
-  DALI_ASSERT_ALWAYS( mWebContainer );
-  if (!mIsRunning)
-  {
-    return;
-  }
+       DALI_ASSERT_ALWAYS( mWebContainer );
+       if (!mIsRunning)
+       {
+         return;
+       }
 
-  mWebContainer->DispatchMouseMoveEvent(
-    isLButtonPressed ? LWE::MouseButtonValue::LeftButton
-    : LWE::MouseButtonValue::NoButton,
-    isLButtonPressed ? LWE::MouseButtonsValue::LeftButtonDown
-    : LWE::MouseButtonsValue::NoButtonDown, x, y );
+       auto cb = [x, y, isLButtonPressed]( void* data )
+  {
+         TO_CONTAINER( data )->DispatchMouseMoveEvent(
+             isLButtonPressed ? LWE::MouseButtonValue::LeftButton
+                 : LWE::MouseButtonValue::NoButton,
+             isLButtonPressed ? LWE::MouseButtonsValue::LeftButtonDown
+                 : LWE::MouseButtonsValue::NoButtonDown, x, y );
+  };
+       SendAsyncHandle( cb );
 }
 
 bool TizenWebEngineLite::SendTouchEvent( const TouchData& touch )
@@ -683,35 +840,47 @@ bool TizenWebEngineLite::SendTouchEvent( const TouchData& touch )
 
 void TizenWebEngineLite::DispatchKeyDownEvent( LWE::KeyValue keyCode )
 {
-  DALI_ASSERT_ALWAYS( mWebContainer );
-  if (!mIsRunning)
-  {
-    return;
-  }
+       DALI_ASSERT_ALWAYS( mWebContainer );
+       if (!mIsRunning)
+       {
+         return;
+       }
 
-  mWebContainer->DispatchKeyDownEvent( keyCode );
+       auto cb = [keyCode]( void* data )
+  {
+         TO_CONTAINER( data )->DispatchKeyDownEvent( keyCode );
+  };
+       SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::DispatchKeyPressEvent( LWE::KeyValue keyCode )
 {
-  DALI_ASSERT_ALWAYS( mWebContainer );
-  if (!mIsRunning)
-  {
-    return;
-  }
+       DALI_ASSERT_ALWAYS( mWebContainer );
+       if (!mIsRunning)
+       {
+         return;
+       }
 
-  mWebContainer->DispatchKeyPressEvent( keyCode );
+       auto cb = [keyCode]( void* data )
+  {
+         TO_CONTAINER( data )->DispatchKeyPressEvent( keyCode );
+  };
+       SendAsyncHandle( cb );
 }
 
 void TizenWebEngineLite::DispatchKeyUpEvent( LWE::KeyValue keyCode )
 {
-  DALI_ASSERT_ALWAYS( mWebContainer );
-  if (!mIsRunning)
-  {
-    return;
-  }
+       DALI_ASSERT_ALWAYS( mWebContainer );
+       if (!mIsRunning)
+       {
+         return;
+       }
 
-  mWebContainer->DispatchKeyUpEvent(keyCode);
+       auto cb = [keyCode]( void* data )
+  {
+         TO_CONTAINER( data )->DispatchKeyUpEvent(keyCode);
+  };
+       SendAsyncHandle( cb );
 }
 
 bool TizenWebEngineLite::SendKeyEvent( const Dali::KeyEvent& event )
@@ -738,5 +907,69 @@ bool TizenWebEngineLite::SendKeyEvent( const Dali::KeyEvent& event )
   return false;
 }
 
+void TizenWebEngineLite::CallEmptyAsyncHandle()
+{
+       DALI_ASSERT_ALWAYS( mWebContainer );
+       auto cb = []( void* data ) {
+  };
+       SendAsyncHandle( cb );
+}
+
+void TizenWebEngineLite::StopLoop()
+{
+  gDaliNumber = -1;
+  CallEmptyAsyncHandle();
+}
+
+void TizenWebEngineLite::SendAsyncHandle(std::function<void(void*)> cb)
+{
+  UVAsyncHandleData* handle = new UVAsyncHandleData();
+  handle->cb = cb;
+  handle->data = this;
+
+  {
+    Locker l( gMutex );
+    mAsyncHandlePool.push_back( ( size_t )handle );
+  }
+
+  gLauncherHandle.data = this;
+  uv_async_send(&gLauncherHandle);
+}
+
+void* TizenWebEngineLite::StartMainThread( void* data )
+{
+  uv_async_init( uv_default_loop(), &gLauncherHandle, []( uv_async_t* handle )
+  {
+    Dali::Plugin::TizenWebEngineLite* engine = static_cast< Dali::Plugin::TizenWebEngineLite* >(handle->data);
+    while ( !engine->mAsyncHandlePool.empty() )
+    {
+      UVAsyncHandleData* handleData = NULL;
+      {
+        Locker l( gMutex );
+        handleData = ( UVAsyncHandleData* )*engine->mAsyncHandlePool.begin();
+        engine->mAsyncHandlePool.erase( engine->mAsyncHandlePool.begin() );
+      }
+
+      if ( handleData )
+      {
+        handleData->cb( handleData->data );
+        delete handleData;
+      }
+    }
+  });
+
+  gIsAliveMainLoop = true;
+  pthread_mutex_unlock( &gMutex );
+  while ( true )
+  {
+    uv_run( uv_default_loop(), UV_RUN_ONCE );
+    if ( gDaliNumber < 0 )
+    {
+      break;
+    }
+  }
+  return NULL;
+}
+
 } // namespace Plugin
 } // namespace Dali
index 44143a3..766d8fe 100644 (file)
@@ -181,7 +181,11 @@ private:
 
   bool UpdateBuffer();
 
+  void StartMainThreadIfNeeds();
+  void CreateInstance();
   void DestroyInstance();
+  void CallEmptyAsyncHandle();
+  void StopLoop();
 
   void DispatchMouseDownEvent(float x, float y);
   void DispatchMouseUpEvent(float x, float y);
@@ -190,6 +194,10 @@ private:
   void DispatchKeyPressEvent(LWE::KeyValue keyCode);
   void DispatchKeyUpEvent(LWE::KeyValue keyCode);
 
+  void SendAsyncHandle(std::function<void(void*)> cb);
+  static void* StartMainThread(void* data);
+
+  pthread_t mThreadHandle;
   bool mIsMouseLbuttonDown;
   Dali::Timer mTimer;
 
@@ -199,10 +207,10 @@ private:
   size_t mOutputStride;
   uint8_t* mOutputBuffer;
   bool mCanGoBack, mCanGoForward;
-  bool mIsRunning, mIsNeedsUpdate;
-  pthread_mutex_t mOutputBufferMutex;
+  bool mIsRunning;
 
   LWE::WebContainer* mWebContainer;
+  std::list<size_t> mAsyncHandlePool;
 
 #ifdef STARFISH_DALI_TBMSURFACE
   tbm_surface_h mTbmSurface;
index b1ffaa9..ed8f500 100644 (file)
@@ -75,6 +75,7 @@ VideoPlayer plugin to play a video file for Dali
 Summary:    Plugin to support WebView for Dali
 Group:      System/Libraries
 BuildRequires: pkgconfig(libtbm)
+BuildRequires: pkgconfig(libtuv)
 BuildRequires: pkgconfig(lightweight-web-engine)
 
 %description web-engine-lite-plugin
@@ -157,9 +158,6 @@ exit 0
 exit 0
 
 %post web-engine-lite-plugin
-pushd %{_libdir}
-ln -sf libdali-web-engine-lite-plugin.so libdali-web-engine-plugin.so
-popd
 /sbin/ldconfig
 exit 0