Merge pull request #2102 from deepak1556/storage_cleanup_api_patch
app: api to clear data from different storage types
This commit is contained in:
		
				commit
				
					
						34819140c3
					
				
			
		
					 5 changed files with 150 additions and 6 deletions
				
			
		|  | @ -10,17 +10,67 @@ | ||||||
| #include "atom/browser/atom_browser_context.h" | #include "atom/browser/atom_browser_context.h" | ||||||
| #include "atom/common/native_mate_converters/gurl_converter.h" | #include "atom/common/native_mate_converters/gurl_converter.h" | ||||||
| #include "base/thread_task_runner_handle.h" | #include "base/thread_task_runner_handle.h" | ||||||
|  | #include "base/strings/string_util.h" | ||||||
| #include "content/public/browser/browser_thread.h" | #include "content/public/browser/browser_thread.h" | ||||||
| #include "content/public/browser/storage_partition.h" | #include "content/public/browser/storage_partition.h" | ||||||
| #include "native_mate/callback.h" | #include "native_mate/callback.h" | ||||||
| #include "native_mate/object_template_builder.h" | #include "native_mate/object_template_builder.h" | ||||||
| #include "net/base/load_flags.h" | #include "net/base/load_flags.h" | ||||||
|  | #include "net/disk_cache/disk_cache.h" | ||||||
| #include "net/proxy/proxy_service.h" | #include "net/proxy/proxy_service.h" | ||||||
| #include "net/url_request/url_request_context.h" | #include "net/url_request/url_request_context.h" | ||||||
| #include "net/url_request/url_request_context_getter.h" | #include "net/url_request/url_request_context_getter.h" | ||||||
| 
 | 
 | ||||||
| #include "atom/common/node_includes.h" | #include "atom/common/node_includes.h" | ||||||
| 
 | 
 | ||||||
|  | using content::BrowserThread; | ||||||
|  | using content::StoragePartition; | ||||||
|  | 
 | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | int GetStorageMask(const std::vector<std::string>& storage_types) { | ||||||
|  |   int storage_mask = 0; | ||||||
|  | 
 | ||||||
|  |   for (auto &it : storage_types) { | ||||||
|  |     auto type = base::StringToLowerASCII(it); | ||||||
|  |     if (type == "appcache") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_APPCACHE; | ||||||
|  |     } else if (type == "cookies") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_COOKIES; | ||||||
|  |     } else if (type == "filesystem") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS; | ||||||
|  |     } else if (type == "indexdb") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_INDEXEDDB; | ||||||
|  |     } else if (type == "localstorage") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE; | ||||||
|  |     } else if (type == "shadercache") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE; | ||||||
|  |     } else if (type == "websql") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_WEBSQL; | ||||||
|  |     } else if (type == "serviceworkers") { | ||||||
|  |       storage_mask |= StoragePartition::REMOVE_DATA_MASK_SERVICE_WORKERS; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return storage_mask; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int GetQuotaMask(const std::vector<std::string>& quota_types) { | ||||||
|  |   int quota_mask = 0; | ||||||
|  | 
 | ||||||
|  |   for (auto &type : quota_types) { | ||||||
|  |     if (type == "temporary") { | ||||||
|  |       quota_mask |= StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY; | ||||||
|  |     } else if (type == "persistent") { | ||||||
|  |       quota_mask |= StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return quota_mask; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | }  // namespace
 | ||||||
|  | 
 | ||||||
| namespace atom { | namespace atom { | ||||||
| 
 | 
 | ||||||
| namespace api { | namespace api { | ||||||
|  | @ -80,6 +130,30 @@ class ResolveProxyHelper { | ||||||
|   DISALLOW_COPY_AND_ASSIGN(ResolveProxyHelper); |   DISALLOW_COPY_AND_ASSIGN(ResolveProxyHelper); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | void Noop(int result) { | ||||||
|  |   DCHECK(result == net::OK); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void DoClearCache(disk_cache::Backend** cache_ptr, | ||||||
|  |                   int result) { | ||||||
|  |   DCHECK(result == net::OK); | ||||||
|  |   if (cache_ptr && *cache_ptr) | ||||||
|  |     (*cache_ptr)->DoomAllEntries(base::Bind(&Noop)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ClearHttpCacheOnIO(net::URLRequestContextGetter* getter) { | ||||||
|  |   typedef disk_cache::Backend* Backendptr; | ||||||
|  |   Backendptr* cache_ptr = new Backendptr(nullptr); | ||||||
|  |   auto request_context = getter->GetURLRequestContext(); | ||||||
|  |   net::CompletionCallback callback(base::Bind(&DoClearCache, | ||||||
|  |                                               base::Owned(cache_ptr))); | ||||||
|  |   auto http_cache = request_context->http_transaction_factory()->GetCache(); | ||||||
|  |   int rv = http_cache->GetBackend(cache_ptr, callback); | ||||||
|  | 
 | ||||||
|  |   if (rv != net::ERR_IO_PENDING) | ||||||
|  |     callback.Run(net::OK); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| }  // namespace
 | }  // namespace
 | ||||||
| 
 | 
 | ||||||
| Session::Session(AtomBrowserContext* browser_context) | Session::Session(AtomBrowserContext* browser_context) | ||||||
|  | @ -94,6 +168,26 @@ void Session::ResolveProxy(const GURL& url, ResolveProxyCallback callback) { | ||||||
|   new ResolveProxyHelper(browser_context_, url, callback); |   new ResolveProxyHelper(browser_context_, url, callback); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Session::ClearCache(const base::Closure& callback) { | ||||||
|  |   auto getter = browser_context_->GetRequestContext(); | ||||||
|  |   BrowserThread::PostTaskAndReply(BrowserThread::IO, FROM_HERE, | ||||||
|  |       base::Bind(&ClearHttpCacheOnIO, | ||||||
|  |                  base::Unretained(getter)), | ||||||
|  |       callback); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Session::ClearStorageData(const GURL& origin, | ||||||
|  |                                const std::vector<std::string>& storage_types, | ||||||
|  |                                const std::vector<std::string>& quota_types, | ||||||
|  |                                const base::Closure& callback) { | ||||||
|  |   auto storage_partition = | ||||||
|  |       content::BrowserContext::GetStoragePartition(browser_context_, nullptr); | ||||||
|  |   storage_partition->ClearData( | ||||||
|  |       GetStorageMask(storage_types), GetQuotaMask(quota_types), origin, | ||||||
|  |       content::StoragePartition::OriginMatcherFunction(), | ||||||
|  |       base::Time(), base::Time::Max(), callback); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) { | v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) { | ||||||
|   if (cookies_.IsEmpty()) { |   if (cookies_.IsEmpty()) { | ||||||
|     auto handle = atom::api::Cookies::Create(isolate, browser_context_); |     auto handle = atom::api::Cookies::Create(isolate, browser_context_); | ||||||
|  | @ -106,6 +200,8 @@ mate::ObjectTemplateBuilder Session::GetObjectTemplateBuilder( | ||||||
|     v8::Isolate* isolate) { |     v8::Isolate* isolate) { | ||||||
|   return mate::ObjectTemplateBuilder(isolate) |   return mate::ObjectTemplateBuilder(isolate) | ||||||
|       .SetMethod("resolveProxy", &Session::ResolveProxy) |       .SetMethod("resolveProxy", &Session::ResolveProxy) | ||||||
|  |       .SetMethod("clearCache", &Session::ClearCache) | ||||||
|  |       .SetMethod("clearStorageData", &Session::ClearStorageData) | ||||||
|       .SetProperty("cookies", &Session::Cookies); |       .SetProperty("cookies", &Session::Cookies); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
| #define ATOM_BROWSER_API_ATOM_API_SESSION_H_ | #define ATOM_BROWSER_API_ATOM_API_SESSION_H_ | ||||||
| 
 | 
 | ||||||
| #include <string> | #include <string> | ||||||
|  | #include <vector> | ||||||
| 
 | 
 | ||||||
| #include "atom/browser/api/trackable_object.h" | #include "atom/browser/api/trackable_object.h" | ||||||
| #include "base/callback.h" | #include "base/callback.h" | ||||||
|  | @ -37,6 +38,11 @@ class Session: public mate::TrackableObject<Session> { | ||||||
| 
 | 
 | ||||||
|  private: |  private: | ||||||
|   void ResolveProxy(const GURL& url, ResolveProxyCallback callback); |   void ResolveProxy(const GURL& url, ResolveProxyCallback callback); | ||||||
|  |   void ClearCache(const base::Closure& callback); | ||||||
|  |   void ClearStorageData(const GURL& origin, | ||||||
|  |                         const std::vector<std::string>& storage_types, | ||||||
|  |                         const std::vector<std::string>& quota_types, | ||||||
|  |                         const base::Closure& callback); | ||||||
|   v8::Local<v8::Value> Cookies(v8::Isolate* isolate); |   v8::Local<v8::Value> Cookies(v8::Isolate* isolate); | ||||||
| 
 | 
 | ||||||
|   v8::Global<v8::Value> cookies_; |   v8::Global<v8::Value> cookies_; | ||||||
|  |  | ||||||
|  | @ -1055,7 +1055,9 @@ app.on('ready', function() { | ||||||
| 2. There is no way to send synchronous messages from the main process to a | 2. There is no way to send synchronous messages from the main process to a | ||||||
|    renderer process, because it would be very easy to cause dead locks. |    renderer process, because it would be very easy to cause dead locks. | ||||||
| 
 | 
 | ||||||
| ## Class: WebContents.session.cookies | ## Class: Session | ||||||
|  | 
 | ||||||
|  | ### Session.cookies | ||||||
| 
 | 
 | ||||||
| The `cookies` gives you ability to query and modify cookies, an example is: | The `cookies` gives you ability to query and modify cookies, an example is: | ||||||
| 
 | 
 | ||||||
|  | @ -1091,7 +1093,7 @@ win.webContents.on('did-finish-load', function() { | ||||||
| }); | }); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### WebContents.session.cookies.get(details, callback) | ### Session.cookies.get(details, callback) | ||||||
| 
 | 
 | ||||||
| * `details` Object | * `details` Object | ||||||
|   * `url` String - Retrieves cookies which are associated with `url`. |   * `url` String - Retrieves cookies which are associated with `url`. | ||||||
|  | @ -1118,7 +1120,7 @@ win.webContents.on('did-finish-load', function() { | ||||||
|          the number of seconds since the UNIX epoch. Not provided for session cookies. |          the number of seconds since the UNIX epoch. Not provided for session cookies. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### WebContents.session.cookies.set(details, callback) | ### Session.cookies.set(details, callback) | ||||||
| 
 | 
 | ||||||
| * `details` Object | * `details` Object | ||||||
|   * `url` String - Retrieves cookies which are associated with `url` |   * `url` String - Retrieves cookies which are associated with `url` | ||||||
|  | @ -1134,10 +1136,26 @@ win.webContents.on('did-finish-load', function() { | ||||||
| * `callback` Function - function(error) | * `callback` Function - function(error) | ||||||
|   * `error` Error |   * `error` Error | ||||||
| 
 | 
 | ||||||
| ### WebContents.session.cookies.remove(details, callback) | ### Session.cookies.remove(details, callback) | ||||||
| 
 | 
 | ||||||
| * `details` Object | * `details` Object | ||||||
|   * `url` String - The URL associated with the cookie |   * `url` String - The URL associated with the cookie | ||||||
|   * `name` String - The name of cookie to remove |   * `name` String - The name of cookie to remove | ||||||
| * `callback` Function - function(error) | * `callback` Function - function(error) | ||||||
|   * `error` Error |   * `error` Error | ||||||
|  | 
 | ||||||
|  | ### Session.clearCache() | ||||||
|  | 
 | ||||||
|  | Clears the session's http cache. | ||||||
|  | 
 | ||||||
|  | ### Session.clearStorageData(origin, storageType, quotaType, callback) | ||||||
|  | 
 | ||||||
|  | * `origin` String - should follow `window.location.origin` representation `scheme`://`host`:`port` | ||||||
|  | * `storageType` Array - specifies the type of storage, can contain - | ||||||
|  |     `appcache`, `cookies`, `filesystem`, `indexdb`, `localstorage`, `shadercache`, `websql`, | ||||||
|  |     `serviceworkers` | ||||||
|  | * `quotaType` Array - specifies the storage quota type, can contain - | ||||||
|  |     `temporary`, `persistent` | ||||||
|  | * `callback` Function | ||||||
|  | 
 | ||||||
|  | `callback` is invoked when the deletion process is scheduled. | ||||||
|  |  | ||||||
|  | @ -4,12 +4,12 @@ http    = require 'http' | ||||||
| path    = require 'path' | path    = require 'path' | ||||||
| BrowserWindow = remote.require 'browser-window' | BrowserWindow = remote.require 'browser-window' | ||||||
| 
 | 
 | ||||||
| describe 'cookies module', -> | describe 'session module', -> | ||||||
|   fixtures = path.resolve __dirname, 'fixtures' |   fixtures = path.resolve __dirname, 'fixtures' | ||||||
|   w = null |   w = null | ||||||
|   url = "http://127.0.0.1" |   url = "http://127.0.0.1" | ||||||
| 
 | 
 | ||||||
|   beforeEach -> w = new BrowserWindow(show: true) |   beforeEach -> w = new BrowserWindow(show: false, width: 400, height: 400) | ||||||
|   afterEach -> w.destroy() |   afterEach -> w.destroy() | ||||||
| 
 | 
 | ||||||
|   it 'should get cookies', (done) -> |   it 'should get cookies', (done) -> | ||||||
|  | @ -69,3 +69,16 @@ describe 'cookies module', -> | ||||||
|                 throw error if error |                 throw error if error | ||||||
|                 assert.equal 0, cookies_list.length |                 assert.equal 0, cookies_list.length | ||||||
|                 done() |                 done() | ||||||
|  | 
 | ||||||
|  |   describe 'session.clearStorageData(options)', -> | ||||||
|  |     fixtures = path.resolve __dirname, 'fixtures' | ||||||
|  |     it 'clears localstorage data', (done) -> | ||||||
|  |       ipc = remote.require('ipc') | ||||||
|  |       ipc.on 'count', (event, count) -> | ||||||
|  |         ipc.removeAllListeners 'count' | ||||||
|  |         assert not count | ||||||
|  |         done() | ||||||
|  |       w.loadUrl 'file://' + path.join(fixtures, 'api', 'localstorage.html') | ||||||
|  |       w.webContents.on 'did-finish-load', -> | ||||||
|  |         w.webContents.session.clearStorageData "file://", ['localstorage'], ['persistent'], -> | ||||||
|  |           w.webContents.send 'getcount' | ||||||
							
								
								
									
										11
									
								
								spec/fixtures/api/localstorage.html
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								spec/fixtures/api/localstorage.html
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | <html> | ||||||
|  | <body> | ||||||
|  | <script type="text/javascript" charset="utf-8"> | ||||||
|  | window.localStorage.setItem('test', 'test'); | ||||||
|  | var ipc = require('ipc'); | ||||||
|  | ipc.on('getcount', function() { | ||||||
|  |   ipc.send('count', window.localStorage.length); | ||||||
|  | }) | ||||||
|  | </script> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cheng Zhao
				Cheng Zhao