diamonds 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +36 -0
  3. data/lib/diamonds.rb +74 -0
  4. data/lib/diamonds/Gemfile +28 -0
  5. data/lib/diamonds/README.md +254 -0
  6. data/lib/diamonds/Rakefile +5 -0
  7. data/lib/diamonds/apps/application.rb +15 -0
  8. data/lib/diamonds/apps/library.rb +321 -0
  9. data/lib/diamonds/apps/user_app.rb +5 -0
  10. data/lib/diamonds/config.ru +98 -0
  11. data/lib/diamonds/db/mysiteDB Back.sqlite3 +0 -0
  12. data/lib/diamonds/db/mysiteDB.sqlite3 +0 -0
  13. data/lib/diamonds/gems/auto_launch_browser.rb +22 -0
  14. data/lib/diamonds/gems/io.rb +146 -0
  15. data/lib/diamonds/gems/ruby_to_js.rb +173 -0
  16. data/lib/diamonds/gems/server_utils.rb +96 -0
  17. data/lib/diamonds/lib/opal-browser.rb +1 -0
  18. data/lib/diamonds/lib/opal/browser.rb +4 -0
  19. data/lib/diamonds/opal-browser.gemspec +21 -0
  20. data/lib/diamonds/opal/browser.rb +11 -0
  21. data/lib/diamonds/opal/browser/animation_frame.rb +111 -0
  22. data/lib/diamonds/opal/browser/canvas.rb +321 -0
  23. data/lib/diamonds/opal/browser/canvas/data.rb +63 -0
  24. data/lib/diamonds/opal/browser/canvas/gradient.rb +27 -0
  25. data/lib/diamonds/opal/browser/canvas/style.rb +113 -0
  26. data/lib/diamonds/opal/browser/canvas/text.rb +45 -0
  27. data/lib/diamonds/opal/browser/console.rb +103 -0
  28. data/lib/diamonds/opal/browser/cookies.rb +133 -0
  29. data/lib/diamonds/opal/browser/css.rb +24 -0
  30. data/lib/diamonds/opal/browser/css/declaration.rb +83 -0
  31. data/lib/diamonds/opal/browser/css/rule.rb +48 -0
  32. data/lib/diamonds/opal/browser/css/rule/style.rb +16 -0
  33. data/lib/diamonds/opal/browser/css/style_sheet.rb +83 -0
  34. data/lib/diamonds/opal/browser/css/unit.rb +188 -0
  35. data/lib/diamonds/opal/browser/database/sql.rb +194 -0
  36. data/lib/diamonds/opal/browser/delay.rb +78 -0
  37. data/lib/diamonds/opal/browser/dom.rb +84 -0
  38. data/lib/diamonds/opal/browser/dom/attribute.rb +26 -0
  39. data/lib/diamonds/opal/browser/dom/builder.rb +88 -0
  40. data/lib/diamonds/opal/browser/dom/cdata.rb +9 -0
  41. data/lib/diamonds/opal/browser/dom/character_data.rb +73 -0
  42. data/lib/diamonds/opal/browser/dom/comment.rb +9 -0
  43. data/lib/diamonds/opal/browser/dom/document.rb +149 -0
  44. data/lib/diamonds/opal/browser/dom/document_fragment.rb +7 -0
  45. data/lib/diamonds/opal/browser/dom/element.rb +474 -0
  46. data/lib/diamonds/opal/browser/dom/element/attributes.rb +87 -0
  47. data/lib/diamonds/opal/browser/dom/element/data.rb +67 -0
  48. data/lib/diamonds/opal/browser/dom/element/image.rb +23 -0
  49. data/lib/diamonds/opal/browser/dom/element/input.rb +28 -0
  50. data/lib/diamonds/opal/browser/dom/element/offset.rb +89 -0
  51. data/lib/diamonds/opal/browser/dom/element/position.rb +46 -0
  52. data/lib/diamonds/opal/browser/dom/element/scroll.rb +136 -0
  53. data/lib/diamonds/opal/browser/dom/element/select.rb +36 -0
  54. data/lib/diamonds/opal/browser/dom/element/size.rb +34 -0
  55. data/lib/diamonds/opal/browser/dom/element/template.rb +9 -0
  56. data/lib/diamonds/opal/browser/dom/element/textarea.rb +24 -0
  57. data/lib/diamonds/opal/browser/dom/mutation_observer.rb +178 -0
  58. data/lib/diamonds/opal/browser/dom/node.rb +464 -0
  59. data/lib/diamonds/opal/browser/dom/node_set.rb +110 -0
  60. data/lib/diamonds/opal/browser/dom/text.rb +36 -0
  61. data/lib/diamonds/opal/browser/effects.rb +50 -0
  62. data/lib/diamonds/opal/browser/event.rb +253 -0
  63. data/lib/diamonds/opal/browser/event/animation.rb +38 -0
  64. data/lib/diamonds/opal/browser/event/audio_processing.rb +33 -0
  65. data/lib/diamonds/opal/browser/event/base.rb +430 -0
  66. data/lib/diamonds/opal/browser/event/before_unload.rb +15 -0
  67. data/lib/diamonds/opal/browser/event/clipboard.rb +28 -0
  68. data/lib/diamonds/opal/browser/event/close.rb +47 -0
  69. data/lib/diamonds/opal/browser/event/composition.rb +50 -0
  70. data/lib/diamonds/opal/browser/event/custom.rb +65 -0
  71. data/lib/diamonds/opal/browser/event/device_light.rb +23 -0
  72. data/lib/diamonds/opal/browser/event/device_motion.rb +51 -0
  73. data/lib/diamonds/opal/browser/event/device_orientation.rb +48 -0
  74. data/lib/diamonds/opal/browser/event/device_proximity.rb +33 -0
  75. data/lib/diamonds/opal/browser/event/drag.rb +119 -0
  76. data/lib/diamonds/opal/browser/event/focus.rb +39 -0
  77. data/lib/diamonds/opal/browser/event/gamepad.rb +60 -0
  78. data/lib/diamonds/opal/browser/event/hash_change.rb +28 -0
  79. data/lib/diamonds/opal/browser/event/keyboard.rb +115 -0
  80. data/lib/diamonds/opal/browser/event/message.rb +70 -0
  81. data/lib/diamonds/opal/browser/event/mouse.rb +254 -0
  82. data/lib/diamonds/opal/browser/event/page_transition.rb +23 -0
  83. data/lib/diamonds/opal/browser/event/pop_state.rb +33 -0
  84. data/lib/diamonds/opal/browser/event/progress.rb +43 -0
  85. data/lib/diamonds/opal/browser/event/sensor.rb +15 -0
  86. data/lib/diamonds/opal/browser/event/storage.rb +43 -0
  87. data/lib/diamonds/opal/browser/event/touch.rb +60 -0
  88. data/lib/diamonds/opal/browser/event/ui.rb +38 -0
  89. data/lib/diamonds/opal/browser/event/wheel.rb +49 -0
  90. data/lib/diamonds/opal/browser/event_source.rb +70 -0
  91. data/lib/diamonds/opal/browser/history.rb +90 -0
  92. data/lib/diamonds/opal/browser/http.rb +169 -0
  93. data/lib/diamonds/opal/browser/http/binary.rb +58 -0
  94. data/lib/diamonds/opal/browser/http/headers.rb +109 -0
  95. data/lib/diamonds/opal/browser/http/request.rb +344 -0
  96. data/lib/diamonds/opal/browser/http/response.rb +115 -0
  97. data/lib/diamonds/opal/browser/immediate.rb +163 -0
  98. data/lib/diamonds/opal/browser/interval.rb +111 -0
  99. data/lib/diamonds/opal/browser/location.rb +87 -0
  100. data/lib/diamonds/opal/browser/navigator.rb +173 -0
  101. data/lib/diamonds/opal/browser/screen.rb +66 -0
  102. data/lib/diamonds/opal/browser/socket.rb +123 -0
  103. data/lib/diamonds/opal/browser/storage.rb +252 -0
  104. data/lib/diamonds/opal/browser/support.rb +287 -0
  105. data/lib/diamonds/opal/browser/utils.rb +74 -0
  106. data/lib/diamonds/opal/browser/version.rb +3 -0
  107. data/lib/diamonds/opal/browser/window.rb +120 -0
  108. data/lib/diamonds/opal/browser/window/scroll.rb +59 -0
  109. data/lib/diamonds/opal/browser/window/size.rb +59 -0
  110. data/lib/diamonds/opal/browser/window/view.rb +36 -0
  111. data/lib/diamonds/opal/opal-browser.rb +1 -0
  112. data/lib/diamonds/public/__OPAL_SOURCE_MAPS__/application.map +0 -0
  113. data/lib/diamonds/public/javascripts/font-awesome/HELP-US-OUT.txt +7 -0
  114. data/lib/diamonds/public/javascripts/font-awesome/css/font-awesome.css +2026 -0
  115. data/lib/diamonds/public/javascripts/font-awesome/css/font-awesome.min.css +1 -0
  116. data/lib/diamonds/public/javascripts/font-awesome/fonts/FontAwesome.otf +0 -0
  117. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  118. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.svg +640 -0
  119. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  120. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  121. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  122. data/lib/diamonds/public/javascripts/font-awesome/less/animated.less +34 -0
  123. data/lib/diamonds/public/javascripts/font-awesome/less/bordered-pulled.less +25 -0
  124. data/lib/diamonds/public/javascripts/font-awesome/less/core.less +12 -0
  125. data/lib/diamonds/public/javascripts/font-awesome/less/fixed-width.less +6 -0
  126. data/lib/diamonds/public/javascripts/font-awesome/less/font-awesome.less +17 -0
  127. data/lib/diamonds/public/javascripts/font-awesome/less/icons.less +677 -0
  128. data/lib/diamonds/public/javascripts/font-awesome/less/larger.less +13 -0
  129. data/lib/diamonds/public/javascripts/font-awesome/less/list.less +19 -0
  130. data/lib/diamonds/public/javascripts/font-awesome/less/mixins.less +26 -0
  131. data/lib/diamonds/public/javascripts/font-awesome/less/path.less +15 -0
  132. data/lib/diamonds/public/javascripts/font-awesome/less/rotated-flipped.less +20 -0
  133. data/lib/diamonds/public/javascripts/font-awesome/less/stacked.less +20 -0
  134. data/lib/diamonds/public/javascripts/font-awesome/less/variables.less +688 -0
  135. data/lib/diamonds/public/javascripts/font-awesome/scss/_animated.scss +34 -0
  136. data/lib/diamonds/public/javascripts/font-awesome/scss/_bordered-pulled.scss +25 -0
  137. data/lib/diamonds/public/javascripts/font-awesome/scss/_core.scss +12 -0
  138. data/lib/diamonds/public/javascripts/font-awesome/scss/_fixed-width.scss +6 -0
  139. data/lib/diamonds/public/javascripts/font-awesome/scss/_icons.scss +677 -0
  140. data/lib/diamonds/public/javascripts/font-awesome/scss/_larger.scss +13 -0
  141. data/lib/diamonds/public/javascripts/font-awesome/scss/_list.scss +19 -0
  142. data/lib/diamonds/public/javascripts/font-awesome/scss/_mixins.scss +26 -0
  143. data/lib/diamonds/public/javascripts/font-awesome/scss/_path.scss +15 -0
  144. data/lib/diamonds/public/javascripts/font-awesome/scss/_rotated-flipped.scss +20 -0
  145. data/lib/diamonds/public/javascripts/font-awesome/scss/_stacked.scss +20 -0
  146. data/lib/diamonds/public/javascripts/font-awesome/scss/_variables.scss +688 -0
  147. data/lib/diamonds/public/javascripts/font-awesome/scss/font-awesome.scss +17 -0
  148. data/lib/diamonds/public/javascripts/jquery-2.1.4.min.js +4 -0
  149. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  150. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  151. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_flat_10_000000_40x100.png +0 -0
  152. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  153. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  154. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  155. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  156. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  157. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  158. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  159. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_228ef1_256x240.png +0 -0
  160. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ef8c08_256x240.png +0 -0
  161. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ffd27a_256x240.png +0 -0
  162. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  163. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.min.css +7 -0
  164. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.min.js +13 -0
  165. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.structure.min.css +5 -0
  166. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.theme.min.css +5 -0
  167. data/lib/diamonds/public/javascripts/jquery.js +4 -0
  168. data/lib/diamonds/public/javascripts/jquery.ui.touch-punch.min.js +11 -0
  169. data/lib/diamonds/public/javascripts/ne pas utiliser version en retard jeezs_editor.js b/data/lib/diamonds/public/javascripts/ne pas utiliser version en retard → jeezs_editor.js +0 -0
  170. data/lib/diamonds/public/javascripts/standalone.js +2316 -0
  171. data/lib/diamonds/public/javascripts/standalone.min.js +1 -0
  172. data/lib/diamonds/public/javascripts/wysiwyg-editor.min.css +1 -0
  173. data/lib/diamonds/public/javascripts/wysiwyg-editor.min.js +1 -0
  174. data/lib/diamonds/public/javascripts/wysiwyg.min.js +1 -0
  175. data/lib/diamonds/user_app/main.rb +45 -0
  176. data/lib/diamonds/version.rb +3 -0
  177. data/lib/diamonds/views/index.erb +35 -0
  178. data/lib/diamonds/views/javascripts/jeezs_editor.js.erb +365 -0
  179. data/lib/diamonds/views/stylesheets/main.css.erb +244 -0
  180. metadata +490 -0
@@ -0,0 +1,63 @@
1
+ module Browser; class Canvas
2
+
3
+ class Data
4
+ def self.create(canvas, width, height)
5
+ data = allocate
6
+
7
+ data.instance_eval {
8
+ @canvas = canvas.to_a
9
+ @x = 0
10
+ @y = 0
11
+ @width = width
12
+ @height = height
13
+
14
+ @native = `#{canvas.to_n}.createImageData(width, height)`
15
+ }
16
+
17
+ data
18
+ end
19
+
20
+ include Native
21
+
22
+ attr_reader :x, :y, :width, :height
23
+
24
+ def initialize(canvas, x, y, width, height)
25
+ @canvas = canvas.to_n
26
+ @x = x
27
+ @y = y
28
+ @width = width
29
+ @height = height
30
+
31
+ super(`#@canvas.getImageData(x, y, width, height)`)
32
+ end
33
+
34
+ def length
35
+ `#@native.data.length`
36
+ end
37
+
38
+ def [](index)
39
+ `#@native.data[index]`
40
+ end
41
+
42
+ def []=(index, value)
43
+ `#@native.data[index] = value`
44
+ end
45
+
46
+ def save(x = nil, y = nil)
47
+ x ||= 0
48
+ y ||= 0
49
+
50
+ `#@canvas.putImageData(#@native, x, y)`
51
+ end
52
+
53
+ def save_to(canvas, x = nil, y = nil)
54
+ x ||= 0
55
+ y ||= 0
56
+
57
+ `#{canvas.to_n}.putImageData(#@native, x, y)`
58
+ end
59
+
60
+ alias size length
61
+ end
62
+
63
+ end; end
@@ -0,0 +1,27 @@
1
+ module Browser; class Canvas
2
+
3
+ class Gradient
4
+ include Native
5
+
6
+ attr_reader :context
7
+
8
+ def initialize(context, *args, &block)
9
+ @context = context
10
+
11
+ super(case args.length
12
+ when 4 then `#{@context.to_n}.createLinearGradient.apply(self, args)`
13
+ when 6 then `#{@context.to_n}.createRadialGradient.apply(self, args)`
14
+ else raise ArgumentError, "don't know where to dispatch"
15
+ end)
16
+
17
+ instance_eval(&block)
18
+ end
19
+
20
+ def add(position, color)
21
+ `#{@context.to_n}.addColorStop(position, color)`
22
+
23
+ self
24
+ end
25
+ end
26
+
27
+ end; end
@@ -0,0 +1,113 @@
1
+ module Browser; class Canvas
2
+
3
+ class StyleObject
4
+ include Native
5
+
6
+ attr_reader :context
7
+
8
+ def initialize(context)
9
+ @context = context
10
+
11
+ super(@context.to_n)
12
+ end
13
+ end
14
+
15
+ class Style < StyleObject
16
+ class Line < StyleObject
17
+ attr_reader :width, :cap, :join, :miter_limit
18
+
19
+ def width=(value)
20
+ `#@native.lineWidth = #{@width = value}`
21
+ end
22
+
23
+ def cap=(value)
24
+ `#@native.lineCap = #{@cap = value}`
25
+ end
26
+
27
+ def join=(value)
28
+ `#@native.lineJoin = #{@join = value}`
29
+ end
30
+
31
+ def miter_limit=(value)
32
+ `#@native.miterLimit = #{@miter_limit = value}`
33
+ end
34
+ end
35
+
36
+ class Text < StyleObject
37
+ attr_reader :font, :align, :baseline
38
+
39
+ def font=(value)
40
+ `#@native.font = #{@font = value}`
41
+ end
42
+
43
+ def align=(value)
44
+ `#@native.textAlign = #{@align = value}`
45
+ end
46
+
47
+ def baseline=(value)
48
+ `#@native.textBaseline = #{@baseline = value}`
49
+ end
50
+ end
51
+
52
+ class Image < StyleObject
53
+ attr_reader :smooth
54
+
55
+ alias smooth? smooth
56
+
57
+ def smooth!
58
+ `#@native.mozImageSmoothingEnabled = #{@smooth = true}`
59
+ end
60
+
61
+ def no_smooth!
62
+ `#@native.mozImageSmoothingEnabled = #{@smooth = false}`
63
+ end
64
+ end
65
+
66
+ class Shadow < StyleObject
67
+ attr_reader :offset, :blur, :color
68
+
69
+ def offset=(value)
70
+ `#@native.shadowOffsetX = #{value[:x]}`
71
+ `#@native.shadowOffsetY = #{value[:y]}`
72
+
73
+ @offset = value
74
+ end
75
+
76
+ def blur=(value)
77
+ `#@native.shadowBlur = #{@blur = value}`
78
+ end
79
+
80
+ def color=(value)
81
+ `#@native.shadowColor = #{@color = value}`
82
+ end
83
+ end
84
+
85
+ attr_reader :line, :text, :image, :shadow, :fill, :stroke, :alpha, :composite_operation
86
+
87
+ def initialize(context)
88
+ super(context)
89
+
90
+ @line = Line.new(context)
91
+ @text = Text.new(context)
92
+ @image = Image.new(context)
93
+ @shadow = Shadow.new(context)
94
+ end
95
+
96
+ def fill=(value)
97
+ `#@native.fillStyle = #{(@fill = value).to_n}`
98
+ end
99
+
100
+ def stroke=(value)
101
+ `#@native.strokeStyle = #{(@stroke = value).to_n}`
102
+ end
103
+
104
+ def alpha=(value)
105
+ `#@native.globalAlpha = #{@alpha = value}`
106
+ end
107
+
108
+ def composite_operation=(value)
109
+ `#@native.globalCompositeOperation = #{@composite_operation = value}`
110
+ end
111
+ end
112
+
113
+ end; end
@@ -0,0 +1,45 @@
1
+ module Browser; class Canvas
2
+
3
+ class Text
4
+ include Native
5
+
6
+ attr_reader :context
7
+
8
+ def initialize(context)
9
+ @context = context
10
+
11
+ super(@context.to_n)
12
+ end
13
+
14
+ def measure(text)
15
+ `#@native.measureText(text)`
16
+ end
17
+
18
+ def fill(text, x = nil, y = nil, max_width = nil)
19
+ x ||= 0
20
+ y ||= 0
21
+
22
+ if max_width
23
+ `#@native.fillText(text, x, y, max_width)`
24
+ else
25
+ `#@native.fillText(text, x, y)`
26
+ end
27
+
28
+ @context
29
+ end
30
+
31
+ def stroke(text, x = nil, y = nil, max_width = nil)
32
+ x ||= 0
33
+ y ||= 0
34
+
35
+ if max_width
36
+ `#@native.strokeText(text, x, y, max_width)`
37
+ else
38
+ `#@native.strokeText(text, x, y)`
39
+ end
40
+
41
+ @context
42
+ end
43
+ end
44
+
45
+ end; end
@@ -0,0 +1,103 @@
1
+ module Browser
2
+
3
+ # Manipulate the browser console.
4
+ #
5
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/console
6
+ class Console
7
+ include Native
8
+
9
+ # Clear the console.
10
+ def clear
11
+ `#@native.clear()`
12
+ end
13
+
14
+ # Print a stacktrace from the call site.
15
+ def trace
16
+ `#@native.trace()`
17
+ end
18
+
19
+ # Log the passed objects based on an optional initial format.
20
+ def log(*args)
21
+ `#@native.log.apply(#@native, args)`
22
+ end
23
+
24
+ # Log the passed objects based on an optional initial format as informational
25
+ # log.
26
+ def info(*args)
27
+ `#@native.info.apply(#@native, args)`
28
+ end
29
+
30
+ # Log the passed objects based on an optional initial format as warning.
31
+ def warn(*args)
32
+ `#@native.warn.apply(#@native, args)`
33
+ end
34
+
35
+ # Log the passed objects based on an optional initial format as error.
36
+ def error(*args)
37
+ `#@native.error.apply(#@native, args)`
38
+ end
39
+
40
+ # Time the given block with the given label.
41
+ def time(label, &block)
42
+ raise ArgumentError, "no block given" unless block
43
+
44
+ `#@native.time(label)`
45
+
46
+ begin
47
+ if block.arity == 0
48
+ instance_exec(&block)
49
+ else
50
+ block.call(self)
51
+ end
52
+ ensure
53
+ `#@native.timeEnd()`
54
+ end
55
+ end
56
+
57
+ # Group the given block.
58
+ def group(*args, &block)
59
+ raise ArgumentError, "no block given" unless block
60
+
61
+ `#@native.group.apply(#@native, args)`
62
+
63
+ begin
64
+ if block.arity == 0
65
+ instance_exec(&block)
66
+ else
67
+ block.call(self)
68
+ end
69
+ ensure
70
+ `#@native.groupEnd()`
71
+ end
72
+ end
73
+
74
+ # Group the given block but collapse it.
75
+ def group!(*args, &block)
76
+ return unless block_given?
77
+
78
+ `#@native.groupCollapsed.apply(#@native, args)`
79
+
80
+ begin
81
+ if block.arity == 0
82
+ instance_exec(&block)
83
+ else
84
+ block.call(self)
85
+ end
86
+ ensure
87
+ `#@native.groupEnd()`
88
+ end
89
+ end
90
+ end
91
+
92
+ class Window
93
+ # Get the {Console} for this window.
94
+ #
95
+ # @return [Console]
96
+ def console
97
+ Console.new(`#@native.console`)
98
+ end
99
+ end
100
+
101
+ $console = $window.console
102
+
103
+ end
@@ -0,0 +1,133 @@
1
+ require 'stringio'
2
+
3
+ module Browser
4
+
5
+ # Allows manipulation of browser cookies.
6
+ #
7
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
8
+ class Cookies
9
+ # Default cookie options.
10
+ DEFAULT = {
11
+ expires: Time.now + 1.day,
12
+ secure: false
13
+ }
14
+
15
+ include Enumerable
16
+
17
+ attr_reader :options
18
+
19
+ # Create a new {Cookies} wrapper.
20
+ #
21
+ # @param document [native] the native document object
22
+ def initialize(document)
23
+ @document = document
24
+ @options = DEFAULT.dup
25
+ end
26
+
27
+ # Access the cookie with the given name.
28
+ #
29
+ # @param name [String] the name of the cookie
30
+ #
31
+ # @return [Object]
32
+ def [](name)
33
+ matches = `#@document.cookie`.scan(/#{Regexp.escape(name.encode_uri_component)}=([^;]*)/)
34
+
35
+ return if matches.empty?
36
+
37
+ result = matches.map {|cookie|
38
+ JSON.parse(cookie.match(/^.*?=(.*)$/)[1].decode_uri_component)
39
+ }
40
+
41
+ result.length == 1 ? result.first : result
42
+ end
43
+
44
+ # Set a cookie.
45
+ #
46
+ # @param name [String] the name of the cookie
47
+ # @param value [Object] the data to set
48
+ # @param options [Hash] the options for the cookie
49
+ #
50
+ # @option options [Integer] :max_age the max age of the cookie in seconds
51
+ # @option options [Time] :expires the expire date
52
+ # @option options [String] :path the path the cookie is valid on
53
+ # @option options [String] :domain the domain the cookie is valid on
54
+ # @option options [Boolean] :secure whether the cookie is secure or not
55
+ def []=(name, value, options = {})
56
+ `#@document.cookie = #{encode name, value.is_a?(String) ? value : JSON.dump(value), @options.merge(options)}`
57
+ end
58
+
59
+ # Delete a cookie.
60
+ #
61
+ # @param name [String] the name of the cookie
62
+ def delete(name)
63
+ `#@document.cookie = #{encode name, '', expires: Time.now}`
64
+ end
65
+
66
+ # @!attribute [r] keys
67
+ # @return [Array<String>] all the cookie names
68
+ def keys
69
+ Array(`#@document.cookie.split(/; /)`).map {|cookie|
70
+ cookie.split(/\s*=\s*/).first
71
+ }
72
+ end
73
+
74
+ # @!attribute [r] values
75
+ # @return [Array] all the cookie values
76
+ def values
77
+ keys.map {|key|
78
+ self[key]
79
+ }
80
+ end
81
+
82
+ # Enumerate the cookies.
83
+ #
84
+ # @yieldparam key [String] the name of the cookie
85
+ # @yieldparam value [String] the value of the cookie
86
+ #
87
+ # @return [self]
88
+ def each(&block)
89
+ return enum_for :each unless block
90
+
91
+ keys.each {|key|
92
+ yield key, self[key]
93
+ }
94
+
95
+ self
96
+ end
97
+
98
+ # Delete all the cookies
99
+ #
100
+ # @return [self]
101
+ def clear
102
+ keys.each {|key|
103
+ delete key
104
+ }
105
+
106
+ self
107
+ end
108
+
109
+ protected
110
+ def encode(key, value, options = {})
111
+ io = StringIO.new
112
+
113
+ io << key.encode_uri_component << ?= << value.encode_uri_component << '; '
114
+
115
+ io << 'max-age=' << options[:max_age] << '; ' if options[:max_age]
116
+ io << 'expires=' << options[:expires].to_utc << '; ' if options[:expires]
117
+ io << 'path=' << options[:path] << '; ' if options[:path]
118
+ io << 'domain=' << options[:domain] << '; ' if options[:domain]
119
+ io << 'secure' if options[:secure]
120
+
121
+ io.string
122
+ end
123
+ end
124
+
125
+ class DOM::Document < DOM::Element
126
+ # @!attribute [r] cookies
127
+ # @return [Cookies] the cookies for the document
128
+ def cookies
129
+ Cookies.new(@native) if defined?(`#@native.cookie`)
130
+ end
131
+ end
132
+
133
+ end