Merge lp:~osomon/webbrowser-app/F11-fullscreen into lp:webbrowser-app

Proposed by Olivier Tilloy
Status: Merged
Approved by: Olivier Tilloy
Approved revision: 1099
Merged at revision: 1064
Proposed branch: lp:~osomon/webbrowser-app/F11-fullscreen
Merge into: lp:webbrowser-app
Prerequisite: lp:~uriboni/webbrowser-app/keyboard-navigation
Diff against target: 334 lines (+176/-63)
5 files modified
src/app/BrowserWindow.qml (+10/-8)
src/app/ChromeController.qml (+22/-14)
src/app/webbrowser/Browser.qml (+4/-8)
src/app/webbrowser/webbrowser-app.qml (+19/-0)
tests/autopilot/webbrowser_app/tests/test_fullscreen.py (+121/-33)
To merge this branch: bzr merge lp:~osomon/webbrowser-app/F11-fullscreen
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Needs Fixing
Ugo Riboni Pending
Review via email: mp+262228@code.launchpad.net

Commit message

Toggle application-level fullscreen when pressing F11.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/app/BrowserWindow.qml'
2--- src/app/BrowserWindow.qml 2015-04-07 14:30:52 +0000
3+++ src/app/BrowserWindow.qml 2015-06-17 14:29:48 +0000
4@@ -39,14 +39,16 @@
5
6 Connections {
7 target: window.currentWebview
8- onFullscreenChanged: {
9- if (!window.forceFullscreen) {
10- if (window.currentWebview.fullscreen) {
11- internal.currentWindowState = window.visibility
12- window.visibility = Window.FullScreen
13- } else {
14- window.visibility = internal.currentWindowState
15- }
16+ onFullscreenChanged: window.setFullscreen(window.currentWebview.fullscreen)
17+ }
18+
19+ function setFullscreen(fullscreen) {
20+ if (!window.forceFullscreen) {
21+ if (fullscreen) {
22+ internal.currentWindowState = window.visibility
23+ window.visibility = Window.FullScreen
24+ } else {
25+ window.visibility = internal.currentWindowState
26 }
27 }
28 }
29
30=== modified file 'src/app/ChromeController.qml'
31--- src/app/ChromeController.qml 2015-05-11 19:12:03 +0000
32+++ src/app/ChromeController.qml 2015-06-17 14:29:48 +0000
33@@ -26,20 +26,27 @@
34 property bool forceHide: false
35 property int defaultMode: Oxide.LocationBarController.ModeAuto
36
37- onForceHideChanged: {
38- if (!webview) {
39- return
40- }
41- webview.locationBarController.animated = false
42- if (forceHide) {
43- webview.locationBarController.mode = Oxide.LocationBarController.ModeHidden
44- } else if (!webview.fullscreen) {
45- webview.locationBarController.mode = defaultMode
46- if (webview.locationBarController.mode == Oxide.LocationBarController.ModeAuto) {
47- webview.locationBarController.show(false)
48- }
49- }
50- webview.locationBarController.animated = true
51+ onWebviewChanged: internal.updateVisibility()
52+ onForceHideChanged: internal.updateVisibility()
53+
54+ QtObject {
55+ id: internal
56+
57+ function updateVisibility() {
58+ if (!webview) {
59+ return
60+ }
61+ webview.locationBarController.animated = false
62+ if (forceHide) {
63+ webview.locationBarController.mode = Oxide.LocationBarController.ModeHidden
64+ } else if (!webview.fullscreen) {
65+ webview.locationBarController.mode = defaultMode
66+ if (webview.locationBarController.mode == Oxide.LocationBarController.ModeAuto) {
67+ webview.locationBarController.show(false)
68+ }
69+ }
70+ webview.locationBarController.animated = true
71+ }
72 }
73
74 Connections {
75@@ -63,6 +70,7 @@
76 onLoadEvent: {
77 // When loading, force ModeShown until the load is committed or stopped,
78 // to work around https://launchpad.net/bugs/1453908.
79+ if (forceHide) return
80 if (event.type == Oxide.LoadEvent.TypeStarted) {
81 webview.locationBarController.mode = Oxide.LocationBarController.ModeShown
82 } else if ((event.type == Oxide.LoadEvent.TypeCommitted) ||
83
84=== modified file 'src/app/webbrowser/Browser.qml'
85--- src/app/webbrowser/Browser.qml 2015-06-17 14:29:48 +0000
86+++ src/app/webbrowser/Browser.qml 2015-06-17 14:29:48 +0000
87@@ -33,6 +33,9 @@
88 BrowserView {
89 id: browser
90
91+ // Should be true when the containing window is fullscreen.
92+ property bool fullscreen: false
93+
94 currentWebview: tabsModel && tabsModel.currentTab ? tabsModel.currentTab.webview : null
95
96 property var historyModel: (historyModelLoader.status == Loader.Ready) ? historyModelLoader.item : null
97@@ -142,13 +145,6 @@
98 top: recentView.visible ? invisibleTabChrome.bottom : parent.top
99 }
100 height: parent.height - osk.height - (recentView.visible ? invisibleTabChrome.height : 0)
101-
102- Keys.onEscapePressed: {
103- if (browser.currentWebview && browser.currentWebview.fullscreen) {
104- event.accepted = true
105- browser.currentWebview.fullscreen = false
106- }
107- }
108 }
109
110 Loader {
111@@ -362,7 +358,7 @@
112 ChromeController {
113 id: chromeController
114 webview: browser.currentWebview
115- forceHide: recentView.visible
116+ forceHide: recentView.visible || browser.fullscreen
117 defaultMode: (formFactor == "desktop") ? Oxide.LocationBarController.ModeShown
118 : Oxide.LocationBarController.ModeAuto
119 }
120
121=== modified file 'src/app/webbrowser/webbrowser-app.qml'
122--- src/app/webbrowser/webbrowser-app.qml 2015-03-23 22:35:12 +0000
123+++ src/app/webbrowser/webbrowser-app.qml 2015-06-17 14:29:48 +0000
124@@ -17,6 +17,7 @@
125 */
126
127 import QtQuick 2.0
128+import QtQuick.Window 2.1
129 import Ubuntu.Components 1.1
130 import ".."
131
132@@ -43,7 +44,25 @@
133 webbrowserWindow: webbrowserWindowProxy
134 developerExtrasEnabled: window.developerExtrasEnabled
135
136+ fullscreen: window.visibility === Window.FullScreen
137+
138 Component.onCompleted: i18n.domain = "webbrowser-app"
139+
140+ Keys.onPressed: {
141+ if ((event.key === Qt.Key_F11) && (event.modifiers === Qt.NoModifier)) {
142+ // F11 to toggle application-level fullscreen
143+ window.setFullscreen(window.visibility !== Window.FullScreen)
144+ if (currentWebview.fullscreen) {
145+ currentWebview.fullscreen = false
146+ }
147+ }
148+ }
149+ Keys.onEscapePressed: {
150+ // ESC to exit fullscreen, regardless of whether it was requested
151+ // by the page or toggled on by the user.
152+ window.setFullscreen(false)
153+ currentWebview.fullscreen = false
154+ }
155 }
156
157 // Handle runtime requests to open urls as defined
158
159=== modified file 'tests/autopilot/webbrowser_app/tests/test_fullscreen.py'
160--- tests/autopilot/webbrowser_app/tests/test_fullscreen.py 2015-04-17 15:46:11 +0000
161+++ tests/autopilot/webbrowser_app/tests/test_fullscreen.py 2015-06-17 14:29:48 +0000
162@@ -16,51 +16,139 @@
163
164 from webbrowser_app.tests import StartOpenRemotePageTestCaseBase
165
166+import testtools
167 from testtools.matchers import Equals, LessThan
168 from autopilot.matchers import Eventually
169 from autopilot.platform import model
170
171
172-class TestFullscreen(StartOpenRemotePageTestCaseBase):
173+class TestFullscreenBase(StartOpenRemotePageTestCaseBase):
174
175 # Ref: http://doc.qt.io/qt-5/qwindow.html#Visibility-enum
176 QWINDOW_FULLSCREEN = 5
177
178- def assert_eventually_windowed(self):
179- self.assertThat(self.main_window.get_current_webview().fullscreen,
180- Eventually(Equals(False)))
181- self.assertThat(self.main_window.get_window().visibility,
182- Eventually(LessThan(self.QWINDOW_FULLSCREEN)))
183-
184- def assert_eventually_fullscreen(self):
185- self.assertThat(self.main_window.get_current_webview().fullscreen,
186- Eventually(Equals(True)))
187- self.assertThat(self.main_window.get_window().visibility,
188- Eventually(Equals(self.QWINDOW_FULLSCREEN)))
189-
190- def test_toggle_fullscreen(self):
191- self.assert_eventually_windowed()
192- url = self.base_url + "/fullscreen"
193- self.main_window.go_to_url(url)
194- self.main_window.wait_until_page_loaded(url)
195- self.assert_eventually_windowed()
196+ def assert_webview_fullscreen(self, fullscreen):
197+ self.assertThat(self.main_window.get_current_webview().fullscreen,
198+ Eventually(Equals(fullscreen)))
199+
200+ def assert_window_fullscreen(self, fullscreen):
201+ if fullscreen:
202+ self.assertThat(self.main_window.get_window().visibility,
203+ Eventually(Equals(self.QWINDOW_FULLSCREEN)))
204+ else:
205+ self.assertThat(self.main_window.get_window().visibility,
206+ Eventually(LessThan(self.QWINDOW_FULLSCREEN)))
207+
208+
209+class TestPageInitiatedFullscreen(TestFullscreenBase):
210+
211+ def setUp(self):
212+ super(TestPageInitiatedFullscreen, self).setUp(path="/fullscreen")
213+ self.assert_webview_fullscreen(False)
214+ self.assert_window_fullscreen(False)
215 webview = self.main_window.get_current_webview()
216 self.pointing_device.click_object(webview)
217- self.assert_eventually_fullscreen()
218+ self.assert_webview_fullscreen(True)
219+ self.assert_window_fullscreen(True)
220+
221+ def test_page_initiated_exit(self):
222+ webview = self.main_window.get_current_webview()
223 hint = webview.wait_select_single(objectName="fullscreenExitHint")
224 self.pointing_device.click_object(webview)
225- self.assert_eventually_windowed()
226+ self.assert_webview_fullscreen(False)
227+ self.assert_window_fullscreen(False)
228 hint.wait_until_destroyed()
229
230- def test_exit_fullscreen(self):
231- url = self.base_url + "/fullscreen"
232- self.main_window.go_to_url(url)
233- self.main_window.wait_until_page_loaded(url)
234- webview = self.main_window.get_current_webview()
235- self.pointing_device.click_object(webview)
236- self.assert_eventually_fullscreen()
237- if model() == 'Desktop':
238- self.keyboard.press_and_release('Escape')
239- else:
240- self.open_tabs_view()
241- self.assert_eventually_windowed()
242+ @testtools.skipIf(model() == "Desktop", "on touch devices only")
243+ def test_user_exit_swipe_up(self):
244+ self.open_tabs_view()
245+ self.assert_webview_fullscreen(False)
246+ self.assert_window_fullscreen(False)
247+
248+ @testtools.skipIf(model() != "Desktop", "on desktop only")
249+ def test_user_exit_ESC(self):
250+ self.main_window.press_key('Escape')
251+ self.assert_webview_fullscreen(False)
252+ self.assert_window_fullscreen(False)
253+
254+ @testtools.skipIf(model() != "Desktop", "on desktop only")
255+ def test_user_exit_F11(self):
256+ self.main_window.press_key('F11')
257+ self.assert_webview_fullscreen(False)
258+ self.assert_window_fullscreen(False)
259+
260+
261+@testtools.skipIf(model() != "Desktop", "on desktop only")
262+class TestUserInitiatedFullscreen(TestFullscreenBase):
263+
264+ def setUp(self):
265+ super(TestUserInitiatedFullscreen, self).setUp()
266+ self.assert_webview_fullscreen(False)
267+ self.assert_window_fullscreen(False)
268+ self.main_window.press_key('F11')
269+ self.assert_window_fullscreen(True)
270+ self.assert_webview_fullscreen(False)
271+
272+ def test_user_exit_ESC(self):
273+ self.main_window.press_key('Escape')
274+ self.assert_window_fullscreen(False)
275+ self.assert_webview_fullscreen(False)
276+
277+ def test_user_exit_F11(self):
278+ self.main_window.press_key('F11')
279+ self.assert_window_fullscreen(False)
280+ self.assert_webview_fullscreen(False)
281+
282+
283+class TestForcedFullscreen(TestFullscreenBase):
284+
285+ def setUp(self):
286+ self.ARGS = self.ARGS + ["--fullscreen"]
287+ super(TestForcedFullscreen, self).setUp(path="/fullscreen")
288+ self.assert_window_fullscreen(True)
289+ self.assert_webview_fullscreen(False)
290+
291+ def tearDown(self):
292+ super(TestForcedFullscreen, self).tearDown()
293+ self.assert_window_fullscreen(True)
294+
295+ @testtools.skipIf(model() == "Desktop", "on touch devices only")
296+ def test_disabled_user_exit_swipe_up(self):
297+ self.open_tabs_view()
298+
299+ @testtools.skipIf(model() != "Desktop", "on desktop only")
300+ def test_disabled_user_exit_ESC(self):
301+ self.main_window.press_key('Escape')
302+
303+ @testtools.skipIf(model() != "Desktop", "on desktop only")
304+ def test_disabled_user_exit_F11(self):
305+ self.main_window.press_key('F11')
306+
307+ def trigger_page_fullscreen(self):
308+ webview = self.main_window.get_current_webview()
309+ self.pointing_device.click_object(webview)
310+ self.assert_webview_fullscreen(True)
311+
312+ def test_page_exit(self):
313+ self.trigger_page_fullscreen()
314+ webview = self.main_window.get_current_webview()
315+ self.pointing_device.click_object(webview)
316+ self.assert_webview_fullscreen(False)
317+
318+ @testtools.skipIf(model() == "Desktop", "on touch devices only")
319+ def test_user_exit_swipe_up(self):
320+ self.trigger_page_fullscreen()
321+ self.open_tabs_view()
322+ self.assert_webview_fullscreen(False)
323+
324+ @testtools.skipIf(model() != "Desktop", "on desktop only")
325+ def test_user_exit_ESC(self):
326+ self.trigger_page_fullscreen()
327+ self.main_window.press_key('Escape')
328+ self.assert_webview_fullscreen(False)
329+
330+ @testtools.skipIf(model() != "Desktop", "on desktop only")
331+ def test_user_exit_F11(self):
332+ self.trigger_page_fullscreen()
333+ self.main_window.press_key('F11')
334+ self.assert_webview_fullscreen(False)

Subscribers

People subscribed via source and target branches

to status/vote changes: