blob: 2c3d05b773fcecf90f95841c7e65eb83702fa705 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/service_worker/service_worker_utils.h"
#include <string>
#include "base/command_line.h"
#include "base/logging.h"
#include "content/public/common/content_switches.h"
#include "url/gurl.h"
namespace content {
// static
bool ServiceWorkerUtils::IsFeatureEnabled() {
static bool enabled = CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableServiceWorker);
return enabled;
}
// static
bool ServiceWorkerUtils::ScopeMatches(const GURL& scope, const GURL& url) {
DCHECK(!scope.has_ref());
DCHECK(!url.has_ref());
const std::string& scope_spec = scope.spec();
const std::string& url_spec = url.spec();
size_t len = scope_spec.size();
if (len > 0 && scope_spec[len - 1] == '*')
return scope_spec.compare(0, len - 1, url_spec, 0, len - 1) == 0;
return scope_spec == url_spec;
}
bool LongestScopeMatcher::MatchLongest(const GURL& scope) {
if (!ServiceWorkerUtils::ScopeMatches(scope, url_))
return false;
if (match_.is_empty()) {
match_ = scope;
return true;
}
const std::string match_spec = match_.spec();
const std::string scope_spec = scope.spec();
if (match_spec.size() < scope_spec.size()) {
match_ = scope;
return true;
}
// If |scope| has the same length with |match_|, they are compared as strings.
// For example:
// 1) for a document "/foo", "/foo" is prioritized over "/fo*".
// 2) for a document "/f(1)", "/f(1*" is prioritized over "/f(1)".
// TODO(nhiroki): This isn't in the spec.
// (https://github.com/slightlyoff/ServiceWorker/issues/287)
if (match_spec.size() == scope_spec.size() && match_spec < scope_spec) {
match_ = scope;
return true;
}
return false;
}
} // namespace content