Bläddra i källkod

LibWeb: Just ignore <script> elements that failed to load the script

We're never gonna be able to run them if we can't load them so just
let it go.
Andreas Kling 5 år sedan
förälder
incheckning
17d26b92f8

+ 13 - 8
Libraries/LibWeb/DOM/HTMLScriptElement.cpp

@@ -190,14 +190,19 @@ void HTMLScriptElement::prepare_script(Badge<HTMLDocumentParser>)
         // FIXME: Check classic vs. module script type
 
         // FIXME: This load should be made asynchronous and the parser should spin an event loop etc.
-        ResourceLoader::the().load_sync(url, [this, url](auto& data, auto&) {
-            if (data.is_null()) {
-                dbg() << "HTMLScriptElement: Failed to load " << url;
-                return;
-            }
-            m_script_source = String::copy(data);
-            script_became_ready();
-        });
+        ResourceLoader::the().load_sync(
+            url,
+            [this, url](auto& data, auto&) {
+                if (data.is_null()) {
+                    dbg() << "HTMLScriptElement: Failed to load " << url;
+                    return;
+                }
+                m_script_source = String::copy(data);
+                script_became_ready();
+            },
+            [this](auto&) {
+                m_failed_to_load = true;
+            });
     } else {
         // FIXME: Check classic vs. module script type
         m_script_source = source_text;

+ 2 - 0
Libraries/LibWeb/DOM/HTMLScriptElement.h

@@ -41,6 +41,7 @@ public:
 
     bool is_non_blocking() const { return m_non_blocking; }
     bool is_ready_to_be_parser_executed() const { return m_ready_to_be_parser_executed; }
+    bool failed_to_load() const { return m_failed_to_load; }
 
     void set_parser_document(Badge<HTMLDocumentParser>, Document&);
     void set_non_blocking(Badge<HTMLDocumentParser>, bool);
@@ -60,6 +61,7 @@ private:
     bool m_from_an_external_file { false };
     bool m_script_ready { false };
     bool m_ready_to_be_parser_executed { false };
+    bool m_failed_to_load { false };
 
     Function<void()> m_script_ready_callback;
 

+ 3 - 0
Libraries/LibWeb/Parser/HTMLDocumentParser.cpp

@@ -1476,6 +1476,9 @@ void HTMLDocumentParser::handle_text(HTMLToken& token)
                 //        that is blocking scripts and the script's "ready to be parser-executed"
                 //        flag is set.
 
+                if (the_script->failed_to_load())
+                    return;
+
                 ASSERT(the_script->is_ready_to_be_parser_executed());
 
                 if (m_aborted)