<Swing Dev> RFR JDK-8241291: JCK test javax_swing/text/DefaultStyledDocument/ElementSpec/ESpecCtor.html fails
Alexey Ivanov
alexey.ivanov at oracle.com
Fri Mar 20 17:41:40 UTC 2020
On 20/03/2020 08:45, Prasanta Sadhukhan wrote:
>
> Yes, logically it's possible. I am not sure how in that case, we can
> cater to both OOM and JCK issue so backing out the fix
>
> http://cr.openjdk.java.net/~psadhukhan/8241291/webrev.1/
>
> I am not sure if JCK test is testing correctly, as the check it has is
>
> int lengthes[] = { 0, 1, 10 };
> int offs[] = { 0, 1, 6 };
> String text = "The text";
> for (int i = 0; i < types.length; i++) {
> for (int j = 0; j < lengthes.length; j++) {
> for (int k = 0; k < offs.length; k++) {
> es = new DefaultStyledDocument.ElementSpec(a,
> types[i], text.toCharArray(),
> offs[k], lengthes[j]);
> if (!(es != null && es.getLength() == lengthes[j]
> && es.getType() == types[i]
> &&*es.getOffset() *>= 0
> &&*text.equals(new String(es.getArray()))*
> && es.getAttributes() == a)) {
>
> so it does not take into account the offset that is passed to
> constructor, so even if I store 0 (and not 1, 6 as shown in 2nd and
> 3rd offset) as offset in ElementSpec constructor (and dont return the
> passed offset) the jck test pass. I guess it should test es.getOffset
> == offs[k]
>
> Also, getArray() expects the full text irrespective of offset it pass
> to ElementSpec.constructor, so if offset is 1, I believe we should
> store "he text" in ElementSpec.data (in which case OOM fix would have
> been fine) but JCK still expects "The text"
>
I agree, the JCK test should not expect the entire array to be returned.
However, the test was correct: the ElementSpec didn't copy the chars but
store the reference. (The test could be stricter in comparing the
references of the passed array.)
Shall we submit a bug against JCK?
Is it a problem to store the reference to char array in ElementSpec? As
far as I understand, ElementSpec is a short-lived object that is used to
construct Element tree for a styled document, or an HTML document; the
text stored in ElementSpec usually comes from a parser. As soon as the
changes to the (HTML)Document (structure) are processed, the text is
copied into the document itself.
If ElementSpec is long-lived object, we should copy the array, or the
part of it; if it's a temporary object, we can store the array reference
(as it was done before JDK-8173123). I strongly believe it's the latter.
If the array content is changed, the “stored” text in the ElementSpec
object is also changed, which shouldn't be a problem because the
ElementSpec object is not used after the spec it carries is incorporated
into the Document.
Regards,
Alexey
> Regards
> Prasanta
> On 20-Mar-20 10:27 AM, Sergey Bylokhov wrote:
>> On 3/19/20 8:15 pm, Prasanta Sadhukhan wrote:
>>> Not exactly. We are still copying the internal data before exposing
>>> to the user/external world in ElementSpec.getArray() so user does
>>> not get hold of our internal data structures.
>>
>> It will be possible to modify the array after passing to the
>> constructor so the "get" method will return different results per call.
>>
>>>
>>> Regards
>>> Prasanta
>>> On 20-Mar-20 6:22 AM, Sergey Bylokhov wrote:
>>>>> Fix is to copy the full text into ElementSpec.data and store the
>>>>> correct offset.
>>>>>
>>>>> It fixes the JCK issue and also 8241078 regression testcase. All
>>>>> JCK javax_swing/text/DefaultStyledDocument/ testcases pass after
>>>>> this fix.
>>>>
>>>> But this will break JDK-8173123, isn't it?
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/swing-dev/attachments/20200320/bb33414e/attachment.htm>
More information about the swing-dev
mailing list