summaryrefslogtreecommitdiff
path: root/javascript/jsapi/element.c
blob: 8ea7017d52929ee34ee0e2d254fad16254b5e530 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
 *
 * This file is part of NetSurf, http://www.netsurf-browser.org/
 *
 * NetSurf is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * NetSurf is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <dom/dom.h>

#include "utils/config.h"
#include "utils/log.h"
#include "render/html_internal.h"

#include "javascript/jsapi.h"

/* IDL http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-element

CAUTION - innerHTML etc. are not part of the DOM they come from:
http://html5.org/specs/dom-parsing.html#extensions-to-the-element-interface

interface Element : Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute DOMString? prefix;
  readonly attribute DOMString localName;
  readonly attribute DOMString tagName;

           attribute DOMString id;
           attribute DOMString className;
  readonly attribute DOMTokenList classList;

  readonly attribute Attr[] attributes;
  DOMString? getAttribute(DOMString name);
  DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
  void setAttribute(DOMString name, DOMString value);
  void setAttributeNS(DOMString? namespace, DOMString name, DOMString value);
  void removeAttribute(DOMString name);
  void removeAttributeNS(DOMString? namespace, DOMString localName);
  boolean hasAttribute(DOMString name);
  boolean hasAttributeNS(DOMString? namespace, DOMString localName);

  HTMLCollection getElementsByTagName(DOMString localName);
  HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);

  readonly attribute HTMLCollection children;
  readonly attribute Element? firstElementChild;
  readonly attribute Element? lastElementChild;
  readonly attribute Element? previousElementSibling;
  readonly attribute Element? nextElementSibling;
  readonly attribute unsigned long childElementCount;

  // NEW
  void prepend((Node or DOMString)... nodes);
  void append((Node or DOMString)... nodes);
  void before((Node or DOMString)... nodes);
  void after((Node or DOMString)... nodes);
  void replace((Node or DOMString)... nodes);
  void remove();
};
*/

static void jsfinalize_element(JSContext *cx, JSObject *obj);

struct jsclass_document_priv {
	struct html_content *htmlc;
	dom_element *node;
};

static JSClass jsclass_element =
{
        "Element", 
	JSCLASS_HAS_PRIVATE, 
	JS_PropertyStub, 
	JS_PropertyStub, 
	JS_PropertyStub, 
	JS_StrictPropertyStub,
        JS_EnumerateStub, 
	JS_ResolveStub, 
	JS_ConvertStub, 
	jsfinalize_element, 
	JSCLASS_NO_OPTIONAL_MEMBERS
};

#define JSCLASS_NAME element

#include "node.c"

static void jsfinalize_element(JSContext *cx, JSObject *obj)
{
	struct jsclass_document_priv *element;
	element = JS_GetInstancePrivate(cx, obj, &jsclass_element, NULL);
	if (element != NULL) {
		free(element);
	}
}



static JSFunctionSpec jsfunctions_element[] = {
	JSAPI_FS_NODE,
	JSAPI_FS_END
};


JSObject *
jsapi_new_element(JSContext *cx, 
		  JSObject *parent, 
		  struct html_content *htmlc, 
		  dom_element *domelement)
{
	/* create element object and return it */
	JSObject *jselement;
	struct jsclass_document_priv *element;

	element = malloc(sizeof(element));
	if (element == NULL) {
		return NULL;
	}
	element->htmlc = htmlc;
	element->node = domelement;

	jselement = JS_InitClass(cx, 
			   parent, 
			   NULL, 
			   &jsclass_element, 
			   NULL, 
			   0, 
			   NULL, 
			   jsfunctions_element, 
			   NULL, 
			   NULL);
	if (jselement == NULL) {
		free(element);
		return NULL;
	}

	LOG(("setting private to %p", element));
	/* private pointer to browsing context */
	if (JS_SetPrivate(cx, jselement, element) != JS_TRUE) {
		LOG(("failed to set private"));
		free(element);
		return NULL;
	}

	return jselement;
}