| Index: content/browser/service_worker/service_worker_storage.cc | 
| diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc | 
| index 62d198bd5aa6e6678b0a66b786222d9d77415c29..6b9d62fab5c3c6fd1e2c61e18f5594a4d15c7ad2 100644 | 
| --- a/content/browser/service_worker/service_worker_storage.cc | 
| +++ b/content/browser/service_worker/service_worker_storage.cc | 
| @@ -672,17 +672,20 @@ ServiceWorkerStorage::GetOrCreateRegistration( | 
| ServiceWorkerRegistration* | 
| ServiceWorkerStorage::FindInstallingRegistrationForDocument( | 
| const GURL& document_url) { | 
| -  // TODO(michaeln): if there are multiple matches the one with | 
| -  // the longest scope should win. | 
| +  std::vector<GURL> scopes; | 
| +  scopes.reserve(installing_registrations_.size()); | 
| for (RegistrationRefsById::const_iterator it = | 
| installing_registrations_.begin(); | 
| it != installing_registrations_.end(); ++it) { | 
| -    if (ServiceWorkerUtils::ScopeMatches( | 
| -            it->second->pattern(), document_url)) { | 
| -      return it->second; | 
| -    } | 
| +    scopes.push_back(it->second->pattern()); | 
| } | 
| -  return NULL; | 
| + | 
| +  size_t pos = 0; | 
| +  if (!ServiceWorkerUtils::FindLongestScopeMatch(scopes, document_url, &pos)) | 
| +    return NULL; | 
| +  RegistrationRefsById::const_iterator it = installing_registrations_.begin(); | 
| +  std::advance(it, pos); | 
| +  return it->second; | 
| } | 
|  | 
| ServiceWorkerRegistration* | 
| @@ -887,18 +890,18 @@ void ServiceWorkerStorage::FindForDocumentInDB( | 
| } | 
|  | 
| // Find one with a pattern match. | 
| -  // TODO(michaeln): if there are multiple matches the one with | 
| -  // the longest scope should win. | 
| ServiceWorkerDatabase::RegistrationData data; | 
| ResourceList resources; | 
| status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND; | 
| -  for (RegistrationList::const_iterator it = registrations.begin(); | 
| -       it != registrations.end(); ++it) { | 
| -    if (!ServiceWorkerUtils::ScopeMatches(it->scope, document_url)) | 
| -      continue; | 
| -    status = database->ReadRegistration(it->registration_id, origin, | 
| -                                        &data, &resources); | 
| -    break;  // We're done looping. | 
| + | 
| +  std::vector<GURL> scopes; | 
| +  scopes.reserve(registrations.size()); | 
| +  for (size_t i = 0; i < registrations.size(); ++i) | 
| +    scopes.push_back(registrations[i].scope); | 
| +  size_t pos = 0; | 
| +  if (ServiceWorkerUtils::FindLongestScopeMatch(scopes, document_url, &pos)) { | 
| +    status = database->ReadRegistration(registrations[pos].registration_id, | 
| +                                        origin, &data, &resources); | 
| } | 
|  | 
| original_task_runner->PostTask( | 
|  |