// Copyright (c) 2022 Vuplex Inc. All rights reserved. // // Licensed under the Vuplex Commercial Software Library License, you may // not use this file except in compliance with the License. You may obtain // a copy of the License at // // https://vuplex.com/commercial-library-license // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using UnityEngine; namespace Vuplex.WebView.Demos { /// /// Sets up the CanvasPopupDemo scene, which demonstrates how to use /// the IWithPopups interface with CanvasWebViewPrefab. /// /// /// Links:
/// - CanvasWebViewPrefab docs: https://developer.vuplex.com/webview/CanvasWebViewPrefab
/// - IWithPopups: https://developer.vuplex.com/webview/IWithPopups
/// - How clicking works: https://support.vuplex.com/articles/clicking
/// - Other examples: https://developer.vuplex.com/webview/overview#examples
///
class CanvasPopupDemo : MonoBehaviour { GameObject _canvas; CanvasWebViewPrefab _focusedPrefab; HardwareKeyboardListener _hardwareKeyboardListener; async void Start() { _canvas = GameObject.Find("Canvas"); // Create a webview for the main content. var mainWebViewPrefab = CanvasWebViewPrefab.Instantiate(); mainWebViewPrefab.Resolution = 1.5f; mainWebViewPrefab.PixelDensity = 2; mainWebViewPrefab.Native2DModeEnabled = true; mainWebViewPrefab.transform.SetParent(_canvas.transform, false); var rectTransform = mainWebViewPrefab.transform as RectTransform; rectTransform.anchoredPosition3D = Vector3.zero; rectTransform.offsetMin = Vector2.zero; rectTransform.offsetMax = Vector2.zero; mainWebViewPrefab.transform.localScale = Vector3.one; _focusedPrefab = mainWebViewPrefab; _setUpKeyboards(); // Wait for the CanvasWebViewPrefab to initialize, because the CanvasWebViewPrefab.WebView property // is null until the prefab has initialized. await mainWebViewPrefab.WaitUntilInitialized(); // The CanvasWebViewPrefab has initialized, so now we can use its WebViewPrefab.WebView property. var webViewWithPopups = mainWebViewPrefab.WebView as IWithPopups; if (webViewWithPopups == null) { mainWebViewPrefab.WebView.LoadHtml(NOT_SUPPORTED_HTML); return; } Debug.Log("Loading Pinterest as an example because it uses popups for third party login. Click 'Login', then select Facebook or Google to open a popup for authentication."); mainWebViewPrefab.WebView.LoadUrl("https://pinterest.com"); webViewWithPopups.SetPopupMode(PopupMode.LoadInNewWebView); webViewWithPopups.PopupRequested += async (webView, eventArgs) => { Debug.Log("Popup opened with URL: " + eventArgs.Url); var popupPrefab = CanvasWebViewPrefab.Instantiate(eventArgs.WebView); popupPrefab.Resolution = mainWebViewPrefab.Resolution; _focusedPrefab = popupPrefab; popupPrefab.transform.SetParent(_canvas.transform, false); var popupRectTransform = popupPrefab.transform as RectTransform; popupRectTransform.anchoredPosition3D = Vector3.zero; popupRectTransform.offsetMin = Vector2.zero; popupRectTransform.offsetMax = Vector2.zero; popupPrefab.transform.localScale = Vector3.one; // Place the popup in front of the main webview. var localPosition = popupPrefab.transform.localPosition; localPosition.z = 0.1f; popupPrefab.transform.localPosition = localPosition; await popupPrefab.WaitUntilInitialized(); popupPrefab.WebView.CloseRequested += (popupWebView, closeEventArgs) => { Debug.Log("Closing the popup"); _focusedPrefab = mainWebViewPrefab; popupPrefab.Destroy(); }; }; } void _setUpKeyboards() { // Send keys from the hardware (USB or Bluetooth) keyboard to the webview. // Use separate KeyDown() and KeyUp() methods if the webview supports // it, otherwise just use IWebView.SendKey(). // https://developer.vuplex.com/webview/IWithKeyDownAndUp _hardwareKeyboardListener = HardwareKeyboardListener.Instantiate(); _hardwareKeyboardListener.KeyDownReceived += (sender, eventArgs) => { var webViewWithKeyDown = _focusedPrefab.WebView as IWithKeyDownAndUp; if (webViewWithKeyDown != null) { webViewWithKeyDown.KeyDown(eventArgs.Value, eventArgs.Modifiers); } else { _focusedPrefab.WebView.SendKey(eventArgs.Value); } }; _hardwareKeyboardListener.KeyUpReceived += (sender, eventArgs) => { var webViewWithKeyUp = _focusedPrefab.WebView as IWithKeyDownAndUp; webViewWithKeyUp?.KeyUp(eventArgs.Value, eventArgs.Modifiers); }; } const string NOT_SUPPORTED_HTML = @"

Sorry, but this 3D WebView package doesn't support yet the IWithPopups interface. Current packages that support popups:

"; } }