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