Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * This file is part of libdom.
  3.  * Licensed under the MIT License,
  4.  *                http://www.opensource.org/licenses/mit-license.php
  5.  * Copyright 2007 John-Mark Bell <jmb@netsurf-browser.org>
  6.  */
  7.  
  8. #ifndef dom_core_element_h_
  9. #define dom_core_element_h_
  10.  
  11. #include <stdbool.h>
  12.  
  13. #include <dom/core/exceptions.h>
  14. #include <dom/core/node.h>
  15.  
  16. struct dom_attr;
  17. struct dom_nodelist;
  18. struct dom_type_info;
  19.  
  20. typedef struct dom_element dom_element;
  21.  
  22. /* The DOMElement vtable */
  23. typedef struct dom_element_vtable {
  24.         struct dom_node_vtable base;
  25.  
  26.         dom_exception (*dom_element_get_tag_name)(struct dom_element *element,
  27.                         dom_string **name);
  28.         dom_exception (*dom_element_get_attribute)(struct dom_element *element,
  29.                         dom_string *name, dom_string **value);
  30.         dom_exception (*dom_element_set_attribute)(struct dom_element *element,
  31.                         dom_string *name, dom_string *value);
  32.         dom_exception (*dom_element_remove_attribute)(
  33.                         struct dom_element *element, dom_string *name);
  34.         dom_exception (*dom_element_get_attribute_node)(
  35.                         struct dom_element *element, dom_string *name,
  36.                         struct dom_attr **result);
  37.         dom_exception (*dom_element_set_attribute_node)(
  38.                         struct dom_element *element, struct dom_attr *attr,
  39.                         struct dom_attr **result);
  40.         dom_exception (*dom_element_remove_attribute_node)(
  41.                         struct dom_element *element, struct dom_attr *attr,
  42.                         struct dom_attr **result);
  43.         dom_exception (*dom_element_get_elements_by_tag_name)(
  44.                         struct dom_element *element, dom_string *name,
  45.                         struct dom_nodelist **result);
  46.         dom_exception (*dom_element_get_attribute_ns)(
  47.                         struct dom_element *element,
  48.                         dom_string *namespace,
  49.                         dom_string *localname,
  50.                         dom_string **value);
  51.         dom_exception (*dom_element_set_attribute_ns)(
  52.                         struct dom_element *element,
  53.                         dom_string *namespace, dom_string *qname,
  54.                         dom_string *value);
  55.         dom_exception (*dom_element_remove_attribute_ns)(
  56.                         struct dom_element *element,
  57.                         dom_string *namespace,
  58.                         dom_string *localname);
  59.         dom_exception (*dom_element_get_attribute_node_ns)(
  60.                         struct dom_element *element,
  61.                         dom_string *namespace,
  62.                         dom_string *localname, struct dom_attr **result);
  63.         dom_exception (*dom_element_set_attribute_node_ns)(
  64.                         struct dom_element *element, struct dom_attr *attr,
  65.                         struct dom_attr **result);
  66.         dom_exception (*dom_element_get_elements_by_tag_name_ns)(
  67.                         struct dom_element *element,
  68.                         dom_string *namespace,
  69.                         dom_string *localname,
  70.                         struct dom_nodelist **result);
  71.         dom_exception (*dom_element_has_attribute)(struct dom_element *element,
  72.                         dom_string *name, bool *result);
  73.         dom_exception (*dom_element_has_attribute_ns)(
  74.                         struct dom_element *element,
  75.                         dom_string *namespace,
  76.                         dom_string *localname, bool *result);
  77.         dom_exception (*dom_element_get_schema_type_info)(
  78.                         struct dom_element *element,
  79.                         struct dom_type_info **result);
  80.         dom_exception (*dom_element_set_id_attribute)(
  81.                         struct dom_element *element, dom_string *name,
  82.                         bool is_id);
  83.         dom_exception (*dom_element_set_id_attribute_ns)(
  84.                         struct dom_element *element,
  85.                         dom_string *namespace,
  86.                         dom_string *localname, bool is_id);
  87.         dom_exception (*dom_element_set_id_attribute_node)(
  88.                         struct dom_element *element,
  89.                         struct dom_attr *id_attr, bool is_id);
  90.  
  91.         /* These two are for the benefit of bindings to libcss */
  92.         dom_exception (*dom_element_get_classes)(
  93.                         struct dom_element *element,
  94.                         lwc_string ***classes, uint32_t *n_classes);
  95.         dom_exception (*dom_element_has_class)(
  96.                         struct dom_element *element,
  97.                         lwc_string *name, bool *match);
  98. } dom_element_vtable;
  99.  
  100. static inline dom_exception dom_element_get_tag_name(
  101.                 struct dom_element *element, dom_string **name)
  102. {
  103.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  104.                         dom_element_get_tag_name(element, name);
  105. }
  106. #define dom_element_get_tag_name(e, n) dom_element_get_tag_name( \
  107.                 (dom_element *) (e), (n))
  108.  
  109. static inline dom_exception dom_element_get_attribute(
  110.                 struct dom_element *element, dom_string *name,
  111.                 dom_string **value)
  112. {
  113.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  114.                         dom_element_get_attribute(element, name, value);
  115. }
  116. #define dom_element_get_attribute(e, n, v) dom_element_get_attribute( \
  117.                 (dom_element *) (e), (n), (v))
  118.  
  119. static inline dom_exception dom_element_set_attribute(
  120.                 struct dom_element *element, dom_string *name,
  121.                 dom_string *value)
  122. {
  123.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  124.                         dom_element_set_attribute(element, name, value);
  125. }
  126. #define dom_element_set_attribute(e, n, v) dom_element_set_attribute( \
  127.                 (dom_element *) (e), (n), (v))
  128.  
  129. static inline dom_exception dom_element_remove_attribute(
  130.                 struct dom_element *element, dom_string *name)
  131. {
  132.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  133.                         dom_element_remove_attribute(element, name);
  134. }
  135. #define dom_element_remove_attribute(e, n) dom_element_remove_attribute( \
  136.                 (dom_element *) (e), (n))
  137.  
  138. static inline dom_exception dom_element_get_attribute_node(
  139.                 struct dom_element *element, dom_string *name,
  140.                 struct dom_attr **result)
  141. {
  142.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  143.                         dom_element_get_attribute_node(element, name, result);
  144. }
  145. #define dom_element_get_attribute_node(e, n, r)  \
  146.                 dom_element_get_attribute_node((dom_element *) (e), \
  147.                 (n), (struct dom_attr **) (r))
  148.  
  149. static inline dom_exception dom_element_set_attribute_node(
  150.                 struct dom_element *element, struct dom_attr *attr,
  151.                 struct dom_attr **result)
  152. {
  153.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  154.                         dom_element_set_attribute_node(element, attr, result);
  155. }
  156. #define dom_element_set_attribute_node(e, a, r) \
  157.                 dom_element_set_attribute_node((dom_element *) (e), \
  158.                 (struct dom_attr *) (a), (struct dom_attr **) (r))
  159.  
  160. static inline dom_exception dom_element_remove_attribute_node(
  161.                 struct dom_element *element, struct dom_attr *attr,
  162.                 struct dom_attr **result)
  163. {
  164.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  165.                         dom_element_remove_attribute_node(element, attr,
  166.                         result);
  167. }
  168. #define dom_element_remove_attribute_node(e, a, r) \
  169.                 dom_element_remove_attribute_node((dom_element *) (e), \
  170.                 (struct dom_attr *) (a), (struct dom_attr **) (r))
  171.  
  172.  
  173. static inline dom_exception dom_element_get_elements_by_tag_name(
  174.                 struct dom_element *element, dom_string *name,
  175.                 struct dom_nodelist **result)
  176. {
  177.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  178.                         dom_element_get_elements_by_tag_name(element, name,
  179.                         result);
  180. }
  181. #define dom_element_get_elements_by_tag_name(e, n, r) \
  182.                 dom_element_get_elements_by_tag_name((dom_element *) (e), \
  183.                 (n), (struct dom_nodelist **) (r))
  184.  
  185. static inline dom_exception dom_element_get_attribute_ns(
  186.                 struct dom_element *element, dom_string *namespace,
  187.                 dom_string *localname, dom_string **value)
  188. {
  189.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  190.                         dom_element_get_attribute_ns(element, namespace,
  191.                         localname, value);
  192. }
  193. #define dom_element_get_attribute_ns(e, n, l, v) \
  194.                 dom_element_get_attribute_ns((dom_element *) (e), \
  195.                 (n), (l), (v))
  196.  
  197. static inline dom_exception dom_element_set_attribute_ns(
  198.                 struct dom_element *element, dom_string *namespace,
  199.                 dom_string *qname, dom_string *value)
  200. {
  201.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  202.                         dom_element_set_attribute_ns(element, namespace,
  203.                         qname, value);
  204. }
  205. #define dom_element_set_attribute_ns(e, n, l, v) \
  206.                 dom_element_set_attribute_ns((dom_element *) (e), \
  207.                 (n), (l), (v))
  208.  
  209.  
  210. static inline dom_exception dom_element_remove_attribute_ns(
  211.                 struct dom_element *element, dom_string *namespace,
  212.                 dom_string *localname)
  213. {
  214.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  215.                         dom_element_remove_attribute_ns(element, namespace,
  216.                         localname);
  217. }
  218. #define dom_element_remove_attribute_ns(e, n, l) \
  219.                 dom_element_remove_attribute_ns((dom_element *) (e), \
  220.                 (n), (l))
  221.  
  222.  
  223. static inline dom_exception dom_element_get_attribute_node_ns(
  224.                 struct dom_element *element, dom_string *namespace,
  225.                 dom_string *localname, struct dom_attr **result)
  226. {
  227.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  228.                         dom_element_get_attribute_node_ns(element, namespace,
  229.                         localname, result);
  230. }
  231. #define dom_element_get_attribute_node_ns(e, n, l, r) \
  232.                 dom_element_get_attribute_node_ns((dom_element *) (e), \
  233.                 (n), (l), \
  234.                 (struct dom_attr **) (r))
  235.  
  236. static inline dom_exception dom_element_set_attribute_node_ns(
  237.                 struct dom_element *element, struct dom_attr *attr,
  238.                 struct dom_attr **result)
  239. {
  240.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  241.                         dom_element_set_attribute_node_ns(element, attr,
  242.                         result);
  243. }
  244. #define dom_element_set_attribute_node_ns(e, a, r) \
  245.                 dom_element_set_attribute_node_ns((dom_element *) (e), \
  246.                 (struct dom_attr *) (a), (struct dom_attr **) (r))
  247.  
  248. static inline dom_exception dom_element_get_elements_by_tag_name_ns(
  249.                 struct dom_element *element, dom_string *namespace,
  250.                 dom_string *localname, struct dom_nodelist **result)
  251. {
  252.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  253.                         dom_element_get_elements_by_tag_name_ns(element,
  254.                         namespace, localname, result);
  255. }
  256. #define dom_element_get_elements_by_tag_name_ns(e, n, l, r) \
  257.                 dom_element_get_elements_by_tag_name_ns((dom_element *) (e), \
  258.                 (n), (l), (struct dom_nodelist **) (r))
  259.  
  260. static inline dom_exception dom_element_has_attribute(
  261.                 struct dom_element *element, dom_string *name,
  262.                 bool *result)
  263. {
  264.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  265.                         dom_element_has_attribute(element, name, result);
  266. }
  267. #define dom_element_has_attribute(e, n, r) dom_element_has_attribute( \
  268.                 (dom_element *) (e), (n), (bool *) (r))
  269.  
  270. static inline dom_exception dom_element_has_attribute_ns(
  271.                 struct dom_element *element, dom_string *namespace,
  272.                 dom_string *localname, bool *result)
  273. {
  274.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  275.                         dom_element_has_attribute_ns(element, namespace,
  276.                         localname, result);
  277. }
  278. #define dom_element_has_attribute_ns(e, n, l, r) dom_element_has_attribute_ns(\
  279.                 (dom_element *) (e), (n), (l), (bool *) (r))
  280.  
  281. static inline dom_exception dom_element_get_schema_type_info(
  282.                 struct dom_element *element, struct dom_type_info **result)
  283. {
  284.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  285.                         dom_element_get_schema_type_info(element, result);
  286. }
  287. #define dom_element_get_schema_type_info(e, r) \
  288.                 dom_element_get_schema_type_info((dom_element *) (e), \
  289.                 (struct dom_type_info **) (r))
  290.  
  291. static inline dom_exception dom_element_set_id_attribute(
  292.                 struct dom_element *element, dom_string *name,
  293.                 bool is_id)
  294. {
  295.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  296.                         dom_element_set_id_attribute(element, name, is_id);
  297. }
  298. #define dom_element_set_id_attribute(e, n, i) \
  299.                 dom_element_set_id_attribute((dom_element *) (e), \
  300.                 (n), (bool) (i))
  301.  
  302. static inline dom_exception dom_element_set_id_attribute_ns(
  303.                 struct dom_element *element, dom_string *namespace,
  304.                 dom_string *localname, bool is_id)
  305. {
  306.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  307.                         dom_element_set_id_attribute_ns(element, namespace,
  308.                         localname, is_id);
  309. }
  310. #define dom_element_set_id_attribute_ns(e, n, l, i) \
  311.                 dom_element_set_id_attribute_ns((dom_element *) (e), \
  312.                 (n), (l), (bool) (i))
  313.  
  314. static inline dom_exception dom_element_set_id_attribute_node(
  315.                 struct dom_element *element, struct dom_attr *id_attr,
  316.                 bool is_id)
  317. {
  318.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  319.                         dom_element_set_id_attribute_node(element, id_attr,
  320.                         is_id);
  321. }
  322. #define dom_element_set_id_attribute_node(e, a, i) \
  323.                 dom_element_set_id_attribute_node((dom_element *) (e), \
  324.                 (struct dom_attr *) (a), (bool) (i))
  325.  
  326. static inline dom_exception dom_element_get_classes(
  327.                 struct dom_element *element,
  328.                 lwc_string ***classes, uint32_t *n_classes)
  329. {
  330.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  331.                         dom_element_get_classes(element, classes, n_classes);
  332. }
  333. #define dom_element_get_classes(e, c, n) \
  334.                 dom_element_get_classes((dom_element *) (e), \
  335.                 (lwc_string ***) (c), (uint32_t *) (n))
  336.  
  337. static inline dom_exception dom_element_has_class(
  338.                 struct dom_element *element, lwc_string *name, bool *match)
  339. {
  340.         return ((dom_element_vtable *) ((dom_node *) element)->vtable)->
  341.                         dom_element_has_class(element, name, match);
  342. }
  343. #define dom_element_has_class(e, n, m) \
  344.                 dom_element_has_class((dom_element *) (e), \
  345.                 (lwc_string *) (n), (bool *) (m))
  346.  
  347.  
  348. /* Functions for implementing some libcss selection callbacks.
  349.  * Note that they don't take a reference to the returned element, as such they
  350.  * are UNSAFE if you require the returned element to live beyond the next time
  351.  * the DOM gets a chance to change. */
  352. dom_exception dom_element_named_ancestor_node(dom_element *element,
  353.                 lwc_string *name, dom_element **ancestor);
  354. dom_exception dom_element_named_parent_node(dom_element *element,
  355.                 lwc_string *name, dom_element **parent);
  356. dom_exception dom_element_parent_node(dom_element *element,
  357.                 dom_element **parent);
  358.  
  359. #endif
  360.