15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_history.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrerenderHistory::PrerenderHistory(size_t max_items) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : max_items_(max_items) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(max_items > 0); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrerenderHistory::~PrerenderHistory() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrerenderHistory::AddEntry(const Entry& entry) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (entries_.size() >= max_items_) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries_.pop_front(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries_.push_back(entry); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrerenderHistory::Clear() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries_.clear(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::Value* PrerenderHistory::GetEntriesAsValue() const { 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* return_list = new base::ListValue(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Javascript needs times in terms of milliseconds since Jan 1, 1970. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time epoch_start = base::Time::UnixEpoch(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::list<Entry>::const_reverse_iterator it = entries_.rbegin(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != entries_.rend(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Entry& entry = *it; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* entry_dict = new base::DictionaryValue(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_dict->SetString("url", entry.url.spec()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_dict->SetString("final_status", 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameFromFinalStatus(entry.final_status)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_dict->SetString("origin", NameFromOrigin(entry.origin)); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a string to prevent overflow, as Values don't support 64-bit 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // integers. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_dict->SetString( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "end_time", 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Int64ToString((entry.end_time - epoch_start).InMilliseconds())); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return_list->Append(entry_dict); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return return_list; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 56