MicrosoftEdge / MicrosoftEdge/WebView2Feedback

Hololens2 virtual keyboard not opening after javascript "beforeunload" event

Open
#3,654 3 comments 0 reactions 1 assignee View on GitHub

@champnic is already working on this.

Since Jul 20, 2023.

bug tracked
Dominant language
PowerShell
Stars
526
Forks
67
PR merge metrics
No merged PRs in 30d

Description

Description

Hololens2 virtual keyboard not opening after javascript "beforeunload" event.

Version
SDK: com.microsoft.mixedreality.webview.unity-0.17.1-pre.3.tgz
Runtime: Unity2020.3.33
Framework: Unity2020.3.33, MRTK2.8.3
OS: (Hololens2) 22621.1120.arm64fre.ni_release_svc_sydney_rel_prod.230707-1012

Regression
Was this working before but has regressed? > No.
If yes, what version did this last work on?

Repro Steps

  1. Clone this repository.
    https://github.com/MicrosoftEdge/WebView2Samples/
  2. Resolve compilation errors
    • Do "Restore Features" in Mixed Reality Feature Tool.
    • remove this line from package.json
      "com.unity.collab-proxy": "2.0.3",
      
  3. Open this sample in UnityEditor.
    https://github.com/MicrosoftEdge/WebView2Samples/tree/main/GettingStartedGuides/HoloLens2_GettingStarted/HoloLens2GetStartedApp
  4. Set "Current URL" of "WebView"
    https://ydev0927.github.io/ForWebView2Issues/beforeunload_page.html
<!-- beforeunload_page.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page</title>
    <script type="text/javascript">
        window.addEventListener('beforeunload', (event) => {
            event.preventDefault();
            event.returnValue = '';
        });
    </script>
</head>
<body>
    <input type="text" />
    <br><br>
    <input type="button" onclick="alert('test')" value="alert" />
    <br><br>
    <a href="./beforeunload_page.html">reload</a>
</body>
</html>
  1. Attach this script to "Canvas"
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.WebView;
using UnityEngine;

public class WebViewInputProvider : MonoBehaviour, IMixedRealityPointerHandler
{
    WebView webViewComponent => GetComponentInChildren<WebView>();

    private IWebView webView;

    private void Start()
    {
        webViewComponent.GetWebViewWhenReady((IWebView webView) =>
        {
            this.webView = webView;
        });
    }

    private void SendMouseButton(Vector2 webViewPoint, WebViewMouseEventData.EventType eventType)
    {
        IWithMouseEvents mouseEventsWebView = webView as IWithMouseEvents;
        if (mouseEventsWebView == null)
            return;

        WebViewMouseEventData mouseEvent = new WebViewMouseEventData
        {
            X = (int)webViewPoint.x,
            Y = (int)webViewPoint.y,
            Type = eventType,
            Button = WebViewMouseEventData.MouseButton.ButtonLeft,
            TertiaryAxisDeviceType = WebViewMouseEventData.TertiaryAxisDevice.PointingDevice
        };

        // Propagate the event to the WebView plugin.
        mouseEventsWebView.MouseEvent(mouseEvent);
    }

    private Vector2 ConvertToWebViewSpace(Vector3 worldPos)
    {
        var localPos = webViewComponent.transform.InverseTransformPoint(worldPos);
        var localXYperBase = new Vector2(localPos.x, localPos.y);
        var localXYper = (localXYperBase * new Vector2(1, -1)) + new Vector2(0.5f, 0.5f);
        var localXY = new Vector2(webView.Width, webView.Height) * localXYper;
        return localXY;
    }

    public void OnPointerDown(MixedRealityPointerEventData eventData) => OnPointerDown(eventData.Pointer.Result.Details.Point);
    private void OnPointerDown(Vector3 point)
    {
        var webViewSpacePoint = ConvertToWebViewSpace(point);
        SendMouseButton(webViewSpacePoint, WebViewMouseEventData.EventType.MouseDown);
    }

    public void OnPointerDragged(MixedRealityPointerEventData eventData) => OnPointerDragged(eventData.Pointer.Result.Details.Point);
    private void OnPointerDragged(Vector3 point)
    {
        var webViewSpacePoint = ConvertToWebViewSpace(point);
        SendMouseButton(webViewSpacePoint, WebViewMouseEventData.EventType.MouseMove);
    }

    public void OnPointerUp(MixedRealityPointerEventData eventData) => OnPointerUp(eventData.Pointer.Result.Details.Point);
    private void OnPointerUp(Vector3 point)
    {
        var webViewSpacePoint = ConvertToWebViewSpace(point);
        SendMouseButton(webViewSpacePoint, WebViewMouseEventData.EventType.MouseUp);
    }

    public void OnPointerClicked(MixedRealityPointerEventData eventData)
    {
    }
}
  1. Run on Hololens.
    Tapping opens a virtual keyboard.
    But when I tap after tapping "reload", the virtual keyboard doesn't open.

Screenshots

Additional context

AB#45673465

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.