From 0a8a69d51042b95649dbdf471acb3c96228f372e Mon Sep 17 00:00:00 2001 From: Armin Felder Date: Sun, 3 Mar 2019 16:52:20 +0100 Subject: Add QtWebView::WebView::httpUserAgent property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The httpUserAgent property allows to get and set the User Agent. Task-number: QTBUG-68746 Change-Id: I12fb5da00b14ecba53e71c532f2c8401f8f2a009 Reviewed-by: Oliver Wolff Reviewed-by: Christian Strømme --- src/imports/plugins.qmltypes | 3 +- src/imports/webview.cpp | 1 + .../android/view/QtAndroidWebViewController.java | 14 ++++++++ src/plugins/android/qandroidwebview.cpp | 13 +++++++ src/plugins/android/qandroidwebview_p.h | 2 ++ src/plugins/darwin/qdarwinwebview.mm | 13 +++++++ src/plugins/darwin/qdarwinwebview_p.h | 2 ++ src/plugins/webengine/qwebenginewebview.cpp | 42 +++++++++++++++++++++- src/plugins/webengine/qwebenginewebview_p.h | 8 +++++ src/plugins/winrt/qwinrtwebview.cpp | 32 +++++++++++++++++ src/plugins/winrt/qwinrtwebview_p.h | 2 ++ src/plugins/winrt/winrt.pro | 10 ++++++ src/webview/qabstractwebview_p.h | 1 + src/webview/qquickwebview.cpp | 19 ++++++++++ src/webview/qquickwebview_p.h | 4 +++ src/webview/qwebview.cpp | 21 +++++++++++ src/webview/qwebview_p.h | 5 +++ src/webview/qwebviewfactory.cpp | 2 ++ src/webview/qwebviewinterface_p.h | 2 ++ 19 files changed, 194 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/imports/plugins.qmltypes b/src/imports/plugins.qmltypes index 3a143fd..c07bfe2 100644 --- a/src/imports/plugins.qmltypes +++ b/src/imports/plugins.qmltypes @@ -22,7 +22,7 @@ Module { name: "QQuickWebView" defaultProperty: "data" prototype: "QQuickViewController" - exports: ["QtWebView/WebView 1.0", "QtWebView/WebView 1.1"] + exports: ["QtWebView/WebView 1.0", "QtWebView/WebView 1.1", "QtWebView/WebView 1.14"] exportMetaObjectRevisions: [0, 1] Enum { name: "LoadStatus" @@ -33,6 +33,7 @@ Module { "LoadFailedStatus": 3 } } + Property { name: "httpUserAgent"; revision: 14; type: "QString" } Property { name: "url"; type: "QUrl" } Property { name: "loading"; revision: 1; type: "bool"; isReadonly: true } Property { name: "loadProgress"; type: "int"; isReadonly: true } diff --git a/src/imports/webview.cpp b/src/imports/webview.cpp index d73ce09..c221655 100644 --- a/src/imports/webview.cpp +++ b/src/imports/webview.cpp @@ -56,6 +56,7 @@ public: const QString &msg = QObject::tr("Cannot create separate instance of WebViewLoadRequest"); qmlRegisterType(uri, 1, 0, "WebView"); qmlRegisterType(uri, 1, 1, "WebView"); + qmlRegisterType(uri, 1, 14, "WebView"); qmlRegisterUncreatableType(uri, 1, 1, "WebViewLoadRequest", msg); // Make sure we're always available under version x.QT_VERSION_MINOR diff --git a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java index 0f4b424..a4feca5 100644 --- a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java +++ b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java @@ -250,6 +250,20 @@ public class QtAndroidWebViewController } } + public void setUserAgent(final String userAgent) + { + if (userAgent == null){ + return; + } + + resetLoadingState(STARTED_STATE); + c_onPageStarted(m_id, null, null); + m_activity.runOnUiThread(new Runnable() { + @Override + public void run() { m_webView.getSettings().setUserAgentString(userAgent); } + }); + } + public void loadUrl(final String url) { if (url == null) { diff --git a/src/plugins/android/qandroidwebview.cpp b/src/plugins/android/qandroidwebview.cpp index 94e123c..3d2b98d 100644 --- a/src/plugins/android/qandroidwebview.cpp +++ b/src/plugins/android/qandroidwebview.cpp @@ -103,6 +103,19 @@ QAndroidWebViewPrivate::~QAndroidWebViewPrivate() m_viewController.callMethod("destroy"); } +QString QAndroidWebViewPrivate::httpUserAgent() const +{ + return QString( m_viewController.callObjectMethod("getUserAgent").toString()); +} + +void QAndroidWebViewPrivate::setHttpUserAgent(const QString &userAgent) +{ + m_viewController.callMethod("setUserAgent", + "(Ljava/lang/String;)V", + QJNIObjectPrivate::fromString(userAgent).object()); + Q_EMIT httpUserAgentChanged(userAgent); +} + QUrl QAndroidWebViewPrivate::url() const { return QUrl::fromUserInput(m_viewController.callObjectMethod("getUrl").toString()); diff --git a/src/plugins/android/qandroidwebview_p.h b/src/plugins/android/qandroidwebview_p.h index 9c1d364..1498a98 100644 --- a/src/plugins/android/qandroidwebview_p.h +++ b/src/plugins/android/qandroidwebview_p.h @@ -64,6 +64,8 @@ public: explicit QAndroidWebViewPrivate(QObject *p = 0); ~QAndroidWebViewPrivate() Q_DECL_OVERRIDE; + QString httpUserAgent() const Q_DECL_OVERRIDE; + void setHttpUserAgent(const QString &httpUserAgent) Q_DECL_OVERRIDE; QUrl url() const Q_DECL_OVERRIDE; void setUrl(const QUrl &url) Q_DECL_OVERRIDE; bool canGoBack() const Q_DECL_OVERRIDE; diff --git a/src/plugins/darwin/qdarwinwebview.mm b/src/plugins/darwin/qdarwinwebview.mm index ba99ac6..a9c711c 100644 --- a/src/plugins/darwin/qdarwinwebview.mm +++ b/src/plugins/darwin/qdarwinwebview.mm @@ -467,4 +467,17 @@ void QDarwinWebViewPrivate::runJavaScriptPrivate(const QString &script, int call }]; } +QString QDarwinWebViewPrivate::httpUserAgent() const +{ + return QString::fromNSString(wkWebView.customUserAgent); +} + +void QDarwinWebViewPrivate::setHttpUserAgent(const QString &userAgent) +{ + if (!userAgent.isEmpty()) { + wkWebView.customUserAgent = userAgent.toNSString(); + } + Q_EMIT httpUserAgentChanged(userAgent); +} + QT_END_NAMESPACE diff --git a/src/plugins/darwin/qdarwinwebview_p.h b/src/plugins/darwin/qdarwinwebview_p.h index 96fb09e..c69ee55 100644 --- a/src/plugins/darwin/qdarwinwebview_p.h +++ b/src/plugins/darwin/qdarwinwebview_p.h @@ -82,6 +82,8 @@ public: explicit QDarwinWebViewPrivate(QObject *p = 0); ~QDarwinWebViewPrivate() Q_DECL_OVERRIDE; + QString httpUserAgent() const Q_DECL_OVERRIDE; + void setHttpUserAgent(const QString &httpUserAgent) Q_DECL_OVERRIDE; QUrl url() const Q_DECL_OVERRIDE; void setUrl(const QUrl &url) Q_DECL_OVERRIDE; bool canGoBack() const Q_DECL_OVERRIDE; diff --git a/src/plugins/webengine/qwebenginewebview.cpp b/src/plugins/webengine/qwebenginewebview.cpp index d083b8d..f16371d 100644 --- a/src/plugins/webengine/qwebenginewebview.cpp +++ b/src/plugins/webengine/qwebenginewebview.cpp @@ -65,7 +65,7 @@ static QByteArray qmlSource() } QWebEngineWebViewPrivate::QWebEngineWebViewPrivate(QObject *p) - : QAbstractWebView(p) + : QAbstractWebView(p), m_profile(nullptr) { m_webEngineView.m_parent = this; } @@ -74,6 +74,17 @@ QWebEngineWebViewPrivate::~QWebEngineWebViewPrivate() { } +QString QWebEngineWebViewPrivate::httpUserAgent() const +{ + return m_httpUserAgent; +} + +void QWebEngineWebViewPrivate::setHttpUserAgent(const QString &userAgent) +{ + m_profile->setHttpUserAgent(userAgent); + Q_EMIT httpUserAgentChanged(userAgent); +} + QUrl QWebEngineWebViewPrivate::url() const { return m_webEngineView->url(); @@ -195,6 +206,30 @@ void QWebEngineWebViewPrivate::q_loadingChanged(QQuickWebEngineLoadRequest *load Q_EMIT loadingChanged(lr); } +void QWebEngineWebViewPrivate::q_profileChanged() +{ + auto profile = m_webEngineView->profile(); + if (profile == m_profile) + return; + + m_profile = profile; + auto userAgent = m_profile->httpUserAgent(); + if (m_httpUserAgent == userAgent) + return; + m_httpUserAgent = userAgent; + QObject::connect(m_profile, &QQuickWebEngineProfile::httpUserAgentChanged, this, &QWebEngineWebViewPrivate::q_httpUserAgentChanged); + Q_EMIT httpUserAgentChanged(userAgent); +} + +void QWebEngineWebViewPrivate::q_httpUserAgentChanged() +{ + QString httpUserAgent = m_profile->httpUserAgent(); + if (m_httpUserAgent == httpUserAgent) + return; + m_httpUserAgent = httpUserAgent; + Q_EMIT httpUserAgentChanged(m_httpUserAgent); +} + void QWebEngineWebViewPrivate::QQuickWebEngineViewPtr::init() const { Q_ASSERT(!m_webEngineView); @@ -218,10 +253,15 @@ void QWebEngineWebViewPrivate::QQuickWebEngineViewPtr::init() const component->setData(qmlSource(), QUrl::fromLocalFile(QLatin1String(""))); QQuickWebEngineView *webEngineView = qobject_cast(component->create()); Q_ASSERT(webEngineView); + QQuickWebEngineProfile *profile = webEngineView->profile(); + m_parent->m_profile = profile; + m_parent->m_httpUserAgent = profile->httpUserAgent(); QObject::connect(webEngineView, &QQuickWebEngineView::urlChanged, m_parent, &QWebEngineWebViewPrivate::q_urlChanged); QObject::connect(webEngineView, &QQuickWebEngineView::loadProgressChanged, m_parent, &QWebEngineWebViewPrivate::q_loadProgressChanged); QObject::connect(webEngineView, &QQuickWebEngineView::loadingChanged, m_parent, &QWebEngineWebViewPrivate::q_loadingChanged); QObject::connect(webEngineView, &QQuickWebEngineView::titleChanged, m_parent, &QWebEngineWebViewPrivate::q_titleChanged); + QObject::connect(webEngineView, &QQuickWebEngineView::profileChanged,m_parent, &QWebEngineWebViewPrivate::q_profileChanged); + QObject::connect(profile, &QQuickWebEngineProfile::httpUserAgentChanged, m_parent, &QWebEngineWebViewPrivate::q_httpUserAgentChanged); webEngineView->setParentItem(parentItem); m_webEngineView.reset(webEngineView); } diff --git a/src/plugins/webengine/qwebenginewebview_p.h b/src/plugins/webengine/qwebenginewebview_p.h index 88d6284..995f2f0 100644 --- a/src/plugins/webengine/qwebenginewebview_p.h +++ b/src/plugins/webengine/qwebenginewebview_p.h @@ -55,6 +55,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE @@ -68,6 +70,8 @@ public: explicit QWebEngineWebViewPrivate(QObject *p = 0); ~QWebEngineWebViewPrivate() Q_DECL_OVERRIDE; + QString httpUserAgent() const Q_DECL_OVERRIDE; + void setHttpUserAgent(const QString &userAgent) Q_DECL_OVERRIDE; QUrl url() const Q_DECL_OVERRIDE; void setUrl(const QUrl &url) Q_DECL_OVERRIDE; bool canGoBack() const Q_DECL_OVERRIDE; @@ -95,12 +99,16 @@ private Q_SLOTS: void q_loadProgressChanged(); void q_titleChanged(); void q_loadingChanged(QQuickWebEngineLoadRequest *loadRequest); + void q_profileChanged(); + void q_httpUserAgentChanged(); protected: void runJavaScriptPrivate(const QString& script, int callbackId) Q_DECL_OVERRIDE; private: + QQuickWebEngineProfile *m_profile; + QString m_httpUserAgent; struct QQuickWebEngineViewPtr { inline QQuickWebEngineView *operator->() const diff --git a/src/plugins/winrt/qwinrtwebview.cpp b/src/plugins/winrt/qwinrtwebview.cpp index 0faf7d1..8deabdc 100644 --- a/src/plugins/winrt/qwinrtwebview.cpp +++ b/src/plugins/winrt/qwinrtwebview.cpp @@ -54,6 +54,8 @@ #include #include #include +#include +#include using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers; @@ -373,6 +375,36 @@ QWinRTWebViewPrivate::~QWinRTWebViewPrivate() }); } +QString QWinRTWebViewPrivate::httpUserAgent() const +{ +#ifdef QT_WINRT_URLMKGETSESSIONOPTION_NOT_AVAILABLE + qWarning() << "Used Windows SDK version (" << QString::number(QT_UCRTVERSION) << ") does not " + "support getting or setting of the user agent property from within UWP applications. Consider updating to a more recent Windows 10 " + "SDK (16299 or above)."; + return ""; +#else + char buffer[255]; + unsigned long stringLength; + HRESULT hr = UrlMkGetSessionOption(0x10000001,&buffer,255,&stringLength,0); + Q_ASSERT_SUCCEEDED(hr); + return QString(buffer); +#endif +} + +void QWinRTWebViewPrivate::setHttpUserAgent(const QString &userAgent) +{ +#ifdef QT_WINRT_URLMKSETSESSIONOPTION_NOT_AVAILABLE + Q_UNUSED(userAgent); + qWarning() << "Used Windows SDK version (" << QString::number(QT_UCRTVERSION) << ") does not " + "support getting or setting of the user agent property from within UWP applications. Consider updating to a more recent Windows 10 " + "SDK (16299 or above)."; +#else + HRESULT hr = UrlMkSetSessionOption(0x10000001,userAgent.toLocal8Bit().data(),userAgent.size(),0); + Q_ASSERT_SUCCEEDED(hr); + emit httpUserAgentChanged(userAgent); +#endif +} + QUrl QWinRTWebViewPrivate::url() const { ComPtr uri; diff --git a/src/plugins/winrt/qwinrtwebview_p.h b/src/plugins/winrt/qwinrtwebview_p.h index 3756b7d..0030824 100644 --- a/src/plugins/winrt/qwinrtwebview_p.h +++ b/src/plugins/winrt/qwinrtwebview_p.h @@ -75,6 +75,8 @@ public: explicit QWinRTWebViewPrivate(QObject *parent = nullptr); ~QWinRTWebViewPrivate() Q_DECL_OVERRIDE; + QString httpUserAgent() const Q_DECL_OVERRIDE; + void setHttpUserAgent(const QString &userAgent) Q_DECL_OVERRIDE; QUrl url() const Q_DECL_OVERRIDE; void setUrl(const QUrl &url) Q_DECL_OVERRIDE; bool canGoBack() const Q_DECL_OVERRIDE; diff --git a/src/plugins/winrt/winrt.pro b/src/plugins/winrt/winrt.pro index dabcbfd..827b4ef 100644 --- a/src/plugins/winrt/winrt.pro +++ b/src/plugins/winrt/winrt.pro @@ -1,5 +1,6 @@ TARGET = qtwebview_winrt QT += core gui webview-private +LIBS_PRIVATE += -lurlmon PLUGIN_TYPE = webview PLUGIN_CLASS_NAME = QWinrtWebViewPlugin @@ -15,6 +16,15 @@ SOURCES += \ HEADERS += \ qwinrtwebview_p.h +WINDOWS_SDK_VERSION_STRING = $$(WindowsSDKVersion) +WINDOWS_SDK_VERSION = $$member($$list($$split(WINDOWS_SDK_VERSION_STRING, .)), 2) + +lessThan(WINDOWS_SDK_VERSION, 16299) { + DEFINES += QT_WINRT_URLMKGETSESSIONOPTION_NOT_AVAILABLE + DEFINES += QT_WINRT_URLMKSETSESSIONOPTION_NOT_AVAILABLE + DEFINES += QT_UCRTVERSION=$$WINDOWS_SDK_VERSION +} + OTHER_FILES += DISTFILES += \ diff --git a/src/webview/qabstractwebview_p.h b/src/webview/qabstractwebview_p.h index d2eec30..e7c5653 100644 --- a/src/webview/qabstractwebview_p.h +++ b/src/webview/qabstractwebview_p.h @@ -70,6 +70,7 @@ Q_SIGNALS: void loadProgressChanged(int progress); void javaScriptResult(int id, const QVariant &result); void requestFocus(bool focus); + void httpUserAgentChanged(const QString &httpUserAgent); protected: explicit QAbstractWebView(QObject *p = 0) : QObject(p) { } diff --git a/src/webview/qquickwebview.cpp b/src/webview/qquickwebview.cpp index 898154e..4441df4 100644 --- a/src/webview/qquickwebview.cpp +++ b/src/webview/qquickwebview.cpp @@ -101,12 +101,31 @@ QQuickWebView::QQuickWebView(QQuickItem *parent) connect(m_webView, &QWebView::loadingChanged, this, &QQuickWebView::onLoadingChanged); connect(m_webView, &QWebView::requestFocus, this, &QQuickWebView::onFocusRequest); connect(m_webView, &QWebView::javaScriptResult, this, &QQuickWebView::onRunJavaScriptResult); + connect(m_webView, &QWebView::httpUserAgentChanged, this, &QQuickWebView::httpUserAgentChanged); } QQuickWebView::~QQuickWebView() { } +/*! + \qmlproperty url QtWebView::WebView::httpUserAgent + \since QtWebView 1.14 + The user agent in use. + + \note on WinRT, this property affects all WebViews of the application. +*/ + +void QQuickWebView::setHttpUserAgent(const QString &userAgent) +{ + m_webView->setHttpUserAgent(userAgent); +} + +QString QQuickWebView::httpUserAgent() const +{ + return m_webView->httpUserAgent(); +} + /*! \qmlproperty url QtWebView::WebView::url diff --git a/src/webview/qquickwebview_p.h b/src/webview/qquickwebview_p.h index 6534815..fef5af9 100644 --- a/src/webview/qquickwebview_p.h +++ b/src/webview/qquickwebview_p.h @@ -60,6 +60,7 @@ class QWebViewLoadRequestPrivate; class Q_WEBVIEW_EXPORT QQuickWebView : public QQuickViewController, public QWebViewInterface { Q_OBJECT + Q_PROPERTY(QString httpUserAgent READ httpUserAgent WRITE setHttpUserAgent NOTIFY httpUserAgentChanged REVISION 14) Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged) Q_PROPERTY(bool loading READ isLoading NOTIFY loadingChanged REVISION 1) Q_PROPERTY(int loadProgress READ loadProgress NOTIFY loadProgressChanged) @@ -79,6 +80,8 @@ public: QQuickWebView(QQuickItem *parent = 0); ~QQuickWebView(); + QString httpUserAgent() const Q_DECL_OVERRIDE; + void setHttpUserAgent(const QString &userAgent) Q_DECL_OVERRIDE; QUrl url() const Q_DECL_OVERRIDE; void setUrl(const QUrl &url) Q_DECL_OVERRIDE; int loadProgress() const Q_DECL_OVERRIDE; @@ -101,6 +104,7 @@ Q_SIGNALS: void urlChanged(); Q_REVISION(1) void loadingChanged(QQuickWebViewLoadRequest *loadRequest); void loadProgressChanged(); + Q_REVISION(14) void httpUserAgentChanged(); protected: void itemChange(ItemChange change, const ItemChangeData &value) Q_DECL_OVERRIDE; diff --git a/src/webview/qwebview.cpp b/src/webview/qwebview.cpp index 7e457be..943218b 100644 --- a/src/webview/qwebview.cpp +++ b/src/webview/qwebview.cpp @@ -54,6 +54,7 @@ QWebView::QWebView(QObject *p) connect(d, &QAbstractWebView::urlChanged, this, &QWebView::onUrlChanged); connect(d, &QAbstractWebView::loadingChanged, this, &QWebView::onLoadingChanged); connect(d, &QAbstractWebView::loadProgressChanged, this, &QWebView::onLoadProgressChanged); + connect(d, &QAbstractWebView::httpUserAgentChanged, this, &QWebView::onHttpUserAgentChanged); connect(d, &QAbstractWebView::requestFocus, this, &QWebView::requestFocus); connect(d, &QAbstractWebView::javaScriptResult, this, &QWebView::javaScriptResult); @@ -63,6 +64,19 @@ QWebView::~QWebView() { } +QString QWebView::httpUserAgent() const +{ + if (m_httpUserAgent.isEmpty()){ + m_httpUserAgent = d->httpUserAgent(); + } + return m_httpUserAgent; +} + +void QWebView::setHttpUserAgent(const QString &userAgent) +{ + return d->setHttpUserAgent(userAgent); +} + QUrl QWebView::url() const { return m_url; @@ -193,7 +207,14 @@ void QWebView::onLoadingChanged(const QWebViewLoadRequestPrivate &loadRequest) onUrlChanged(loadRequest.m_url); Q_EMIT loadingChanged(loadRequest); +} +void QWebView::onHttpUserAgentChanged(const QString &userAgent) +{ + if (m_httpUserAgent == userAgent) + return; + m_httpUserAgent = userAgent; + Q_EMIT httpUserAgentChanged(); } void QWebView::init() diff --git a/src/webview/qwebview_p.h b/src/webview/qwebview_p.h index aa09f03..380d701 100644 --- a/src/webview/qwebview_p.h +++ b/src/webview/qwebview_p.h @@ -77,6 +77,8 @@ public: explicit QWebView(QObject *p = 0); ~QWebView() Q_DECL_OVERRIDE; + QString httpUserAgent() const Q_DECL_OVERRIDE; + void setHttpUserAgent(const QString &httpUserAgent) Q_DECL_OVERRIDE; QUrl url() const Q_DECL_OVERRIDE; void setUrl(const QUrl &url) Q_DECL_OVERRIDE; bool canGoBack() const Q_DECL_OVERRIDE; @@ -106,6 +108,7 @@ Q_SIGNALS: void loadProgressChanged(); void javaScriptResult(int id, const QVariant &result); void requestFocus(bool focus); + void httpUserAgentChanged(); protected: void init() Q_DECL_OVERRIDE; @@ -117,6 +120,7 @@ private Q_SLOTS: void onUrlChanged(const QUrl &url); void onLoadProgressChanged(int progress); void onLoadingChanged(const QWebViewLoadRequestPrivate &loadRequest); + void onHttpUserAgentChanged(const QString &httpUserAgent); private: friend class QQuickViewController; @@ -128,6 +132,7 @@ private: int m_progress; QString m_title; QUrl m_url; + mutable QString m_httpUserAgent; }; QT_END_NAMESPACE diff --git a/src/webview/qwebviewfactory.cpp b/src/webview/qwebviewfactory.cpp index 7a22fd1..8856168 100644 --- a/src/webview/qwebviewfactory.cpp +++ b/src/webview/qwebviewfactory.cpp @@ -64,6 +64,8 @@ public: void setVisibility(QWindow::Visibility visibility) override { Q_UNUSED(visibility); } void setVisible(bool visible) override { Q_UNUSED(visible); } + QString httpUserAgent() const override { return QString(); } + void setHttpUserAgent(const QString &userAgent) override { Q_UNUSED(userAgent) } QUrl url() const override { return QUrl(); } void setUrl(const QUrl &url) override { Q_UNUSED(url); } bool canGoBack() const override { return false; } diff --git a/src/webview/qwebviewinterface_p.h b/src/webview/qwebviewinterface_p.h index a3216da..d9e566c 100644 --- a/src/webview/qwebviewinterface_p.h +++ b/src/webview/qwebviewinterface_p.h @@ -63,6 +63,8 @@ class QWebViewInterface { public: virtual ~QWebViewInterface() {} + virtual QString httpUserAgent() const = 0; + virtual void setHttpUserAgent(const QString &httpUserAgent) = 0; virtual QUrl url() const = 0; virtual void setUrl(const QUrl &url) = 0; virtual bool canGoBack() const = 0; -- cgit v1.2.3