summaryrefslogtreecommitdiffstats
path: root/gin/modules/module_registry.h
diff options
context:
space:
mode:
Diffstat (limited to 'gin/modules/module_registry.h')
-rw-r--r--gin/modules/module_registry.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/gin/modules/module_registry.h b/gin/modules/module_registry.h
new file mode 100644
index 0000000..7cff355
--- /dev/null
+++ b/gin/modules/module_registry.h
@@ -0,0 +1,65 @@
+// Copyright 2013 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.
+
+#ifndef GIN_MODULES_MODULE_REGISTRY_H_
+#define GIN_MODULES_MODULE_REGISTRY_H_
+
+#include <list>
+#include <string>
+#include "base/compiler_specific.h"
+#include "gin/per_context_data.h"
+
+namespace gin {
+
+struct PendingModule;
+
+// This class implements the Asynchronous Module Definition (AMD) API.
+// https://github.com/amdjs/amdjs-api/wiki/AMD
+//
+// Our implementation isn't complete yet. Missing features:
+// 1) Built-in support for require, exports, and module.
+// 2) Path resoltuion in module names.
+//
+// For these reasons, we don't have an "amd" property on the "define"
+// function. The spec says we should only add that property once our
+// implementation complies with the specification.
+//
+class ModuleRegistry : public ContextSupplement {
+ public:
+ static ModuleRegistry* From(v8::Handle<v8::Context> context);
+
+ static void RegisterGlobals(v8::Isolate* isolate,
+ v8::Handle<v8::ObjectTemplate> templ);
+
+ // The caller must have already entered our context.
+ void AddBuiltinModule(v8::Isolate* isolate,
+ const std::string& id,
+ v8::Handle<v8::ObjectTemplate> templ);
+
+ // Takes ownership of |pending|. The caller must have already entered
+ // our context.
+ void AddPendingModule(v8::Isolate* isolate, PendingModule* pending);
+
+ private:
+ typedef std::list<PendingModule*> PendingModuleList; // Owning reference.
+
+ explicit ModuleRegistry(v8::Isolate* isolate);
+ virtual ~ModuleRegistry();
+
+ // From ContextSupplement:
+ virtual void Detach(v8::Handle<v8::Context> context) OVERRIDE;
+
+ // Takes ownership of |pending|.
+ bool AttemptToLoad(v8::Isolate* isolate, PendingModule* pending);
+ void AttemptToLoadPendingModules(v8::Isolate* isolate);
+
+ v8::Persistent<v8::Object> modules_;
+ PendingModuleList pending_modules_;
+
+ DISALLOW_COPY_AND_ASSIGN(ModuleRegistry);
+};
+
+} // namespace gin
+
+#endif // GIN_MODULES_MODULE_REGISTRY_H_