fzeet 0.6.4 → 0.6.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.
@@ -13,17 +13,16 @@ Application.run { |window|
13
13
  (browser = ExplorerBrowser.new(window)).
14
14
  SetOptions(Windows::EBO_SHOWFRAMES)
15
15
 
16
- def (browser.events).OnNavigationComplete(pidl)
17
- FFI::MemoryPointer.new(:char, 4096) { |p|
18
- Windows.SHGetPathFromIDList(pidl, p)
16
+ browser.
17
+ on(:NavigationComplete) { |pidl|
18
+ FFI::MemoryPointer.new(:char, 4096) { |p|
19
+ Windows.SHGetPathFromIDList(pidl, p)
19
20
 
20
- message p.read_string
21
- }
21
+ message p.read_string
22
+ }
23
+ }.
22
24
 
23
- Windows::S_OK
24
- end
25
-
26
- browser.goto(:Desktop)
25
+ goto(:Desktop)
27
26
 
28
27
  window.
29
28
  on(:command, :back, &browser.method(:back)).
@@ -15,13 +15,18 @@ Application.run { |window|
15
15
  append(:string, '&Search', :search)
16
16
  )
17
17
 
18
- browser = WebBrowser.new(window)
18
+ (browser = WebBrowser.new(window)).
19
+ on(:NavigateComplete) { |dispParams|
20
+ next if dispParams[:cArgs] < 1 || (arg1 = Windows::VARIANT.new(dispParams[:rgvarg]))[:vt] != Windows::VT_BSTR
19
21
 
20
- def (browser.events).NavigateComplete(url)
21
- message Windows.WCSTOMBS(url)
22
- end
22
+ message Windows.WCSTOMBS(arg1[:bstrVal])
23
23
 
24
- browser.search
24
+ browser.document.
25
+ on(:click) { message 'on(:click)' }.
26
+ on(:click) { message 'on(:click2)' }
27
+ }.
28
+
29
+ search
25
30
 
26
31
  window.
27
32
  on(:command, :refresh, &browser.method(:refresh)).
@@ -0,0 +1,20 @@
1
+ require 'fzeet'
2
+
3
+ include Fzeet
4
+
5
+ Application.run { |window|
6
+ (browser = WebBrowser.new(window)).
7
+ on(:BeforeNavigate) { message 'on(:BeforeNavigate)' }.
8
+
9
+ on(:NavigateComplete) {
10
+ browser.document.on(:ready) {
11
+ message 'DOM is ready'
12
+
13
+ browser.document.window.on(:load) {
14
+ message 'All assets are loaded'
15
+ }
16
+ }
17
+ }.
18
+
19
+ search
20
+ }
@@ -0,0 +1,39 @@
1
+ require 'fzeet'
2
+
3
+ include Fzeet
4
+
5
+ Application.run { |window|
6
+ (browser = WebBrowser.new(window)).
7
+ on(:NavigateComplete) {
8
+ html = <<-HTML
9
+ <!doctype html>
10
+ <html>
11
+ <head>
12
+ <title>Hello</title>
13
+ </head>
14
+ <body>
15
+ <h1>Hello, world!</h1>
16
+ </body>
17
+ </html>
18
+ HTML
19
+
20
+ psa = Windows.SafeArrayCreateVector(Windows::VT_VARIANT, 0, 1)
21
+
22
+ FFI::MemoryPointer.new(:pointer) { |pdata|
23
+ Windows.DetonateHresult(:SafeArrayAccessData, psa, pdata)
24
+
25
+ data = Windows::VARIANT.new(pdata.read_pointer)
26
+
27
+ data[:vt] = Windows::VT_BSTR
28
+ data[:bstrVal] = Windows.SysAllocString("#{html}\0".encode('utf-16le'))
29
+
30
+ Windows.DetonateHresult(:SafeArrayUnaccessData, psa)
31
+
32
+ browser.document.write(psa)
33
+ }
34
+
35
+ Windows.DetonateHresult(:SafeArrayDestroy, psa)
36
+ }.
37
+
38
+ goto('about:blank')
39
+ }
@@ -0,0 +1,38 @@
1
+ require 'fzeet'
2
+
3
+ include Fzeet
4
+
5
+ Application.run { |window|
6
+ (browser = WebBrowser.new(window)).
7
+ on(:NavigateComplete) {
8
+ browser.document.on(:ready) {
9
+ all = browser.document.all
10
+
11
+ (head = all.get('head').get(0)).
12
+ node.
13
+ appendChild(browser.document.createElement("<meta http-equiv='MSThemeCompatible' content='yes' />"))
14
+
15
+ (body = all.get('body').get(0)).
16
+ css(overflow: 'auto').
17
+ innerHTML = <<-HTML
18
+ <div>
19
+ <button id='button1'>Button1</button>
20
+ <input type='checkbox' id='check1' /> <label id='label1' for='check1'>Check1</label>
21
+ </div>
22
+ HTML
23
+
24
+ (button1 = all.get('#button1')).
25
+ on(:click) { message button1.className }.
26
+ className = 'Foo'
27
+
28
+ (check1 = all.get('#check1')).
29
+ on(:click) { message check1.attr(:checked) }.
30
+ attr(:checked, true)
31
+
32
+ (label1 = all.get('#label1')).
33
+ css(border: '1px dotted red', cursor: 'hand')
34
+ }
35
+ }.
36
+
37
+ goto('about:blank')
38
+ }
@@ -0,0 +1,44 @@
1
+ require 'fzeet'
2
+
3
+ include Fzeet
4
+
5
+ Application.run { |window|
6
+ (browser = WebBrowser.new(window)).
7
+ on(:NavigateComplete) {
8
+ browser.document.on(:ready) {
9
+ all = browser.document.all
10
+
11
+ (head = all.get('head').get(0)).
12
+ node.
13
+ appendChild(browser.document.createElement("<meta http-equiv='MSThemeCompatible' content='yes' />"))
14
+
15
+ (body = all.get('body').get(0)).
16
+ css(overflow: 'auto').
17
+ innerHTML = <<-HTML
18
+ <button id='button1'>Button1</button> <span id='span1'></span>
19
+ HTML
20
+
21
+ button1 = nil
22
+
23
+ (request = browser.document.request).
24
+ on(:readystatechange) {
25
+ next unless request.readyState == 4
26
+
27
+ all.get('#span1').innerText = request.responseText if request.status == 200
28
+
29
+ button1.attr(:disabled, false)
30
+ }
31
+
32
+ (button1 = all.get('#button1')).
33
+ on(:click) {
34
+ request.
35
+ open('http://localhost:4567/hello').
36
+ send(Windows::VARIANT.new)
37
+
38
+ button1.attr(:disabled, true)
39
+ }
40
+ }
41
+ }.
42
+
43
+ goto("http://#{ENV['ComputerName']}:4567/")
44
+ }
@@ -0,0 +1,9 @@
1
+ require 'sinatra'
2
+
3
+ get('/') { '' }
4
+
5
+ get('/hello') {
6
+ headers 'Access-Control-Allow-Origin' => '*'
7
+
8
+ 'Hello, world!'
9
+ }
@@ -0,0 +1,54 @@
1
+ require 'fzeet'
2
+
3
+ include Fzeet
4
+
5
+ Application.run { |window|
6
+ (browser = WebBrowser.new(window)).
7
+ on(:NavigateComplete) {
8
+ browser.document.on(:ready) {
9
+ all = browser.document.all
10
+
11
+ (head = all.get('head').get(0)).
12
+ node.
13
+ appendChild(browser.document.createElement("<meta http-equiv='MSThemeCompatible' content='yes' />"))
14
+
15
+ (body = all.get('body').get(0)).
16
+ css(overflow: 'auto').
17
+ innerHTML = <<-HTML
18
+ <button id='button1'>Button1</button> <span id='span1'></span>
19
+ HTML
20
+
21
+ button1 = nil
22
+
23
+ (xrequest = browser.document.xrequest).
24
+ on(:load) {
25
+ all.get('#span1').innerText = xrequest.responseText
26
+
27
+ button1.attr(:disabled, false)
28
+ }.
29
+
30
+ on(:timeout) {
31
+ all.get('#span1').innerText = 'Timeout'
32
+
33
+ button1.attr(:disabled, false)
34
+ }.
35
+
36
+ on(:error) {
37
+ all.get('#span1').innerText = 'Error'
38
+
39
+ button1.attr(:disabled, false)
40
+ }
41
+
42
+ (button1 = all.get('#button1')).
43
+ on(:click) {
44
+ xrequest.
45
+ open('http://localhost:4567/hello').
46
+ send(Windows::VARIANT.new)
47
+
48
+ button1.attr(:disabled, true)
49
+ }
50
+ }
51
+ }.
52
+
53
+ goto("http://#{ENV['ComputerName']}:4567/")
54
+ }
@@ -14,21 +14,15 @@ module Fzeet
14
14
  class << @events
15
15
  attr_reader :browser
16
16
 
17
- def OnNavigationPending(*args)
18
- Windows::S_OK
19
- end
20
-
21
- def OnViewCreated(*args)
22
- Windows::S_OK
23
- end
24
-
25
- def OnNavigationComplete(*args)
26
- Windows::S_OK
27
- end
28
-
29
- def OnNavigationFailed(*args)
30
- Windows::S_OK
31
- end
17
+ (self::VTBL.members - Windows::IUnknown::VTBL.members).each { |name|
18
+ define_method(name) { |*args|
19
+ (handlers = browser.handlers && browser.handlers[name]) && handlers.each { |handler|
20
+ (handler.arity == 0) ? handler.call : handler.call(*args)
21
+ }
22
+
23
+ Windows::S_OK
24
+ }
25
+ }
32
26
  end
33
27
 
34
28
  @cookie = nil
@@ -43,7 +37,13 @@ module Fzeet
43
37
  instance_variable_set(:@__ExplorerBrowser__, self)
44
38
  end
45
39
 
46
- attr_reader :parent, :events
40
+ attr_reader :parent, :events, :handlers
41
+
42
+ def on(event, &block)
43
+ ((@handlers ||= {})["On#{event}".to_sym] ||= []) << block
44
+
45
+ self
46
+ end
47
47
 
48
48
  def goto(where)
49
49
  pidl = nil
@@ -90,6 +90,8 @@ module Fzeet
90
90
 
91
91
  self
92
92
  end
93
+
94
+ def clear; sendmsg(:deleteallitems); self end
93
95
  end
94
96
 
95
97
  class ListView < Control
@@ -67,54 +67,13 @@ module Fzeet
67
67
  class << @events
68
68
  attr_reader :browser
69
69
 
70
- bstrs = []
71
-
72
- params = Class.new(FFI::Struct) {
73
- layout \
74
- :array, [Windows::PARAMDATA, 1]
75
- }.new
76
-
77
- param1 = params[:array][0]
78
-
79
- param1[:szName] = bstrs.push(Windows::SysAllocString("URL\0".encode('utf-16le'))).last
80
- param1[:vt] = Windows::VT_BSTR
81
-
82
- methods = Class.new(FFI::Struct) {
83
- layout \
84
- :array, [Windows::METHODDATA, 1]
85
- }.new
86
-
87
- method1 = methods[:array][0]
88
-
89
- method1[:szName] = bstrs.push(Windows::SysAllocString("NavigateComplete\0".encode('utf-16le'))).last
90
- method1[:ppdata] = params[:array]
91
- method1[:dispid] = Windows::DISPID_NAVIGATECOMPLETE
92
- method1[:iMeth] = 8
93
- method1[:cc] = Windows::CC_STDCALL
94
- method1[:cArgs] = 1
95
- method1[:wFlags] = Windows::DISPATCH_METHOD
96
- method1[:vtReturn] = Windows::VT_EMPTY
97
-
98
- interface = Windows::INTERFACEDATA.new
99
-
100
- interface[:pmethdata] = methods[:array]
101
- interface[:cMembers] = 1
102
-
103
- FFI::MemoryPointer.new(:pointer) { |pinfo|
104
- Windows.DetonateHresult(:CreateDispTypeInfo, interface, Windows.GetSystemDefaultLCID, pinfo)
105
-
106
- TypeInfo = pinfo.read_pointer
70
+ (self::VTBL.members - Windows::IDispatch::VTBL.members).each { |name|
71
+ define_method(name) { |dispParams|
72
+ (handlers = browser.handlers && browser.handlers[name]) && handlers.each { |handler|
73
+ (handler.arity == 0) ? handler.call : handler.call(dispParams)
74
+ }
75
+ }
107
76
  }
108
-
109
- bstrs.each { |bstr| Windows.SysFreeString(bstr) }
110
-
111
- def Invoke(dispid, *rest)
112
- return Windows::E_NOTIMPL unless dispid == Windows::DISPID_NAVIGATECOMPLETE
113
-
114
- Windows.DetonateHresult(:DispInvoke, self, TypeInfo, dispid, *rest[2..-1])
115
-
116
- Windows::S_OK
117
- end
118
77
  end
119
78
 
120
79
  QueryInstance(Windows::ConnectionPointContainer) { |cpc|
@@ -152,7 +111,13 @@ module Fzeet
152
111
  instance_variable_set(:@__WebBrowser__, self)
153
112
  end
154
113
 
155
- attr_reader :parent, :oips, :ocs, :events, :cp
114
+ attr_reader :parent, :oips, :ocs, :events, :cp, :handlers
115
+
116
+ def on(event, &block)
117
+ ((@handlers ||= {})[event] ||= []) << block
118
+
119
+ self
120
+ end
156
121
 
157
122
  def goto(where)
158
123
  where = Windows.SysAllocString("#{where}\0".encode('utf-16le'))
@@ -170,5 +135,19 @@ module Fzeet
170
135
  def search; GoSearch(); self end
171
136
 
172
137
  def refresh; Refresh(); self end
138
+
139
+ def document
140
+ disp = nil
141
+
142
+ FFI::MemoryPointer.new(:pointer) { |pdisp|
143
+ get_Document(pdisp)
144
+
145
+ disp = Windows::Dispatch.new(pdisp.read_pointer)
146
+
147
+ return disp.QueryInstance(Windows::HTMLDocument2)
148
+ }
149
+ ensure
150
+ disp.Release if disp
151
+ end
173
152
  end
174
153
  end
@@ -283,6 +283,7 @@ module Fzeet
283
283
  ]
284
284
 
285
285
  Dispatch = COM::Instance[IDispatch]
286
+ DCallback = COM::Callback[IDispatch]
286
287
 
287
288
  IConnectionPointContainer = COM::Interface[IUnknown,
288
289
  GUID['B196B284-BAB4-101A-B69C-00AA00341D07'],