summaryrefslogtreecommitdiffstats
path: root/src/core/web_contents_adapter.h
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2017-02-16 15:33:02 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-02-21 23:56:38 +0000
commit37206c2baf013b07cd26d416a8ab0db493d7d651 (patch)
tree5e66dea31e8ade60d7180c6122e74c038b78d367 /src/core/web_contents_adapter.h
parent905017117d38d799bc95d6cfdd0195b717b605b8 (diff)
Fix Q_ASSERT when dragging an item over WebEngineView
When dragging something over a WebEngineView we're waiting for the result of the asynchronous DragTargetDragOver using a RunLoop. The result will be delivered by a call to updateDragAction. The RunLoop will call MessagePumpForUIQt::Run which spins a QEventLoop. The QEventLoop will dispatch more posted QDragMoveEvent objects while we're handling the current QDragMoveEvent. This triggers a recursion guard's Q_ASSERT when dragging from a QtQuick item onto a WebEngineView. When waiting for the DragTargetDragOver result we're not interested in Qt events. Instead of using a RunLoop, implement a poor man's chromium event loop and actively wait for updateDragAction being called. In practice, no more than two iterations of the loop are run until updateDragAction is called. Therefore the extra CPU and sleep times are negligible. Task-number: QTBUG-58920 Change-Id: Icfdf9c680c4c9987ac3dbb41fbc3e1403af0fa9f Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'src/core/web_contents_adapter.h')
-rw-r--r--src/core/web_contents_adapter.h5
1 files changed, 2 insertions, 3 deletions
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index 5b2f9a942..803b1eb57 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -167,10 +167,8 @@ public:
void enterDrag(QDragEnterEvent *e, const QPoint &screenPos);
Qt::DropAction updateDragPosition(QDragMoveEvent *e, const QPoint &screenPos);
void updateDragAction(int action);
- void finishDragUpdate();
void endDragging(const QPoint &clientPos, const QPoint &screenPos);
void leaveDrag();
- void initUpdateDragCursorMessagePollingTimer();
void printToPDF(const QPageLayout&, const QString&);
quint64 printToPDFCallbackResult(const QPageLayout &, const bool colorMode = true);
@@ -186,8 +184,9 @@ public:
private:
Q_DISABLE_COPY(WebContentsAdapter)
Q_DECLARE_PRIVATE(WebContentsAdapter)
- QScopedPointer<WebContentsAdapterPrivate> d_ptr;
+ void waitForUpdateDragActionCalled();
+ QScopedPointer<WebContentsAdapterPrivate> d_ptr;
};
} // namespace QtWebEngineCore