[CSSWG] Minutes Tokyo F2F 2013-06-06 Thu PM II: Events, Fragmentation, Shapes

Events and Fragmentation
------------------------

    - RESOLVED: Work on pointer-events: elements-from-point solution that will
                walk the elementsFromPoint chain instead of the ancestor chain
                (problem is passing events from content to fragmentation container)

   - Issue raised against Selectors 4 wrt whether ::pseudo:pseudo combinations
     are invalid or match nothing.

Shapes
------

   - RESOLVED: Move contours from rendered content to next level

   - Discussed using same-origin restrictions for shapes.

   - RESOLVED: Close the float/exclusion harmonizing issue.
               Exclusion wrapping context does not include floats.

====== Full minutes below ======


Events and Fragmentation
========================
Scribe: fantasai

   stearns: Events in fragmented flows, comes up in regions, but also issue
            in other types of fragmentation...
   stearns has drawn some boxes:
     There is a big box, which represents the thing that contains the fragmentainers.
     Inside are two fragmentainers, FC1 and FC2
   stearns: These could be regions, pages, column boxes, whatever
   stearns: Crucial thing is that fragmented flow has an article (draws box A),
   stearns: which contains a paragraph (box P), and there's a break at some
            point in the paragraph

   stearns: Issue is when you click in one of the fragments of the P
   stearns: The fragmentainer never hears about it
   stearns: The event goes out from P to A to the outer box, skips FC boxes
   SimonSapin: Are the two FC boxes generated from the same element?
   dbaron: In overflow fragments, yes, but not in Regions.
   dino: You said it doesn't matter, but is FC1 or FC2 regions, or columns...
         is A a child of that?
   stearns: In overflow fragments A would not be a child of either container,
            would be a child of outer box.
   dbaron: In overflow fragments not that distinction, just the one level.

   stearns: If I said :nth-fragment(2):hover, I want that fragment container
            to respond to hovering over this part of the paragraph, and not
            respond to hovering over the other part of the paragraph
   Bert: Could have :hover on the outer box.
   stearns: I want the container to change.
   <Bert> (DIV:hover::slot(fc2) {... highlight... }.)
   stearns: Only when it's hovered inside, not when the other fragment is
            hovered inside.
   stearns: And in Regions these can be different elements.
   <Bert> (Forget what I just said.)

   dino: In A have one region element you're flowing into. Events don't get
         seen by region element
   stearns: No
   dino: you can't write a rule that says ::region:hover
   stearns: right, and I want to
   dino: me too
   stearns: Regions has an API that allows you to determine which region
            got clicked.
   stearns: Doesn't work for hover but works for click events
   stearns: That workaround only works for events, doesn't work for :hover
            styling
   stearns: But that workaround also doesn't work for fragmented elements

   <stearns> http://wiki.csswg.org/spec/css3-regions/user-event-handling
   stearns: There are two proposals for handling this

   stearns: First is for fragmented flows in general
   stearns: When you have event bubbling in a fragmentation context
   stearns: Event goes up through the chain as normal to the fragmentation root
   stearns: The thing that contains the content that is fragmented
   stearns: At that point, the fragment container is inserted in the bubbling
   stearns: And the bubbling continues with whatever contains the fragment
            container, up through the hierarchy.
   dbaron: Are you talking about event bubbling because you want to change
           :hover, or because you want to change what event handlers get?
   stearns: Yes. Both.
   jdovey: Issue on columns as well.
   stearns: Once we get to point of having addressable columns, can be done
            for columns
   stearns: If you want to know what page an event was on, would have page
            inserted in event/style loop
   stearns: I'm actually not sure whether bubbling for CSS :hover is actually
            defined anywhere
   stearns: I assume it does the same
   dbaron: It's not really bubbling, but it's defined
           http://dev.w3.org/csswg/selectors4/#the-hover-pseudo
           "The parent of an element that is :hover is also in that state. "

   stearns: One way to solve this, is, in a fragmentation context, insert
            the fragmentainer at the appropriate spot
   stearns: One more thing in the appropriate spot
   dino: If it's a region, then does it bounce back to the ancestor chain
         or go up the region's ancestors?
   stearns: Goes up the region's ancestors
   This essentially circumvents the element's own ancestor chain.

   TabAtkins: Problem you're describing is virtually identical to problem
              with Shadow DOM and events
   TabAtkins: Shadow DOM can rearrange content in a similar way
   TabAtkins: Regions is slightly more general issue, but can be safely
              generalized under this as well
   TabAtkins: Don't know precise details of what we do, but if you want
              details will have to ask Dmitry, who just went home
   stearns: Shadow DOM describes it as DOM manipulation
   stearns: Follow reordered DOM hierarchy
   TabAtkins: After reordering and following up

   TabAtkins: Things that aren't in the Shadow DOM have no way of telling
              that the event passed through the Shadow DOM.
   stearns: That's very important to shadow DOM, not so important here.
   TabAtkins: Could break things if you add pseudos you didn't expect.
   stearns: It will continue to multicol element, just one added stop.
   ... regions ...
   fantasai: In case of regions, you might wind up not hitting your ancestors,
             because going up region's ancestor chain now.
   fantasai: Whereas other cases, you always walk up all your ancestors,
             just might make extra stops along the way

   stearns: If you go through email thread linked from wiki
   stearns: Went through number of iterations trying to figure out how to
            preserve event bubbling chain.
   stearns: or dealing with this somehow
   stearns: everything got way too messy
   stearns: Once you've put content into this fragmented flow, makes more
            sense to me for events to follow region's ancestor chain.
   fantasai: Depends on what you're trying to do
   fantasai: Depends on how much you're scrambling the tree, and how much
             you are handling events locally vs. talking to things higher
             in the document tree.

   dino: Think it's very confusing to go up region chain
   dino: If you wrote selector parent-element > child-content
   dino: Expect that selector to apply
   dino: wrote parent-element:hover > child-content to work
   dino: But break that expectation
   stearns: ...
   stearns: But named flow, taking boxes from parent, putting them over here
   stearns: these boxes should be ones responding to user events because
            you made that disassociation

   dbaron: I find it really weird to have events not follow the DOM
   dbaron: They're a DOM structure
   dbaron: And I think separation of content and presentation makes it really
           weird for box-tree structure to mess with DOM structure
   stearns: Have a response to hover styling?
   dbaron: I think hover styling is separate from events
   TabAtkins: Can be easier to handle :hover going two directions up the
              tree, than events going up the tree
   TabAtkins: Could do complicated thing now with pseudo-classes, rather
              than events

   dean: what happens with elementFromPoint()?
   dbaron: it depends if there's content at that point in the region --
           you get the most deeply nested thing
   dino: Want to understand why :hover and events could be different
   dbaron: :hover is a CSS concept
   dino: Based on mouse events
   dbaron: That's changed over time. It happens to be true now.

   plinss: We have whole dichotomy of things like mouse events, that deal
           with geometry of presentation
   plinss: These fire at the DOM tree, kindof broken
   dbaron: We could have another type of mouse event that doesn't bubble,
           but that you fire at everything in that geometry.
   dbaron: We do sortof have that for mousover and mouseout

   Rossen: Going through iterations, another idea for adding region as a
           separate target
   * fantasai likes Rossen's idea best

   stearns: Another solution is to add a mode to pointer-events property
   stearns: So you could say for e.g. relpos'd box, events will follow box tree
   stearns: Other mode, other solution is to have this switch, where for
            certain elements that you choose, you have the event just run
            through the visual layers
   TabAtkins: element with fragment parent, goes to fragment parent rather
              than real parent?
   stearns: Goes to whatever's displayed underneath it, which in fragment
            case would be fragmentainer
   dino: One option is following DOM tree
   dino: second is following box tree
   dino: Third is following painting order
   stearns: Second solution is not doing the middle event
   stearns: Right now pointer-events can be normal, they go up the DOM tree
   stearns: Can say pointer-events: none;, which ignores pointer events
   stearns: Switch would trigger just painting order
   stearns: You'd get the relpos box and whatever is underneath it
   TabAtkins: So third one is elementsFromPoint() and walk that list

   plinss: Where are you setting this switch?
   The target of the element will decide on the path of the event
   dino: If you did something like this, set it on ancestor, does ???
   dino: Doing propagation based on painting order is quite complicated,
         because implementations might forget exactly the order for perf
         reasons
   some concerns about implementation all around
   TabAtkins: We have elementsFromPoint() already, regardless need to be
              able to get at that list
   stearns: For pointer-events: none, still need to have that info as well;
            that requires one answer, this case needs the whole stack

   TabAtkins: For the case that should hop through the fragment order,
              should that just be a generic box order movement?
   TabAtkins: Anything else outside fragmentation would also affect that

   stearns writes out options
     1) Fragment container insertion
     2) Painting order switch
   stearns: for #1, issue of where to put the fragmentation container in
            the order
   stearns: Painting order switch is more general, works for other positioning
            things as well, also works for any type of fragment container
   TabAtkins: Do have to define that the event path includes fragment containers
   TabAtkins: So can't lean on that concept entirely
   fantasai: We don't have those yet

   TabAtkins: So, suggesting go with paint order one for now, possibly also
              introduce box tree
   plinss: what's diff between paint order and box tree?
   TabAtkins: paint order just go through layers under that point
   TabAtkins: box tree would jump from element to its containing block,
              not hit things underneath it necessarily

   Rossen: ...
   Rossen; Final transformed position, thus actual behind element is the
           furthermost ?
   Rossen: Subtle difference, but makes a difference once you factor in
           transforms
   Rossen: and relpos I guess
   TabAtkins: Fine with leaving out box-tree

   asking about who implements elementsFromPoint()
   krit: Suggested couple months ago, not sure that anyone implements it
   dbaron: Don't see it in CSSOM or CSSOM View specs
   ...
   stearns: So if I'm reading the room correctly, people leaning towards
            pointer-event switch

   <Bert> (Other issue: If '::foo' is a region, then '::foo:hover' would
           be the expected synntax to select it in hover state... but that
           syntax is not allowed by css3-selectors.)
   Bert raises issue against Selectors 4
     ::first-line:hover e.g. makes sense, and would work
     ::first-line:nth-child() doesn't make sense
   fantasai points out that each pseudo-element has to define what it accepts
   Bert points out that we need to define which selectors are invalid
   (cause selector to be thrown out) and which simply don't match anything
   * glazou would say that ::first-line:nth-child() is not a problem since
            a visual line has no children so it selects nothing… we don't
            need to make it invalid
   </aside>

   dbaron: This is pretty scary, don't think we should make a change without
           checking with WebAPI folks
   RESOLVED: Work on pointer-events: elements-from-point solution that will
             walk the elementsFromPoint chain instead of the ancestor chain

Shapes
------

   stearns: One of the issues...
   stearns: Shapes specification
   stearns: Whether we should allow shapes from rendered content
   stearns: Think we should, but would like to push it to level 2
   <plinss> http://www.w3.org/mid/CDD64C22.3AD08%25stearns@adobe.com
   stearns: CSS Shapes atm defines getting shape from an image, and from
            shapes from basic shape syntax, and I think that is sufficient
            for first level
   stearns: already pushed off SVG elements. Would like to push off rendered
            content for now.

   dbaron: what is it?
   <Rossen> http://lists.w3.org/Archives/Public/www-style/2013May/0389.html
   stearns: E.g. you have an A rendered large, or repeated background, etc.
   stearns: I think it's useful thing to do, but very complicated
   Rossen: Think original motivation for that was around time when we were
           proposing shapes to begin with. One of the use cases was a type
           of article that becomes a shape
   Rossen: extracting shape from rendered text
   Rossen: drop-cap, with tight-wrap around it
   Rossen: That was original motivation. Agree it's advanced feature for
           current level of spec
   Rossen: If we want to move spec quicker and have big bang for our money
   Rossen: Having simpler shapes, easy to define
   Rossen: That would hold implementations for quite some time.
   fantasai: Makes sense to me. I would prioritize SVG shapes over this feature.
   TabAtkins: me too
   stearns: Any objections to moving this over?
   plinss: Images?
   stearns: No, they stay. That's biggest ask aside from SVG

   dino: At what resolution do you derive the shape?
   ...
   stearns: We'll solve that as we get to it
   ...
   dino: You might have an image that's displayed 100x100 but it's 10000x10000
         image, as you zoom you see more pixels, shape might change and suddenly
         impact layout
   TabAtkins: other changes due to not aligning to pixel boundaries too
   dino: Need to define exactly the operation you use, masking whatever
   stearns: agree

   liam: Could get almost effect of text-wrapping around A, by making path
         in SVG and wrapping around it
   stearns: could make polygon with basic shape syntax
   stearns: Aren't guaranteed to get the glyph you're expecting, though
   stearns: Other issue, in spec, that says ...
   krit: ???
   RESOLVED: Move contours from rendered content to next level

   stearns: Issue on spec on shapes from images
   stearns: Security concern of being able to determine contours of alpha
            channel of image
   TabAtkins: Could extract cross-domain info
   TabAtkins: Reasonably efficient attack, too
   plinss: Imagine image you're putting in page is bar graph of your account
           balances of your bank
   Same-origin or CORS
   TabAtkins: Work with Anne, he'll tell you what to do correctly.
   <dbaron> annevk is working on http://fetch.spec.whatwg.org/ which makes
            these things easier to define

Scribe: TabAtkins
   krit: Same-origin may not protect you if open redirectors are used.
   TabAtkins: That is always a concern for *everything* that's SOR.
   dino: I'm not sure SOR is enough.
   dino: [describes an attack that scribe didn't understand]
   stearns: You're assuming that a site is wrapping content around a secure
            image.
   dino: I'll describe the scenario better in the mail list.
   krit: For SVG images, that's one of the reasons SVG images aren't allowed
         to reference images from another domain.
   TabAtkins: The SVG issue is different. That's about being able to detect
               when an image is viewed, by including an external ref in that
               image.
   krit: It's a different attack, but same scenario.
   [please describe the attack better]

   stearns: New topic.  The idea is that we should add floats to exclusions,
            so we have one way of wrapping things around each other.
   stearns: I propose we don't.  Floats work within the wrapping context,
            and are their own crazy thing.
   TabAtkins: Does that mean we lose the "exclusions can auto-avoid eac
              other" switch?
   stearns: No, this is unrelated.
   Rossen: The two things are kind of disjoint...
   stearns: No, they're disjoint.  They work differently - it's defined in
            the spec.
   Rossen: Inline content at the same level as the float will avoid both
           floats and exclusions, but exclusions penetrate much higher.
   Rossen: So they really are disjoint in terms of geometry, and in the
           stack they have different behavior.
   Rossen: So keeping them separate is way easier.  From an impl point of
           view, I approached keeping them together with floats, but it
           started becoming a mess quickly.

   Bert: Is this just an impl issue?
   stearns: No, spec issue.  The spec says how to construct the wrapping
            context.
   stearns: The spec defines that floats create areas that content avoid.
   stearns: Question is to keep that, or to try and fully harmonize floats
            with exclusions so they act identically (rather than just similarly).
   Rossen: It will hypothetically allow you to have an impl with just exclusions,
           no floats.
   Bert: If you can explain how they'd behave differently, it would be
         appreciated.
   stearns: In the wrapping behavior, they behave the same, for a single
            float and a single exclusion.
   RESOLVED: Close the float/exclusion harmonizing issue.
             Exclusion wrapping context does not include floats.

Meeting closed for the day.

Received on Wednesday, 3 July 2013 00:24:49 UTC