Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(116)

Side by Side Diff: content/browser/dom_storage/dom_storage_context_impl.cc

Issue 757723002: [Tests not passing yet] Remove prerender sessionStorage namespace merging. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "content/browser/dom_storage/dom_storage_context_impl.h" 5 #include "content/browser/dom_storage/dom_storage_context_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/files/file_enumerator.h" 9 #include "base/files/file_enumerator.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 } 220 }
221 221
222 void DOMStorageContextImpl::NotifyAreaCleared( 222 void DOMStorageContextImpl::NotifyAreaCleared(
223 const DOMStorageArea* area, 223 const DOMStorageArea* area,
224 const GURL& page_url) { 224 const GURL& page_url) {
225 FOR_EACH_OBSERVER( 225 FOR_EACH_OBSERVER(
226 EventObserver, event_observers_, 226 EventObserver, event_observers_,
227 OnDOMStorageAreaCleared(area, page_url)); 227 OnDOMStorageAreaCleared(area, page_url));
228 } 228 }
229 229
230 void DOMStorageContextImpl::NotifyAliasSessionMerged(
231 int64 namespace_id,
232 DOMStorageNamespace* old_alias_master_namespace) {
233 FOR_EACH_OBSERVER(
234 EventObserver, event_observers_,
235 OnDOMSessionStorageReset(namespace_id));
236 if (old_alias_master_namespace)
237 MaybeShutdownSessionNamespace(old_alias_master_namespace);
238 }
239
240 std::string DOMStorageContextImpl::AllocatePersistentSessionId() { 230 std::string DOMStorageContextImpl::AllocatePersistentSessionId() {
241 std::string guid = base::GenerateGUID(); 231 std::string guid = base::GenerateGUID();
242 std::replace(guid.begin(), guid.end(), '-', '_'); 232 std::replace(guid.begin(), guid.end(), '-', '_');
243 return guid; 233 return guid;
244 } 234 }
245 235
246 void DOMStorageContextImpl::CreateSessionNamespace( 236 void DOMStorageContextImpl::CreateSessionNamespace(
247 int64 namespace_id, 237 int64 namespace_id,
248 const std::string& persistent_namespace_id) { 238 const std::string& persistent_namespace_id) {
249 if (is_shutdown_) 239 if (is_shutdown_)
250 return; 240 return;
251 DCHECK(namespace_id != kLocalStorageNamespaceId); 241 DCHECK(namespace_id != kLocalStorageNamespaceId);
252 DCHECK(namespaces_.find(namespace_id) == namespaces_.end()); 242 DCHECK(namespaces_.find(namespace_id) == namespaces_.end());
253 namespaces_[namespace_id] = new DOMStorageNamespace( 243 namespaces_[namespace_id] = new DOMStorageNamespace(
254 namespace_id, persistent_namespace_id, session_storage_database_.get(), 244 namespace_id, persistent_namespace_id, session_storage_database_.get(),
255 task_runner_.get()); 245 task_runner_.get());
256 persistent_namespace_id_to_namespace_id_[persistent_namespace_id] = 246 persistent_namespace_id_to_namespace_id_[persistent_namespace_id] =
257 namespace_id; 247 namespace_id;
258 } 248 }
259 249
260 void DOMStorageContextImpl::DeleteSessionNamespace( 250 void DOMStorageContextImpl::DeleteSessionNamespace(
261 int64 namespace_id, bool should_persist_data) { 251 int64 namespace_id, bool should_persist_data) {
262 DCHECK_NE(kLocalStorageNamespaceId, namespace_id); 252 DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
263 StorageNamespaceMap::const_iterator it = namespaces_.find(namespace_id); 253 StorageNamespaceMap::const_iterator it = namespaces_.find(namespace_id);
264 if (it == namespaces_.end() || 254 if (it == namespaces_.end())
265 it->second->ready_for_deletion_pending_aliases()) {
266 return; 255 return;
267 } 256 std::string persistent_namespace_id = it->second->persistent_namespace_id();
268 it->second->set_ready_for_deletion_pending_aliases(true);
269 DOMStorageNamespace* alias_master = it->second->alias_master_namespace();
270 if (alias_master) {
271 DCHECK(it->second->num_aliases() == 0);
272 DCHECK(alias_master->alias_master_namespace() == NULL);
273 if (should_persist_data)
274 alias_master->set_must_persist_at_shutdown(true);
275 if (it->second->DecrementMasterAliasCount())
276 MaybeShutdownSessionNamespace(alias_master);
277 namespaces_.erase(namespace_id);
278 } else {
279 if (should_persist_data)
280 it->second->set_must_persist_at_shutdown(true);
281 MaybeShutdownSessionNamespace(it->second.get());
282 }
283 }
284
285 void DOMStorageContextImpl::MaybeShutdownSessionNamespace(
286 DOMStorageNamespace* ns) {
287 if (ns->num_aliases() > 0 || !ns->ready_for_deletion_pending_aliases())
288 return;
289 DCHECK_EQ(ns->num_aliases(), 0);
290 DCHECK(ns->alias_master_namespace() == NULL);
291 std::string persistent_namespace_id = ns->persistent_namespace_id();
292 if (session_storage_database_.get()) { 257 if (session_storage_database_.get()) {
293 if (!ns->must_persist_at_shutdown()) { 258 if (!should_persist_data) {
294 task_runner_->PostShutdownBlockingTask( 259 task_runner_->PostShutdownBlockingTask(
295 FROM_HERE, 260 FROM_HERE,
296 DOMStorageTaskRunner::COMMIT_SEQUENCE, 261 DOMStorageTaskRunner::COMMIT_SEQUENCE,
297 base::Bind( 262 base::Bind(
298 base::IgnoreResult(&SessionStorageDatabase::DeleteNamespace), 263 base::IgnoreResult(&SessionStorageDatabase::DeleteNamespace),
299 session_storage_database_, 264 session_storage_database_,
300 persistent_namespace_id)); 265 persistent_namespace_id));
301 } else { 266 } else {
302 // Ensure that the data gets committed before we shut down. 267 // Ensure that the data gets committed before we shut down.
303 ns->Shutdown(); 268 it->second->Shutdown();
304 if (!scavenging_started_) { 269 if (!scavenging_started_) {
305 // Protect the persistent namespace ID from scavenging. 270 // Protect the persistent namespace ID from scavenging.
306 protected_persistent_session_ids_.insert(persistent_namespace_id); 271 protected_persistent_session_ids_.insert(persistent_namespace_id);
307 } 272 }
308 } 273 }
309 } 274 }
310 persistent_namespace_id_to_namespace_id_.erase(persistent_namespace_id); 275 persistent_namespace_id_to_namespace_id_.erase(persistent_namespace_id);
311 namespaces_.erase(ns->namespace_id()); 276 namespaces_.erase(namespace_id);
312 } 277 }
313 278
314 void DOMStorageContextImpl::CloneSessionNamespace( 279 void DOMStorageContextImpl::CloneSessionNamespace(
315 int64 existing_id, int64 new_id, 280 int64 existing_id, int64 new_id,
316 const std::string& new_persistent_id) { 281 const std::string& new_persistent_id) {
317 if (is_shutdown_) 282 if (is_shutdown_)
318 return; 283 return;
319 DCHECK_NE(kLocalStorageNamespaceId, existing_id); 284 DCHECK_NE(kLocalStorageNamespaceId, existing_id);
320 DCHECK_NE(kLocalStorageNamespaceId, new_id); 285 DCHECK_NE(kLocalStorageNamespaceId, new_id);
321 StorageNamespaceMap::iterator found = namespaces_.find(existing_id); 286 StorageNamespaceMap::iterator found = namespaces_.find(existing_id);
322 if (found != namespaces_.end()) 287 if (found != namespaces_.end())
323 namespaces_[new_id] = found->second->Clone(new_id, new_persistent_id); 288 namespaces_[new_id] = found->second->Clone(new_id, new_persistent_id);
324 else 289 else
325 CreateSessionNamespace(new_id, new_persistent_id); 290 CreateSessionNamespace(new_id, new_persistent_id);
326 } 291 }
327 292
328 void DOMStorageContextImpl::CreateAliasSessionNamespace(
329 int64 existing_id, int64 new_id,
330 const std::string& persistent_id) {
331 if (is_shutdown_)
332 return;
333 DCHECK_NE(kLocalStorageNamespaceId, existing_id);
334 DCHECK_NE(kLocalStorageNamespaceId, new_id);
335 StorageNamespaceMap::iterator found = namespaces_.find(existing_id);
336 if (found != namespaces_.end()) {
337 namespaces_[new_id] = found->second->CreateAlias(new_id);
338 } else {
339 CreateSessionNamespace(new_id, persistent_id);
340 }
341 }
342
343 void DOMStorageContextImpl::ClearSessionOnlyOrigins() { 293 void DOMStorageContextImpl::ClearSessionOnlyOrigins() {
344 if (!localstorage_directory_.empty()) { 294 if (!localstorage_directory_.empty()) {
345 std::vector<LocalStorageUsageInfo> infos; 295 std::vector<LocalStorageUsageInfo> infos;
346 const bool kDontIncludeFileInfo = false; 296 const bool kDontIncludeFileInfo = false;
347 GetLocalStorageUsage(&infos, kDontIncludeFileInfo); 297 GetLocalStorageUsage(&infos, kDontIncludeFileInfo);
348 for (size_t i = 0; i < infos.size(); ++i) { 298 for (size_t i = 0; i < infos.size(); ++i) {
349 const GURL& origin = infos[i].origin; 299 const GURL& origin = infos[i].origin;
350 if (special_storage_policy_->IsStorageProtected(origin)) 300 if (special_storage_policy_->IsStorageProtected(origin))
351 continue; 301 continue;
352 if (!special_storage_policy_->IsStorageSessionOnly(origin)) 302 if (!special_storage_policy_->IsStorageSessionOnly(origin))
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 deletable_persistent_namespace_ids_.pop_back(); 401 deletable_persistent_namespace_ids_.pop_back();
452 if (!deletable_persistent_namespace_ids_.empty()) { 402 if (!deletable_persistent_namespace_ids_.empty()) {
453 task_runner_->PostDelayedTask( 403 task_runner_->PostDelayedTask(
454 FROM_HERE, base::Bind( 404 FROM_HERE, base::Bind(
455 &DOMStorageContextImpl::DeleteNextUnusedNamespace, 405 &DOMStorageContextImpl::DeleteNextUnusedNamespace,
456 this), 406 this),
457 base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds)); 407 base::TimeDelta::FromSeconds(kSessionStoraceScavengingSeconds));
458 } 408 }
459 } 409 }
460 410
461 void DOMStorageContextImpl::AddTransactionLogProcessId(int64 namespace_id,
462 int process_id) {
463 DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
464 StorageNamespaceMap::const_iterator it = namespaces_.find(namespace_id);
465 if (it == namespaces_.end())
466 return;
467 it->second->AddTransactionLogProcessId(process_id);
468 }
469
470 void DOMStorageContextImpl::RemoveTransactionLogProcessId(int64 namespace_id,
471 int process_id) {
472 DCHECK_NE(kLocalStorageNamespaceId, namespace_id);
473 StorageNamespaceMap::const_iterator it = namespaces_.find(namespace_id);
474 if (it == namespaces_.end())
475 return;
476 it->second->RemoveTransactionLogProcessId(process_id);
477 }
478
479 SessionStorageNamespace::MergeResult
480 DOMStorageContextImpl::MergeSessionStorage(
481 int64 namespace1_id, bool actually_merge, int process_id,
482 int64 namespace2_id) {
483 DCHECK_NE(kLocalStorageNamespaceId, namespace1_id);
484 DCHECK_NE(kLocalStorageNamespaceId, namespace2_id);
485 StorageNamespaceMap::const_iterator it = namespaces_.find(namespace1_id);
486 if (it == namespaces_.end())
487 return SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_FOUND;
488 DOMStorageNamespace* ns1 = it->second.get();
489 it = namespaces_.find(namespace2_id);
490 if (it == namespaces_.end())
491 return SessionStorageNamespace::MERGE_RESULT_NAMESPACE_NOT_FOUND;
492 DOMStorageNamespace* ns2 = it->second.get();
493 return ns1->Merge(actually_merge, process_id, ns2, this);
494 }
495
496 } // namespace content 411 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698