Skip to content

Commit

Permalink
Embedded iFrame inside new <fx-webview> HTML container
Browse files Browse the repository at this point in the history
  • Loading branch information
salmonb committed Dec 11, 2023
1 parent db9f32d commit 395d0ea
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 15 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package dev.webfx.kit.mapper.peers.javafxweb.spi.gwt;

import dev.webfx.kit.mapper.peers.javafxgraphics.HasNoChildrenPeers;
import dev.webfx.kit.mapper.peers.javafxgraphics.gwt.html.HtmlNodePeer;
import dev.webfx.kit.mapper.peers.javafxgraphics.gwt.util.HtmlUtil;
import dev.webfx.platform.util.Strings;
import elemental2.dom.CSSProperties;
import elemental2.dom.DomGlobal;
import elemental2.dom.HTMLElement;
import elemental2.dom.HTMLIFrameElement;
import javafx.event.EventHandler;
import javafx.scene.web.WebErrorEvent;
Expand All @@ -16,17 +18,21 @@
public class HtmlWebViewPeer
<N extends WebView, NB extends EmulWebViewPeerBase<N, NB, NM>, NM extends EmulWebViewPeerMixin<N, NB, NM>>
extends HtmlNodePeer<N, NB, NM>
implements EmulWebViewPeerMixin<N, NB, NM> {
implements EmulWebViewPeerMixin<N, NB, NM>, HasNoChildrenPeers {

private final HTMLIFrameElement iFrame;

public HtmlWebViewPeer() {
this((NB) new EmulWebViewPeerBase(), HtmlUtil.createElement("iframe"));
this((NB) new EmulWebViewPeerBase(), HtmlUtil.createElement("fx-webview"));
}

public HtmlWebViewPeer(NB base, HTMLIFrameElement iFrame) {
super(base, iFrame);
this.iFrame = iFrame;
public HtmlWebViewPeer(NB base, HTMLElement webViewElement) {
super(base, webViewElement);
// There will be only child which will be an iFrame to display and load the web content.
iFrame = HtmlUtil.createElement("iframe");
HtmlUtil.setChild(getContainer(), iFrame);
HtmlUtil.setStyleAttribute(iFrame, "width", "100%"); // 100% of <fx-webview>
HtmlUtil.setStyleAttribute(iFrame, "height", "100%"); // 100% of <fx-webview>
// Allowing fullscreen for videos
HtmlUtil.setAttribute(iFrame, "allowfullscreen", "true");
// Error management. Actually this listener is never called by the browser for an unknown reason. So if it's
Expand Down Expand Up @@ -55,6 +61,10 @@ public HtmlWebViewPeer(NB base, HTMLIFrameElement iFrame) {
});
}

public HTMLIFrameElement getIFrame() { // called by GwtWebEnginePeer
return iFrame;
}

private void reportError() {
EventHandler<WebErrorEvent> onError = getNode().getEngine().getOnError();
if (onError != null)
Expand All @@ -63,12 +73,12 @@ private void reportError() {

@Override
public void updateWidth(Number width) {
iFrame.style.width = CSSProperties.WidthUnionType.of(toPx(width.doubleValue()));
getElement().style.width = CSSProperties.WidthUnionType.of(toPx(width.doubleValue()));
}

@Override
public void updateHeight(Number height) {
iFrame.style.height = CSSProperties.HeightUnionType.of(toPx(height.doubleValue()));
getElement().style.height = CSSProperties.HeightUnionType.of(toPx(height.doubleValue()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import dev.webfx.kit.mapper.peers.javafxweb.spi.gwt.HtmlWebViewPeer;
import dev.webfx.kit.util.properties.FXProperties;
import dev.webfx.platform.scheduler.Scheduler;
import elemental2.dom.DomGlobal;
import elemental2.dom.HTMLIFrameElement;
import elemental2.dom.Window;
import javafx.concurrent.Worker;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
Expand All @@ -15,21 +17,24 @@
final class GwtWebEnginePeer extends WebEnginePeerBase {

private final WebEngine webEngine;
private HTMLIFrameElement iFrame;

public GwtWebEnginePeer(WebEngine webEngine) {
this.webEngine = webEngine;
WebView webView = webEngine.getWebView();
FXProperties.runNowAndOnPropertiesChange(e -> updateState(), webView.sceneProperty());
}

private Window getScriptWindow() {
HTMLIFrameElement iFrame = null;
HtmlWebViewPeer peer = (HtmlWebViewPeer) webEngine.getWebView().getNodePeer();
if (peer != null)
iFrame = peer.getIFrame();
return iFrame == null ? DomGlobal.window : iFrame.contentWindow;
}

private void updateState() {
if (iFrame == null) {
HtmlWebViewPeer peer = (HtmlWebViewPeer) webEngine.getWebView().getNodePeer();
if (peer != null)
iFrame = (HTMLIFrameElement) peer.getElement();
}
if (iFrame != null && iFrame.contentWindow != null)
Window scriptWindow = getScriptWindow();
if (scriptWindow != null)
worker.setState(Worker.State.READY);
else {
worker.setState(Worker.State.SCHEDULED);
Expand All @@ -40,7 +45,7 @@ private void updateState() {

@Override
public Object executeScript(String script) {
Object result = GwtJSObject.eval(iFrame.contentWindow, script);
Object result = GwtJSObject.eval(getScriptWindow(), script);
return GwtJSObject.wrapJSObject(result);
}

Expand Down

0 comments on commit 395d0ea

Please sign in to comment.