fzeet 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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'],