[Laszlo-dev] text selection and links not working in iframe (html element) in Safari

P T Withington ptw at pobox.com
Wed Jul 1 08:20:14 PDT 2009


These two changes seem relevant (14067 and 2943):

r14067 | hqm | 2009-06-05 11:34:49 -0400 (Fri, 05 Jun 2009) | 58 lines

Change 20090605-hqm-Q by hqm at badtzmaru.home on 2009-06-05 11:30:43 EDT
     in /Users/hqm/openlaszlo/trunk5
     for http://svn.openlaszlo.org/openlaszlo/trunk

Summary:  fix for text selection in DHTML

New Features:

Bugs Fixed: LPP-8200

Technical Reviewer: max
QA Reviewer: andre
Doc Reviewer: (pending)

Documentation:

Release Notes:

Details:

+  LzSprite.js: only toggle the focus in focus_on_mouseover quirk when  
there is some text selected.

+ LzKeyboardKernel.js: Instead of cancelling a mouse event completely,
  just cancel bubbling. This lets the div handle the event, and allows
  text selection to work, but should disable it from propagating to
  global handlers.

+ LzTextSprite.js: use correct CSS properties for toggling  
selectability, in Safari

+ LzInputTextSprite.js: do not bind the global document.onselectstart  
handler, that prevents
text selection from working in some browsers

+ LzText.lzs: add the 'onselectable' event, not required for this
patch, but I noticed it was missing when writing a test case

Tests:

+ added lpp-8200.lzx test, try selecting a region in each the text
fields, except for the last (non-selectable) one.

+ text selection should work in DHTML on selectable text or input  
text, all
browsers

+ tested tabbing behavior of  examples/components/ 
component_sampler.lzx?lzt=html&lzr=dhtml
in IE7, FF3(OSX), Safari(OSX). You can tab to all input text elements.  
This is based on the
original comment from [r2943 | max | 2006-12-06 23:49:36 -0500 (Wed,  
06 Dec 2006) ]
   Tests: Tabbing to select inputtexts and typing now works for for the
   testcase for LPP-3197 and
   http://localhost:8080/legals/examples/components/style_example.lzx?lzr=dhtml 
.
   LzKeyboardKernel.js prevents bubbling for tab key events.
   LzMouseKernel.js has more safety checking.  LzInputTextSprite.js now
   implements focusing and blurringi, selection and deselection  
properly.
   LzTextSprite.js and LzInputTextSprite.js now track global UID
   properly.

r2943 | max | 2006-12-06 23:49:36 -0500 (Wed, 06 Dec 2006) | 29 lines

Change 20061206-maxcarlson-6 by maxcarlson at max-carlsons-computer.local  
on 2006-12-06 17:37:39 PST
     in /Users/maxcarlson/openlaszlo/legals

Summary: Fix DHTML inputtext tabbing and selection

New Features:

Bugs Fixed:  LPP-3197 - DHTML: Tabbing between inputtext elements  
doesn't work

Technical Reviewer: promanik
QA Reviewer: hminsky
Doc Reviewer: (pending)

Documentation:

Release Notes:

Details:


Tests: Tabbing to select inputtexts and typing now works for for the  
testcase for LPP-3197 and http://localhost:8080/legals/examples/components/style_example.lzx?lzr=dhtml 
.  LzKeyboardKernel.js prevents bubbling for tab key events.   
LzMouseKernel.js has more safety checking.  LzInputTextSprite.js now  
implements focusing and blurringi, selection and deselection  
properly.  LzTextSprite.js and LzInputTextSprite.js now track global  
UID properly.

Files:
M      WEB-INF/lps/lfc/kernel/dhtml/LzKeyboardKernel.js
M      WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js
M      WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js
M      WEB-INF/lps/lfc/kernel/dhtml/LzTextSprite.js

On 2009-06-30, at 23:03EDT, Henry Minsky wrote:

> So ... does anyone remember what the __cancelKeys flag is supposed  
> to be
> doing for us?
> Is this block of code now obsoleted by the call to updateControlKeys?
>
> On Tue, Jun 30, 2009 at 10:45 PM, Henry Minsky <hminsky at laszlosystems.com 
> >wrote:
>
>> Hmm, there's this code in LzSprite which does muck with the event,  
>> it even
>> has a warning from andre...
>>
>>            // FIXME: [20090602 anba] this prevents text selection,  
>> see
>> LPP-8200
>>            if (LzKeyboardKernel.__cancelKeys && e.keyCode == 0) {
>>                e.cancelBubble = true;
>>                e.returnValue = false;
>>
>>            }
>>
>>
>>
>> On Tue, Jun 30, 2009 at 8:41 PM, P T Withington <ptw at pobox.com>  
>> wrote:
>>
>>> We must be doing something more than just attaching the handler.   
>>> We must
>>> be somehow stifling the event.  Normally events go to the inner- 
>>> most DOM
>>> element first.  The only way I can think that the iframe could  
>>> prevent an
>>> inner element from getting onclick is if it registers for the  
>>> 'capture'
>>> phase (which means it has to pass 'true', I think as the last arg to
>>> attachEventHandler?  That's the only way an outer element can get  
>>> hold of an
>>> event before an inner one.
>>>
>>>
>>> On 2009-06-30, at 19:27EDT, Henry Minsky wrote:
>>>
>>> well, a simple test case doesn't show the bug, I can attach an  
>>> onclick
>>>> handler onto
>>>> the main document of an iframe, and I can attach an onclick  
>>>> handler onto
>>>> a
>>>> span of text
>>>> in the iframe, and clicking fires both handlers.
>>>>
>>>> So I guess I need to make a more detailed model of what we're  
>>>> doing with
>>>> the
>>>> event
>>>> handler attacher in lz.embed.
>>>>
>>>>
>>>> On Tue, Jun 30, 2009 at 6:52 PM, Henry Minsky <hminsky at laszlosystems.com
>>>>> wrote:
>>>>
>>>> Well, we're installing the event handlers for mousedown and click  
>>>> onto
>>>>> the
>>>>> actual iframe element in the DHTML app, so maybe that just stops  
>>>>> the
>>>>> event
>>>>> from propagating into the iframe, in Safari and IE7. I'll set up a
>>>>> simple
>>>>> test case to see if that is the case. Maybe the whole 'capture/ 
>>>>> bubble'
>>>>> model
>>>>> gets broken if it crosses an iframe boundary in the browser.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Tue, Jun 30, 2009 at 4:27 PM, P T Withington <ptw at pobox.com>  
>>>>> wrote:
>>>>>
>>>>> Well something is weird because normally _adding_ a handler to  
>>>>> mouse
>>>>>> click
>>>>>> does not cancel/intercept the event.  If you just add a handler  
>>>>>> and
>>>>>> don't
>>>>>> call suppressDefault or cancelBubble, then the event should be  
>>>>>> seen by
>>>>>> all
>>>>>> the listeners (and by the browser default action).
>>>>>>
>>>>>> I know you were working in this area recently with respect to the
>>>>>> keyboard
>>>>>> update method that tries to pick off the shift keys from the  
>>>>>> mouse
>>>>>> event.
>>>>>> Maybe something went awry there?  Or maybe the way the iframe  
>>>>>> manager
>>>>>> is
>>>>>> registering to listen to mouse events it screwing things up.
>>>>>>
>>>>>> If you listen in the 'capture' phase (i.e., grab the event  
>>>>>> before it is
>>>>>> sent to any DOM elements, you can intercept the event; but I  
>>>>>> did not
>>>>>> think
>>>>>> we did that.
>>>>>>
>>>>>>
>>>>>> On 2009-06-30, at 16:00EDT, Henry Minsky wrote:
>>>>>>
>>>>>> The text selection getting nuked is a bug in safari. The  
>>>>>> inability to
>>>>>>
>>>>>>> click
>>>>>>> on a <a> link happens
>>>>>>> in both safari and IE7 (it is due to the intercept of the  
>>>>>>> 'click'
>>>>>>> event)
>>>>>>>
>>>>>>> On Tue, Jun 30, 2009 at 3:58 PM, P T Withington <ptw at pobox.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>> On 2009-06-30, at 15:20EDT, Henry Minsky wrote:
>>>>>>>
>>>>>>>>
>>>>>>>> I isolated the bug in http://openlaszlo.org/jira/browse/LPP-8303down
>>>>>>>> to
>>>>>>>>
>>>>>>>> this code in iframemanager.js
>>>>>>>>>
>>>>>>>>> in __setSendMouseEvents , the iframemanager binds the  
>>>>>>>>> 'mousedown'
>>>>>>>>> and
>>>>>>>>> 'click' events
>>>>>>>>>
>>>>>>>>>          lz.embed.attachEventHandler(iframe.document,  
>>>>>>>>> 'mousedown',
>>>>>>>>> lz.embed.iframemanager, '__mouseEvent', id);
>>>>>>>>>
>>>>>>>>>          lz.embed.attachEventHandler(iframe.document, 'click',
>>>>>>>>> lz.embed.iframemanager, '__mouseEvent', id);
>>>>>>>>>
>>>>>>>>> And those cause Safari to no longer be able to drag-select  
>>>>>>>>> text or
>>>>>>>>> to
>>>>>>>>> click
>>>>>>>>> on links.
>>>>>>>>>
>>>>>>>>> Is there some way we can re-send those events back to the  
>>>>>>>>> browser,
>>>>>>>>> if
>>>>>>>>> thise
>>>>>>>>> code is  intercepting them?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> These events all bubble, but are also all cancellable.  Is the
>>>>>>>> event
>>>>>>>> handler cancelling them or suppressing the default action?
>>>>>>>>
>>>>>>>> We're not grabbing these events in capture phase (before any  
>>>>>>>> DOM
>>>>>>>> element
>>>>>>>> gets to see them) are we?
>>>>>>>>
>>>>>>>> Is this _only_ a bug in Safari?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Henry Minsky
>>>>>>> Software Architect
>>>>>>> hminsky at laszlosystems.com
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> Henry Minsky
>>>>> Software Architect
>>>>> hminsky at laszlosystems.com
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> Henry Minsky
>>>> Software Architect
>>>> hminsky at laszlosystems.com
>>>>
>>>
>>>
>>
>>
>> --
>> Henry Minsky
>> Software Architect
>> hminsky at laszlosystems.com
>>
>>
>>
>
>
> -- 
> Henry Minsky
> Software Architect
> hminsky at laszlosystems.com



More information about the Laszlo-dev mailing list