Merge "Add APIs of webview back forward list" into devel/master
authorJIYUN YANG <ji.yang@samsung.com>
Fri, 9 Apr 2021 05:59:01 +0000 (05:59 +0000)
committerGerrit Code Review <gerrit@review>
Fri, 9 Apr 2021 05:59:01 +0000 (05:59 +0000)
1  2 
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/file.list

@@@ -23,8 -23,6 +23,8 @@@
  #include <dali/devel-api/adaptor-framework/web-engine-certificate.h>
  #include <dali/devel-api/adaptor-framework/web-engine-console-message.h>
  #include <dali/devel-api/adaptor-framework/web-engine-context.h>
 +#include <dali/devel-api/adaptor-framework/web-engine-context-menu.h>
 +#include <dali/devel-api/adaptor-framework/web-engine-context-menu-item.h>
  #include <dali/devel-api/adaptor-framework/web-engine-cookie-manager.h>
  #include <dali/devel-api/adaptor-framework/web-engine-form-repost-decision.h>
  #include <dali/devel-api/adaptor-framework/web-engine-frame.h>
@@@ -32,7 -30,6 +32,7 @@@
  #include <dali/devel-api/adaptor-framework/web-engine-load-error.h>
  #include <dali/devel-api/adaptor-framework/web-engine-policy-decision.h>
  #include <dali/devel-api/adaptor-framework/web-engine-request-interceptor.h>
 +#include <dali/devel-api/adaptor-framework/web-engine-security-origin.h>
  #include <dali/devel-api/adaptor-framework/web-engine-settings.h>
  #include <dali/public-api/adaptor-framework/native-image-source.h>
  #include <dali/public-api/images/pixel-data.h>
@@@ -52,16 -49,14 +52,16 @@@ namespace Adapto
  {
  
  class WebEngine;
 +class MockWebEngineContext;
  
  namespace
  {
  
  // Generally only one WebEngine instance exists.
  // If > 1, a new web engine has been created by CreateWindowSignal.
 -static WebEngine* gInstance = 0;
 +static WebEngine* gInstance = nullptr;
  static int gInstanceCount = 0;
 +static MockWebEngineContext* gWebEngineContextInstance = nullptr;
  
  bool OnGoBack();
  bool OnGoForward();
@@@ -75,11 -70,6 +75,11 @@@ bool OnScreenshotCaptured()
  bool OnVideoPlaying();
  bool OnGeolocationPermission();
  bool OnClearHistory();
 +bool OnSecurityOriginAcquired();
 +bool OnStorageUsageAcquired();
 +bool OnFormPasswordAcquired();
 +bool OnDownloadStarted();
 +bool OnMimeOverridden();
  
  static void ConnectToGlobalSignal( bool ( *func )() )
  {
@@@ -124,52 -114,12 +124,52 @@@ public
    {
    }
  
 -  void DeleteWebDatabase() override
 +  void DeleteAllWebDatabase() override
    {
    }
  
 -  void DeleteWebStorage() override
 +  bool GetWebDatabaseOrigins(Dali::WebEngineContext::WebEngineSecurityOriginAcquiredCallback callback)
    {
 +    if (callback)
 +    {
 +      ConnectToGlobalSignal(&OnSecurityOriginAcquired);
 +      mSecurityOriginAcquiredCallback = callback;
 +    }
 +    return true;
 +  }
 +
 +  bool DeleteWebDatabase(Dali::WebEngineSecurityOrigin& origin)
 +  {
 +    return true;
 +  }
 +
 +  bool GetWebStorageOrigins(Dali::WebEngineContext::WebEngineSecurityOriginAcquiredCallback callback)
 +  {
 +    if (callback)
 +    {
 +      ConnectToGlobalSignal(&OnSecurityOriginAcquired);
 +      mSecurityOriginAcquiredCallback = callback;
 +    }
 +    return true;
 +  }
 +
 +  bool GetWebStorageUsageForOrigin(Dali::WebEngineSecurityOrigin& origin, Dali::WebEngineContext::WebEngineStorageUsageAcquiredCallback callback) 
 +  {
 +    if (callback)
 +    {
 +      ConnectToGlobalSignal(&OnStorageUsageAcquired);
 +      mStorageUsageAcquiredCallback = callback;
 +    }
 +    return true;
 +  }
 +
 +  void DeleteAllWebStorage() override
 +  {
 +  }
 +
 +  bool DeleteWebStorageOrigin(Dali::WebEngineSecurityOrigin& origin)
 +  {
 +    return true;
    }
  
    void DeleteLocalFileSystem() override
    {
    }
  
 +  bool DeleteApplicationCache(Dali::WebEngineSecurityOrigin& origin)
 +  {
 +    return true;
 +  }
 +
 +  void GetFormPasswordList(Dali::WebEngineContext::WebEngineFormPasswordAcquiredCallback callback)
 +  {
 +    if (callback)
 +    {
 +      ConnectToGlobalSignal(&OnFormPasswordAcquired);
 +      mFormPasswordAcquiredCallback = callback;
 +    }
 +  }
 +
 +  void RegisterDownloadStartedCallback(Dali::WebEngineContext::WebEngineDownloadStartedCallback callback)
 +  {
 +    if (callback)
 +    {
 +      ConnectToGlobalSignal(&OnDownloadStarted);
 +      mDownloadStartedCallback = callback;
 +    }
 +  }
 +
 +  void RegisterMimeOverriddenCallback(Dali::WebEngineContext::WebEngineMimeOverriddenCallback callback)
 +  {
 +    if (callback)
 +    {
 +      ConnectToGlobalSignal(&OnMimeOverridden);
 +      mMimeOverriddenCallback = callback;
 +    }
 +  }
 +
 +public:
 +  Dali::WebEngineContext::WebEngineSecurityOriginAcquiredCallback mSecurityOriginAcquiredCallback;
 +  Dali::WebEngineContext::WebEngineStorageUsageAcquiredCallback mStorageUsageAcquiredCallback;
 +  Dali::WebEngineContext::WebEngineFormPasswordAcquiredCallback mFormPasswordAcquiredCallback;
 +  Dali::WebEngineContext::WebEngineDownloadStartedCallback mDownloadStartedCallback;
 +  Dali::WebEngineContext::WebEngineMimeOverriddenCallback mMimeOverriddenCallback;
 +
  private:
    Dali::WebEngineContext::CacheModel mockModel;
  };
  
 +class MockWebEngineSecurityOrigin : public Dali::WebEngineSecurityOrigin
 +{
 +public:
 +  MockWebEngineSecurityOrigin()
 +    : mockUrl("https://test.html")
 +    , mockPotocol("https")
 +  {
 +  }
 +
 +  std::string GetHost() const
 +  {
 +    return mockUrl;
 +  }
 +
 +  std::string GetProtocol() const
 +  {
 +    return mockPotocol;
 +  }
 +
 +private:
 +  std::string mockUrl;
 +  std::string mockPotocol;
 +};
 +
  class MockWebEngineCookieManager : public Dali::WebEngineCookieManager
  {
  public:
@@@ -316,19 -203,31 +316,31 @@@ class MockWebEngineBackForwardList : pu
  {
  public:
    MockWebEngineBackForwardList()
-     : mockItem(),
-       pMockItem( &mockItem )
    {
    }
  
-   Dali::WebEngineBackForwardListItem& GetCurrentItem() const override
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> GetCurrentItem() const override
    {
-     return *pMockItem;
+     std::unique_ptr<Dali::WebEngineBackForwardListItem> ret(new MockWebEngineBackForwardListItem());
+     return ret;
    }
  
-   Dali::WebEngineBackForwardListItem& GetItemAtIndex( uint32_t index ) const override
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> GetPreviousItem() const override
    {
-     return *pMockItem;
+     std::unique_ptr<Dali::WebEngineBackForwardListItem> ret(new MockWebEngineBackForwardListItem());
+     return ret;
+   }
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> GetNextItem() const override
+   {
+     std::unique_ptr<Dali::WebEngineBackForwardListItem> ret(new MockWebEngineBackForwardListItem());
+     return ret;
+   }
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> GetItemAtIndex( uint32_t index ) const override
+   {
+     std::unique_ptr<Dali::WebEngineBackForwardListItem> ret(new MockWebEngineBackForwardListItem());
+     return ret;
    }
  
    uint32_t GetItemCount() const override
      return 1;
    }
  
- private:
-   MockWebEngineBackForwardListItem mockItem;
-   WebEngineBackForwardListItem*    pMockItem;
+   std::vector<std::unique_ptr<Dali::WebEngineBackForwardListItem>> GetBackwardItems(int limit) override
+   {
+     std::vector<std::unique_ptr<Dali::WebEngineBackForwardListItem>> ret;
+     std::unique_ptr<Dali::WebEngineBackForwardListItem> item(new MockWebEngineBackForwardListItem());
+     ret.push_back(std::move(item));
+     return ret;
+   }
+   std::vector<std::unique_ptr<Dali::WebEngineBackForwardListItem>> GetForwardItems(int limit) override
+   {
+     std::vector<std::unique_ptr<Dali::WebEngineBackForwardListItem>> ret;
+     std::unique_ptr<Dali::WebEngineBackForwardListItem> item(new MockWebEngineBackForwardListItem());
+     ret.push_back(std::move(item));
+     return ret;
+   }
  };
  
  class MockWebEngineCertificate : public Dali::WebEngineCertificate
  {
  public:
@@@ -575,107 -487,6 +600,107 @@@ private
    std::string mockUrl;
  };
  
 +class MockWebEngineContextMenuItem : public Dali::WebEngineContextMenuItem
 +{
 +public:
 +  MockWebEngineContextMenuItem()
 +  {
 +  }
 +
 +  ItemTag GetTag() const override
 +  {
 +    return ItemTag::NO_ACTION;
 +  }
 +
 +  ItemType GetType() const override
 +  {
 +    return ItemType::ACTION;
 +  }
 +
 +  bool IsEnabled() const override
 +  {
 +    return true;
 +  }
 +
 +  std::string GetLinkUrl() const override
 +  {
 +    return "http://test.html";
 +  }
 +
 +  std::string GetImageUrl() const override
 +  {
 +    return "http://test.jpg";
 +  }
 +
 +  std::string GetTitle() const override
 +  {
 +    return "title";
 +  }
 +
 +  std::unique_ptr<Dali::WebEngineContextMenu> GetParentMenu() const override
 +  {
 +    std::unique_ptr<Dali::WebEngineContextMenu> result;
 +    return result;
 +  }
 +};
 +
 +class MockWebEngineContextMenu : public Dali::WebEngineContextMenu
 +{
 +public:
 +  MockWebEngineContextMenu()
 +  {
 +  }
 +
 +  uint32_t GetItemCount() const override
 +  {
 +    return 1;
 +  }
 +
 +  std::unique_ptr<Dali::WebEngineContextMenuItem> GetItemAt(uint32_t index) const override
 +  {
 +    std::unique_ptr<Dali::WebEngineContextMenuItem> webitem(new MockWebEngineContextMenuItem());
 +    return webitem;
 +  }
 +
 +  std::vector<std::unique_ptr<WebEngineContextMenuItem>> GetItemList() const override
 +  {
 +    std::vector<std::unique_ptr<WebEngineContextMenuItem>> result;
 +    std::unique_ptr<Dali::WebEngineContextMenuItem> webitem(new MockWebEngineContextMenuItem());
 +    result.push_back(std::move(webitem));
 +    return result;
 +  }
 +
 +  Dali::Vector2 GetPosition() const override
 +  {
 +    return Dali::Vector2(100, 100);
 +  }
 +
 +  bool RemoveItem(WebEngineContextMenuItem& item) override
 +  {
 +    return true;
 +  }
 +
 +  bool AppendItemAsAction(WebEngineContextMenuItem::ItemTag tag, const std::string& title, bool enabled) override
 +  {
 +    return true;
 +  }
 +
 +  bool AppendItem(WebEngineContextMenuItem::ItemTag tag, const std::string& title, const std::string& iconFile, bool enabled) override
 +  {
 +    return true;
 +  }
 +
 +  bool SelectItem(WebEngineContextMenuItem& item) override
 +  {
 +    return true;
 +  }
 +
 +  bool Hide() override
 +  {
 +    return true;
 +  }
 +};
 +
  class MockWebEngineSettings : public WebEngineSettings
  {
  public:
@@@ -932,12 -743,7 +957,12 @@@ public
      }
  
      mockWebEngineSettings = new MockWebEngineSettings();
 -    mockWebEngineContext = new MockWebEngineContext();
 +    MockWebEngineContext* engineContext = new MockWebEngineContext();
 +    mockWebEngineContext = engineContext;
 +    if ( gInstanceCount == 1 )
 +    {
 +      gWebEngineContextInstance = engineContext;
 +    }
      mockWebEngineCookieManager = new MockWebEngineCookieManager();
      mockWebEngineBackForwardList = new MockWebEngineBackForwardList();
    }
      if( !gInstanceCount )
      {
        gInstance = 0;
 +      gWebEngineContextInstance = 0;
      }
  
      delete mockWebEngineSettings;
      return mHttpAuthHandlerSignal;
    }
  
 +  Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& ContextMenuCustomizedSignal()
 +  {
 +    return mContextMenuCustomizedSignal;
 +  }
 +
 +  Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& ContextMenuItemSelectedSignal()
 +  {
 +    return mContextMenuItemSelectedSignal;
 +  }
 +
    std::string              mUrl;
    std::vector<std::string> mHistory;
    size_t                   mCurrentPlusOnePos;
    std::string              mUserAgent;
  
 -  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mPageLoadStartedSignal;
 -  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mPageLoadInProgressSignal;
 -  Dali::WebEnginePlugin::WebEnginePageLoadSignalType           mPageLoadFinishedSignal;
 -  Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType      mPageLoadErrorSignal;
 -  Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType  mScrollEdgeReachedSignal;
 -  Dali::WebEnginePlugin::WebEngineUrlChangedSignalType         mUrlChangedSignal;
 -  Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal;
 -  Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType      mFrameRenderedSignal;
 -  Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType mRequestInterceptorSignal;
 -  Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType     mConsoleMessageSignal;
 -  Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType     mPolicyDecisionSignal;
 -  Dali::WebEnginePlugin::WebEngineCertificateSignalType        mCertificateConfirmSignal;
 -  Dali::WebEnginePlugin::WebEngineCertificateSignalType        mSslCertificateChangedSignal;
 -  Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType    mHttpAuthHandlerSignal;
 +  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mPageLoadStartedSignal;
 +  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mPageLoadInProgressSignal;
 +  Dali::WebEnginePlugin::WebEnginePageLoadSignalType                mPageLoadFinishedSignal;
 +  Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType           mPageLoadErrorSignal;
 +  Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType       mScrollEdgeReachedSignal;
 +  Dali::WebEnginePlugin::WebEngineUrlChangedSignalType              mUrlChangedSignal;
 +  Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType      mFormRepostDecisionSignal;
 +  Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType           mFrameRenderedSignal;
 +  Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType      mRequestInterceptorSignal;
 +  Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType          mConsoleMessageSignal;
 +  Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType          mPolicyDecisionSignal;
 +  Dali::WebEnginePlugin::WebEngineCertificateSignalType             mCertificateConfirmSignal;
 +  Dali::WebEnginePlugin::WebEngineCertificateSignalType             mSslCertificateChangedSignal;
 +  Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType         mHttpAuthHandlerSignal;
 +  Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType   mContextMenuCustomizedSignal;
 +  Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType mContextMenuItemSelectedSignal;
  
    bool  mEvaluating;
    float mPageZoomFactor;
@@@ -1393,11 -1186,6 +1418,11 @@@ bool OnLoadUrl(
      gInstance->mSslCertificateChangedSignal.Emit(std::move(sslCertificate));
      std::shared_ptr<Dali::WebEngineHttpAuthHandler> handler(new MockWebEngineHttpAuthHandler());
      gInstance->mHttpAuthHandlerSignal.Emit(std::move(handler));
 +
 +    std::shared_ptr<Dali::WebEngineContextMenu> menu(new MockWebEngineContextMenu());
 +    gInstance->mContextMenuCustomizedSignal.Emit(std::move(menu));
 +    std::shared_ptr<Dali::WebEngineContextMenuItem> item(new MockWebEngineContextMenuItem());
 +    gInstance->mContextMenuItemSelectedSignal.Emit(std::move(item));
    }
    return false;
  }
@@@ -1508,65 -1296,6 +1533,65 @@@ bool OnClearHistory(
    return false;
  }
  
 +bool OnSecurityOriginAcquired()
 +{
 +  DisconnectFromGlobalSignal(&OnSecurityOriginAcquired);
 +  if (gWebEngineContextInstance)
 +  {
 +    std::vector<std::unique_ptr<Dali::WebEngineSecurityOrigin>> securityOriginList;
 +    std::unique_ptr<Dali::WebEngineSecurityOrigin> origin(new MockWebEngineSecurityOrigin());
 +    securityOriginList.push_back(std::move(origin));
 +    gWebEngineContextInstance->mSecurityOriginAcquiredCallback(securityOriginList);
 +  }
 +  return false;
 +}
 +
 +bool OnStorageUsageAcquired()
 +{
 +  DisconnectFromGlobalSignal(&OnStorageUsageAcquired);
 +  if (gWebEngineContextInstance)
 +  {
 +    gWebEngineContextInstance->mStorageUsageAcquiredCallback(0);
 +  }
 +  return false;
 +}
 +
 +bool OnFormPasswordAcquired()
 +{
 +  DisconnectFromGlobalSignal(&OnFormPasswordAcquired);
 +  if (gWebEngineContextInstance)
 +  {
 +    std::vector<std::unique_ptr<Dali::WebEngineContext::PasswordData>> formPasswordList;
 +    std::unique_ptr<Dali::WebEngineContext::PasswordData> data(new Dali::WebEngineContext::PasswordData());
 +    data->url = "http://test.html";
 +    data->useFingerprint = false;
 +    formPasswordList.push_back(std::move(data));
 +    gWebEngineContextInstance->mFormPasswordAcquiredCallback(formPasswordList);
 +  }
 +  return false;
 +}
 +
 +bool OnDownloadStarted()
 +{
 +  DisconnectFromGlobalSignal(&OnDownloadStarted);
 +  if (gWebEngineContextInstance)
 +  {
 +    gWebEngineContextInstance->mDownloadStartedCallback("http://test.html");
 +  }
 +  return false;
 +}
 +
 +bool OnMimeOverridden()
 +{
 +  DisconnectFromGlobalSignal(&OnMimeOverridden);
 +  if (gWebEngineContextInstance)
 +  {
 +    std::string newMime;
 +    gWebEngineContextInstance->mMimeOverriddenCallback("http://test.html", "txt/xml", newMime);
 +  }
 +  return false;
 +}
 +
  } // namespace
  
  inline WebEngine& GetImplementation( Dali::WebEngine& webEngine )
@@@ -2054,15 -1783,5 +2079,15 @@@ Dali::WebEnginePlugin::WebEngineHttpAut
    return Internal::Adaptor::GetImplementation(*this).HttpAuthHandlerSignal();
  }
  
 +Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& WebEngine::ContextMenuCustomizedSignal()
 +{
 +  return Internal::Adaptor::GetImplementation( *this ).ContextMenuCustomizedSignal();
 +}
 +
 +Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& WebEngine::ContextMenuItemSelectedSignal()
 +{
 +  return Internal::Adaptor::GetImplementation( *this ).ContextMenuItemSelectedSignal();
 +}
 +
  } // namespace Dali;
  
  #include <dali.h>
  #include <dali/devel-api/adaptor-framework/web-engine-certificate.h>
  #include <dali/devel-api/adaptor-framework/web-engine-console-message.h>
 +#include <dali/devel-api/adaptor-framework/web-engine-context-menu.h>
 +#include <dali/devel-api/adaptor-framework/web-engine-context-menu-item.h>
  #include <dali/devel-api/adaptor-framework/web-engine-frame.h>
  #include <dali/devel-api/adaptor-framework/web-engine-http-auth-handler.h>
  #include <dali/devel-api/adaptor-framework/web-engine-load-error.h>
  #include <dali/devel-api/adaptor-framework/web-engine-policy-decision.h>
  #include <dali/devel-api/adaptor-framework/web-engine-request-interceptor.h>
 +#include <dali/devel-api/adaptor-framework/web-engine-context.h>
 +#include <dali/devel-api/adaptor-framework/web-engine-security-origin.h>
  #include <dali/integration-api/events/hover-event-integ.h>
  #include <dali/integration-api/events/key-event-integ.h>
  #include <dali/integration-api/events/touch-event-integ.h>
@@@ -41,7 -37,6 +41,6 @@@
  #include <dali-toolkit/public-api/controls/image-view/image-view.h>
  #include <dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h>
  #include <dali-toolkit/devel-api/controls/web-view/web-back-forward-list.h>
- #include <dali-toolkit/devel-api/controls/web-view/web-back-forward-list-item.h>
  #include <dali-toolkit/devel-api/controls/web-view/web-context.h>
  #include <dali-toolkit/devel-api/controls/web-view/web-cookie-manager.h>
  #include <dali-toolkit/devel-api/controls/web-view/web-form-repost-decision.h>
@@@ -89,17 -84,6 +88,17 @@@ static int gSslCertificateChangedCallba
  static std::shared_ptr<Dali::WebEngineCertificate> gSslCertificateInstance = nullptr;
  static int gHttpAuthHandlerCallbackCalled = 0;
  static std::shared_ptr<Dali::WebEngineHttpAuthHandler> gHttpAuthInstance = nullptr;
 +static int gSecurityOriginsAcquiredCallbackCalled = 0;
 +static int gStorageUsageAcquiredCallbackCalled = 0;
 +static int gFormPasswordsAcquiredCallbackCalled = 0;
 +static int gDownloadStartedCallbackCalled = 0;
 +static int gMimeOverriddenCallbackCalled = 0;
 +static std::vector<std::unique_ptr<Dali::WebEngineSecurityOrigin>> gSecurityOriginList;
 +static std::vector<std::unique_ptr<Dali::WebEngineContext::PasswordData>> gPasswordDataList;
 +static int gContextMenuCustomizedCallbackCalled = 0;
 +static std::shared_ptr<Dali::WebEngineContextMenu> gContextMenuInstance = 0;
 +static int gContextMenuItemSelectedCallbackCalled = 0;
 +static std::shared_ptr<Dali::WebEngineContextMenuItem> gContextMenuItemInstance = 0;
  
  struct CallbackFunctor
  {
@@@ -250,48 -234,6 +249,48 @@@ static void OnHttpAuthHandler( WebView 
    gHttpAuthInstance = std::move(hander);
  }
  
 +static void OnSecurityOriginsAcquired(std::vector<std::unique_ptr<Dali::WebEngineSecurityOrigin>>& origins)
 +{
 +  gSecurityOriginsAcquiredCallbackCalled++;
 +  gSecurityOriginList.clear();
 +  gSecurityOriginList.swap(origins);
 +}
 +
 +static void OnStorageUsageAcquired(uint64_t usage)
 +{
 +  gStorageUsageAcquiredCallbackCalled++;
 +}
 +
 +static void OnFormPasswordsAcquired(std::vector<std::unique_ptr<Dali::WebEngineContext::PasswordData>>& passwords)
 +{
 +  gFormPasswordsAcquiredCallbackCalled++;
 +  gPasswordDataList.clear();
 +  gPasswordDataList.swap(passwords);
 +}
 +
 +static void OnDownloadStarted(const std::string& url)
 +{
 +  gDownloadStartedCallbackCalled++;
 +}
 +
 +static bool OnMimeOverridden(const std::string&, const std::string&, std::string&)
 +{
 +  gMimeOverriddenCallbackCalled++;
 +  return false;
 +}
 +
 +static void OnContextMenuCustomized(WebView view, std::shared_ptr<Dali::WebEngineContextMenu> menu)
 +{
 +  gContextMenuCustomizedCallbackCalled++;
 +  gContextMenuInstance = std::move(menu);
 +}
 +
 +static void OnContextMenuItemSelected(WebView view, std::shared_ptr<Dali::WebEngineContextMenuItem> item)
 +{
 +  gContextMenuItemSelectedCallbackCalled++;
 +  gContextMenuItemInstance = std::move(item);
 +}
 +
  } // namespace
  
  void web_view_startup(void)
@@@ -1055,67 -997,6 +1054,67 @@@ int UtcDaliWebViewPropertyTitleFavicon(
    END_TEST;
  }
  
 +int UtcDaliWebViewContextMenuCustomizedAndItemSelected(void)
 +{
 +  ToolkitTestApplication application;
 +
 +  WebView view = WebView::New();
 +  DALI_TEST_CHECK( view );
 +
 +  // load url.
 +  ConnectionTracker* testTracker = new ConnectionTracker();
 +  view.ContextMenuCustomizedSignal().Connect( &OnContextMenuCustomized );
 +  view.ContextMenuItemSelectedSignal().Connect( &OnContextMenuItemSelected );
 +  bool signal1 = false;
 +  bool signal2 = false;
 +  view.ConnectSignal( testTracker, "contextMenuCustomized", CallbackFunctor(&signal1) );
 +  view.ConnectSignal( testTracker, "contextMenuItemSelected", CallbackFunctor(&signal2) );
 +  DALI_TEST_EQUALS( gContextMenuCustomizedCallbackCalled, 0, TEST_LOCATION );
 +  DALI_TEST_EQUALS( gContextMenuItemSelectedCallbackCalled, 0, TEST_LOCATION );
 +  DALI_TEST_CHECK(gContextMenuInstance == 0);
 +  DALI_TEST_CHECK(gContextMenuItemInstance == 0);
 +
 +  view.LoadUrl( TEST_URL1 );
 +  Test::EmitGlobalTimerSignal();
 +  DALI_TEST_EQUALS( gContextMenuCustomizedCallbackCalled, 1, TEST_LOCATION );
 +  DALI_TEST_EQUALS( gContextMenuItemSelectedCallbackCalled, 1, TEST_LOCATION );
 +  DALI_TEST_CHECK( signal1 );
 +  DALI_TEST_CHECK( signal2 );
 +
 +  // check context meun & its items.
 +  DALI_TEST_CHECK(gContextMenuInstance != 0);
 +  std::unique_ptr<Dali::WebEngineContextMenuItem> item = gContextMenuInstance->GetItemAt(0);
 +  DALI_TEST_CHECK(item.get() != 0);
 +  std::vector<std::unique_ptr<Dali::WebEngineContextMenuItem>> itemList = gContextMenuInstance->GetItemList();
 +  DALI_TEST_CHECK(itemList.size() == 1);
 +  Dali::Vector2 testPosition = Dali::Vector2(100, 100);
 +  DALI_TEST_EQUALS(gContextMenuInstance->GetPosition(), testPosition, TEST_LOCATION);
 +  DALI_TEST_CHECK(gContextMenuInstance->RemoveItem(*(item.get())));
 +  DALI_TEST_CHECK(gContextMenuInstance->AppendItemAsAction(WebEngineContextMenuItem::ItemTag::NO_ACTION, "", false));
 +  DALI_TEST_CHECK(gContextMenuInstance->AppendItem(WebEngineContextMenuItem::ItemTag::NO_ACTION, "", "", false));
 +  DALI_TEST_CHECK(gContextMenuInstance->SelectItem(*(item.get())));
 +  DALI_TEST_CHECK(gContextMenuInstance->Hide());
 +
 +  DALI_TEST_CHECK(gContextMenuItemInstance != 0);
 +  Dali::WebEngineContextMenuItem::ItemTag testItemTag = Dali::WebEngineContextMenuItem::ItemTag::NO_ACTION;
 +  DALI_TEST_EQUALS(gContextMenuItemInstance->GetTag(), testItemTag, TEST_LOCATION);
 +  Dali::WebEngineContextMenuItem::ItemType testItemType = Dali::WebEngineContextMenuItem::ItemType::ACTION;
 +  DALI_TEST_EQUALS(gContextMenuItemInstance->GetType(), testItemType, TEST_LOCATION);
 +  DALI_TEST_CHECK(gContextMenuItemInstance->IsEnabled());
 +  std::string testLinkUrl("http://test.html");
 +  DALI_TEST_EQUALS(gContextMenuItemInstance->GetLinkUrl(), testLinkUrl, TEST_LOCATION);
 +  std::string testImageUrl("http://test.jpg");
 +  DALI_TEST_EQUALS(gContextMenuItemInstance->GetImageUrl(), testImageUrl, TEST_LOCATION);
 +  std::string testTitle("title");
 +  DALI_TEST_EQUALS(gContextMenuItemInstance->GetTitle(), testTitle, TEST_LOCATION);
 +  DALI_TEST_CHECK(gContextMenuItemInstance->GetParentMenu().get() == 0);
 +
 +  gContextMenuInstance = nullptr;
 +  gContextMenuItemInstance = nullptr;
 +
 +  END_TEST;
 +}
 +
  int UtcDaliWebViewScrollBy(void)
  {
    ToolkitTestApplication application;
@@@ -1476,9 -1357,15 +1475,15 @@@ int UtcDaliWebBackForwardListCheckItem(
    unsigned int itemCount = bfList->GetItemCount();
    DALI_TEST_CHECK( itemCount == 1 )
  
-   Dali::Toolkit::WebBackForwardListItem* citem = bfList->GetCurrentItem();
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> citem = bfList->GetCurrentItem();
    DALI_TEST_CHECK( citem != 0 );
  
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> citemP = bfList->GetPreviousItem();
+   DALI_TEST_CHECK( citemP != 0 );
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> citemN = bfList->GetNextItem();
+   DALI_TEST_CHECK( citemN != 0 );
    const std::string kDefaultUrl( "http://url" );
    std::string testValue = citem->GetUrl();
    DALI_TEST_EQUALS( testValue, kDefaultUrl, TEST_LOCATION );
    testValue = citem->GetOriginalUrl();
    DALI_TEST_EQUALS( testValue, kDefaultOriginalUrl, TEST_LOCATION );
  
-   Dali::Toolkit::WebBackForwardListItem* item = bfList->GetItemAtIndex( 0 );
+   std::unique_ptr<Dali::WebEngineBackForwardListItem> item = bfList->GetItemAtIndex( 0 );
    DALI_TEST_CHECK( item != 0 );
  
+   std::vector<std::unique_ptr<Dali::WebEngineBackForwardListItem>> vecBack = bfList->GetBackwardItems(-1);
+   DALI_TEST_CHECK( vecBack.size() == 1 );
+   std::vector<std::unique_ptr<Dali::WebEngineBackForwardListItem>> vecForward = bfList->GetForwardItems(-1);
+   DALI_TEST_CHECK( vecForward.size() == 1 );
    END_TEST;
  }
  
@@@ -1516,8 -1409,8 +1527,8 @@@ int UtcDaliWebContextGetSetCacheModel(v
    context->SetCertificateFilePath( kDefaultValue );
    context->DisableCache( false );
    context->SetDefaultProxyAuth( kDefaultValue, kDefaultValue );
 -  context->DeleteWebDatabase();
 -  context->DeleteWebStorage();
 +  context->DeleteAllWebDatabase();
 +  context->DeleteAllWebStorage();
    context->DeleteLocalFileSystem();
    context->ClearCache();
  
    END_TEST;
  }
  
 +int UtcDaliWebContextGetWebDatabaseStorageOrigins(void)
 +{
 +  ToolkitTestApplication application;
 +
 +  WebView view = WebView::New();
 +  DALI_TEST_CHECK( view );
 +
 +  Dali::Toolkit::WebContext* context = view.GetContext();
 +  DALI_TEST_CHECK( context != 0 )
 +
 +  std::string kDefaultValue;
 +
 +  // get origins of web database
 +  bool result = context->GetWebDatabaseOrigins(&OnSecurityOriginsAcquired);
 +  DALI_TEST_CHECK( result );
 +
 +  Test::EmitGlobalTimerSignal();
 +  DALI_TEST_EQUALS( gSecurityOriginsAcquiredCallbackCalled, 1, TEST_LOCATION );
 +  DALI_TEST_CHECK(gSecurityOriginList.size() == 1);
 +
 +  Dali::WebEngineSecurityOrigin* origin = gSecurityOriginList[0].get();
 +  DALI_TEST_CHECK( origin );
 +
 +  result = context->DeleteWebDatabase(*origin);
 +  DALI_TEST_CHECK( result );
 +
 +  // get origins of web storage
 +  result = context->GetWebStorageOrigins(&OnSecurityOriginsAcquired);
 +  DALI_TEST_CHECK( result );
 +
 +  Test::EmitGlobalTimerSignal();
 +  DALI_TEST_EQUALS( gSecurityOriginsAcquiredCallbackCalled, 2, TEST_LOCATION );
 +  DALI_TEST_CHECK(gSecurityOriginList.size() == 1);
 +
 +  origin = gSecurityOriginList[0].get();
 +  DALI_TEST_CHECK( origin );
 +
 +  result = context->GetWebStorageUsageForOrigin(*origin, &OnStorageUsageAcquired);
 +  DALI_TEST_CHECK( result );
 +  Test::EmitGlobalTimerSignal();
 +  DALI_TEST_EQUALS( gStorageUsageAcquiredCallbackCalled, 1, TEST_LOCATION );
 +
 +  result = context->DeleteWebStorageOrigin(*origin);
 +  DALI_TEST_CHECK( result );
 +
 +  result = context->DeleteApplicationCache(*origin);
 +  DALI_TEST_CHECK( result );
 +
 +  // form passwords, download state, mime type.
 +  context->GetFormPasswordList(&OnFormPasswordsAcquired);
 +  Test::EmitGlobalTimerSignal();
 +  DALI_TEST_EQUALS(gFormPasswordsAcquiredCallbackCalled, 1, TEST_LOCATION);
 +  DALI_TEST_CHECK(gPasswordDataList.size() == 1);
 +  DALI_TEST_EQUALS(gPasswordDataList[0]->url, "http://test.html", TEST_LOCATION);
 +  DALI_TEST_CHECK(gPasswordDataList[0]->useFingerprint == false);
 +
 +  context->RegisterDownloadStartedCallback(&OnDownloadStarted);
 +  Test::EmitGlobalTimerSignal();
 +  DALI_TEST_EQUALS(gDownloadStartedCallbackCalled, 1, TEST_LOCATION);
 +
 +  context->RegisterMimeOverriddenCallback(&OnMimeOverridden);
 +  Test::EmitGlobalTimerSignal();
 +  DALI_TEST_EQUALS(gMimeOverriddenCallbackCalled, 1, TEST_LOCATION);
 +
 +  gSecurityOriginList.clear();
 +  gPasswordDataList.clear();
 +
 +  END_TEST;
 +}
 +
  // test cases for web cookie manager.
  
  int UtcDaliWebCookieManagerGetSetCookieAcceptPolicy(void)
@@@ -34,13 -34,11 +34,12 @@@ SET( devel_api_src_file
    ${devel_api_src_dir}/controls/table-view/table-view.cpp
    ${devel_api_src_dir}/controls/text-controls/text-editor-devel.cpp
    ${devel_api_src_dir}/controls/text-controls/text-field-devel.cpp
 +  ${devel_api_src_dir}/controls/text-controls/text-label-devel.cpp
    ${devel_api_src_dir}/controls/text-controls/text-selection-popup.cpp
    ${devel_api_src_dir}/controls/text-controls/text-selection-toolbar.cpp
    ${devel_api_src_dir}/controls/tool-bar/tool-bar.cpp
    ${devel_api_src_dir}/controls/video-view/video-view-devel.cpp
    ${devel_api_src_dir}/controls/web-view/web-back-forward-list.cpp
-   ${devel_api_src_dir}/controls/web-view/web-back-forward-list-item.cpp
    ${devel_api_src_dir}/controls/web-view/web-context.cpp
    ${devel_api_src_dir}/controls/web-view/web-cookie-manager.cpp
    ${devel_api_src_dir}/controls/web-view/web-form-repost-decision.cpp
@@@ -257,7 -255,6 +256,6 @@@ SET( devel_api_video_view_header_file
  
  SET( devel_api_web_view_header_files
    ${devel_api_src_dir}/controls/web-view/web-back-forward-list.h
-   ${devel_api_src_dir}/controls/web-view/web-back-forward-list-item.h
    ${devel_api_src_dir}/controls/web-view/web-context.h
    ${devel_api_src_dir}/controls/web-view/web-cookie-manager.h
    ${devel_api_src_dir}/controls/web-view/web-form-repost-decision.h