| Index: chrome/browser/automation/automation_provider_observers.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/automation/automation_provider_observers.cc	(revision 61074)
 | 
| +++ chrome/browser/automation/automation_provider_observers.cc	(working copy)
 | 
| @@ -5,6 +5,7 @@
 | 
|  #include "chrome/browser/automation/automation_provider_observers.h"
 | 
|  
 | 
|  #include "base/basictypes.h"
 | 
| +#include "base/callback.h"
 | 
|  #include "base/json/json_writer.h"
 | 
|  #include "base/string_util.h"
 | 
|  #include "chrome/app/chrome_dll_resource.h"
 | 
| @@ -14,16 +15,19 @@
 | 
|  #include "chrome/browser/browser.h"
 | 
|  #include "chrome/browser/browser_list.h"
 | 
|  #include "chrome/browser/dom_operation_notification_details.h"
 | 
| +#include "chrome/browser/dom_ui/new_tab_ui.h"
 | 
|  #include "chrome/browser/download/download_item.h"
 | 
|  #include "chrome/browser/download/save_package.h"
 | 
|  #include "chrome/browser/extensions/extension_host.h"
 | 
|  #include "chrome/browser/extensions/extension_process_manager.h"
 | 
|  #include "chrome/browser/extensions/extension_updater.h"
 | 
| +#include "chrome/browser/history/top_sites.h"
 | 
|  #include "chrome/browser/login_prompt.h"
 | 
|  #include "chrome/browser/metrics/metric_event_duration_details.h"
 | 
|  #include "chrome/browser/printing/print_job.h"
 | 
|  #include "chrome/browser/profile.h"
 | 
|  #include "chrome/browser/search_engines/template_url_model.h"
 | 
| +#include "chrome/browser/sessions/tab_restore_service.h"
 | 
|  #include "chrome/browser/tab_contents/navigation_controller.h"
 | 
|  #include "chrome/browser/tab_contents/tab_contents.h"
 | 
|  #include "chrome/browser/translate/page_translated_details.h"
 | 
| @@ -1309,6 +1313,62 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +NTPInfoObserver::NTPInfoObserver(
 | 
| +    AutomationProvider* automation,
 | 
| +    IPC::Message* reply_message,
 | 
| +    CancelableRequestConsumer* consumer)
 | 
| +        : automation_(automation),
 | 
| +          reply_message_(reply_message),
 | 
| +          consumer_(consumer),
 | 
| +          ntp_info_(new DictionaryValue) {
 | 
| +  top_sites_ = automation_->profile()->GetTopSites();
 | 
| +  if (!top_sites_) {
 | 
| +    AutomationJSONReply(automation_, reply_message_)
 | 
| +        .SendError("Profile does not have service for querying the top sites.");
 | 
| +    return;
 | 
| +  }
 | 
| +  TabRestoreService* service = automation_->profile()->GetTabRestoreService();
 | 
| +  if (!service) {
 | 
| +    AutomationJSONReply(automation_, reply_message_)
 | 
| +        .SendError("No TabRestoreService.");
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  // Get the info that would be displayed in the recently closed section.
 | 
| +  ListValue* recently_closed_list = new ListValue;
 | 
| +  NewTabUI::AddRecentlyClosedEntries(service->entries(),
 | 
| +                                     recently_closed_list);
 | 
| +  ntp_info_->Set("recently_closed", recently_closed_list);
 | 
| +
 | 
| +  top_sites_->RefreshAndCallback(
 | 
| +      consumer_,
 | 
| +      NewCallback(this, &NTPInfoObserver::OnTopSitesRefreshed));
 | 
| +}
 | 
| +
 | 
| +void NTPInfoObserver::OnTopSitesRefreshed() {
 | 
| +  top_sites_->GetMostVisitedURLs(
 | 
| +      consumer_,
 | 
| +      NewCallback(this, &NTPInfoObserver::OnTopSitesReceived));
 | 
| +}
 | 
| +
 | 
| +void NTPInfoObserver::OnTopSitesReceived(
 | 
| +    history::MostVisitedURLList visited_list) {
 | 
| +  ListValue* list_value = new ListValue;
 | 
| +  for (size_t i = 0; i < visited_list.size(); ++i) {
 | 
| +    const history::MostVisitedURL& visited = visited_list[i];
 | 
| +    if (visited.url.spec().empty())
 | 
| +      break;  // This is the signal that there are no more real visited sites.
 | 
| +    DictionaryValue* dict = new DictionaryValue;
 | 
| +    dict->SetString("url", visited.url.spec());
 | 
| +    dict->SetString("title", visited.title);
 | 
| +    dict->SetBoolean("is_pinned", top_sites_->IsURLPinned(visited.url));
 | 
| +    list_value->Append(dict);
 | 
| +  }
 | 
| +  ntp_info_->Set("most_visited", list_value);
 | 
| +  AutomationJSONReply(automation_, reply_message_).SendSuccess(ntp_info_.get());
 | 
| +  delete this;
 | 
| +}
 | 
| +
 | 
|  AutocompleteEditFocusedObserver::AutocompleteEditFocusedObserver(
 | 
|      AutomationProvider* automation,
 | 
|      AutocompleteEditModel* autocomplete_edit,
 | 
| 
 |