Skip to content

Commit

Permalink
Switch to Shiny.renderDependenciesAsync()
Browse files Browse the repository at this point in the history
Loading dependencies asynchronously avoids an issue in Google Chrome
where sync XHR skips Service Workers. This fixes DT and potentially
other packages using htmlwidgets that load <script> tags dynamically.
  • Loading branch information
georgestagg committed Mar 18, 2024
1 parent 7928dc2 commit 892798f
Showing 1 changed file with 25 additions and 24 deletions.
49 changes: 25 additions & 24 deletions inst/www/htmlwidgets.js
Original file line number Diff line number Diff line change
Expand Up @@ -512,32 +512,33 @@
// supported natively by Shiny at the time of this writing.

shinyBinding.renderValue = function(el, data) {
Shiny.renderDependencies(data.deps);
// Resolve strings marked as javascript literals to objects
if (!(data.evals instanceof Array)) data.evals = [data.evals];
for (var i = 0; data.evals && i < data.evals.length; i++) {
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
}
if (!bindingDef.renderOnNullValue) {
if (data.x === null) {
el.style.visibility = "hidden";
return;
} else {
el.style.visibility = "inherit";
Shiny.renderDependenciesAsync(data.deps).then(() => {
// Resolve strings marked as javascript literals to objects
if (!(data.evals instanceof Array)) data.evals = [data.evals];
for (var i = 0; data.evals && i < data.evals.length; i++) {
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
}
}
if (!elementData(el, "initialized")) {
initSizing(el);

elementData(el, "initialized", true);
if (bindingDef.initialize) {
var rect = el.getBoundingClientRect();
var result = bindingDef.initialize(el, rect.width, rect.height);
elementData(el, "init_result", result);
if (!bindingDef.renderOnNullValue) {
if (data.x === null) {
el.style.visibility = "hidden";
return;
} else {
el.style.visibility = "inherit";
}
}
}
bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
if (!elementData(el, "initialized")) {
initSizing(el);

elementData(el, "initialized", true);
if (bindingDef.initialize) {
var rect = el.getBoundingClientRect();
var result = bindingDef.initialize(el, rect.width, rect.height);
elementData(el, "init_result", result);
}
}
bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
});
};

// Only override resize if bindingDef implements it
Expand Down

0 comments on commit 892798f

Please sign in to comment.