forked from emweb/wt
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReleaseNotes.html
More file actions
5438 lines (4828 loc) · 228 KB
/
ReleaseNotes.html
File metadata and controls
5438 lines (4828 loc) · 228 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
<style type="text/css">
dt { font-weight: bold; }
h3 { text-decoration: underline; }
dd { margin-top: 10px; margin-bottom: 10px; }
dd p { margin-top: 0px; }
dd div { margin: 10px 0px; }
</style>
<title>Wt Release notes</title>
</head>
<body>
<h1>Wt Release notes</h1>
This file lists important notes on migrating existing applications to
newer version of Wt. It lists changes in the library that may break
the way you build Wt, the way you configure Wt or the Wt API and
behaviour.
<h2>Release 4.3.1 (April 20, 2020)</h2>
<p>This release fixes the following issues:</p>
<ul>
<li>
<a href="classWt_1_1WWebWidget.html">WWebWidget:</a> moved <tt>id_</tt> out of <tt>OtherImpl</tt>:
this fixes issues caused by the <tt>id_</tt> being removed before other things that depend on it,
like the <tt>jsScrollVisibilityChanged_</tt> signal. Fixes
<a href="https://redmine.webtoolkit.eu/issues/7508" target="_blank">issue #7508</a>.
</li>
<li>
Fixed join information not being copied over when copying
<a href="classWt_1_1Dbo_1_1AbstractQuery.html">Wt::Dbo::AbstractQuery</a>.
</li>
<li>
MinGW fixes: Direct2D/DirectWrite were disabled and are now enabled
by default. Libraries were changed to lowercase for cross-compiling
from Linux. Windows is case-insensitive, and MinGW libraries on Linux
are lowercase.
Fixes <a href="https://redmine.webtoolkit.eu/issues/7505" target="_blank">issue #7505</a>.
</li>
<li>
Fixed a wrong documentation link in the widget gallery.
</li>
</ul>
<h2>Release 4.3.0 (March 26, 2020)</h2>
<p>Wt 4.3.0 mainly adds the ability to redirect logging to a custom logging function, and login and transport encryption to the mail client, among some other fixes and tweaks.</p>
<h3>Logging redirection (<a href="https://redmine.webtoolkit.eu/issues/7240" target="_blank">issue #7240</a>)</h3>
<p>
Before, it was possible to send logging to a file or an <tt>std::ostream</tt>, and configure which messages were logged in <tt>wt_config.xml</tt>. Wt 4.3.0 extends
this with the ability to send all logging to a function, allowing users to redirect Wt's logs to whathever logging framework they prefer to use.
</p>
<p>The few log messages coming from Wt::Dbo would always be logged to <tt>std::cerr</tt>. It is now possible to change this to use Wt's logger, or a custom log function.</p>
<p>To allow for this new functionality, we introduced an abstract <a href="classWt_1_1WLogSink.html">WLogSink</a> class, and the following functions:</p>
<ul>
<li><a href="classWt_1_1WServer.html#a45fdbea913a16a310e10e337e5933072">WServer::setCustomLogger()</a>: sets a custom logger on the WServer level</li>
<li><a href="namespaceWt_1_1Dbo.html#a9a326a13084b93cbb33bf1c470879b0d">Wt::Dbo::setCustomLogger()</a>: sets a custom logger globally for all of Wt::Dbo</li>
<li><a href="namespaceWt_1_1Dbo.html#ac1c13200d17c21ab7a8dfe4cbf3aed05">Wt::Dbo::logToWt()</a>: sends all of Wt::Dbo's logging to Wt's logger</li>
</ul>
<h3>Mail client: support for login and encryption (<a href="https://redmine.webtoolkit.eu/issues/7444" target="_blank">issue #7444</a>)</h3>
<p>
We added basic support for <a href="namespaceWt_1_1Mail.html#a2e673920327e6df099fe3ec0191fdc93a4cd8413207629a963225f4314b53adcd">PLAIN</a> and
<a href="namespaceWt_1_1Mail.html#a2e673920327e6df099fe3ec0191fdc93a99dea78007133396a7b8ed70578ac6ae">LOGIN</a> authentication methods, and
encryption using <a href="namespaceWt_1_1Mail.html#a55d819f240a3553f33e6416ecd05b91fafa91df952500d196f6a10117d98843fe">StartTLS</a> or just
simple <a href="namespaceWt_1_1Mail.html#a55d819f240a3553f33e6416ecd05b91fa099d7d04319e5191b7473e016c55e320">TLS</a>.
</p>
<p>
You can enable authentication with <a href="classWt_1_1Mail_1_1Client.html#a4861b5d0157663d803a3edcb97f651f4">Client::enableAuthentication()</a>, and encryption with
<a href="classWt_1_1Mail_1_1Client.html#a170288f392a84a1e4e560422843c9a74">Client::setTransportEncryption()</a>, or using the configuration properties <tt>smtp-auth-username</tt>, <tt>smtp-auth-password</tt>,
<tt>smtp-auth-method</tt>, and <tt>smtp-transport-encryption</tt>.
</p>
<h3>Other changes</h3>
<p>Some small changes in behaviour that you may want to be aware of:</p>
<ul>
<li>
Wt::Auth: lost password tokens used to be removed as soon as the link was used, even when they were not actually used to change the password. Now, the
token will stay valid until the password is actually changed. Also, if the password is changed through other means, the update password token is invalidated.
</li>
<li>
<a href="classWt_1_1WCanvasPaintDevice.html">WCanvasPaintDevice</a>: instead of stopping the drawing entirely when <tt>drawImage()</tt> fails (e.g. because of a missing image),
the image will be skipped but drawing will continue. An error will be logged to the console.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7060" target="_blank">Issue #7060</a>: fixed
<a href="classWt_1_1Http_1_1Request.html#a5f18be4100482713c257bea43a3c913b">Request::clientAddress()</a> when behind a reverse proxy to
be the same as <a href="classWt_1_1WEnvironment.html#aedad4a59684dc41c9985a713ee4eb00a">WEnvironment::clientAddress()</a>, and as mentioned in the documentation.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7404" target="_blank">Issue #7404</a>: reparenting of popup widgets should only stop at scroll bars.
</li>
</ul>
<p>Other changes and fixes:</p>
<ul>
<li>
<a href="classWt_1_1WLength.html">WLength</a>: added
<a href="namespaceWt.html#a736803866293d189d852d2c7adb7d94ea67bbbcb8c3f0869b19682f3dd5f27893">LengthUnit::ViewportWidth</a>,
<a href="namespaceWt.html#a736803866293d189d852d2c7adb7d94ea1cc83e088aae799b9acb909c10c3d8b2">LengthUnit::ViewportHeight</a>,
<a href="namespaceWt.html#a736803866293d189d852d2c7adb7d94eae21d04628175a77110405adc9338b9c2">LengthUnit::ViewportMin</a>,
and <a href="namespaceWt.html#a736803866293d189d852d2c7adb7d94ea91b2f19f5c34f05a401200359e38e3c3">LengthUnit::ViewportMax</a>.
</li>
<li>
Updated the <tt>composer</tt> and <tt>filetreetable</tt> examples to use <a href="classWt_1_1WLocalDateTime.html">WLocalDateTime</a> rather than OS specific functions.
</li>
<li>
Refactored the <tt>treelist</tt> example.
</li>
<li>
Wt::Dbo:
<ul>
<li>added query parsing implementation based on X3 instead of Spirit Qi, which reduces compile time and memory usage.</li>
</ul>
<ul>
<li>added <a href="classWt_1_1Dbo_1_1SqlStatement.html#a4868a3639566171ac3d58e15e3bf77f3">SqlStatement::columnCount()</a>. This
makes it possible to create <tt>query_result_traits</tt> for result types with a variable number of columns, like <tt>std::vector</tt>.</li>
</ul>
</li>
<li>
<a href="classWt_1_1WModelIndex.html">WModelIndex</a> now has a proper ordering, even for raw indexes. This means they can properly be inserted into and retrieved from a <tt>std::set</tt>.
</li>
<li>
<a href="classWt_1_1WServer.html">WServer</a>: documented the <a href="classWt_1_1WServer.html#a5f850e30f9bd54a946c3f832d60f5b2a">schedule()</a> function.
</li>
<li>
wthttp: added child process id to some of the logging related to dedicated session processes
</li>
</ul>
<h2>Release 4.2.2 (March 16, 2020)</h2>
<p>
This release fixes the following issues:
</p>
<ul>
<li>
Security-related: in Wt::Auth the lost password email would be sent to the email
address provided in the form, rather than the user's configured email address. While
we treat email addresses as case insensitive, it is possible that the mail server may not,
and that could potentially be used to steal an account. It is however quite rare for
email services to be case sensitive.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7439" target="_blank">Issue #7439</a>:
ensure that tooltips are always on top, even inside of a dialog.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7448" target="_blank">Issue #7448</a>:
fixed compilation error on recent versions of MinGW, by using the <tt>gmtime_s</tt>
function on Windows.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7447" target="_blank">Issue #7447</a>:
fixed text format being reset when the text of a <a href="classWt_1_1WAnchor.html">WAnchor</a> is cleared.
</li>
<li>
Fix for <a href="classWt_1_1WLeafletMap.html">WLeafletMap</a> issue that was <a href="https://redmine.emweb.be/boards/2/topics/16718" target="_blank">reported on the forum</a>: signals would get unexposed when options were changed.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7457" target="_blank">Issue #7457</a>:
moved call to <a href="classWt_1_1WApplication.html#ae88546224ed32cade783da188b145138">WApplication::require()</a> to the constructor, since calling it in the render function may cause issues.
</li>
<li>
Fixes for <a href="classWt_1_1WVirtualImage.html">WVirtualImage</a>:
<ul>
<li>Do not render zero width or zero height images. This was possible when <tt>imageWidth</tt> or <tt>imageHeight</tt> was
a multiple of the <tt>gridImageSize</tt>.</li>
<li>Fixed <a href="classWt_1_1WVirtualImage.html#a0feb746fc22b907f779423bd9768109c">scrollTo()</a> when the image is narrower than the viewport: <tt>scrollTo(0, 0)</tt> would not put <tt>(0, 0)</tt> at
the top left when the image was narrower (or taller) than the viewport.</li>
</ul>
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7480" target="_blank">Issue #7480</a>: prefix Wt's crypt functions to fix issues
when linking with <tt>libxcrypt</tt>, and also set C code's default visibility to hidden.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7468" target="_blank">Issue #7468</a>: fixed panning not working properly for a <a href="classWt_1_1Chart_1_1WCartesianChart.html">WCartesianChart</a> with plain tooltips.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7482" target="_blank">Issue #7482</a>: <tt>lastId_</tt> in Postgres backend should be <tt>long long</tt>.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/6774" target="_blank">Issue #6774</a>: misc. <a href="classWt_1_1WTreeView.html">WTreeView</a> fixes.
</li>
<li>
Fixed use after free caused by order of destruction in <a href="classWt_1_1WWebWidget.html">WWebWidget</a> destructor.
</li>
</ul>
<h2>Release 4.2.1 (February 6, 2020)</h2>
<p>
This release fixes the following issues:
</p>
<ul>
<li>wthttp fixes:
<ul>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7406" target="_blank">Issue #7406</a>: requests for absolute-form URLs (e.g. <tt>GET http://localhost:8080/ HTTP/1.1</tt> instead of <tt>GET / HTTP/1.1</tt>) are now rejected. No client normally sends requests like this to an origin server. See <a href="https://tools.ietf.org/html/rfc7230#section-5.3.2" target="_blank">RFC 7230, section 5.3.2</a>.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7405" target="_blank">Issue #7405</a>: multiline HTTP headers (line folding) were causing
wthttp to segfault. This was fixed by removing support for (obsolete) line folding. See <a href="https://tools.ietf.org/html/rfc7230#section-3.2.4" target="_blank">RFC 7230, section 3.2.4</a>.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7390" target="_blank">Issue #7390</a>: added MIME type for <tt>.wasm</tt> files.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7384" target="_blank">Issue #7384</a>: setting the <tt>--docroot</tt> of wthttp
to <tt>.;</tt> will now correctly make it so that no path is interpreted as being a static resource.
</li>
</ul>
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7350" target="_blank">Issue #7350</a>: fixed <a href="classWt_1_1WPaintedWidget.html">WPaintedWidget</a>'s <tt>wtResize</tt> JavaScript to assume its preferred size when called with a size of -1.
</li>
<li>
Fixed possible JavaScript errors caused by <a href="classWt_1_1WContainerWidget.html">WContainerWidget</a>'s <tt>wtEncodeValue</tt> JavaScript not being terminated by a semicolon.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7407" target="_blank">Issue #7407</a>: fixed JavaScript memory leak related to deferred or HTML tooltips.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7360" target="_blank">Issue #7360</a>: documented <a href="structWt_1_1Mail_1_1Message_1_1Recipient.html">Wt::Mail::Message::Recipient</a>.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7393" target="_blank">Issue #7393</a>: if the internal path is set to invalid in initialize, Wt should still send a 404 status code.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7361" target="_blank">Issue #7361</a>: a previous attempt at fixing horizontal scrolling stutter
in Wt 4.1.1 caused a regression in <a href="classWt_1_1WTableView.html#a093b661f93551c1d6f73c423ae8ef459">WTableView::scrollTo()</a>.
</li>
<li>
Fixed several issues with <a href="classWt_1_1WLeafletMap.html">WLeafletMap</a> that were
<a href="https://redmine.emweb.be/boards/2/topics/16718" target="_blank">reported on the forum</a>.
</li>
<li>
<a href="classWt_1_1Chart_1_1WCartesianChart.html">WCartesianChart</a>: when there were so many bars on
a bar chart that the width of a bar became 0, placing tooltips would cause a crash. Wt will now skip
tooltip placement when bars get too narrow.
</li>
<li>
<a href="classWt_1_1WSuggestionPopup.html">WSuggestionPopup</a>: when
<a href="classWt_1_1WSuggestionPopup.html#a0395bd5080856eb95ccb50748f25d1c7"><tt>setDropDownIconUnfiltered(true)</tt></a>
was used, pressing the up/down arrows to move through the list would cause it to be filtered.
</li>
<li>
Reverted a previous change to <a href="classWt_1_1WModelIndex.html">WModelIndex</a>: since the comparison operator of model indexes uses the parent, we can't insert raw indexes into a <tt>std::set</tt>.
</li>
<li>
<a href="https://redmine.webtoolkit.eu/issues/7353" target="_blank">Issue #7353</a>: added mention in 3.5.0 release notes about
<a href="classWt_1_1WPdfImage.html">WPdfImage</a> pen width fix.
</li>
<li>
<a href="group__modelview.html#gaeb2f9c583490833afd55d65402b4fea9">registerType</a> now uses <tt>std::type_index</tt> instead of comparing <tt>type_info</tt> pointers.
</li>
<li>
Some widgets (like <a href="classWt_1_1WTreeView.html">WTreeView</a>) would not be properly sized when they were initially hidden.
</li>
<li>
Fixed a segfault in <a href="classWt_1_1WTableRow.html">WTableRow</a>, <a href="https://redmine.webtoolkit.eu/boards/2/topics/16732" target="_blank">reported on the forum</a>.
</li>
<li>
Miscellaneous documentation fixes.
</li>
<li>
<b>CMake fixes:</b>
<ul>
<li>
<tt>wt-config.cmake</tt>: CMake would look for Boost even when Wt was linked dynamically, and
Boost was linked statically, like in our Windows builds.
</li>
<li>
<tt>wt-config-version.cmake</tt>: <tt>match</tt> function needed to be <tt>math</tt>
</li>
<li>
CMake needed to look for <tt>Boost::filesystem</tt> for some examples (but didn't).
</li>
</ul>
</li>
</ul>
<p>
If you diff this release with the last one, it looks like we've changed a lot more, but this
is simply because we needed to update Emweb bvba to Emweb bv everywhere.
</p>
<h2>Release 4.2.0 (December 3, 2019)</h2>
<p>
Wt 4.2.0 introduces no major new features, but comes with some nice fixes and little quality of life improvements.
</p>
<h3>Notable backwards-incompatible changes</h3>
<ul>
<li><a href="classWt_1_1WSuggestionPopup.html">WSuggestionPopup</a>: <a href="structWt_1_1WSuggestionPopup_1_1Options.html#a3e29211108f2b156a0b983a5a15ecece">wordSeparators</a> no longer requires (extra) escaping, so a newline is indicated with the string literal "\n", not "\\n". Similarly, the <a href="structWt_1_1WSuggestionPopup_1_1Options.html#aef3e98b66b4cc136e2c726079d6681de">whitespace</a> property was incorrectly documented as requiring (extra) escaping.</li>
<li>The <a href="classWt_1_1WLogEntry.html">WLogEntry</a> copy constructor–which logically performed a move–was removed and replaced by a move constructor.</li>
<li>Removed <tt>WDatePicker::setGlobalPopup</tt>–it was deprecated in Wt 3.3.0, but we forgot to remove it in Wt 4.</li>
<li><a href="classWt_1_1WLogger.html">WLogger</a> now logs opening of log file to the previous output (usually <tt>std::cerr</tt>) using the logger instead of directly to <tt>std::cerr</tt>. This allows to disable this log message with <tt>-info:WLogger</tt>.</li>
</ul>
<h3>CMake changes</h3>
<ul>
<li>
When using GCC and clang, the default visibility of symbols is now set to hidden. This limits the exported symbols to only Wt's public interfaces,
reducing the size of <tt>.so</tt> files and preventing accidental use of unexposed APIs.
</li>
<li>
Added Wt version information to Wt's CMake config files
</li>
</ul>
<h3>HTTP connector</h3>
<p>It's now possible to get client certificate information in wthttp when behind a reverse proxy, see the documentation for <a href="classWt_1_1WEnvironment.html#a04b65c4f7fe6e3b0bd652e2580b4f62e">WEnvironment::sslInfo()</a> for more information.</p>
<p>This is tested to work with nginx and Apache. HAProxy is currently not supported, since its variables are in a rather different format.</p>
<p>Wt can still use this info even if Wt itself is compiled without OpenSSL.</p>
<h3>Features</h3>
<ul>
<li>
PR <a href="https://github.com/emweb/wt/pull/140">#140</a>: <a href="classWt_1_1WLogEntry.html">WLogEntry</a> can now use argument dependent lookup for <tt>to_string</tt> in its <tt>operator<<</tt>.
</li>
<li>
Added overloads to <a href="classWt_1_1WServer.html#af2100c604f1ad933256097972fd38102">WRun()</a>,
<a href="classWt_1_1WServer.html#af22c4176fb07d6f5f3cab42ef7f36f7f">WServer::WServer()</a>,
<a href="classWt_1_1WServer.html#a6ef2c780a70eebc68707ea0d684b8509">WServer::setServerConfiguration()</a>,
and <a href="classWt_1_1WServer.html#afd4dc8802de5f9b93b23ea7948c8a91e">WServer::restart()</a> that
take an applicationPath <tt>std::string</tt>, and a vector of strings for arguments, instead of <tt>argc</tt>, and <tt>argv</tt>.
This is more convenient if the command line arguments are generated by the application.
</li>
<li>
<a href="classWt_1_1WTreeView.html">WTreeView</a>: added <a href="classWt_1_1WTreeView.html#ab7c527ce5304cdbe7f5bcb3e51880641">collapseAll()</a>.
</li>
<li>
Issue <a href="https://redmine.webtoolkit.eu/issues/7307" target="_blank">#7307</a>: enabled top and bottom padding on a non-inline <a href="classWt_1_1WText.html">WText</a>.
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>
Limited prevention of default action of the <tt>dragstart</tt> event to only draggable widgets. This used to be global (set on <tt>document.body</tt>), but could conflict with other JavaScript libraries, especially when Wt is used in WidgetSet mode.
</li>
<li>
Issue <a href="https://redmine.webtoolkit.eu/issues/7210" target="_blank">#7210</a>: fixed removal of all widgets in a layout causing a JavaScript error
</li>
<li>
Fix for PR <a href="https://github.com/emweb/wt/pull/145">#145</a>: fixed linking error on Windows (unresolved external symbol "public: static struct Wt::NoClass Wt::NoClass::none")
</li>
<li>
<a href="classWt_1_1WPainter.html">WPainter</a>: fixed arc drawing code to be consistent across different backends, and with Qt's QPainter. Its behavior used to be erratic when angles larger than 360 degrees or lower than 0 were used.
</li>
<li>
<a href="classWt_1_1WPdfImage.html">WPdfImage</a>: fixed double scaling of pen width (e.g. a pen of width 4 pixels, and a scaling factor of 2 would result in a 16 pixel wide pen instead of an 8 pixel wide pen).
</li>
<li>
Many documentation tweaks and fixes that were discovered when working on JWt 4.
</li>
<li>
Fixed issue <a href="https://redmine.webtoolkit.eu/issues/7139" target="_blank">#7139</a>: some widgets would fail to be correctly reparented.
</li>
<li>
Fixed issue <a href="https://redmine.webtoolkit.eu/issues/7336" target="_blank">#7336</a>: Wt was touching the history API every 10 ms when scrolling to store the scroll position, causing sluggishness, especially on mobile browsers with smooth scrolling. The scroll position is now saved after the user has stopped scrolling.
</li>
<li>
Fixed issue <a href="https://redmine.webtoolkit.eu/issues/7323" target="_blank">#7323</a>: updated the <a href="https://github.com/emweb/wt/tree/master/examples/feature/broadcast" target="_blank">broadcast</a> feature example: its use of <tt>bindSafe()</tt> was incorrect
</li>
</ul>
<h2>Release 4.1.2 (October 30, 2019)</h2>
<p>
This release fixes the following issues:
</p>
<ul>
<li><b>wthttp security issues</b>:
<ul>
<li>Wt internally used an <tt>SSL-Client-Certificates</tt> header to send client certificates to child processes when using dedicated process mode. It was however <i>always accepted even when Wt was not behind a reverse proxy</i>, and sent to child processes as-is. <tt>wthttp</tt> now correctly disregards it when not received from a reverse proxy. The header was also renamed to <tt>X-Wt-Ssl-Client-Certificates</tt> to clarify that it is a non-standard internal Wt header.</li>
<li>When using dedicated session processes with wthttp, the parent process would trust <tt>X-Forwarded-Proto</tt> and <tt>X-Forwarded-Port</tt> even when Wt was not configured to be behind a reverse proxy. These are now discarded.</li>
</ul>
</li>
<li>
Fixed <a href="https://redmine.webtoolkit.eu/boards/2/topics/16551" target="_blank">an issue raised on the forum</a> causing <tt>WTreeView</tt> to not properly react to certain size changes.
</li>
<li>
Fixed <a href="https://redmine.webtoolkit.eu/issues/7291" target="_blank">issue #7291</a>: wtfcgi would not properly match default entry point
</li>
<li>
Fixed a few issues found by clang-analyzer:
<ul>
<li>
Fixed an issue in <a href="classWt_1_1WAnchor.html">WAnchor</a> that would cause <tt>image()</tt> to return <tt>nullptr</tt> if it was provided in the constructor.
</li>
<li>
Fixed <a href="classWt_1_1WCssDecorationStyle.html">WCssDecorationStyle</a> self-assignment
</li>
</ul>
</li>
<li>
Made tests succeed even if Wt is built with <tt>ENABLE_UNWIND=ON</tt>.
</li>
<li><a href="https://redmine.webtoolkit.eu/issues/7292" target="_blank">issue #7292</a>: <a href="classWt_1_1Auth_1_1OAuthService.html">OAuthService</a> now correctly uses <tt>refresh_token</tt> instead of <tt>refreshToken</tt></li>
<li><a href="classWt_1_1Http_1_1Client.html">Http::Client</a> fixes:
<ul>
<li>fixed <a href="https://redmine.webtoolkit.eu/issues/7272" target="_blank">issue #7272</a>: support <tt>@</tt> character in the path of a URL</li>
<li>fixed 204 No Content response code behavior (would hang before, waiting for content) (<a href="https://redmine.webtoolkit.eu/issues/7273" target="_blank">issue #7273</a>)</li>
</ul>
</li>
<li>More informative error and exception messages:
<ul>
<li><a href="classWt_1_1Dbo_1_1QueryModel.html"><tt>QueryModel</tt></a>'s "geometry inconsistent with database" exception now contains row and cache start and size information</li>
<li><tt>WebSession</tt>'s "not serving this" info message contains more context so it's less confusing</li>
</ul>
</li>
<li>Documentation fixes:
<ul>
<li>The release notes for Wt 3.3.8 incorrectly referred to <tt>allowed-hosts</tt>, while this property is actually named <tt>allowed-origins</tt></li>
<li>Updated <a href="classWt_1_1WLocale.html#a5b1961702289e8dc6f9e2c293f9f8aa5">WLocale::setTimeZone()</a> documentation</li>
</ul>
</ul>
<h2>Release 4.1.1 (September 9, 2019)</h2>
<p>
This release fixes the following issues:
</p>
<ul>
<li>Fixed horizontal scrolling stutter on mobile browsers in <tt>WTableView</tt></li>
<li>Fixed <a href="https://redmine.webtoolkit.eu/issues/7000" target="_blank">issue #7000</a>: possible out of bounds access in <tt>WTableView::itemWidget()</tt></li>
<li>Fixed <tt>valueChanged()</tt> documentation of <tt>WSpinBox</tt> and <tt>WDoubleSpinBox</tt></li>
<li>Fixed <a href="https://redmine.webtoolkit.eu/issues/7164" target="_blank">issue #7164</a>: Added missing <tt><stdexcept></tt> include to <tt>observing_ptr_impl.hpp</tt></li>
<li>Fixed <a href="https://redmine.webtoolkit.eu/issues/7167" target="_blank">issue #7167</a>: configure SSL context when using <tt>--https-listen</tt> too (not just when using <tt>--https-address</tt>/<tt>--https-port</tt></li>
<li>Fixed <a href="https://redmine.webtoolkit.eu/issues/7187" target="_blank">issue #7187</a>: contents of <tt>WTabWidget</tt> did not properly stretch in height</li>
<li>Fixed <a href="https://redmine.webtoolkit.eu/issues/7193" target="_blank">issue #7193</a>: compatibility with Pango 1.44: added harfbuzz include dir</li>
<li>Fixed <a href="https://redmine.webtoolkit.eu/issues/7195" target="_blank">issue #7195</a>: contents of <tt>WStackedWidget</tt> would not properly respond to window size change</li>
<li>Fixed <a href="https://redmine.webtoolkit.eu/issues/7206" target="_blank">issue #7206</a>: added mention in Wt 4.0.0 release notes that <tt>setObjectName()</tt> does not change a widget's <tt>id</tt> anymore. It is now in an extra attribute called <tt>data-object-name</tt>.</li>
</ul>
<h2>Release 4.1.0 (July 31, 2019)</h2>
<p>
This is the first release to change the versioning scheme to be more aligned with semantic versioning.
From now on, the last number is reserved for patches (i.e. important bug fixes), not extra features, as long as
those bug fixes don't require major changes. Patches will be released up until the next minor version bump.
</p>
<p>
From now on, a 4.1-release branch will track any bug fixes, while the master branch will become the next release (in this case 4.2.0)
</p>
<p>
We won't completely ban small API-breaking changes from the minor version, but we will as always avoid them as best as we can.
</p>
<p>
This also does <em>not</em> mean that Wt will now have a stable ABI. You will always have to recompile in order to do
a minor version upgrade of Wt. Wt has never had a stable ABI, and that isn't going to change.
</p>
<p>
Apart from that, this release features one new widget (<a href="classWt_1_1WLeafletMap.html">WLeafletMap</a>) and many little tweaks, features, and bug fixes.
</p>
<h3>Notable backwards-incompatible changes</h3>
<ul>
<li>Extensionless headers (e.g. <tt>#include <Wt/WApplication></tt> instead of <tt>#include <Wt/WApplication.h></tt>) have
been deprecated since Wt 4.0.0. These headers were now removed. Use the script <tt>migrate/wt4_add_h_to_includes.py</tt> if you
want to automate the rewriting of extensionless headers.</li>
<li>When using the GraphicsMagick implementation of <a href="classWt_1_1WRasterImage.html">WRasterImage</a>, the rendering to
raster image is now done in <a href="classWt_1_1WPaintDevice.html#a75827be2076716985533dbc75dfdc512">done()</a> instead of <a href="classWt_1_1WResource.html#a3a740f8cc29e2e6e4e58defc9c88b8b6">handleRequest()</a>.
You were always supposed to destroy your instance of <a href="classWt_1_1WPainter.html">WPainter</a>, or call <a href="classWt_1_1WPainter.html#a50beb0c8cb77c12e2dee807e4fe4bcb4">WPainter::end()</a>
before e.g. using <a href="classWt_1_1WResource.html#ad8bbe65a888cc43e0d356f18509b9a0f">write()</a>, but Wt used to be rather forgiving—it would just work.
If you are getting empty images after updating, this would likely be the reason.
</li>
<li>
<a href="classWt_1_1WApplication_1_1UpdateLock.html#a09011389bb0b9319acbcd32800852918">WApplication::UpdateLock::operator bool()</a> and
<a href="classWt_1_1Core_1_1observing__ptr.html#a93ae9f0dd2a1553dc081faad7e1078ee">observing_ptr::operator bool()</a> were made <tt>explicit</tt>,
so they will no longer implicitly convert to <tt>bool</tt>, only
<a href="https://en.cppreference.com/w/cpp/language/implicit_conversion#Contextual_conversions" target="_blank">contextually</a>.
This may cause some valid code to no longer compile, but it is more likely that it will actually uncover bugs.
</li>
<li>
The default z-index of <a href="classWt_1_1WPopupWidget.html">WPopupWidget</a> was changed to 1100 instead of 100, since 1000
is the highest z-index used by Leaflet. This is generally considered an implementation detail, but if you have written any custom
CSS that sets the z-index, then you may have to update this CSS.
</li>
</ul>
<h3>New widgets</h3>
<ul>
<li>
<a href="classWt_1_1WLeafletMap.html">WLeafletMap</a>: this is a wrapper around the <a href="https://leafletjs.com/" target="_blank">Leaflet</a>
JavaScript library. It has support for some basic features of Leaflet, and one special feature: the ability to add arbitrary
widgets (within reason) as markers to the map using <a href="classWt_1_1WLeafletMap_1_1WidgetMarker.html">WidgetMarker</a>.
</li>
</ul>
<h3>New examples</h3>
<ul>
<li>
Added a <a href="classWt_1_1WLeafletMap.html">WLeafletMap</a> example to the <a href="https://www.webtoolkit.eu/widgets/graphics-charts/leaflet-maps" target="_blank">widget gallery</a>
and in <tt>examples/leaflet</tt>.
</li>
<li>
Added an <a href="classWt_1_1Http_1_1Client.html">Http::Client</a> example in <tt>examples/http-client</tt>.
</li>
</ul>
<h3>CMake changes</h3>
<ul>
<li>
Wt now uses CMake's included FindOpenSSL, FindZLIB and FindPNG modules instead of its own.
</li>
<li>
<tt>WT_CPP17_ANY_IMPLEMENTATION</tt> is now set to <tt>any</tt> by default when <tt>CMAKE_CXX_STANDARD</tt> is set to
17 or higher, i.e. it defaults to <tt>std::any</tt>.
</li>
<li>
Removed the "vintage" method of finding Boost, because it has been obsolete for a long time already.
</li>
<li>
Fixed building with Boost 1.70 when using Boost's included package configuration files for CMake.
</li>
<li>
Made the <tt>wtwithqt</tt> example build with Qt 5 too, not just with Qt 4.
</li>
<li>
Made sure we can properly build <tt>wtdbomysql</tt> with a static MariaDB client library on Windows.
</li>
</ul>
<h3>Auth</h3>
<ul>
<li>
Added <a href="classWt_1_1Auth_1_1AuthService.html#aee229af97b12975d00e7448e486f9cb2">AuthService::setAuthTokenUpdateEnabled()</a>. Previously, when using the
remember me functionality the auth token (remember me cookie) would be changed. When accessing the application from two tabs at the same time, however, or when
refreshing quickly, this could cause the session to be logged out: the auth token has changed, but the client still uses the old one. This is still the default
behavior, but you can disable it by using <tt>setAuthTokenUpdateEnabled(false)</tt>.
</li>
<li>
Fixed a use-after-free issue when <a href="classWt_1_1Auth_1_1Login.html#aafb1d791aeee8b59d28faeda88e8392b">Auth::Login::changed()</a> is connected to a slot that
removes the <a href="classWt_1_1Auth_1_1AuthWidget.html">AuthWidget</a>.
</li>
</ul>
<h3>Dbo</h3>
<ul>
<li>
Added <a href="classWt_1_1Dbo_1_1AbstractQuery.html">AbstractQuery</a>, an abstract base class of <a href="classWt_1_1Dbo_1_1Query.html">Query</a>,
to facilitate the dynamic generation of queries.
</li>
<li>
Added <a href="classWt_1_1Dbo_1_1Query.html#a3e76ffc9857381684303d46457399701">Query::join()</a>,
<a href="classWt_1_1Dbo_1_1Query.html#aeee3f10d74361e49cce4dc049f0bdc0b">Query::leftJoin()</a>,
and <a href="classWt_1_1Dbo_1_1Query.html#a1dd4a3461a4d99377dee24227325c63c">Query::rightJoin()</a>.
</li>
<li>
Added support for <tt>std::optional</tt> when using C++ ≥ 17.
</li>
<li>
<tt>std::chrono::time_point</tt> and <tt>std::chrono::duration</tt> were treated as nullable, while they should be non-nullable, since they have
no reasonable "null" value. Use <tt>std::optional</tt> or <tt>boost::optional</tt> to make them nullable instead.
</li>
<li>
Fixed a query corruption bug when using <tt>UNION</tt>, <tt>INTERSECT</tt>, or <tt>EXCEPT</tt> (<a href="https://redmine.webtoolkit.eu/issues/7028" target="_blank">issue #7028</a>).
</li>
<li>
Fixed a crash when using <tt>Session::dropTables()</tt> while there is an active transaction, <a href="https://redmine.webtoolkit.eu/boards/2/topics/16123" target="_blank">as reported on the forum</a>.
</li>
<li>
PostgreSQL uses <tt>?</tt> for some operators, but that is also the character we use for placeholders in prepared statements. If the literal <tt>?</tt> is meant instead of a placeholder, you can now use <tt>??</tt>. This is similar to how PostgreSQL's JDBC driver handles it.
</li>
</ul>
<h3>Miscellaneous features</h3>
<ul>
<li>
wthttp: <tt>--deploy-path</tt> is now prepended to <a href="classWt_1_1WServer.html#a84f84652ccb139850adcf5ea75f50fa5">entry points</a> and <a href="classWt_1_1WServer.html#a7b78b5e35d2dc3086faa54f82124cf38">static resources</a> when they don't start with a forward slash (<tt>/</tt>). Omitting the slash used to be an error.
</li>
<li>
<a href="classWt_1_1Chart_1_1WCartesian3DChart.html">WCartesian3DChart</a>: added <a href="classWt_1_1Chart_1_1WCartesian3DChart.html#ac097e1922b519592a6b3732f3e8b8119">setAxis()</a>, allowing custom <tt>WAxis</tt> implementations e.g. axes with <a href="classWt_1_1Chart_1_1WAxis.html#a7a6e079a7a0b136f77dad65b2c1abcc1">custom labels and ticks</a>.
</li>
<li>
Added <a href="classWt_1_1ItemDataRole.html#af593515a1cc8e972679cc00e362db4ce">ItemDataRole::MarkerType</a>, to change the <a href="group__charts.html#ga9f38f3460fb2575d5f4f1a1ac51a7db6">MarkerType</a> of individual data points on a <a href="classWt_1_1Chart_1_1WCartesianChart.html">2D chart</a>.
</li>
<li>
<a href="classWt_1_1Http_1_1Client.html">Http::Client</a>:
<ul>
<li>
added <a href="classWt_1_1Http_1_1Client.html#a28336ba9677e6e3cc6c890f490f2965a">HEAD request</a> support
</li>
<li>
On Windows: uses Windows root certificates. It is no longer necessary to provide a <a href="classWt_1_1Http_1_1Client.html#a7c9fbf7fc9f671519b0652f3bbe38521">path</a> with certificates for validation (or worse, disable verification altogether) when using TLS to talk to a server that uses a certificate issued by a CA that is trusted by Windows. Now the <tt>Http::Client</tt> will generally just work with <tt>https</tt> sites on Windows, just like it did on Linux. This also fixes other parts of Wt that use <tt>Http::Client</tt>, like <a href="classWt_1_1Payment_1_1PayPalService.html">PayPalService</a> and <a href="classWt_1_1Auth_1_1OAuthService.html">OAuthService</a>.
</li>
</ul>
</li>
<li>
<a href="classWt_1_1WWidget.html#a1f5151154770b4956b4870cb4ecc38d3">removeWidget()</a> and <a href="classWt_1_1WObject.html#a00f32a263b742f42b73a9353eaa3c7ca">removeChild()</a> now return a more concrete <tt>std::unique_ptr</tt>, for convenience. Also added a similar <a href="classWt_1_1WFitLayout.html#a071ea55ea16e71213b3bbd2f5f497932">WFitLayout::addWidget()</a>.
</li>
<li>
Wt's widget coordinate calculation code now uses <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect" target="_blank">getBoundingClientRect()</a>, which means that coordinate calculations are still accurate even when CSS transforms are used to position widgets. This was necessary for <a href="classWt_1_1WLeafletMap_1_1WidgetMarker.html">WidgetMarker</a> support.
</li>
<li>
<a href="classWt_1_1WTemplate.html">WTemplate</a>'s <a href="structWt_1_1WTemplate_1_1Functions.html#ab070ae026639fb7edc0c70db6510abc7">while_f</a> function now takes extra arguments, similar to the <a href="structWt_1_1WTemplate_1_1Functions.html#a734f46b7a8155cbc6cf0407dd3dbe85d">block</a> function.
</li>
<li>
Added <a href="classWt_1_1WResource.html#a6695dad28a25c7cbfef93c371e7c5a1e">WResource::setTakesUpdateLock()</a> as a way to make a (non-static) resource grab the <a href="classWt_1_1WApplication.html">WApplication</a>'s <a href="classWt_1_1WApplication_1_1UpdateLock.html">UpdateLock</a> before <a href="classWt_1_1WResource.html#a3a740f8cc29e2e6e4e58defc9c88b8b6">handleRequest()</a>.
</li>
<li>
Made it possible to set a <a href="classWt_1_1WTableView.html#afc65ef8675ae2d53300eaa511c1fad6b">preload margin</a> on <tt>WTableView</tt>. This
allows to customize how much of the table's contents should be loaded. Higher preload margin means fewer but larger updates of the table's contents
when scrolling.
</li>
</ul>
<h3>Miscellaneous bug fixes</h3>
<ul>
<li>Fixed an issue where JavaScript could be sent to the browser in the wrong order when doing background updates of hidden widgets
(<a href="https://redmine.webtoolkit.eu/issues/7023" target="_blank">issue #7023</a>)</li>
<li>Fixed a client side memory leak caused by misuse of jQuery's data feature (<a href="https://redmine.webtoolkit.eu/boards/2/topics/15941" target="_blank">reported on the forums</a>)</li>
<li><a href="classWt_1_1WTableView.html">WTableView</a>: fixed row deletion behavior</li>
<li>Fixed icons not showing up on tabs and menu items when using <a href="classWt_1_1WBootstrapTheme.html">WBootstrapTheme</a>, as <a href="https://redmine.webtoolkit.eu/boards/1/topics/15664" target="_blank">reported on the forums</a>.</li>
<li>Fixed wrong <a href="classWt_1_1WStackedWidget.html">WStackedWidget</a> height when animating transitions (<a href="https://redmine.webtoolkit.eu/issues/6788" target="_blank">issue #6788</a>)</li>
<li>Fixed not able to hide widgets with a flexbox-based layout (<a href="https://redmine.webtoolkit.eu/issues/6884" target="_blank">issue #6884</a>)</li>
<li>Fixed out of bounds array access when using a widget with a custom HTML tag name (<a href="https://redmine.webtoolkit.eu/issues/7059" target="_blank">issue #7059</a>). Widgets will now derive whether they are default inline based on the widget's default DOM element type.</li>
<li>Fixed a regression in <a href="classWt_1_1WDate.html#a6d604c9c4409729abbe4a334c4d69368">WDate::addMonths()</a> and <a href="classWt_1_1WDate.html#ab03f57a16749501343b8368047199002">addYears()</a>, introduced in Wt 4.0.0. When a day would not exist in the resulting month, this would yield an invalid month. Instead, it will now (as it did in Wt 3) set the date to the last day of that month, e.g. May 31, 2019 + 6 months becomes November 30, 2019.</li>
<li>Fixed an issue where mouse signals of a <a href="classWt_1_1WTreeView.html">WTreeView</a> would fire multiple times (<a href="https://redmine.webtoolkit.eu/issues/6260" target="_blank">issue #6260</a>)</li>
<li>
wthttp WebSocket fixes:
<ul>
<li>
WebSocket requests for non-existent sessions (often the result of restarting the server) no longer create a new bogus session.
</li>
<li>
WebSocket messages with continuation frames (as sent by Google Chrome when the messages become very large) could become corrupted,
especially when per-message-deflate is used (<a href="https://redmine.webtoolkit.eu/issues/7039" target="_blank">issue #7039</a>,
<a href="https://redmine.webtoolkit.eu/issues/7034" target="_blank">#7034</a>).
</li>
<li>
WebSocket message size is now properly limited by <tt>--max-memory-request-size</tt>. Previously, this would only limit the size
of individual frames, not the entire message.
</li>
<li>
Fixed a possible use-after-free or double delete issue when an invalid WebSocket message was received.
</li>
</ul>
</li>
<li>
Fixed undefined <tt>ackId</tt> overflow behavior (which could very rarely cause a session to fail)
</li>
<li>
<a href="classWt_1_1WContainerWidget.html#a60e57a8860785d6b587a36b616cb5e12">WContainerWidget::setLayout()</a> now properly clears any existing contents of the container.
This would previously cause JavaScript errors (<a href="https://redmine.webtoolkit.eu/issues/7128">issue #7128</a>).
</li>
</ul>
<h2>Release 4.0.5 (December 14, 2018)</h2>
<p>Wt 4.0.5 is almost entirely a bugfix release. Here are the key changes:</p>
<h3>Minor API breaking changes</h3>
<h4>ItemDataRole</h4>
<p>One of the things we changed in Wt 4 is the type of roles in the
<a href="group__modelview.html">MVC system</a>. They are no longer
represented by an enum, but now through a
<a href="classWt_1_1ItemDataRole.html">class that's a thin wrapper
around an int</a>. We however forgot to update the role's type in
a few places, and this release rectifies that. The following methods
have been updated:</p>
<ul>
<li><a href="classWt_1_1WIdentityProxyModel.html#acfa2c2b201f8919e462e1a2d498b75ab">WIdentityProxyModel::setHeaderData()</a></li>
<li><a href="classWt_1_1WSuggestionPopup.html#a0abf89a25ea7eece7d36391d56130cf7">WSuggestionPopup::setEditRole()</a></li>
<li><a href="classWt_1_1WSuggestionPopup.html#acba647adde23e76f2ce5446b60145aa0">WSuggestionPopup::editRole()</a></li>
</ul>
<h4>Wt::Auth::UpdatePasswordWidget</h4>
<p>The <a href="classWt_1_1Auth_1_1UpdatePasswordWidget.html">UpdatePasswordWidget</a>,
part of the authentication subsystem of Wt, would delete itself when done.
This was harmless when it was inside of a <a href="classWt_1_1WDialog.html">WDialog</a>, but it's less practical when
used elsewhere. We've changed the behavior of <tt>UpdatePasswordWidget</tt> to emit the
<a href="classWt_1_1Auth_1_1UpdatePasswordWidget.html#a6c6bedf0628488cbb09d44c6df441004">updated()</a> and
<a href="classWt_1_1Auth_1_1UpdatePasswordWidget.html#a640d20893579fcc2642ac62f0a550b6a">canceled()</a>
signals instead.</p>
<h3>Dbo: reentrant statement use</h3>
<p>For the longest time, the Dbo tutorial has mentioned that
“you need to be careful to not have two collections with the same statement busy at the same time”.
If you did attempt concurrent use of statements, an exception mentioned that
“Reentrant statement use is not yet implemented”. Starting from
Wt 4.0.5, you won't see that error anymore. Dbo will now
clone the prepared statement as needed.</p>
<h3>Flex layout fixes</h3>
One of Wt 4's niceties is the fact that the layout managers now rely less on JavaScript, but employ flexbox instead. This
did not work perfectly, though, so it was still possible to switch the implementation to the old JavaScript method if things
did not work correctly. We fixed many issues in the flex layout implementation, and now the widget gallery works
correctly using flexbox (pending an overhaul to make the widget gallery more responsive and more in line with the Wt homepage theme).
<h2>Release 4.0.4 (August 22, 2018)</h2>
<p>This release brings with it the usual bugfixes, but also some new features:</p>
<h3>WCartesianChart improvements</h3>
<h4>Multiple Y axis support</h4>
<p>In previous versions of Wt, it was already possible to have two separate Y axes. This release
allows for any amount of Y axes, and extends the interactive functionality to support multiple Y axes.</p>
<p>The following methods have been added:</p>
<dl>
<dt><a href="classWt_1_1Chart_1_1WCartesianChart.html"><tt>WCartesianChart</tt></a></dt>
<dd>
<ul>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a44f9ac7c63b7ccf0be2cc925c8159094"><tt>std::vector<WAxis*> yAxes()</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a457197f9f6a0215a260922a47dde9115"><tt>std::vector<const WAxis*> yAxes() const</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a3b0038712fce477634c39cdc736c2388"><tt>WAxis& yAxis(int i)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#ab301c3aed79917163a093ca102cc4563"><tt>const WAxis& yAxis(int i) const</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#aa9d7bbc307118d222aca64deb76b60d5"><tt>int yAxisCount() const</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a0abfca1c61508d49f9c8b5e95e896b4b"><tt>int addYAxis(std::unique_ptr<WAxis> waxis)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a8e884bd514607231e025b1c06aed6b8e"><tt>std::unique_ptr<WAxis> removeYAxis(int yAxisId)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a34329c849eaa8761f730d027c9c47af9"><tt>void clearYAxes()</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a191d840f367d27f66612b8e68009f888"><tt>WPointF mapFromDevice(const WPointF &point, int ordinateAxis) const</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#aad25e33c3a389c99ea63f606a30e2f65"><tt>WPointF mapToDevice(const Wt::cpp17::any &xValue, const Wt::cpp17::any &yValue, int yAxis, int xSegment = 0, int ySegment = 0) const</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a9f31ca5174b6127e49ad92c9da481adc"><tt>void setCrosshairYAxis(int yAxis)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#abdac8c6bf3f39c524054645f8b063383"><tt>int crosshairYAxis() const</tt></a></li>
</ul>
<b>Small breaking change</b>: note that the virtual method <a href="classWt_1_1Chart_1_1WCartesianChart.html#a1813b0cfd8692b5b5720b5b9e7fa807b"><tt>prepareAxes</tt></a> has been modified to take a <a href="classWt_1_1WPaintDevice.html"><tt>WPaintDevice*</tt></a> argument. If your code overrides this method, be sure to add this argument to your overridden version.
</dd>
<dt><a href="classWt_1_1Chart_1_1WDataSeries.html"><tt>WDataSeries</tt></a></dt>
<dd>
<ul>
<li><a href="classWt_1_1Chart_1_1WDataSeries.html#aafffe717e28c00afea645652a9b6a655"><tt>WDataSeries(int modelColumn, SeriesType seriesType, int yAxis)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WDataSeries.html#ae3abca77e796e8d0c1b1e5830ef80866"><tt>void bindToYAxis(int yAxis)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WDataSeries.html#a338558cb67b5114f7d9de07192a3c1a8"><tt>int yAxis() const</tt></a></li>
</ul>
</dd>
</dl>
<p>It's also possible to pan and zoom individual axes by scrolling on or dragging the axis itself, or by touch dragging and pinching.</p>
<h4>On-demand loading</h4>
<p>We've added on-demand loading functionality to <a href="classWt_1_1Chart_1_1WCartesianChart.html"><tt>WCartesianChart</tt></a>. Enable on-demand loading when you have a lot of data and/or need the ability to zoom in very far. This will make it so that only the data for the visible X range is loaded, and will improve performance of data series with large amounts data. This becomes especially useful in combination with the ability to set a maximum zoom range, so that you can't zoom all the way out to see all data.</p>
<p>The following methods have been added:</p>
<dl>
<dt><a href="classWt_1_1Chart_1_1WCartesianChart.html"><tt>WCartesianChart</tt></a></dt>
<dd>
<ul>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a97f7f38a9f751b0b41d67f4546cc32f9"><tt>void setOnDemandLoadingEnabled(bool enabled)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a2380aeb17e103bae1f332fd4c56d6b2b"><tt>bool onDemandLoadingEnabled() const</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a9072e157f556bd8eea1eef14426d4f29"><tt>void setLoadingBackground(const WBrush &brush)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WCartesianChart.html#a3e33918e5cbee75d172ab820e71f69bc"><tt>const WBrush& loadingBackground() const</tt></a></li>
</ul>
</dd>
<dt><a href="classWt_1_1Chart_1_1WAxis.html"><tt>WAxis</tt></a></dt>
<dd>
<ul>
<li><a href="classWt_1_1Chart_1_1WAxis.html#ada743ccf44212cfb1f4a6fa83b79e581"><tt>void setMaximumZoomRange(double size)</tt></a></li>
<li><a href="classWt_1_1Chart_1_1WAxis.html#a10742d531e8141474ea707d3c4730386"><tt>double maximumZoomRange() const</tt></a></li>
</ul>
</dd>
</dl>
<p>Note that the data must be ordered on X axis value for this feature to work properly.</p>
<h3>Path parameters</h3>
<p>It's now possible to use variables in <a href="classWt_1_1WServer.html#a7b78b5e35d2dc3086faa54f82124cf38"><tt>WServer::addResource()</tt></a>, e.g. <tt>server.addResource(&resource, "/users/${user}")</tt>.</p>
<p>These parameters are then accessible in the <tt>WResource</tt>'s <tt>handleRequest()</tt> function through
<a href="classWt_1_1Http_1_1Request.html#af6917bd5182e9a33f74e3e7191899495"><tt>Http::Request::urlParams()</tt></a>
and <a href="classWt_1_1Http_1_1Request.html#a0100186e6bc33bd221e25799e2059f7d"><tt>Http::Request::urlParam(const std::string&)</tt></a>.</p>
<p>A feature example demonstrating this was added in <tt>examples/feature/urlparams</tt>.</p>
<h3>Idle timeout</h3>
<p>Added an <tt><idle-timeout></tt> option to the configuration (<tt>wt_config.xml</tt>). If set,
<a href="classWt_1_1WApplication.html#a4e8020fca24d09661ee4bf13400354d9"><tt>WApplication::idleTimeout()</a></tt> will be triggered after the configured number of seconds.</p>
<p>This is intended to prevent unauthorized people from using an active session from a
device that's been abandoned by the user.</p>
<a href="classWt_1_1WFileDropWidget.html"><h3>WFileDropWidget</h3></a>
<p>Added the ability to set a
<a href="classWt_1_1WFileDropWidget.html#a9ad41a8986a7bbb25178e0cda850333d">JavaScript filter</a>, e.g. to
compress uploads client side.
<h3>Miscellaneous improvements</h3>
<ul>
<li>Added support for transparency in PDFs</li>
<li>Rudimentary support for drawing SVGs on HTML canvas with <tt>WPainter::drawImage</tt></li>
<li>
<a href="classWt_1_1Dbo_1_1backend_1_1MySQL.html"><tt>Wt::Dbo::backend::MySQL</tt></a>:
Fixed compatibility with MySQL Connector/C 8.0 and MariaDB Connector/C 3.0
</li>
<li>
Added <a href="classWt_1_1WEnvironment.html#ad2846f6fd581cd6c8c6933eff0e5fa73"><tt>WEnvironment::timeZoneName()</tt></a>
</li>
<li>
Added <tt>insertTab</tt>, <tt>itemAt</tt> and <tt>currentItem</tt> to
<a href="classWt_1_1WTabWidget.html"><tt>WTabWidget</tt></a>
</li>
<li>
Disabled TLS v. 1.0 and 1.1 support
</li>
</ul>
<h2>Release 4.0.3 (April 12, 2018)</h2>
<p>This release fixes compatibility with Boost 1.66, fixes some bugs, and adds
some functionality:</p>
<dl>
<dt>WFileUpload: added display widget</dt>
<dd>Often, native file upload field look out of place in the rest of a web application's design.
A common trick is to hide the file upload field, and add another widget that forwards its click
signal to the file upload field. We added
<a href="classWt_1_1WFileUpload.html#ab95ec35db690296e848d89a71c23737a">setDisplayWidget()</a>
to make it easy to implement that trick.</dd>
<dt>WFileDropWidget: added drop indication and global drop</dt>
<dd>When <a href="classWt_1_1WFileDropWidget.html#a0c1400a6f7f63eec4bb1cfe30807538e">drop indication</a>
is enabled, a WFileDropWidget will be highlighted as soon
as a file being dragged enters the page. When
<a href="classWt_1_1WFileDropWidget.html#a051b4928cb26446de1eb3617d0f8c954">global drop</a> is enabled, then a drop
anywhere on the page will put the file in the WFileDropWidget.</dd>
<dt>SqlConnection::executeSqlStateful()</dt>
<dd><a href="classWt_1_1Dbo_1_1SqlConnection.html#a7ac824e554074898f10cf75b70a4a6b1">SqlConnection::executeSqlStateful()</a> allows to execute SQL that should be re-executed upon automatic reconnect. Automatic reconnect
is currently supported for the <a href="classWt_1_1Dbo_1_1backend_1_1Postgres.html">Postgres</a>
and <a href="classWt_1_1Dbo_1_1backend_1_1MySQL.html">MySQL</a> backends.</dd>
<dt>WTableView: exposed touch events</dt>
<dd>
We made it possible to define custom behaviour upon touch events on WTableView, by
adding the <a href="classWt_1_1WAbstractItemView.html#acd980e6a9eb110400f334e341f8386a4">touchStarted()</a>,
<a href="classWt_1_1WAbstractItemView.html#aaf371c95c294c952be0eaac5b3f56af7">touchMoved()</a>, and
<a href="classWt_1_1WAbstractItemView.html#a9f3bd68d6d5ca982b2a22bcd100ea271">touchEnded()</a> signals.
</dd>
</dl>
<h2>Release 4.0.2 (November 24, 2017)</h2>
<p>This is a patch release that fixes a few problems with the build of Wt 4.0.1, and fixes a bug in Wt::Auth.</p>
<h2>Release 4.0.1 (November 21, 2017)</h2>
<p>This is a smaller release with mostly bugfixes, and some new features:</p>
<dl>
<dt>Added <a href="classWt_1_1WContainerWidget.html#acf75dda5024db05cf847c282f8a99117">WContainerWidget::addNew()</a> and similar methods</dt>
<dd>Because writing code like this:
<div class="fragment">
<div class="line"><tt>auto text = root()->addWidget(std::make_unique<Wt::WText>("Hello!"));</tt></div>
</div>
is a bit verbose, a shorthand was added that creates the widget and adds it to the container in one go:
<div class="fragment">
<div class="line"><tt>auto text = root()->addNew<Wt::WText>("Hello!");</tt></div>
</div>
<tt>addNew</tt> forwards its arguments to the constructor, just like <tt>std::make_unique</tt>.
Along those lines, we added <a href="classWt_1_1WContainerWidget.html#a5a7e7b9fe21bdc38f7a270193ed83243">WContainerWidget::insertNew()</a> and <a href="classWt_1_1WTemplate.html#a240f910cd1e3d5b7876aa20f6b33767c">WTemplate::bindNew()</a>.
</dd>
<dt>Added the <tt><max-formdata-size></tt> configuration option</dt>
<dd>Previously, the maximum size of form data sent by Wt in a single POST request was capped to 5 MiB.
In applications with a large amount of forms with a lot of data, that may not be enough,
so <tt><max-formdata-size></tt> can be used to adjust this independently. Note that
the maximum request size (and by consequence, the form data size) is still capped by
<tt><max-request-size></tt>.</dd>
</dl>
<h2>Release 4.0.0 (September 19, 2017)</h2>
<p>
This release has all of the added features of Wt 3.3.8, but comes with many notable changes. In general,
Wt 4 employs the more modern C++ style of C++11 and beyond. Support for compilers
without sufficient C++11 support is dropped competely. Wt 4 aligns more with the
<a href="https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md">C++ Core Guidelines</a>
in a pragmatic way, while keeping the API familiar.
</p>
<h3>New features since Wt 3.3.8</h3>
<dl>
<dt>Microsoft SQL Server backend for Wt::Dbo</dt>
<dd>We've added Microsoft SQL Server support to Wt::Dbo, making it the sixth
backend we support, alongside Sqlite, PostgreSQL, MySQL (and MariaDB),
Firebird, and Oracle (not part of the open source Wt because of licensing).
With this addition, Wt::Dbo now supports most commonly used relational database management systems.
It's based on ODBC and works with Microsoft's ODBC Driver
for SQL Server. With unixODBC, Linux and macOS are also supported.</dd>
<dt>Added support for listening on multiple interfaces and ports to wthttp</dt>
<dd>With the multivalued <tt>--http-listen</tt> and <tt>--https-listen</tt> options,
you can now listen on multiple interfaces and ports. For example, if you want to
listen on port 8080 on all IPv4 and IPv6 interfaces, you can use:
<div class="fragment">
<div class="line"><tt>--http-listen 0.0.0.0:8080 --https-listen [0::0]:8080</tt></div>
</div>
<tt>--http-listen</tt> and <tt>--https-listen</tt> obsolete the
<tt>--http-address</tt>, <tt>--http-port</tt>, <tt>--https-address</tt>, and <tt>--https-port</tt>
options.</dd>
</dl>
<h3>Changes in Wt's memory model</h3>
<p>
Like before, the parent widget (e.g. a <a href="classWt_1_1WContainerWidget.html">WContainerWidget</a>) owns
its child widgets. This has not changed. Wt 4 makes ownership transfers more clear by using <tt>std::unique_ptr</tt>
There are no more owning raw pointers in Wt's public API.
</p>
<p>
By consequence of using <tt>unique_ptr</tt>, constructors no longer take a <tt>parent</tt> argument. For
convenience, <a href="classWt_1_1WContainerWidget.html#a3341360fc6cc1e86c1a42a3a54d9e0c7">addWidget()</a>
now returns a (non-owning) raw pointer. Instead of doing:
<div class="fragment">
<div class="line"><span class="comment"><tt>// parent is a Wt::WContainerWidget*</tt></span></div>
<div class="line"><tt>Wt::WPushButton *button = new Wt::WPushButton("Click me", parent); <span class="comment">// Wt 3: parent owns the button</span></tt></div>
</div>
or:
<div class="fragment">
<div class="line"><tt>Wt::WPushButton *button = new Wt::WPushButton("Click me");</tt></div>
<div class="line"><tt>parent->addWidget(button); <span class="comment">// Wt 3: ownership is transferred to parent through addWidget</span></tt></div>
</div>
You can now do:
<div class="fragment">
<div class="line"><span class="comment"><tt>// Wt 4 (with C++14's std::make_unique)</tt></span></div>
<div class="line"><tt>Wt::WPushButton *button = parent->addWidget(std::make_unique<Wt::WPushButton>("Click me"));</tt></div>
</div>
<tt>Wt::cpp14::make_unique</tt> can be used instead of <tt>std::make_unique</tt> if C++14 support is unavailable.
</p>
<p>
Some classes were changed from the old single ownership
model to shared ownership through <tt>std::shared_ptr</tt>, like models (<a href="classWt_1_1WAbstractItemModel.html">WAbstractItemModel</a>, <a href="classWt_1_1Chart_1_1WAbstractChartModel.html">WAbstractChartModel</a>, and derivates) and <a href="classWt_1_1WValidator.html">validators</a>.
</p>
<p>
<a href="classWt_1_1Core_1_1observing__ptr.html">Wt::Core::observing_ptr</a> was introduced. This pointer will
be notified when the object it points to is deleted. <tt>observing_ptr</tt>s are intended to be used within the
scope of a <a href="classWt_1_1WApplication.html">WApplication</a> and are not thread safe. Every
<a href="classWt_1_1WObject.html">WObject</a> (and by consequence, every <a href="classWt_1_1WWidget.html">widget</a>)
is an <a href="classWt_1_1Core_1_1observing_ptr.html">observable</a>, so its lifetime can be observed with
an <tt>observing_ptr</tt>. Their use is entirely optional, but they may be useful when the lifetime of an
object is not always clear.
</p>
<h3>Header files now end in .h</h3>
Wt 3 used extensionless headers. This confuses many editors and IDEs.
For Wt 4, the <tt>.h</tt> extension was added, and using the old style headers is deprecated. You can use the
Python script <a href="https://github.com/emweb/wt/blob/wt4/migrate/wt4_add_h_to_includes.py">migrate/wt4_add_h_to_includes.py</a> to help update your Wt includes.
<h3>Enums replaced by enum classes</h3>
Many enums were replaced with enum classes, and many have been moved from class scope to namespace scope, e.g.:
<div class="fragment">
<div class="line"><tt>enum SelectionMode {</tt></div>
<div class="line"><tt> NoSelection = 0,</tt></div>
<div class="line"><tt> SingleSelection = 1,</tt></div>
<div class="line"><tt> ExtendedSelection = 3</tt></div>
<div class="line"><tt>};</tt></div>
</div>
became:
<div class="fragment">
<div class="line"><tt>enum class SelectionMode {</tt></div>
<div class="line"><tt> None = 0,</tt></div>
<div class="line"><tt> Single = 1,</tt></div>
<div class="line"><tt> Extended = 3</tt></div>
<div class="line"><tt>};</tt></div>
</div>
Some enums were preserved in places were the added verbosity
was undesirable, like the <a href="group__dbo.html#ga1d0ec6819b1bf5b7a88ad030b91ca564">Wt::Dbo::RelationType</a> enum.
<h3>Replacements for Boost</h3>
Many features of Boost that Wt relied on were made obsolete by C++11. Many other Boost features have been replaced
with C++11-based alternatives.
<dl>
<dt>Choice between Boost.Asio and standalone Asio</dt>
<dd>
The CMake option <tt>WT_ASIO_IMPLEMENTATION</tt> allows to choose between <tt>boost</tt> and <tt>standalone</tt>
Asio.</dd>
<dt>Removal of Boost usage in Wt headers</dt>
<dd>
If standalone Asio is used, the installed headers of Wt no longer include any Boost headers.
The Windows builds of Wt 4 will from now on no longer include Boost,
including only the standalone Asio headers instead. This just about halves the size of the installer.
If you want to use Boost, you'll have to provide your own. You can find prebuilt Boost binaries for Windows
<a href="https://sourceforge.net/projects/boost/files/boost-binaries/">here</a>.
</dd>
<dt>Boost.Date_Time was replaced with Howard Hinnant's <tt>std::chrono</tt>-based date implementation</dt>
<dd>
The author of the <tt>std::chrono</tt> standard has created a
<a href="https://github.com/HowardHinnant/date">library for dates and time zones</a>.
This library is proposed for inclusion into the C++ standard in the future. For now, Wt includes
this date and time zone library (at this moment, this is version 2.2). This is used for all time-related
classes, like <a href="classWt_1_1WDate.html">WDate</a>,
<a href="classWt_1_1WTime.html">WTime</a>, <a href="classWt_1_1WDateTime.html">WDateTime</a>,
and <a href="classWt_1_1WLocalDateTime.html">WLocalDateTime</a>.
</dd>
<dt>
Boost.Any replaced by <tt>Wt::cpp17::any</tt>
</dt>
<dd>
<a href="classWt_1_1WStandardItemModel.html">WStandardItemModel</a> relied heavily on
<tt>boost::any</tt>. This was replaced with <tt>Wt::cpp17::any</tt>. You can choose the
implementation of <tt>any</tt> to use with the CMake option <tt>WT_CPP17_ANY_IMPLEMENTATION</tt>.
Valid options are:
<ul>
<li><a href="https://github.com/thelink2012/any">thelink2012</a>: this is the default implementation, included in Wt</li>
<li><tt>experimental</tt> for <tt>std::experimental::any</tt></li>
<li><tt>std</tt> for C++17's <tt>std::any</tt></li>
</ul>