Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3466)

Unified Diff: chrome/browser/visitedlink/visitedlink_event_listener.cc

Issue 11825011: Componentize visitedlinks to src/components/visitedlink (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Final rebase Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/visitedlink/visitedlink_event_listener.cc
diff --git a/chrome/browser/visitedlink/visitedlink_event_listener.cc b/chrome/browser/visitedlink/visitedlink_event_listener.cc
deleted file mode 100644
index 685c3348e0a1d2deecacccc7d896adf3f6da2789..0000000000000000000000000000000000000000
--- a/chrome/browser/visitedlink/visitedlink_event_listener.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/visitedlink/visitedlink_event_listener.h"
-
-#include "base/shared_memory.h"
-#include "chrome/browser/visitedlink/visitedlink_delegate.h"
-#include "chrome/common/render_messages.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_types.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/browser/render_widget_host.h"
-
-using base::Time;
-using base::TimeDelta;
-using content::RenderWidgetHost;
-
-namespace {
-
-// The amount of time we wait to accumulate visited link additions.
-static const int kCommitIntervalMs = 100;
-
-// Size of the buffer after which individual link updates deemed not warranted
-// and the overall update should be used instead.
-static const unsigned kVisitedLinkBufferThreshold = 50;
-
-} // namespace
-
-// This class manages buffering and sending visited link hashes (fingerprints)
-// to renderer based on widget visibility.
-// As opposed to the VisitedLinkEventListener, which coalesces to
-// reduce the rate of messages being sent to render processes, this class
-// ensures that the updates occur only when explicitly requested. This is
-// used for RenderProcessHostImpl to only send Add/Reset link events to the
-// renderers when their tabs are visible and the corresponding RenderViews are
-// created.
-class VisitedLinkUpdater {
- public:
- explicit VisitedLinkUpdater(int render_process_id)
- : reset_needed_(false), render_process_id_(render_process_id) {
- }
-
- // Informs the renderer about a new visited link table.
- void SendVisitedLinkTable(base::SharedMemory* table_memory) {
- content::RenderProcessHost* process =
- content::RenderProcessHost::FromID(render_process_id_);
- if (!process)
- return; // Happens in tests
- base::SharedMemoryHandle handle_for_process;
- table_memory->ShareToProcess(process->GetHandle(), &handle_for_process);
- if (base::SharedMemory::IsHandleValid(handle_for_process))
- process->Send(new ChromeViewMsg_VisitedLink_NewTable(
- handle_for_process));
- }
-
- // Buffers |links| to update, but doesn't actually relay them.
- void AddLinks(const VisitedLinkCommon::Fingerprints& links) {
- if (reset_needed_)
- return;
-
- if (pending_.size() + links.size() > kVisitedLinkBufferThreshold) {
- // Once the threshold is reached, there's no need to store pending visited
- // link updates -- we opt for resetting the state for all links.
- AddReset();
- return;
- }
-
- pending_.insert(pending_.end(), links.begin(), links.end());
- }
-
- // Tells the updater that sending individual link updates is no longer
- // necessary and the visited state for all links should be reset.
- void AddReset() {
- reset_needed_ = true;
- pending_.clear();
- }
-
- // Sends visited link update messages: a list of links whose visited state
- // changed or reset of visited state for all links.
- void Update() {
- content::RenderProcessHost* process =
- content::RenderProcessHost::FromID(render_process_id_);
- if (!process)
- return; // Happens in tests
-
- if (!process->VisibleWidgetCount())
- return;
-
- if (reset_needed_) {
- process->Send(new ChromeViewMsg_VisitedLink_Reset());
- reset_needed_ = false;
- return;
- }
-
- if (pending_.empty())
- return;
-
- process->Send(new ChromeViewMsg_VisitedLink_Add(pending_));
-
- pending_.clear();
- }
-
- private:
- bool reset_needed_;
- int render_process_id_;
- VisitedLinkCommon::Fingerprints pending_;
-};
-
-VisitedLinkEventListener::VisitedLinkEventListener(
- VisitedLinkMaster* master,
- content::BrowserContext* browser_context)
- : master_(master),
- browser_context_(browser_context) {
- registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED,
- content::NotificationService::AllBrowserContextsAndSources());
- registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
- content::NotificationService::AllBrowserContextsAndSources());
- registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
- content::NotificationService::AllBrowserContextsAndSources());
-}
-
-VisitedLinkEventListener::~VisitedLinkEventListener() {
- if (!pending_visited_links_.empty())
- pending_visited_links_.clear();
-}
-
-void VisitedLinkEventListener::NewTable(base::SharedMemory* table_memory) {
- if (!table_memory)
- return;
-
- // Send to all RenderProcessHosts.
- for (Updaters::iterator i = updaters_.begin(); i != updaters_.end(); ++i) {
- // Make sure to not send to incognito renderers.
- content::RenderProcessHost* process =
- content::RenderProcessHost::FromID(i->first);
- if (!process)
- continue;
-
- i->second->SendVisitedLinkTable(table_memory);
- }
-}
-
-void VisitedLinkEventListener::Add(VisitedLinkMaster::Fingerprint fingerprint) {
- pending_visited_links_.push_back(fingerprint);
-
- if (!coalesce_timer_.IsRunning()) {
- coalesce_timer_.Start(FROM_HERE,
- TimeDelta::FromMilliseconds(kCommitIntervalMs), this,
- &VisitedLinkEventListener::CommitVisitedLinks);
- }
-}
-
-void VisitedLinkEventListener::Reset() {
- pending_visited_links_.clear();
- coalesce_timer_.Stop();
-
- for (Updaters::iterator i = updaters_.begin(); i != updaters_.end(); ++i) {
- i->second->AddReset();
- i->second->Update();
- }
-}
-
-void VisitedLinkEventListener::CommitVisitedLinks() {
- // Send to all RenderProcessHosts.
- for (Updaters::iterator i = updaters_.begin(); i != updaters_.end(); ++i) {
- i->second->AddLinks(pending_visited_links_);
- i->second->Update();
- }
-
- pending_visited_links_.clear();
-}
-
-void VisitedLinkEventListener::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- switch (type) {
- case content::NOTIFICATION_RENDERER_PROCESS_CREATED: {
- content::RenderProcessHost* process =
- content::Source<content::RenderProcessHost>(source).ptr();
- if (!master_->GetDelegate()->AreEquivalentContexts(
- browser_context_, process->GetBrowserContext()))
- return;
-
- // Happens on browser start up.
- if (!master_->shared_memory())
- return;
-
- updaters_[process->GetID()] =
- make_linked_ptr(new VisitedLinkUpdater(process->GetID()));
- updaters_[process->GetID()]->SendVisitedLinkTable(
- master_->shared_memory());
- break;
- }
- case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
- content::RenderProcessHost* process =
- content::Source<content::RenderProcessHost>(source).ptr();
- if (updaters_.count(process->GetID())) {
- updaters_.erase(process->GetID());
- }
- break;
- }
- case content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED: {
- RenderWidgetHost* widget =
- content::Source<RenderWidgetHost>(source).ptr();
- int child_id = widget->GetProcess()->GetID();
- if (updaters_.count(child_id))
- updaters_[child_id]->Update();
- break;
- }
- default:
- NOTREACHED();
- break;
- }
-}
« no previous file with comments | « chrome/browser/visitedlink/visitedlink_event_listener.h ('k') | chrome/browser/visitedlink/visitedlink_master.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698