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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/data_deleter.h" 6 7 #include "chrome/browser/extensions/extension_service.h" 8 #include "chrome/browser/extensions/extension_special_storage_policy.h" 9 #include "chrome/browser/extensions/extension_util.h" 10 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/common/extensions/manifest_handlers/app_isolation_info.h" 12 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 13 #include "content/public/browser/browser_context.h" 14 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/site_instance.h" 16 #include "content/public/browser/storage_partition.h" 17 #include "extensions/browser/extension_prefs.h" 18 #include "extensions/browser/extension_system.h" 19 #include "extensions/common/constants.h" 20 #include "extensions/common/extension.h" 21 #include "net/url_request/url_request_context_getter.h" 22 23 #if defined(ENABLE_EXTENSIONS) 24 #include "extensions/browser/api/storage/storage_frontend.h" 25 #endif 26 27 using base::WeakPtr; 28 using content::BrowserContext; 29 using content::BrowserThread; 30 using content::StoragePartition; 31 32 namespace extensions { 33 34 namespace { 35 36 // Helper function that deletes data of a given |storage_origin| in a given 37 // |partition|. 38 void DeleteOrigin(Profile* profile, 39 StoragePartition* partition, 40 const GURL& origin) { 41 DCHECK_CURRENTLY_ON(BrowserThread::UI); 42 DCHECK(profile); 43 DCHECK(partition); 44 45 if (origin.SchemeIs(kExtensionScheme)) { 46 // TODO(ajwong): Cookies are not properly isolated for 47 // chrome-extension:// scheme. (http://crbug.com/158386). 48 // 49 // However, no isolated apps actually can write to kExtensionScheme 50 // origins. Thus, it is benign to delete from the 51 // RequestContextForExtensions because there's nothing stored there. We 52 // preserve this code path without checking for isolation because it's 53 // simpler than special casing. This code should go away once we merge 54 // the various URLRequestContexts (http://crbug.com/159193). 55 partition->ClearDataForOrigin( 56 StoragePartition::REMOVE_DATA_MASK_ALL & 57 (~StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE), 58 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, 59 origin, 60 profile->GetRequestContextForExtensions()); 61 } else { 62 // We don't need to worry about the media request context because that 63 // shares the same cookie store as the main request context. 64 partition->ClearDataForOrigin( 65 StoragePartition::REMOVE_DATA_MASK_ALL & 66 (~StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE), 67 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, 68 origin, 69 partition->GetURLRequestContext()); 70 } 71 } 72 73 void OnNeedsToGarbageCollectIsolatedStorage(WeakPtr<ExtensionService> es) { 74 if (!es) 75 return; 76 ExtensionPrefs::Get(es->profile())->SetNeedsStorageGarbageCollection(true); 77 } 78 79 } // namespace 80 81 // static 82 void DataDeleter::StartDeleting(Profile* profile, const Extension* extension) { 83 DCHECK(profile); 84 DCHECK(extension); 85 86 if (AppIsolationInfo::HasIsolatedStorage(extension)) { 87 BrowserContext::AsyncObliterateStoragePartition( 88 profile, 89 util::GetSiteForExtensionId(extension->id(), profile), 90 base::Bind( 91 &OnNeedsToGarbageCollectIsolatedStorage, 92 ExtensionSystem::Get(profile)->extension_service()->AsWeakPtr())); 93 } else { 94 GURL launch_web_url_origin( 95 AppLaunchInfo::GetLaunchWebURL(extension).GetOrigin()); 96 97 StoragePartition* partition = BrowserContext::GetStoragePartitionForSite( 98 profile, 99 Extension::GetBaseURLFromExtensionId(extension->id())); 100 101 if (extension->is_hosted_app() && 102 !profile->GetExtensionSpecialStoragePolicy()-> 103 IsStorageProtected(launch_web_url_origin)) { 104 DeleteOrigin(profile, partition, launch_web_url_origin); 105 } 106 DeleteOrigin(profile, partition, extension->url()); 107 } 108 109 #if defined(ENABLE_EXTENSIONS) 110 // Begin removal of the settings for the current extension. 111 // StorageFrontend may not exist in unit tests. 112 StorageFrontend* frontend = StorageFrontend::Get(profile); 113 if (frontend) 114 frontend->DeleteStorageSoon(extension->id()); 115 #endif // defined(ENABLE_EXTENSIONS) 116 } 117 118 } // namespace extensions 119