| 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;
|
| - }
|
| -}
|
|
|