@@ -15,36 +15,37 @@ namespace kraken::binding::qjs {
1515
1616void bindDocument (std::unique_ptr<ExecutionContext>& context);
1717
18- using TraverseHandler = std::function<bool (NodeInstance *)>;
18+ using TraverseHandler = std::function<bool (Node *)>;
1919
20- void traverseNode (NodeInstance * node, TraverseHandler handler);
20+ void traverseNode (Node * node, TraverseHandler handler);
2121
22- class Document : public Node {
23- public:
24- static JSClassID kDocumentClassID ;
25-
26- Document () = delete ;
27- Document (ExecutionContext* context);
28-
29- static JSClassID classId ();
22+ class DocumentCookie {
23+ public:
24+ DocumentCookie () = default ;
3025
31- JSValue instanceConstructor (JSContext* ctx, JSValue func_obj, JSValue this_val, int argc, JSValue* argv) override ;
26+ std::string getCookie ();
27+ void setCookie (std::string& str);
3228
33- OBJECT_INSTANCE (Document);
29+ private:
30+ std::unordered_map<std::string, std::string> cookiePairs;
31+ };
3432
35- static JSValue createEvent (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
36- static JSValue createElement (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
37- static JSValue createTextNode (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
38- static JSValue createDocumentFragment (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
39- static JSValue createComment (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
40- static JSValue getElementById (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
41- static JSValue getElementsByTagName (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
42- static JSValue getElementsByClassName (JSContext* ctx, JSValueConst this_val, int argc, JSValueConst* argv);
4333
44- JSValue getElementConstructor (ExecutionContext* context, const std::string& tagName);
45- bool isCustomElement (const std::string& tagName);
34+ class Document : public Node {
35+ public:
36+ static JSClassID classId;
37+ Document* create (JSContext* ctx);
38+ explicit Document ();
39+
40+ DEFINE_FUNCTION (createEvent);
41+ DEFINE_FUNCTION (createElement);
42+ DEFINE_FUNCTION (createTextNode);
43+ DEFINE_FUNCTION (createDocumentFragment);
44+ DEFINE_FUNCTION (createComment);
45+ DEFINE_FUNCTION (getElementById);
46+ DEFINE_FUNCTION (getElementsByTagName);
47+ DEFINE_FUNCTION (getElementsByClassName);
4648
47- private:
4849 DEFINE_PROTOTYPE_READONLY_PROPERTY (nodeName);
4950 DEFINE_PROTOTYPE_READONLY_PROPERTY (all);
5051 DEFINE_PROTOTYPE_READONLY_PROPERTY (documentElement);
@@ -54,58 +55,48 @@ class Document : public Node {
5455 DEFINE_PROTOTYPE_PROPERTY (cookie);
5556 DEFINE_PROTOTYPE_PROPERTY (body);
5657
57- DEFINE_PROTOTYPE_FUNCTION (createEvent, 1 );
58- DEFINE_PROTOTYPE_FUNCTION (createElement, 1 );
59- DEFINE_PROTOTYPE_FUNCTION (createDocumentFragment, 0 );
60- DEFINE_PROTOTYPE_FUNCTION (createTextNode, 1 );
61- DEFINE_PROTOTYPE_FUNCTION (createComment, 1 );
62- DEFINE_PROTOTYPE_FUNCTION (getElementById, 1 );
63- DEFINE_PROTOTYPE_FUNCTION (getElementsByTagName, 1 );
64- DEFINE_PROTOTYPE_FUNCTION (getElementsByClassName, 1 );
58+ JSValue getElementConstructor (ExecutionContext* context, const std::string& tagName);
59+ bool isCustomElement (const std::string& tagName);
6560
66- void defineElement (const std::string& tagName, Element* constructor);
61+ int32_t requestAnimationFrame (FrameCallback* frameCallback);
62+ void cancelAnimationFrame (uint32_t callbackId);
63+ void trace (JSRuntime* rt, JSValue val, JS_MarkFunc* mark_func) const override ;
64+ void dispose () const override ;
65+
66+ private:
67+
68+ void removeElementById (JSAtom id, Element* element);
69+ void addElementById (JSAtom id, Element* element);
70+ Element* getDocumentElement ();
71+ std::unordered_map<JSAtom, std::vector<Element*>> m_elementMapById;
72+ Element* m_documentElement{nullptr };
73+ std::unique_ptr<DocumentCookie> m_cookie;
74+
75+ ScriptAnimationController* m_scriptAnimationController;
76+ // DEFINE_PROTOTYPE_FUNCTION(createEvent, 1);
77+ // DEFINE_PROTOTYPE_FUNCTION(createElement, 1);
78+ // DEFINE_PROTOTYPE_FUNCTION(createDocumentFragment, 0);
79+ // DEFINE_PROTOTYPE_FUNCTION(createTextNode, 1);
80+ // DEFINE_PROTOTYPE_FUNCTION(createComment, 1);
81+ // DEFINE_PROTOTYPE_FUNCTION(getElementById, 1);
82+ // DEFINE_PROTOTYPE_FUNCTION(getElementsByTagName, 1);
83+ // DEFINE_PROTOTYPE_FUNCTION(getElementsByClassName, 1);
6784
68- friend DocumentInstance ;
85+ void defineElement ( const std::string& tagName, Element* constructor) ;
6986
7087 bool event_registered{false };
7188 bool document_registered{false };
7289 std::unordered_map<std::string, Element*> elementConstructorMap;
7390};
7491
75- class DocumentCookie {
76- public:
77- DocumentCookie () = default ;
78-
79- std::string getCookie ();
80- void setCookie (std::string& str);
81-
82- private:
83- std::unordered_map<std::string, std::string> cookiePairs;
92+ auto documentCreator = [](JSContext* ctx, JSValueConst func_obj, JSValueConst this_val, int argc, JSValueConst* argv, int flags) -> JSValue {
93+ return JS_ThrowTypeError (ctx, " Illegal constructor" );
8494};
8595
86- class DocumentInstance : public NodeInstance {
87- public:
88- DocumentInstance () = delete ;
89- explicit DocumentInstance (Document* document);
90- ~DocumentInstance ();
91-
92- int32_t requestAnimationFrame (FrameCallback* frameCallback);
93- void cancelAnimationFrame (uint32_t callbackId);
94- void trace (JSRuntime* rt, JSValue val, JS_MarkFunc* mark_func) override ;
95-
96- private:
97- void removeElementById (JSAtom id, ElementInstance* element);
98- void addElementById (JSAtom id, ElementInstance* element);
99- ElementInstance* getDocumentElement ();
100- std::unordered_map<JSAtom, std::vector<ElementInstance*>> m_elementMapById;
101- ElementInstance* m_documentElement{nullptr };
102- std::unique_ptr<DocumentCookie> m_cookie;
103-
104- ScriptAnimationController* m_scriptAnimationController;
105-
106- friend Document;
107- friend ElementInstance;
108- friend ExecutionContext;
96+ const WrapperTypeInfo documentTypeInfo = {
97+ " Document" ,
98+ &nodeTypeInfo,
99+ documentCreator
109100};
110101
111102} // namespace kraken::binding::qjs
0 commit comments