wxruby3 1.7.0 → 1.8.0
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.
- checksums.yaml +4 -4
- data/INSTALL.md +27 -2
- data/README.md +15 -15
- data/ext/wxruby3/include/wxRubyApp.h +145 -46
- data/ext/wxruby3/include/wxruby-ComboPopup.h +25 -8
- data/ext/wxruby3/include/wxruby-GCTracking.h +262 -0
- data/ext/wxruby3/include/wxruby-MBConv.h +190 -0
- data/ext/wxruby3/include/wxruby-SharedEventHandler.h +183 -0
- data/ext/wxruby3/include/wxruby-SharedPtr.h +104 -0
- data/ext/wxruby3/include/wxruby-runtime.h +29 -0
- data/ext/wxruby3/swig/custom/rubytracking.swg +8 -22
- data/ext/wxruby3/swig/custom/wx_ruby_shared_ptr.i +434 -0
- data/ext/wxruby3/swig/custom/wx_shared_ptr.i +431 -0
- data/ext/wxruby3/swig/mark_free_impl.i +7 -132
- data/ext/wxruby3/swig/memory_management.i +8 -44
- data/ext/wxruby3/swig/wx.i +46 -73
- data/lib/wx/core/const.rb +0 -1
- data/lib/wx/core/context_help.rb +17 -0
- data/lib/wx/core/cursor.rb +1 -0
- data/lib/wx/core/helpcontrollerhelpprovider.rb +10 -2
- data/lib/wx/core/mbconv.rb +11 -0
- data/lib/wx/core/media_ctrl.rb +31 -0
- data/lib/wx/core/top_level_window.rb +7 -0
- data/lib/wx/core.rb +6 -0
- data/lib/wx/doc/art_provider.rb +17 -0
- data/lib/wx/doc/context_help.rb +42 -0
- data/lib/wx/doc/core.rb +0 -5
- data/lib/wx/doc/functions.rb +10 -0
- data/lib/wx/doc/gen/affine_matrix2d.rb +2 -0
- data/lib/wx/doc/gen/art_provider.rb +12 -0
- data/lib/wx/doc/gen/aui/aui_notebook_event.rb +15 -15
- data/lib/wx/doc/gen/aui/aui_pane_info.rb +8 -8
- data/lib/wx/doc/gen/aui/aui_tool_bar_event.rb +5 -5
- data/lib/wx/doc/gen/book_ctrl_base.rb +2 -1
- data/lib/wx/doc/gen/calendar_event.rb +5 -5
- data/lib/wx/doc/gen/choicebook.rb +2 -2
- data/lib/wx/doc/gen/collapsible_pane.rb +1 -1
- data/lib/wx/doc/gen/colour_dialog.rb +1 -1
- data/lib/wx/doc/gen/colour_picker_event.rb +3 -3
- data/lib/wx/doc/gen/context_help_button.rb +0 -53
- data/lib/wx/doc/gen/core.rb +4 -4
- data/lib/wx/doc/gen/credential_entry_dialog.rb +2 -2
- data/lib/wx/doc/gen/date_event.rb +2 -2
- data/lib/wx/doc/gen/dial_up_event.rb +2 -2
- data/lib/wx/doc/gen/dir_filter_list_ctrl.rb +2 -2
- data/lib/wx/doc/gen/event.rb +58 -58
- data/lib/wx/doc/gen/ext_help_controller.rb +62 -16
- data/lib/wx/doc/gen/file_ctrl.rb +4 -4
- data/lib/wx/doc/gen/file_dir_picker_event.rb +2 -2
- data/lib/wx/doc/gen/file_system.rb +1 -1
- data/lib/wx/doc/gen/find_dialog_event.rb +5 -5
- data/lib/wx/doc/gen/font_picker_event.rb +1 -1
- data/lib/wx/doc/gen/grid/grid_ctrl.rb +67 -32
- data/lib/wx/doc/gen/header_ctrl_event.rb +13 -13
- data/lib/wx/doc/gen/help_controller.rb +45 -2
- data/lib/wx/doc/gen/html/html_help_controller.rb +74 -32
- data/lib/wx/doc/gen/html/html_help_window.rb +3 -3
- data/lib/wx/doc/gen/html/html_window.rb +4 -4
- data/lib/wx/doc/gen/hyperlink_ctrl.rb +1 -1
- data/lib/wx/doc/gen/list_ctrl.rb +22 -22
- data/lib/wx/doc/gen/listbook.rb +2 -2
- data/lib/wx/doc/gen/mb_conv.rb +10 -0
- data/lib/wx/doc/gen/media_event.rb +6 -6
- data/lib/wx/doc/gen/notebook.rb +2 -2
- data/lib/wx/doc/gen/pg/pg_validation_info.rb +14 -14
- data/lib/wx/doc/gen/pg/property_grid_interface.rb +2 -2
- data/lib/wx/doc/gen/rbn/ribbon_art_provider.rb +19 -9
- data/lib/wx/doc/gen/rbn/ribbon_button_bar.rb +2 -2
- data/lib/wx/doc/gen/rbn/ribbon_gallery.rb +3 -3
- data/lib/wx/doc/gen/rbn/ribbon_panel.rb +2 -2
- data/lib/wx/doc/gen/rbn/ribbon_tool_bar.rb +2 -2
- data/lib/wx/doc/gen/rt/event_list.rb +17 -0
- data/lib/wx/doc/gen/rt/shared_evt_handler.rb +14 -0
- data/lib/wx/doc/gen/rt/thread_event.rb +71 -0
- data/lib/wx/doc/gen/rtc/rich_text_ctrl.rb +19 -19
- data/lib/wx/doc/gen/sash_event.rb +2 -2
- data/lib/wx/doc/gen/sash_layout_window.rb +2 -2
- data/lib/wx/doc/gen/search_ctrl.rb +2 -2
- data/lib/wx/doc/gen/spin_ctrl.rb +2 -2
- data/lib/wx/doc/gen/splitter_window.rb +6 -6
- data/lib/wx/doc/gen/stc/styled_text_event.rb +34 -34
- data/lib/wx/doc/gen/task_bar_icon_event.rb +10 -10
- data/lib/wx/doc/gen/text_ctrl.rb +4 -4
- data/lib/wx/doc/gen/toggle_button.rb +1 -1
- data/lib/wx/doc/gen/toolbook.rb +2 -2
- data/lib/wx/doc/gen/top_level_window.rb +19 -0
- data/lib/wx/doc/gen/tree_ctrl.rb +21 -21
- data/lib/wx/doc/gen/treebook.rb +4 -4
- data/lib/wx/doc/gen/utils.rb +2 -2
- data/lib/wx/doc/gen/web/event_list.rb +95 -0
- data/lib/wx/doc/gen/web/web_view.rb +1136 -0
- data/lib/wx/doc/gen/web/web_view_event.rb +210 -0
- data/lib/wx/doc/gen/web/web_view_handler.rb +318 -0
- data/lib/wx/doc/gen/window.rb +1 -1
- data/lib/wx/doc/gen/wizard_event.rb +7 -7
- data/lib/wx/doc/html/html_help_controller.rb +23 -1
- data/lib/wx/doc/mbconv.rb +108 -0
- data/lib/wx/doc/rt/shared_event_handler.rb +49 -0
- data/lib/wx/doc/rt/thread_event.rb +28 -0
- data/lib/wx/doc/webview.rb +40 -0
- data/lib/wx/helpers.rb +1 -1
- data/lib/wx/html/htmlhelpcontroller.rb +10 -0
- data/lib/wx/keyword_defs.rb +11 -0
- data/lib/wx/rt/events/evt_list.rb +8 -0
- data/lib/wx/rt/require.rb +8 -0
- data/lib/wx/rt/thread_event.rb +14 -0
- data/lib/wx/rt.rb +16 -0
- data/lib/wx/version.rb +1 -1
- data/lib/wx/web/events/evt_list.rb +74 -0
- data/lib/wx/web/require.rb +8 -0
- data/lib/wx/web/webview.rb +106 -0
- data/lib/wx/web.rb +17 -0
- data/lib/wx/wxruby/cmd/setup.rb +15 -0
- data/lib/wx.rb +2 -0
- data/rakelib/configure.rb +24 -0
- data/rakelib/gem.rb +3 -2
- data/rakelib/install.rb +54 -27
- data/rakelib/lib/config/macosx.rb +7 -5
- data/rakelib/lib/config/mingw.rb +66 -5
- data/rakelib/lib/config/pkgman/mingw.rb +1 -1
- data/rakelib/lib/config/unixish.rb +4 -2
- data/rakelib/lib/config.rb +37 -3
- data/rakelib/lib/core/include/client_data.inc +38 -17
- data/rakelib/lib/core/include/funcall.inc +1 -1
- data/rakelib/lib/core/include/swigdirector.inc +3 -3
- data/rakelib/lib/core/include/swigrubyrun.inc +14 -26
- data/rakelib/lib/core/package.rb +0 -2
- data/rakelib/lib/director/app.rb +1 -8
- data/rakelib/lib/director/art_provider.rb +7 -3
- data/rakelib/lib/director/comboctrl.rb +0 -7
- data/rakelib/lib/director/context_help_button.rb +35 -2
- data/rakelib/lib/director/event_handler.rb +32 -28
- data/rakelib/lib/director/fs_file.rb +15 -10
- data/rakelib/lib/director/functions.rb +8 -0
- data/rakelib/lib/director/grid_cell_attr.rb +1 -3
- data/rakelib/lib/director/grid_cell_editor.rb +14 -12
- data/rakelib/lib/director/grid_cell_renderer.rb +11 -8
- data/rakelib/lib/director/grid_ctrl.rb +140 -121
- data/rakelib/lib/director/help_controller.rb +70 -2
- data/rakelib/lib/director/mb_conv.rb +30 -0
- data/rakelib/lib/director/menu.rb +92 -42
- data/rakelib/lib/director/menu_bar.rb +84 -45
- data/rakelib/lib/director/menu_item.rb +2 -2
- data/rakelib/lib/director/persistence_manager.rb +3 -2
- data/rakelib/lib/director/preview_frame.rb +2 -2
- data/rakelib/lib/director/richtext_buffer.rb +5 -2
- data/rakelib/lib/director/shared_evt_handler.rb +30 -0
- data/rakelib/lib/director/sizer.rb +8 -17
- data/rakelib/lib/director/sizer_item.rb +3 -4
- data/rakelib/lib/director/task_bar_icon.rb +7 -7
- data/rakelib/lib/director/thread_event.rb +33 -0
- data/rakelib/lib/director/validator.rb +3 -1
- data/rakelib/lib/director/variant.rb +16 -12
- data/rakelib/lib/director/webview.rb +166 -0
- data/rakelib/lib/director/webview_event.rb +37 -0
- data/rakelib/lib/director/webview_handler.rb +63 -0
- data/rakelib/lib/generate/doc/thread_event.yaml +20 -0
- data/rakelib/lib/generate/doc/web_view.yaml +135 -0
- data/rakelib/lib/generate/doc/web_view_event.yaml +38 -0
- data/rakelib/lib/generate/doc/web_view_handler.yaml +58 -0
- data/rakelib/lib/specs/interfaces.rb +12 -0
- data/rakelib/lib/typemap/common.rb +34 -1
- data/rakelib/lib/typemap/mb_conv.rb +58 -0
- data/rakelib/prepost.rake +23 -31
- data/rakelib/prepost.rb +20 -0
- data/samples/event/threaded.rb +295 -42
- data/samples/event/tn_threaded.png +0 -0
- data/samples/help/doc/back.gif +0 -0
- data/samples/help/doc/contents.gif +0 -0
- data/samples/help/doc/cshelp.txt +9 -0
- data/samples/help/doc/doc.chm +0 -0
- data/samples/help/doc/doc.cnt +8 -0
- data/samples/help/doc/doc.h +7 -0
- data/samples/help/doc/doc.hhc +40 -0
- data/samples/help/doc/doc.hhk +31 -0
- data/samples/help/doc/doc.hhp +33 -0
- data/samples/help/doc/doc.hpj +21 -0
- data/samples/help/doc/doc.htm +27 -0
- data/samples/help/doc/doc1.htm +24 -0
- data/samples/help/doc/doc2.htm +12 -0
- data/samples/help/doc/doc3.htm +12 -0
- data/samples/help/doc/doc4.htm +12 -0
- data/samples/help/doc/doc5.htm +14 -0
- data/samples/help/doc/forward.gif +0 -0
- data/samples/help/doc/up.gif +0 -0
- data/samples/help/doc.chm +0 -0
- data/samples/help/doc.chw +0 -0
- data/samples/help/doc.zip +0 -0
- data/samples/help/help.rb +352 -0
- data/samples/help/tn_help.png +0 -0
- data/samples/webview/handler_advanced.html +55 -0
- data/samples/webview/tn_webview.png +0 -0
- data/samples/webview/webview.rb +1264 -0
- data/tests/assets/handler_advanced.html +55 -0
- data/tests/assets/test.css +1 -0
- data/tests/assets/test.html +9 -0
- data/tests/assets/test.zip +0 -0
- data/tests/lib/text_entry_tests.rb +2 -2
- data/tests/lib/wxapp_runner.rb +40 -0
- data/tests/lib/wxframe_runner.rb +17 -2
- data/tests/test_art.rb +8 -8
- data/tests/test_clipboard.rb +4 -4
- data/tests/test_config.rb +6 -6
- data/tests/test_exceptions.rb +8 -6
- data/tests/test_ext_controls.rb +3 -3
- data/tests/test_file_dialog.rb +5 -5
- data/tests/test_font.rb +7 -7
- data/tests/test_grid_ctrl.rb +133 -0
- data/tests/test_help.rb +88 -0
- data/tests/test_intl.rb +1 -1
- data/tests/test_media_ctrl.rb +14 -6
- data/tests/test_menu.rb +94 -86
- data/tests/test_persistence.rb +1 -1
- data/tests/test_proof_check.rb +5 -5
- data/tests/test_propgrid.rb +1 -1
- data/tests/test_shared_event_handler.rb +141 -0
- data/tests/test_std_controls.rb +5 -5
- data/tests/test_webview.rb +492 -0
- data/tests/test_window.rb +3 -3
- metadata +78 -2
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
|
2
|
+
#
|
|
3
|
+
# This software is released under the MIT license.
|
|
4
|
+
|
|
5
|
+
require_relative './lib/wxframe_runner'
|
|
6
|
+
require 'json'
|
|
7
|
+
require 'date'
|
|
8
|
+
|
|
9
|
+
if Wx.has_feature?(:USE_WEBVIEW)
|
|
10
|
+
|
|
11
|
+
class TestWeb < WxRuby::Test::Unit
|
|
12
|
+
|
|
13
|
+
def test_constants
|
|
14
|
+
assert_not_nil Wx::WEB::WEBVIEW_ZOOM_TINY
|
|
15
|
+
assert_not_nil Wx::WEB::WEBVIEW_ZOOM_SMALL
|
|
16
|
+
assert_not_nil Wx::WEB::WEBVIEW_ZOOM_MEDIUM
|
|
17
|
+
assert_not_nil Wx::WEB::WEBVIEW_ZOOM_LARGE
|
|
18
|
+
assert_not_nil Wx::WEB::WEBVIEW_ZOOM_LARGEST
|
|
19
|
+
assert_not_nil Wx::WEB::WEBVIEW_RELOAD_DEFAULT
|
|
20
|
+
assert_not_nil Wx::WEB::WEBVIEW_RELOAD_NO_CACHE
|
|
21
|
+
assert_not_nil Wx::WEB::WEBVIEW_NAV_ERR_CONNECTION
|
|
22
|
+
assert_not_nil Wx::WEB::WEBVIEW_FIND_DEFAULT
|
|
23
|
+
assert_not_nil Wx::WEB::WEBVIEW_BACKEND_DEFAULT
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_backend_available
|
|
27
|
+
assert_not_empty Wx::WEB::WEBVIEW_BACKEND_DEFAULT
|
|
28
|
+
assert Wx::WebView.is_backend_available(Wx::WEB::WEBVIEW_BACKEND_DEFAULT)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class TestWebView < WxRuby::Test::GUITests
|
|
34
|
+
|
|
35
|
+
def setup
|
|
36
|
+
super
|
|
37
|
+
@webview = Wx::WebView.new(frame_win)
|
|
38
|
+
if ::Wx::WXWIDGETS_VERSION >= '3.3.0'
|
|
39
|
+
created = false
|
|
40
|
+
frame_win.evt_webview_created(@webview) { |_| created = true }
|
|
41
|
+
yield_and_wait_for_test(is_msw? ? 5000 : 2000) { created }
|
|
42
|
+
if is_ci_build? && is_msw? && !created
|
|
43
|
+
# on windows CI build there is occasional trouble creating the WebView so we retry
|
|
44
|
+
# after a short break
|
|
45
|
+
@webview.destroy
|
|
46
|
+
yield_for_a_while(1000)
|
|
47
|
+
# try again
|
|
48
|
+
@webview = Wx::WebView.new(frame_win)
|
|
49
|
+
created = false
|
|
50
|
+
frame_win.evt_webview_created(@webview) { |_| created = true }
|
|
51
|
+
yield_and_wait_for_test(is_msw? ? 5000 : 2000) { created }
|
|
52
|
+
end
|
|
53
|
+
elsif is_msw? || Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_CHROMIUM
|
|
54
|
+
yield_for_a_while(is_msw? ? 5000 : 2000)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def teardown
|
|
59
|
+
@webview.destroy
|
|
60
|
+
super
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
attr_reader :webview
|
|
64
|
+
|
|
65
|
+
def test_interface
|
|
66
|
+
assert_respond_to webview, :load_url
|
|
67
|
+
assert_respond_to webview, :get_current_url
|
|
68
|
+
assert_respond_to webview, :get_current_title
|
|
69
|
+
assert_respond_to webview, :is_busy
|
|
70
|
+
assert_respond_to webview, :reload
|
|
71
|
+
assert_respond_to webview, :stop
|
|
72
|
+
assert_respond_to webview, :can_go_back
|
|
73
|
+
assert_respond_to webview, :can_go_forward
|
|
74
|
+
assert_respond_to webview, :go_back
|
|
75
|
+
assert_respond_to webview, :go_forward
|
|
76
|
+
assert_respond_to webview, :clear_history
|
|
77
|
+
assert_respond_to webview, :run_script
|
|
78
|
+
assert_respond_to webview, :set_page
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_load_url
|
|
82
|
+
loaded = false
|
|
83
|
+
frame_win.evt_webview_loaded(webview) { |_| loaded = true }
|
|
84
|
+
webview.load_url('https://mcorino.github.io/wxRuby3/')
|
|
85
|
+
yield_and_wait_for_test(5000) { loaded}
|
|
86
|
+
# unfortunately the WebView2 loader on windows is flaky in CI builds and tends to fail (too often)
|
|
87
|
+
# so just skip the test in such cases
|
|
88
|
+
if loaded || !(is_msw? && is_ci_build? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_EDGE)
|
|
89
|
+
assert_true(loaded)
|
|
90
|
+
else
|
|
91
|
+
STDERR.puts 'WARNING: Skipping test because of WebView2 load failure'
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
class TestWebViewScripts < WxRuby::Test::GUITests
|
|
98
|
+
|
|
99
|
+
def setup
|
|
100
|
+
super
|
|
101
|
+
@webview = Wx::WebView.new(frame_win)
|
|
102
|
+
if ::Wx::WXWIDGETS_VERSION >= '3.3.0'
|
|
103
|
+
created = false
|
|
104
|
+
frame_win.evt_webview_created(@webview) { |_| created = true }
|
|
105
|
+
yield_and_wait_for_test(is_msw? ? 5000 : 2000) { created }
|
|
106
|
+
if is_ci_build? && is_msw? && !created
|
|
107
|
+
# on windows CI build there is occasional trouble creating the WebView so we retry
|
|
108
|
+
# after a short break
|
|
109
|
+
@webview.destroy
|
|
110
|
+
yield_for_a_while(1000)
|
|
111
|
+
# try again
|
|
112
|
+
@webview = Wx::WebView.new(frame_win)
|
|
113
|
+
created = false
|
|
114
|
+
frame_win.evt_webview_created(@webview) { |_| created = true }
|
|
115
|
+
yield_and_wait_for_test(is_msw? ? 5000 : 2000) { created }
|
|
116
|
+
end
|
|
117
|
+
elsif is_msw? || Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_CHROMIUM
|
|
118
|
+
yield_for_a_while(2000)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def teardown
|
|
123
|
+
@webview.destroy
|
|
124
|
+
super
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
attr_reader :webview
|
|
128
|
+
|
|
129
|
+
# cannot run javascript tests on the Edge backend as these tests run in the Idle event callback
|
|
130
|
+
unless is_msw? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_EDGE
|
|
131
|
+
|
|
132
|
+
def test_scripts
|
|
133
|
+
assert_equal('Hello World!', webview.run_script("function f(a){return a;}f('Hello World!');"))
|
|
134
|
+
assert_equal('123', webview.run_script("function f(a){return a;}f(123);"))
|
|
135
|
+
assert_equal('2.34', webview.run_script("function f(a){return a;}f(2.34);"))
|
|
136
|
+
assert_equal('false', webview.run_script("function f(a){return a;}f(false);"))
|
|
137
|
+
assert_equal('undefined', webview.run_script("function f(){var person = new Object();}f();"))
|
|
138
|
+
assert_equal('null', webview.run_script("function f(){return null;}f();"))
|
|
139
|
+
date = webview.run_script("function f(){var d = new Date('10/08/2017 21:30:40'); \
|
|
140
|
+
var tzoffset = d.getTimezoneOffset() * 60000; \
|
|
141
|
+
return new Date(d.getTime() - tzoffset);}; f();")
|
|
142
|
+
assert_not_nil(date)
|
|
143
|
+
tm = Time.new(2017, 10, 8, 21, 30, 40)
|
|
144
|
+
tm += tm.gmt_offset
|
|
145
|
+
assert_equal(tm.gmtime, DateTime.parse(date).to_time)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def run_async_scripts
|
|
151
|
+
script_error = false
|
|
152
|
+
script_finished = false
|
|
153
|
+
script_result = nil
|
|
154
|
+
frame_win.evt_webview_script_result(webview) { |evt| script_error = evt.is_error; script_finished = !script_error; script_result = evt.get_string }
|
|
155
|
+
webview.run_script_async("function f(a){return a;}f('Hello World!');")
|
|
156
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
157
|
+
# unfortunately the WebView2 loader on windows is flaky in CI builds and tends to fail (too often)
|
|
158
|
+
# so just skip the test in such cases
|
|
159
|
+
if !(script_error && is_msw? && is_ci_build?)
|
|
160
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
161
|
+
assert_true(script_finished)
|
|
162
|
+
assert_equal('Hello World!', script_result)
|
|
163
|
+
|
|
164
|
+
script_error = false
|
|
165
|
+
script_finished = false
|
|
166
|
+
script_result = nil
|
|
167
|
+
webview.run_script_async("function f(a){return a;}f(123);")
|
|
168
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
169
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
170
|
+
assert_true(script_finished)
|
|
171
|
+
assert_equal('123', script_result)
|
|
172
|
+
|
|
173
|
+
script_error = false
|
|
174
|
+
script_finished = false
|
|
175
|
+
script_result = nil
|
|
176
|
+
webview.run_script_async("function f(a){return a;}f(2.34);")
|
|
177
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
178
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
179
|
+
assert_true(script_finished)
|
|
180
|
+
assert_equal('2.34', script_result)
|
|
181
|
+
|
|
182
|
+
script_error = false
|
|
183
|
+
script_finished = false
|
|
184
|
+
script_result = nil
|
|
185
|
+
webview.run_script_async("function f(a){return a;}f(false);")
|
|
186
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
187
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
188
|
+
assert_true(script_finished)
|
|
189
|
+
assert_equal('false', script_result)
|
|
190
|
+
|
|
191
|
+
script_error = false
|
|
192
|
+
script_finished = false
|
|
193
|
+
script_result = nil
|
|
194
|
+
webview.run_script_async("function f(){var person = new Object();}f();")
|
|
195
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
196
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
197
|
+
assert_true(script_finished)
|
|
198
|
+
assert_equal('undefined', script_result)
|
|
199
|
+
|
|
200
|
+
script_error = false
|
|
201
|
+
script_finished = false
|
|
202
|
+
script_result = nil
|
|
203
|
+
webview.run_script_async("function f(){return null;}f();")
|
|
204
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
205
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
206
|
+
assert_true(script_finished)
|
|
207
|
+
assert_equal('null', script_result)
|
|
208
|
+
|
|
209
|
+
script_error = false
|
|
210
|
+
script_finished = false
|
|
211
|
+
script_result = nil
|
|
212
|
+
webview.run_script_async("function f(){var d = new Date('10/08/2017 21:30:40'); \
|
|
213
|
+
var tzoffset = d.getTimezoneOffset() * 60000; \
|
|
214
|
+
return new Date(d.getTime() - tzoffset);}; f();")
|
|
215
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
216
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
217
|
+
assert_true(script_finished)
|
|
218
|
+
assert_not_nil(script_result)
|
|
219
|
+
tm = Time.new(2017, 10, 8, 21, 30, 40)
|
|
220
|
+
tm += tm.gmt_offset
|
|
221
|
+
assert_equal(tm.gmtime, DateTime.parse(script_result).to_time)
|
|
222
|
+
else
|
|
223
|
+
STDERR.puts 'WARNING: Skipping test because of WebView2 load failure'
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
unless is_msw?
|
|
228
|
+
|
|
229
|
+
def test_script_json
|
|
230
|
+
json = webview.run_script("function f(){var person = new Object();person.name = 'Foo'; person.lastName = 'Bar';return person;}; f();")
|
|
231
|
+
assert_not_nil(json)
|
|
232
|
+
person = JSON.load(json)
|
|
233
|
+
assert_kind_of(Hash, person)
|
|
234
|
+
assert_equal('Foo', person['name'])
|
|
235
|
+
assert_equal('Bar', person['lastName'])
|
|
236
|
+
|
|
237
|
+
json = webview.run_script("function f(){ return [\"foo\", \"bar\"]; }f();")
|
|
238
|
+
assert_not_nil(json)
|
|
239
|
+
array = JSON.load(json)
|
|
240
|
+
assert_kind_of(Array, array)
|
|
241
|
+
assert_equal(['foo', 'bar'], array)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
unless is_msw? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_IE
|
|
247
|
+
|
|
248
|
+
def test_async_script_json
|
|
249
|
+
script_error = false
|
|
250
|
+
script_finished = false
|
|
251
|
+
script_result = nil
|
|
252
|
+
frame_win.evt_webview_script_result(webview) { |evt| script_error = evt.is_error; script_finished = !script_error; script_result = evt.get_string }
|
|
253
|
+
webview.run_script_async("function f(){var person = new Object();person.name = 'Foo'; person.lastName = 'Bar';return person;}; f();")
|
|
254
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
255
|
+
# unfortunately the WebView2 loader on windows is flaky in CI builds and tends to fail (too often)
|
|
256
|
+
# so just skip the test in such cases
|
|
257
|
+
if !(script_error && is_msw? && is_ci_build?)
|
|
258
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
259
|
+
assert_true(script_finished)
|
|
260
|
+
assert_not_nil(script_result)
|
|
261
|
+
person = JSON.load(script_result)
|
|
262
|
+
assert_kind_of(Hash, person)
|
|
263
|
+
assert_equal('Foo', person['name'])
|
|
264
|
+
assert_equal('Bar', person['lastName'])
|
|
265
|
+
|
|
266
|
+
script_error = false
|
|
267
|
+
script_finished = false
|
|
268
|
+
script_result = nil
|
|
269
|
+
webview.run_script_async("function f(){ return [\"foo\", \"bar\"]; }f();")
|
|
270
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
271
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
272
|
+
assert_true(script_finished)
|
|
273
|
+
assert_not_nil(script_result)
|
|
274
|
+
array = JSON.load(script_result)
|
|
275
|
+
assert_kind_of(Array, array)
|
|
276
|
+
assert_equal(['foo', 'bar'], array)
|
|
277
|
+
else
|
|
278
|
+
STDERR.puts 'WARNING: Skipping test because of WebView2 load failure'
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
if ::Wx::WXWIDGETS_VERSION >= '3.3.0'
|
|
286
|
+
|
|
287
|
+
class TestWebViewHandlers < WxRuby::Test::GUITests
|
|
288
|
+
|
|
289
|
+
class AdvancedWebViewHandler < Wx::WebViewHandler
|
|
290
|
+
def initialize
|
|
291
|
+
super("wxpost")
|
|
292
|
+
@request_handled = false
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
attr_accessor :request_handled
|
|
296
|
+
|
|
297
|
+
def start_request(request, response)
|
|
298
|
+
response.set_header("Access-Control-Allow-Origin", "*")
|
|
299
|
+
response.set_header("Access-Control-Allow-Headers", "*")
|
|
300
|
+
|
|
301
|
+
# Handle options request
|
|
302
|
+
if request.get_method.casecmp("options") == 0
|
|
303
|
+
response.finish("")
|
|
304
|
+
else
|
|
305
|
+
response.set_content_type("application/json")
|
|
306
|
+
response.finish("{\n contentType: \"#{request.get_header("Content-Type")}\",\n" \
|
|
307
|
+
" method: \"#{request.get_method}\",\n" \
|
|
308
|
+
" data: \"#{request.get_data_string}\"\n}")
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
class << self
|
|
314
|
+
def fs_installed
|
|
315
|
+
@fs_installed ||= false
|
|
316
|
+
end
|
|
317
|
+
def fs_installed=(fs_installed)
|
|
318
|
+
@fs_installed = fs_installed
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def before_setup
|
|
323
|
+
super
|
|
324
|
+
unless self.class.fs_installed
|
|
325
|
+
# Required for virtual file system archive and memory support (but only once)
|
|
326
|
+
Wx::FileSystem.add_handler(Wx::ArchiveFSHandler.new)
|
|
327
|
+
Wx::FileSystem.add_handler(Wx::MemoryFSHandler.new)
|
|
328
|
+
|
|
329
|
+
# Create the memory files
|
|
330
|
+
Wx::MemoryFSHandler::add_file("logo.png",
|
|
331
|
+
Wx.Bitmap(:wxruby, Wx::BITMAP_TYPE_PNG, art_section: 'test_art'),
|
|
332
|
+
Wx::BITMAP_TYPE_PNG)
|
|
333
|
+
Wx::MemoryFSHandler::add_file("page1.htm",
|
|
334
|
+
"<html><head><title>File System Example</title>" \
|
|
335
|
+
"<link rel='stylesheet' type='text/css' href='memory:test.css'>" \
|
|
336
|
+
"</head><body><h1>Page 1</h1>" \
|
|
337
|
+
"<p><img src='memory:logo.png'></p>" \
|
|
338
|
+
"<p>Some text about <a href='memory:page2.htm'>Page 2</a>.</p></body></html>")
|
|
339
|
+
Wx::MemoryFSHandler::add_file("page2.htm",
|
|
340
|
+
"<html><head><title>File System Example</title>" \
|
|
341
|
+
"<link rel='stylesheet' type='text/css' href='memory:test.css'>" \
|
|
342
|
+
"</head><body><h1>Page 2</h1>" \
|
|
343
|
+
"<p><a href='memory:page1.htm'>Page 1</a> was better.</p></body></html")
|
|
344
|
+
Wx::MemoryFSHandler::add_file("test.css", "h1 {color: red;}")
|
|
345
|
+
self.class.fs_installed = true
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def setup
|
|
350
|
+
super
|
|
351
|
+
@webview = Wx::WebView.new(Wx::WEB::WEBVIEW_BACKEND_DEFAULT)
|
|
352
|
+
|
|
353
|
+
@advanced_wv_handler = AdvancedWebViewHandler.new
|
|
354
|
+
|
|
355
|
+
if Wx::PLATFORM == 'WXOSX'
|
|
356
|
+
# With WKWebView handlers need to be registered before creation
|
|
357
|
+
@webview.register_handler(Wx::WebViewArchiveHandler.new("wxfs"))
|
|
358
|
+
@webview.register_handler(Wx::WebViewFSHandler.new("memory"))
|
|
359
|
+
@webview.register_handler(@advanced_wv_handler)
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
@webview.create(frame_win, Wx::ID_ANY)
|
|
363
|
+
|
|
364
|
+
unless Wx::PLATFORM == 'WXOSX'
|
|
365
|
+
# With WKWebView handlers need to be registered before creation
|
|
366
|
+
@webview.register_handler(Wx::WebViewArchiveHandler.new("wxfs"))
|
|
367
|
+
@webview.register_handler(Wx::WebViewFSHandler.new("memory"))
|
|
368
|
+
@webview.register_handler(@advanced_wv_handler)
|
|
369
|
+
end
|
|
370
|
+
if ::Wx::WXWIDGETS_VERSION >= '3.3.0'
|
|
371
|
+
created = false
|
|
372
|
+
frame_win.evt_webview_created(@webview) { |_| created = true }
|
|
373
|
+
yield_and_wait_for_test(is_msw? ? 5000 : 2000) { created }
|
|
374
|
+
if is_ci_build? && is_msw? && !created
|
|
375
|
+
# on windows CI build there is occasional trouble creating the WebView so we retry
|
|
376
|
+
# after a short break
|
|
377
|
+
@webview.destroy
|
|
378
|
+
yield_for_a_while(1000)
|
|
379
|
+
# try again
|
|
380
|
+
@webview = Wx::WebView.new(frame_win)
|
|
381
|
+
created = false
|
|
382
|
+
frame_win.evt_webview_created(@webview) { |_| created = true }
|
|
383
|
+
yield_and_wait_for_test(is_msw? ? 5000 : 2000) { created }
|
|
384
|
+
end
|
|
385
|
+
elsif is_msw? || Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_CHROMIUM
|
|
386
|
+
yield_for_a_while(2000)
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
def teardown
|
|
391
|
+
@webview.destroy
|
|
392
|
+
super
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
attr_reader :webview
|
|
396
|
+
attr_reader :advanced_wv_handler
|
|
397
|
+
|
|
398
|
+
def test_load_net_url
|
|
399
|
+
loaded = false
|
|
400
|
+
frame_win.evt_webview_loaded(webview) { |_| loaded = true }
|
|
401
|
+
webview.load_url('https://mcorino.github.io/wxRuby3/')
|
|
402
|
+
yield_and_wait_for_test(10000) { loaded}
|
|
403
|
+
# unfortunately the WebView2 loader on windows is flaky in CI builds and tends to fail (too often)
|
|
404
|
+
# so just skip the test in such cases
|
|
405
|
+
if loaded || !(is_msw? && is_ci_build? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_EDGE)
|
|
406
|
+
assert_true(loaded)
|
|
407
|
+
else
|
|
408
|
+
STDERR.puts 'WARNING: Skipping test because of WebView2 load failure'
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def test_load_memory_url
|
|
413
|
+
loaded = false
|
|
414
|
+
frame_win.evt_webview_loaded(webview) { |_| loaded = true }
|
|
415
|
+
webview.load_url('memory:page1.htm')
|
|
416
|
+
yield_and_wait_for_test(5000) { loaded}
|
|
417
|
+
# unfortunately the WebView2 loader on windows is flaky in CI builds and tends to fail (too often)
|
|
418
|
+
# so just skip the test in such cases
|
|
419
|
+
if loaded || !(is_msw? && is_ci_build? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_EDGE)
|
|
420
|
+
assert_true(loaded)
|
|
421
|
+
unless is_cirrus_ci_build? # some sort of locale problem (??)
|
|
422
|
+
yield_for_a_while(3000)
|
|
423
|
+
assert(webview.get_page_text =~ /Some text about Page 2/)
|
|
424
|
+
end
|
|
425
|
+
else
|
|
426
|
+
STDERR.puts 'WARNING: Skipping test because of WebView2 load failure'
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
def test_load_scheme_url
|
|
431
|
+
loaded = false
|
|
432
|
+
frame_win.evt_webview_loaded(webview) { |_| loaded = true }
|
|
433
|
+
webview.load_url("wxfs:///#{File.join(__dir__, 'assets','test.zip')};protocol=zip/test.html")
|
|
434
|
+
yield_and_wait_for_test(5000) { loaded}
|
|
435
|
+
# unfortunately the WebView2 loader on windows is flaky in CI builds and tends to fail (too often)
|
|
436
|
+
# so just skip the test in such cases
|
|
437
|
+
if loaded || !(is_msw? && is_ci_build? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_EDGE)
|
|
438
|
+
assert_true(loaded)
|
|
439
|
+
unless is_cirrus_ci_build?
|
|
440
|
+
yield_for_a_while(3000)
|
|
441
|
+
assert(webview.get_page_text =~ /ZIP Embedded Page/)
|
|
442
|
+
end
|
|
443
|
+
else
|
|
444
|
+
STDERR.puts 'WARNING: Skipping test because of WebView2 load failure'
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
def test_load_advanced_url
|
|
449
|
+
loaded = false
|
|
450
|
+
frame_win.evt_webview_loaded(webview) { |_| loaded = true }
|
|
451
|
+
webview.load_url("file://#{File.join(__dir__, 'assets', 'handler_advanced.html')}")
|
|
452
|
+
yield_and_wait_for_test(5000) { loaded}
|
|
453
|
+
# unfortunately the WebView2 loader on windows is flaky in CI builds and tends to fail (too often)
|
|
454
|
+
# so just skip the test in such cases
|
|
455
|
+
if loaded || !(is_msw? && is_ci_build? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_EDGE)
|
|
456
|
+
assert_true(loaded)
|
|
457
|
+
yield_for_a_while(3000)
|
|
458
|
+
assert(webview.get_page_text =~ /Wx::WebViewHandler::start_request/)
|
|
459
|
+
unless (is_gtk? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_WEB_KIT) ||
|
|
460
|
+
(is_msw? && Wx::WEB::WEBVIEW_BACKEND_DEFAULT == Wx::WEB::WEBVIEW_BACKEND_IE)
|
|
461
|
+
advanced_wv_handler.request_handled = false
|
|
462
|
+
webview.run_script_async('sendRequest();')
|
|
463
|
+
yield_and_wait_for_test(is_msw? ? 5000 : 2000) { advanced_wv_handler.request_handled }
|
|
464
|
+
script_error = false
|
|
465
|
+
script_finished = false
|
|
466
|
+
script_result = nil
|
|
467
|
+
frame_win.evt_webview_script_result(webview) { |evt| script_error = evt.is_error; script_finished = !script_error; script_result = evt.get_string }
|
|
468
|
+
webview.run_script_async('document.getElementById("request_data").value;')
|
|
469
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
470
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
471
|
+
assert_true(script_finished)
|
|
472
|
+
assert_not_nil(script_result)
|
|
473
|
+
data = script_result
|
|
474
|
+
script_error = false
|
|
475
|
+
script_finished = false
|
|
476
|
+
script_result = nil
|
|
477
|
+
webview.run_script_async('data = document.getElementById("response_response").value;')
|
|
478
|
+
yield_and_wait_for_test(is_msw? ? 10000 : 5000) { script_error || script_finished }
|
|
479
|
+
assert_false(script_error, "AsyncScript ERROR: #{script_result}")
|
|
480
|
+
assert_true(script_finished)
|
|
481
|
+
assert_not_nil(script_result)
|
|
482
|
+
assert(script_result =~ /data: \"#{data}\"/)
|
|
483
|
+
end
|
|
484
|
+
else
|
|
485
|
+
STDERR.puts 'WARNING: Skipping test because of WebView2 load failure'
|
|
486
|
+
end
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
end # if Wx.has_feature?(:USE_WEBVIEW)
|
data/tests/test_window.rb
CHANGED
|
@@ -54,7 +54,7 @@ class WindowTests < WxRuby::Test::GUITests
|
|
|
54
54
|
if has_ui_simulator?
|
|
55
55
|
|
|
56
56
|
def test_key_event
|
|
57
|
-
if
|
|
57
|
+
if is_gtk? || !is_ci_build?
|
|
58
58
|
count_events(window, :evt_key_down) do |c_keydown|
|
|
59
59
|
count_events(window, :evt_key_up) do |c_keyup|
|
|
60
60
|
count_events(window, :evt_char) do |c_keychar|
|
|
@@ -80,7 +80,7 @@ class WindowTests < WxRuby::Test::GUITests
|
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
def test_focus_event
|
|
83
|
-
|
|
83
|
+
unless is_macos?
|
|
84
84
|
count_events(window, :evt_set_focus) do |c_setfocus|
|
|
85
85
|
count_events(window, :evt_kill_focus) do |c_killfocus|
|
|
86
86
|
window.set_focus
|
|
@@ -247,7 +247,7 @@ class WindowTests < WxRuby::Test::GUITests
|
|
|
247
247
|
end
|
|
248
248
|
|
|
249
249
|
def test_focus
|
|
250
|
-
|
|
250
|
+
unless is_macos?
|
|
251
251
|
assert(!window.has_focus)
|
|
252
252
|
|
|
253
253
|
if window.accepts_focus
|