Web IDL bindings
자바스크립트에서 node.firstChild에 접근하면, node.h의 Node::firstChild()가 호출됩니다. 어떻게 작동하는 걸까요? 어떻게 node.firstChild가 작동하는지 살펴봅시다.
처음에, 스펙에 따라 IDL 파일을 정의하여야 합니다:
// node.idl
interface Node : EventTarget {
[...] readonly attribute Node? firstChild;
};
Web IDL 구문은 Web IDL 스펙에 정의되어 있습니다. [...]는 IDL 확장 속성이라고합니다. IDL 확장 속성의 일부는 Web IDL 스펙에 정의되고 다른 속성은 Blink 특정 IDL 확장 속성입니다. Blink 특정 IDL 확장 특성을 제외하고 IDL 파일은 규격에 맞게 작성해야합니다 (즉, 사양에서 복사하여 붙여 넣기 만).
두 번째로, Node에 대한 C++ 클래스를 정의하고, firstChild에 대한 C++ getter를 구현해야 합니다:
class EventTarget : public ScriptWrappable { // All classes exposed to JavaScript must inherit from ScriptWrappable.
...;
};
class Node : public EventTarget {
DEFINE_WRAPPERTYPEINFO(); // All classes that have IDL files must have this macro.
Node* firstChild() const { return first_child_; }
};
일반적인 경우, node.idl을 빌드하면, IDL 컴파일러는 Node 인터페이스와 Node.firstChild를 위한 블링크-V8 바인딩을 자동으로 생성합니다. 자동 생성된 바인딩은 //src/out/{Debug,Release}/gen/third_party/blink/renderer/bindings/core/v8/v8_node.h에 생성됩니다. 자바스크립트가 node.firstChild를 호출할 때, V8은 v8_node.h의 V8Node::firstChildAttributeGetterCallback()을 호출합니다. 그 다음에 위에서 정의한 Node::firstChild()를 호출합니다.
If you want to learn more:
- How to add Web IDL bindings: bindings/IDLCompiler.md
- How to use IDL extended attributes: bindings/IDLExtendedAttributes.md
- Spec: Web IDL spec