| Index: chrome/browser/ui/webui/ntp/suggestions_combiner.cc
|
| diff --git a/chrome/browser/ui/webui/ntp/suggestions_combiner.cc b/chrome/browser/ui/webui/ntp/suggestions_combiner.cc
|
| deleted file mode 100644
|
| index bf998143f5212e4e09faa47a9fed8c254fd78bb7..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/webui/ntp/suggestions_combiner.cc
|
| +++ /dev/null
|
| @@ -1,152 +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/ui/webui/ntp/suggestions_combiner.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/values.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_iterator.h"
|
| -#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| -#include "chrome/browser/ui/webui/ntp/suggestions_page_handler.h"
|
| -#include "chrome/browser/ui/webui/ntp/suggestions_source.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -
|
| -namespace {
|
| -
|
| -static const size_t kSuggestionsCount = 8;
|
| -
|
| -} // namespace
|
| -
|
| -SuggestionsCombiner::SuggestionsCombiner(
|
| - SuggestionsCombiner::Delegate* delegate,
|
| - Profile* profile)
|
| - : sources_fetching_count_(0),
|
| - delegate_(delegate),
|
| - suggestions_count_(kSuggestionsCount),
|
| - page_values_(new base::ListValue()),
|
| - debug_enabled_(false),
|
| - profile_(profile) {
|
| -}
|
| -
|
| -SuggestionsCombiner::~SuggestionsCombiner() {
|
| -}
|
| -
|
| -void SuggestionsCombiner::AddSource(SuggestionsSource* source) {
|
| - source->SetCombiner(this);
|
| - source->SetDebug(debug_enabled_);
|
| - sources_.push_back(source);
|
| -}
|
| -
|
| -void SuggestionsCombiner::EnableDebug(bool enable) {
|
| - debug_enabled_ = enable;
|
| - for (size_t i = 0; i < sources_.size(); ++i) {
|
| - sources_[i]->SetDebug(enable);
|
| - }
|
| -}
|
| -
|
| -void SuggestionsCombiner::FetchItems(Profile* profile) {
|
| - sources_fetching_count_ = sources_.size();
|
| - for (size_t i = 0; i < sources_.size(); ++i) {
|
| - sources_[i]->FetchItems(profile);
|
| - }
|
| -}
|
| -
|
| -base::ListValue* SuggestionsCombiner::GetPageValues() {
|
| - return page_values_.get();
|
| -}
|
| -
|
| -void SuggestionsCombiner::OnItemsReady() {
|
| - DCHECK_GT(sources_fetching_count_, 0);
|
| - sources_fetching_count_--;
|
| - if (sources_fetching_count_ == 0) {
|
| - FillPageValues();
|
| - delegate_->OnSuggestionsReady();
|
| - }
|
| -}
|
| -
|
| -void SuggestionsCombiner::SetSuggestionsCount(size_t suggestions_count) {
|
| - suggestions_count_ = suggestions_count;
|
| -}
|
| -
|
| -void SuggestionsCombiner::FillPageValues() {
|
| - int total_weight = 0;
|
| - for (size_t i = 0; i < sources_.size(); ++i)
|
| - total_weight += sources_[i]->GetWeight();
|
| - DCHECK_GT(total_weight, 0);
|
| -
|
| - page_values_.reset(new base::ListValue());
|
| -
|
| - // Evaluate how many items to obtain from each source. We use error diffusion
|
| - // to ensure that we get the total desired number of items.
|
| - int error = 0;
|
| -
|
| - // Holds the index at which the next item should be added for each source.
|
| - std::vector<size_t> next_item_index_for_source;
|
| - next_item_index_for_source.reserve(sources_.size());
|
| - for (size_t i = 0; i < sources_.size(); ++i) {
|
| - int numerator = sources_[i]->GetWeight() * suggestions_count_ + error;
|
| - error = numerator % total_weight;
|
| - int item_count = std::min(numerator / total_weight,
|
| - sources_[i]->GetItemCount());
|
| -
|
| - for (int j = 0; j < item_count; ++j)
|
| - page_values_->Append(sources_[i]->PopItem());
|
| - next_item_index_for_source.push_back(page_values_->GetSize());
|
| - }
|
| -
|
| - // Fill in extra items, prioritizing the first source.
|
| - // Rather than updating |next_item_index_for_source| we keep track of the
|
| - // number of extra items that were added and offset indices by that much.
|
| - size_t extra_items_added = 0;
|
| - for (size_t i = 0; i < sources_.size() &&
|
| - page_values_->GetSize() < suggestions_count_; ++i) {
|
| -
|
| - size_t index = next_item_index_for_source[i] + extra_items_added;
|
| - while (page_values_->GetSize() < suggestions_count_) {
|
| - base::DictionaryValue* item = sources_[i]->PopItem();
|
| - if (!item)
|
| - break;
|
| - page_values_->Insert(index++, item);
|
| - extra_items_added++;
|
| - }
|
| - }
|
| -
|
| - // Add page value information common to all sources.
|
| - for (size_t i = 0; i < page_values_->GetSize(); i++) {
|
| - base::DictionaryValue* page_value;
|
| - if (page_values_->GetDictionary(i, &page_value))
|
| - AddExtendedInformation(page_value);
|
| - }
|
| -}
|
| -
|
| -void SuggestionsCombiner::AddExtendedInformation(
|
| - base::DictionaryValue* page_value) {
|
| - if (debug_enabled_) {
|
| - std::string url_string;
|
| - if (page_value->GetString("url", &url_string)) {
|
| - GURL url(url_string);
|
| - page_value->SetBoolean("already_open", IsUrlAlreadyOpen(url));
|
| - }
|
| - }
|
| -}
|
| -
|
| -bool SuggestionsCombiner::IsUrlAlreadyOpen(const GURL &url) {
|
| - for (chrome::BrowserIterator it; !it.done(); it.Next()) {
|
| - const Browser* browser = *it;
|
| - if (browser->profile()->IsOffTheRecord() ||
|
| - !browser->profile()->IsSameProfile(profile_))
|
| - continue;
|
| -
|
| - for (int i = 0; i < browser->tab_strip_model()->count(); i++) {
|
| - const content::WebContents* tab =
|
| - browser->tab_strip_model()->GetWebContentsAt(i);
|
| - if (tab->GetURL() == url)
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
|
|