Enable visited links chromium component 36/190036/6
authorsurya.kumar7 <surya.kumar7@samsung.com>
Wed, 26 Sep 2018 14:01:41 +0000 (19:31 +0530)
committerjaekuk lee <juku1999@samsung.com>
Fri, 28 Sep 2018 00:51:27 +0000 (00:51 +0000)
Visited link component from chromium wasn't being used because of
which visited pseudo attribute of link elements doesn't get activated
and CSS3Colors_color_pseudo-classes fails

Reference patch: https://review.tizen.org/gerrit/#/c/130333/
Depends on https://review.tizen.org/gerrit/#/c/190037/

Change-Id: I1beb18174682ae1a7652b7fcc8f780fca62a5d06
Signed-off-by: surya.kumar7 <surya.kumar7@samsung.com>
atom/browser/api/atom_api_web_contents.cc
atom/browser/api/atom_api_web_contents.h
atom/browser/atom_browser_context.cc
atom/browser/atom_browser_context.h
atom/renderer/atom_renderer_client.cc
atom/renderer/atom_renderer_client.h

index fccae5a..18f375d 100644 (file)
@@ -723,6 +723,13 @@ void WebContents::DidChangeThemeColor(SkColor theme_color) {
   Emit("did-change-theme-color", atom::ToRGBHex(theme_color));
 }
 
+void WebContents::DidNavigateAnyFrame(content::RenderFrameHost* render_frame_host,
+                                      const content::LoadCommittedDetails& details,
+                                      const content::FrameNavigateParams& params) {
+  static_cast<AtomBrowserContext*>(web_contents()->GetBrowserContext())->
+      AddVisitedURLs(params.redirects);
+}
+
 void WebContents::DocumentLoadedInFrame(
     content::RenderFrameHost* render_frame_host) {
   if (!render_frame_host->GetParent())
index 48d23e8..2311e0f 100644 (file)
@@ -339,6 +339,10 @@ class WebContents : public mate::TrackableObject<WebContents>,
   void MediaStoppedPlaying(const MediaPlayerInfo& video_type,
                            const MediaPlayerId& id) override;
   void DidChangeThemeColor(SkColor theme_color) override;
+  void DidNavigateAnyFrame(
+      content::RenderFrameHost* render_frame_host,
+      const content::LoadCommittedDetails& details,
+      const content::FrameNavigateParams& params) override;
 
   // content::NotificationObserver:
   void Observe(int type,
index 0d56c5f..92a589d 100644 (file)
@@ -79,6 +79,7 @@ AtomBrowserContext::AtomBrowserContext(const std::string& partition,
       ct_delegate_(new AtomCTDelegate),
       network_delegate_(new AtomNetworkDelegate),
       cookie_delegate_(new AtomCookieDelegate) {
+  InitVisitedLinkMaster();
   // Construct user agent string.
   Browser* browser = Browser::Get();
   std::string name = RemoveWhitespace(browser->GetName());
@@ -252,4 +253,27 @@ scoped_refptr<AtomBrowserContext> AtomBrowserContext::From(
   return new AtomBrowserContext(partition, in_memory, options);
 }
 
+void AtomBrowserContext::InitVisitedLinkMaster() {
+  if (!IsOffTheRecord()) {
+    visitedlink_master_.reset(new visitedlink::VisitedLinkMaster(this, this, false));
+    visitedlink_master_->Init();
+  }
+}
+
+void AtomBrowserContext::AddVisitedURLs(const std::vector<GURL>& urls) {
+  if (!IsOffTheRecord()) {
+    DCHECK(visitedlink_master_);
+    visitedlink_master_->AddURLs(urls);
+  }
+}
+
+void AtomBrowserContext::RebuildTable(const scoped_refptr<URLEnumerator>& enumerator) {
+  if (!IsOffTheRecord()) {
+    // WebView rebuilds from WebChromeClient.getVisitedHistory. The client
+    // can change in the lifetime of this WebView and may not yet be set here.
+    // Therefore this initialization path is not used.
+    enumerator->OnComplete(true);
+  }
+}
+
 }  // namespace atom
index 340c8f4..e4f6e0d 100644 (file)
@@ -10,6 +10,8 @@
 
 #include "atom/browser/net/atom_cookie_delegate.h"
 #include "brightray/browser/browser_context.h"
+#include "components/visitedlink/browser/visitedlink_delegate.h"
+#include "components/visitedlink/browser/visitedlink_master.h"
 #include "net/cookies/cookie_monster.h"
 
 namespace atom {
@@ -21,7 +23,8 @@ class AtomNetworkDelegate;
 class AtomPermissionManager;
 class WebViewManager;
 
-class AtomBrowserContext : public brightray::BrowserContext {
+class AtomBrowserContext : public brightray::BrowserContext,
+                           public visitedlink::VisitedLinkDelegate {
  public:
   // Get or create the BrowserContext according to its |partition| and
   // |in_memory|. The |options| will be passed to constructor when there is no
@@ -32,6 +35,13 @@ class AtomBrowserContext : public brightray::BrowserContext {
 
   void SetUserAgent(const std::string& user_agent);
 
+  // These methods map to Add methods in visitedlink::VisitedLinkMaster.
+  void AddVisitedURLs(const std::vector<GURL>& urls);
+  // visitedlink::VisitedLinkDelegate implementation.
+  void RebuildTable(const scoped_refptr<URLEnumerator>& enumerator) override;
+  // Reset visitedlink master and initialize it.
+  void InitVisitedLinkMaster();
+
   // brightray::URLRequestContextGetter::Delegate:
   net::NetworkDelegate* CreateNetworkDelegate() override;
   net::CookieMonsterDelegate* CreateCookieDelegate() override;
@@ -65,6 +75,7 @@ class AtomBrowserContext : public brightray::BrowserContext {
   ~AtomBrowserContext() override;
 
  private:
+  std::unique_ptr<visitedlink::VisitedLinkMaster> visitedlink_master_;
   std::unique_ptr<AtomDownloadManagerDelegate> download_manager_delegate_;
   std::unique_ptr<WebViewManager> guest_manager_;
   std::unique_ptr<AtomPermissionManager> permission_manager_;
index 1e55cce..2323f25 100644 (file)
@@ -32,6 +32,7 @@
 #include "base/command_line.h"
 #include "content/public/renderer/render_frame.h"
 #include "native_mate/dictionary.h"
+#include "services/service_manager/public/cpp/interface_registry.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
 #include "tizen/common/env_variables.h"
@@ -93,6 +94,9 @@ void AtomRendererClient::RenderThreadStarted() {
   widget_.reset(wrt_widget);
   content::RenderThread* thread = content::RenderThread::Get();
   thread->AddObserver(wrt_widget->GetObserver());
+  visited_link_slave_.reset(new visitedlink::VisitedLinkSlave());
+  thread->GetInterfaceRegistry()->AddInterface(
+      visited_link_slave_->GetBindCallback());
   std::string theme = command_line->GetSwitchValueASCII("widget-theme");
   std::string encoded_bundle = command_line->GetSwitchValueASCII("widget-encoded-bundle");
   std::string scale = command_line->GetSwitchValueASCII("widget-scale");
@@ -281,5 +285,14 @@ void AtomRendererClient::SetupMainWorldOverrides(
   ignore_result(func->Call(context, v8::Null(isolate), 1, args));
 }
 
+unsigned long long AtomRendererClient::VisitedLinkHash(const char* canonical_url,
+                                                             size_t length) {
+  return visited_link_slave_->ComputeURLFingerprint(canonical_url, length);
+}
+
+bool AtomRendererClient::IsLinkVisited(unsigned long long link_hash) {
+  return visited_link_slave_->IsVisited(link_hash);
+}
+
 
 }  // namespace atom
index 1a67a85..05ab527 100644 (file)
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "atom/renderer/renderer_client_base.h"
+#include "components/visitedlink/renderer/visitedlink_slave.h"
 #include "tizen_src/ewk/efl_integration/wrt/wrtwidget.h"
 
 namespace atom {
@@ -35,6 +36,10 @@ class AtomRendererClient : public RendererClientBase {
       content::RenderFrame* render_frame) override;
   void SetupMainWorldOverrides(v8::Handle<v8::Context> context) override;
   bool isolated_world() override { return isolated_world_; }
+  unsigned long long VisitedLinkHash(const char* canonical_url,
+                                     size_t length);
+
+  bool IsLinkVisited(unsigned long long link_hash);
 
  private:
   enum NodeIntegration {
@@ -44,6 +49,7 @@ class AtomRendererClient : public RendererClientBase {
     DISABLE,
   };
   std::unique_ptr<V8Widget> widget_;
+  std::unique_ptr<visitedlink::VisitedLinkSlave> visited_link_slave_;
 
   void RenderThreadStarted() override;
   void RenderFrameCreated(content::RenderFrame*) override;