opal-browser 0.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +11 -0
  5. data/README.md +106 -0
  6. data/Rakefile +5 -0
  7. data/config.ru +63 -0
  8. data/lib/opal/browser.rb +4 -0
  9. data/opal-browser.gemspec +23 -0
  10. data/opal/browser.rb +10 -0
  11. data/opal/browser/animation_frame.rb +29 -0
  12. data/opal/browser/canvas.rb +277 -0
  13. data/opal/browser/canvas/data.rb +73 -0
  14. data/opal/browser/canvas/gradient.rb +37 -0
  15. data/opal/browser/canvas/style.rb +123 -0
  16. data/opal/browser/canvas/text.rb +55 -0
  17. data/opal/browser/compatibility.rb +59 -0
  18. data/opal/browser/compatibility/animation_frame.rb +93 -0
  19. data/opal/browser/compatibility/dom/document/window.rb +15 -0
  20. data/opal/browser/compatibility/dom/element/css.rb +15 -0
  21. data/opal/browser/compatibility/dom/element/matches.rb +31 -0
  22. data/opal/browser/compatibility/dom/element/offset.rb +20 -0
  23. data/opal/browser/compatibility/dom/element/scroll.rb +25 -0
  24. data/opal/browser/compatibility/dom/element/style.rb +15 -0
  25. data/opal/browser/compatibility/dom/mutation_observer.rb +47 -0
  26. data/opal/browser/compatibility/http/request.rb +15 -0
  27. data/opal/browser/compatibility/immediate.rb +107 -0
  28. data/opal/browser/compatibility/window/scroll.rb +27 -0
  29. data/opal/browser/compatibility/window/size.rb +13 -0
  30. data/opal/browser/compatibility/window/view.rb +13 -0
  31. data/opal/browser/console.rb +137 -0
  32. data/opal/browser/cookies.rb +79 -0
  33. data/opal/browser/css.rb +24 -0
  34. data/opal/browser/css/declaration.rb +88 -0
  35. data/opal/browser/css/rule.rb +48 -0
  36. data/opal/browser/css/rule/style.rb +16 -0
  37. data/opal/browser/css/style_sheet.rb +83 -0
  38. data/opal/browser/css/unit.rb +188 -0
  39. data/opal/browser/dom.rb +95 -0
  40. data/opal/browser/dom/attribute.rb +19 -0
  41. data/opal/browser/dom/builder.rb +97 -0
  42. data/opal/browser/dom/cdata.rb +9 -0
  43. data/opal/browser/dom/character_data.rb +37 -0
  44. data/opal/browser/dom/comment.rb +9 -0
  45. data/opal/browser/dom/compatibility.rb +8 -0
  46. data/opal/browser/dom/document.rb +83 -0
  47. data/opal/browser/dom/document_fragment.rb +7 -0
  48. data/opal/browser/dom/element.rb +290 -0
  49. data/opal/browser/dom/element/input.rb +17 -0
  50. data/opal/browser/dom/element/offset.rb +67 -0
  51. data/opal/browser/dom/element/position.rb +37 -0
  52. data/opal/browser/dom/element/scroll.rb +49 -0
  53. data/opal/browser/dom/event.rb +240 -0
  54. data/opal/browser/dom/event/animation.rb +26 -0
  55. data/opal/browser/dom/event/audio_processing.rb +31 -0
  56. data/opal/browser/dom/event/base.rb +207 -0
  57. data/opal/browser/dom/event/before_unload.rb +13 -0
  58. data/opal/browser/dom/event/clipboard.rb +26 -0
  59. data/opal/browser/dom/event/close.rb +35 -0
  60. data/opal/browser/dom/event/composition.rb +38 -0
  61. data/opal/browser/dom/event/custom.rb +30 -0
  62. data/opal/browser/dom/event/device_light.rb +21 -0
  63. data/opal/browser/dom/event/device_motion.rb +38 -0
  64. data/opal/browser/dom/event/device_orientation.rb +36 -0
  65. data/opal/browser/dom/event/device_proximity.rb +31 -0
  66. data/opal/browser/dom/event/drag.rb +113 -0
  67. data/opal/browser/dom/event/focus.rb +23 -0
  68. data/opal/browser/dom/event/gamepad.rb +47 -0
  69. data/opal/browser/dom/event/hash_change.rb +26 -0
  70. data/opal/browser/dom/event/keyboard.rb +93 -0
  71. data/opal/browser/dom/event/message.rb +50 -0
  72. data/opal/browser/dom/event/mouse.rb +253 -0
  73. data/opal/browser/dom/event/page_transition.rb +21 -0
  74. data/opal/browser/dom/event/pop_state.rb +21 -0
  75. data/opal/browser/dom/event/progress.rb +31 -0
  76. data/opal/browser/dom/event/sensor.rb +13 -0
  77. data/opal/browser/dom/event/storage.rb +41 -0
  78. data/opal/browser/dom/event/touch.rb +69 -0
  79. data/opal/browser/dom/event/ui.rb +22 -0
  80. data/opal/browser/dom/event/wheel.rb +49 -0
  81. data/opal/browser/dom/mutation_observer.rb +118 -0
  82. data/opal/browser/dom/node.rb +317 -0
  83. data/opal/browser/dom/node_set.rb +88 -0
  84. data/opal/browser/dom/text.rb +21 -0
  85. data/opal/browser/effects.rb +39 -0
  86. data/opal/browser/event_source.rb +67 -0
  87. data/opal/browser/history.rb +54 -0
  88. data/opal/browser/http.rb +129 -0
  89. data/opal/browser/http/binary.rb +57 -0
  90. data/opal/browser/http/compatibility.rb +1 -0
  91. data/opal/browser/http/headers.rb +90 -0
  92. data/opal/browser/http/parameters.rb +8 -0
  93. data/opal/browser/http/request.rb +331 -0
  94. data/opal/browser/http/response.rb +115 -0
  95. data/opal/browser/immediate.rb +43 -0
  96. data/opal/browser/interval.rb +93 -0
  97. data/opal/browser/location.rb +77 -0
  98. data/opal/browser/navigator.rb +151 -0
  99. data/opal/browser/screen.rb +40 -0
  100. data/opal/browser/socket.rb +115 -0
  101. data/opal/browser/storage.rb +149 -0
  102. data/opal/browser/timeout.rb +60 -0
  103. data/opal/browser/utils.rb +56 -0
  104. data/opal/browser/version.rb +3 -0
  105. data/opal/browser/window.rb +113 -0
  106. data/opal/browser/window/compatibility.rb +3 -0
  107. data/opal/browser/window/scroll.rb +49 -0
  108. data/opal/browser/window/size.rb +35 -0
  109. data/opal/browser/window/view.rb +18 -0
  110. data/spec/dom/builder_spec.rb +69 -0
  111. data/spec/dom/document_spec.rb +40 -0
  112. data/spec/dom/element_spec.rb +46 -0
  113. data/spec/dom/event_spec.rb +127 -0
  114. data/spec/dom/mutation_observer_spec.rb +37 -0
  115. data/spec/dom/node_spec.rb +154 -0
  116. data/spec/dom_spec.rb +13 -0
  117. data/spec/event_source_spec.rb +42 -0
  118. data/spec/history_spec.rb +48 -0
  119. data/spec/http_spec.rb +87 -0
  120. data/spec/immediate_spec.rb +12 -0
  121. data/spec/json2.js +486 -0
  122. data/spec/sizzle.js +5 -0
  123. data/spec/socket_spec.rb +43 -0
  124. data/spec/spec_helper.rb +37 -0
  125. data/spec/storage_spec.rb +26 -0
  126. data/spec/window_spec.rb +10 -0
  127. metadata +240 -0
@@ -0,0 +1,73 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module Browser; class Canvas
12
+
13
+ class Data
14
+ def self.create(canvas, width, height)
15
+ data = allocate
16
+
17
+ data.instance_eval {
18
+ @canvas = canvas.to_a
19
+ @x = 0
20
+ @y = 0
21
+ @width = width
22
+ @height = height
23
+
24
+ @native = `#{canvas.to_n}.createImageData(width, height)`
25
+ }
26
+
27
+ data
28
+ end
29
+
30
+ include Native
31
+
32
+ attr_reader :x, :y, :width, :height
33
+
34
+ def initialize(canvas, x, y, width, height)
35
+ @canvas = canvas.to_n
36
+ @x = x
37
+ @y = y
38
+ @width = width
39
+ @height = height
40
+
41
+ super(`#@canvas.getImageData(x, y, width, height)`)
42
+ end
43
+
44
+ def length
45
+ `#@native.length`
46
+ end
47
+
48
+ def [](index)
49
+ `#@native.data[index]`
50
+ end
51
+
52
+ def []=(index, value)
53
+ `#@native.data[index] = value`
54
+ end
55
+
56
+ def save(x = nil, y = nil)
57
+ x ||= 0
58
+ y ||= 0
59
+
60
+ `#@canvas.putImageData(#@native, x, y)`
61
+ end
62
+
63
+ def save_to(canvas, x = nil, y = nil)
64
+ x ||= 0
65
+ y ||= 0
66
+
67
+ `#{canvas.to_n}.putImageData(#@native, x, y)`
68
+ end
69
+
70
+ alias size length
71
+ end
72
+
73
+ end; end
@@ -0,0 +1,37 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module Browser; class Canvas
12
+
13
+ class Gradient
14
+ include Native
15
+
16
+ attr_reader :context
17
+
18
+ def initialize(context, *args, &block)
19
+ @context = context
20
+
21
+ super(case args.length
22
+ when 4 then `#{@context.to_n}.createLinearGradient.apply(self, args)`
23
+ when 6 then `#{@context.to_n}.createRadialGradient.apply(self, args)`
24
+ else raise ArgumentError, "don't know where to dispatch"
25
+ end)
26
+
27
+ instance_eval(&block)
28
+ end
29
+
30
+ def add(position, color)
31
+ `#{@context.to_n}.addColorStop(position, color)`
32
+
33
+ self
34
+ end
35
+ end
36
+
37
+ end; end
@@ -0,0 +1,123 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module Browser; class Canvas
12
+
13
+ class StyleObject
14
+ include Native
15
+
16
+ attr_reader :context
17
+
18
+ def initialize(context)
19
+ @context = context
20
+
21
+ super(@context.to_n)
22
+ end
23
+ end
24
+
25
+ class Style < StyleObject
26
+ class Line < StyleObject
27
+ attr_reader :width, :cap, :join, :miter_limit
28
+
29
+ def width=(value)
30
+ `#@native.lineWidth = #{@width = value}`
31
+ end
32
+
33
+ def cap=(value)
34
+ `#@native.lineCap = #{@cap = value}`
35
+ end
36
+
37
+ def join=(value)
38
+ `#@native.lineJoin = #{@join = value}`
39
+ end
40
+
41
+ def miter_limit=(value)
42
+ `#@native.miterLimit = #{@miter_limit = value}`
43
+ end
44
+ end
45
+
46
+ class Text < StyleObject
47
+ attr_reader :font, :align, :baseline
48
+
49
+ def font=(value)
50
+ `#@native.font = #{@font = value}`
51
+ end
52
+
53
+ def align=(value)
54
+ `#@native.textAlign = #{@align = value}`
55
+ end
56
+
57
+ def baseline=(value)
58
+ `#@native.textBaseline = #{@baseline = value}`
59
+ end
60
+ end
61
+
62
+ class Image < StyleObject
63
+ attr_reader :smooth
64
+
65
+ alias smooth? smooth
66
+
67
+ def smooth!
68
+ `#@native.mozImageSmoothingEnabled = #{@smooth = true}`
69
+ end
70
+
71
+ def no_smooth!
72
+ `#@native.mozImageSmoothingEnabled = #{@smooth = false}`
73
+ end
74
+ end
75
+
76
+ class Shadow < StyleObject
77
+ attr_reader :offset, :blur, :color
78
+
79
+ def offset=(value)
80
+ `#@native.shadowOffsetX = #{value[:x]}`
81
+ `#@native.shadowOffsetY = #{value[:y]}`
82
+
83
+ @offset = value
84
+ end
85
+
86
+ def blur=(value)
87
+ `#@native.shadowBlur = #{@blur = value}`
88
+ end
89
+
90
+ def color=(value)
91
+ `#@native.shadowColor = #{@color = value}`
92
+ end
93
+ end
94
+
95
+ attr_reader :line, :text, :image, :shadow, :fill, :stroke, :alpha, :composite_operation
96
+
97
+ def initialize(context)
98
+ super(context)
99
+
100
+ @line = Line.new(context)
101
+ @text = Text.new(context)
102
+ @image = Image.new(context)
103
+ @shadow = Shadow.new(context)
104
+ end
105
+
106
+ def fill=(value)
107
+ `#@native.fillStyle = #{(@fill = value).to_n}`
108
+ end
109
+
110
+ def stroke=(value)
111
+ `#@native.strokeStyle = #{(@stroke = value).to_n}`
112
+ end
113
+
114
+ def alpha=(value)
115
+ `#@native.globalAlpha = #{@alpha = value}`
116
+ end
117
+
118
+ def composite_operation=(value)
119
+ `#@native.globalCompositeOperation = #{@composite_operation = value}`
120
+ end
121
+ end
122
+
123
+ end; end
@@ -0,0 +1,55 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module Browser; class Canvas
12
+
13
+ class Text
14
+ include Native
15
+
16
+ attr_reader :context
17
+
18
+ def initialize(context)
19
+ @context = context
20
+
21
+ super(@context.to_n)
22
+ end
23
+
24
+ def measure(text)
25
+ `#@native.measureText(text)`
26
+ end
27
+
28
+ def fill(text, x = nil, y = nil, max_width = nil)
29
+ x ||= 0
30
+ y ||= 0
31
+
32
+ if max_width
33
+ `#@native.fillText(text, x, y, max_width)`
34
+ else
35
+ `#@native.fillText(text, x, y)`
36
+ end
37
+
38
+ @context
39
+ end
40
+
41
+ def stroke(text, x = nil, y = nil, max_width = nil)
42
+ x ||= 0
43
+ y ||= 0
44
+
45
+ if max_width
46
+ `#@native.strokeText(text, x, y, max_width)`
47
+ else
48
+ `#@native.strokeText(text, x, y)`
49
+ end
50
+
51
+ @context
52
+ end
53
+ end
54
+
55
+ end; end
@@ -0,0 +1,59 @@
1
+ BROWSER_ENGINE = `/MSIE|WebKit|Presto|Gecko/.exec(navigator.userAgent)[0]`.downcase rescue :unknown
2
+
3
+ module Browser
4
+
5
+ module Compatibility
6
+ def self.sizzle?
7
+ defined?(`window.Sizzle`)
8
+ end
9
+
10
+ # FIXME: v
11
+ # def self.respond_to?(parent = `window`, object, method)
12
+ # ^
13
+ def self.respond_to?(*args)
14
+ if args.length == 2
15
+ parent = `window`
16
+ object, method = args
17
+ else
18
+ parent, object, method = args
19
+ end
20
+
21
+ %x{
22
+ if (!#{parent}) {
23
+ return false;
24
+ }
25
+
26
+ var klass = #{parent}[#{object}];
27
+
28
+ if (!klass) {
29
+ return false;
30
+ }
31
+
32
+ return typeof(klass.prototype[#{method}]) === "function";
33
+ }
34
+ end
35
+
36
+ # FIXME: v
37
+ # def self.has?(parent = `window`, name)
38
+ # ^
39
+ def self.has?(*args)
40
+ if args.length == 1
41
+ parent = `window`
42
+ name, = args
43
+ else
44
+ parent, name = args
45
+ end
46
+
47
+ %x{
48
+ if (!#{parent}) {
49
+ return false;
50
+ }
51
+
52
+ return #{parent}[#{name}] != null;
53
+ }
54
+ end
55
+ end
56
+
57
+ C = Compatibility
58
+
59
+ end
@@ -0,0 +1,93 @@
1
+ module Browser
2
+
3
+ class Compatibility
4
+ def self.request_animation?(prefix = nil)
5
+ if prefix
6
+ has?("#{prefix}RequestAnimationFrame")
7
+ else
8
+ has?(:requestAnimationFrame)
9
+ end
10
+ end
11
+
12
+ def self.cancel_animation?(prefix = nil)
13
+ if prefix
14
+ has?("#{prefix}CancelAnimationFrame")
15
+ else
16
+ has?(:cancelAnimationFrame)
17
+ end
18
+ end
19
+
20
+ def self.cancel_request_animation?(prefix = nil)
21
+ if prefix
22
+ has?("#{prefix}CancelRequestAnimationFrame")
23
+ else
24
+ has?(:cancelAnimationFrame)
25
+ end
26
+ end
27
+ end
28
+
29
+ class AnimationFrame
30
+ if C.request_animation?
31
+ def request(block)
32
+ `#@native.requestAnimationFrame(#{block.to_n})`
33
+ end
34
+ elsif C.request_animation? :webkit
35
+ def request(block)
36
+ `#@native.webkitRequestAnimationFrame(#{block.to_n})`
37
+ end
38
+ elsif C.request_animation? :moz
39
+ def request(block)
40
+ `#@native.mozRequestAnimationFrame(#{block.to_n})`
41
+ end
42
+ elsif C.request_animation? :o
43
+ def request(block)
44
+ `#@native.oRequestAnimationFrame(#{block.to_n})`
45
+ end
46
+ elsif C.request_animation? :ms
47
+ def request(block)
48
+ `#@native.msRequestAnimationFrame(#{block.to_n})`
49
+ end
50
+ end
51
+
52
+ if C.cancel_animation?
53
+ def cancel
54
+ `#@native.cancelAnimationFrame(#@id)`
55
+ end
56
+ else
57
+ if C.cancel_animation? :webkit
58
+ def cancel
59
+ `#@native.webkitCancelAnimationFrame(#@id)`
60
+ end
61
+ elsif C.cancel_request_animation? :webkit
62
+ def cancel
63
+ `#@native.webkitCancelRequestAnimationFrame(#@id)`
64
+ end
65
+ elsif C.cancel_animation? :moz
66
+ def cancel
67
+ `#@native.mozCancelAnimationFrame(#@id)`
68
+ end
69
+ elsif C.cancel_request_animation? :moz
70
+ def cancel
71
+ `#@native.mozCancelRequestAnimationFrame(#@id)`
72
+ end
73
+ elsif C.cancel_animation? :o
74
+ def cancel
75
+ `#@native.oCancelAnimationFrame(#@id)`
76
+ end
77
+ elsif C.cancel_request_animation? :o
78
+ def cancel
79
+ `#@native.oCancelRequestAnimationFrame(#@id)`
80
+ end
81
+ elsif C.cancel_animation? :ms
82
+ def cancel
83
+ `#@native.msCancelAnimationFrame(#@id)`
84
+ end
85
+ elsif C.cancel_request_animation? :ms
86
+ def cancel
87
+ `#@native.msCancelRequestAnimationFrame(#@id)`
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ end