
async function _waitForOrTriggerPasteMenu(x, y, proceedWithPaste, shouldTap) {
    return new Promise(resolve => {
        testRunner.runUIScript(`
            (() => {
                doneCount = 0;
                function checkDone() {
                    if (++doneCount === (${shouldTap} ? 3 : 2))
                        uiController.uiScriptComplete();
                }

                uiController.didHideMenuCallback = checkDone;

                function tapPasteMenuAction() {
                    if (${proceedWithPaste}) {
                        const rect = uiController.rectForMenuAction("Paste");
                        uiController.singleTapAtPoint(rect.left + rect.width / 2, rect.top + rect.height / 2, checkDone);
                    } else {
                        uiController.resignFirstResponder();
                        checkDone();
                    }
                }

                if (uiController.isShowingMenu)
                    tapPasteMenuAction();
                else
                    uiController.didShowMenuCallback = tapPasteMenuAction;

                if (${shouldTap})
                    uiController.singleTapAtPoint(${x}, ${y}, checkDone);
            })()`, resolve);
    });
}

async function triggerPasteMenuAfterTapAt(x, y, proceedWithPaste = true) {
    return _waitForOrTriggerPasteMenu(x, y, proceedWithPaste, true);
}

async function waitForPasteMenu(proceedWithPaste = true) {
    return _waitForOrTriggerPasteMenu(null, null, proceedWithPaste, false);
}
