MicrosoftEdge / WebView2Feedback

Feedback and discussions about Microsoft Edge WebView2
https://aka.ms/webview2
440 stars 51 forks source link

Hololens2 virtual keyboard not opening after javascript "beforeunload" event #3654

Open ydev0927 opened 1 year ago

ydev0927 commented 1 year ago

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>
  5. Attach this script to "Canvas"

    
    using Microsoft.MixedReality.Toolkit.Input;
    using Microsoft.MixedReality.WebView;
    using UnityEngine;

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

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)
{
}

}



6. Run on Hololens.
Tapping <input> opens a virtual keyboard.
But when I tap <input> after tapping "reload", the virtual keyboard doesn't open.

<!-- Extra / Helpful -->
**Screenshots**

**Additional context**

[AB#45673465](https://microsoft.visualstudio.com/90b2a23c-cab8-4e7c-90e7-a977f32c1f5d/_workitems/edit/45673465)
champnic commented 1 year ago

@ydev0927 Thanks for the bug report, and sorry you are running into this. I saw you were also the one who opened #3624. Similar to that issue, does this repro using the editor only, or also when deploying to the physical device?

ydev0927 commented 1 year ago

@champnic Sorry for posting too many. This issue only occurs on physical device.

champnic commented 1 year ago

No worries, and thanks for the info. I've added this bug to our backlog.