OnContextCreated() в Cef не вызывается

У меня аналогичная проблема с человеком в этом сообщении; Я пытаюсь расширить приложение cefsimple.exe, включенное в двоичные файлы встроенной среды хрома, чтобы включить обработчик V8. Я реализовал метод OnContextCreated() и обязательно расширил RenderProcessHandler в классе SimpleHandler. Я пытаюсь реализовать простую переменную, привязанную к окну, с именем test_string; вот как выглядит мой код;

void SimpleHandler::OnContextCreated(
    CefRefPtr<CefBrowser> browser,
    CefRefPtr<CefFrame> frame,
    CefRefPtr<CefV8Context> context)
{
    CefRefPtr<CefV8Value> object = context->GetGlobal();

    object->SetValue("test_string", CefV8Value::CreateString("this is a test"), V8_PROPERTY_ATTRIBUTE_NONE);
}

Но программа никогда не достигает каких-либо точек останова, которые я добавляю в методе, и переменная не определена на любых веб-страницах, которые я загружаю в приложении. Я видел, что одним из решений в другом потоке является включение флага settings.single_process, что я и сделал, но мой код все еще не достигает точки останова.

Чтобы было ясно, я обращаюсь к переменной на страницах с window.test_string.


person Maurdekye    schedule 06.11.2015    source источник


Ответы (3)


Убедитесь, что вы отправляете это CefApp в CefExecuteProcess.

  CefRefPtr<SimpleApp> app(new SimpleApp);

  // CEF applications have multiple sub-processes (render, plugin, GPU, etc)
  // that share the same executable. This function checks the command-line and,
  // if this is a sub-process, executes the appropriate logic.
  int exit_code = CefExecuteProcess(main_args, app, sandbox_info);
  if (exit_code >= 0) {
    // The sub-process has completed so return here.
    return exit_code;
  }

Решение найдено здесь

person Valdemar_Rudolfovich    schedule 13.09.2018

Вы прочитали руководство General Usage? Некоторые ключевые моменты ниже

https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-cefapp https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-processes

Режим single_process не поддерживается, поэтому я им никогда не пользовался. В общем, я бы избегал этого. Архитектура с несколькими процессами означает, что вам необходимо подключить отладчик к процессу. Руководство Chromium относится к CEF в данном случае.

https://www.chromium.org/developers/how-tos/debugging-on-windows#TOC-Attaching-to-the-renderer

person amaitland    schedule 07.11.2015
comment
Я посмотрю на это, но на данный момент я не могу отлаживать свой код из-за отдельной проблемы. Я свяжусь с вами, если это применимо. - person Maurdekye; 09.11.2015
comment
Я прочитал заголовки страниц, на которые вы ссылались, и мне очень трудно понять, что нужно сделать. Я попытался добавить CEF_REQUIRE_RENDERER_THREAD(); в верхнюю часть реализации моей функции, но, похоже, он все еще не работает. - person Maurdekye; 12.11.2015
comment
У вас есть конкретный вопрос или какой-то код для ссылки? - person amaitland; 16.11.2015

вам нужно убедиться, что ваше приложение получено из CefRenderProcessHandler, а не из SimpleHandler!!!

class SimpleApp : public CefApp
    , public CefRenderProcessHandler 
{

virtual void OnContextCreated(CefRefPtr<CefBrowser> browser,
    CefRefPtr<CefFrame> frame,
    CefRefPtr<CefV8Context> context) OVERRIDE;

вальдемар-рудольфович говорит, что вам нужно передать экземпляр SimpleApp в CefExecuteProcess

person Danil    schedule 04.03.2019