Re: Include out of viewport frames in display list

Boris Zbarsky <[email protected]> Wed, 20 Jul 2016 10:31:02 -0400
Newsgroups gmane.comp.mozilla.devel.layout
Message-ID <[email protected]>
On 7/20/16 9:16 AM, [email protected] wrote:
> Then when I try to assign it, I get this error:
>
>  8:10.55 In file included from /build/dom/base/Unified_cpp_dom_base5.cpp:92:
>  8:10.55 /source/release/dom/base/nsDocument.cpp:3580:18: error: no viable overloaded '='
>  8:10.55         e->mNode = node;
>  8:10.55         ~~~~~~~~ ^ ~~~~
>  8:10.55 /build/dist/include/mozilla/dom/BindingDeclarations.h:297:7: note: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'nsIContent *' to 'const mozilla::dom::Optional<mozilla::OwningNonNull<nsINode> >' for 1st argument
>  8:10.55 class Optional<OwningNonNull<T> > : public Optional_base<T, OwningNonNull<T> >
>  8:10.55       ^
>  8:11.94 1 error generated.
>
> I understood from your reply that I should make the Node variable required. But the documentation doesn't show how this works.

That's because "required" is a WebIDL spec concept, not a Mozilla 
extenson.  How it works is covered by the spec.

The way you do it is like this:

   dictionary myFunctionElementInfo {
     required Node node;
   };

That will make the dictionary member be an OwningNonNull<nsINode> 
instead of an Optional<OwningNonNull<nsINode>>.

> This doesn't:
> dictionary myFunctionElementInfo {
>   Element element;
> };

I'm guessing that the problem is that doing that causes 
DocumentBinding.h to include Element.h.  Presumably Element.h 
(indirectly) includes nsIDocument.h; not sure what the exact path is 
here.  nsIDocument.h includes DocumentBinding.h.  So you end up with an 
#include loop, and some things never end up included correctly.

> It gives many errors similar to this:
>  0:12.03 /build/dist/include/mozilla/dom/Element.h:810:12: error: incomplete type 'nsPresContext' named in nested name specifier
>  0:12.03            nsPresContext::AppUnitsToIntCSSPixels(sf->GetScrollRange().XMost()) :
>  0:12.03            ^~~~~~~~~~~~~~~

The interesting thing here is the very _first_ error it gives.

> I'm not sure if I need Node or Element in my case, I just want to return the HTML elements so I can do more with them on the JavaScript side. The return value of ElementsFromPoint() is what I'm after, so that's why I think I need to use Element instead of Node.

It doesn't matter, really.  You can use Node; it'll still be the same 
thing on the JS side.

You could also put your dictionary in a separate webidl file, so it 
doesn't change the includes for DocumentBinding.h.  Then as long as you 
just forward-declare the dictionary type in nsIDocument.h and include 
your new binding header in nsDocument.cpp things will be fine.

-Boris