Skip to content

Commit b693514

Browse files
committed
Cleanup
1 parent 3d180f5 commit b693514

File tree

3 files changed

+69
-62
lines changed

3 files changed

+69
-62
lines changed

ext/dom/element.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1757,7 +1757,7 @@ PHP_METHOD(DOM_Element, matches)
17571757
zval *id;
17581758
DOM_GET_THIS_OBJ(thisp, id, xmlNodePtr, intern);
17591759

1760-
dom_element_matches(thisp, intern, return_value, selectors_str);
1760+
dom_element_matches(thisp, return_value, selectors_str);
17611761
}
17621762

17631763
PHP_METHOD(DOM_Element, closest)

ext/dom/parentnode/css_selectors.c

Lines changed: 64 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ typedef struct {
3737
bool result;
3838
} dom_query_selector_matches_ctx;
3939

40-
lxb_status_t php_dom_query_selector_find_single_callback(const xmlNode *node, lxb_css_selector_specificity_t spec, void *ctx)
40+
lxb_status_t dom_query_selector_find_single_callback(const xmlNode *node, lxb_css_selector_specificity_t spec, void *ctx)
4141
{
4242
xmlNodePtr *result = (xmlNodePtr *) ctx;
4343
*result = (xmlNodePtr) node;
4444
return LXB_STATUS_STOP;
4545
}
4646

47-
lxb_status_t php_dom_query_selector_find_array_callback(const xmlNode *node, lxb_css_selector_specificity_t spec, void *ctx)
47+
lxb_status_t dom_query_selector_find_array_callback(const xmlNode *node, lxb_css_selector_specificity_t spec, void *ctx)
4848
{
4949
dom_query_selector_all_ctx *qsa_ctx = (dom_query_selector_all_ctx *) ctx;
5050
zval object;
@@ -53,7 +53,7 @@ lxb_status_t php_dom_query_selector_find_array_callback(const xmlNode *node, lxb
5353
return LXB_STATUS_OK;
5454
}
5555

56-
lxb_status_t php_dom_query_selector_find_matches_callback(const xmlNode *node, lxb_css_selector_specificity_t spec, void *ctx)
56+
lxb_status_t dom_query_selector_find_matches_callback(const xmlNode *node, lxb_css_selector_specificity_t spec, void *ctx)
5757
{
5858
dom_query_selector_matches_ctx *matches_ctx = (dom_query_selector_matches_ctx *) ctx;
5959
if (node == matches_ctx->reference) {
@@ -63,7 +63,7 @@ lxb_status_t php_dom_query_selector_find_matches_callback(const xmlNode *node, l
6363
return LXB_STATUS_OK;
6464
}
6565

66-
static lxb_css_selector_list_t *php_dom_parse_selector(
66+
static lxb_css_selector_list_t *dom_parse_selector(
6767
lxb_css_parser_t *parser,
6868
lxb_selectors_t *selectors,
6969
const zend_string *selectors_str,
@@ -98,7 +98,7 @@ static lxb_css_selector_list_t *php_dom_parse_selector(
9898
return list;
9999
}
100100

101-
static lxb_status_t php_dom_check_css_execution_status(lxb_status_t status)
101+
static lxb_status_t dom_check_css_execution_status(lxb_status_t status)
102102
{
103103
if (UNEXPECTED(status != LXB_STATUS_OK && status != LXB_STATUS_STOP)) {
104104
zend_argument_value_error(1, "contains an unsupported selector");
@@ -107,17 +107,17 @@ static lxb_status_t php_dom_check_css_execution_status(lxb_status_t status)
107107
return LXB_STATUS_OK;
108108
}
109109

110-
static void php_dom_selector_cleanup(lxb_css_parser_t *parser, lxb_selectors_t *selectors, lxb_css_selector_list_t *list)
110+
static void dom_selector_cleanup(lxb_css_parser_t *parser, lxb_selectors_t *selectors, lxb_css_selector_list_t *list)
111111
{
112112
lxb_css_selector_list_destroy_memory(list);
113113
lxb_selectors_destroy(selectors);
114114
(void) lxb_css_parser_destroy(parser, false);
115115
}
116116

117-
static lxb_status_t php_dom_query_selector_common(
117+
static lxb_status_t dom_query_selector_common(
118118
zval *return_value,
119119
const xmlNode *root,
120-
zend_string *selectors_str,
120+
const zend_string *selectors_str,
121121
lxb_selectors_cb_f cb,
122122
void *ctx,
123123
lxb_selectors_opt_t options
@@ -128,56 +128,86 @@ static lxb_status_t php_dom_query_selector_common(
128128
lxb_css_parser_t parser;
129129
lxb_selectors_t selectors;
130130

131-
lxb_css_selector_list_t *list = php_dom_parse_selector(&parser, &selectors, selectors_str, options);
131+
lxb_css_selector_list_t *list = dom_parse_selector(&parser, &selectors, selectors_str, options);
132132
if (UNEXPECTED(list == NULL)) {
133133
status = LXB_STATUS_ERROR;
134134
} else {
135135
status = lxb_selectors_find(&selectors, root, list, cb, ctx);
136-
status = php_dom_check_css_execution_status(status);
136+
status = dom_check_css_execution_status(status);
137137
}
138138

139-
php_dom_selector_cleanup(&parser, &selectors, list);
139+
dom_selector_cleanup(&parser, &selectors, list);
140140

141141
return status;
142142
}
143143

144-
static lxb_status_t php_dom_query_matches(
145-
zval *return_value,
144+
static lxb_status_t dom_query_matches(
146145
const xmlNode *root,
147-
zend_string *selectors_str,
148-
lxb_selectors_cb_f cb,
149-
void *ctx,
150-
lxb_selectors_opt_t options
146+
const zend_string *selectors_str,
147+
void *ctx
151148
)
152149
{
153150
lxb_status_t status;
154151

155152
lxb_css_parser_t parser;
156153
lxb_selectors_t selectors;
157154

158-
lxb_css_selector_list_t *list = php_dom_parse_selector(&parser, &selectors, selectors_str, options);
155+
lxb_css_selector_list_t *list = dom_parse_selector(&parser, &selectors, selectors_str, LXB_SELECTORS_OPT_MATCH_FIRST);
159156
if (UNEXPECTED(list == NULL)) {
160157
status = LXB_STATUS_ERROR;
161158
} else {
162-
status = lxb_selectors_match_node(&selectors, root, list, cb, ctx);
163-
status = php_dom_check_css_execution_status(status);
159+
status = lxb_selectors_match_node(&selectors, root, list, dom_query_selector_find_matches_callback, ctx);
160+
status = dom_check_css_execution_status(status);
164161
}
165162

166-
php_dom_selector_cleanup(&parser, &selectors, list);
163+
dom_selector_cleanup(&parser, &selectors, list);
167164

168165
return status;
169166
}
170167

168+
static const xmlNode *dom_query_closest(
169+
const xmlNode *root,
170+
const zend_string *selectors_str
171+
)
172+
{
173+
const xmlNode *ret = NULL;
174+
175+
lxb_css_parser_t parser;
176+
lxb_selectors_t selectors;
177+
178+
lxb_css_selector_list_t *list = dom_parse_selector(&parser, &selectors, selectors_str, LXB_SELECTORS_OPT_MATCH_FIRST);
179+
if (EXPECTED(list != NULL)) {
180+
const xmlNode *current = root;
181+
while (current != NULL) {
182+
dom_query_selector_matches_ctx ctx = { current, false };
183+
lxb_status_t status = lxb_selectors_match_node(&selectors, current, list, dom_query_selector_find_matches_callback, &ctx);
184+
status = dom_check_css_execution_status(status);
185+
if (UNEXPECTED(status != LXB_STATUS_OK)) {
186+
break;
187+
}
188+
if (ctx.result) {
189+
ret = current;
190+
break;
191+
}
192+
current = current->parent;
193+
}
194+
}
195+
196+
dom_selector_cleanup(&parser, &selectors, list);
197+
198+
return ret;
199+
}
200+
171201
/* https://dom.spec.whatwg.org/#dom-parentnode-queryselector */
172-
void dom_parent_node_query_selector(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str)
202+
void dom_parent_node_query_selector(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str)
173203
{
174204
xmlNodePtr result = NULL;
175205

176-
if (php_dom_query_selector_common(
206+
if (dom_query_selector_common(
177207
return_value,
178208
thisp,
179209
selectors_str,
180-
php_dom_query_selector_find_single_callback,
210+
dom_query_selector_find_single_callback,
181211
&result,
182212
LXB_SELECTORS_OPT_MATCH_FIRST
183213
) != LXB_STATUS_OK || result == NULL) {
@@ -188,16 +218,16 @@ void dom_parent_node_query_selector(xmlNodePtr thisp, dom_object *intern, zval *
188218
}
189219

190220
/* https://dom.spec.whatwg.org/#dom-parentnode-queryselectorall */
191-
void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str)
221+
void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str)
192222
{
193223
HashTable *list = zend_new_array(0);
194224
dom_query_selector_all_ctx ctx = { list, intern };
195225

196-
if (php_dom_query_selector_common(
226+
if (dom_query_selector_common(
197227
return_value,
198228
thisp,
199229
selectors_str,
200-
php_dom_query_selector_find_array_callback,
230+
dom_query_selector_find_array_callback,
201231
&ctx,
202232
LXB_SELECTORS_OPT_DEFAULT
203233
) != LXB_STATUS_OK) {
@@ -213,17 +243,14 @@ void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zv
213243
}
214244

215245
/* https://dom.spec.whatwg.org/#dom-element-matches */
216-
void dom_element_matches(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str)
246+
void dom_element_matches(xmlNodePtr thisp, zval *return_value, const zend_string *selectors_str)
217247
{
218248
dom_query_selector_matches_ctx ctx = { thisp, false };
219249

220-
if (php_dom_query_matches(
221-
return_value,
250+
if (dom_query_matches(
222251
thisp,
223252
selectors_str,
224-
php_dom_query_selector_find_matches_callback,
225-
&ctx,
226-
LXB_SELECTORS_OPT_MATCH_FIRST
253+
&ctx
227254
) != LXB_STATUS_OK) {
228255
RETURN_THROWS();
229256
} else {
@@ -232,32 +259,12 @@ void dom_element_matches(xmlNodePtr thisp, dom_object *intern, zval *return_valu
232259
}
233260

234261
/* https://dom.spec.whatwg.org/#dom-element-closest */
235-
void dom_element_closest(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str)
262+
void dom_element_closest(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str)
236263
{
237-
lxb_css_parser_t parser;
238-
lxb_selectors_t selectors;
239-
240-
lxb_css_selector_list_t *list = php_dom_parse_selector(&parser, &selectors, selectors_str, LXB_SELECTORS_OPT_MATCH_FIRST);
241-
if (UNEXPECTED(list == NULL)) {
242-
RETURN_THROWS();
243-
} else {
244-
xmlNodePtr current = thisp;
245-
while (current != NULL) {
246-
dom_query_selector_matches_ctx ctx = { current, false };
247-
lxb_status_t status = lxb_selectors_match_node(&selectors, current, list, php_dom_query_selector_find_matches_callback, &ctx);
248-
status = php_dom_check_css_execution_status(status);
249-
if (UNEXPECTED(status != LXB_STATUS_OK)) {
250-
break;
251-
}
252-
if (ctx.result) {
253-
DOM_RET_OBJ(current, intern);
254-
break;
255-
}
256-
current = current->parent;
257-
}
264+
const xmlNode *result = dom_query_closest(thisp, selectors_str);
265+
if (EXPECTED(result != NULL)) {
266+
DOM_RET_OBJ((xmlNodePtr) result, intern);
258267
}
259-
260-
php_dom_selector_cleanup(&parser, &selectors, list);
261268
}
262269

263270
#endif

ext/dom/php_dom.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,10 @@ bool php_dom_fragment_insertion_hierarchy_check_replace(xmlNodePtr parent, xmlNo
196196
void php_dom_node_append(php_libxml_ref_obj *document, xmlNodePtr node, xmlNodePtr parent);
197197
bool php_dom_pre_insert(php_libxml_ref_obj *document, xmlNodePtr node, xmlNodePtr parent, xmlNodePtr insertion_point);
198198
bool php_dom_pre_insert_is_parent_invalid(xmlNodePtr parent);
199-
void dom_parent_node_query_selector(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str);
200-
void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str);
201-
void dom_element_matches(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str);
202-
void dom_element_closest(xmlNodePtr thisp, dom_object *intern, zval *return_value, zend_string *selectors_str);
199+
void dom_parent_node_query_selector(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str);
200+
void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str);
201+
void dom_element_matches(xmlNodePtr thisp, zval *return_value, const zend_string *selectors_str);
202+
void dom_element_closest(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str);
203203

204204
/* nodemap and nodelist APIs */
205205
xmlNodePtr php_dom_named_node_map_get_named_item(dom_nnodemap_object *objmap, const zend_string *named, bool may_transform);

0 commit comments

Comments
 (0)