| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/service_worker/service_worker_storage.h" | 5 #include "content/browser/service_worker/service_worker_storage.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 NOTREACHED(); | 675 NOTREACHED(); |
| 676 // TODO(michaeln): Hmmm, what if DeleteReg was invoked after | 676 // TODO(michaeln): Hmmm, what if DeleteReg was invoked after |
| 677 // the Find result we're returning here? NOTREACHED condition? | 677 // the Find result we're returning here? NOTREACHED condition? |
| 678 return registration; | 678 return registration; |
| 679 } | 679 } |
| 680 | 680 |
| 681 ServiceWorkerRegistration* | 681 ServiceWorkerRegistration* |
| 682 ServiceWorkerStorage::FindInstallingRegistrationForDocument( | 682 ServiceWorkerStorage::FindInstallingRegistrationForDocument( |
| 683 const GURL& document_url) { | 683 const GURL& document_url) { |
| 684 DCHECK(!document_url.has_ref()); | 684 DCHECK(!document_url.has_ref()); |
| 685 // TODO(michaeln): if there are multiple matches the one with | 685 |
| 686 // the longest scope should win. | 686 LongestScopeMatcher matcher(document_url); |
| 687 ServiceWorkerRegistration* match = NULL; |
| 688 |
| 689 // TODO(nhiroki): This searches over installing registrations linearly and it |
| 690 // couldn't be scalable. Maybe the regs should be partitioned by origin. |
| 687 for (RegistrationRefsById::const_iterator it = | 691 for (RegistrationRefsById::const_iterator it = |
| 688 installing_registrations_.begin(); | 692 installing_registrations_.begin(); |
| 689 it != installing_registrations_.end(); ++it) { | 693 it != installing_registrations_.end(); ++it) { |
| 690 if (ServiceWorkerUtils::ScopeMatches( | 694 if (matcher.MatchLongest(it->second->pattern())) |
| 691 it->second->pattern(), document_url)) { | 695 match = it->second; |
| 692 return it->second; | |
| 693 } | |
| 694 } | 696 } |
| 695 return NULL; | 697 return match; |
| 696 } | 698 } |
| 697 | 699 |
| 698 ServiceWorkerRegistration* | 700 ServiceWorkerRegistration* |
| 699 ServiceWorkerStorage::FindInstallingRegistrationForPattern( | 701 ServiceWorkerStorage::FindInstallingRegistrationForPattern( |
| 700 const GURL& scope) { | 702 const GURL& scope) { |
| 701 for (RegistrationRefsById::const_iterator it = | 703 for (RegistrationRefsById::const_iterator it = |
| 702 installing_registrations_.begin(); | 704 installing_registrations_.begin(); |
| 703 it != installing_registrations_.end(); ++it) { | 705 it != installing_registrations_.end(); ++it) { |
| 704 if (it->second->pattern() == scope) | 706 if (it->second->pattern() == scope) |
| 705 return it->second; | 707 return it->second; |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 if (status != ServiceWorkerDatabase::STATUS_OK) { | 891 if (status != ServiceWorkerDatabase::STATUS_OK) { |
| 890 original_task_runner->PostTask( | 892 original_task_runner->PostTask( |
| 891 FROM_HERE, | 893 FROM_HERE, |
| 892 base::Bind(callback, | 894 base::Bind(callback, |
| 893 ServiceWorkerDatabase::RegistrationData(), | 895 ServiceWorkerDatabase::RegistrationData(), |
| 894 ResourceList(), | 896 ResourceList(), |
| 895 status)); | 897 status)); |
| 896 return; | 898 return; |
| 897 } | 899 } |
| 898 | 900 |
| 899 // Find one with a pattern match. | |
| 900 // TODO(michaeln): if there are multiple matches the one with | |
| 901 // the longest scope should win. | |
| 902 ServiceWorkerDatabase::RegistrationData data; | 901 ServiceWorkerDatabase::RegistrationData data; |
| 903 ResourceList resources; | 902 ResourceList resources; |
| 904 status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND; | 903 status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND; |
| 905 for (RegistrationList::const_iterator it = registrations.begin(); | 904 |
| 906 it != registrations.end(); ++it) { | 905 // Find one with a pattern match. |
| 907 if (!ServiceWorkerUtils::ScopeMatches(it->scope, document_url)) | 906 LongestScopeMatcher matcher(document_url); |
| 908 continue; | 907 int64 match = kInvalidServiceWorkerRegistrationId; |
| 909 status = database->ReadRegistration(it->registration_id, origin, | 908 for (size_t i = 0; i < registrations.size(); ++i) { |
| 910 &data, &resources); | 909 if (matcher.MatchLongest(registrations[i].scope)) |
| 911 break; // We're done looping. | 910 match = registrations[i].registration_id; |
| 912 } | 911 } |
| 913 | 912 |
| 913 if (match != kInvalidServiceWorkerRegistrationId) |
| 914 status = database->ReadRegistration(match, origin, &data, &resources); |
| 915 |
| 914 original_task_runner->PostTask( | 916 original_task_runner->PostTask( |
| 915 FROM_HERE, | 917 FROM_HERE, |
| 916 base::Bind(callback, data, resources, status)); | 918 base::Bind(callback, data, resources, status)); |
| 917 } | 919 } |
| 918 | 920 |
| 919 void ServiceWorkerStorage::FindForPatternInDB( | 921 void ServiceWorkerStorage::FindForPatternInDB( |
| 920 ServiceWorkerDatabase* database, | 922 ServiceWorkerDatabase* database, |
| 921 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 923 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 922 const GURL& scope, | 924 const GURL& scope, |
| 923 const FindInDBCallback& callback) { | 925 const FindInDBCallback& callback) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 const FindInDBCallback& callback) { | 963 const FindInDBCallback& callback) { |
| 962 ServiceWorkerDatabase::RegistrationData data; | 964 ServiceWorkerDatabase::RegistrationData data; |
| 963 ResourceList resources; | 965 ResourceList resources; |
| 964 ServiceWorkerDatabase::Status status = | 966 ServiceWorkerDatabase::Status status = |
| 965 database->ReadRegistration(registration_id, origin, &data, &resources); | 967 database->ReadRegistration(registration_id, origin, &data, &resources); |
| 966 original_task_runner->PostTask( | 968 original_task_runner->PostTask( |
| 967 FROM_HERE, base::Bind(callback, data, resources, status)); | 969 FROM_HERE, base::Bind(callback, data, resources, status)); |
| 968 } | 970 } |
| 969 | 971 |
| 970 } // namespace content | 972 } // namespace content |
| OLD | NEW |