mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:52:44 +00:00 
			
		
		
		
	LibWeb: Defer creation of subframes until host element is connected
This allows parsing of document fragments with "<iframe>" to construct the iframe element without requiring that the fragment have a frame.
This commit is contained in:
		
							parent
							
								
									57ead17d54
								
							
						
					
					
						commit
						5c67b2cb8f
					
				
					 4 changed files with 22 additions and 2 deletions
				
			
		|  | @ -41,6 +41,15 @@ FrameHostElement::~FrameHostElement() | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void FrameHostElement::inserted_into(Node& parent) | ||||||
|  | { | ||||||
|  |     HTMLElement::inserted_into(parent); | ||||||
|  |     if (!is_connected()) | ||||||
|  |         return; | ||||||
|  |     if (auto* frame = document().frame()) | ||||||
|  |         m_content_frame = Frame::create_subframe(*this, frame->main_frame()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| Origin FrameHostElement::content_origin() const | Origin FrameHostElement::content_origin() const | ||||||
| { | { | ||||||
|     if (!m_content_frame || !m_content_frame->document()) |     if (!m_content_frame || !m_content_frame->document()) | ||||||
|  |  | ||||||
|  | @ -45,6 +45,8 @@ public: | ||||||
| 
 | 
 | ||||||
|     void content_frame_did_load(Badge<FrameLoader>); |     void content_frame_did_load(Badge<FrameLoader>); | ||||||
| 
 | 
 | ||||||
|  |     virtual void inserted_into(Node&) override; | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
|     RefPtr<Frame> m_content_frame; |     RefPtr<Frame> m_content_frame; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -35,8 +35,6 @@ namespace Web::HTML { | ||||||
| HTMLIFrameElement::HTMLIFrameElement(DOM::Document& document, QualifiedName qualified_name) | HTMLIFrameElement::HTMLIFrameElement(DOM::Document& document, QualifiedName qualified_name) | ||||||
|     : FrameHostElement(document, move(qualified_name)) |     : FrameHostElement(document, move(qualified_name)) | ||||||
| { | { | ||||||
|     VERIFY(document.frame()); |  | ||||||
|     m_content_frame = Frame::create_subframe(*this, document.frame()->main_frame()); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| HTMLIFrameElement::~HTMLIFrameElement() | HTMLIFrameElement::~HTMLIFrameElement() | ||||||
|  | @ -56,8 +54,18 @@ void HTMLIFrameElement::parse_attribute(const FlyString& name, const String& val | ||||||
|         load_src(value); |         load_src(value); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void HTMLIFrameElement::inserted_into(Node& parent) | ||||||
|  | { | ||||||
|  |     FrameHostElement::inserted_into(parent); | ||||||
|  |     if (is_connected()) | ||||||
|  |         load_src(attribute(HTML::AttributeNames::src)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void HTMLIFrameElement::load_src(const String& value) | void HTMLIFrameElement::load_src(const String& value) | ||||||
| { | { | ||||||
|  |     if (!m_content_frame) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|     auto url = document().complete_url(value); |     auto url = document().complete_url(value); | ||||||
|     if (!url.is_valid()) { |     if (!url.is_valid()) { | ||||||
|         dbgln("iframe failed to load URL: Invalid URL: {}", value); |         dbgln("iframe failed to load URL: Invalid URL: {}", value); | ||||||
|  |  | ||||||
|  | @ -40,6 +40,7 @@ public: | ||||||
|     virtual RefPtr<Layout::Node> create_layout_node() override; |     virtual RefPtr<Layout::Node> create_layout_node() override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |     virtual void inserted_into(Node&) override; | ||||||
|     virtual void parse_attribute(const FlyString& name, const String& value) override; |     virtual void parse_attribute(const FlyString& name, const String& value) override; | ||||||
| 
 | 
 | ||||||
|     void load_src(const String&); |     void load_src(const String&); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling