From 56a0f8bdd94a26cc8fb6a257867ed21230013595 Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Wed, 26 Sep 2018 19:31:41 +0530 Subject: [PATCH] Enable visited links chromium component 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 --- atom/browser/api/atom_api_web_contents.cc | 7 +++++++ atom/browser/api/atom_api_web_contents.h | 4 ++++ atom/browser/atom_browser_context.cc | 24 ++++++++++++++++++++++++ atom/browser/atom_browser_context.h | 13 ++++++++++++- atom/renderer/atom_renderer_client.cc | 13 +++++++++++++ atom/renderer/atom_renderer_client.h | 6 ++++++ 6 files changed, 66 insertions(+), 1 deletion(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index fccae5a..18f375d 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -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(web_contents()->GetBrowserContext())-> + AddVisitedURLs(params.redirects); +} + void WebContents::DocumentLoadedInFrame( content::RenderFrameHost* render_frame_host) { if (!render_frame_host->GetParent()) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 48d23e8..2311e0f 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -339,6 +339,10 @@ class WebContents : public mate::TrackableObject, 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, diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc index 0d56c5f..92a589d 100644 --- a/atom/browser/atom_browser_context.cc +++ b/atom/browser/atom_browser_context.cc @@ -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::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& urls) { + if (!IsOffTheRecord()) { + DCHECK(visitedlink_master_); + visitedlink_master_->AddURLs(urls); + } +} + +void AtomBrowserContext::RebuildTable(const scoped_refptr& 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 diff --git a/atom/browser/atom_browser_context.h b/atom/browser/atom_browser_context.h index 340c8f4..e4f6e0d 100644 --- a/atom/browser/atom_browser_context.h +++ b/atom/browser/atom_browser_context.h @@ -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& urls); + // visitedlink::VisitedLinkDelegate implementation. + void RebuildTable(const scoped_refptr& 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_master_; std::unique_ptr download_manager_delegate_; std::unique_ptr guest_manager_; std::unique_ptr permission_manager_; diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 1e55cce..2323f25 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -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 diff --git a/atom/renderer/atom_renderer_client.h b/atom/renderer/atom_renderer_client.h index 1a67a85..05ab527 100644 --- a/atom/renderer/atom_renderer_client.h +++ b/atom/renderer/atom_renderer_client.h @@ -9,6 +9,7 @@ #include #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 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 widget_; + std::unique_ptr visited_link_slave_; void RenderThreadStarted() override; void RenderFrameCreated(content::RenderFrame*) override; -- 2.7.4