52 m_html_blob = url.
fetch();
57 if (!m_dom)
return false;
59 std::vector<IScriptObject*> deferred;
61 if (
auto elem_root = m_dom->get_node(
"head"); elem_root)
65 for (
auto elem = elem_root->first_node(); elem; elem = elem->next_sibling())
67 elem_nm = elem->name();
69 if (elem_nm ==
"title")
71 m_tab_name = elem->value();
73 else if (elem_nm ==
"script")
75 if (elem->first_attribute(
"href"))
77 String script_src = elem->first_attribute(
"href")->value();
79 if (script_src.starts_with(
"http://") || script_src.starts_with(
"https://"))
81 auto src = m_tab_url.get() + script_src;
90 if (!elem->first_attribute(
"href")->next_attribute(
"defer"))
92 auto script_inside = IScriptObject::make_script_object(
in);
96 script_inside->execute();
101 deferred.push_back(IScriptObject::make_script_object(
in));
106 if (!elem->first_attribute(
"defer") && elem->value())
108 auto script = IScriptObject::make_script_object(elem->value());
115 else if (elem->value())
117 deferred.push_back(IScriptObject::make_script_object(elem->value()));
123 for (
auto&
script : deferred)
132 if (
auto elem_root = m_dom->get_node(
"body"); elem_root)
139 for (
auto elem = elem_root->first_node(); elem; elem = elem->next_sibling())
141 elem_nm = elem->name();
150 char* v = elem->value();
166 m_document_root->insert_child_element(text);
168 else if (elem_nm ==
"h2")
175 char* v = elem->value();
191 m_document_root->insert_child_element(text);
193 else if (elem_nm ==
"h3")
202 char* v = elem->value();
216 m_document_root->insert_child_element(text);
218 else if (elem_nm ==
"h4" || elem_nm ==
"h5")
223 text->
set_heading((elem_nm ==
"h4") ? RenderSystemTextDOM::kHeading4
224 : RenderSystemTextDOM::kHeading5);
228 char* v = elem->value();
242 m_document_root->insert_child_element(text);
244 else if (elem_nm ==
"br")
248 else if (elem_nm ==
"h6")
257 char* v = elem->value();
271 m_document_root->insert_child_element(text);
273 else if (elem_nm ==
"button")
278 text->
set_heading(RenderSystemTextDOM::kHeadingParagraph);
283 m_document_root->insert_child_element(text);
285 else if (elem_nm ==
"script")
287 if (elem->first_attribute(
"href"))
289 String script_src = elem->first_attribute(
"href")->value();
291 if (script_src.starts_with(
"http://") || script_src.starts_with(
"https://"))
293 auto src = m_tab_url.get() + script_src;
302 if (!elem->first_attribute(
"href")->next_attribute(
"defer"))
304 auto script_inside = IScriptObject::make_script_object(
in);
308 script_inside->execute();
313 deferred.push_back(IScriptObject::make_script_object(
in));
318 if (!elem->first_attribute(
"defer") && elem->value())
320 auto script = IScriptObject::make_script_object(elem->value());
327 else if (elem->value())
329 deferred.push_back(IScriptObject::make_script_object(elem->value()));
332 else if (elem_nm ==
"img")
336 String image_src = elem->first_attribute(
"src")->value();
338 if (!image_src.starts_with(
"http://") && !image_src.starts_with(
"https://") &&
339 !image_src.starts_with(
"file://"))
341 image_src = m_tab_url.protocol() +
"://" + m_tab_url.get() +
"/" + image_src;
345 [[NSURL alloc] initWithString:[NSString stringWithUTF8String:image_src.c_str()]]);
347 text->
set_heading(RenderSystemTextDOM::kHeadingParagraph);
353 m_document_root->insert_child_element(text);
355 else if (elem_nm ==
"p" || elem_nm ==
"b" || elem_nm ==
"strong")
360 text->
set_heading((elem_nm ==
"b" || elem_nm ==
"strong")
361 ? RenderSystemTextDOM::kHeadingBold
362 : RenderSystemTextDOM::kHeadingParagraph);
366 char* v = elem->value();
380 m_document_root->insert_child_element(text);
385 for (
auto&
script : deferred)
392 m_tab_handle = win.
tab(m_tab_name);
393 m_document_root->insert_element(m_tab_handle);
397 catch (
const std::runtime_error& err)