[Tizen] Add an API for 'create,window' event. 86/285286/1
authorhuayong.xu <huayong.xu@samsung.com>
Thu, 8 Dec 2022 11:50:15 +0000 (19:50 +0800)
committerhuayong.xu <huayong.xu@samsung.com>
Thu, 8 Dec 2022 11:50:15 +0000 (19:50 +0800)
Change-Id: I46803f164e53697fbffa484a30d282fda099259f

automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-web-engine.cpp
automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp
dali-toolkit/devel-api/controls/web-view/web-view.cpp
dali-toolkit/devel-api/controls/web-view/web-view.h
dali-toolkit/internal/controls/web-view/web-view-impl.cpp
dali-toolkit/internal/controls/web-view/web-view-impl.h

index 3f626dc..f3e4656 100755 (executable)
@@ -44,6 +44,9 @@ class WebEngine;
 
 namespace
 {
+
+// Generally only one WebEngine instance exists.
+// If > 1, a new web engine has been created by NewWindowCreated callback.
 static WebEngine* gInstance = nullptr;
 static int gInstanceCount = 0;
 
@@ -382,7 +385,10 @@ public:
     , mContentSize( 500, 500 )
   {
     gInstanceCount++;
-    gInstance = this;
+    if (gInstanceCount == 1) // only first web engine need be saved.
+    {
+      gInstance = this;
+    }
 
     mockWebEngineSettings = new MockWebEngineSettings();
     mockWebEngineContext = new MockWebEngineContext();
@@ -393,9 +399,9 @@ public:
   virtual ~WebEngine()
   {
     gInstanceCount--;
-    if( !gInstanceCount )
+    if(!gInstanceCount)
     {
-      gInstance = NULL;
+      gInstance = nullptr;
     }
 
     delete mockWebEngineSettings;
@@ -424,6 +430,11 @@ public:
     return *mockWebEngineBackForwardList;
   }
 
+  Dali::WebEnginePlugin* GetPlugin() const
+  {
+    return nullptr;
+  }
+
   void LoadUrl( const std::string& url )
   {
     mUrl = url;
@@ -576,6 +587,11 @@ public:
     mNavigationPolicyDecisionCallback = callback;
   }
 
+  void RegisterNewWindowCreatedCallback(Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback callback)
+  {
+    mNewWindowCreatedCallback = callback;
+  }
+
   void GetPlainTextAsynchronously(Dali::WebEnginePlugin::PlainTextReceivedCallback callback)
   {
     if (callback)
@@ -596,6 +612,7 @@ public:
   Dali::WebEnginePlugin::WebEngineScrollEdgeReachedCallback       mScrollEdgeReachedCallback;
   Dali::WebEnginePlugin::WebEngineUrlChangedCallback              mUrlChangedCallback;
   Dali::WebEnginePlugin::WebEngineNavigationPolicyDecidedCallback mNavigationPolicyDecisionCallback;
+  Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback        mNewWindowCreatedCallback;
 
   std::vector<Dali::WebEnginePlugin::JavaScriptMessageHandlerCallback> mResultCallbacks;
   bool                                                                 mEvaluating;
@@ -682,6 +699,11 @@ bool OnLoadUrl()
       std::unique_ptr<Dali::WebEnginePolicyDecision> policyDecision(new MockWebEnginePolicyDecision());
       gInstance->mNavigationPolicyDecisionCallback(std::move(policyDecision));
     }
+    if (gInstance->mNewWindowCreatedCallback)
+    {
+      Dali::WebEnginePlugin* plugin = 0;
+      gInstance->mNewWindowCreatedCallback(plugin);
+    }
   }
   return false;
 }
@@ -977,6 +999,11 @@ void WebEngine::RegisterNavigationPolicyDecidedCallback(Dali::WebEnginePlugin::W
   Internal::Adaptor::GetImplementation(*this).RegisterNavigationPolicyDecidedCallback(callback);
 }
 
+void WebEngine::RegisterNewWindowCreatedCallback(Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback callback)
+{
+  Internal::Adaptor::GetImplementation(*this).RegisterNewWindowCreatedCallback(callback);
+}
+
 void WebEngine::GetPlainTextAsynchronously(Dali::WebEnginePlugin::PlainTextReceivedCallback callback)
 {
   Internal::Adaptor::GetImplementation(*this).GetPlainTextAsynchronously(callback);
index 6477ccd..7d097fc 100755 (executable)
@@ -50,6 +50,7 @@ static int gPageLoadFinishedCallbackCalled = 0;
 static int gScrollEdgeReachedCallbackCalled = 0;
 static int gUrlChangedCallbackCalled = 0;
 static int gNavigationPolicyDecidedCallbackCalled = 0;
+static int gNewWindowCreatedCallbackCalled = 0;
 static int gEvaluateJavaScriptCallbackCalled = 0;
 static bool gTouched = false;
 static int gPlainTextReceivedCallbackCalled = 0;
@@ -83,7 +84,7 @@ static void OnScrollEdgeReached( Dali::WebEnginePlugin::ScrollEdge edge )
   gScrollEdgeReachedCallbackCalled++;
 }
 
-static void OnUrlChanged( WebView view, const std::string& url )
+static void OnUrlChanged(const std::string& url)
 {
   gUrlChangedCallbackCalled++;
 }
@@ -93,6 +94,13 @@ static void OnNavigationPolicyDecided(std::unique_ptr<Dali::WebEnginePolicyDecis
   gNavigationPolicyDecidedCallbackCalled++;
 }
 
+static void OnNewWindowCreated(Dali::WebEnginePlugin*& outPlugin)
+{
+  gNewWindowCreatedCallbackCalled++;
+  WebView newView = WebView::New();
+  outPlugin = newView.GetPlugin();
+}
+
 static bool OnPlainTextReceived(const std::string& plainText)
 {
   gPlainTextReceivedCallbackCalled++;
@@ -826,6 +834,24 @@ int UtcDaliWebViewNavigationPolicyDecisionRequest(void)
   END_TEST;
 }
 
+int UtcDaliWebViewNewWindowCreated(void)
+{
+  ToolkitTestApplication application;
+
+  WebView view = WebView::New();
+  DALI_TEST_CHECK(view);
+
+  // load url.
+  view.RegisterNewWindowCreatedCallback(&OnNewWindowCreated);
+  DALI_TEST_EQUALS(gNewWindowCreatedCallbackCalled, 0, TEST_LOCATION);
+
+  view.LoadUrl(TEST_URL1);
+  Test::EmitGlobalTimerSignal();
+  DALI_TEST_EQUALS(gNewWindowCreatedCallbackCalled, 1, TEST_LOCATION);
+
+  END_TEST;
+}
+
 int UtcDaliWebViewGetPlainText(void)
 {
   ToolkitTestApplication application;
index fa86237..c7ca563 100755 (executable)
@@ -89,6 +89,11 @@ Dali::Toolkit::WebBackForwardList* WebView::GetBackForwardList() const
   return Dali::Toolkit::GetImpl( *this ).GetBackForwardList();
 }
 
+Dali::WebEnginePlugin* WebView::GetPlugin() const
+{
+  return Dali::Toolkit::GetImpl(*this).GetPlugin();
+}
+
 Dali::Toolkit::ImageView WebView::GetFavicon() const
 {
   return Dali::Toolkit::GetImpl( *this ).GetFavicon();
@@ -209,6 +214,11 @@ void WebView::RegisterNavigationPolicyDecidedCallback(Dali::WebEnginePlugin::Web
   Dali::Toolkit::GetImpl(*this).RegisterNavigationPolicyDecidedCallback(callback);
 }
 
+void WebView::RegisterNewWindowCreatedCallback(Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback callback)
+{
+  Dali::Toolkit::GetImpl(*this).RegisterNewWindowCreatedCallback(callback);
+}
+
 void WebView::GetPlainTextAsynchronously(Dali::WebEnginePlugin::PlainTextReceivedCallback callback)
 {
   Dali::Toolkit::GetImpl(*this).GetPlainTextAsynchronously(callback);
index 8c7b1c8..c65e412 100755 (executable)
@@ -227,6 +227,11 @@ public:
   Dali::Toolkit::WebBackForwardList* GetBackForwardList() const;
 
   /**
+   * @brief Gets web engine plugin.
+   */
+  Dali::WebEnginePlugin* GetPlugin() const;
+
+  /**
    * @brief Get favicon of web page.
    *
    * @return Handle to a favicon
@@ -399,6 +404,13 @@ public:
   void RegisterNavigationPolicyDecidedCallback(Dali::WebEnginePlugin::WebEngineNavigationPolicyDecidedCallback callback);
 
   /**
+   * @brief Callback to be called when a new window would be created.
+   *
+   * @param[in] callback
+   */
+  void RegisterNewWindowCreatedCallback(Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback callback);
+
+  /**
    * @brief Get a plain text of current web page asynchronously.
    *
    * @param[in] callback The callback function called asynchronously.
index f090d6f..4f3d72b 100755 (executable)
@@ -129,7 +129,6 @@ Dali::Toolkit::Visual::Base CreateNativeImageVisual( NativeImageInterfacePtr nat
 
 WebView::WebView( const std::string& locale, const std::string& timezoneId )
 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_DEFAULT | DISABLE_STYLE_CHANGE_SIGNALS ) ),
-  mUrl(),
   mVisual(),
   mWebViewSize( Stage::GetCurrent().GetSize() ),
   mWebEngine(),
@@ -147,7 +146,6 @@ WebView::WebView( const std::string& locale, const std::string& timezoneId )
 
 WebView::WebView( int argc, char** argv )
 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_DEFAULT | DISABLE_STYLE_CHANGE_SIGNALS ) ),
-  mUrl(),
   mVisual(),
   mWebViewSize( Stage::GetCurrent().GetSize() ),
   mWebEngine(),
@@ -246,6 +244,11 @@ Dali::Toolkit::WebBackForwardList* WebView::GetBackForwardList() const
   return mWebBackForwardList.get();
 }
 
+Dali::WebEnginePlugin* WebView::GetPlugin() const
+{
+  return mWebEngine ? mWebEngine.GetPlugin() : nullptr;
+}
+
 Dali::Toolkit::ImageView WebView::GetFavicon() const
 {
   Dali::Toolkit::ImageView faviconView;
@@ -264,7 +267,6 @@ Dali::Toolkit::ImageView WebView::GetFavicon() const
 
 void WebView::LoadUrl( const std::string& url )
 {
-  mUrl = url;
   if( mWebEngine )
   {
     mVisual = CreateNativeImageVisual( mWebEngine.GetNativeImageSource() );
@@ -509,6 +511,14 @@ void WebView::RegisterNavigationPolicyDecidedCallback(Dali::WebEnginePlugin::Web
   }
 }
 
+void WebView::RegisterNewWindowCreatedCallback(Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback callback)
+{
+  if(mWebEngine)
+  {
+    mWebEngine.RegisterNewWindowCreatedCallback(callback);
+  }
+}
+
 void WebView::GetPlainTextAsynchronously(Dali::WebEnginePlugin::PlainTextReceivedCallback callback)
 {
   if(mWebEngine)
@@ -598,7 +608,7 @@ Property::Value WebView::GetProperty( BaseObject* object, Property::Index proper
     {
       case Toolkit::WebView::Property::URL:
       {
-        value = impl.mUrl;
+        value = impl.GetUrl();
         break;
       }
       case Toolkit::WebView::Property::USER_AGENT:
@@ -719,12 +729,17 @@ void WebView::GetContentSize( int& width, int& height ) const
   }
 }
 
+std::string WebView::GetUrl() const
+{
+  return mWebEngine ? mWebEngine.GetUrl() : kEmptyString;
+}
+
 std::string WebView::GetTitle() const
 {
   return mWebEngine ?  mWebEngine.GetTitle() : kEmptyString;
 }
 
-const std::string& WebView::GetUserAgent() const
+std::string WebView::GetUserAgent() const
 {
   return mWebEngine ? mWebEngine.GetUserAgent() : kEmptyString;
 }
index 2eeb092..b5aa5d9 100755 (executable)
@@ -97,6 +97,11 @@ public:
   static Toolkit::WebView New( int argc, char** argv );
 
   /**
+   * @copydoc Dali::Toolkit::WebView::GetPlugin()
+   */
+  Dali::WebEnginePlugin* GetPlugin() const;
+
+  /**
    * @brief Get favicon of web page.
    *
    * @return Handle to a favicon
@@ -214,6 +219,11 @@ public:
   void RegisterNavigationPolicyDecidedCallback(Dali::WebEnginePlugin::WebEngineNavigationPolicyDecidedCallback callback);
 
   /**
+   * @copydoc Dali::Toolkit::WebView::RegisterNewWindowCreatedCallback()
+   */
+  void RegisterNewWindowCreatedCallback(Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback callback);
+
+  /**
    * @copydoc Dali::Toolkit::WebView::GetPlainTextAsynchronously()
    */
   void GetPlainTextAsynchronously(Dali::WebEnginePlugin::PlainTextReceivedCallback callback);
@@ -314,6 +324,12 @@ private:
   void GetContentSize( int& width, int& height ) const;
 
   /**
+   * @brief Get current url.
+   * @return The string value of current url
+   */
+  std::string GetUrl() const;
+
+  /**
    * @brief Returns the title of the Web.
    *
    * @return The title of web page
@@ -324,7 +340,7 @@ private:
    * @brief Get user agent string.
    * @return The string value of user agent
    */
-  const std::string& GetUserAgent() const;
+  std::string GetUserAgent() const;
 
   /**
    * @brief Set user agent string.
@@ -352,7 +368,6 @@ private:
 
 private:
 
-  std::string                                        mUrl;
   Dali::Toolkit::Visual::Base                        mVisual;
   Dali::Size                                         mWebViewSize;
   Dali::WebEngine                                    mWebEngine;