Skip to content

Commit 14743b5

Browse files
committed
fix: defer browser evaluations until DOM is ready in hover control
Ensure all JavaScript evaluations in FocusableBrowserInformationControl only occur after `document.readyState === 'complete'` to prevent runtime errors when accessing incomplete DOM elements, such as: `org.eclipse.swt.SWTException: Cannot read properties of null (reading 'scrollWidth')`
1 parent 8353819 commit 14743b5

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/FocusableBrowserInformationControl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.eclipse.swt.graphics.RGB;
3535
import org.eclipse.swt.widgets.Composite;
3636
import org.eclipse.swt.widgets.Shell;
37+
import org.eclipse.tm4e.ui.internal.utils.UI;
3738
import org.eclipse.ui.editors.text.EditorsUI;
3839
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
3940

@@ -92,11 +93,19 @@ protected void createContent(Composite parent) {
9293
}
9394

9495
private void updateBrowserSize(final Browser browser) {
96+
if (browser.isDisposed())
97+
return;
98+
9599
@Nullable
96100
Point constraints = getSizeConstraints();
97101
Point hint = computeSizeHint();
98102
setSize(hint.x, hint.y);
99103

104+
if (!"complete".equals(safeEvaluate(browser, "return document.readyState"))) { //$NON-NLS-1$ //$NON-NLS-2$
105+
UI.getDisplay().timerExec(200, () -> updateBrowserSize(browser));
106+
return;
107+
}
108+
100109
safeExecute(browser, "document.getElementsByTagName(\"html\")[0].style.whiteSpace = \"nowrap\""); //$NON-NLS-1$
101110
Double width = 20 + (safeEvaluate(browser, "return document.body.scrollWidth;") instanceof Double evaluated ? evaluated : 0); //$NON-NLS-1$
102111
setSize(width.intValue(), hint.y);

0 commit comments

Comments
 (0)