15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/visitedlink/renderer/visitedlink_slave.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/visitedlink/common/visitedlink_messages.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebView.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebView;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace visitedlink {
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)VisitedLinkSlave::VisitedLinkSlave() : shared_memory_(NULL) {}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VisitedLinkSlave::~VisitedLinkSlave() {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FreeTable();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VisitedLinkSlave::OnControlMessageReceived(const IPC::Message& message) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(VisitedLinkSlave, message)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_VisitedLink_NewTable,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnUpdateVisitedLinks)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_VisitedLink_Add, OnAddVisitedLinks)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewMsg_VisitedLink_Reset, OnResetVisitedLinks)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function's job is to initialize the table with the given
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shared memory handle. This memory is mapped into the process.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VisitedLinkSlave::OnUpdateVisitedLinks(base::SharedMemoryHandle table) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(base::SharedMemory::IsHandleValid(table)) << "Bad table handle";
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since this function may be called again to change the table, we may need
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to free old objects
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FreeTable();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(shared_memory_ == NULL && hash_table_ == NULL);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create the shared memory object
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_ = new base::SharedMemory(table, true);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!shared_memory_)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // map the header into our process so we can see how long the rest is,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and set the salt
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!shared_memory_->Map(sizeof(SharedHeader)))
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SharedHeader* header =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<SharedHeader*>(shared_memory_->memory());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(header);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 table_len = header->length;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(salt_, header->salt, sizeof(salt_));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_->Unmap();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // now do the whole table because we know the length
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!shared_memory_->Map(sizeof(SharedHeader) +
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          table_len * sizeof(Fingerprint))) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shared_memory_->Close();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // commit the data
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(shared_memory_->memory());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hash_table_ = reinterpret_cast<Fingerprint*>(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<char*>(shared_memory_->memory()) + sizeof(SharedHeader));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  table_length_ = table_len;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VisitedLinkSlave::OnAddVisitedLinks(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const VisitedLinkSlave::Fingerprints& fingerprints) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < fingerprints.size(); ++i)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebView::updateVisitedLinkState(fingerprints[i]);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VisitedLinkSlave::OnResetVisitedLinks() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebView::resetVisitedLinkState();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VisitedLinkSlave::FreeTable() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (shared_memory_) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete shared_memory_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shared_memory_ = NULL;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hash_table_ = NULL;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  table_length_ = 0;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace visitedlink
93