From 1757b2b89ffa04b1f8df4709f05034b7b447e1de Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 21 Mar 2020 13:04:50 +0300 Subject: [PATCH] Recreate page on webengine render error/crash --- src/translate/translator.cpp | 54 +++++++++++++++++++++--------------- src/translate/translator.h | 1 + 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/translate/translator.cpp b/src/translate/translator.cpp index 5c64f92..ad4c444 100644 --- a/src/translate/translator.cpp +++ b/src/translate/translator.cpp @@ -130,28 +130,7 @@ void Translator::updateSettings() return; } - for (const auto &script : loaded) { - const auto &scriptName = script.first; - const auto &scriptText = script.second; - const auto pageIt = pages_.emplace( - scriptName, std::make_unique(*this, scriptText, scriptName)); - SOFT_ASSERT(pageIt.second, continue); - - const auto &page = pageIt.first->second; - page->setIgnoreSslErrors(settings_.ignoreSslErrors); - page->setTimeout(settings_.translationTimeout); - - auto log = new QTextEdit(tabs_); - tabs_->addTab(log, scriptName); - - connect(page.get(), &WebPage::log, // - log, &QTextEdit::append); - connect(page.get(), &WebPage::urlChanged, // - this, &Translator::updateUrl); - - SOFT_ASSERT(log->document(), continue) - log->document()->setMaximumBlockCount(1000); - } + for (const auto &script : loaded) createPage(script.first, script.second); if (settings_.debugMode) { show(); @@ -160,6 +139,37 @@ void Translator::updateSettings() } } +void Translator::createPage(const QString &scriptName, + const QString &scriptText) +{ + pages_.erase(scriptName); + const auto pageIt = pages_.emplace( + scriptName, std::make_unique(*this, scriptText, scriptName)); + SOFT_ASSERT(pageIt.second, return ); + + const auto &page = pageIt.first->second; + page->setIgnoreSslErrors(settings_.ignoreSslErrors); + page->setTimeout(settings_.translationTimeout); + + auto log = new QTextEdit(tabs_); + tabs_->addTab(log, scriptName); + + connect(page.get(), &WebPage::log, // + log, &QTextEdit::append); + connect(page.get(), &WebPage::urlChanged, // + this, &Translator::updateUrl); + connect(page.get(), &WebPage::renderProcessTerminated, // + this, + [this, scriptName, + scriptText](WebPage::RenderProcessTerminationStatus status) { + if (status != WebPage::NormalTerminationStatus) + createPage(scriptName, scriptText); + }); + + SOFT_ASSERT(log->document(), return ) + log->document()->setMaximumBlockCount(1000); +} + WebPage *Translator::currentPage() const { const auto index = tabs_->currentIndex(); diff --git a/src/translate/translator.h b/src/translate/translator.h index df0fe49..bb6eb82 100644 --- a/src/translate/translator.h +++ b/src/translate/translator.h @@ -32,6 +32,7 @@ private: void setPageLoadImages(bool isOn); void processQueue(); void markTranslated(const TaskPtr &task); + void createPage(const QString &scriptName, const QString &scriptText); Manager &manager_; const Settings &settings_;