Fix sanitization of empty RTA input for Firefox & IE (#11937)
Browsers differ in what they return as the content of a visually empty rich text area (RTA). Accordingly, RTA sanitizes these different values ensuring an empty string is returned to the framework. However, existing sanitization criteria doesn't work for Firefox 74 and Internet Explorer 11.
This fix appends the sanitization criteria of Firefox 74 and IE 11, ensuring an empty string is returned to the framework for a a visually empty RTA.
Anna Koskinen [Tue, 31 Mar 2020 10:47:28 +0000 (13:47 +0300)]
Ensure recalculateColumnWidths works with refreshAll. (#11934)
Column widths shouldn't be calculated between the clearing of cache and
re-populating it, but be delayed until the cache has some content again.
The calculations should only be triggered immediately if no rows are
expected.
Anna Koskinen [Mon, 23 Mar 2020 09:01:25 +0000 (11:01 +0200)]
Simplify Grid sidebar handling. (#11920)
There is no need to reset the sidebar for every column that is set
hidable within the same roundtrip. Because no other layouting depends on
the sidebar contents, we can safely delay the reset until all columns
have got their hidabiity status updated. As a bonus point, when the
reset itself is delayed, the headers have time to get populated and the
sidebar button's height can be determined immediately at attach. The
reset ensures that attach is called every time a column's hidability is
changed.
Anna Koskinen [Mon, 9 Mar 2020 14:54:13 +0000 (16:54 +0200)]
Trigger re-measure after updating ElementResizeListeners. (#11912)
Removing ElementResizeListeners from an element makes it unmeasurable
and clears any saved measured values. Adding the listeners back makes
the element measurable again but doesn't add it to measuring queue.
Measuring needs to happen or any updates to expanded components within a
layout (without changes that would trigger full re-measuring of the
layout itself) lead to broken expand size calculations with any fixed
size elements assumed to have no size.
Anna Koskinen [Tue, 28 Jan 2020 10:34:22 +0000 (12:34 +0200)]
Don't reset date to current at DateField state (e.g. read-only) updates. (#11879)
- DateFields with month or year resolution should not get their date
reset to current date if the field's state is updated (e.g. by changing
read-only status or adding a range).
Anna Koskinen [Wed, 18 Dec 2019 13:18:56 +0000 (15:18 +0200)]
Improvements to popup positioning for ComboBox within HorizontalLayout. (#11846)
Expand ratio and spacing can cause ComboBox to miscalculate its own
position while layouting is still ongoing. Popup should not be
repositioned in such circumstances in order to avoid incorrect
intermediate states.
Anna Koskinen [Fri, 6 Dec 2019 00:49:54 +0000 (02:49 +0200)]
Test tweaks (#11841)
- Use BrowserStack workaround for proper sendKeys functionality on IE11.
- TreeGridBigDetailsManagerTest: allow two pixel discrepancy in expected
scroll position to accommodate IE.
- TreeWideContent: switched from raw type to type inference.
- ValoColorPickerInputFormatsTest: switched equals comparison to correct
way around.
- ResponsiveLayoutUpdateTest: updated screenshots for IE
- ColumnCollapsingAndColumnExpansionTest: updated screenshots for IE
- ClosingWindowWithBrowserFrameShouldntGenerate404Test: test is
incompatible with IE driver, excluded from tested browsers. In manual
testing IE doesn't get 404 in the logs with or without the fix
associated with this test but there are other client-side exceptions
related to focus handling in either case. However, those are out of
scope for this particular fix and should be investigated separately.
Close window on ESC, when maximized button is clicked (#11840)
Fixes #11838
Changes:
1. Close a window when maximized button is focused and ESC is pressed
2. Add additional check for a close button to react to the ESC key press
3. Rename a private method `onCloseClick` to `closeWindow` to allow code re-use
Knoobie [Tue, 3 Dec 2019 14:20:19 +0000 (15:20 +0100)]
Make VaadinService.cleanupSession public (#11738)
to allow for better integration of third party applications handling the destruction of the session.
Usage example (see https://vaadin.com/directory/component/cleanupservlet-add-on/overview)
"It's possible to close a browser window in such way that neither UI cleanup nor session cleanup will happen until the underlying http session timeouts. This can happen because the design idea for heartbeat is to keep the UI alive, not to ensure timely cleanup, and as such the default check is only performed at the end of each request."
Anna Koskinen [Tue, 3 Dec 2019 11:13:49 +0000 (13:13 +0200)]
Simplify Grid scroll handling. (#11835)
If first attempt at scrolling doesn't succeed it's unlikely that
continuing to wait is going to make any difference. Cache should be
populated before triggering any actions that depend on the row being
visible, otherwise it should be enough to trust that scrollToRow
actually scrolls to row and once scrolling is done the row is as much in
view as it's going to get. This way we don't get into a situation where
Editor never opens because it's still waiting for that one last pixel
that can't be achieved thanks to browser zoom causing rounding errors.
Tatu Lund [Mon, 2 Dec 2019 09:08:01 +0000 (11:08 +0200)]
Make asRequired conditional on binding.setAsRequiredEnabled(..) (#11834)
It is a very common use case in complex form that whether a field is required or not, it depends on input on other fields. Hypothetical use case sample could be that we have form for a Product and price of the product is needed except in case the Product's type is Sample. So in that kind of scenarios it would be needed to turn off asRequired() validation easily. The purpose of this enhancement and new binding.setAsRequiredEnabled(..) API is to help implementation of this kind of use cases more easily.
Tatu Lund [Fri, 29 Nov 2019 12:33:59 +0000 (14:33 +0200)]
Add method writeBeanAsDraft(bean) in Binder (#11833)
* Add method writeBeanAsDraft(bean) in Binder
With current Binder implementation it is not easy to support Forms, which you want to save as draft, i.e. incomplete. For example there can be big text areas, that require time to fill, or lot of fields. Therefore it is needed to that form can be saved, e.g. to other bean in incomplete state when it is not yet passing validation and this other bean can be persisted to draft storage for further editing in the future. This method helps to achieve that easily.
* Add test case for Binder.writeBeanAsDraft(bean)
Bind a field with validator, set value that does not pass validator and save, assert that value was saved.
Anna Koskinen [Tue, 26 Nov 2019 07:58:26 +0000 (09:58 +0200)]
Delegate enabled handling to Composite root. (#11832)
Otherwise the changed state isn't communicated properly to the
client-side in the initial round trip, as the client-side uses the child
connector's state directly.
Anna Koskinen [Thu, 21 Nov 2019 13:33:04 +0000 (15:33 +0200)]
Updated local screenshot testing configurations. (#11814)
* A separate screenshot module hasn't been in use for a while but local
testing configurations and instructions weren't updated to the new model
at the time. Could use some further cleanup but this covers the basics.
* Some tweaks to ScreenshotBrowser to get it functional again, although
the actions for automatically replacing or adding alternative
screenshots still require work and have thus been disabled.
Anna Koskinen [Thu, 21 Nov 2019 05:43:14 +0000 (07:43 +0200)]
Don't attempt to send expand/collapse events for disabled TreeGrid. (#11823)
The attempt gets blocked later down the line in any case and never
reaches the server, but sending it messes up TreeGrid's internal state.
It gets stuck waiting for the resolution of the blocked call that can
then only be resolved by server-side sending its own expand/collapse
request programmatically. Until that happens no further expand/collapse
attempts will get sent to server even after the TreeGrid has been
enabled again.
Tree is also affected as it is built upon TreeGrid.
Tatu Lund [Tue, 19 Nov 2019 09:04:44 +0000 (11:04 +0200)]
Fixing issue with TwinColSelect not correctly retaining visible selection (#11799)
There is a bug in TwinColSelect loging, it retains selection by indexes not by values after being sorted when new item has been added. This is a fixed by changing updateListBox method to retain the selection as it is being called after selection is being done.
Anna Koskinen [Wed, 13 Nov 2019 12:49:36 +0000 (14:49 +0200)]
Reduce excess positioning calls for ComboBox popup. (#11808)
- If an open popup is reset to its default position on every update from
the server before getting adjusted again to the actual expected
position, on heavier applications some of those intermediate positions
might get rendered. If the ComboBox is positioned at the right edge and
the popup contents are longer than the input field (i.e. popup should
open to the left, not right) this might cause flickering.
- Setting the default position is only actually needed when the popup is
opened in order to give it a baseline, otherwise it's better to simply
adjust the position if needed.
Tatu Lund [Tue, 12 Nov 2019 07:30:15 +0000 (09:30 +0200)]
Use APPLICATION_SCOPE for the session lock (#11792)
The Vaadin session itself is also stored in APPLICATION_SCOPE. The default
scope is PORTLET_SCOPE, so lock would be otherwise not be in sync with
the session.
To be able to do this, relevant methods in VaadinService are made protected so
that VaadinPortletService can override them.
Tatu Lund [Tue, 5 Nov 2019 14:16:38 +0000 (16:16 +0200)]
Fixing issue with Push stopping working in some circumstances (#11791)
* Fixing issue with Push stopping working in some circumstances
If new request is attempted when resynchronization is ongoing, the Push will stop working. This patch fixes the issue by aborting handleJson if resynch is already ongoing.
This PR supercedes https://github.com/vaadin/framework/pull/11786
Anna Koskinen [Mon, 4 Nov 2019 11:26:32 +0000 (13:26 +0200)]
Check actual Grid selection instead of relying on allSelected flag. (#11787)
The checkbox for selecting all rows only selects all the rows that have
not been filtered out. Changing the filtering does not change the
selection or the checkbox state so assuming that all rows are selected
simply because the checkbox has been checked cannot work.
Anna Koskinen [Wed, 30 Oct 2019 10:26:32 +0000 (12:26 +0200)]
Switch from an assert to logging and return in Grid.onBrowserEvent (#11778)
- If the Grid has frozen columns zooming can cause the regular column
cells to be ever so slightly out of sync with their corresponding rows.
This difference is not noticeable to naked eye but is big enough that
it's possible to hover over the row instead of the cell, which causes an
assertion error and a big ugly error popup. Switching to logging retains
the information delivered by the assertion error for developer purposes
but makes the end user experience smoother.
- Can be tested manually with GridColumnFrozenColumn test UI.
Anna Koskinen [Tue, 29 Oct 2019 10:59:27 +0000 (12:59 +0200)]
Added 1px tolerance to ScrollbarBundle's internal sanity check. (#11777)
* Added 1px tolerance to ScrollbarBundle's internal sanity check.
Requiring exact match can cause this check to fail when the browser is
zoomed since rounding is involved. This can in turn block some features
like opening of Grid Editor from working until some more scrolling
happens and the minute inconsistency is fixed.
Can be tested manually using GridEditorUI, depending on the environment
different amounts of zooming may be required for the problem to
manifest.
Anna Koskinen [Mon, 28 Oct 2019 14:32:12 +0000 (16:32 +0200)]
Improvements to ScrollDestination sanity checks (#11772)
- The new top row logical index should always be within the logical
range and high enough up to avoid leaving a gap if possible.
- Added regression testing for using the different scroll destination
types for scrolling to the top and to the bottom by index.
Make cancellation of uploads work regardless of Push configuration (#11743)
- Checking the push configuration outside of session lock threw
an AssertionError, so the push configuration is not checked anymore.
- The original problem with cancelling Upload was due to a subtle
ordering issue that depended on the Push configuration.
In the case of PushMode.AUTOMATIC, a new StreamVariable was
added by the `Upload` component _before_ the `FileUploadHandler`
got a chance to remove the old `StreamVariable`. As a result, the
`FileUploadHandler` actually removed the fresh `StreamVariable`,
breaking future uploads.
Upload should preserve MIMEType after first selection (#11745)
* Upload should preserve MIMEType after first selection
Fix #11698
Automated test is not run locally, need to continue with it
* Remove unused imports
* Add sleep time in testing purposes
* Getting a new instance of an input, after file is downloaded
Exclude IE from tests. Throws https://stackoverflow.com/questions/23883071/unhandled-alert-exception-modal-dialog-present-selenium , but checked manually and it works
Anna Koskinen [Thu, 5 Sep 2019 11:21:57 +0000 (14:21 +0300)]
Fix scrollTo for destination START and END and add regression testing. (#11707)
- Initial implementation erroneously assumed that
ScrollDestination.START would only be used for scrolling up and
ScrollDestination.END for scrolling down. That's obviously not what they
are for, otherwise everyone would be using ScrollDestination.ANY.
- Moved actual scrolling to within the helper method that originally
only calculated the new scroll position. Parent method became too long
otherwise.
Anna Koskinen [Thu, 29 Aug 2019 13:06:25 +0000 (16:06 +0300)]
Updated row and spacer handling for Escalator (#11438)
Updated row and spacer handling for Escalator.
Main changes:
- Spacers are only maintained and checked for rows that have DOM
representation, and not at all if there is no details generator. This
gives notable performance improvements to some particularly large Grids
- Escalator no longer tries to trim away any rows that don't fit within
the viewport just because a details row gets opened in Grid. This leads
to some increase in simultaneous DOM elements, but simplifies the logic
considerably. For example opening or closing details rows doesn't
require checking the overall content validity beyond the details row
itself anymore, but some repositioning at most. There are also no longer
any orphaned spacers without corresponding DOM rows.
- Spacers are better integrated into the overall position calculations.
- Some public methods that are no longer used by Escalator or have
changed functionality or order of operations. Any extending classes that
tap into row, spacer, or scroll position handling are likely to need
reworking after this update.
- Auto-detecting row height is delayed until Escalator is both attached
and displayed.
Anna Koskinen [Tue, 16 Jul 2019 12:21:23 +0000 (15:21 +0300)]
Improvements to detail row index handling. (#11345)
- Escalator should notify when an existing details row is moved to a new
index.
- Grid and DetailsManagerConnector should update their internal indexing
when details manager index changes in Escalator.