Class: Dommy::CSSStyleSheet

Inherits:
Object
  • Object
show all
Defined in:
lib/dommy/css.rb

Overview

‘CSSStyleSheet` — stub implementation. Dommy has no CSS parser nor a render tree, so we don’t interpret rule text; the sheet acts as an ordered list of opaque ‘CSSRule`-like wrappers.

Useful for code that does:

sheet.insertRule("p { color: red }", 0);
for (const r of sheet.cssRules) console.log(r.cssText);

‘disabled` is honored as state. `href`, `media`, `title`, `type` mirror the owner node’s attributes when present.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(owner_node:, href: nil, media: nil, title: nil, type: "text/css") ⇒ CSSStyleSheet

Returns a new instance of CSSStyleSheet.



18
19
20
21
22
23
24
25
26
# File 'lib/dommy/css.rb', line 18

def initialize(owner_node:, href: nil, media: nil, title: nil, type: "text/css")
  @owner_node = owner_node
  @href = href
  @media = media
  @title = title
  @type = type
  @disabled = false
  @css_rules = CSSRuleList.new
end

Instance Attribute Details

#css_rulesObject (readonly)

Returns the value of attribute css_rules.



16
17
18
# File 'lib/dommy/css.rb', line 16

def css_rules
  @css_rules
end

#owner_nodeObject (readonly)

Returns the value of attribute owner_node.



16
17
18
# File 'lib/dommy/css.rb', line 16

def owner_node
  @owner_node
end

Instance Method Details

#__js_call__(method, args) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/dommy/css.rb', line 128

def __js_call__(method, args)
  case method
  when "insertRule"
    insert_rule(args[0], args[1])
  when "deleteRule"
    delete_rule(args[0])
  when "replaceSync"
    replace_sync(args[0])
  when "replace"
    replace(args[0])
  end
end

#__js_get__(key) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/dommy/css.rb', line 96

def __js_get__(key)
  case key
  when "cssRules", "rules"
    @css_rules
  when "disabled"
    @disabled
  when "href"
    @href
  when "media"
    media
  when "title"
    @title
  when "type"
    @type
  when "ownerNode"
    @owner_node
  when "parentStyleSheet"
    parent_style_sheet
  when "ownerRule"
    owner_rule
  end
end

#__js_set__(key, value) ⇒ Object



119
120
121
122
123
124
125
126
# File 'lib/dommy/css.rb', line 119

def __js_set__(key, value)
  case key
  when "disabled"
    self.disabled = value
  end

  nil
end

#delete_rule(index) ⇒ Object



70
71
72
73
74
75
76
# File 'lib/dommy/css.rb', line 70

def delete_rule(index)
  idx = index.to_i
  raise DOMException::IndexSizeError, "out of range" if idx < 0 || idx >= @css_rules.length

  @css_rules.__delete_at__(idx)
  nil
end

#disabledObject



28
29
30
# File 'lib/dommy/css.rb', line 28

def disabled
  @disabled
end

#disabled=(v) ⇒ Object



32
33
34
# File 'lib/dommy/css.rb', line 32

def disabled=(v)
  @disabled = !!v
end

#hrefObject



36
37
38
# File 'lib/dommy/css.rb', line 36

def href
  @href
end

#insert_rule(rule_text, index = nil) ⇒ Object

‘insertRule(rule_text, index)` — appends an opaque CSSRule at the given position (default: end). Returns the index used.



62
63
64
65
66
67
68
# File 'lib/dommy/css.rb', line 62

def insert_rule(rule_text, index = nil)
  idx = index.nil? ? @css_rules.length : index.to_i
  raise DOMException::IndexSizeError, "out of range" if idx < 0 || idx > @css_rules.length

  @css_rules.__insert__(idx, CSSRule.new(rule_text.to_s, self))
  idx
end

#mediaObject



48
49
50
# File 'lib/dommy/css.rb', line 48

def media
  @media.to_s
end

#owner_ruleObject



56
57
58
# File 'lib/dommy/css.rb', line 56

def owner_rule
  nil
end

#parent_style_sheetObject



52
53
54
# File 'lib/dommy/css.rb', line 52

def parent_style_sheet
  nil
end

#replace(text) ⇒ Object

‘replace(text)` — spec returns a Promise resolved with self. We can’t return a JS-bridge Promise from here without a Window, so we mirror the sync behavior and return self.



91
92
93
94
# File 'lib/dommy/css.rb', line 91

def replace(text)
  replace_sync(text)
  self
end

#replace_sync(text) ⇒ Object

‘replaceSync(text)` — replace all rules with a single rule blob (no parsing — we keep it as one opaque entry).



80
81
82
83
84
85
86
# File 'lib/dommy/css.rb', line 80

def replace_sync(text)
  @css_rules.__clear__
  return nil if text.to_s.empty?

  @css_rules.__insert__(0, CSSRule.new(text.to_s, self))
  nil
end

#titleObject



40
41
42
# File 'lib/dommy/css.rb', line 40

def title
  @title
end

#typeObject



44
45
46
# File 'lib/dommy/css.rb', line 44

def type
  @type
end