mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52:45 +00:00 
			
		
		
		
	LibWeb: Don't update rendering in BrowsingContexts without opportunity
This patch adds the "has a rendering opportunity" concept from the spec to BrowsingContext and uses it to filter out contexts that are unable to render right now when doing the event loop's rendering updates. Note that we actually consider all contexts to have a rendering opportunity at all times right now. Coming up with reasons to avoid rendering is left as a FIXME. :^)
This commit is contained in:
		
							parent
							
								
									6e341cd696
								
							
						
					
					
						commit
						962298b040
					
				
					 3 changed files with 17 additions and 1 deletions
				
			
		|  | @ -12,6 +12,7 @@ | ||||||
| #include <LibWeb/DOM/Window.h> | #include <LibWeb/DOM/Window.h> | ||||||
| #include <LibWeb/HTML/EventLoop/EventLoop.h> | #include <LibWeb/HTML/EventLoop/EventLoop.h> | ||||||
| #include <LibWeb/HighResolutionTime/Performance.h> | #include <LibWeb/HighResolutionTime/Performance.h> | ||||||
|  | #include <LibWeb/Page/BrowsingContext.h> | ||||||
| 
 | 
 | ||||||
| namespace Web::HTML { | namespace Web::HTML { | ||||||
| 
 | 
 | ||||||
|  | @ -139,7 +140,10 @@ void EventLoop::process() | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     // FIXME:     2. Rendering opportunities: Remove from docs all Document objects whose browsing context do not have a rendering opportunity.
 |     // 2. Rendering opportunities: Remove from docs all Document objects whose browsing context do not have a rendering opportunity.
 | ||||||
|  |     docs.remove_all_matching([&](auto& document) { | ||||||
|  |         return document->browsing_context() && !document->browsing_context()->has_a_rendering_opportunity(); | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|     // 3. If docs is not empty, then set hasARenderingOpportunity to true.
 |     // 3. If docs is not empty, then set hasARenderingOpportunity to true.
 | ||||||
|     if (!docs.is_empty()) |     if (!docs.is_empty()) | ||||||
|  |  | ||||||
|  | @ -348,4 +348,14 @@ DOM::Document const* BrowsingContext::container_document() const | ||||||
|     return nullptr; |     return nullptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // https://html.spec.whatwg.org/#rendering-opportunity
 | ||||||
|  | bool BrowsingContext::has_a_rendering_opportunity() const | ||||||
|  | { | ||||||
|  |     // A browsing context has a rendering opportunity if the user agent is currently able to present the contents of the browsing context to the user,
 | ||||||
|  |     // accounting for hardware refresh rate constraints and user agent throttling for performance reasons, but considering content presentable even if it's outside the viewport.
 | ||||||
|  | 
 | ||||||
|  |     // FIXME: We should at the very least say `false` here if we're an inactive browser tab.
 | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -102,6 +102,8 @@ public: | ||||||
|     DOM::Document* container_document(); |     DOM::Document* container_document(); | ||||||
|     DOM::Document const* container_document() const; |     DOM::Document const* container_document() const; | ||||||
| 
 | 
 | ||||||
|  |     bool has_a_rendering_opportunity() const; | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     explicit BrowsingContext(Page&, HTML::BrowsingContextContainer*); |     explicit BrowsingContext(Page&, HTML::BrowsingContextContainer*); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling