fzeet 0.6.4 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/Control/ExplorerBrowser.rbw +8 -9
- data/examples/Control/WebBrowser.rbw +10 -5
- data/examples/Control/WebBrowser1.rbw +20 -0
- data/examples/Control/WebBrowser2.rbw +39 -0
- data/examples/Control/WebBrowser3.rbw +38 -0
- data/examples/Control/WebBrowser4.rbw +44 -0
- data/examples/Control/WebBrowser4Sinatra.rb +9 -0
- data/examples/Control/WebBrowser5.rbw +54 -0
- data/lib/fzeet/Control/ExplorerBrowser.rb +16 -16
- data/lib/fzeet/Control/ListView.rb +2 -0
- data/lib/fzeet/Control/WebBrowser.rb +27 -48
- data/lib/fzeet/windows/com.rb +1 -0
- data/lib/fzeet/windows/mshtml.rb +1135 -0
- data/lib/fzeet/windows/ole.rb +89 -0
- data/lib/fzeet/windows/shdocvw.rb +16 -0
- data/lib/fzeet/windows/urlmon.rb +61 -0
- data/lib/fzeet/windows.rb +2 -0
- metadata +12 -6
- data/lib/fzeet/windows/ole - Copy.rb +0 -446
- data/lib/fzeet/windows/shdocvw - Copy.rb +0 -171
@@ -13,17 +13,16 @@ Application.run { |window|
|
|
13
13
|
(browser = ExplorerBrowser.new(window)).
|
14
14
|
SetOptions(Windows::EBO_SHOWFRAMES)
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
browser.
|
17
|
+
on(:NavigationComplete) { |pidl|
|
18
|
+
FFI::MemoryPointer.new(:char, 4096) { |p|
|
19
|
+
Windows.SHGetPathFromIDList(pidl, p)
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
message p.read_string
|
22
|
+
}
|
23
|
+
}.
|
22
24
|
|
23
|
-
|
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
|
-
|
21
|
-
message Windows.WCSTOMBS(url)
|
22
|
-
end
|
22
|
+
message Windows.WCSTOMBS(arg1[:bstrVal])
|
23
23
|
|
24
|
-
|
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,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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
@@ -67,54 +67,13 @@ module Fzeet
|
|
67
67
|
class << @events
|
68
68
|
attr_reader :browser
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|