WebView2 - как читать данные из BLOB-адреса?

Как читать данные в виде текста из URL-адреса большого двоичного объекта в WebView2? Я пробовал обратный вызов WebView2 из Javascript, и я не мог заставить его работать. Я ценю, является ли это решение Javascript или нет, но я предпочитаю C++.

2 ответа

Решение

К сожалению, Webview2 не поддерживает результаты асинхронной функции в ExecuteScript. Мне удалось получить данные, выполнив синхронный запрос с помощью ajax.

wstring jquery(L"var jqry = document.createElement('script');"
L"jqry.src = 'https://code.jquery.com/jquery-3.3.1.min.js';"
L"document.getElementsByTagName('head')[0].appendChild(jqry);");
webview->ExecuteScript(jquery.c_str(), Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
    [](HRESULT errorCode, PCWSTR result) -> HRESULT {
    return S_OK;
}).Get());
Sleep(500);

wstring script(L"jQuery.noConflict();"
L"function testAjax() {"
L"var result='';"
L"jQuery.ajax({"
    L"url:document.getElementById('test').href,"
        L"async: false,"
        L"success:function(data) {"
            L"result = data; "
        L"}"
        L"});"
    L"return result;"
L"}"
L"(() => {"
    L"return testAjax()"
L"})();");
webview->ExecuteScript(script.c_str(), Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
    [](HRESULT errorCode, LPCWSTR result) -> HRESULT {
        wprintf(L"%ls\n", result);

    return S_OK;
}).Get());

Но синхронные вызовы блокируют веб-код во время выполнения. Это не рекомендуется, но в моем случае это нормально. Если вы ищете другой способ без блокировки веб-кода, отправка текста обратно на нативную сторону может быть лучшей идеей, как предложил @David Risney.

WebView2 не предоставляет механизма взаимодействия с BLOB-объектами. Вы можете превратить Blob в текст в скрипте, а затем отправить текст обратно на исходную сторону с помощьюwindow.chrome.webview.postMessageметод и событие WebMessageReceived.

Если это не сработает для вас, вы можете отправить запрос функции в проекте WebView2 Feedback GitHub.

async function example() {
  function textToBlob(text) {
    return new Blob([text], {type : 'text/plain'});
  }

  async function blobToText(blob) {
    return (new Response(blob)).text();
  }

  const blob = textToBlob("example");
  const text = await blobToText(blob);
  alert(text);
}

example();

Другие вопросы по тегам