Эх сурвалжийг харах

Fix issue 160: Slow running javascript is not handled well

As of 0.9.0 when a script was running slow a dialog box would be propted and wkhtmltopdf would crash.
Now by default if a slow script is detected we just let it run. If --stop-slow-scripts is specified
we stop the script, print out a warning and continue printing
Antialize 15 жил өмнө
parent
commit
8636f506ad

+ 4 - 1
src/arguments.cc

@@ -504,7 +504,10 @@ CommandLineParserPrivate::CommandLineParserPrivate(Settings & s):
 	addarg("no-background",0,"Do not print background", new ConstSetter<bool>(s.background,false,true));
 	addarg("user-style-sheet",0,"Specify a user style sheet, to load with every page", new QStrSetter(s.userStyleSheet,"url",""));
 #endif
-	
+
+#if QT_VERSION >= 0x040600
+	addarg("stop-slow-scripts", 0, "Stop slow running javascripts", new ConstSetter<bool>(s.stopSlowScripts, true, false));
+#endif	
 	extended(false);
 	section("Headers And Footer Options");
 	qthack(true);

+ 11 - 1
src/multipageloader.cc

@@ -30,6 +30,16 @@
   \brief Defines the MultiPageLoaderPrivate class
 */
 
+MyQWebPage::MyQWebPage(MultiPageLoader & mpl, Settings & s): settings(s), multiPageLoader(mpl) {};
+													
+bool MyQWebPage::shouldInterruptJavaScript() {
+	if (settings.stopSlowScripts) {
+		multiPageLoader.warning("A slow script was stopped");
+		return true;
+	}
+	return false;
+}
+
 void MyCookieJar::addGlobalCookie(const QString & name, const QString & value) {
 	globalCookies.append(QNetworkCookie(name.toUtf8(), value.toUtf8()));
 }
@@ -171,7 +181,7 @@ MultiPageLoaderPrivate::~MultiPageLoaderPrivate() {
 }
 
 QWebPage * MultiPageLoaderPrivate::addResource(const QUrl & url) {
-	QWebPage * page = new QWebPage(); 
+	QWebPage * page = new MyQWebPage(outer, settings); 
 	pages.push_back(page);
 	urls.push_back(url);
 	page->setNetworkAccessManager(&networkAccessManager);

+ 2 - 0
src/multipageloader.hh

@@ -21,6 +21,7 @@
 #include <QUrl>
 #include <QWebPage>
 
+class MyQWebPage;
 class MultiPageLoaderPrivate;
 class MultiPageLoader: public QObject {
 	Q_OBJECT
@@ -46,6 +47,7 @@ signals:
 private:
 	MultiPageLoaderPrivate * d;
 	friend class MultiPageLoaderPrivate;
+	friend class MyQWebPage;
 };
 
 #endif //__MULTIPAGELOADER_HH__

+ 12 - 0
src/multipageloader_p.hh

@@ -23,6 +23,18 @@
 #include <QWebFrame>
 #include <QNetworkCookieJar>
 
+
+class MyQWebPage: public QWebPage {
+	Q_OBJECT ;
+private:
+	Settings & settings;
+	MultiPageLoader & multiPageLoader;
+public:
+	MyQWebPage(MultiPageLoader & mpl, Settings & s);
+public slots:
+	bool shouldInterruptJavaScript();
+};
+
 class MyCookieJar: public QNetworkCookieJar {
 private:
 	QList<QNetworkCookie> globalCookies;

+ 1 - 0
src/settings.hh

@@ -192,6 +192,7 @@ struct Settings {
 	
 	QList< PostItem > post;
 	QString documentTitle;
+	bool stopSlowScripts;
 
 	static QPrinter::PageSize strToPageSize(const char * s, bool * ok=0);
 	static QPair<qreal, QPrinter::Unit> strToUnitReal(const char * s, bool * ok=0);