35static css_error
node_name(
void *pw,
void *node, css_qname *qname);
37 lwc_string ***classes, uint32_t *n_classes);
38static css_error
node_id(
void *pw,
void *node, lwc_string **
id);
40 const css_qname *qname,
void **
parent);
42 const css_qname *qname,
void **sibling);
44 const css_qname *qname,
void **sibling);
46static css_error
sibling_node(
void *pw,
void *node,
void **sibling);
48 const css_qname *qname,
bool *match);
50 lwc_string *name,
bool *match);
52 lwc_string *name,
bool *match);
54 const css_qname *qname,
bool *match);
56 const css_qname *qname, lwc_string *value,
59 const css_qname *qname, lwc_string *value,
62 const css_qname *qname, lwc_string *value,
65 const css_qname *qname, lwc_string *value,
68 const css_qname *qname, lwc_string *value,
71 const css_qname *qname, lwc_string *value,
73static css_error
node_is_root(
void *pw,
void *node,
bool *match);
75 bool same_name,
bool after, int32_t *
count);
76static css_error
node_is_empty(
void *pw,
void *node,
bool *match);
77static css_error
node_is_link(
void *pw,
void *node,
bool *match);
78static css_error
node_is_hover(
void *pw,
void *node,
bool *match);
80static css_error
node_is_focus(
void *pw,
void *node,
bool *match);
86 lwc_string *lang,
bool *match);
90 void *libcss_node_data);
92 void **libcss_node_data);
98 CSS_SELECT_HANDLER_VERSION_1,
149 const char *charset,
const char *url,
bool allow_quirks)
151 css_stylesheet_params params;
152 css_stylesheet *sheet;
155 params.params_version = CSS_STYLESHEET_PARAMS_VERSION_1;
156 params.level = CSS_LEVEL_DEFAULT;
157 params.charset = charset;
160 params.allow_quirks = allow_quirks;
161 params.inline_style =
true;
163 params.resolve_pw = NULL;
164 params.import = NULL;
165 params.import_pw = NULL;
167 params.color_pw = NULL;
169 params.font_pw = NULL;
171 error = css_stylesheet_create(¶ms, &sheet);
172 if (error != CSS_OK) {
173 NSLOG(netsurf, INFO,
"Failed creating sheet: %d", error);
177 error = css_stylesheet_append_data(sheet, data, len);
178 if (error != CSS_OK && error != CSS_NEEDDATA) {
179 NSLOG(netsurf, INFO,
"failed appending data: %d", error);
180 css_stylesheet_destroy(sheet);
184 error = css_stylesheet_data_done(sheet);
185 if (error != CSS_OK) {
186 NSLOG(netsurf, INFO,
"failed completing parse: %d", error);
187 css_stylesheet_destroy(sheet);
196 dom_string *key,
void *data,
struct dom_node *src,
197 struct dom_node *dst)
201 if (dom_string_isequal(corestring_dom___ns_key_libcss_node_data,
202 key) ==
false || data == NULL) {
207 case DOM_NODE_CLONED:
210 NULL, src, dst, data);
213 "Failed to clone libcss_node_data.");
216 case DOM_NODE_RENAMED:
219 NULL, src, NULL, data);
222 "Failed to update libcss_node_data.");
225 case DOM_NODE_IMPORTED:
226 case DOM_NODE_ADOPTED:
227 case DOM_NODE_DELETED:
230 NULL, src, NULL, data);
233 "Failed to delete libcss_node_data.");
237 NSLOG(netsurf, INFO,
"User data operation not handled.");
254 const css_media *media,
255 const css_unit_ctx *unit_len_ctx,
256 const css_stylesheet *inline_style)
258 css_computed_style *composed;
259 css_select_results *styles;
264 error = css_select_style(ctx->
ctx, n, unit_len_ctx, media, inline_style,
267 if (error != CSS_OK || styles == NULL) {
278 styles->styles[CSS_PSEUDO_ELEMENT_NONE],
279 unit_len_ctx, &composed);
280 if (error != CSS_OK) {
281 css_select_results_destroy(styles);
286 css_computed_style_destroy(
287 styles->styles[CSS_PSEUDO_ELEMENT_NONE]);
288 styles->styles[CSS_PSEUDO_ELEMENT_NONE] = composed;
291 for (pseudo_element = CSS_PSEUDO_ELEMENT_NONE + 1;
292 pseudo_element < CSS_PSEUDO_ELEMENT_COUNT;
295 if (pseudo_element == CSS_PSEUDO_ELEMENT_FIRST_LETTER ||
296 pseudo_element == CSS_PSEUDO_ELEMENT_FIRST_LINE)
301 if (styles->styles[pseudo_element] == NULL)
307 error = css_computed_style_compose(
308 styles->styles[CSS_PSEUDO_ELEMENT_NONE],
309 styles->styles[pseudo_element],
310 unit_len_ctx, &composed);
311 if (error != CSS_OK) {
314 css_select_results_destroy(styles);
319 css_computed_style_destroy(styles->styles[pseudo_element]);
320 styles->styles[pseudo_element] = composed;
335 const css_unit_ctx *unit_len_ctx,
336 const css_computed_style *
parent)
338 css_computed_style *partial, *composed;
341 error = css_select_default_style(ctx->
ctx,
343 if (error != CSS_OK) {
349 error = css_computed_style_compose(
parent, partial,
350 unit_len_ctx, &composed);
351 css_computed_style_destroy(partial);
352 if (error != CSS_OK) {
353 css_computed_style_destroy(composed);
373css_error
node_name(
void *pw,
void *node, css_qname *qname)
379 err = dom_node_get_node_name(n, &name);
380 if (err != DOM_NO_ERR)
385 err = dom_string_intern(name, &qname->name);
386 if (err != DOM_NO_ERR) {
387 dom_string_unref(name);
391 dom_string_unref(name);
411 lwc_string ***classes, uint32_t *n_classes)
419 err = dom_element_get_classes(n, classes, n_classes);
420 if (err != DOM_NO_ERR)
435css_error
node_id(
void *pw,
void *node, lwc_string **
id)
444 err = dom_html_element_get_id(n, &attr);
445 if (err != DOM_NO_ERR)
449 err = dom_string_intern(attr,
id);
450 if (err != DOM_NO_ERR) {
451 dom_string_unref(attr);
454 dom_string_unref(attr);
472 const css_qname *qname,
void **ancestor)
474 dom_element_named_ancestor_node(node, qname->name,
475 (
struct dom_element **)ancestor);
476 dom_node_unref(*ancestor);
493 const css_qname *qname,
void **
parent)
495 dom_element_named_parent_node(node, qname->name,
496 (
struct dom_element **)
parent);
514 const css_qname *qname,
void **sibling)
523 err = dom_node_get_previous_sibling(n, &n);
524 if (err != DOM_NO_ERR)
530 err = dom_node_get_node_type(n, &
type);
531 if (err != DOM_NO_ERR) {
536 if (
type == DOM_ELEMENT_NODE)
539 err = dom_node_get_previous_sibling(n, &prev);
540 if (err != DOM_NO_ERR) {
552 err = dom_node_get_node_name(n, &name);
553 if (err != DOM_NO_ERR) {
560 if (dom_string_caseless_lwc_isequal(name, qname->name)) {
564 dom_string_unref(name);
582 const css_qname *qname,
void **sibling)
590 err = dom_node_get_previous_sibling(n, &n);
591 if (err != DOM_NO_ERR)
598 err = dom_node_get_node_type(n, &
type);
599 if (err != DOM_NO_ERR) {
604 if (
type == DOM_ELEMENT_NODE) {
605 err = dom_node_get_node_name(n, &name);
606 if (err != DOM_NO_ERR) {
611 if (dom_string_caseless_lwc_isequal(name,
613 dom_string_unref(name);
618 dom_string_unref(name);
621 err = dom_node_get_previous_sibling(n, &prev);
622 if (err != DOM_NO_ERR) {
646 dom_element_parent_node(node, (
struct dom_element **)
parent);
671 err = dom_node_get_previous_sibling(n, &n);
672 if (err != DOM_NO_ERR)
678 err = dom_node_get_node_type(n, &
type);
679 if (err != DOM_NO_ERR) {
684 if (
type == DOM_ELEMENT_NODE)
687 err = dom_node_get_previous_sibling(n, &prev);
688 if (err != DOM_NO_ERR) {
719 const css_qname *qname,
bool *match)
724 if (lwc_string_isequal(qname->name, ctx->
universal, match) ==
725 lwc_error_ok && *match ==
false) {
729 err = dom_node_get_node_name(n, &name);
730 if (err != DOM_NO_ERR)
734 *match = dom_string_caseless_lwc_isequal(name, qname->name);
736 dom_string_unref(name);
754 lwc_string *name,
bool *match)
761 err = dom_element_has_class(n, name, match);
763 assert(err == DOM_NO_ERR);
780 lwc_string *name,
bool *match)
789 err = dom_html_element_get_id(n, &attr);
790 if (err != DOM_NO_ERR)
794 *match = dom_string_lwc_isequal(attr, name);
796 dom_string_unref(attr);
815 const css_qname *qname,
bool *match)
821 err = dom_string_create_interned(
822 (
const uint8_t *) lwc_string_data(qname->name),
823 lwc_string_length(qname->name), &name);
824 if (err != DOM_NO_ERR)
827 err = dom_element_has_attribute(n, name, match);
828 if (err != DOM_NO_ERR) {
829 dom_string_unref(name);
833 dom_string_unref(name);
852 const css_qname *qname, lwc_string *value,
860 size_t vlen = lwc_string_length(value);
867 err = dom_string_create_interned(
868 (
const uint8_t *) lwc_string_data(qname->name),
869 lwc_string_length(qname->name), &name);
870 if (err != DOM_NO_ERR)
873 err = dom_element_get_attribute(n, name, &atr_val);
874 if ((err != DOM_NO_ERR) || (atr_val == NULL)) {
875 dom_string_unref(name);
880 dom_string_unref(name);
882 *match = dom_string_caseless_lwc_isequal(atr_val, value);
884 dom_string_unref(atr_val);
904 const css_qname *qname, lwc_string *value,
912 size_t vlen = lwc_string_length(value);
919 err = dom_string_create_interned(
920 (
const uint8_t *) lwc_string_data(qname->name),
921 lwc_string_length(qname->name), &name);
922 if (err != DOM_NO_ERR)
925 err = dom_element_get_attribute(n, name, &atr_val);
926 if ((err != DOM_NO_ERR) || (atr_val == NULL)) {
927 dom_string_unref(name);
932 dom_string_unref(name);
935 *match = dom_string_caseless_lwc_isequal(atr_val, value);
938 if (*match ==
false) {
939 const char *vdata = lwc_string_data(value);
940 const char *data = (
const char *) dom_string_data(atr_val);
941 size_t len = dom_string_byte_length(atr_val);
943 if (len > vlen && data[vlen] ==
'-' &&
944 strncasecmp(data, vdata, vlen) == 0) {
949 dom_string_unref(atr_val);
969 const css_qname *qname, lwc_string *value,
976 size_t vlen = lwc_string_length(value);
987 err = dom_string_create_interned(
988 (
const uint8_t *) lwc_string_data(qname->name),
989 lwc_string_length(qname->name), &name);
990 if (err != DOM_NO_ERR)
993 err = dom_element_get_attribute(n, name, &atr_val);
994 if ((err != DOM_NO_ERR) || (atr_val == NULL)) {
995 dom_string_unref(name);
1000 dom_string_unref(name);
1003 start = (
const char *) dom_string_data(atr_val);
1004 end = start + dom_string_byte_length(atr_val);
1006 for (p = start; p <= end; p++) {
1007 if (*p ==
' ' || *p ==
'\0') {
1008 if ((
size_t) (p - start) == vlen &&
1010 lwc_string_data(value),
1020 dom_string_unref(atr_val);
1040 const css_qname *qname, lwc_string *value,
1045 dom_string *atr_val;
1048 size_t vlen = lwc_string_length(value);
1055 err = dom_string_create_interned(
1056 (
const uint8_t *) lwc_string_data(qname->name),
1057 lwc_string_length(qname->name), &name);
1058 if (err != DOM_NO_ERR)
1061 err = dom_element_get_attribute(n, name, &atr_val);
1062 if ((err != DOM_NO_ERR) || (atr_val == NULL)) {
1063 dom_string_unref(name);
1068 dom_string_unref(name);
1071 *match = dom_string_caseless_lwc_isequal(atr_val, value);
1074 if (*match ==
false) {
1075 const char *data = (
const char *) dom_string_data(atr_val);
1076 size_t len = dom_string_byte_length(atr_val);
1078 if ((len >= vlen) &&
1079 (strncasecmp(data, lwc_string_data(value), vlen) == 0)) {
1084 dom_string_unref(atr_val);
1104 const css_qname *qname, lwc_string *value,
1109 dom_string *atr_val;
1112 size_t vlen = lwc_string_length(value);
1119 err = dom_string_create_interned(
1120 (
const uint8_t *) lwc_string_data(qname->name),
1121 lwc_string_length(qname->name), &name);
1122 if (err != DOM_NO_ERR)
1125 err = dom_element_get_attribute(n, name, &atr_val);
1126 if ((err != DOM_NO_ERR) || (atr_val == NULL)) {
1127 dom_string_unref(name);
1132 dom_string_unref(name);
1135 *match = dom_string_caseless_lwc_isequal(atr_val, value);
1138 if (*match ==
false) {
1139 const char *data = (
const char *) dom_string_data(atr_val);
1140 size_t len = dom_string_byte_length(atr_val);
1142 const char *start = (
char *) data + len - vlen;
1144 if ((len >= vlen) &&
1145 (strncasecmp(start, lwc_string_data(value), vlen) == 0)) {
1152 dom_string_unref(atr_val);
1172 const css_qname *qname, lwc_string *value,
1177 dom_string *atr_val;
1180 size_t vlen = lwc_string_length(value);
1187 err = dom_string_create_interned(
1188 (
const uint8_t *) lwc_string_data(qname->name),
1189 lwc_string_length(qname->name), &name);
1190 if (err != DOM_NO_ERR)
1193 err = dom_element_get_attribute(n, name, &atr_val);
1194 if ((err != DOM_NO_ERR) || (atr_val == NULL)) {
1195 dom_string_unref(name);
1200 dom_string_unref(name);
1203 *match = dom_string_caseless_lwc_isequal(atr_val, value);
1206 if (*match ==
false) {
1207 const char *vdata = lwc_string_data(value);
1208 const char *start = (
const char *) dom_string_data(atr_val);
1209 size_t len = dom_string_byte_length(atr_val);
1210 const char *last_start = start + len - vlen;
1213 while (start <= last_start) {
1214 if (strncasecmp(start, vdata,
1225 dom_string_unref(atr_val);
1247 err = dom_node_get_parent_node(n, &
parent);
1248 if (err != DOM_NO_ERR) {
1257 if (err != DOM_NO_ERR)
1260 if (
type != DOM_DOCUMENT_NODE) {
1283 exc = dom_node_get_node_type(node, &
type);
1284 if ((exc != DOM_NO_ERR) || (
type != DOM_ELEMENT_NODE)) {
1290 exc = dom_node_get_node_name(node, &
node_name);
1292 if ((exc == DOM_NO_ERR) && (
node_name != NULL)) {
1294 if (dom_string_caseless_isequal(name,
1320 bool after, int32_t *
count)
1328 exc = dom_node_get_node_name(node, &
node_name);
1329 if ((exc != DOM_NO_ERR) || (
node_name == NULL)) {
1335 dom_node *node = dom_node_ref(n);
1339 exc = dom_node_get_next_sibling(node, &next);
1340 if ((exc != DOM_NO_ERR))
1343 dom_node_unref(node);
1347 }
while (node != NULL);
1349 dom_node *node = dom_node_ref(n);
1353 exc = dom_node_get_previous_sibling(node, &next);
1354 if ((exc != DOM_NO_ERR))
1357 dom_node_unref(node);
1362 }
while (node != NULL);
1385 dom_node *n = node, *next;
1390 err = dom_node_get_first_child(n, &n);
1391 if (err != DOM_NO_ERR) {
1396 dom_node_type ntype;
1397 err = dom_node_get_node_type(n, &ntype);
1398 if (err != DOM_NO_ERR) {
1403 if (ntype == DOM_ELEMENT_NODE ||
1404 ntype == DOM_TEXT_NODE) {
1410 err = dom_node_get_next_sibling(n, &next);
1411 if (err != DOM_NO_ERR) {
1438 exc = dom_node_get_node_name(node, &
node_name);
1439 if ((exc != DOM_NO_ERR) || (
node_name == NULL)) {
1443 if (dom_string_caseless_lwc_isequal(
node_name, corestring_lwc_a)) {
1445 exc = dom_element_has_attribute(node, corestring_dom_href,
1447 if ((exc == DOM_NO_ERR) && (has_href)) {
1480 dom_string *s = NULL;
1484 exc = dom_node_get_node_name(n, &s);
1485 if ((exc != DOM_NO_ERR) || (s == NULL)) {
1489 if (!dom_string_caseless_lwc_isequal(s, corestring_lwc_a)) {
1491 dom_string_unref(s);
1496 dom_string_unref(s);
1499 exc = dom_element_get_attribute(n, corestring_dom_href, &s);
1500 if ((exc != DOM_NO_ERR) || (s == NULL)) {
1511 dom_string_unref(s);
1522 if (data != NULL && data->
visits > 0)
1675 lwc_string *lang,
bool *match)
1695 if (property == CSS_PROP_COLOR) {
1696 hint->data.color = 0xff000000;
1697 hint->status = CSS_COLOR_COLOR;
1698 }
else if (property == CSS_PROP_FONT_FAMILY) {
1699 hint->data.strings = NULL;
1702 hint->status = CSS_FONT_FAMILY_SANS_SERIF;
1705 hint->status = CSS_FONT_FAMILY_SERIF;
1708 hint->status = CSS_FONT_FAMILY_MONOSPACE;
1711 hint->status = CSS_FONT_FAMILY_CURSIVE;
1714 hint->status = CSS_FONT_FAMILY_FANTASY;
1717 }
else if (property == CSS_PROP_QUOTES) {
1719 hint->data.strings = NULL;
1720 hint->status = CSS_QUOTES_NONE;
1721 }
else if (property == CSS_PROP_VOICE_FAMILY) {
1723 hint->data.strings = NULL;
1736 void *old_node_data;
1739 err = dom_node_set_user_data(n,
1740 corestring_dom___ns_key_libcss_node_data,
1742 (
void *) &old_node_data);
1743 if (err != DOM_NO_ERR) {
1747 assert(old_node_data == NULL);
1758 err = dom_node_get_user_data(n,
1759 corestring_dom___ns_key_libcss_node_data,
1761 if (err != DOM_NO_ERR) {
static uint32_t count(const http_directive *list, lwc_string *key)
Useful interned string pointers (interface).
nserror
Enumeration of error codes.
css_error node_presentational_hint(void *pw, void *node, uint32_t *nhints, css_hint **hints)
Callback to retrieve presentational hints for a node.
css_error nscss_resolve_url(void *pw, const char *base, lwc_string *rel, lwc_string **abs)
URL resolution callback for libcss.
#define NSLOG(catname, level, logmsg, args...)
NetSurf URL handling (interface).
void nsurl_unref(nsurl *url)
Drop a reference to a NetSurf URL object.
nserror nsurl_join(const nsurl *base, const char *rel, nsurl **joined)
Join a base url to a relative link part, creating a new NetSurf URL object.
struct nsurl nsurl
NetSurf URL object.
plotter style interfaces, generic styles and style colour helpers.
@ PLOT_FONT_FAMILY_CURSIVE
@ PLOT_FONT_FAMILY_SANS_SERIF
@ PLOT_FONT_FAMILY_FANTASY
@ PLOT_FONT_FAMILY_MONOSPACE
static void nscss_dom_user_data_handler(dom_node_operation operation, dom_string *key, void *data, struct dom_node *src, struct dom_node *dst)
static css_error node_is_focus(void *pw, void *node, bool *match)
Callback to determine if a node has the input focus.
static css_error node_has_attribute(void *pw, void *node, const css_qname *qname, bool *match)
Callback to determine if a node has an attribute with the given name.
static css_error named_sibling_node(void *pw, void *node, const css_qname *qname, void **sibling)
Callback to find a named sibling node.
static css_error node_has_attribute_suffix(void *pw, void *node, const css_qname *qname, lwc_string *value, bool *match)
Callback to determine if a node has an attribute with the given name whose value has the suffix given...
static css_error node_has_id(void *pw, void *node, lwc_string *name, bool *match)
Callback to determine if a node has the given id.
static css_error node_has_attribute_substring(void *pw, void *node, const css_qname *qname, lwc_string *value, bool *match)
Callback to determine if a node has an attribute with the given name whose value contains the substri...
static css_error set_libcss_node_data(void *pw, void *node, void *libcss_node_data)
css_select_results * nscss_get_style(nscss_select_ctx *ctx, dom_node *n, const css_media *media, const css_unit_ctx *unit_len_ctx, const css_stylesheet *inline_style)
Get style selection results for an element.
static css_error ua_default_for_property(void *pw, uint32_t property, css_hint *hint)
Callback to retrieve the User-Agent defaults for a CSS property.
static css_error node_has_attribute_equal(void *pw, void *node, const css_qname *qname, lwc_string *value, bool *match)
Callback to determine if a node has an attribute with given name and value.
css_stylesheet * nscss_create_inline_style(const uint8_t *data, size_t len, const char *charset, const char *url, bool allow_quirks)
Create an inline style.
static css_error node_has_class(void *pw, void *node, lwc_string *name, bool *match)
Callback to determine if a node has the given class.
static css_error node_is_enabled(void *pw, void *node, bool *match)
Callback to determine if a node is enabled.
css_error node_is_visited(void *pw, void *node, bool *match)
Callback to determine if a node is a linking element whose target has been visited.
static css_error node_is_root(void *pw, void *node, bool *match)
Callback to determine if a node is the root node of the document.
static css_error node_has_attribute_includes(void *pw, void *node, const css_qname *qname, lwc_string *value, bool *match)
Callback to determine if a node has an attribute with the given name whose value includes that given.
static css_error node_is_link(void *pw, void *node, bool *match)
Callback to determine if a node is a linking element.
static css_error node_is_hover(void *pw, void *node, bool *match)
Callback to determine if a node is currently being hovered over.
static css_error node_has_attribute_dashmatch(void *pw, void *node, const css_qname *qname, lwc_string *value, bool *match)
Callback to determine if a node has an attribute with the given name whose value dashmatches that giv...
static int node_count_siblings_check(dom_node *node, bool check_name, dom_string *name)
static css_error get_libcss_node_data(void *pw, void *node, void **libcss_node_data)
static css_error node_count_siblings(void *pw, void *node, bool same_name, bool after, int32_t *count)
Callback to count a node's siblings.
static css_error sibling_node(void *pw, void *node, void **sibling)
Callback to retrieve the preceding sibling of a node.
static css_error node_is_target(void *pw, void *node, bool *match)
Callback to determine if a node is the target of the document URL.
css_error named_ancestor_node(void *pw, void *node, const css_qname *qname, void **ancestor)
Callback to find a named ancestor node.
static css_error node_has_attribute_prefix(void *pw, void *node, const css_qname *qname, lwc_string *value, bool *match)
Callback to determine if a node has an attribute with the given name whose value has the prefix given...
static css_select_handler selection_handler
Selection callback table for libcss.
static css_error node_is_empty(void *pw, void *node, bool *match)
Callback to determine if a node is empty.
static css_error node_classes(void *pw, void *node, lwc_string ***classes, uint32_t *n_classes)
Callback to retrieve a node's classes.
static css_error named_parent_node(void *pw, void *node, const css_qname *qname, void **parent)
Callback to find a named parent node.
css_computed_style * nscss_get_blank_style(nscss_select_ctx *ctx, const css_unit_ctx *unit_len_ctx, const css_computed_style *parent)
Get a blank style.
static css_error node_is_active(void *pw, void *node, bool *match)
Callback to determine if a node is currently activated.
static css_error parent_node(void *pw, void *node, void **parent)
Callback to retrieve the parent of a node.
static css_error node_is_checked(void *pw, void *node, bool *match)
Callback to determine if a node is checked.
static css_error node_is_lang(void *pw, void *node, lwc_string *lang, bool *match)
Callback to determine if a node has the given language.
static css_error node_name(void *pw, void *node, css_qname *qname)
Callback to retrieve a node's name.
static css_error named_generic_sibling_node(void *pw, void *node, const css_qname *qname, void **sibling)
Callback to find a named generic sibling node.
static css_error node_has_name(void *pw, void *node, const css_qname *qname, bool *match)
Callback to determine if a node has the given name.
static css_error node_is_disabled(void *pw, void *node, bool *match)
Callback to determine if a node is disabled.
static css_error node_id(void *pw, void *node, lwc_string **id)
Callback to retrieve a node's ID.
Interface to utility string handling.
const css_computed_style * parent_style
unsigned int visits
Visit count.
css_error ns_system_colour(void *pw, lwc_string *name, css_color *colour)
css callback to obtain named system colour.
Interface to system colour values.
Unified URL information database public interface.
const struct url_data * urldb_get_url_data(struct nsurl *url)
Find data for an URL.
Option reading and saving interface.
#define nsoption_int(OPTION)
Get the value of an integer option.