[Resource Timing] Gather timing information with reliable responseEnd time
[WebKit-https.git] / Source / WebCore / workers / WorkerScriptLoader.cpp
index c6d9ff4..62c9470 100644 (file)
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- *
  */
 
 #include "config.h"
-
 #include "WorkerScriptLoader.h"
 
+#include "ContentSecurityPolicy.h"
 #include "ResourceResponse.h"
 #include "ScriptExecutionContext.h"
-#include "SecurityOrigin.h"
 #include "TextResourceDecoder.h"
 #include "WorkerGlobalScope.h"
 #include "WorkerScriptLoaderClient.h"
 #include "WorkerThreadableLoader.h"
 #include <wtf/Ref.h>
-#include <wtf/RefPtr.h>
 
 namespace WebCore {
 
 WorkerScriptLoader::WorkerScriptLoader()
-    : m_client(0)
-    , m_failed(false)
-    , m_identifier(0)
-    , m_finishing(false)
 {
 }
 
@@ -53,42 +46,55 @@ WorkerScriptLoader::~WorkerScriptLoader()
 {
 }
 
-void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const URL& url, CrossOriginRequestPolicy crossOriginRequestPolicy)
+void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const URL& url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, const String& initiatorIdentifier)
 {
+    ASSERT(scriptExecutionContext);
+
     m_url = url;
 
-    std::unique_ptr<ResourceRequest> request(createResourceRequest());
+    std::unique_ptr<ResourceRequest> request(createResourceRequest(initiatorIdentifier));
     if (!request)
         return;
 
-    ASSERT_WITH_SECURITY_IMPLICATION(scriptExecutionContext->isWorkerGlobalScope());
+    ASSERT_WITH_SECURITY_IMPLICATION(is<WorkerGlobalScope>(scriptExecutionContext));
+
+    // Only used for importScripts that prescribes NoCors mode.
+    ASSERT(mode == FetchOptions::Mode::NoCors);
 
     ThreadableLoaderOptions options;
-    options.allowCredentials = AllowStoredCredentials;
-    options.crossOriginRequestPolicy = crossOriginRequestPolicy;
+    options.credentials = FetchOptions::Credentials::Include;
+    options.mode = mode;
     options.sendLoadCallbacks = SendCallbacks;
+    options.contentSecurityPolicyEnforcement = contentSecurityPolicyEnforcement;
 
-    WorkerThreadableLoader::loadResourceSynchronously(toWorkerGlobalScope(scriptExecutionContext), *request, *this, options);
+    WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>(*scriptExecutionContext), WTFMove(*request), *this, options);
 }
-    
-void WorkerScriptLoader::loadAsynchronously(ScriptExecutionContext* scriptExecutionContext, const URL& url, CrossOriginRequestPolicy crossOriginRequestPolicy, WorkerScriptLoaderClient* client)
+
+void WorkerScriptLoader::loadAsynchronously(ScriptExecutionContext* scriptExecutionContext, const URL& url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, const String& initiatorIdentifier, WorkerScriptLoaderClient* client)
 {
     ASSERT(client);
+    ASSERT(scriptExecutionContext);
+
     m_client = client;
     m_url = url;
 
-    std::unique_ptr<ResourceRequest> request(createResourceRequest());
+    std::unique_ptr<ResourceRequest> request(createResourceRequest(initiatorIdentifier));
     if (!request)
         return;
 
+    // Only used for loading worker scripts in classic mode.
+    // FIXME: We should add an option to set credential mode.
+    ASSERT(mode == FetchOptions::Mode::SameOrigin);
+
     ThreadableLoaderOptions options;
-    options.allowCredentials = AllowStoredCredentials;
-    options.crossOriginRequestPolicy = crossOriginRequestPolicy;
+    options.credentials = FetchOptions::Credentials::SameOrigin;
+    options.mode = mode;
     options.sendLoadCallbacks = SendCallbacks;
+    options.contentSecurityPolicyEnforcement = contentSecurityPolicyEnforcement;
 
     // During create, callbacks may happen which remove the last reference to this object.
-    Ref<WorkerScriptLoader> protect(*this);
-    m_threadableLoader = ThreadableLoader::create(scriptExecutionContext, this, *request, options);
+    Ref<WorkerScriptLoader> protectedThis(*this);
+    m_threadableLoader = ThreadableLoader::create(*scriptExecutionContext, *this, WTFMove(*request), options);
 }
 
 const URL& WorkerScriptLoader::responseURL() const
@@ -97,11 +103,12 @@ const URL& WorkerScriptLoader::responseURL() const
     return m_responseURL;
 }
 
-std::unique_ptr<ResourceRequest> WorkerScriptLoader::createResourceRequest()
+std::unique_ptr<ResourceRequest> WorkerScriptLoader::createResourceRequest(const String& initiatorIdentifier)
 {
     auto request = std::make_unique<ResourceRequest>(m_url);
-    request->setHTTPMethod("GET");
-    return std::move(request);
+    request->setHTTPMethod(ASCIILiteral("GET"));
+    request->setInitiatorIdentifier(initiatorIdentifier);
+    return request;
 }
     
 void WorkerScriptLoader::didReceiveResponse(unsigned long identifier, const ResourceResponse& response)
@@ -123,9 +130,9 @@ void WorkerScriptLoader::didReceiveData(const char* data, int len)
 
     if (!m_decoder) {
         if (!m_responseEncoding.isEmpty())
-            m_decoder = TextResourceDecoder::create("text/javascript", m_responseEncoding);
+            m_decoder = TextResourceDecoder::create(ASCIILiteral("text/javascript"), m_responseEncoding);
         else
-            m_decoder = TextResourceDecoder::create("text/javascript", "UTF-8");
+            m_decoder = TextResourceDecoder::create(ASCIILiteral("text/javascript"), "UTF-8");
     }
 
     if (!len)
@@ -137,7 +144,7 @@ void WorkerScriptLoader::didReceiveData(const char* data, int len)
     m_script.append(m_decoder->decode(data, len));
 }
 
-void WorkerScriptLoader::didFinishLoading(unsigned long identifier, double)
+void WorkerScriptLoader::didFinishLoading(unsigned long identifier)
 {
     if (m_failed) {
         notifyError();
@@ -156,11 +163,6 @@ void WorkerScriptLoader::didFail(const ResourceError&)
     notifyError();
 }
 
-void WorkerScriptLoader::didFailRedirectCheck()
-{
-    notifyError();
-}
-
 void WorkerScriptLoader::notifyError()
 {
     m_failed = true;