< Summary

Class:ClipboardWebGL
Assembly:Clipboard
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Clipboard/Handlers/Web/ClipboardWebGL.cs
Covered lines:0
Uncovered lines:21
Coverable lines:21
Total lines:99
Line coverage:0% (0 of 21)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
OnReceiveReadText(...)0%12300%
OnReceivePasteInput(...)0%2100%
OnReceiveCopyInput()0%6200%
ClipboardWebGL()0%2100%
Dispose()0%2100%
Initialize(...)0%2100%
RequestWriteText(...)0%2100%
RequestGetText()0%2100%
OnBeforeRender()0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Clipboard/Handlers/Web/ClipboardWebGL.cs

#LineLine coverage
 1using System;
 2using System.Runtime.InteropServices;
 3using AOT;
 4using DCL;
 5using UnityEngine;
 6
 7internal class ClipboardWebGL : Singleton<ClipboardWebGL>, IClipboardHandler, IDisposable
 8{
 9    private Action<string, bool> OnRead;
 10    private bool copyInput = false;
 11
 12    private delegate void ReadTextCallback(IntPtr ptrText, int intError);
 13
 14    private delegate void OnPasteInputCallback(IntPtr ptrText);
 15
 16    private delegate void OnCopyInputCallback();
 17
 18    [DllImport("__Internal")]
 19    private static extern void initialize(Action<IntPtr, int> readTextCallback, Action<IntPtr> pasteCallback,
 20        Action copyCallback);
 21
 22    /// <summary>
 23    /// External call to write text in the browser's clipboard
 24    /// </summary>
 25    /// <param name="text">string to push to the clipboard</param>
 26    [DllImport("__Internal")]
 27    private static extern void writeText(string text);
 28
 29    /// <summary>
 30    /// External call to request the string value stored at browser's clipboard
 31    /// </summary>
 32    [DllImport("__Internal")]
 33    private static extern void readText();
 34
 35    /// <summary>
 36    /// This static function is called from the browser. It will receive a pointer to the string value
 37    /// stored at browser's clipboard or and error if it couldn't get the value
 38    /// </summary>
 39    /// <param name="ptrText">pointer to the clipboard's string value</param>
 40    /// <param name="intError">0 if error, other if OK</param>
 41    [MonoPInvokeCallback(typeof(ReadTextCallback))]
 42    private static void OnReceiveReadText(IntPtr ptrText, int intError)
 43    {
 044        string value = Marshal.PtrToStringAuto(ptrText);
 045        bool error = intError == 0;
 046        i?.OnRead?.Invoke(value, error);
 047    }
 48
 49    /// <summary>
 50    /// This static function is called from the browser. It will be called when a PASTE input is performed (CTRL+V)
 51    /// and it will receive a pointer to the string value stored at browser's clipboard
 52    /// </summary>
 53    /// <param name="ptrText">pointer to the clipboard's string value</param>
 54    [MonoPInvokeCallback(typeof(OnPasteInputCallback))]
 55    private static void OnReceivePasteInput(IntPtr ptrText)
 56    {
 057        string value = Marshal.PtrToStringAuto(ptrText);
 58        // NOTE: after marshalling we overwrite unity's clipboard buffer with the value coming from the browser
 059        GUIUtility.systemCopyBuffer = value;
 060    }
 61
 62    /// <summary>
 63    /// This static function is called from the browser. It will be called when a COPY input is performed (CTRL+C)
 64    /// </summary>
 65    [MonoPInvokeCallback(typeof(OnCopyInputCallback))]
 66    private static void OnReceiveCopyInput()
 67    {
 68        // NOTE: here we set the flag that a copy input was performed to be used in OnBeforeRender function
 069        if (i != null)
 070            i.copyInput = true;
 071    }
 72
 073    public ClipboardWebGL() { Application.onBeforeRender += OnBeforeRender; }
 74
 075    public void Dispose() { Application.onBeforeRender -= OnBeforeRender; }
 76
 77    void IClipboardHandler.Initialize(Action<string, bool> onRead)
 78    {
 079        this.OnRead = onRead;
 080        initialize(OnReceiveReadText, OnReceivePasteInput, OnReceiveCopyInput);
 081    }
 82
 083    void IClipboardHandler.RequestWriteText(string text) { writeText(text); }
 84
 085    void IClipboardHandler.RequestGetText() { readText(); }
 86
 87    void OnBeforeRender()
 88    {
 89        // NOTE: before rendering (just after Unity's input is processed) we check if there was a COPY input (CTRL+C) tr
 90        // the browser. If there was a COPY input we push the text copied and stored inside Unity's clipboard into the b
 91        // It is done this way cause we don't have a callback for Unity's copy input and because we want to store the va
 92        // browser's clipboard so we are able to paste it outside Unity's "sandboxing"
 093        if (copyInput)
 94        {
 095            copyInput = false;
 096            writeText(GUIUtility.systemCopyBuffer);
 97        }
 098    }
 99}