QWebEngine: удаление QWebEngineUrlRequestInterceptor приводит к сбою - PullRequest
0 голосов
/ 07 января 2020

в моем проекте я хочу создать / удалить QWebEnginePages при открытии / закрытии приложения. С Qt5.9.7 все работало нормально. При переключении на Qt5.12.6 мое приложение обработает sh.

Я создал небольшой пример кода, где я просто нажимаю кнопку для создания и удаления. Конечно, в моем реальном проекте я проверяю, что все охраняется и т. Д. c:

BrowserWidget::BrowserWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::Widget) {
  m_webView = new QWebEngineView(this);

  ui->setupUi(this);
  ui->verticalLayout->addWidget(m_webView);

  connect(ui->createBtn, &QPushButton::clicked, this,
          &BrowserWidget::createSession);
  connect(ui->deleteBtn, &QPushButton::clicked, this,
          &BrowserWidget::deleteSession);
}

BrowserWidget::~BrowserWidget() {
  delete ui;
}

void BrowserWidget::createSession() {
  m_page = new QWebEnginePage(this);
  m_interceptor = new UrlRequestInterceptor(this);
  m_page->profile()->setRequestInterceptor(m_interceptor);

  for (auto c : m_connections) {
    disconnect(c);
  }
  m_connections.clear();

  m_page->setUrl(
      QUrl(QStringLiteral("https://www.youtube.com/watch?v=rNSnfXl1ZjU")));
  m_webView->setPage(m_page);

  return;
}

void BrowserWidget::deleteSession() {
  delete m_page;
  delete m_interceptor; // This causes the crash
}

Весь UrlRequestInterceptor. cpp выглядит так:

UrlRequestInterceptor::UrlRequestInterceptor(QObject *parent)
    : QWebEngineUrlRequestInterceptor(parent) {}

void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) {
  info.block(false);
  return;
}

Когда я быстро открыть и закрыть мои "Веб-страницы", delete m_interceptor приведет к Cra sh. Это также иногда случалось, когда веб-страница была полностью загружена, но не так часто. Мне не удалось найти что-либо об этом в документации.

Кто-нибудь из вас имеет представление о том, как я могу надежно дождаться завершения всего, что связано с перехватчиком / браузером, прежде чем удалить m_interceptor?

Вот трассировка стека, если она полезна:

1   QtWebEngineCore::CustomProtocolHandler::MaybeCreateJob          Qt5WebEngineCored  0x7ffd06bdd708 
2   QtWebEngineCore::CookieMonsterDelegateQt::hasCookieMonster      Qt5WebEngineCored  0x7ffd0a4aa0ae 
3   QtWebEngineCore::CookieMonsterDelegateQt::hasCookieMonster      Qt5WebEngineCored  0x7ffd0a4b1ca5 
4   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b5a12 
5   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b4a01 
6   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b0769 
7   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b5777 
8   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a83c8 
9   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a078f 
10  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a34ca 
11  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd0949ffdf 
12  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a65c5 
13  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a67af 
14  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094c15d3 
15  QWebEngineCookieStorePrivate::q_func                            Qt5WebEngineCored  0x7ffd0b93f07d 
16  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b91bb 
17  QtWebEngineCore::JavaScriptDialogController::qt_static_metacall Qt5WebEngineCored  0x7ffd06db6c45 
18  QWebEngineQuotaRequest::QWebEngineQuotaRequest                  Qt5WebEngineCored  0x7ffd08ea7a85 
19  QtWebEngineCore::FilePickerController::mode                     Qt5WebEngineCored  0x7ffd0a1c5e75 
20  QtWebEngineCore::FilePickerController::mode                     Qt5WebEngineCored  0x7ffd0a1c4a31    

Большое спасибо!

1 Ответ

1 голос
/ 07 января 2020

Я думаю, вам не нужно создавать новый экземпляр-перехватчик каждый раз, когда начинается сеанс. Просто имейте один экземпляр этого, в вашем BrowserWidget классе:

private:
    Ui::BrowserWidget *ui;
    UrlRequestInterceptor m_interceptor;

инициализируйте его в конструкторе виджета:

BrowserWidget::BrowserWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::BrowserWidget), m_interceptor(this)

передайте указатель на него на профиль страницы:

void BrowserWidget::createSession() {
  m_page = new QWebEnginePage(this);
  m_page->profile()->setRequestInterceptor(&m_interceptor);

избавиться от delete в deleteSession:

void BrowserWidget::deleteSession() {

  delete m_page;
//  delete m_interceptor; // This (no more) causes the crash
}
...