OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 5 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
6 | 6 |
7 #include "base/utf_string_conversions.h" | |
8 | |
9 #include "base/command_line.h" | 7 #include "base/command_line.h" |
10 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
11 #include "base/stringprintf.h" | |
12 #include "chrome/browser/autocomplete_history_manager.h" | 9 #include "chrome/browser/autocomplete_history_manager.h" |
13 #include "chrome/browser/autofill/autofill_external_delegate.h" | 10 #include "chrome/browser/autofill/autofill_external_delegate.h" |
14 #include "chrome/browser/autofill/autofill_manager.h" | 11 #include "chrome/browser/autofill/autofill_manager.h" |
15 #include "chrome/browser/automation/automation_tab_helper.h" | 12 #include "chrome/browser/automation/automation_tab_helper.h" |
16 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
17 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | 14 #include "chrome/browser/content_settings/tab_specific_content_settings.h" |
18 #include "chrome/browser/download/download_request_limiter_observer.h" | 15 #include "chrome/browser/download/download_request_limiter_observer.h" |
19 #include "chrome/browser/extensions/extension_tab_helper.h" | 16 #include "chrome/browser/extensions/extension_tab_helper.h" |
20 #include "chrome/browser/extensions/extension_webnavigation_api.h" | 17 #include "chrome/browser/extensions/extension_webnavigation_api.h" |
21 #include "chrome/browser/external_protocol/external_protocol_observer.h" | 18 #include "chrome/browser/external_protocol/external_protocol_observer.h" |
22 #include "chrome/browser/favicon/favicon_tab_helper.h" | 19 #include "chrome/browser/favicon/favicon_tab_helper.h" |
23 #include "chrome/browser/google/google_util.h" | 20 #include "chrome/browser/google/google_util.h" |
24 #include "chrome/browser/history/history_tab_helper.h" | 21 #include "chrome/browser/history/history_tab_helper.h" |
25 #include "chrome/browser/infobars/infobar_tab_helper.h" | 22 #include "chrome/browser/infobars/infobar_tab_helper.h" |
26 #include "chrome/browser/omnibox_search_hint.h" | 23 #include "chrome/browser/omnibox_search_hint.h" |
27 #include "chrome/browser/password_manager/password_manager.h" | 24 #include "chrome/browser/password_manager/password_manager.h" |
28 #include "chrome/browser/password_manager_delegate_impl.h" | 25 #include "chrome/browser/password_manager_delegate_impl.h" |
29 #include "chrome/browser/pdf_unsupported_feature.h" | 26 #include "chrome/browser/pdf_unsupported_feature.h" |
30 #include "chrome/browser/plugin_observer.h" | 27 #include "chrome/browser/plugin_observer.h" |
31 #include "chrome/browser/prefs/pref_service.h" | 28 #include "chrome/browser/prefs/pref_service.h" |
32 #include "chrome/browser/prerender/prerender_tab_helper.h" | 29 #include "chrome/browser/prerender/prerender_tab_helper.h" |
33 #include "chrome/browser/printing/print_preview_message_handler.h" | 30 #include "chrome/browser/printing/print_preview_message_handler.h" |
34 #include "chrome/browser/printing/print_view_manager.h" | 31 #include "chrome/browser/printing/print_view_manager.h" |
| 32 #include "chrome/browser/profiles/profile.h" |
35 #include "chrome/browser/renderer_host/web_cache_manager.h" | 33 #include "chrome/browser/renderer_host/web_cache_manager.h" |
36 #include "chrome/browser/renderer_preferences_util.h" | |
37 #include "chrome/browser/sessions/restore_tab_helper.h" | 34 #include "chrome/browser/sessions/restore_tab_helper.h" |
38 #include "chrome/browser/safe_browsing/client_side_detection_host.h" | 35 #include "chrome/browser/safe_browsing/client_side_detection_host.h" |
39 #include "chrome/browser/tab_contents/tab_contents_ssl_helper.h" | 36 #include "chrome/browser/tab_contents/tab_contents_ssl_helper.h" |
40 #include "chrome/browser/tab_contents/thumbnail_generator.h" | 37 #include "chrome/browser/tab_contents/thumbnail_generator.h" |
41 #include "chrome/browser/themes/theme_service.h" | |
42 #include "chrome/browser/themes/theme_service_factory.h" | |
43 #include "chrome/browser/translate/translate_tab_helper.h" | 38 #include "chrome/browser/translate/translate_tab_helper.h" |
44 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" | 39 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" |
45 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | 40 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" |
46 #include "chrome/browser/ui/constrained_window_tab_helper.h" | 41 #include "chrome/browser/ui/constrained_window_tab_helper.h" |
47 #include "chrome/browser/ui/find_bar/find_tab_helper.h" | 42 #include "chrome/browser/ui/find_bar/find_tab_helper.h" |
48 #include "chrome/browser/ui/intents/web_intent_picker_factory_impl.h" | 43 #include "chrome/browser/ui/intents/web_intent_picker_factory_impl.h" |
49 #include "chrome/browser/ui/intents/web_intent_picker_controller.h" | 44 #include "chrome/browser/ui/intents/web_intent_picker_controller.h" |
| 45 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
50 #include "chrome/browser/ui/sad_tab_observer.h" | 46 #include "chrome/browser/ui/sad_tab_observer.h" |
51 #include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" | 47 #include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" |
52 #include "chrome/browser/ui/sync/tab_contents_wrapper_synced_tab_delegate.h" | 48 #include "chrome/browser/ui/sync/tab_contents_wrapper_synced_tab_delegate.h" |
53 #include "chrome/browser/ui/tab_contents/per_tab_prefs_tab_helper.h" | |
54 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" | |
55 #include "chrome/common/chrome_notification_types.h" | 49 #include "chrome/common/chrome_notification_types.h" |
56 #include "chrome/common/chrome_switches.h" | 50 #include "chrome/common/chrome_switches.h" |
57 #include "chrome/common/pref_names.h" | 51 #include "chrome/common/pref_names.h" |
58 #include "chrome/common/render_messages.h" | 52 #include "chrome/common/render_messages.h" |
59 #include "content/browser/renderer_host/render_view_host.h" | 53 #include "content/browser/renderer_host/render_view_host.h" |
60 #include "content/browser/tab_contents/tab_contents_view.h" | 54 #include "content/public/browser/notification_details.h" |
61 #include "content/public/browser/notification_service.h" | 55 #include "content/public/browser/notification_service.h" |
62 #include "grit/generated_resources.h" | 56 #include "grit/generated_resources.h" |
63 #include "grit/locale_settings.h" | 57 #include "grit/locale_settings.h" |
64 #include "grit/platform_locale_settings.h" | 58 #include "grit/platform_locale_settings.h" |
65 #include "ui/base/l10n/l10n_util.h" | 59 #include "ui/base/l10n/l10n_util.h" |
66 #include "webkit/glue/webpreferences.h" | |
67 | 60 |
68 namespace { | 61 namespace { |
69 | 62 |
70 static base::LazyInstance<base::PropertyAccessor<TabContentsWrapper*> > | 63 static base::LazyInstance<base::PropertyAccessor<TabContentsWrapper*> > |
71 g_tab_contents_wrapper_property_accessor = LAZY_INSTANCE_INITIALIZER; | 64 g_tab_contents_wrapper_property_accessor = LAZY_INSTANCE_INITIALIZER; |
72 | 65 |
73 // The list of prefs we want to observe. | 66 // The list of prefs we want to observe. |
74 const char* kPrefsToObserve[] = { | 67 const char* kPrefsToObserve[] = { |
75 prefs::kAlternateErrorPagesEnabled, | 68 prefs::kAlternateErrorPagesEnabled, |
76 prefs::kDefaultCharset, | |
77 prefs::kDefaultZoomLevel, | 69 prefs::kDefaultZoomLevel, |
78 prefs::kEnableReferrers, | |
79 #if defined (ENABLE_SAFE_BROWSING) | 70 #if defined (ENABLE_SAFE_BROWSING) |
80 prefs::kSafeBrowsingEnabled, | 71 prefs::kSafeBrowsingEnabled, |
81 #endif | 72 #endif |
82 prefs::kWebKitAllowDisplayingInsecureContent, | |
83 prefs::kWebKitAllowRunningInsecureContent, | |
84 prefs::kWebKitCursiveFontFamily, | |
85 prefs::kWebKitDefaultFixedFontSize, | |
86 prefs::kWebKitDefaultFontSize, | |
87 prefs::kWebKitFantasyFontFamily, | |
88 prefs::kWebKitFixedFontFamily, | |
89 prefs::kWebKitGlobalJavascriptEnabled, | |
90 prefs::kWebKitJavaEnabled, | |
91 prefs::kWebKitLoadsImagesAutomatically, | |
92 prefs::kWebKitMinimumFontSize, | |
93 prefs::kWebKitMinimumLogicalFontSize, | |
94 prefs::kWebKitPluginsEnabled, | |
95 prefs::kWebKitSansSerifFontFamily, | |
96 prefs::kWebKitSerifFontFamily, | |
97 prefs::kWebKitStandardFontFamily, | |
98 prefs::kWebkitTabsToLinks, | |
99 prefs::kWebKitUsesUniversalDetector | |
100 }; | 73 }; |
101 | 74 |
102 const int kPrefsToObserveLength = arraysize(kPrefsToObserve); | 75 const int kPrefsToObserveLength = arraysize(kPrefsToObserve); |
103 | 76 |
104 // Registers a preference under the path |map_name| for each script used for | |
105 // per-script font prefs. For example, if |map_name| is "fonts.serif", then | |
106 // "fonts.serif.Arab", "fonts.serif.Hang", etc. are registered. | |
107 void RegisterFontFamilyMap(PrefService* prefs, const char* map_name) { | |
108 for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) { | |
109 const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i]; | |
110 std::string pref_name_str = base::StringPrintf("%s.%s", map_name, script); | |
111 const char* pref_name = pref_name_str.c_str(); | |
112 if (!prefs->FindPreference(pref_name)) | |
113 prefs->RegisterStringPref(pref_name, "", PrefService::UNSYNCABLE_PREF); | |
114 } | |
115 } | |
116 | |
117 // Registers |obs| to observe per-script font prefs under the path |map_name|. | |
118 void RegisterFontFamilyMapObserver(PrefChangeRegistrar* registrar, | |
119 const char* map_name, | |
120 content::NotificationObserver* obs) { | |
121 for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) { | |
122 const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i]; | |
123 std::string pref_name = base::StringPrintf("%s.%s", map_name, script); | |
124 registrar->Add(pref_name.c_str(), obs); | |
125 } | |
126 } | |
127 | |
128 struct PerScriptFontDefault { | |
129 const char* pref_name; | |
130 int resource_id; | |
131 const char* native_locale; | |
132 }; | |
133 | |
134 // Per-script font pref defaults. The prefs that have defaults vary by | |
135 // platform, since not all platforms have fonts for all scripts for all generic | |
136 // families. | |
137 // TODO(falken): add proper defaults when possible for all | |
138 // platforms/scripts/generic families. | |
139 const PerScriptFontDefault kPerScriptFontDefaults[] = { | |
140 #if defined(OS_CHROMEOS) | |
141 { prefs::kWebKitStandardFontFamilyArabic, IDS_STANDARD_FONT_FAMILY_ARABIC, | |
142 "ar" }, | |
143 { prefs::kWebKitSerifFontFamilyArabic, IDS_SERIF_FONT_FAMILY_ARABIC, "ar" }, | |
144 { prefs::kWebKitSansSerifFontFamilyArabic, | |
145 IDS_SANS_SERIF_FONT_FAMILY_ARABIC, "ar" }, | |
146 { prefs::kWebKitStandardFontFamilyJapanese, | |
147 IDS_STANDARD_FONT_FAMILY_JAPANESE, "ja" }, | |
148 { prefs::kWebKitFixedFontFamilyJapanese, IDS_FIXED_FONT_FAMILY_JAPANESE, | |
149 "ja" }, | |
150 { prefs::kWebKitSerifFontFamilyJapanese, IDS_SERIF_FONT_FAMILY_JAPANESE, | |
151 "ja" }, | |
152 { prefs::kWebKitSansSerifFontFamilyJapanese, | |
153 IDS_SANS_SERIF_FONT_FAMILY_JAPANESE, "ja" }, | |
154 { prefs::kWebKitStandardFontFamilyKorean, IDS_STANDARD_FONT_FAMILY_KOREAN, | |
155 "ko" }, | |
156 { prefs::kWebKitFixedFontFamilyKorean, IDS_FIXED_FONT_FAMILY_KOREAN, "ko" }, | |
157 { prefs::kWebKitSerifFontFamilyKorean, IDS_SERIF_FONT_FAMILY_KOREAN, "ko" }, | |
158 { prefs::kWebKitSansSerifFontFamilyKorean, | |
159 IDS_SANS_SERIF_FONT_FAMILY_KOREAN, "ko" }, | |
160 { prefs::kWebKitStandardFontFamilySimplifiedHan, | |
161 IDS_STANDARD_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
162 { prefs::kWebKitFixedFontFamilySimplifiedHan, | |
163 IDS_FIXED_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
164 { prefs::kWebKitSerifFontFamilySimplifiedHan, | |
165 IDS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
166 { prefs::kWebKitSansSerifFontFamilySimplifiedHan, | |
167 IDS_SANS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
168 { prefs::kWebKitStandardFontFamilyTraditionalHan, | |
169 IDS_STANDARD_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
170 { prefs::kWebKitFixedFontFamilyTraditionalHan, | |
171 IDS_FIXED_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
172 { prefs::kWebKitSerifFontFamilyTraditionalHan, | |
173 IDS_SERIF_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
174 { prefs::kWebKitSansSerifFontFamilyTraditionalHan, | |
175 IDS_SANS_SERIF_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" } | |
176 #elif defined(OS_MACOSX) | |
177 { prefs::kWebKitStandardFontFamilyJapanese, | |
178 IDS_STANDARD_FONT_FAMILY_JAPANESE, "ja" }, | |
179 { prefs::kWebKitFixedFontFamilyJapanese, IDS_FIXED_FONT_FAMILY_JAPANESE, | |
180 "ja" }, | |
181 { prefs::kWebKitSerifFontFamilyJapanese, IDS_SERIF_FONT_FAMILY_JAPANESE, | |
182 "ja" }, | |
183 { prefs::kWebKitSansSerifFontFamilyJapanese, | |
184 IDS_SANS_SERIF_FONT_FAMILY_JAPANESE, "ja" }, | |
185 { prefs::kWebKitStandardFontFamilyKorean, IDS_STANDARD_FONT_FAMILY_KOREAN, | |
186 "ko" }, | |
187 { prefs::kWebKitSerifFontFamilyKorean, IDS_SERIF_FONT_FAMILY_KOREAN, "ko" }, | |
188 { prefs::kWebKitSansSerifFontFamilyKorean, | |
189 IDS_SANS_SERIF_FONT_FAMILY_KOREAN, "ko" }, | |
190 { prefs::kWebKitStandardFontFamilySimplifiedHan, | |
191 IDS_STANDARD_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
192 { prefs::kWebKitSerifFontFamilySimplifiedHan, | |
193 IDS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
194 { prefs::kWebKitSansSerifFontFamilySimplifiedHan, | |
195 IDS_SANS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
196 { prefs::kWebKitStandardFontFamilyTraditionalHan, | |
197 IDS_STANDARD_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
198 { prefs::kWebKitSerifFontFamilyTraditionalHan, | |
199 IDS_SERIF_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
200 { prefs::kWebKitSansSerifFontFamilyTraditionalHan, | |
201 IDS_SANS_SERIF_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" } | |
202 #elif defined(OS_WIN) | |
203 { prefs::kWebKitStandardFontFamilyJapanese, | |
204 IDS_STANDARD_FONT_FAMILY_JAPANESE, "ja" }, | |
205 { prefs::kWebKitFixedFontFamilyJapanese, IDS_FIXED_FONT_FAMILY_JAPANESE, | |
206 "ja" }, | |
207 { prefs::kWebKitSerifFontFamilyJapanese, IDS_SERIF_FONT_FAMILY_JAPANESE, | |
208 "ja" }, | |
209 { prefs::kWebKitSansSerifFontFamilyJapanese, | |
210 IDS_SANS_SERIF_FONT_FAMILY_JAPANESE, "ja" }, | |
211 { prefs::kWebKitStandardFontFamilyKorean, IDS_STANDARD_FONT_FAMILY_KOREAN, | |
212 "ko" }, | |
213 { prefs::kWebKitFixedFontFamilyKorean, IDS_FIXED_FONT_FAMILY_KOREAN, "ko" }, | |
214 { prefs::kWebKitSerifFontFamilyKorean, IDS_SERIF_FONT_FAMILY_KOREAN, "ko" }, | |
215 { prefs::kWebKitSansSerifFontFamilyKorean, | |
216 IDS_SANS_SERIF_FONT_FAMILY_KOREAN, "ko" }, | |
217 { prefs::kWebKitCursiveFontFamilyKorean, IDS_CURSIVE_FONT_FAMILY_KOREAN, | |
218 "ko" }, | |
219 { prefs::kWebKitStandardFontFamilySimplifiedHan, | |
220 IDS_STANDARD_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
221 { prefs::kWebKitFixedFontFamilySimplifiedHan, | |
222 IDS_FIXED_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
223 { prefs::kWebKitSerifFontFamilySimplifiedHan, | |
224 IDS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
225 { prefs::kWebKitSansSerifFontFamilySimplifiedHan, | |
226 IDS_SANS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN, "zh-CN" }, | |
227 { prefs::kWebKitStandardFontFamilyTraditionalHan, | |
228 IDS_STANDARD_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
229 { prefs::kWebKitFixedFontFamilyTraditionalHan, | |
230 IDS_FIXED_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
231 { prefs::kWebKitSerifFontFamilyTraditionalHan, | |
232 IDS_SERIF_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" }, | |
233 { prefs::kWebKitSansSerifFontFamilyTraditionalHan, | |
234 IDS_SANS_SERIF_FONT_FAMILY_TRADITIONAL_HAN, "zh-TW" } | |
235 #endif | |
236 }; | |
237 | |
238 #if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN) | |
239 // To avoid Clang warning, only define kPerScriptFontDefaultsLength when it is | |
240 // non-zero. When it is zero, code like | |
241 // for (size_t i = 0; i < kPerScriptFontDefaultsLength; ++i) | |
242 // causes a warning due to comparison of unsigned expression < 0. | |
243 const size_t kPerScriptFontDefaultsLength = arraysize(kPerScriptFontDefaults); | |
244 #endif | |
245 | |
246 } // namespace | 77 } // namespace |
247 | 78 |
248 //////////////////////////////////////////////////////////////////////////////// | 79 //////////////////////////////////////////////////////////////////////////////// |
249 // TabContentsWrapper, public: | 80 // TabContentsWrapper, public: |
250 | 81 |
251 TabContentsWrapper::TabContentsWrapper(TabContents* contents) | 82 TabContentsWrapper::TabContentsWrapper(TabContents* contents) |
252 : TabContentsObserver(contents), | 83 : TabContentsObserver(contents), |
253 delegate_(NULL), | 84 delegate_(NULL), |
254 in_destructor_(false), | 85 in_destructor_(false), |
255 tab_contents_(contents) { | 86 tab_contents_(contents) { |
256 DCHECK(contents); | 87 DCHECK(contents); |
257 DCHECK(!GetCurrentWrapperForContents(contents)); | 88 DCHECK(!GetCurrentWrapperForContents(contents)); |
258 // Stash this in the property bag so it can be retrieved without having to | 89 // Stash this in the property bag so it can be retrieved without having to |
259 // go to a Browser. | 90 // go to a Browser. |
260 property_accessor()->SetProperty(contents->property_bag(), this); | 91 property_accessor()->SetProperty(contents->property_bag(), this); |
261 | 92 |
| 93 PrefService* prefs = profile()->GetPrefs(); |
| 94 pref_change_registrar_.Init(prefs); |
| 95 if (prefs) { |
| 96 for (int i = 0; i < kPrefsToObserveLength; ++i) |
| 97 pref_change_registrar_.Add(kPrefsToObserve[i], this); |
| 98 } |
| 99 |
262 // Create the tab helpers. | 100 // Create the tab helpers. |
263 autocomplete_history_manager_.reset(new AutocompleteHistoryManager(contents)); | 101 autocomplete_history_manager_.reset(new AutocompleteHistoryManager(contents)); |
264 autofill_manager_ = new AutofillManager(this); | 102 autofill_manager_ = new AutofillManager(this); |
265 if (CommandLine::ForCurrentProcess()->HasSwitch( | 103 if (CommandLine::ForCurrentProcess()->HasSwitch( |
266 switches::kExternalAutofillPopup)) { | 104 switches::kExternalAutofillPopup)) { |
267 autofill_external_delegate_.reset( | 105 autofill_external_delegate_.reset( |
268 AutofillExternalDelegate::Create(this, autofill_manager_.get())); | 106 AutofillExternalDelegate::Create(this, autofill_manager_.get())); |
269 autofill_manager_->SetExternalDelegate(autofill_external_delegate_.get()); | 107 autofill_manager_->SetExternalDelegate(autofill_external_delegate_.get()); |
270 autocomplete_history_manager_->SetExternalDelegate( | 108 autocomplete_history_manager_->SetExternalDelegate( |
271 autofill_external_delegate_.get()); | 109 autofill_external_delegate_.get()); |
272 } | 110 } |
273 automation_tab_helper_.reset(new AutomationTabHelper(contents)); | 111 automation_tab_helper_.reset(new AutomationTabHelper(contents)); |
274 blocked_content_tab_helper_.reset(new BlockedContentTabHelper(this)); | 112 blocked_content_tab_helper_.reset(new BlockedContentTabHelper(this)); |
275 bookmark_tab_helper_.reset(new BookmarkTabHelper(this)); | 113 bookmark_tab_helper_.reset(new BookmarkTabHelper(this)); |
276 constrained_window_tab_helper_.reset(new ConstrainedWindowTabHelper(this)); | 114 constrained_window_tab_helper_.reset(new ConstrainedWindowTabHelper(this)); |
277 extension_tab_helper_.reset(new ExtensionTabHelper(this)); | 115 extension_tab_helper_.reset(new ExtensionTabHelper(this)); |
278 favicon_tab_helper_.reset(new FaviconTabHelper(contents)); | 116 favicon_tab_helper_.reset(new FaviconTabHelper(contents)); |
279 find_tab_helper_.reset(new FindTabHelper(contents)); | 117 find_tab_helper_.reset(new FindTabHelper(contents)); |
280 history_tab_helper_.reset(new HistoryTabHelper(contents)); | 118 history_tab_helper_.reset(new HistoryTabHelper(contents)); |
281 infobar_tab_helper_.reset(new InfoBarTabHelper(contents)); | 119 infobar_tab_helper_.reset(new InfoBarTabHelper(contents)); |
282 password_manager_delegate_.reset(new PasswordManagerDelegateImpl(this)); | 120 password_manager_delegate_.reset(new PasswordManagerDelegateImpl(this)); |
283 password_manager_.reset( | 121 password_manager_.reset( |
284 new PasswordManager(contents, password_manager_delegate_.get())); | 122 new PasswordManager(contents, password_manager_delegate_.get())); |
285 per_tab_prefs_tab_helper_.reset(new PerTabPrefsTabHelper(this)); | 123 prefs_tab_helper_.reset(new PrefsTabHelper(this)); |
286 prerender_tab_helper_.reset(new prerender::PrerenderTabHelper(this)); | 124 prerender_tab_helper_.reset(new prerender::PrerenderTabHelper(this)); |
287 print_view_manager_.reset(new printing::PrintViewManager(this)); | 125 print_view_manager_.reset(new printing::PrintViewManager(this)); |
288 restore_tab_helper_.reset(new RestoreTabHelper(this)); | 126 restore_tab_helper_.reset(new RestoreTabHelper(this)); |
289 #if defined(ENABLE_SAFE_BROWSING) | 127 #if defined(ENABLE_SAFE_BROWSING) |
290 if (profile()->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && | 128 if (profile()->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && |
291 g_browser_process->safe_browsing_detection_service()) { | 129 g_browser_process->safe_browsing_detection_service()) { |
292 safebrowsing_detection_host_.reset( | 130 safebrowsing_detection_host_.reset( |
293 safe_browsing::ClientSideDetectionHost::Create(contents)); | 131 safe_browsing::ClientSideDetectionHost::Create(contents)); |
294 } | 132 } |
295 #endif | 133 #endif |
(...skipping 19 matching lines...) Expand all Loading... |
315 thumbnail_generation_observer_.reset(new ThumbnailGenerator); | 153 thumbnail_generation_observer_.reset(new ThumbnailGenerator); |
316 thumbnail_generation_observer_->StartThumbnailing(tab_contents_.get()); | 154 thumbnail_generation_observer_->StartThumbnailing(tab_contents_.get()); |
317 } | 155 } |
318 | 156 |
319 // Set-up the showing of the omnibox search infobar if applicable. | 157 // Set-up the showing of the omnibox search infobar if applicable. |
320 if (OmniboxSearchHint::IsEnabled(profile())) | 158 if (OmniboxSearchHint::IsEnabled(profile())) |
321 omnibox_search_hint_.reset(new OmniboxSearchHint(this)); | 159 omnibox_search_hint_.reset(new OmniboxSearchHint(this)); |
322 | 160 |
323 registrar_.Add(this, chrome::NOTIFICATION_GOOGLE_URL_UPDATED, | 161 registrar_.Add(this, chrome::NOTIFICATION_GOOGLE_URL_UPDATED, |
324 content::NotificationService::AllSources()); | 162 content::NotificationService::AllSources()); |
325 registrar_.Add(this, chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED, | |
326 content::NotificationService::AllSources()); | |
327 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
328 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | |
329 content::Source<ThemeService>( | |
330 ThemeServiceFactory::GetForProfile(profile()))); | |
331 #endif | |
332 | |
333 // Register for notifications about all interested prefs change. | |
334 PrefService* prefs = profile()->GetPrefs(); | |
335 pref_change_registrar_.Init(prefs); | |
336 if (prefs) { | |
337 for (int i = 0; i < kPrefsToObserveLength; ++i) | |
338 pref_change_registrar_.Add(kPrefsToObserve[i], this); | |
339 | |
340 RegisterFontFamilyMapObserver(&pref_change_registrar_, | |
341 prefs::kWebKitStandardFontFamilyMap, this); | |
342 RegisterFontFamilyMapObserver(&pref_change_registrar_, | |
343 prefs::kWebKitFixedFontFamilyMap, this); | |
344 RegisterFontFamilyMapObserver(&pref_change_registrar_, | |
345 prefs::kWebKitSerifFontFamilyMap, this); | |
346 RegisterFontFamilyMapObserver(&pref_change_registrar_, | |
347 prefs::kWebKitSansSerifFontFamilyMap, this); | |
348 RegisterFontFamilyMapObserver(&pref_change_registrar_, | |
349 prefs::kWebKitCursiveFontFamilyMap, this); | |
350 RegisterFontFamilyMapObserver(&pref_change_registrar_, | |
351 prefs::kWebKitFantasyFontFamilyMap, this); | |
352 } | |
353 | |
354 renderer_preferences_util::UpdateFromSystemSettings( | |
355 tab_contents()->GetMutableRendererPrefs(), profile()); | |
356 } | 163 } |
357 | 164 |
358 TabContentsWrapper::~TabContentsWrapper() { | 165 TabContentsWrapper::~TabContentsWrapper() { |
359 in_destructor_ = true; | 166 in_destructor_ = true; |
360 | 167 |
361 // Need to tear down infobars before the TabContents goes away. | 168 // Need to tear down infobars before the TabContents goes away. |
362 infobar_tab_helper_.reset(); | 169 infobar_tab_helper_.reset(); |
363 } | 170 } |
364 | 171 |
365 base::PropertyAccessor<TabContentsWrapper*>* | 172 base::PropertyAccessor<TabContentsWrapper*>* |
366 TabContentsWrapper::property_accessor() { | 173 TabContentsWrapper::property_accessor() { |
367 return g_tab_contents_wrapper_property_accessor.Pointer(); | 174 return g_tab_contents_wrapper_property_accessor.Pointer(); |
368 } | 175 } |
369 | 176 |
370 // static | |
371 void TabContentsWrapper::RegisterUserPrefs(PrefService* prefs) { | 177 void TabContentsWrapper::RegisterUserPrefs(PrefService* prefs) { |
372 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, | 178 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, |
373 true, | 179 true, |
374 PrefService::SYNCABLE_PREF); | 180 PrefService::SYNCABLE_PREF); |
375 | |
376 WebPreferences pref_defaults; | |
377 prefs->RegisterBooleanPref(prefs::kWebKitGlobalJavascriptEnabled, | |
378 pref_defaults.javascript_enabled, | |
379 PrefService::UNSYNCABLE_PREF); | |
380 prefs->RegisterBooleanPref(prefs::kWebKitWebSecurityEnabled, | |
381 pref_defaults.web_security_enabled, | |
382 PrefService::UNSYNCABLE_PREF); | |
383 prefs->RegisterBooleanPref( | |
384 prefs::kWebKitJavascriptCanOpenWindowsAutomatically, | |
385 true, | |
386 PrefService::UNSYNCABLE_PREF); | |
387 prefs->RegisterBooleanPref(prefs::kWebKitLoadsImagesAutomatically, | |
388 pref_defaults.loads_images_automatically, | |
389 PrefService::UNSYNCABLE_PREF); | |
390 prefs->RegisterBooleanPref(prefs::kWebKitPluginsEnabled, | |
391 pref_defaults.plugins_enabled, | |
392 PrefService::UNSYNCABLE_PREF); | |
393 prefs->RegisterBooleanPref(prefs::kWebKitDomPasteEnabled, | |
394 pref_defaults.dom_paste_enabled, | |
395 PrefService::UNSYNCABLE_PREF); | |
396 prefs->RegisterBooleanPref(prefs::kWebKitShrinksStandaloneImagesToFit, | |
397 pref_defaults.shrinks_standalone_images_to_fit, | |
398 PrefService::UNSYNCABLE_PREF); | |
399 prefs->RegisterDictionaryPref(prefs::kWebKitInspectorSettings, | |
400 PrefService::UNSYNCABLE_PREF); | |
401 prefs->RegisterBooleanPref(prefs::kWebKitTextAreasAreResizable, | |
402 pref_defaults.text_areas_are_resizable, | |
403 PrefService::UNSYNCABLE_PREF); | |
404 prefs->RegisterBooleanPref(prefs::kWebKitJavaEnabled, | |
405 pref_defaults.java_enabled, | |
406 PrefService::UNSYNCABLE_PREF); | |
407 prefs->RegisterBooleanPref(prefs::kWebkitTabsToLinks, | |
408 pref_defaults.tabs_to_links, | |
409 PrefService::UNSYNCABLE_PREF); | |
410 prefs->RegisterBooleanPref(prefs::kWebKitAllowRunningInsecureContent, | |
411 false, | |
412 PrefService::UNSYNCABLE_PREF); | |
413 prefs->RegisterBooleanPref(prefs::kWebKitAllowDisplayingInsecureContent, | |
414 true, | |
415 PrefService::UNSYNCABLE_PREF); | |
416 | |
417 #if !defined(OS_MACOSX) | |
418 prefs->RegisterLocalizedStringPref(prefs::kAcceptLanguages, | |
419 IDS_ACCEPT_LANGUAGES, | |
420 PrefService::SYNCABLE_PREF); | |
421 #else | |
422 // Not used in OSX. | |
423 prefs->RegisterLocalizedStringPref(prefs::kAcceptLanguages, | |
424 IDS_ACCEPT_LANGUAGES, | |
425 PrefService::UNSYNCABLE_PREF); | |
426 #endif | |
427 prefs->RegisterLocalizedStringPref(prefs::kDefaultCharset, | |
428 IDS_DEFAULT_ENCODING, | |
429 PrefService::SYNCABLE_PREF); | |
430 prefs->RegisterLocalizedStringPref(prefs::kWebKitStandardFontFamily, | |
431 IDS_STANDARD_FONT_FAMILY, | |
432 PrefService::UNSYNCABLE_PREF); | |
433 prefs->RegisterLocalizedStringPref(prefs::kWebKitFixedFontFamily, | |
434 IDS_FIXED_FONT_FAMILY, | |
435 PrefService::UNSYNCABLE_PREF); | |
436 prefs->RegisterLocalizedStringPref(prefs::kWebKitSerifFontFamily, | |
437 IDS_SERIF_FONT_FAMILY, | |
438 PrefService::UNSYNCABLE_PREF); | |
439 prefs->RegisterLocalizedStringPref(prefs::kWebKitSansSerifFontFamily, | |
440 IDS_SANS_SERIF_FONT_FAMILY, | |
441 PrefService::UNSYNCABLE_PREF); | |
442 prefs->RegisterLocalizedStringPref(prefs::kWebKitCursiveFontFamily, | |
443 IDS_CURSIVE_FONT_FAMILY, | |
444 PrefService::UNSYNCABLE_PREF); | |
445 prefs->RegisterLocalizedStringPref(prefs::kWebKitFantasyFontFamily, | |
446 IDS_FANTASY_FONT_FAMILY, | |
447 PrefService::UNSYNCABLE_PREF); | |
448 | |
449 // Register per-script font prefs that have defaults. | |
450 #if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN) | |
451 // As explained by its definition, kPerScriptFontDefaultsLength is only | |
452 // defined for platforms where it would be non-zero. | |
453 std::string locale = g_browser_process->GetApplicationLocale(); | |
454 for (size_t i = 0; i < kPerScriptFontDefaultsLength; ++i) { | |
455 const PerScriptFontDefault& pref = kPerScriptFontDefaults[i]; | |
456 // Suppress default per-script font when the script matches the browser's | |
457 // locale. Otherwise, the default would override the user's preferences | |
458 // when viewing pages in their native language. This can be removed when | |
459 // per-script fonts are added to Preferences UI. | |
460 if (!StartsWithASCII(locale, pref.native_locale, false)) { | |
461 prefs->RegisterLocalizedStringPref(pref.pref_name, | |
462 pref.resource_id, | |
463 PrefService::UNSYNCABLE_PREF); | |
464 } | |
465 } | |
466 #endif | |
467 | |
468 // Register the rest of the per-script font prefs. | |
469 RegisterFontFamilyMap(prefs, prefs::kWebKitStandardFontFamilyMap); | |
470 RegisterFontFamilyMap(prefs, prefs::kWebKitFixedFontFamilyMap); | |
471 RegisterFontFamilyMap(prefs, prefs::kWebKitSerifFontFamilyMap); | |
472 RegisterFontFamilyMap(prefs, prefs::kWebKitSansSerifFontFamilyMap); | |
473 RegisterFontFamilyMap(prefs, prefs::kWebKitCursiveFontFamilyMap); | |
474 RegisterFontFamilyMap(prefs, prefs::kWebKitFantasyFontFamilyMap); | |
475 | |
476 prefs->RegisterLocalizedIntegerPref(prefs::kWebKitDefaultFontSize, | |
477 IDS_DEFAULT_FONT_SIZE, | |
478 PrefService::UNSYNCABLE_PREF); | |
479 prefs->RegisterLocalizedIntegerPref(prefs::kWebKitDefaultFixedFontSize, | |
480 IDS_DEFAULT_FIXED_FONT_SIZE, | |
481 PrefService::UNSYNCABLE_PREF); | |
482 prefs->RegisterLocalizedIntegerPref(prefs::kWebKitMinimumFontSize, | |
483 IDS_MINIMUM_FONT_SIZE, | |
484 PrefService::UNSYNCABLE_PREF); | |
485 prefs->RegisterLocalizedIntegerPref(prefs::kWebKitMinimumLogicalFontSize, | |
486 IDS_MINIMUM_LOGICAL_FONT_SIZE, | |
487 PrefService::UNSYNCABLE_PREF); | |
488 prefs->RegisterLocalizedBooleanPref(prefs::kWebKitUsesUniversalDetector, | |
489 IDS_USES_UNIVERSAL_DETECTOR, | |
490 PrefService::SYNCABLE_PREF); | |
491 prefs->RegisterLocalizedStringPref(prefs::kStaticEncodings, | |
492 IDS_STATIC_ENCODING_LIST, | |
493 PrefService::UNSYNCABLE_PREF); | |
494 prefs->RegisterStringPref(prefs::kRecentlySelectedEncoding, | |
495 "", | |
496 PrefService::UNSYNCABLE_PREF); | |
497 } | 181 } |
498 | 182 |
499 string16 TabContentsWrapper::GetDefaultTitle() { | 183 string16 TabContentsWrapper::GetDefaultTitle() { |
500 return l10n_util::GetStringUTF16(IDS_DEFAULT_TAB_TITLE); | 184 return l10n_util::GetStringUTF16(IDS_DEFAULT_TAB_TITLE); |
501 } | 185 } |
502 | 186 |
503 string16 TabContentsWrapper::GetStatusText() const { | 187 string16 TabContentsWrapper::GetStatusText() const { |
504 if (!tab_contents()->IsLoading() || | 188 if (!tab_contents()->IsLoading() || |
505 tab_contents()->load_state().state == net::LOAD_STATE_IDLE) { | 189 tab_contents()->load_state().state == net::LOAD_STATE_IDLE) { |
506 return string16(); | 190 return string16(); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 DCHECK(in_destructor_); | 297 DCHECK(in_destructor_); |
614 } | 298 } |
615 | 299 |
616 void TabContentsWrapper::Observe(int type, | 300 void TabContentsWrapper::Observe(int type, |
617 const content::NotificationSource& source, | 301 const content::NotificationSource& source, |
618 const content::NotificationDetails& details) { | 302 const content::NotificationDetails& details) { |
619 switch (type) { | 303 switch (type) { |
620 case chrome::NOTIFICATION_GOOGLE_URL_UPDATED: | 304 case chrome::NOTIFICATION_GOOGLE_URL_UPDATED: |
621 UpdateAlternateErrorPageURL(render_view_host()); | 305 UpdateAlternateErrorPageURL(render_view_host()); |
622 break; | 306 break; |
623 case chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED: | |
624 UpdateWebPreferences(); | |
625 break; | |
626 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
627 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: { | |
628 UpdateRendererPreferences(); | |
629 break; | |
630 } | |
631 #endif | |
632 case chrome::NOTIFICATION_PREF_CHANGED: { | 307 case chrome::NOTIFICATION_PREF_CHANGED: { |
633 std::string* pref_name_in = content::Details<std::string>(details).ptr(); | 308 std::string* pref_name_in = content::Details<std::string>(details).ptr(); |
634 DCHECK(content::Source<PrefService>(source).ptr() == | 309 DCHECK(content::Source<PrefService>(source).ptr() == |
635 profile()->GetPrefs() || | 310 profile()->GetPrefs()); |
636 content::Source<PrefService>(source).ptr() == | |
637 per_tab_prefs_tab_helper_->prefs()); | |
638 if (*pref_name_in == prefs::kAlternateErrorPagesEnabled) { | 311 if (*pref_name_in == prefs::kAlternateErrorPagesEnabled) { |
639 UpdateAlternateErrorPageURL(render_view_host()); | 312 UpdateAlternateErrorPageURL(render_view_host()); |
640 } else if ((*pref_name_in == prefs::kDefaultCharset) || | |
641 StartsWithASCII(*pref_name_in, "webkit.webprefs.", true)) { | |
642 UpdateWebPreferences(); | |
643 } else if (*pref_name_in == prefs::kDefaultZoomLevel) { | 313 } else if (*pref_name_in == prefs::kDefaultZoomLevel) { |
644 tab_contents()->render_view_host()->SetZoomLevel( | 314 tab_contents()->render_view_host()->SetZoomLevel( |
645 tab_contents()->GetZoomLevel()); | 315 tab_contents()->GetZoomLevel()); |
646 } else if (*pref_name_in == prefs::kEnableReferrers) { | |
647 UpdateRendererPreferences(); | |
648 } else if (*pref_name_in == prefs::kSafeBrowsingEnabled) { | 316 } else if (*pref_name_in == prefs::kSafeBrowsingEnabled) { |
649 UpdateSafebrowsingDetectionHost(); | 317 UpdateSafebrowsingDetectionHost(); |
650 } else { | 318 } else { |
651 NOTREACHED() << "unexpected pref change notification" << *pref_name_in; | 319 NOTREACHED() << "unexpected pref change notification" << *pref_name_in; |
652 } | 320 } |
653 break; | 321 break; |
654 } | 322 } |
655 default: | 323 default: |
656 NOTREACHED(); | 324 NOTREACHED(); |
657 } | 325 } |
(...skipping 25 matching lines...) Expand all Loading... |
683 GURL(google_util::kLinkDoctorBaseURL)); | 351 GURL(google_util::kLinkDoctorBaseURL)); |
684 url = google_util::AppendGoogleTLDParam(url); | 352 url = google_util::AppendGoogleTLDParam(url); |
685 } | 353 } |
686 return url; | 354 return url; |
687 } | 355 } |
688 | 356 |
689 void TabContentsWrapper::UpdateAlternateErrorPageURL(RenderViewHost* rvh) { | 357 void TabContentsWrapper::UpdateAlternateErrorPageURL(RenderViewHost* rvh) { |
690 rvh->SetAltErrorPageURL(GetAlternateErrorPageURL()); | 358 rvh->SetAltErrorPageURL(GetAlternateErrorPageURL()); |
691 } | 359 } |
692 | 360 |
693 void TabContentsWrapper::UpdateWebPreferences() { | |
694 RenderViewHostDelegate* rvhd = tab_contents(); | |
695 WebPreferences prefs = rvhd->GetWebkitPrefs(); | |
696 per_tab_prefs_tab_helper_->OverrideWebPreferences(&prefs); | |
697 tab_contents()->render_view_host()->UpdateWebkitPreferences(prefs); | |
698 } | |
699 | |
700 void TabContentsWrapper::UpdateRendererPreferences() { | |
701 renderer_preferences_util::UpdateFromSystemSettings( | |
702 tab_contents()->GetMutableRendererPrefs(), profile()); | |
703 render_view_host()->SyncRendererPrefs(); | |
704 } | |
705 | |
706 void TabContentsWrapper::UpdateSafebrowsingDetectionHost() { | 361 void TabContentsWrapper::UpdateSafebrowsingDetectionHost() { |
707 #if defined(ENABLE_SAFE_BROWSING) | 362 #if defined(ENABLE_SAFE_BROWSING) |
708 PrefService* prefs = profile()->GetPrefs(); | 363 PrefService* prefs = profile()->GetPrefs(); |
709 bool safe_browsing = prefs->GetBoolean(prefs::kSafeBrowsingEnabled); | 364 bool safe_browsing = prefs->GetBoolean(prefs::kSafeBrowsingEnabled); |
710 if (safe_browsing && | 365 if (safe_browsing && |
711 g_browser_process->safe_browsing_detection_service()) { | 366 g_browser_process->safe_browsing_detection_service()) { |
712 if (!safebrowsing_detection_host_.get()) { | 367 if (!safebrowsing_detection_host_.get()) { |
713 safebrowsing_detection_host_.reset( | 368 safebrowsing_detection_host_.reset( |
714 safe_browsing::ClientSideDetectionHost::Create(tab_contents())); | 369 safe_browsing::ClientSideDetectionHost::Create(tab_contents())); |
715 } | 370 } |
716 } else { | 371 } else { |
717 safebrowsing_detection_host_.reset(); | 372 safebrowsing_detection_host_.reset(); |
718 } | 373 } |
719 render_view_host()->Send( | 374 render_view_host()->Send( |
720 new ChromeViewMsg_SetClientSidePhishingDetection(routing_id(), | 375 new ChromeViewMsg_SetClientSidePhishingDetection(routing_id(), |
721 safe_browsing)); | 376 safe_browsing)); |
722 #endif | 377 #endif |
723 } | 378 } |
724 | 379 |
725 void TabContentsWrapper::ExitFullscreenMode() { | 380 void TabContentsWrapper::ExitFullscreenMode() { |
726 if (tab_contents() && render_view_host()) | 381 if (tab_contents() && render_view_host()) |
727 tab_contents()->render_view_host()->ExitFullscreen(); | 382 tab_contents()->render_view_host()->ExitFullscreen(); |
728 } | 383 } |
OLD | NEW |