Chromium Code Reviews| Index: content/browser/service_worker/service_worker_dispatcher_host.cc |
| diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc |
| index 29017a4ce4dbb58774f2be5bab84ea6c74389ae9..49f3c8394f89c08886e254295bc6107e8080c92c 100644 |
| --- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
| +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
| @@ -19,6 +19,7 @@ |
| #include "content/common/service_worker/embedded_worker_messages.h" |
| #include "content/common/service_worker/service_worker_messages.h" |
| #include "ipc/ipc_message_macros.h" |
| +#include "net/base/net_util.h" |
| #include "third_party/WebKit/public/platform/WebServiceWorkerError.h" |
| #include "url/gurl.h" |
| @@ -36,30 +37,41 @@ const uint32 kFilteredMessageClasses[] = { |
| EmbeddedWorkerMsgStart, |
| }; |
| -// TODO(dominicc): When crbug.com/362214 is fixed, make |
| -// Can(R|Unr)egisterServiceWorker also check that these are secure |
| -// origins to defend against compromised renderers. |
| +bool AllOriginsMatch(const GURL& url_a, const GURL& url_b, const GURL& url_c) { |
| + return url_a.GetOrigin() == url_b.GetOrigin() && |
| + url_a.GetOrigin() == url_c.GetOrigin(); |
| +} |
| + |
| +// TODO(dominicc): When crbug.com/362214 is fixed use that to be |
| +// consistent with Blink's |
| +// SecurityOrigin::canAccessFeatureRequiringSecureOrigin. |
| +bool OriginCanAccessServiceWorkers(const GURL& url) { |
| + return url.SchemeIsSecure() || net::IsLocalhost(url.host()); |
|
michaeln
2014/10/02 23:00:25
This allows filesystem: urls and wss: urls. All be
|
| +} |
| + |
| bool CanRegisterServiceWorker(const GURL& document_url, |
| const GURL& pattern, |
| const GURL& script_url) { |
| // TODO: Respect Chrome's content settings, if we add a setting for |
| // controlling whether Service Worker is allowed. |
| - return document_url.GetOrigin() == pattern.GetOrigin() && |
| - document_url.GetOrigin() == script_url.GetOrigin(); |
| + return AllOriginsMatch(document_url, pattern, script_url) && |
| + OriginCanAccessServiceWorkers(document_url); |
| } |
| bool CanUnregisterServiceWorker(const GURL& document_url, |
| const GURL& pattern) { |
| // TODO: Respect Chrome's content settings, if we add a setting for |
| // controlling whether Service Worker is allowed. |
| - return document_url.GetOrigin() == pattern.GetOrigin(); |
| + return document_url.GetOrigin() == pattern.GetOrigin() && |
| + OriginCanAccessServiceWorkers(document_url); |
| } |
| bool CanGetRegistration(const GURL& document_url, |
| const GURL& given_document_url) { |
| // TODO: Respect Chrome's content settings, if we add a setting for |
| // controlling whether Service Worker is allowed. |
| - return document_url.GetOrigin() == given_document_url.GetOrigin(); |
| + return document_url.GetOrigin() == given_document_url.GetOrigin() && |
| + OriginCanAccessServiceWorkers(document_url); |
| } |
| } // namespace |