172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file.
4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/lazy_instance.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autocomplete_history_manager.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/autofill_manager.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/automation/automation_tab_helper.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/bookmarks/bookmark_model.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/custom_handlers/register_protocol_handler_infobar_delegate.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_tab_helper.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_webnavigation_api.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/file_select_helper.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/history/history.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/history/top_sites.h"
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/password_manager/password_manager.h"
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/password_manager_delegate_impl.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/prefs/pref_service.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prerender/prerender_observer.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/printing/print_preview_message_handler.h"
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile.h"
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/simple_alert_infobar_delegate.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/translate/translate_tab_helper.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/download/download_tab_helper.h"
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/find_bar/find_tab_helper.h"
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/search_engines/search_engine_tab_helper.h"
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h"
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/pref_names.h"
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/render_messages.h"
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "grit/generated_resources.h"
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "grit/locale_settings.h"
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "grit/platform_locale_settings.h"
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ui/base/l10n/l10n_util.h"
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "webkit/glue/webpreferences.h"
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstatic base::LazyInstance<PropertyAccessor<TabContentsWrapper*> >
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    g_tab_contents_wrapper_property_accessor(base::LINKER_INITIALIZED);
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch////////////////////////////////////////////////////////////////////////////////
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// TabContentsWrapper, public:
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTabContentsWrapper::TabContentsWrapper(TabContents* contents)
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : TabContentsObserver(contents),
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delegate_(NULL),
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      is_starred_(false),
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab_contents_(contents) {
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(contents);
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Stash this in the property bag so it can be retrieved without having to
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // go to a Browser.
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  property_accessor()->SetProperty(contents->property_bag(), this);
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Create the tab helpers.
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  autocomplete_history_manager_.reset(new AutocompleteHistoryManager(contents));
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  autofill_manager_.reset(new AutofillManager(contents));
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  automation_tab_helper_.reset(new AutomationTabHelper(contents));
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  download_tab_helper_.reset(new DownloadTabHelper(contents));
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension_tab_helper_.reset(new ExtensionTabHelper(this));
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  find_tab_helper_.reset(new FindTabHelper(contents));
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  password_manager_delegate_.reset(new PasswordManagerDelegateImpl(contents));
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  password_manager_.reset(
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      new PasswordManager(contents, password_manager_delegate_.get()));
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  search_engine_tab_helper_.reset(new SearchEngineTabHelper(contents));
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  translate_tab_helper_.reset(new TranslateTabHelper(contents));
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  print_view_manager_.reset(new printing::PrintViewManager(contents));
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Register for notifications about URL starredness changing on any profile.
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  registrar_.Add(this, NotificationType::URLS_STARRED,
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 NotificationService::AllSources());
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  registrar_.Add(this, NotificationType::BOOKMARK_MODEL_LOADED,
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 NotificationService::AllSources());
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Create the per-tab observers.
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  file_select_observer_.reset(new FileSelectObserver(contents));
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  prerender_observer_.reset(new prerender::PrerenderObserver(contents));
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  print_preview_.reset(new printing::PrintPreviewMessageHandler(contents));
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  webnavigation_observer_.reset(
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new ExtensionWebNavigationTabObserver(contents));
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTabContentsWrapper::~TabContentsWrapper() {
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We don't want any notifications while we're running our destructor.
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  registrar_.RemoveAll();
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochPropertyAccessor<TabContentsWrapper*>* TabContentsWrapper::property_accessor() {
9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return g_tab_contents_wrapper_property_accessor.Pointer();
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TabContentsWrapper::RegisterUserPrefs(PrefService* prefs) {
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, true);
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WebPreferences pref_defaults;
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitJavascriptEnabled,
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.javascript_enabled);
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitWebSecurityEnabled,
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.web_security_enabled);
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      prefs::kWebKitJavascriptCanOpenWindowsAutomatically, true);
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitLoadsImagesAutomatically,
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.loads_images_automatically);
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitPluginsEnabled,
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.plugins_enabled);
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitDomPasteEnabled,
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.dom_paste_enabled);
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitShrinksStandaloneImagesToFit,
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.shrinks_standalone_images_to_fit);
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterDictionaryPref(prefs::kWebKitInspectorSettings);
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitTextAreasAreResizable,
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.text_areas_are_resizable);
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebKitJavaEnabled,
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.java_enabled);
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterBooleanPref(prefs::kWebkitTabsToLinks,
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             pref_defaults.tabs_to_links);
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kAcceptLanguages,
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_ACCEPT_LANGUAGES);
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kDefaultCharset,
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_DEFAULT_ENCODING);
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kWebKitStandardFontFamily,
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_STANDARD_FONT_FAMILY);
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kWebKitFixedFontFamily,
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_FIXED_FONT_FAMILY);
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kWebKitSerifFontFamily,
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_SERIF_FONT_FAMILY);
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kWebKitSansSerifFontFamily,
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_SANS_SERIF_FONT_FAMILY);
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kWebKitCursiveFontFamily,
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_CURSIVE_FONT_FAMILY);
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kWebKitFantasyFontFamily,
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_FANTASY_FONT_FAMILY);
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedIntegerPref(prefs::kWebKitDefaultFontSize,
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      IDS_DEFAULT_FONT_SIZE);
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedIntegerPref(prefs::kWebKitDefaultFixedFontSize,
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      IDS_DEFAULT_FIXED_FONT_SIZE);
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedIntegerPref(prefs::kWebKitMinimumFontSize,
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      IDS_MINIMUM_FONT_SIZE);
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedIntegerPref(prefs::kWebKitMinimumLogicalFontSize,
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      IDS_MINIMUM_LOGICAL_FONT_SIZE);
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedBooleanPref(prefs::kWebKitUsesUniversalDetector,
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                      IDS_USES_UNIVERSAL_DETECTOR);
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  prefs->RegisterLocalizedStringPref(prefs::kStaticEncodings,
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     IDS_STATIC_ENCODING_LIST);
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  prefs->RegisterStringPref(prefs::kRecentlySelectedEncoding, "");
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstring16 TabContentsWrapper::GetDefaultTitle() {
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return l10n_util::GetStringUTF16(IDS_DEFAULT_TAB_TITLE);
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstring16 TabContentsWrapper::GetStatusText() const {
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!tab_contents()->is_loading() ||
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      tab_contents()->load_state() == net::LOAD_STATE_IDLE) {
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return string16();
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (tab_contents()->load_state()) {
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_WAITING_FOR_CACHE:
164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(IDS_LOAD_STATE_WAITING_FOR_CACHE);
165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_ESTABLISHING_PROXY_TUNNEL:
166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          l10n_util::GetStringUTF16(IDS_LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_RESOLVING_PROXY_FOR_URL:
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(IDS_LOAD_STATE_RESOLVING_PROXY_FOR_URL);
170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_RESOLVING_HOST:
171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(IDS_LOAD_STATE_RESOLVING_HOST);
172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_CONNECTING:
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(IDS_LOAD_STATE_CONNECTING);
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_SSL_HANDSHAKE:
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(IDS_LOAD_STATE_SSL_HANDSHAKE);
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_SENDING_REQUEST:
177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (tab_contents()->upload_size())
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return l10n_util::GetStringFUTF16Int(
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                    IDS_LOAD_STATE_SENDING_REQUEST_WITH_PROGRESS,
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                    static_cast<int>((100 * tab_contents()->upload_position()) /
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        tab_contents()->upload_size()));
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      else
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return l10n_util::GetStringUTF16(IDS_LOAD_STATE_SENDING_REQUEST);
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_WAITING_FOR_RESPONSE:
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringFUTF16(IDS_LOAD_STATE_WAITING_FOR_RESPONSE,
186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        tab_contents()->load_state_host());
187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Ignore net::LOAD_STATE_READING_RESPONSE and net::LOAD_STATE_IDLE
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_IDLE:
189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case net::LOAD_STATE_READING_RESPONSE:
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return string16();
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTabContentsWrapper* TabContentsWrapper::Clone() {
197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* new_contents = tab_contents()->Clone();
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContentsWrapper* new_wrapper = new TabContentsWrapper(new_contents);
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  new_wrapper->extension_tab_helper()->CopyStateFrom(
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *extension_tab_helper_.get());
202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return new_wrapper;
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTabContentsWrapper* TabContentsWrapper::GetCurrentWrapperForContents(
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TabContents* contents) {
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper** wrapper =
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      property_accessor()->GetProperty(contents->property_bag());
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return wrapper ? *wrapper : NULL;
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
213201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch////////////////////////////////////////////////////////////////////////////////
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContentsWrapper, TabContentsObserver implementation:
215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsWrapper::DidNavigateMainFramePostCommit(
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const NavigationController::LoadCommittedDetails& /*details*/,
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const ViewHostMsg_FrameNavigate_Params& /*params*/) {
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UpdateStarredStateForCurrentURL();
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool TabContentsWrapper::OnMessageReceived(const IPC::Message& message) {
223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool handled = true;
224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  IPC_BEGIN_MESSAGE_MAP(TabContentsWrapper, message)
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC_MESSAGE_HANDLER(ViewHostMsg_PageContents, OnPageContents)
226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC_MESSAGE_HANDLER(ViewHostMsg_JSOutOfMemory, OnJSOutOfMemory)
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC_MESSAGE_HANDLER(ViewHostMsg_RegisterProtocolHandler,
228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        OnRegisterProtocolHandler)
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC_MESSAGE_HANDLER(ViewHostMsg_Thumbnail, OnMsgThumbnail)
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    IPC_MESSAGE_UNHANDLED(handled = false)
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  IPC_END_MESSAGE_MAP()
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return handled;
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TabContentsWrapper, NotificationObserver implementation:
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsWrapper::Observe(NotificationType type,
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 const NotificationSource& source,
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 const NotificationDetails& details) {
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (type.value) {
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case NotificationType::BOOKMARK_MODEL_LOADED:
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // BookmarkModel finished loading, fall through to update starred state.
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case NotificationType::URLS_STARRED: {
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Somewhere, a URL has been starred.
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // Ignore notifications for profiles other than our current one.
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      Profile* source_profile = Source<Profile>(source).ptr();
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (!source_profile || !source_profile->IsSameProfile(profile()))
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        return;
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      UpdateStarredStateForCurrentURL();
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    default:
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NOTREACHED();
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Internal helpers
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TabContentsWrapper::OnPageContents(const GURL& url,
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        int32 page_id,
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const string16& contents) {
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Don't index any https pages. People generally don't want their bank
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // accounts, etc. indexed on their computer, especially since some of these
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // things are not marked cachable.
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(brettw) we may want to consider more elaborate heuristics such as
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the cachability of the page. We may also want to consider subframes (this
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // test will still index subframes if the subframe is SSL).
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(zelidrag) bug chromium-os:2808 - figure out if we want to reenable
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // content indexing for chromeos in some future releases.
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if !defined(OS_CHROMEOS)
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!url.SchemeIsSecure()) {
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Profile* p = profile();
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (p && !p->IsOffTheRecord()) {
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      HistoryService* hs = p->GetHistoryService(Profile::IMPLICIT_ACCESS);
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (hs)
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        hs->SetPageContents(url, contents);
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TabContentsWrapper::OnJSOutOfMemory() {
287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab_contents()->AddInfoBar(new SimpleAlertInfoBarDelegate(tab_contents(),
288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NULL, l10n_util::GetStringUTF16(IDS_JS_OUT_OF_MEMORY_PROMPT), true));
289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TabContentsWrapper::OnRegisterProtocolHandler(const std::string& protocol,
292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                   const GURL& url,
293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                   const string16& title) {
294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ProtocolHandlerRegistry* registry = profile()->GetProtocolHandlerRegistry();
295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ProtocolHandler* handler =
296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ProtocolHandler::CreateProtocolHandler(protocol, url, title);
297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if ((handler != NULL) &&
298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      registry->CanSchemeBeOverridden(handler->protocol())) {
299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    tab_contents()->AddInfoBar(registry->IsAlreadyRegistered(handler) ?
300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      static_cast<InfoBarDelegate*>(new SimpleAlertInfoBarDelegate(
301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          tab_contents(), NULL, l10n_util::GetStringFUTF16(
302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen              IDS_REGISTER_PROTOCOL_HANDLER_ALREADY_REGISTERED,
303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen              handler->title(), UTF8ToUTF16(handler->protocol())), true)) :
304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      new RegisterProtocolHandlerInfoBarDelegate(tab_contents(), registry,
305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 handler));
306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid TabContentsWrapper::OnMsgThumbnail(const GURL& url,
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const ThumbnailScore& score,
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const SkBitmap& bitmap) {
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (profile()->IsOffTheRecord())
313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Tell History about this thumbnail
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  history::TopSites* ts = profile()->GetTopSites();
317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (ts)
318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ts->SetPageThumbnail(url, bitmap, score);
319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid TabContentsWrapper::UpdateStarredStateForCurrentURL() {
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BookmarkModel* model = tab_contents()->profile()->GetBookmarkModel();
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const bool old_state = is_starred_;
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  is_starred_ = (model && model->IsBookmarked(tab_contents()->GetURL()));
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (is_starred_ != old_state && delegate())
32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    delegate()->URLStarredChanged(this, is_starred_);
328201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
329