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
|
/*
* This file is part of LibCSS
* Licensed under the MIT License,
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 John-Mark Bell <jmb@netsurf-browser.org>
*/
#ifndef css_select_select_h_
#define css_select_select_h_
#include <stdbool.h>
#include <stdint.h>
#include <libcss/select.h>
#include "stylesheet.h"
/**
* Item in the reject cache (only class and id types are valid)
*/
typedef struct reject_item {
lwc_string *value;
css_selector_type type;
} reject_item;
typedef struct prop_state {
uint32_t specificity; /* Specificity of property in result */
unsigned int set : 1, /* Whether property is set in result */
origin : 2, /* Origin of property in result */
important : 1, /* Importance of property in result */
inherit : 1; /* Property is set to inherit */
} prop_state;
typedef enum css_node_flags {
CSS_NODE_FLAGS_NONE = 0,
CSS_NODE_FLAGS_HAS_HINTS = (1 << 0),
CSS_NODE_FLAGS_HAS_INLINE_STYLE = (1 << 1),
CSS_NODE_FLAGS_PSEUDO_CLASS_ACTIVE = (1 << 2),
CSS_NODE_FLAGS_PSEUDO_CLASS_FOCUS = (1 << 3),
CSS_NODE_FLAGS_PSEUDO_CLASS_HOVER = (1 << 4),
CSS_NODE_FLAGS_PSEUDO_CLASS_LINK = (1 << 5),
CSS_NODE_FLAGS_PSEUDO_CLASS_VISITED = (1 << 6),
CSS_NODE_FLAGS_TAINT_PSEUDO_CLASS = (1 << 7),
CSS_NODE_FLAGS_TAINT_ATTRIBUTE = (1 << 8),
CSS_NODE_FLAGS_TAINT_SIBLING = (1 << 9),
CSS_NODE_FLAGS__PSEUDO_CLASSES_MASK =
(CSS_NODE_FLAGS_PSEUDO_CLASS_ACTIVE |
CSS_NODE_FLAGS_PSEUDO_CLASS_FOCUS |
CSS_NODE_FLAGS_PSEUDO_CLASS_HOVER |
CSS_NODE_FLAGS_PSEUDO_CLASS_LINK |
CSS_NODE_FLAGS_PSEUDO_CLASS_VISITED),
} css_node_flags;
struct css_node_data {
css_select_results partial;
css_bloom *bloom;
css_node_flags flags;
};
/**
* Selection state
*/
typedef struct css_select_state {
void *node; /* Node we're selecting for */
const css_media *media; /* Currently active media spec */
css_select_results *results; /* Result set to populate */
css_pseudo_element current_pseudo; /* Current pseudo element */
css_computed_style *computed; /* Computed style to populate */
css_select_handler *handler; /* Handler functions */
void *pw; /* Client data for handlers */
const css_stylesheet *sheet; /* Current sheet being processed */
css_origin current_origin; /* Origin of current sheet */
uint32_t current_specificity; /* Specificity of current rule */
css_qname element; /* Element we're selecting for */
lwc_string *id; /* Node id, if any */
lwc_string **classes; /* Node classes, if any */
uint32_t n_classes; /* Number of classes */
reject_item reject_cache[128]; /* Reject cache (filled from end) */
reject_item *next_reject; /* Next free slot in reject cache */
struct css_node_data *node_data; /* Data we'll store on node */
prop_state props[CSS_N_PROPERTIES][CSS_PSEUDO_ELEMENT_COUNT];
} css_select_state;
static inline void advance_bytecode(css_style *style, uint32_t n_bytes)
{
style->used -= (n_bytes / sizeof(css_code_t));
style->bytecode = style->bytecode + (n_bytes / sizeof(css_code_t));
}
bool css__outranks_existing(uint16_t op, bool important,
css_select_state *state, bool inherit);
#endif
|