OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chromeos/extensions/file_browser_event_router.h" | 5 #include "chrome/browser/chromeos/extensions/file_browser_event_router.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/prefs/public/pref_change_registrar.h" | 10 #include "base/prefs/public/pref_change_registrar.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "chrome/browser/profiles/profile_dependency_manager.h" | 29 #include "chrome/browser/profiles/profile_dependency_manager.h" |
30 #include "chrome/common/chrome_notification_types.h" | 30 #include "chrome/common/chrome_notification_types.h" |
31 #include "chrome/common/pref_names.h" | 31 #include "chrome/common/pref_names.h" |
32 #include "content/public/browser/notification_source.h" | 32 #include "content/public/browser/notification_source.h" |
33 #include "grit/generated_resources.h" | 33 #include "grit/generated_resources.h" |
34 #include "ui/base/l10n/l10n_util.h" | 34 #include "ui/base/l10n/l10n_util.h" |
35 #include "webkit/fileapi/file_system_types.h" | 35 #include "webkit/fileapi/file_system_types.h" |
36 #include "webkit/fileapi/file_system_util.h" | 36 #include "webkit/fileapi/file_system_util.h" |
37 | 37 |
38 using chromeos::disks::DiskMountManager; | 38 using chromeos::disks::DiskMountManager; |
39 using chromeos::disks::DiskMountManagerEventType; | |
40 using content::BrowserThread; | 39 using content::BrowserThread; |
41 using drive::DriveSystemService; | 40 using drive::DriveSystemService; |
42 using drive::DriveSystemServiceFactory; | 41 using drive::DriveSystemServiceFactory; |
43 | 42 |
44 namespace { | 43 namespace { |
45 const char kDiskAddedEventType[] = "added"; | 44 const char kDiskAddedEventType[] = "added"; |
46 const char kDiskRemovedEventType[] = "removed"; | 45 const char kDiskRemovedEventType[] = "removed"; |
47 | 46 |
48 const char kPathChanged[] = "changed"; | 47 const char kPathChanged[] = "changed"; |
49 const char kPathWatchError[] = "error"; | 48 const char kPathWatchError[] = "error"; |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 const std::string& gdata_path = drive::util::GetDriveMountPointPathAsString(); | 235 const std::string& gdata_path = drive::util::GetDriveMountPointPathAsString(); |
237 DiskMountManager::MountPointInfo mount_info( | 236 DiskMountManager::MountPointInfo mount_info( |
238 gdata_path, | 237 gdata_path, |
239 gdata_path, | 238 gdata_path, |
240 chromeos::MOUNT_TYPE_GDATA, | 239 chromeos::MOUNT_TYPE_GDATA, |
241 chromeos::disks::MOUNT_CONDITION_NONE); | 240 chromeos::disks::MOUNT_CONDITION_NONE); |
242 | 241 |
243 // Raise mount event. | 242 // Raise mount event. |
244 // We can pass chromeos::MOUNT_ERROR_NONE even when authentication is failed | 243 // We can pass chromeos::MOUNT_ERROR_NONE even when authentication is failed |
245 // or network is unreachable. These two errors will be handled later. | 244 // or network is unreachable. These two errors will be handled later. |
246 MountCompleted(DiskMountManager::MOUNTING, | 245 OnMountEvent(DiskMountManager::MOUNTING, |
247 chromeos::MOUNT_ERROR_NONE, | 246 chromeos::MOUNT_ERROR_NONE, |
248 mount_info); | 247 mount_info); |
249 | 248 |
250 if (!callback.is_null()) | 249 if (!callback.is_null()) |
251 callback.Run(); | 250 callback.Run(); |
252 } | 251 } |
253 | 252 |
254 void FileBrowserEventRouter::HandleRemoteUpdateRequestOnUIThread(bool start) { | 253 void FileBrowserEventRouter::HandleRemoteUpdateRequestOnUIThread(bool start) { |
255 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 254 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
256 | 255 |
257 drive::DriveFileSystemInterface* file_system = GetRemoteFileSystem(); | 256 drive::DriveFileSystemInterface* file_system = GetRemoteFileSystem(); |
258 // |file_system| is NULL if Drive is disabled. | 257 // |file_system| is NULL if Drive is disabled. |
259 if (!file_system) | 258 if (!file_system) |
260 return; | 259 return; |
261 | 260 |
262 if (start) { | 261 if (start) { |
263 file_system->CheckForUpdates(); | 262 file_system->CheckForUpdates(); |
264 if (num_remote_update_requests_ == 0) | 263 if (num_remote_update_requests_ == 0) |
265 file_system->StartPolling(); | 264 file_system->StartPolling(); |
266 ++num_remote_update_requests_; | 265 ++num_remote_update_requests_; |
267 } else { | 266 } else { |
268 DCHECK_LE(1, num_remote_update_requests_); | 267 DCHECK_LE(1, num_remote_update_requests_); |
269 --num_remote_update_requests_; | 268 --num_remote_update_requests_; |
270 if (num_remote_update_requests_ == 0) | 269 if (num_remote_update_requests_ == 0) |
271 file_system->StopPolling(); | 270 file_system->StopPolling(); |
272 } | 271 } |
273 } | 272 } |
274 | 273 |
275 void FileBrowserEventRouter::DiskChanged( | 274 void FileBrowserEventRouter::OnDiskEvent( |
276 DiskMountManagerEventType event, | 275 DiskMountManager::DiskEvent event, |
277 const DiskMountManager::Disk* disk) { | 276 const DiskMountManager::Disk* disk) { |
278 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 277 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
279 | 278 |
280 // Disregard hidden devices. | 279 // Disregard hidden devices. |
281 if (disk->is_hidden()) | 280 if (disk->is_hidden()) |
282 return; | 281 return; |
283 if (event == chromeos::disks::MOUNT_DISK_ADDED) { | 282 if (event == DiskMountManager::DISK_ADDED) { |
284 OnDiskAdded(disk); | 283 OnDiskAdded(disk); |
285 } else if (event == chromeos::disks::MOUNT_DISK_REMOVED) { | 284 } else if (event == DiskMountManager::DISK_REMOVED) { |
286 OnDiskRemoved(disk); | 285 OnDiskRemoved(disk); |
287 } | 286 } |
288 } | 287 } |
289 | 288 |
290 void FileBrowserEventRouter::DeviceChanged( | 289 void FileBrowserEventRouter::OnDeviceEvent( |
291 DiskMountManagerEventType event, | 290 DiskMountManager::DeviceEvent event, |
292 const std::string& device_path) { | 291 const std::string& device_path) { |
293 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 292 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
294 | 293 |
295 if (event == chromeos::disks::MOUNT_DEVICE_ADDED) { | 294 if (event == DiskMountManager::DEVICE_ADDED) { |
296 OnDeviceAdded(device_path); | 295 OnDeviceAdded(device_path); |
297 } else if (event == chromeos::disks::MOUNT_DEVICE_REMOVED) { | 296 } else if (event == DiskMountManager::DEVICE_REMOVED) { |
298 OnDeviceRemoved(device_path); | 297 OnDeviceRemoved(device_path); |
299 } else if (event == chromeos::disks::MOUNT_DEVICE_SCANNED) { | 298 } else if (event == DiskMountManager::DEVICE_SCANNED) { |
300 OnDeviceScanned(device_path); | 299 OnDeviceScanned(device_path); |
301 } else if (event == chromeos::disks::MOUNT_FORMATTING_STARTED) { | |
302 // TODO(tbarzic): get rid of '!'. | |
303 if (device_path[0] == '!') { | |
304 OnFormattingStarted(device_path.substr(1), false); | |
305 } else { | |
306 OnFormattingStarted(device_path, true); | |
307 } | |
308 } else if (event == chromeos::disks::MOUNT_FORMATTING_FINISHED) { | |
309 if (device_path[0] == '!') { | |
310 OnFormattingFinished(device_path.substr(1), false); | |
311 } else { | |
312 OnFormattingFinished(device_path, true); | |
313 } | |
314 } | 300 } |
315 } | 301 } |
316 | 302 |
317 void FileBrowserEventRouter::MountCompleted( | 303 void FileBrowserEventRouter::OnMountEvent( |
318 DiskMountManager::MountEvent event_type, | 304 DiskMountManager::MountEvent event, |
319 chromeos::MountError error_code, | 305 chromeos::MountError error_code, |
320 const DiskMountManager::MountPointInfo& mount_info) { | 306 const DiskMountManager::MountPointInfo& mount_info) { |
321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 307 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
322 | 308 |
323 DispatchMountCompletedEvent(event_type, error_code, mount_info); | 309 DispatchMountEvent(event, error_code, mount_info); |
324 | 310 |
325 if (mount_info.mount_type == chromeos::MOUNT_TYPE_DEVICE && | 311 if (mount_info.mount_type == chromeos::MOUNT_TYPE_DEVICE && |
326 event_type == DiskMountManager::MOUNTING) { | 312 event == DiskMountManager::MOUNTING) { |
327 DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance(); | 313 DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance(); |
328 const DiskMountManager::Disk* disk = | 314 const DiskMountManager::Disk* disk = |
329 disk_mount_manager->FindDiskBySourcePath(mount_info.source_path); | 315 disk_mount_manager->FindDiskBySourcePath(mount_info.source_path); |
330 if (!disk) | 316 if (!disk) |
331 return; | 317 return; |
332 | 318 |
333 notifications_->ManageNotificationsOnMountCompleted( | 319 notifications_->ManageNotificationsOnMountCompleted( |
334 disk->system_path_prefix(), disk->drive_label(), disk->is_parent(), | 320 disk->system_path_prefix(), disk->drive_label(), disk->is_parent(), |
335 error_code == chromeos::MOUNT_ERROR_NONE, | 321 error_code == chromeos::MOUNT_ERROR_NONE, |
336 error_code == chromeos::MOUNT_ERROR_UNSUPPORTED_FILESYSTEM); | 322 error_code == chromeos::MOUNT_ERROR_UNSUPPORTED_FILESYSTEM); |
337 } else if (mount_info.mount_type == chromeos::MOUNT_TYPE_ARCHIVE) { | 323 } else if (mount_info.mount_type == chromeos::MOUNT_TYPE_ARCHIVE) { |
338 // Clear the "mounted" state for archive files in gdata cache | 324 // Clear the "mounted" state for archive files in gdata cache |
339 // when mounting failed or unmounting succeeded. | 325 // when mounting failed or unmounting succeeded. |
340 if ((event_type == DiskMountManager::MOUNTING) != | 326 if ((event == DiskMountManager::MOUNTING) != |
341 (error_code == chromeos::MOUNT_ERROR_NONE)) { | 327 (error_code == chromeos::MOUNT_ERROR_NONE)) { |
342 FilePath source_path(mount_info.source_path); | 328 FilePath source_path(mount_info.source_path); |
343 DriveSystemService* system_service = | 329 DriveSystemService* system_service = |
344 DriveSystemServiceFactory::GetForProfile(profile_); | 330 DriveSystemServiceFactory::GetForProfile(profile_); |
345 drive::DriveCache* cache = | 331 drive::DriveCache* cache = |
346 system_service ? system_service->cache() : NULL; | 332 system_service ? system_service->cache() : NULL; |
347 if (cache) { | 333 if (cache) { |
348 cache->SetMountedState( | 334 cache->SetMountedState( |
349 source_path, false, drive::GetFileFromCacheCallback()); | 335 source_path, false, drive::GetFileFromCacheCallback()); |
350 } | 336 } |
351 } | 337 } |
352 } | 338 } |
353 } | 339 } |
354 | 340 |
| 341 void FileBrowserEventRouter::OnFormatEvent( |
| 342 DiskMountManager::FormatEvent event, |
| 343 chromeos::FormatError error_code, |
| 344 const std::string& device_path) { |
| 345 if (event == DiskMountManager::FORMAT_STARTED) { |
| 346 OnFormatStarted(device_path, error_code == chromeos::FORMAT_ERROR_NONE); |
| 347 } else if (event == DiskMountManager::FORMAT_COMPLETED) { |
| 348 OnFormatCompleted(device_path, error_code == chromeos::FORMAT_ERROR_NONE); |
| 349 } |
| 350 } |
| 351 |
355 void FileBrowserEventRouter::OnNetworkManagerChanged( | 352 void FileBrowserEventRouter::OnNetworkManagerChanged( |
356 chromeos::NetworkLibrary* network_library) { | 353 chromeos::NetworkLibrary* network_library) { |
357 if (!profile_ || | 354 if (!profile_ || |
358 !extensions::ExtensionSystem::Get(profile_)->event_router()) { | 355 !extensions::ExtensionSystem::Get(profile_)->event_router()) { |
359 NOTREACHED(); | 356 NOTREACHED(); |
360 return; | 357 return; |
361 } | 358 } |
362 extensions::ExtensionSystem::Get(profile_)->event_router()-> | 359 extensions::ExtensionSystem::Get(profile_)->event_router()-> |
363 DispatchEventToRenderers( | 360 DispatchEventToRenderers( |
364 extensions::event_names::kOnFileBrowserNetworkConnectionChanged, | 361 extensions::event_names::kOnFileBrowserNetworkConnectionChanged, |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 | 438 |
442 void FileBrowserEventRouter::OnFileSystemMounted() { | 439 void FileBrowserEventRouter::OnFileSystemMounted() { |
443 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 440 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
444 | 441 |
445 MountDrive(base::Bind(&base::DoNothing)); // Callback does nothing. | 442 MountDrive(base::Bind(&base::DoNothing)); // Callback does nothing. |
446 } | 443 } |
447 | 444 |
448 void FileBrowserEventRouter::OnFileSystemBeingUnmounted() { | 445 void FileBrowserEventRouter::OnFileSystemBeingUnmounted() { |
449 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 446 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
450 | 447 |
451 // Raise a MountCompleted event to notify the File Manager. | 448 // Raise a mount event to notify the File Manager. |
452 const std::string& gdata_path = drive::util::GetDriveMountPointPathAsString(); | 449 const std::string& gdata_path = drive::util::GetDriveMountPointPathAsString(); |
453 DiskMountManager::MountPointInfo mount_info( | 450 DiskMountManager::MountPointInfo mount_info( |
454 gdata_path, | 451 gdata_path, |
455 gdata_path, | 452 gdata_path, |
456 chromeos::MOUNT_TYPE_GDATA, | 453 chromeos::MOUNT_TYPE_GDATA, |
457 chromeos::disks::MOUNT_CONDITION_NONE); | 454 chromeos::disks::MOUNT_CONDITION_NONE); |
458 MountCompleted(DiskMountManager::UNMOUNTING, chromeos::MOUNT_ERROR_NONE, | 455 OnMountEvent(DiskMountManager::UNMOUNTING, chromeos::MOUNT_ERROR_NONE, |
459 mount_info); | 456 mount_info); |
460 } | 457 } |
461 | 458 |
462 void FileBrowserEventRouter::OnAuthenticationFailed( | 459 void FileBrowserEventRouter::OnAuthenticationFailed( |
463 google_apis::GDataErrorCode error) { | 460 google_apis::GDataErrorCode error) { |
464 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 461 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
465 | 462 |
466 if (error == google_apis::GDATA_NO_CONNECTION) | 463 if (error == google_apis::GDATA_NO_CONNECTION) |
467 return; | 464 return; |
468 | 465 |
469 // Raise a MountCompleted event to notify the File Manager. | 466 // Raise a mount event to notify the File Manager. |
470 const std::string& gdata_path = drive::util::GetDriveMountPointPathAsString(); | 467 const std::string& gdata_path = drive::util::GetDriveMountPointPathAsString(); |
471 DiskMountManager::MountPointInfo mount_info( | 468 DiskMountManager::MountPointInfo mount_info( |
472 gdata_path, | 469 gdata_path, |
473 gdata_path, | 470 gdata_path, |
474 chromeos::MOUNT_TYPE_GDATA, | 471 chromeos::MOUNT_TYPE_GDATA, |
475 chromeos::disks::MOUNT_CONDITION_NONE); | 472 chromeos::disks::MOUNT_CONDITION_NONE); |
476 MountCompleted(DiskMountManager::UNMOUNTING, chromeos::MOUNT_ERROR_NONE, | 473 OnMountEvent(DiskMountManager::UNMOUNTING, chromeos::MOUNT_ERROR_NONE, |
477 mount_info); | 474 mount_info); |
478 } | 475 } |
479 | 476 |
480 void FileBrowserEventRouter::HandleFileWatchNotification( | 477 void FileBrowserEventRouter::HandleFileWatchNotification( |
481 const FilePath& local_path, bool got_error) { | 478 const FilePath& local_path, bool got_error) { |
482 base::AutoLock lock(lock_); | 479 base::AutoLock lock(lock_); |
483 WatcherMap::const_iterator iter = file_watchers_.find(local_path); | 480 WatcherMap::const_iterator iter = file_watchers_.find(local_path); |
484 if (iter == file_watchers_.end()) { | 481 if (iter == file_watchers_.end()) { |
485 return; | 482 return; |
486 } | 483 } |
487 DispatchDirectoryChangeEvent(iter->second->GetVirtualPath(), got_error, | 484 DispatchDirectoryChangeEvent(iter->second->GetVirtualPath(), got_error, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 added ? kDiskAddedEventType : kDiskRemovedEventType); | 537 added ? kDiskAddedEventType : kDiskRemovedEventType); |
541 DictionaryValue* disk_info = DiskToDictionaryValue(disk); | 538 DictionaryValue* disk_info = DiskToDictionaryValue(disk); |
542 mount_info->Set("volumeInfo", disk_info); | 539 mount_info->Set("volumeInfo", disk_info); |
543 | 540 |
544 extensions::ExtensionSystem::Get(profile_)->event_router()-> | 541 extensions::ExtensionSystem::Get(profile_)->event_router()-> |
545 DispatchEventToRenderers( | 542 DispatchEventToRenderers( |
546 extensions::event_names::kOnFileBrowserDiskChanged, args.Pass(), NULL, | 543 extensions::event_names::kOnFileBrowserDiskChanged, args.Pass(), NULL, |
547 GURL()); | 544 GURL()); |
548 } | 545 } |
549 | 546 |
550 void FileBrowserEventRouter::DispatchMountCompletedEvent( | 547 void FileBrowserEventRouter::DispatchMountEvent( |
551 DiskMountManager::MountEvent event, | 548 DiskMountManager::MountEvent event, |
552 chromeos::MountError error_code, | 549 chromeos::MountError error_code, |
553 const DiskMountManager::MountPointInfo& mount_info) { | 550 const DiskMountManager::MountPointInfo& mount_info) { |
554 // profile_ is NULL if ShutdownOnUIThread() is called earlier. This can | 551 // profile_ is NULL if ShutdownOnUIThread() is called earlier. This can |
555 // happen at shutdown. | 552 // happen at shutdown. |
556 if (!profile_) | 553 if (!profile_) |
557 return; | 554 return; |
558 | 555 |
559 if (mount_info.mount_type == chromeos::MOUNT_TYPE_INVALID) { | 556 if (mount_info.mount_type == chromeos::MOUNT_TYPE_INVALID) { |
560 NOTREACHED(); | 557 NOTREACHED(); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 device_path); | 690 device_path); |
694 notifications_->UnregisterDevice(device_path); | 691 notifications_->UnregisterDevice(device_path); |
695 } | 692 } |
696 | 693 |
697 void FileBrowserEventRouter::OnDeviceScanned( | 694 void FileBrowserEventRouter::OnDeviceScanned( |
698 const std::string& device_path) { | 695 const std::string& device_path) { |
699 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 696 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
700 VLOG(1) << "Device scanned : " << device_path; | 697 VLOG(1) << "Device scanned : " << device_path; |
701 } | 698 } |
702 | 699 |
703 void FileBrowserEventRouter::OnFormattingStarted( | 700 void FileBrowserEventRouter::OnFormatStarted( |
704 const std::string& device_path, bool success) { | 701 const std::string& device_path, bool success) { |
705 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 702 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
706 | 703 |
707 if (success) { | 704 if (success) { |
708 notifications_->ShowNotification(FileBrowserNotifications::FORMAT_START, | 705 notifications_->ShowNotification(FileBrowserNotifications::FORMAT_START, |
709 device_path); | 706 device_path); |
710 } else { | 707 } else { |
711 notifications_->ShowNotification( | 708 notifications_->ShowNotification( |
712 FileBrowserNotifications::FORMAT_START_FAIL, device_path); | 709 FileBrowserNotifications::FORMAT_START_FAIL, device_path); |
713 } | 710 } |
714 } | 711 } |
715 | 712 |
716 void FileBrowserEventRouter::OnFormattingFinished( | 713 void FileBrowserEventRouter::OnFormatCompleted( |
717 const std::string& device_path, bool success) { | 714 const std::string& device_path, bool success) { |
718 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 715 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
719 | 716 |
720 if (success) { | 717 if (success) { |
721 notifications_->HideNotification(FileBrowserNotifications::FORMAT_START, | 718 notifications_->HideNotification(FileBrowserNotifications::FORMAT_START, |
722 device_path); | 719 device_path); |
723 notifications_->ShowNotification(FileBrowserNotifications::FORMAT_SUCCESS, | 720 notifications_->ShowNotification(FileBrowserNotifications::FORMAT_SUCCESS, |
724 device_path); | 721 device_path); |
725 // Hide it after a couple of seconds. | 722 // Hide it after a couple of seconds. |
726 notifications_->HideNotificationDelayed( | 723 notifications_->HideNotificationDelayed( |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 return scoped_refptr<RefcountedProfileKeyedService>( | 871 return scoped_refptr<RefcountedProfileKeyedService>( |
875 new FileBrowserEventRouter(profile)); | 872 new FileBrowserEventRouter(profile)); |
876 } | 873 } |
877 | 874 |
878 bool FileBrowserEventRouterFactory::ServiceHasOwnInstanceInIncognito() const { | 875 bool FileBrowserEventRouterFactory::ServiceHasOwnInstanceInIncognito() const { |
879 // Explicitly and always allow this router in guest login mode. see | 876 // Explicitly and always allow this router in guest login mode. see |
880 // chrome/browser/profiles/profile_keyed_base_factory.h comment | 877 // chrome/browser/profiles/profile_keyed_base_factory.h comment |
881 // for the details. | 878 // for the details. |
882 return true; | 879 return true; |
883 } | 880 } |
OLD | NEW |