From 481155893fd85b4b0770397375ceaf520fcf9db6 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 12 Sep 2017 14:56:22 +0200 Subject: Introduce devtools frontend Makes it possible to use devtools without using the remote-debugger Task-number: QTBUG-47899 Task-number: QTBUG-50725 Task-number: QTBUG-50766 Change-Id: Id32e13f773372d9917599ebbb64ab4af61bbf1d8 Reviewed-by: Alexandru Croitor --- .../webengine/quicknanobrowser/BrowserWindow.qml | 16 +++++ .../webenginewidgets/simplebrowser/browser.cpp | 14 +++- examples/webenginewidgets/simplebrowser/browser.h | 1 + .../simplebrowser/browserwindow.cpp | 80 +++++++++++++--------- .../webenginewidgets/simplebrowser/browserwindow.h | 3 +- .../webenginewidgets/simplebrowser/tabwidget.cpp | 1 + .../webenginewidgets/simplebrowser/tabwidget.h | 1 + .../webenginewidgets/simplebrowser/webview.cpp | 8 +++ examples/webenginewidgets/simplebrowser/webview.h | 1 + 9 files changed, 91 insertions(+), 34 deletions(-) (limited to 'examples') diff --git a/examples/webengine/quicknanobrowser/BrowserWindow.qml b/examples/webengine/quicknanobrowser/BrowserWindow.qml index 193f10ab3..f3bd8e457 100644 --- a/examples/webengine/quicknanobrowser/BrowserWindow.qml +++ b/examples/webengine/quicknanobrowser/BrowserWindow.qml @@ -88,6 +88,7 @@ ApplicationWindow { property alias autoLoadIconsForPage: autoLoadIconsForPage.checked property alias touchIconsEnabled: touchIconsEnabled.checked property alias webRTCPublicInterfacesOnly : webRTCPublicInterfacesOnly.checked + property alias devToolsEnabled: devToolsEnabled.checked } Action { @@ -318,6 +319,12 @@ ApplicationWindow { checkable: true checked: WebEngine.settings.webRTCPublicInterfacesOnly } + MenuItem { + id: devToolsEnabled + text: "Open DevTools" + checkable: true + checked: false + } } } } @@ -476,6 +483,15 @@ ApplicationWindow { } } } + WebEngineView { + id: devToolsView + visible: devToolsEnabled.checked + height: 400 + inspectedView: tabs.currentIndex < tabs.count ? tabs.getTab(tabs.currentIndex).item : null + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + } MessageDialog { id: sslDialog diff --git a/examples/webenginewidgets/simplebrowser/browser.cpp b/examples/webenginewidgets/simplebrowser/browser.cpp index c50974531..5c6dbd35e 100644 --- a/examples/webenginewidgets/simplebrowser/browser.cpp +++ b/examples/webenginewidgets/simplebrowser/browser.cpp @@ -69,7 +69,19 @@ Browser::Browser() BrowserWindow *Browser::createWindow(bool offTheRecord) { auto profile = offTheRecord ? &m_otrProfile : QWebEngineProfile::defaultProfile(); - auto mainWindow = new BrowserWindow(this, profile); + auto mainWindow = new BrowserWindow(this, profile, false); + m_windows.append(mainWindow); + QObject::connect(mainWindow, &QObject::destroyed, [this, mainWindow]() { + m_windows.removeOne(mainWindow); + }); + mainWindow->show(); + return mainWindow; +} + +BrowserWindow *Browser::createDevToolsWindow() +{ + auto profile = QWebEngineProfile::defaultProfile(); + auto mainWindow = new BrowserWindow(this, profile, true); m_windows.append(mainWindow); QObject::connect(mainWindow, &QObject::destroyed, [this, mainWindow]() { m_windows.removeOne(mainWindow); diff --git a/examples/webenginewidgets/simplebrowser/browser.h b/examples/webenginewidgets/simplebrowser/browser.h index 9240cc987..fbc8465d2 100644 --- a/examples/webenginewidgets/simplebrowser/browser.h +++ b/examples/webenginewidgets/simplebrowser/browser.h @@ -66,6 +66,7 @@ public: QVector windows() { return m_windows; } BrowserWindow *createWindow(bool offTheRecord = false); + BrowserWindow *createDevToolsWindow(); DownloadManagerWidget &downloadManagerWidget() { return m_downloadManagerWidget; } diff --git a/examples/webenginewidgets/simplebrowser/browserwindow.cpp b/examples/webenginewidgets/simplebrowser/browserwindow.cpp index 016d58afe..c369a90fa 100644 --- a/examples/webenginewidgets/simplebrowser/browserwindow.cpp +++ b/examples/webenginewidgets/simplebrowser/browserwindow.cpp @@ -67,11 +67,11 @@ #include #include -BrowserWindow::BrowserWindow(Browser *browser, QWebEngineProfile *profile) +BrowserWindow::BrowserWindow(Browser *browser, QWebEngineProfile *profile, bool forDevTools) : m_browser(browser) , m_profile(profile) , m_tabWidget(new TabWidget(profile, this)) - , m_progressBar(new QProgressBar(this)) + , m_progressBar(nullptr) , m_historyBackAction(nullptr) , m_historyForwardAction(nullptr) , m_stopAction(nullptr) @@ -83,49 +83,59 @@ BrowserWindow::BrowserWindow(Browser *browser, QWebEngineProfile *profile) setAttribute(Qt::WA_DeleteOnClose, true); setFocusPolicy(Qt::ClickFocus); - QToolBar *toolbar = createToolBar(); - addToolBar(toolbar); - menuBar()->addMenu(createFileMenu(m_tabWidget)); - menuBar()->addMenu(createEditMenu()); - menuBar()->addMenu(createViewMenu(toolbar)); - menuBar()->addMenu(createWindowMenu(m_tabWidget)); - menuBar()->addMenu(createHelpMenu()); + if (!forDevTools) { + m_progressBar = new QProgressBar(this); + + QToolBar *toolbar = createToolBar(); + addToolBar(toolbar); + menuBar()->addMenu(createFileMenu(m_tabWidget)); + menuBar()->addMenu(createEditMenu()); + menuBar()->addMenu(createViewMenu(toolbar)); + menuBar()->addMenu(createWindowMenu(m_tabWidget)); + menuBar()->addMenu(createHelpMenu()); + } QWidget *centralWidget = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout; layout->setSpacing(0); layout->setMargin(0); - addToolBarBreak(); + if (!forDevTools) { + addToolBarBreak(); - m_progressBar->setMaximumHeight(1); - m_progressBar->setTextVisible(false); - m_progressBar->setStyleSheet(QStringLiteral("QProgressBar {border: 0px} QProgressBar::chunk {background-color: #da4453}")); + m_progressBar->setMaximumHeight(1); + m_progressBar->setTextVisible(false); + m_progressBar->setStyleSheet(QStringLiteral("QProgressBar {border: 0px} QProgressBar::chunk {background-color: #da4453}")); + + layout->addWidget(m_progressBar); + } - layout->addWidget(m_progressBar); layout->addWidget(m_tabWidget); centralWidget->setLayout(layout); setCentralWidget(centralWidget); connect(m_tabWidget, &TabWidget::titleChanged, this, &BrowserWindow::handleWebViewTitleChanged); - connect(m_tabWidget, &TabWidget::linkHovered, [this](const QString& url) { - statusBar()->showMessage(url); - }); - connect(m_tabWidget, &TabWidget::loadProgress, this, &BrowserWindow::handleWebViewLoadProgress); - connect(m_tabWidget, &TabWidget::webActionEnabledChanged, this, &BrowserWindow::handleWebActionEnabledChanged); - connect(m_tabWidget, &TabWidget::urlChanged, [this](const QUrl &url) { - m_urlLineEdit->setText(url.toDisplayString()); - }); - connect(m_tabWidget, &TabWidget::favIconChanged, m_favAction, &QAction::setIcon); - connect(m_urlLineEdit, &QLineEdit::returnPressed, [this]() { - m_tabWidget->setUrl(QUrl::fromUserInput(m_urlLineEdit->text())); - }); + if (!forDevTools) { + connect(m_tabWidget, &TabWidget::linkHovered, [this](const QString& url) { + statusBar()->showMessage(url); + }); + connect(m_tabWidget, &TabWidget::loadProgress, this, &BrowserWindow::handleWebViewLoadProgress); + connect(m_tabWidget, &TabWidget::webActionEnabledChanged, this, &BrowserWindow::handleWebActionEnabledChanged); + connect(m_tabWidget, &TabWidget::urlChanged, [this](const QUrl &url) { + m_urlLineEdit->setText(url.toDisplayString()); + }); + connect(m_tabWidget, &TabWidget::favIconChanged, m_favAction, &QAction::setIcon); + connect(m_tabWidget, &TabWidget::devToolsRequested, this, &BrowserWindow::handleDevToolsRequested); + connect(m_urlLineEdit, &QLineEdit::returnPressed, [this]() { + m_tabWidget->setUrl(QUrl::fromUserInput(m_urlLineEdit->text())); + }); - QAction *focusUrlLineEditAction = new QAction(this); - addAction(focusUrlLineEditAction); - focusUrlLineEditAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_L)); - connect(focusUrlLineEditAction, &QAction::triggered, this, [this] () { - m_urlLineEdit->setFocus(Qt::ShortcutFocusReason); - }); + QAction *focusUrlLineEditAction = new QAction(this); + addAction(focusUrlLineEditAction); + focusUrlLineEditAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_L)); + connect(focusUrlLineEditAction, &QAction::triggered, this, [this] () { + m_urlLineEdit->setFocus(Qt::ShortcutFocusReason); + }); + } handleWebViewTitleChanged(QString()); m_tabWidget->createTab(); @@ -504,3 +514,9 @@ void BrowserWindow::handleShowWindowTriggered() windows.at(offset)->currentTab()->setFocus(); } } + +void BrowserWindow::handleDevToolsRequested(QWebEnginePage *source) +{ + source->setDevToolsPage(m_browser->createDevToolsWindow()->currentTab()->page()); + source->triggerAction(QWebEnginePage::InspectElement); +} diff --git a/examples/webenginewidgets/simplebrowser/browserwindow.h b/examples/webenginewidgets/simplebrowser/browserwindow.h index b522a6b9d..8f328b751 100644 --- a/examples/webenginewidgets/simplebrowser/browserwindow.h +++ b/examples/webenginewidgets/simplebrowser/browserwindow.h @@ -69,7 +69,7 @@ class BrowserWindow : public QMainWindow Q_OBJECT public: - BrowserWindow(Browser *browser, QWebEngineProfile *profile); + BrowserWindow(Browser *browser, QWebEngineProfile *profile, bool forDevTools = false); QSize sizeHint() const override; TabWidget *tabWidget() const; WebView *currentTab() const; @@ -87,6 +87,7 @@ private slots: void handleWebViewLoadProgress(int); void handleWebViewTitleChanged(const QString &title); void handleWebActionEnabledChanged(QWebEnginePage::WebAction action, bool enabled); + void handleDevToolsRequested(QWebEnginePage *source); private: QMenu *createFileMenu(TabWidget *tabWidget); diff --git a/examples/webenginewidgets/simplebrowser/tabwidget.cpp b/examples/webenginewidgets/simplebrowser/tabwidget.cpp index e7376c7a5..8b458a9af 100644 --- a/examples/webenginewidgets/simplebrowser/tabwidget.cpp +++ b/examples/webenginewidgets/simplebrowser/tabwidget.cpp @@ -190,6 +190,7 @@ void TabWidget::setupView(WebView *webView) if (index >= 0) closeTab(index); }); + connect(webView, &WebView::devToolsRequested, this, &TabWidget::devToolsRequested); } WebView *TabWidget::createTab() diff --git a/examples/webenginewidgets/simplebrowser/tabwidget.h b/examples/webenginewidgets/simplebrowser/tabwidget.h index 5b09f2708..bf83781df 100644 --- a/examples/webenginewidgets/simplebrowser/tabwidget.h +++ b/examples/webenginewidgets/simplebrowser/tabwidget.h @@ -77,6 +77,7 @@ signals: void urlChanged(const QUrl &url); void favIconChanged(const QIcon &icon); void webActionEnabledChanged(QWebEnginePage::WebAction action, bool enabled); + void devToolsRequested(QWebEnginePage *source); public slots: // current tab/page slots diff --git a/examples/webenginewidgets/simplebrowser/webview.cpp b/examples/webenginewidgets/simplebrowser/webview.cpp index 868cca037..ab42c4a0a 100644 --- a/examples/webenginewidgets/simplebrowser/webview.cpp +++ b/examples/webenginewidgets/simplebrowser/webview.cpp @@ -167,6 +167,7 @@ QWebEngineView *WebView::createWindow(QWebEnginePage::WebWindowType type) } case QWebEnginePage::WebDialog: { WebPopupWindow *popup = new WebPopupWindow(page()->profile()); + connect(popup->view(), &WebView::devToolsRequested, this, &WebView::devToolsRequested); return popup->view(); } } @@ -185,6 +186,13 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) menu->insertAction(before, page()->action(QWebEnginePage::OpenLinkInNewWindow)); menu->insertAction(before, page()->action(QWebEnginePage::OpenLinkInNewTab)); } + it = std::find(actions.cbegin(), actions.cend(), page()->action(QWebEnginePage::InspectElement)); + if (it == actions.cend()) { + QAction *action = new QAction(menu); + action->setText("Inspect Element"); + connect(action, &QAction::triggered, [this]() { emit devToolsRequested(page()); }); + menu->addAction(action); + } menu->popup(event->globalPos()); } diff --git a/examples/webenginewidgets/simplebrowser/webview.h b/examples/webenginewidgets/simplebrowser/webview.h index 7276ab1c4..8559a68b8 100644 --- a/examples/webenginewidgets/simplebrowser/webview.h +++ b/examples/webenginewidgets/simplebrowser/webview.h @@ -75,6 +75,7 @@ protected: signals: void webActionEnabledChanged(QWebEnginePage::WebAction webAction, bool enabled); void favIconChanged(const QIcon &icon); + void devToolsRequested(QWebEnginePage *source); private: void createWebActionTrigger(QWebEnginePage *page, QWebEnginePage::WebAction); -- cgit v1.2.3