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