mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-06-11 01:25:53 -04:00
Apply endEvaluationWindow in more places
This commit is contained in:
@@ -1762,7 +1762,7 @@ pub fn loadExternalStylesheet(self: *Frame, link: *Element.Html.Link, href: []co
|
||||
const sm = &self._script_manager.base;
|
||||
const was_evaluating = sm.is_evaluating;
|
||||
sm.is_evaluating = true;
|
||||
defer sm.is_evaluating = was_evaluating;
|
||||
defer sm.endEvaluationWindow(was_evaluating);
|
||||
|
||||
var response = http_client.syncRequest(arena, .{
|
||||
.url = resolved,
|
||||
|
||||
@@ -96,7 +96,7 @@ owner: Owner,
|
||||
is_evaluating: bool,
|
||||
|
||||
// an evaluate() arrived while is_evaluating was set, signal to call evaluate()
|
||||
// when is_evaluating becomes false (to prevent reentrency)
|
||||
// when is_evaluating becomes false (to prevent re-entrancy)
|
||||
evaluate_pending: bool = false,
|
||||
|
||||
// Only once this is true can deferred scripts be run
|
||||
@@ -171,6 +171,7 @@ pub fn reset(self: *ScriptManagerBase) void {
|
||||
clearList(&self.async_scripts);
|
||||
clearList(&self.ready_scripts);
|
||||
self.static_scripts_done = false;
|
||||
self.evaluate_pending = false;
|
||||
}
|
||||
|
||||
fn clearList(list: *std.DoublyLinkedList) void {
|
||||
@@ -355,10 +356,9 @@ pub fn getAsyncImport(self: *ScriptManagerBase, url: [:0]const u8, cb: ImportAsy
|
||||
}
|
||||
|
||||
// It's possible, but unlikely, for client.request to immediately finish
|
||||
// a request, thus calling our callback. We generally don't want a call
|
||||
// from v8 (which is why we're here), to result in a new script evaluation.
|
||||
// So we block even the slightest change that `client.request` immediately
|
||||
// executes a callback.
|
||||
// a request, thus calling our callback. We don't want that to trigger a
|
||||
// script evaluation while we're still setting the request up (the script
|
||||
// isn't fully linked into our lists yet).
|
||||
const was_evaluating = self.is_evaluating;
|
||||
self.is_evaluating = true;
|
||||
defer self.endEvaluationWindow(was_evaluating);
|
||||
@@ -410,14 +410,14 @@ pub fn scriptCreatedParseDone(self: *ScriptManagerBase) void {
|
||||
pub fn evaluate(self: *ScriptManagerBase) void {
|
||||
if (self.is_evaluating) {
|
||||
// It's possible for a script.eval to cause evaluate to be called again.
|
||||
// signal that this happened so that when we're done the outer-evaluate
|
||||
// we can evaluate() again to catch these that we're gonna skip now.
|
||||
// Signal that this happened so that, once the outer evaluate finishes,
|
||||
// we evaluate() again to catch what we're skipping now.
|
||||
self.evaluate_pending = true;
|
||||
return;
|
||||
}
|
||||
|
||||
self.is_evaluating = true;
|
||||
defer self.is_evaluating = false;
|
||||
defer self.endEvaluationWindow(false);
|
||||
|
||||
while (true) {
|
||||
self.evaluate_pending = false;
|
||||
|
||||
Reference in New Issue
Block a user