From 281f8c2e4a5787aadf4c978139358141f626b8a4 Mon Sep 17 00:00:00 2001
From: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
Date: Tue, 25 Aug 2015 17:16:49 +0200
Subject: [PATCH] Add exit full screen web action

Adds a web action that can be used for exiting fullscreen mode, and
include it the context menu whenever in fullscreen mode.

Change-Id: I7aa729a86f9ba9df476766cd40f87d9385948fea
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
---
 src/core/web_contents_adapter.cpp           | 6 ++++++
 src/core/web_contents_adapter.h             | 1 +
 src/webengine/api/qquickwebengineview.cpp   | 8 ++++++++
 src/webengine/api/qquickwebengineview_p.h   | 1 +
 src/webenginewidgets/api/qwebenginepage.cpp | 8 ++++++++
 src/webenginewidgets/api/qwebenginepage.h   | 1 +
 6 files changed, 25 insertions(+)

diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index 1e0d261da..a01164f1a 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -800,6 +800,12 @@ void WebContentsAdapter::inspectElementAt(const QPoint &location)
     }
 }
 
+void WebContentsAdapter::exitFullScreen()
+{
+    Q_D(WebContentsAdapter);
+    d->webContents->ExitFullscreen();
+}
+
 void WebContentsAdapter::wasShown()
 {
     Q_D(WebContentsAdapter);
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index 1e78f8e77..ca2f32ebe 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -126,6 +126,7 @@ public:
     void executeMediaPlayerActionAt(const QPoint &location, MediaPlayerAction action, bool enable);
 
     void inspectElementAt(const QPoint &location);
+    void exitFullScreen();
 
     void wasShown();
     void wasHidden();
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 9a8a6ccb3..e123bda8f 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -266,6 +266,11 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu
         QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::CopyImageToClipboard); });
         ui()->addMenuItem(item, QObject::tr("Copy Image"));
     }
+    if (isFullScreen()) {
+        item = new MenuItemHandler(menu);
+        QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::ExitFullScreen); });
+        ui()->addMenuItem(item, QObject::tr("Exit Full Screen Mode"));
+    }
 
     // FIXME: expose the context menu data as an attached property to make this more useful
     if (contextMenuExtraItems) {
@@ -1292,6 +1297,9 @@ void QQuickWebEngineView::triggerWebAction(WebAction action)
     case InspectElement:
         d->adapter->inspectElementAt(d->contextMenuData.pos);
         break;
+    case ExitFullScreen:
+        d->adapter->exitFullScreen();
+        break;
     default:
         Q_UNREACHABLE();
     }
diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h
index 934303722..c7625d209 100644
--- a/src/webengine/api/qquickwebengineview_p.h
+++ b/src/webengine/api/qquickwebengineview_p.h
@@ -224,6 +224,7 @@ public:
         DownloadMediaToDisk,
 
         InspectElement,
+        ExitFullScreen,
 
         WebActionCount
     };
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 1cf51df72..472e95871 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -595,6 +595,9 @@ QAction *QWebEnginePage::action(WebAction action) const
     case InspectElement:
         text = tr("Inspect Element");
         break;
+    case ExitFullScreen:
+        text = tr("Exit Full Screen Mode");
+        break;
     default:
         break;
     }
@@ -762,6 +765,9 @@ void QWebEnginePage::triggerAction(WebAction action, bool)
     case InspectElement:
         d->adapter->inspectElementAt(d->m_menuData.pos);
         break;
+    case ExitFullScreen:
+        d->adapter->exitFullScreen();
+        break;
     default:
         Q_UNREACHABLE();
     }
@@ -968,6 +974,8 @@ QMenu *QWebEnginePage::createStandardContextMenu()
     } else if (contextMenuData.mediaType == WebEngineContextMenuData::MediaTypeCanvas) {
         menu->addAction(QWebEnginePage::action(CopyImageToClipboard));
     }
+    if (d->isFullScreen())
+        menu->addAction(QWebEnginePage::action(ExitFullScreen));
 
     return menu;
 }
diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h
index c324f3737..d027998ee 100644
--- a/src/webenginewidgets/api/qwebenginepage.h
+++ b/src/webenginewidgets/api/qwebenginepage.h
@@ -107,6 +107,7 @@ public:
         DownloadMediaToDisk,
 
         InspectElement,
+        ExitFullScreen,
 
         WebActionCount
     };
-- 
GitLab