diff options
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Main.html | 2 | ||||
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js | 24 | ||||
-rw-r--r-- | Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp | 26 | ||||
-rw-r--r-- | Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h | 3 | ||||
-rw-r--r-- | Source/WebKit/qt/WidgetApi/qwebframe.h | 4 | ||||
-rw-r--r-- | Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.cpp | 44 | ||||
-rw-r--r-- | Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.h | 7 | ||||
-rw-r--r-- | Source/cmake/OptionsQt.cmake | 5 |
8 files changed, 98 insertions, 17 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Main.html b/Source/WebInspectorUI/UserInterface/Main.html index f080f7f55..8718f7941 100644 --- a/Source/WebInspectorUI/UserInterface/Main.html +++ b/Source/WebInspectorUI/UserInterface/Main.html @@ -26,7 +26,7 @@ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src * file: blob: resource: qrc:; connect-src * ws:; media-src * blob:; font-src * blob:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'"> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src * file: blob: resource: qrc:; connect-src * blob: ws:; media-src * blob:; font-src * blob:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'"> <link rel="stylesheet" href="External/CodeMirror/codemirror.css"> diff --git a/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js b/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js index 54fb13a85..be8b2ad63 100644 --- a/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js +++ b/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js @@ -45,8 +45,28 @@ WebInspector.ImageResourceContentView = class ImageResourceContentView extends W var objectURL = this.resource.createObjectURL(); this._imageElement = document.createElement("img"); - this._imageElement.addEventListener("load", function() { URL.revokeObjectURL(objectURL); }); - this._imageElement.src = objectURL; + this._imageElement.dataset.url = this.resource.url; + + var imageElement = this._imageElement; + var xhr = new XMLHttpRequest(); + xhr.open("GET", objectURL, true); + xhr.responseType = "blob"; + xhr.onload = function() { + if (this.status == 200) { + var reader = new FileReader(); + reader.onload = function() { + imageElement.src = reader.result; + + URL.revokeObjectURL(objectURL); + } + + reader.readAsDataURL(this.response); + } else { + imageElement.addEventListener("load", function() { URL.revokeObjectURL(objectURL) }); + imageElement.src = objectURL; + } + }; + xhr.send(); this.element.appendChild(this._imageElement); } diff --git a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp index 1c14fcd07..b3b49f5d6 100644 --- a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp +++ b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp @@ -192,19 +192,6 @@ static WebCore::FrameLoadRequest frameLoadRequest(const QUrl &url, WebCore::Fram ); } -static void openNewWindow(const QUrl& url, Frame* frame) -{ - if (Page* oldPage = frame->page()) { - WindowFeatures features; - NavigationAction action; - FrameLoadRequest request = frameLoadRequest(url, frame); - if (Page* newPage = oldPage->chrome().createWindow(frame, request, features, action)) { - newPage->mainFrame().loader().loadFrameRequest(request, /*event*/ 0, /*FormState*/ 0); - newPage->chrome().show(); - } - } -} - // FIXME: Find a better place static UserContentController& userContentProvider() { @@ -1590,3 +1577,16 @@ bool QWebPageAdapter::swallowContextMenuEvent(QContextMenuEvent *event, QWebFram return !menu; } + +void QWebPageAdapter::openNewWindow(const QUrl& url, Frame* frame) +{ + if (Page* oldPage = frame->page()) { + WindowFeatures features; + NavigationAction action; + FrameLoadRequest request = frameLoadRequest(url, frame); + if (Page* newPage = oldPage->chrome().createWindow(frame, request, features, action)) { + newPage->mainFrame().loader().loadFrameRequest(request, /*event*/ 0, /*FormState*/ 0); + newPage->chrome().show(); + } + } +} diff --git a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h index 1b7199a9c..e9c93958d 100644 --- a/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h +++ b/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h @@ -49,6 +49,7 @@ class ChromeClientQt; class DeviceOrientationClient; class DeviceMotionClient; class GeolocationClientQt; +class Frame; class Page; class UndoStep; struct ViewportArguments; @@ -395,6 +396,8 @@ public: const QWebElement& fullScreenElement() const; void setFullScreenElement(const QWebElement&); + static void openNewWindow(const QUrl&, WebCore::Frame*); + QWebSettings *settings; WebCore::Page *page; diff --git a/Source/WebKit/qt/WidgetApi/qwebframe.h b/Source/WebKit/qt/WidgetApi/qwebframe.h index a3374ff13..9502618ff 100644 --- a/Source/WebKit/qt/WidgetApi/qwebframe.h +++ b/Source/WebKit/qt/WidgetApi/qwebframe.h @@ -59,6 +59,9 @@ namespace WebCore { class ChromeClientQt; class TextureMapperLayerClientQt; } +namespace WebKit { + class InspectorClientWebPage; +} class QWebFrameData; class QWebHitTestResultPrivate; class QWebFrame; @@ -242,6 +245,7 @@ private: friend class WebCore::FrameLoaderClientQt; friend class WebCore::ChromeClientQt; friend class WebCore::TextureMapperLayerClientQt; + friend class WebKit::InspectorClientWebPage; QWebFramePrivate *d; Q_PRIVATE_SLOT(d, void _q_orientationChanged()) }; diff --git a/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.cpp b/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.cpp index 9b2ba7dfd..2d498c5b8 100644 --- a/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.cpp +++ b/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.cpp @@ -32,7 +32,14 @@ #include "config.h" #include "InspectorClientWebPage.h" +#include <QApplication> +#include <QClipboard> +#include <QContextMenuEvent> + +#include <qwebelement.h> #include <qwebframe.h> +#include <qwebframe_p.h> +#include <qwebpage_p.h> using namespace WebKit; @@ -67,6 +74,18 @@ QWebPage* InspectorClientWebPage::createWindow(QWebPage::WebWindowType) return page; } +bool InspectorClientWebPage::event(QEvent* ev) +{ + if (ev->type() == QEvent::ContextMenu) { + auto* contextMenuEvent = static_cast<QContextMenuEvent*>(ev); + + if (contextMenuEvent) + m_clickPos = contextMenuEvent->pos(); + } + + return QWebPage::event(ev); +} + void InspectorClientWebPage::javaScriptWindowObjectCleared() { QVariant inspectorJavaScriptWindowObjects = property("_q_inspectorJavaScriptWindowObjects"); @@ -83,3 +102,28 @@ void InspectorClientWebPage::javaScriptWindowObjectCleared() } } +void InspectorClientWebPage::triggerAction(WebAction action, bool checked) +{ + const QWebHitTestResult hitTestResult = mainFrame()->hitTestContent(m_clickPos); + + if (hitTestResult.imageUrl().isValid() && hitTestResult.element().hasAttribute(QStringLiteral("data-url"))) { + switch (action) { + case OpenImageInNewWindow: { + auto* frame = static_cast<QWebFramePrivate*>(hitTestResult.frame()->d); + + if (frame) { + QWebPagePrivate::openNewWindow(QUrl(hitTestResult.element().attribute(QStringLiteral("data-url"))), frame->frame); + return; + } + } + + case CopyImageUrlToClipboard: + QApplication::clipboard()->setText(hitTestResult.element().attribute(QStringLiteral("data-url"))); + return; + default: + break; + } + } + + QWebPage::triggerAction(action, checked); +} diff --git a/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.h b/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.h index 59cf74135..d996587cc 100644 --- a/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.h +++ b/Source/WebKit/qt/WidgetSupport/InspectorClientWebPage.h @@ -43,9 +43,16 @@ public: InspectorClientWebPage(); QWebPage* createWindow(QWebPage::WebWindowType) final; + bool event(QEvent*) final; public Q_SLOTS: void javaScriptWindowObjectCleared(); + +protected: + void triggerAction(WebAction, bool checked = false) final; + +private: + QPoint m_clickPos; }; } // namespace WebKit diff --git a/Source/cmake/OptionsQt.cmake b/Source/cmake/OptionsQt.cmake index d582ead76..0eef49095 100644 --- a/Source/cmake/OptionsQt.cmake +++ b/Source/cmake/OptionsQt.cmake @@ -33,10 +33,13 @@ if (QT_CONAN_DIR) set(_conan_imports_dest \"\${_absolute_destdir}\${_conan_imports_dest}\") endif () + message(\"Importing dependencies from conan to \${_conan_imports_dest}\") execute_process( - COMMAND conan imports -f \"${QT_CONAN_DIR}/conanfile.txt\" --dest \${_conan_imports_dest} + COMMAND conan imports --import-folder \${_conan_imports_dest} \"${QT_CONAN_DIR}/conanfile.txt\" WORKING_DIRECTORY \"${QT_CONAN_DIR}\" + RESULT_VARIABLE _conan_imports_result ) + message(\"conan imports result: \${_conan_imports_result}\") set(_conan_imports_manifest \"\${_conan_imports_dest}/conan_imports_manifest.txt\") if (EXISTS \${_conan_imports_manifest}) |