| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 #include "core/dom/ExecutionContext.h" | 41 #include "core/dom/ExecutionContext.h" |
| 42 #include "core/dom/MessagePort.h" | 42 #include "core/dom/MessagePort.h" |
| 43 #include "core/events/MessageEvent.h" | 43 #include "core/events/MessageEvent.h" |
| 44 #include "core/frame/LocalDOMWindow.h" | 44 #include "core/frame/LocalDOMWindow.h" |
| 45 #include "modules/EventTargetModules.h" | 45 #include "modules/EventTargetModules.h" |
| 46 #include "modules/serviceworkers/ServiceWorker.h" | 46 #include "modules/serviceworkers/ServiceWorker.h" |
| 47 #include "modules/serviceworkers/ServiceWorkerContainerClient.h" | 47 #include "modules/serviceworkers/ServiceWorkerContainerClient.h" |
| 48 #include "modules/serviceworkers/ServiceWorkerError.h" | 48 #include "modules/serviceworkers/ServiceWorkerError.h" |
| 49 #include "modules/serviceworkers/ServiceWorkerRegistration.h" | 49 #include "modules/serviceworkers/ServiceWorkerRegistration.h" |
| 50 #include "platform/RuntimeEnabledFeatures.h" | 50 #include "platform/RuntimeEnabledFeatures.h" |
| 51 #include "platform/weborigin/SchemeRegistry.h" |
| 51 #include "public/platform/WebServiceWorker.h" | 52 #include "public/platform/WebServiceWorker.h" |
| 52 #include "public/platform/WebServiceWorkerProvider.h" | 53 #include "public/platform/WebServiceWorkerProvider.h" |
| 53 #include "public/platform/WebServiceWorkerRegistration.h" | 54 #include "public/platform/WebServiceWorkerRegistration.h" |
| 54 #include "public/platform/WebString.h" | 55 #include "public/platform/WebString.h" |
| 55 #include "public/platform/WebURL.h" | 56 #include "public/platform/WebURL.h" |
| 56 | 57 |
| 57 namespace blink { | 58 namespace blink { |
| 58 | 59 |
| 59 class RegistrationCallback : public WebServiceWorkerProvider::WebServiceWorkerRe
gistrationCallbacks { | 60 class RegistrationCallback : public WebServiceWorkerProvider::WebServiceWorkerRe
gistrationCallbacks { |
| 60 public: | 61 public: |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 return promise; | 207 return promise; |
| 207 } | 208 } |
| 208 | 209 |
| 209 ExecutionContext* executionContext = scriptState->executionContext(); | 210 ExecutionContext* executionContext = scriptState->executionContext(); |
| 210 // FIXME: May be null due to worker termination: http://crbug.com/413518. | 211 // FIXME: May be null due to worker termination: http://crbug.com/413518. |
| 211 if (!executionContext) | 212 if (!executionContext) |
| 212 return ScriptPromise(); | 213 return ScriptPromise(); |
| 213 | 214 |
| 214 RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); | 215 RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); |
| 215 String errorMessage; | 216 String errorMessage; |
| 217 // Restrict to secure origins: https://w3c.github.io/webappsec/specs/powerfu
lfeatures/#settings-privileged |
| 216 if (!executionContext->isPrivilegedContext(errorMessage)) { | 218 if (!executionContext->isPrivilegedContext(errorMessage)) { |
| 217 resolver->reject(DOMException::create(NotSupportedError, errorMessage)); | 219 resolver->reject(DOMException::create(NotSupportedError, errorMessage)); |
| 218 return promise; | 220 return promise; |
| 219 } | 221 } |
| 220 | 222 |
| 221 KURL pageURL = KURL(KURL(), documentOrigin->toString()); | 223 KURL pageURL = KURL(KURL(), documentOrigin->toString()); |
| 222 if (!pageURL.protocolIsInHTTPFamily()) { | 224 if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(pageURL.pr
otocol())) { |
| 223 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The URL protocol of the current origin ('" + documentOrigin->t
oString() + "') is not supported.")); | 225 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The URL protocol of the current origin ('" + documentOrigin->t
oString() + "') is not supported.")); |
| 224 return promise; | 226 return promise; |
| 225 } | 227 } |
| 226 | 228 |
| 227 KURL scriptURL = callingExecutionContext(scriptState->isolate())->completeUR
L(url); | 229 KURL scriptURL = callingExecutionContext(scriptState->isolate())->completeUR
L(url); |
| 228 scriptURL.removeFragmentIdentifier(); | 230 scriptURL.removeFragmentIdentifier(); |
| 229 if (!documentOrigin->canRequest(scriptURL)) { | 231 if (!documentOrigin->canRequest(scriptURL)) { |
| 230 RefPtr<SecurityOrigin> scriptOrigin = SecurityOrigin::create(scriptURL); | 232 RefPtr<SecurityOrigin> scriptOrigin = SecurityOrigin::create(scriptURL); |
| 231 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The origin of the provided scriptURL ('" + scriptOrigin->toStr
ing() + "') does not match the current origin ('" + documentOrigin->toString() +
"').")); | 233 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The origin of the provided scriptURL ('" + scriptOrigin->toStr
ing() + "') does not match the current origin ('" + documentOrigin->toString() +
"').")); |
| 232 return promise; | 234 return promise; |
| 233 } | 235 } |
| 234 if (!scriptURL.protocolIsInHTTPFamily()) { | 236 if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(scriptURL.
protocol())) { |
| 235 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The URL protocol of the script ('" + scriptURL.string() + "')
is not supported.")); | 237 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The URL protocol of the script ('" + scriptURL.string() + "')
is not supported.")); |
| 236 return promise; | 238 return promise; |
| 237 } | 239 } |
| 238 | 240 |
| 239 KURL patternURL; | 241 KURL patternURL; |
| 240 if (options.scope().isNull()) | 242 if (options.scope().isNull()) |
| 241 patternURL = KURL(scriptURL, "./"); | 243 patternURL = KURL(scriptURL, "./"); |
| 242 else | 244 else |
| 243 patternURL = callingExecutionContext(scriptState->isolate())->completeUR
L(options.scope()); | 245 patternURL = callingExecutionContext(scriptState->isolate())->completeUR
L(options.scope()); |
| 244 patternURL.removeFragmentIdentifier(); | 246 patternURL.removeFragmentIdentifier(); |
| 245 | 247 |
| 246 if (!documentOrigin->canRequest(patternURL)) { | 248 if (!documentOrigin->canRequest(patternURL)) { |
| 247 RefPtr<SecurityOrigin> patternOrigin = SecurityOrigin::create(patternURL
); | 249 RefPtr<SecurityOrigin> patternOrigin = SecurityOrigin::create(patternURL
); |
| 248 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The origin of the provided scope ('" + patternOrigin->toString
() + "') does not match the current origin ('" + documentOrigin->toString() + "'
).")); | 250 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The origin of the provided scope ('" + patternOrigin->toString
() + "') does not match the current origin ('" + documentOrigin->toString() + "'
).")); |
| 249 return promise; | 251 return promise; |
| 250 } | 252 } |
| 251 if (!patternURL.protocolIsInHTTPFamily()) { | 253 if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(patternURL
.protocol())) { |
| 252 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The URL protocol of the scope ('" + patternURL.string() + "')
is not supported.")); | 254 resolver->reject(DOMException::create(SecurityError, "Failed to register
a ServiceWorker: The URL protocol of the scope ('" + patternURL.string() + "')
is not supported.")); |
| 253 return promise; | 255 return promise; |
| 254 } | 256 } |
| 255 | 257 |
| 256 m_provider->registerServiceWorker(patternURL, scriptURL, new RegistrationCal
lback(resolver)); | 258 m_provider->registerServiceWorker(patternURL, scriptURL, new RegistrationCal
lback(resolver)); |
| 257 | 259 |
| 258 return promise; | 260 return promise; |
| 259 } | 261 } |
| 260 | 262 |
| 261 ScriptPromise ServiceWorkerContainer::getRegistration(ScriptState* scriptState,
const String& documentURL) | 263 ScriptPromise ServiceWorkerContainer::getRegistration(ScriptState* scriptState,
const String& documentURL) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 274 return ScriptPromise(); | 276 return ScriptPromise(); |
| 275 | 277 |
| 276 RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); | 278 RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); |
| 277 String errorMessage; | 279 String errorMessage; |
| 278 if (!executionContext->isPrivilegedContext(errorMessage)) { | 280 if (!executionContext->isPrivilegedContext(errorMessage)) { |
| 279 resolver->reject(DOMException::create(NotSupportedError, errorMessage)); | 281 resolver->reject(DOMException::create(NotSupportedError, errorMessage)); |
| 280 return promise; | 282 return promise; |
| 281 } | 283 } |
| 282 | 284 |
| 283 KURL pageURL = KURL(KURL(), documentOrigin->toString()); | 285 KURL pageURL = KURL(KURL(), documentOrigin->toString()); |
| 284 if (!pageURL.protocolIsInHTTPFamily()) { | 286 if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(pageURL.pr
otocol())) { |
| 285 resolver->reject(DOMException::create(SecurityError, "Failed to get a Se
rviceWorkerRegistration: The URL protocol of the current origin ('" + documentOr
igin->toString() + "') is not supported.")); | 287 resolver->reject(DOMException::create(SecurityError, "Failed to get a Se
rviceWorkerRegistration: The URL protocol of the current origin ('" + documentOr
igin->toString() + "') is not supported.")); |
| 286 return promise; | 288 return promise; |
| 287 } | 289 } |
| 288 | 290 |
| 289 KURL completedURL = callingExecutionContext(scriptState->isolate())->complet
eURL(documentURL); | 291 KURL completedURL = callingExecutionContext(scriptState->isolate())->complet
eURL(documentURL); |
| 290 completedURL.removeFragmentIdentifier(); | 292 completedURL.removeFragmentIdentifier(); |
| 291 if (!documentOrigin->canRequest(completedURL)) { | 293 if (!documentOrigin->canRequest(completedURL)) { |
| 292 RefPtr<SecurityOrigin> documentURLOrigin = SecurityOrigin::create(comple
tedURL); | 294 RefPtr<SecurityOrigin> documentURLOrigin = SecurityOrigin::create(comple
tedURL); |
| 293 resolver->reject(DOMException::create(SecurityError, "Failed to get a Se
rviceWorkerRegistration: The origin of the provided documentURL ('" + documentUR
LOrigin->toString() + "') does not match the current origin ('" + documentOrigin
->toString() + "').")); | 295 resolver->reject(DOMException::create(SecurityError, "Failed to get a Se
rviceWorkerRegistration: The origin of the provided documentURL ('" + documentUR
LOrigin->toString() + "') does not match the current origin ('" + documentOrigin
->toString() + "').")); |
| 294 return promise; | 296 return promise; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 310 | 312 |
| 311 ExecutionContext* executionContext = scriptState->executionContext(); | 313 ExecutionContext* executionContext = scriptState->executionContext(); |
| 312 RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); | 314 RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); |
| 313 String errorMessage; | 315 String errorMessage; |
| 314 if (!executionContext->isPrivilegedContext(errorMessage)) { | 316 if (!executionContext->isPrivilegedContext(errorMessage)) { |
| 315 resolver->reject(DOMException::create(NotSupportedError, errorMessage)); | 317 resolver->reject(DOMException::create(NotSupportedError, errorMessage)); |
| 316 return promise; | 318 return promise; |
| 317 } | 319 } |
| 318 | 320 |
| 319 KURL pageURL = KURL(KURL(), documentOrigin->toString()); | 321 KURL pageURL = KURL(KURL(), documentOrigin->toString()); |
| 320 if (!pageURL.protocolIsInHTTPFamily()) { | 322 if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(pageURL.pr
otocol())) { |
| 321 resolver->reject(DOMException::create(SecurityError, "Failed to get Serv
iceWorkerRegistration objects: The URL protocol of the current origin ('" + docu
mentOrigin->toString() + "') is not supported.")); | 323 resolver->reject(DOMException::create(SecurityError, "Failed to get Serv
iceWorkerRegistration objects: The URL protocol of the current origin ('" + docu
mentOrigin->toString() + "') is not supported.")); |
| 322 return promise; | 324 return promise; |
| 323 } | 325 } |
| 324 | 326 |
| 325 m_provider->getRegistrations(new GetRegistrationsCallback(resolver)); | 327 m_provider->getRegistrations(new GetRegistrationsCallback(resolver)); |
| 326 | 328 |
| 327 return promise; | 329 return promise; |
| 328 } | 330 } |
| 329 | 331 |
| 330 ServiceWorkerContainer::ReadyProperty* ServiceWorkerContainer::createReadyProper
ty() | 332 ServiceWorkerContainer::ReadyProperty* ServiceWorkerContainer::createReadyProper
ty() |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 return; | 398 return; |
| 397 | 399 |
| 398 if (ServiceWorkerContainerClient* client = ServiceWorkerContainerClient::fro
m(executionContext)) { | 400 if (ServiceWorkerContainerClient* client = ServiceWorkerContainerClient::fro
m(executionContext)) { |
| 399 m_provider = client->provider(); | 401 m_provider = client->provider(); |
| 400 if (m_provider) | 402 if (m_provider) |
| 401 m_provider->setClient(this); | 403 m_provider->setClient(this); |
| 402 } | 404 } |
| 403 } | 405 } |
| 404 | 406 |
| 405 } // namespace blink | 407 } // namespace blink |
| OLD | NEW |