| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/profile.h" | 5 #include "chrome/browser/profile.h" |
| 6 | 6 |
| 7 #include "app/theme_provider.h" | 7 #include "app/theme_provider.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "chrome/browser/notifications/desktop_notification_service.h" | 31 #include "chrome/browser/notifications/desktop_notification_service.h" |
| 32 #include "chrome/browser/password_manager/password_store_default.h" | 32 #include "chrome/browser/password_manager/password_store_default.h" |
| 33 #include "chrome/browser/privacy_blacklist/blacklist_io.h" | 33 #include "chrome/browser/privacy_blacklist/blacklist_io.h" |
| 34 #include "chrome/browser/profile_manager.h" | 34 #include "chrome/browser/profile_manager.h" |
| 35 #include "chrome/browser/renderer_host/render_process_host.h" | 35 #include "chrome/browser/renderer_host/render_process_host.h" |
| 36 #include "chrome/browser/search_versus_navigate_classifier.h" | 36 #include "chrome/browser/search_versus_navigate_classifier.h" |
| 37 #include "chrome/browser/search_engines/template_url_fetcher.h" | 37 #include "chrome/browser/search_engines/template_url_fetcher.h" |
| 38 #include "chrome/browser/search_engines/template_url_model.h" | 38 #include "chrome/browser/search_engines/template_url_model.h" |
| 39 #include "chrome/browser/sessions/session_service.h" | 39 #include "chrome/browser/sessions/session_service.h" |
| 40 #include "chrome/browser/sessions/tab_restore_service.h" | 40 #include "chrome/browser/sessions/tab_restore_service.h" |
| 41 #include "chrome/browser/spellchecker.h" | |
| 42 #include "chrome/browser/ssl/ssl_host_state.h" | 41 #include "chrome/browser/ssl/ssl_host_state.h" |
| 43 #include "chrome/browser/sync/profile_sync_service.h" | 42 #include "chrome/browser/sync/profile_sync_service.h" |
| 44 #include "chrome/browser/thumbnail_store.h" | 43 #include "chrome/browser/thumbnail_store.h" |
| 45 #include "chrome/browser/visitedlink_master.h" | 44 #include "chrome/browser/visitedlink_master.h" |
| 46 #include "chrome/browser/visitedlink_event_listener.h" | 45 #include "chrome/browser/visitedlink_event_listener.h" |
| 47 #include "chrome/browser/webdata/web_data_service.h" | 46 #include "chrome/browser/webdata/web_data_service.h" |
| 48 #include "chrome/common/appcache/chrome_appcache_service.h" | 47 #include "chrome/common/appcache/chrome_appcache_service.h" |
| 49 #include "chrome/common/chrome_constants.h" | 48 #include "chrome/common/chrome_constants.h" |
| 50 #include "chrome/common/chrome_paths.h" | 49 #include "chrome/common/chrome_paths.h" |
| 51 #include "chrome/common/chrome_switches.h" | 50 #include "chrome/common/chrome_switches.h" |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 return start_time_; | 469 return start_time_; |
| 471 } | 470 } |
| 472 | 471 |
| 473 virtual TabRestoreService* GetTabRestoreService() { | 472 virtual TabRestoreService* GetTabRestoreService() { |
| 474 return NULL; | 473 return NULL; |
| 475 } | 474 } |
| 476 | 475 |
| 477 virtual void ResetTabRestoreService() { | 476 virtual void ResetTabRestoreService() { |
| 478 } | 477 } |
| 479 | 478 |
| 480 virtual void ReinitializeSpellChecker() { | |
| 481 profile_->ReinitializeSpellChecker(); | |
| 482 } | |
| 483 | |
| 484 virtual SpellChecker* GetSpellChecker() { | |
| 485 return profile_->GetSpellChecker(); | |
| 486 } | |
| 487 | |
| 488 virtual void DeleteSpellChecker() { | |
| 489 profile_->DeleteSpellChecker(); | |
| 490 } | |
| 491 | |
| 492 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 493 virtual SpellCheckHost* GetSpellCheckHost() { | 479 virtual SpellCheckHost* GetSpellCheckHost() { |
| 494 return profile_->GetSpellCheckHost(); | 480 return profile_->GetSpellCheckHost(); |
| 495 } | 481 } |
| 496 | 482 |
| 497 virtual void ReinitializeSpellCheckHost(bool force) { | 483 virtual void ReinitializeSpellCheckHost(bool force) { |
| 498 profile_->ReinitializeSpellCheckHost(force); | 484 profile_->ReinitializeSpellCheckHost(force); |
| 499 } | 485 } |
| 500 #endif | |
| 501 | 486 |
| 502 virtual WebKitContext* GetWebKitContext() { | 487 virtual WebKitContext* GetWebKitContext() { |
| 503 if (!webkit_context_.get()) | 488 if (!webkit_context_.get()) |
| 504 webkit_context_ = new WebKitContext(GetPath(), true); | 489 webkit_context_ = new WebKitContext(GetPath(), true); |
| 505 DCHECK(webkit_context_.get()); | 490 DCHECK(webkit_context_.get()); |
| 506 return webkit_context_.get(); | 491 return webkit_context_.get(); |
| 507 } | 492 } |
| 508 | 493 |
| 509 virtual ThumbnailStore* GetThumbnailStore() { | 494 virtual ThumbnailStore* GetThumbnailStore() { |
| 510 return NULL; | 495 return NULL; |
| 511 } | 496 } |
| 512 | 497 |
| 513 virtual void MarkAsCleanShutdown() { | 498 virtual void MarkAsCleanShutdown() { |
| 514 } | 499 } |
| 515 | 500 |
| 516 virtual void InitExtensions() { | 501 virtual void InitExtensions() { |
| 517 NOTREACHED(); | 502 NOTREACHED(); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 586 media_request_context_(NULL), | 571 media_request_context_(NULL), |
| 587 extensions_request_context_(NULL), | 572 extensions_request_context_(NULL), |
| 588 blacklist_(NULL), | 573 blacklist_(NULL), |
| 589 history_service_created_(false), | 574 history_service_created_(false), |
| 590 favicon_service_created_(false), | 575 favicon_service_created_(false), |
| 591 created_web_data_service_(false), | 576 created_web_data_service_(false), |
| 592 created_password_store_(false), | 577 created_password_store_(false), |
| 593 created_download_manager_(false), | 578 created_download_manager_(false), |
| 594 created_theme_provider_(false), | 579 created_theme_provider_(false), |
| 595 start_time_(Time::Now()), | 580 start_time_(Time::Now()), |
| 596 spellchecker_(NULL), | |
| 597 #if defined(OS_LINUX) | 581 #if defined(OS_LINUX) |
| 598 spellcheck_host_(NULL), | 582 spellcheck_host_(NULL), |
| 599 spellcheck_host_ready_(false), | 583 spellcheck_host_ready_(false), |
| 600 #endif | 584 #endif |
| 601 shutdown_session_service_(false) { | 585 shutdown_session_service_(false) { |
| 602 DCHECK(!path.empty()) << "Using an empty path will attempt to write " << | 586 DCHECK(!path.empty()) << "Using an empty path will attempt to write " << |
| 603 "profile files to the root directory!"; | 587 "profile files to the root directory!"; |
| 604 create_session_service_timer_.Start( | 588 create_session_service_timer_.Start( |
| 605 TimeDelta::FromMilliseconds(kCreateSessionServiceDelayMS), this, | 589 TimeDelta::FromMilliseconds(kCreateSessionServiceDelayMS), this, |
| 606 &ProfileImpl::EnsureSessionServiceCreated); | 590 &ProfileImpl::EnsureSessionServiceCreated); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 // increased the ref count of the service. In such a situation, when we | 746 // increased the ref count of the service. In such a situation, when we |
| 763 // decrement the refcount, it won't be 0, and the threads/databases aren't | 747 // decrement the refcount, it won't be 0, and the threads/databases aren't |
| 764 // properly shut down. By explicitly calling Cleanup/Shutdown we ensure the | 748 // properly shut down. By explicitly calling Cleanup/Shutdown we ensure the |
| 765 // databases are properly closed. | 749 // databases are properly closed. |
| 766 if (web_data_service_.get()) | 750 if (web_data_service_.get()) |
| 767 web_data_service_->Shutdown(); | 751 web_data_service_->Shutdown(); |
| 768 | 752 |
| 769 if (history_service_.get()) | 753 if (history_service_.get()) |
| 770 history_service_->Cleanup(); | 754 history_service_->Cleanup(); |
| 771 | 755 |
| 772 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 773 if (spellcheck_host_.get()) | 756 if (spellcheck_host_.get()) |
| 774 spellcheck_host_->UnsetObserver(); | 757 spellcheck_host_->UnsetObserver(); |
| 775 #endif | |
| 776 DeleteSpellCheckerImpl(false); | |
| 777 | 758 |
| 778 if (default_request_context_ == request_context_) | 759 if (default_request_context_ == request_context_) |
| 779 default_request_context_ = NULL; | 760 default_request_context_ = NULL; |
| 780 | 761 |
| 781 CleanupRequestContext(request_context_); | 762 CleanupRequestContext(request_context_); |
| 782 CleanupRequestContext(media_request_context_); | 763 CleanupRequestContext(media_request_context_); |
| 783 CleanupRequestContext(extensions_request_context_); | 764 CleanupRequestContext(extensions_request_context_); |
| 784 | 765 |
| 785 // When the request contexts are gone, the blacklist wont be needed anymore. | 766 // When the request contexts are gone, the blacklist wont be needed anymore. |
| 786 blacklist_.reset(); | 767 blacklist_.reset(); |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 thumbnail_store_->Init( | 1226 thumbnail_store_->Init( |
| 1246 GetPath().Append(chrome::kNewTabThumbnailsFilename), this); | 1227 GetPath().Append(chrome::kNewTabThumbnailsFilename), this); |
| 1247 } | 1228 } |
| 1248 return thumbnail_store_.get(); | 1229 return thumbnail_store_.get(); |
| 1249 } | 1230 } |
| 1250 | 1231 |
| 1251 void ProfileImpl::ResetTabRestoreService() { | 1232 void ProfileImpl::ResetTabRestoreService() { |
| 1252 tab_restore_service_ = NULL; | 1233 tab_restore_service_ = NULL; |
| 1253 } | 1234 } |
| 1254 | 1235 |
| 1255 // To be run in the IO thread to notify all resource message filters that the | |
| 1256 // spellchecker has changed. | |
| 1257 class NotifySpellcheckerChangeTask : public Task { | |
| 1258 public: | |
| 1259 NotifySpellcheckerChangeTask( | |
| 1260 Profile* profile, | |
| 1261 const SpellcheckerReinitializedDetails& spellchecker) | |
| 1262 : profile_(profile), | |
| 1263 spellchecker_(spellchecker) { | |
| 1264 } | |
| 1265 | |
| 1266 private: | |
| 1267 void Run(void) { | |
| 1268 NotificationService::current()->Notify( | |
| 1269 NotificationType::SPELLCHECKER_REINITIALIZED, | |
| 1270 Source<Profile>(profile_), | |
| 1271 Details<SpellcheckerReinitializedDetails>(&spellchecker_)); | |
| 1272 } | |
| 1273 | |
| 1274 Profile* profile_; | |
| 1275 SpellcheckerReinitializedDetails spellchecker_; | |
| 1276 }; | |
| 1277 | |
| 1278 void ProfileImpl::ReinitializeSpellChecker() { | |
| 1279 PrefService* prefs = GetPrefs(); | |
| 1280 if (prefs->GetBoolean(prefs::kEnableSpellCheck)) { | |
| 1281 DeleteSpellCheckerImpl(false); | |
| 1282 | |
| 1283 // Retrieve the (perhaps updated recently) dictionary name from preferences. | |
| 1284 FilePath dict_dir; | |
| 1285 PathService::Get(chrome::DIR_APP_DICTIONARIES, &dict_dir); | |
| 1286 // Note that, as the object pointed to by previously by spellchecker_ | |
| 1287 // is being deleted in the io thread, the spellchecker_ can be made to point | |
| 1288 // to a new object (RE-initialized) in parallel in this UI thread. | |
| 1289 spellchecker_ = new SpellChecker(dict_dir, | |
| 1290 WideToASCII(prefs->GetString(prefs::kSpellCheckDictionary)), | |
| 1291 GetRequestContext(), | |
| 1292 FilePath()); | |
| 1293 spellchecker_->AddRef(); // Manual refcounting. | |
| 1294 | |
| 1295 // Set auto spell correct status for spellchecker. | |
| 1296 spellchecker_->EnableAutoSpellCorrect( | |
| 1297 prefs->GetBoolean(prefs::kEnableAutoSpellCorrect)); | |
| 1298 | |
| 1299 NotifySpellCheckerChanged(); | |
| 1300 } else { | |
| 1301 DeleteSpellCheckerImpl(true); | |
| 1302 } | |
| 1303 } | |
| 1304 | |
| 1305 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 1306 SpellCheckHost* ProfileImpl::GetSpellCheckHost() { | 1236 SpellCheckHost* ProfileImpl::GetSpellCheckHost() { |
| 1307 return spellcheck_host_ready_ ? spellcheck_host_.get() : NULL; | 1237 return spellcheck_host_ready_ ? spellcheck_host_.get() : NULL; |
| 1308 } | 1238 } |
| 1309 | 1239 |
| 1310 void ProfileImpl::ReinitializeSpellCheckHost(bool force) { | 1240 void ProfileImpl::ReinitializeSpellCheckHost(bool force) { |
| 1311 // If we are already loading the spellchecker, and this is just a hint to | 1241 // If we are already loading the spellchecker, and this is just a hint to |
| 1312 // load the spellchecker, do nothing. | 1242 // load the spellchecker, do nothing. |
| 1313 if (!force && spellcheck_host_.get()) | 1243 if (!force && spellcheck_host_.get()) |
| 1314 return; | 1244 return; |
| 1315 | 1245 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1330 GetRequestContext()); | 1260 GetRequestContext()); |
| 1331 spellcheck_host_->Initialize(); | 1261 spellcheck_host_->Initialize(); |
| 1332 } else if (notify) { | 1262 } else if (notify) { |
| 1333 // The spellchecker has been disabled. | 1263 // The spellchecker has been disabled. |
| 1334 SpellCheckHostInitialized(); | 1264 SpellCheckHostInitialized(); |
| 1335 } | 1265 } |
| 1336 } | 1266 } |
| 1337 | 1267 |
| 1338 void ProfileImpl::SpellCheckHostInitialized() { | 1268 void ProfileImpl::SpellCheckHostInitialized() { |
| 1339 spellcheck_host_ready_ = spellcheck_host_ && | 1269 spellcheck_host_ready_ = spellcheck_host_ && |
| 1340 spellcheck_host_->bdict_file() != base::kInvalidPlatformFileValue; | 1270 (spellcheck_host_->bdict_file() != base::kInvalidPlatformFileValue || |
| 1271 spellcheck_host_->use_platform_spellchecker()); |
| 1341 NotificationService::current()->Notify( | 1272 NotificationService::current()->Notify( |
| 1342 NotificationType::SPELLCHECK_HOST_REINITIALIZED, | 1273 NotificationType::SPELLCHECK_HOST_REINITIALIZED, |
| 1343 Source<Profile>(this), NotificationService::NoDetails()); | 1274 Source<Profile>(this), NotificationService::NoDetails()); |
| 1344 } | 1275 } |
| 1345 #endif | |
| 1346 | |
| 1347 void ProfileImpl::NotifySpellCheckerChanged() { | |
| 1348 SpellcheckerReinitializedDetails scoped_spellchecker; | |
| 1349 scoped_spellchecker.spellchecker = spellchecker_; | |
| 1350 ChromeThread::PostTask( | |
| 1351 ChromeThread::IO, FROM_HERE, | |
| 1352 new NotifySpellcheckerChangeTask(this, scoped_spellchecker)); | |
| 1353 } | |
| 1354 | |
| 1355 void ProfileImpl::DeleteSpellCheckerImpl(bool notify) { | |
| 1356 if (!spellchecker_) | |
| 1357 return; | |
| 1358 | |
| 1359 // The spellchecker must be deleted on the I/O thread. | |
| 1360 ChromeThread::ReleaseSoon(ChromeThread::IO, FROM_HERE, spellchecker_); | |
| 1361 spellchecker_ = NULL; | |
| 1362 | |
| 1363 if (notify) | |
| 1364 NotifySpellCheckerChanged(); | |
| 1365 } | |
| 1366 | |
| 1367 SpellChecker* ProfileImpl::GetSpellChecker() { | |
| 1368 if (!spellchecker_) { | |
| 1369 // This is where spellchecker gets initialized. Note that this is being | |
| 1370 // initialized in the ui_thread. However, this is not a problem as long as | |
| 1371 // it is *used* in the io thread. | |
| 1372 // TODO(sidchat): One day, change everything so that spellchecker gets | |
| 1373 // initialized in the IO thread itself. | |
| 1374 ReinitializeSpellChecker(); | |
| 1375 } | |
| 1376 | |
| 1377 return spellchecker_; | |
| 1378 } | |
| 1379 | 1276 |
| 1380 WebKitContext* ProfileImpl::GetWebKitContext() { | 1277 WebKitContext* ProfileImpl::GetWebKitContext() { |
| 1381 if (!webkit_context_.get()) | 1278 if (!webkit_context_.get()) |
| 1382 webkit_context_ = new WebKitContext(path_, false); | 1279 webkit_context_ = new WebKitContext(path_, false); |
| 1383 DCHECK(webkit_context_.get()); | 1280 DCHECK(webkit_context_.get()); |
| 1384 return webkit_context_.get(); | 1281 return webkit_context_.get(); |
| 1385 } | 1282 } |
| 1386 | 1283 |
| 1387 DesktopNotificationService* ProfileImpl::GetDesktopNotificationService() { | 1284 DesktopNotificationService* ProfileImpl::GetDesktopNotificationService() { |
| 1388 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 1285 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1405 } | 1302 } |
| 1406 | 1303 |
| 1407 void ProfileImpl::Observe(NotificationType type, | 1304 void ProfileImpl::Observe(NotificationType type, |
| 1408 const NotificationSource& source, | 1305 const NotificationSource& source, |
| 1409 const NotificationDetails& details) { | 1306 const NotificationDetails& details) { |
| 1410 if (NotificationType::PREF_CHANGED == type) { | 1307 if (NotificationType::PREF_CHANGED == type) { |
| 1411 std::wstring* pref_name_in = Details<std::wstring>(details).ptr(); | 1308 std::wstring* pref_name_in = Details<std::wstring>(details).ptr(); |
| 1412 PrefService* prefs = Source<PrefService>(source).ptr(); | 1309 PrefService* prefs = Source<PrefService>(source).ptr(); |
| 1413 DCHECK(pref_name_in && prefs); | 1310 DCHECK(pref_name_in && prefs); |
| 1414 if (*pref_name_in == prefs::kSpellCheckDictionary || | 1311 if (*pref_name_in == prefs::kSpellCheckDictionary || |
| 1415 #if !defined(SPELLCHECKER_IN_RENDERER) | |
| 1416 *pref_name_in == prefs::kEnableAutoSpellCorrect || | |
| 1417 #endif | |
| 1418 *pref_name_in == prefs::kEnableSpellCheck) { | 1312 *pref_name_in == prefs::kEnableSpellCheck) { |
| 1419 ReinitializeSpellChecker(); | |
| 1420 #if defined(SPELLCHECKER_IN_RENDERER) | |
| 1421 ReinitializeSpellCheckHost(true); | 1313 ReinitializeSpellCheckHost(true); |
| 1422 #endif | 1314 } else if (*pref_name_in == prefs::kEnableAutoSpellCorrect) { |
| 1315 NotificationService::current()->Notify( |
| 1316 NotificationType::SPELLCHECK_AUTOSPELL_TOGGLED, |
| 1317 Source<Profile>(this), NotificationService::NoDetails()); |
| 1423 } | 1318 } |
| 1424 } else if (NotificationType::THEME_INSTALLED == type) { | 1319 } else if (NotificationType::THEME_INSTALLED == type) { |
| 1425 Extension* extension = Details<Extension>(details).ptr(); | 1320 Extension* extension = Details<Extension>(details).ptr(); |
| 1426 SetTheme(extension); | 1321 SetTheme(extension); |
| 1427 } else if (NotificationType::BOOKMARK_MODEL_LOADED == type) { | 1322 } else if (NotificationType::BOOKMARK_MODEL_LOADED == type) { |
| 1428 GetProfileSyncService(); // Causes lazy-load if sync is enabled. | 1323 GetProfileSyncService(); // Causes lazy-load if sync is enabled. |
| 1429 registrar_.Remove(this, NotificationType::BOOKMARK_MODEL_LOADED, | 1324 registrar_.Remove(this, NotificationType::BOOKMARK_MODEL_LOADED, |
| 1430 Source<Profile>(this)); | 1325 Source<Profile>(this)); |
| 1431 } | 1326 } |
| 1432 } | 1327 } |
| 1433 | 1328 |
| 1434 void ProfileImpl::StopCreateSessionServiceTimer() { | 1329 void ProfileImpl::StopCreateSessionServiceTimer() { |
| 1435 create_session_service_timer_.Stop(); | 1330 create_session_service_timer_.Stop(); |
| 1436 } | 1331 } |
| 1437 | 1332 |
| 1438 ProfileSyncService* ProfileImpl::GetProfileSyncService() { | 1333 ProfileSyncService* ProfileImpl::GetProfileSyncService() { |
| 1439 if (!ProfileSyncService::IsSyncEnabled()) { | 1334 if (!ProfileSyncService::IsSyncEnabled()) { |
| 1440 return NULL; | 1335 return NULL; |
| 1441 } | 1336 } |
| 1442 if (!sync_service_.get()) | 1337 if (!sync_service_.get()) |
| 1443 InitSyncService(); | 1338 InitSyncService(); |
| 1444 return sync_service_.get(); | 1339 return sync_service_.get(); |
| 1445 } | 1340 } |
| 1446 | 1341 |
| 1447 void ProfileImpl::InitSyncService() { | 1342 void ProfileImpl::InitSyncService() { |
| 1448 sync_service_.reset(new ProfileSyncService(this)); | 1343 sync_service_.reset(new ProfileSyncService(this)); |
| 1449 sync_service_->Initialize(); | 1344 sync_service_->Initialize(); |
| 1450 } | 1345 } |
| OLD | NEW |