Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Unified Diff: Source/bindings/dart/DartController.cpp

Issue 26490003: Reapply "Move isolate loading to a separate loader isolate." (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: Initialize flag properly Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/dart/DartController.h ('k') | Source/bindings/dart/DartDOMData.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/dart/DartController.cpp
diff --git a/Source/bindings/dart/DartController.cpp b/Source/bindings/dart/DartController.cpp
index 7e462c0989d4fdec8717c9ddba3c4b341bb5cfe2..779a088a033fc40ce6f15cd328cb61183210147d 100644
--- a/Source/bindings/dart/DartController.cpp
+++ b/Source/bindings/dart/DartController.cpp
@@ -35,6 +35,7 @@
#include "HTMLNames.h"
#include "V8Navigator.h"
#include "bindings/dart/DartApplicationLoader.h"
+#include "bindings/dart/DartAsyncLoader.h"
#include "bindings/dart/DartDOMData.h"
#include "bindings/dart/DartDOMWrapper.h"
#include "bindings/dart/DartDebugServer.h"
@@ -317,57 +318,34 @@ public:
void dispatchErrorEvent() { }
};
-class ApplicationLoadedCallback : public VoidCallback {
+class DartSpawnLoadCallback : public DartAsyncLoader::LoadCallback {
public:
- ApplicationLoadedCallback(Dart_Isolate isolate, PassRefPtr<Document> document) : m_isolate(isolate), m_document(document) { }
-
- bool handleEvent()
+ DartSpawnLoadCallback(Dart_Isolate isolate, const String& url, Document* originDocument)
+ : LoadCallback(originDocument)
+ , m_isolate(isolate)
+ , m_url(url)
{
- ASSERT(isMainThread());
- ASSERT(Dart_CurrentIsolate() == m_isolate);
-
- Dart_ExitIsolate();
- Dart_IsolateMakeRunnable(m_isolate);
- Dart_EnterIsolate(m_isolate);
-
- return true;
}
-private:
- Dart_Isolate m_isolate;
- RefPtr<Document> m_document;
-};
-
-class LoadIsolateSourcesTask : public ScriptExecutionContext::Task {
-public:
- LoadIsolateSourcesTask(const char* url, Dart_Isolate isolate, Document* document)
- : m_url(strdup(url)), m_isolate(isolate), m_document(document)
- { }
-
- ~LoadIsolateSourcesTask()
+ void ready(PassRefPtr<DartAsyncLoader> loader)
{
- free(m_url);
- }
+ RefPtr<DartAsyncLoader> asyncLoader = loader;
+ RefPtr<SpawnUriErrorEventDispatcher> errorEventDispatcher = adoptRef(new SpawnUriErrorEventDispatcher());
- virtual void performTask(ScriptExecutionContext* context)
- {
- ASSERT(isMainThread());
+ RefPtr<DartApplicationLoader> applicationLoader = adoptRef(new DartApplicationLoader(m_isolate, document(), errorEventDispatcher, asyncLoader, false));
- RefPtr<SpawnUriErrorEventDispatcher> errorEventDispatcher = adoptRef(new SpawnUriErrorEventDispatcher());
- RefPtr<VoidCallback> applicationLoadedCallback = adoptRef(new ApplicationLoadedCallback(m_isolate, m_document));
- RefPtr<DartApplicationLoader> applicationLoader = adoptRef(new DartApplicationLoader(m_isolate, m_document, errorEventDispatcher, applicationLoadedCallback, false));
- applicationLoader->loadScriptResource(m_url);
+ applicationLoader->load(asyncLoader->scriptUrl(), asyncLoader->scriptSource(), asyncLoader->scriptLineNumber());
+ Dart_IsolateMakeRunnable(m_isolate);
}
private:
- char* const m_url;
- const Dart_Isolate m_isolate;
- Document* m_document;
+ Dart_Isolate m_isolate;
+ String m_url;
};
Dart_Isolate DartController::createPureIsolateCallback(const char* scriptURL, const char* entryPoint, void* data, char** errorMsg)
{
- bool needApplicationLoader = false;
+ bool needAsyncLoader = false;
{
DartApiScope apiScope;
@@ -389,7 +367,7 @@ Dart_Isolate DartController::createPureIsolateCallback(const char* scriptURL, co
return 0;
}
- needApplicationLoader = strcmp(scriptURL, parentIsolateURL);
+ needAsyncLoader = strcmp(scriptURL, parentIsolateURL);
}
DartDOMData* parentDOMData = static_cast<DartDOMData*>(data);
@@ -401,8 +379,12 @@ Dart_Isolate DartController::createPureIsolateCallback(const char* scriptURL, co
if (!isolate)
return 0;
- if (needApplicationLoader) {
- context->postTask(adoptPtr(new LoadIsolateSourcesTask(scriptURL, isolate, document)));
+ if (needAsyncLoader) {
+ // We need to request the sources asynchronously.
+ RefPtr<DartSpawnLoadCallback> callback = adoptRef(new DartSpawnLoadCallback(isolate, scriptURL, document));
+ // A DartAsyncLoader will delete itself once all resources are fetched.
+ DartAsyncLoader* asyncLoader = new DartAsyncLoader(scriptURL, callback);
+ asyncLoader->fetchScriptResource(scriptURL);
Dart_ExitIsolate();
} else {
// FIXME: avoid copying parent snapshot.
@@ -556,7 +538,6 @@ bool DartController::isDartMimeType(const String& mimeType)
return !mimeType.isEmpty() && types.contains(mimeType);
}
-
class DartScriptRunner : public EventListener {
public:
static PassRefPtr<DartScriptRunner> create()
@@ -659,6 +640,11 @@ public:
return m_scriptElement->startLineNumber();
}
+ ScriptLoader* loader()
+ {
+ return m_scriptElement;
+ }
+
virtual ~ScriptElementProxy() { }
protected:
@@ -728,6 +714,42 @@ private:
}
};
+class DartDomLoadCallback : public DartAsyncLoader::LoadCallback {
+public:
+ DartDomLoadCallback(DartController* controller, const String& url, Document* originDocument, PassRefPtr<ScriptElementProxy> proxy)
+ : LoadCallback(originDocument, proxy->loader())
+ , m_controller(controller)
+ , m_url(url)
+ , m_proxy(proxy)
+ {
+ }
+
+ void ready(PassRefPtr<DartAsyncLoader> asyncLoader)
+ {
+ m_controller->loadAndRunScript(m_url, asyncLoader, m_proxy);
+ }
+
+private:
+ DartController* m_controller;
+ String m_url;
+ RefPtr<ScriptElementProxy> m_proxy;
+};
+
+void DartController::loadAndRunScript(const String& url, PassRefPtr<DartAsyncLoader> loader, PassRefPtr<ScriptElementProxy> proxy)
+{
+ RefPtr<DartAsyncLoader> asyncLoader = loader;
+ Document* document = frame()->document();
+
+ createDOMEnabledIsolate(url, "main", document);
+
+ // FIXME: it may make sense to ensure that we'll never call evaluate more than once for the same script tag.
+ RefPtr<DartApplicationLoader> applicationLoader = adoptRef(new DartApplicationLoader(Dart_CurrentIsolate(), document, proxy, asyncLoader));
+ applicationLoader->load(asyncLoader->scriptUrl(), asyncLoader->scriptSource(), asyncLoader->scriptLineNumber());
+
+ Dart_ExitIsolate();
+}
+
+
void DartController::loadScripts()
{
if (m_scriptsLoaded)
@@ -754,16 +776,18 @@ void DartController::loadScripts()
continue;
String scriptURL = scriptElementProxy->sourceAttributeValue();
- createDOMEnabledIsolate(scriptURL, "main", document);
+ String url = scriptURL.isEmpty() ? document->url() : scriptURL;
+
+ RefPtr<DartDomLoadCallback> callback = adoptRef(new DartDomLoadCallback(this, url, document, scriptElementProxy));
- // FIXME: it may make sense to ensure that we'll never call evaluate more than once for the same script tag.
- RefPtr<DartApplicationLoader> applicationLoader = adoptRef(new DartApplicationLoader(Dart_CurrentIsolate(), document, scriptElementProxy));
+ // A DartAsyncLoader will delete itself once all resources are fetched.
+ DartAsyncLoader* asyncLoader = new DartAsyncLoader(url, callback);
+ WTF::OrdinalNumber startLineNumber = scriptElementProxy->startLineNumber();
+ intptr_t lineOffset = startLineNumber == OrdinalNumber::beforeFirst() ? 0 : startLineNumber.zeroBasedInt();
if (scriptURL.isEmpty())
- applicationLoader->load(m_frame->document()->url(), scriptElementProxy->scriptContent(), scriptElementProxy->startLineNumber());
+ asyncLoader->process(m_frame->document()->url(), scriptElementProxy->scriptContent(), lineOffset);
else
- applicationLoader->loadScriptResource(scriptURL);
-
- Dart_ExitIsolate();
+ asyncLoader->fetchScriptResource(scriptURL);
}
m_scriptsLoaded = true;
« no previous file with comments | « Source/bindings/dart/DartController.h ('k') | Source/bindings/dart/DartDOMData.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698