Merge lp:~osomon/webbrowser-app/address-downloads-issues into lp:webbrowser-app
- address-downloads-issues
- Merge into trunk
Proposed by
Olivier Tilloy
Status: | Merged |
---|---|
Approved by: | Olivier Tilloy |
Approved revision: | 1336 |
Merged at revision: | 1326 |
Proposed branch: | lp:~osomon/webbrowser-app/address-downloads-issues |
Merge into: | lp:webbrowser-app |
Prerequisite: | lp:~michael-sheldon/webbrowser-app/fix-1531179 |
Diff against target: |
775 lines (+137/-147) 15 files modified
src/app/BrowserView.qml (+2/-2) src/app/Downloader.qml (+5/-8) src/app/webbrowser/Browser.qml (+20/-20) src/app/webbrowser/BrowserPageHeader.qml (+6/-0) src/app/webbrowser/ContentDownloadDialog.qml (+15/-17) src/app/webbrowser/ContentPickerDialog.qml (+7/-7) src/app/webbrowser/DownloadDelegate.qml (+16/-8) src/app/webbrowser/DownloadHandler.qml (+10/-9) src/app/webbrowser/DownloadsModel.qml (+0/-24) src/app/webbrowser/DownloadsPage.qml (+11/-8) src/app/webbrowser/downloads-model.cpp (+19/-11) src/app/webbrowser/downloads-model.h (+3/-2) src/app/webbrowser/webbrowser-app.cpp (+14/-29) tests/unittests/downloads-model/tst_DownloadsModelTests.cpp (+8/-1) tests/unittests/qml/tst_Suggestions.qml (+1/-1) |
To merge this branch: | bzr merge lp:~osomon/webbrowser-app/address-downloads-issues |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michael Sheldon (community) | Approve | ||
PS Jenkins bot | continuous-integration | Needs Fixing | |
Review via email: mp+282319@code.launchpad.net |
Commit message
Address a number of minor functional and code issues in the new downloads-
Description of the change
To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : | # |
review:
Needs Fixing
(continuous-integration)
Revision history for this message
Michael Sheldon (michael-sheldon) wrote : | # |
Looks good :)
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/app/BrowserView.qml' |
2 | --- src/app/BrowserView.qml 2015-08-10 15:22:00 +0000 |
3 | +++ src/app/BrowserView.qml 2016-01-12 17:42:01 +0000 |
4 | @@ -1,5 +1,5 @@ |
5 | /* |
6 | - * Copyright 2013-2015 Canonical Ltd. |
7 | + * Copyright 2013-2016 Canonical Ltd. |
8 | * |
9 | * This file is part of webbrowser-app. |
10 | * |
11 | @@ -20,7 +20,7 @@ |
12 | import Ubuntu.Components 1.3 |
13 | import Ubuntu.Unity.Action 1.1 as UnityActions |
14 | |
15 | -Item { |
16 | +FocusScope { |
17 | property bool developerExtrasEnabled: false |
18 | |
19 | property var currentWebview: null |
20 | |
21 | === modified file 'src/app/Downloader.qml' |
22 | --- src/app/Downloader.qml 2015-12-16 15:03:32 +0000 |
23 | +++ src/app/Downloader.qml 2016-01-12 17:42:01 +0000 |
24 | @@ -1,5 +1,5 @@ |
25 | /* |
26 | - * Copyright 2014-2015 Canonical Ltd. |
27 | + * Copyright 2014-2016 Canonical Ltd. |
28 | * |
29 | * This file is part of webbrowser-app. |
30 | * |
31 | @@ -54,13 +54,11 @@ |
32 | } |
33 | |
34 | function download(url, contentType, headers, metadata) { |
35 | - var singleDownload = downloadComponent.createObject(downloadItem) |
36 | - singleDownload.contentType = contentType |
37 | - if (headers) { |
38 | - singleDownload.headers = headers |
39 | + var properties = {'contentType': contentType, 'metadata': metadata, 'url': url} |
40 | + if (headers) { |
41 | + properties['headers'] = headers |
42 | } |
43 | - singleDownload.metadata = metadata |
44 | - singleDownload.url = url |
45 | + var singleDownload = downloadComponent.createObject(downloadItem, properties) |
46 | singleDownload.download(url) |
47 | } |
48 | |
49 | @@ -98,5 +96,4 @@ |
50 | function is7digital(url) { |
51 | return url.toString().search(/[^\/]+:\/\/[^\/]*7digital.com\//) !== -1 |
52 | } |
53 | - |
54 | } |
55 | |
56 | === modified file 'src/app/webbrowser/Browser.qml' |
57 | --- src/app/webbrowser/Browser.qml 2016-01-12 17:42:01 +0000 |
58 | +++ src/app/webbrowser/Browser.qml 2016-01-12 17:42:01 +0000 |
59 | @@ -1,5 +1,5 @@ |
60 | /* |
61 | - * Copyright 2013-2015 Canonical Ltd. |
62 | + * Copyright 2013-2016 Canonical Ltd. |
63 | * |
64 | * This file is part of webbrowser-app. |
65 | * |
66 | @@ -38,8 +38,7 @@ |
67 | |
68 | currentWebview: tabsModel && tabsModel.currentTab ? tabsModel.currentTab.webview : null |
69 | |
70 | - property var downloadsModel: (downloadsModelLoader.status == Loader.Ready) ? downloadsModelLoader.item : null |
71 | - property var downloadManager: (downloadHandlerLoader.status == Loader.Ready) ? downloadHandlerLoader.item : null |
72 | + readonly property var downloadManager: (downloadHandlerLoader.status == Loader.Ready) ? downloadHandlerLoader.item : null |
73 | |
74 | property bool newSession: false |
75 | |
76 | @@ -545,9 +544,7 @@ |
77 | text: i18n.tr("Downloads") |
78 | iconName: "save" |
79 | enabled: downloadHandlerLoader.status == Loader.Ready && contentHandlerLoader.status == Loader.Ready |
80 | - onTriggered: { |
81 | - currentWebview.showDownloadsPage() |
82 | - } |
83 | + onTriggered: downloadsViewLoader.active = true |
84 | }, |
85 | Action { |
86 | objectName: "privatemode" |
87 | @@ -933,7 +930,6 @@ |
88 | |
89 | onStatusChanged: { |
90 | if (status == Loader.Ready) { |
91 | - item.downloadsModel = browser.downloadsModel |
92 | item.forceActiveFocus() |
93 | } else { |
94 | internal.resetFocus() |
95 | @@ -948,12 +944,16 @@ |
96 | } |
97 | } |
98 | |
99 | + Binding { |
100 | + target: downloadsViewLoader.item |
101 | + property: "downloadManager" |
102 | + value: browser.downloadManager |
103 | + } |
104 | + |
105 | Connections { |
106 | target: downloadsViewLoader.item |
107 | - |
108 | onDone: downloadsViewLoader.active = false |
109 | } |
110 | - |
111 | } |
112 | |
113 | TabsModel { |
114 | @@ -982,14 +982,9 @@ |
115 | } |
116 | |
117 | Loader { |
118 | - id: downloadsModelLoader |
119 | - source: "DownloadsModel.qml" |
120 | - asynchronous: true |
121 | - } |
122 | - |
123 | - Loader { |
124 | id: downloadHandlerLoader |
125 | source: "DownloadHandler.qml" |
126 | + asynchronous: true |
127 | } |
128 | |
129 | Component { |
130 | @@ -1322,9 +1317,9 @@ |
131 | } |
132 | |
133 | function startDownload(downloadId, download, mimeType) { |
134 | - downloadsModel.add(downloadId, download.url, mimeType) |
135 | + DownloadsModel.add(downloadId, download.url, mimeType) |
136 | download.start() |
137 | - showDownloadsPage() |
138 | + downloadsViewLoader.active = true |
139 | } |
140 | |
141 | } |
142 | @@ -1752,6 +1747,7 @@ |
143 | |
144 | BookmarksModel.databasePath = dataLocation + "/bookmarks.sqlite" |
145 | HistoryModel.databasePath = dataLocation + "/history.sqlite" |
146 | + DownloadsModel.databasePath = dataLocation + "/downloads.sqlite" |
147 | |
148 | // Note that the property setter for databasePath won't return until |
149 | // the entire model has been loaded, so it is safe to call this here |
150 | @@ -1995,12 +1991,15 @@ |
151 | onTriggered: chrome.findInPageMode = true |
152 | } |
153 | |
154 | - // Ctrl + J: Show downloads page |
155 | + // Ctrl+J: Show downloads page |
156 | KeyboardShortcut { |
157 | modifiers: Qt.ControlModifier |
158 | key: Qt.Key_J |
159 | - enabled: chrome.visible && !downloadsViewLoader.active |
160 | - onTriggered: currentWebview.showDownloadsPage() |
161 | + enabled: chrome.visible && |
162 | + downloadHandlerLoader.status == Loader.Ready && |
163 | + contentHandlerLoader.status == Loader.Ready && |
164 | + !downloadsViewLoader.active |
165 | + onTriggered: downloadsViewLoader.active = true |
166 | } |
167 | |
168 | // Ctrl+Shift+G: Find previous |
169 | @@ -2023,6 +2022,7 @@ |
170 | Loader { |
171 | id: contentHandlerLoader |
172 | source: "ContentHandler.qml" |
173 | + asynchronous: true |
174 | } |
175 | |
176 | Connections { |
177 | |
178 | === modified file 'src/app/webbrowser/BrowserPageHeader.qml' |
179 | --- src/app/webbrowser/BrowserPageHeader.qml 2015-12-16 09:57:25 +0000 |
180 | +++ src/app/webbrowser/BrowserPageHeader.qml 2016-01-12 17:42:01 +0000 |
181 | @@ -43,6 +43,12 @@ |
182 | right: parent.right |
183 | } |
184 | |
185 | + MouseArea { |
186 | + // Prevent click events from propagating through to the view below |
187 | + anchors.fill: parent |
188 | + acceptedButtons: Qt.AllButtons |
189 | + } |
190 | + |
191 | Rectangle { |
192 | id: title |
193 | |
194 | |
195 | === modified file 'src/app/webbrowser/ContentDownloadDialog.qml' |
196 | --- src/app/webbrowser/ContentDownloadDialog.qml 2015-12-16 10:11:46 +0000 |
197 | +++ src/app/webbrowser/ContentDownloadDialog.qml 2016-01-12 17:42:01 +0000 |
198 | @@ -1,5 +1,5 @@ |
199 | /* |
200 | - * Copyright 2014-2015 Canonical Ltd. |
201 | + * Copyright 2014-2016 Canonical Ltd. |
202 | * |
203 | * This file is part of webbrowser-app. |
204 | * |
205 | @@ -36,7 +36,7 @@ |
206 | property alias contentType: peerPicker.contentType |
207 | |
208 | signal startDownload(string downloadId, var download, string mimeType) |
209 | - |
210 | + |
211 | Component { |
212 | id: downloadOptionsComponent |
213 | Dialog { |
214 | @@ -44,18 +44,18 @@ |
215 | objectName: "downloadOptionsDialog" |
216 | Column { |
217 | spacing: units.gu(2) |
218 | - |
219 | + |
220 | Item { |
221 | width: parent.width |
222 | height: mimetypeIcon.height |
223 | - |
224 | + |
225 | Icon { |
226 | id: mimetypeIcon |
227 | name: icon != "" ? icon : "save" |
228 | height: units.gu(4.5) |
229 | width: height |
230 | } |
231 | - |
232 | + |
233 | Label { |
234 | id: filenameLabel |
235 | anchors.top: mimetypeIcon.top |
236 | @@ -66,7 +66,7 @@ |
237 | elide: Text.ElideMiddle |
238 | text: downloadDialog.filename |
239 | } |
240 | - |
241 | + |
242 | Label { |
243 | anchors.top: filenameLabel.bottom |
244 | anchors.left: filenameLabel.left |
245 | @@ -76,14 +76,14 @@ |
246 | text: MimeDatabase.nameForMimetype(downloadDialog.mimeType) |
247 | } |
248 | } |
249 | - |
250 | + |
251 | Label { |
252 | width: parent.width |
253 | text: i18n.tr("Choose an application to open this file or add it to the downloads folder.") |
254 | wrapMode: Text.Wrap |
255 | visible: peerModel.peers.length > 0 |
256 | } |
257 | - |
258 | + |
259 | Button { |
260 | text: i18n.tr("Choose an application") |
261 | objectName: "chooseAppButton" |
262 | @@ -96,7 +96,7 @@ |
263 | pickerRect.visible = true |
264 | } |
265 | } |
266 | - |
267 | + |
268 | Button { |
269 | text: i18n.tr("Download") |
270 | objectName: "downloadFileButton" |
271 | @@ -108,7 +108,7 @@ |
272 | PopupUtils.close(downloadDialog) |
273 | } |
274 | } |
275 | - |
276 | + |
277 | Button { |
278 | text: i18n.tr("Cancel") |
279 | objectName: "cancelDownloadButton" |
280 | @@ -117,18 +117,16 @@ |
281 | height: units.gu(4) |
282 | onClicked: PopupUtils.close(downloadDialog) |
283 | } |
284 | - |
285 | } |
286 | } |
287 | - |
288 | } |
289 | - |
290 | + |
291 | ContentPeerModel { |
292 | id: peerModel |
293 | handler: ContentHandler.Destination |
294 | contentType: downloadDialog.contentType |
295 | } |
296 | - |
297 | + |
298 | Rectangle { |
299 | id: pickerRect |
300 | anchors.fill: parent |
301 | @@ -138,20 +136,20 @@ |
302 | handler: ContentHandler.Destination |
303 | objectName: "contentPeerPicker" |
304 | visible: parent.visible |
305 | - |
306 | + |
307 | onPeerSelected: { |
308 | activeTransfer = peer.request() |
309 | activeTransfer.downloadId = downloadDialog.downloadId |
310 | activeTransfer.state = ContentTransfer.Downloading |
311 | PopupUtils.close(downloadDialog) |
312 | } |
313 | - |
314 | + |
315 | onCancelPressed: { |
316 | PopupUtils.close(downloadDialog) |
317 | } |
318 | } |
319 | } |
320 | - |
321 | + |
322 | Component.onCompleted: { |
323 | PopupUtils.open(downloadOptionsComponent, downloadDialog) |
324 | } |
325 | |
326 | === modified file 'src/app/webbrowser/ContentPickerDialog.qml' |
327 | --- src/app/webbrowser/ContentPickerDialog.qml 2015-12-16 10:11:46 +0000 |
328 | +++ src/app/webbrowser/ContentPickerDialog.qml 2016-01-12 17:42:01 +0000 |
329 | @@ -1,5 +1,5 @@ |
330 | /* |
331 | - * Copyright 2014-2015 Canonical Ltd. |
332 | + * Copyright 2014-2016 Canonical Ltd. |
333 | * |
334 | * This file is part of webbrowser-app. |
335 | * |
336 | @@ -55,12 +55,12 @@ |
337 | // If we're inside the browser and the user has |
338 | // requested content from the browser then we |
339 | // need to handle the transfer internally |
340 | - var downloadPage = picker.WebView.view.showDownloadsPage() |
341 | - downloadPage.mimetypeFilter = MimeTypeMapper.mimeTypeRegexForContentType(contentType) |
342 | - downloadPage.multiSelect = model.allowMultipleFiles |
343 | - downloadPage.selectMode = false |
344 | - downloadPage.pickingMode = true |
345 | - downloadPage.internalFilePicker = model |
346 | + var downloadsPage = picker.WebView.view.showDownloadsPage() |
347 | + downloadsPage.mimetypeFilter = MimeTypeMapper.mimeTypeRegexForContentType(contentType) |
348 | + downloadsPage.multiSelect = model.allowMultipleFiles |
349 | + downloadsPage.selectMode = false |
350 | + downloadsPage.pickingMode = true |
351 | + downloadsPage.internalFilePicker = model |
352 | Popups.PopupUtils.close(picker) |
353 | } else { |
354 | if (model.allowMultipleFiles) { |
355 | |
356 | === modified file 'src/app/webbrowser/DownloadDelegate.qml' |
357 | --- src/app/webbrowser/DownloadDelegate.qml 2015-12-16 16:25:05 +0000 |
358 | +++ src/app/webbrowser/DownloadDelegate.qml 2016-01-12 17:42:01 +0000 |
359 | @@ -1,5 +1,5 @@ |
360 | /* |
361 | - * Copyright 2014-2015 Canonical Ltd. |
362 | + * Copyright 2014-2016 Canonical Ltd. |
363 | * |
364 | * This file is part of webbrowser-app. |
365 | * |
366 | @@ -16,13 +16,15 @@ |
367 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
368 | */ |
369 | |
370 | -import QtQuick 2.0 |
371 | +import QtQuick 2.4 |
372 | import Ubuntu.Components 1.3 |
373 | import ".." |
374 | |
375 | ListItem { |
376 | id: downloadDelegate |
377 | |
378 | + property var downloadManager |
379 | + |
380 | property alias icon: mimeicon.name |
381 | property alias image: thumbimage.source |
382 | property alias title: title.text |
383 | @@ -41,17 +43,23 @@ |
384 | |
385 | height: visible ? (incomplete ? (paused ? units.gu(13) : units.gu(10)) : units.gu(7)) : 0 |
386 | |
387 | - Component.onCompleted: { |
388 | - if (incomplete) { |
389 | - // Connect to download object |
390 | - for(var i = 0; i < downloadManager.downloads.length; i++) { |
391 | - if (downloadManager.downloads[i].downloadId == downloadId) { |
392 | - download = downloadManager.downloads[i] |
393 | + QtObject { |
394 | + id: internal |
395 | + |
396 | + function connectToDownloadObject() { |
397 | + if (incomplete && !download && downloadManager) { |
398 | + for(var i = 0; i < downloadManager.downloads.length; i++) { |
399 | + if (downloadManager.downloads[i].downloadId == downloadId) { |
400 | + download = downloadManager.downloads[i] |
401 | + } |
402 | } |
403 | } |
404 | } |
405 | } |
406 | |
407 | + Component.onCompleted: internal.connectToDownloadObject() |
408 | + onDownloadManagerChanged: internal.connectToDownloadObject() |
409 | + |
410 | Item { |
411 | |
412 | anchors { |
413 | |
414 | === modified file 'src/app/webbrowser/DownloadHandler.qml' |
415 | --- src/app/webbrowser/DownloadHandler.qml 2015-11-30 12:12:25 +0000 |
416 | +++ src/app/webbrowser/DownloadHandler.qml 2016-01-12 17:42:01 +0000 |
417 | @@ -1,5 +1,5 @@ |
418 | /* |
419 | - * Copyright 2015 Canonical Ltd. |
420 | + * Copyright 2015-2016 Canonical Ltd. |
421 | * |
422 | * This file is part of webbrowser-app. |
423 | * |
424 | @@ -18,28 +18,29 @@ |
425 | |
426 | import QtQuick 2.4 |
427 | import Ubuntu.DownloadManager 1.2 |
428 | +import webbrowserapp.private 0.1 |
429 | |
430 | DownloadManager { |
431 | - id: downloadManager |
432 | - |
433 | onDownloadFinished: { |
434 | - downloadsModel.moveToDownloads(download.downloadId, path) |
435 | - downloadsModel.setComplete(download.downloadId, true) |
436 | + if (DownloadsModel.contains(download.downloadId)) { |
437 | + DownloadsModel.moveToDownloads(download.downloadId, path) |
438 | + } |
439 | + DownloadsModel.setComplete(download.downloadId, true) |
440 | } |
441 | |
442 | onDownloadPaused: { |
443 | - downloadsModel.pauseDownload(download.downloadId) |
444 | + DownloadsModel.pauseDownload(download.downloadId) |
445 | } |
446 | |
447 | onDownloadResumed: { |
448 | - downloadsModel.resumeDownload(download.downloadId) |
449 | + DownloadsModel.resumeDownload(download.downloadId) |
450 | } |
451 | |
452 | onDownloadCanceled: { |
453 | - downloadsModel.cancelDownload(download.downloadId) |
454 | + DownloadsModel.cancelDownload(download.downloadId) |
455 | } |
456 | |
457 | onErrorFound: { |
458 | - downloadsModel.setError(download.downloadId, download.errorMessage) |
459 | + DownloadsModel.setError(download.downloadId, download.errorMessage) |
460 | } |
461 | } |
462 | |
463 | === removed file 'src/app/webbrowser/DownloadsModel.qml' |
464 | --- src/app/webbrowser/DownloadsModel.qml 2015-08-10 13:58:52 +0000 |
465 | +++ src/app/webbrowser/DownloadsModel.qml 1970-01-01 00:00:00 +0000 |
466 | @@ -1,24 +0,0 @@ |
467 | -/* |
468 | - * Copyright 2015 Canonical Ltd. |
469 | - * |
470 | - * This file is part of webbrowser-app. |
471 | - * |
472 | - * webbrowser-app is free software; you can redistribute it and/or modify |
473 | - * it under the terms of the GNU General Public License as published by |
474 | - * the Free Software Foundation; version 3. |
475 | - * |
476 | - * webbrowser-app is distributed in the hope that it will be useful, |
477 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
478 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
479 | - * GNU General Public License for more details. |
480 | - * |
481 | - * You should have received a copy of the GNU General Public License |
482 | - * along with this program. If not, see <http://www.gnu.org/licenses/>. |
483 | - */ |
484 | - |
485 | -import QtQuick 2.0 |
486 | -import webbrowserapp.private 0.1 |
487 | - |
488 | -DownloadsModel { |
489 | - databasePath: dataLocation + "/downloads.sqlite" |
490 | -} |
491 | |
492 | === modified file 'src/app/webbrowser/DownloadsPage.qml' |
493 | --- src/app/webbrowser/DownloadsPage.qml 2016-01-12 17:42:01 +0000 |
494 | +++ src/app/webbrowser/DownloadsPage.qml 2016-01-12 17:42:01 +0000 |
495 | @@ -1,5 +1,5 @@ |
496 | /* |
497 | - * Copyright 2015 Canonical Ltd. |
498 | + * Copyright 2015-2016 Canonical Ltd. |
499 | * |
500 | * This file is part of webbrowser-app. |
501 | * |
502 | @@ -16,10 +16,10 @@ |
503 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
504 | */ |
505 | |
506 | -import QtQuick 2.0 |
507 | +import QtQuick 2.4 |
508 | import Qt.labs.settings 1.0 |
509 | import Ubuntu.Components 1.3 |
510 | -import Ubuntu.Components.Popups 1.0 |
511 | +import Ubuntu.Components.Popups 1.3 |
512 | import Ubuntu.Content 1.3 |
513 | import Ubuntu.Web 0.2 |
514 | import webbrowserapp.private 0.1 |
515 | @@ -30,7 +30,7 @@ |
516 | Item { |
517 | id: downloadsItem |
518 | |
519 | - property QtObject downloadsModel |
520 | + property var downloadManager |
521 | |
522 | // We can get file picking requests either via content-hub (activeTransfer) |
523 | // Or via the internal oxide file picker (internalFilePicker) in the case |
524 | @@ -104,6 +104,7 @@ |
525 | text: i18n.tr("Delete") |
526 | iconName: "delete" |
527 | visible: selectMode |
528 | + enabled: downloadsListView.ViewItems.selectedIndices.length > 0 |
529 | onTriggered: { |
530 | var toDelete = [] |
531 | for (var i = 0; i < downloadsListView.ViewItems.selectedIndices.length; i++) { |
532 | @@ -111,7 +112,7 @@ |
533 | toDelete.push(selectedDownload.path) |
534 | } |
535 | for (var i = 0; i < toDelete.length; i++) { |
536 | - downloadsModel.deleteDownload(toDelete[i]) |
537 | + DownloadsModel.deleteDownload(toDelete[i]) |
538 | } |
539 | downloadsListView.ViewItems.selectedIndices = [] |
540 | downloadsItem.selectMode = false |
541 | @@ -120,6 +121,7 @@ |
542 | Action { |
543 | iconName: "edit" |
544 | visible: !selectMode && !pickingMode |
545 | + enabled: downloadsListView.count > 0 |
546 | onTriggered: { |
547 | selectMode = true |
548 | multiSelect = true |
549 | @@ -159,7 +161,7 @@ |
550 | } |
551 | |
552 | model: SortFilterModel { |
553 | - model: downloadsModel |
554 | + model: DownloadsModel |
555 | filter { |
556 | id: downloadModelFilter |
557 | property: "mimetype" |
558 | @@ -167,6 +169,7 @@ |
559 | } |
560 | |
561 | delegate: DownloadDelegate { |
562 | + downloadManager: downloadsItem.downloadManager |
563 | downloadId: model.downloadId |
564 | title: model.filename ? model.filename : model.url.toString().split('/').pop().split('?').shift() |
565 | url: model.url |
566 | @@ -212,12 +215,12 @@ |
567 | |
568 | onRemoved: { |
569 | if (model.complete) { |
570 | - downloadsModel.deleteDownload(model.path) |
571 | + DownloadsModel.deleteDownload(model.path) |
572 | } |
573 | } |
574 | |
575 | onCancelled: { |
576 | - downloadsModel.cancelDownload(model.downloadId) |
577 | + DownloadsModel.cancelDownload(model.downloadId) |
578 | } |
579 | } |
580 | |
581 | |
582 | === modified file 'src/app/webbrowser/downloads-model.cpp' |
583 | --- src/app/webbrowser/downloads-model.cpp 2015-11-23 14:48:28 +0000 |
584 | +++ src/app/webbrowser/downloads-model.cpp 2016-01-12 17:42:01 +0000 |
585 | @@ -1,5 +1,5 @@ |
586 | /* |
587 | - * Copyright 2015 Canonical Ltd. |
588 | + * Copyright 2015-2016 Canonical Ltd. |
589 | * |
590 | * This file is part of webbrowser-app. |
591 | * |
592 | @@ -20,12 +20,12 @@ |
593 | |
594 | #include <QtCore/QDebug> |
595 | #include <QtCore/QDir> |
596 | -#include <QtSql/QSqlQuery> |
597 | #include <QtCore/QFile> |
598 | #include <QtCore/QFileInfo> |
599 | -#include <QtCore/QStandardPaths> |
600 | #include <QtCore/QMimeDatabase> |
601 | #include <QtCore/QMimeType> |
602 | +#include <QtCore/QStandardPaths> |
603 | +#include <QtSql/QSqlQuery> |
604 | |
605 | #define CONNECTION_NAME "webbrowser-app-downloads" |
606 | |
607 | @@ -204,6 +204,16 @@ |
608 | } |
609 | } |
610 | |
611 | +bool DownloadsModel::contains(const QString& downloadId) const |
612 | +{ |
613 | + Q_FOREACH(const DownloadEntry& entry, m_orderedEntries) { |
614 | + if (entry.downloadId == downloadId) { |
615 | + return true; |
616 | + } |
617 | + } |
618 | + return false; |
619 | +} |
620 | + |
621 | /*! |
622 | Add a download to the database. This should happen as soon as the download |
623 | is started. |
624 | @@ -282,20 +292,18 @@ |
625 | QString destination = dir + QDir::separator() + filenameWithoutSuffix + suffix; |
626 | // Avoid filename collision by automatically inserting an incremented |
627 | // number into the filename if the original name already exists. |
628 | - if (QFile::exists(destination)) { |
629 | - int append = 1; |
630 | - do { |
631 | - destination = QString("%1%2.%3").arg(dir + QDir::separator() + filenameWithoutSuffix, QString::number(append), suffix); |
632 | - append++; |
633 | - } while (QFile::exists(destination)); |
634 | + int append = 1; |
635 | + while (QFile::exists(destination)) { |
636 | + destination = QString("%1%2.%3").arg(dir + QDir::separator() + filenameWithoutSuffix, QString::number(append), suffix); |
637 | + ++append; |
638 | } |
639 | if (file.rename(destination)) { |
640 | setPath(downloadId, destination); |
641 | } else { |
642 | - qWarning() << "Failed moving file from " << path << " to " << destination; |
643 | + qWarning() << "Failed moving file from" << path << "to" << destination; |
644 | } |
645 | } else { |
646 | - qWarning() << "Download not found: " << path; |
647 | + qWarning() << "Download not found:" << path; |
648 | } |
649 | } |
650 | |
651 | |
652 | === modified file 'src/app/webbrowser/downloads-model.h' |
653 | --- src/app/webbrowser/downloads-model.h 2015-11-23 14:48:28 +0000 |
654 | +++ src/app/webbrowser/downloads-model.h 2016-01-12 17:42:01 +0000 |
655 | @@ -1,5 +1,5 @@ |
656 | /* |
657 | - * Copyright 2015 Canonical Ltd. |
658 | + * Copyright 2015-2016 Canonical Ltd. |
659 | * |
660 | * This file is part of webbrowser-app. |
661 | * |
662 | @@ -62,7 +62,8 @@ |
663 | const QString databasePath() const; |
664 | void setDatabasePath(const QString& path); |
665 | |
666 | - Q_INVOKABLE void add(const QString &downloadId, const QUrl& url, const QString& mimetype); |
667 | + Q_INVOKABLE bool contains(const QString& downloadId) const; |
668 | + Q_INVOKABLE void add(const QString& downloadId, const QUrl& url, const QString& mimetype); |
669 | Q_INVOKABLE void moveToDownloads(const QString& downloadId, const QString& path); |
670 | Q_INVOKABLE void setPath(const QString& downloadId, const QString& path); |
671 | Q_INVOKABLE void setComplete(const QString& downloadId, const bool complete); |
672 | |
673 | === modified file 'src/app/webbrowser/webbrowser-app.cpp' |
674 | --- src/app/webbrowser/webbrowser-app.cpp 2015-12-10 09:06:06 +0000 |
675 | +++ src/app/webbrowser/webbrowser-app.cpp 2016-01-12 17:42:01 +0000 |
676 | @@ -1,5 +1,5 @@ |
677 | /* |
678 | - * Copyright 2013-2015 Canonical Ltd. |
679 | + * Copyright 2013-2016 Canonical Ltd. |
680 | * |
681 | * This file is part of webbrowser-app. |
682 | * |
683 | @@ -47,33 +47,18 @@ |
684 | { |
685 | } |
686 | |
687 | -static QObject* FileOperations_singleton_factory(QQmlEngine* engine, QJSEngine* scriptEngine) |
688 | -{ |
689 | - Q_UNUSED(engine); |
690 | - Q_UNUSED(scriptEngine); |
691 | - return new FileOperations(); |
692 | -} |
693 | - |
694 | -static QObject* CacheDeleter_singleton_factory(QQmlEngine* engine, QJSEngine* scriptEngine) |
695 | -{ |
696 | - Q_UNUSED(engine); |
697 | - Q_UNUSED(scriptEngine); |
698 | - return new CacheDeleter(); |
699 | -} |
700 | - |
701 | -static QObject* BookmarksModel_singleton_factory(QQmlEngine* engine, QJSEngine* scriptEngine) |
702 | -{ |
703 | - Q_UNUSED(engine); |
704 | - Q_UNUSED(scriptEngine); |
705 | - return new BookmarksModel(); |
706 | -} |
707 | - |
708 | -static QObject* HistoryModel_singleton_factory(QQmlEngine* engine, QJSEngine* scriptEngine) |
709 | -{ |
710 | - Q_UNUSED(engine); |
711 | - Q_UNUSED(scriptEngine); |
712 | - return new HistoryModel(); |
713 | -} |
714 | +#define MAKE_SINGLETON_FACTORY(type) \ |
715 | + static QObject* type##_singleton_factory(QQmlEngine* engine, QJSEngine* scriptEngine) { \ |
716 | + Q_UNUSED(engine); \ |
717 | + Q_UNUSED(scriptEngine); \ |
718 | + return new type(); \ |
719 | + } |
720 | + |
721 | +MAKE_SINGLETON_FACTORY(FileOperations) |
722 | +MAKE_SINGLETON_FACTORY(CacheDeleter) |
723 | +MAKE_SINGLETON_FACTORY(BookmarksModel) |
724 | +MAKE_SINGLETON_FACTORY(HistoryModel) |
725 | +MAKE_SINGLETON_FACTORY(DownloadsModel) |
726 | |
727 | bool WebbrowserApp::initialize() |
728 | { |
729 | @@ -88,7 +73,7 @@ |
730 | qmlRegisterSingletonType<FileOperations>(uri, 0, 1, "FileOperations", FileOperations_singleton_factory); |
731 | qmlRegisterType<SearchEngine>(uri, 0, 1, "SearchEngine"); |
732 | qmlRegisterSingletonType<CacheDeleter>(uri, 0, 1, "CacheDeleter", CacheDeleter_singleton_factory); |
733 | - qmlRegisterType<DownloadsModel>(uri, 0, 1, "DownloadsModel"); |
734 | + qmlRegisterSingletonType<DownloadsModel>(uri, 0, 1, "DownloadsModel", DownloadsModel_singleton_factory); |
735 | qmlRegisterType<TextSearchFilterModel>(uri, 0, 1, "TextSearchFilterModel"); |
736 | |
737 | if (BrowserApplication::initialize("webbrowser/webbrowser-app.qml")) { |
738 | |
739 | === modified file 'tests/unittests/downloads-model/tst_DownloadsModelTests.cpp' |
740 | --- tests/unittests/downloads-model/tst_DownloadsModelTests.cpp 2015-12-11 13:38:52 +0000 |
741 | +++ tests/unittests/downloads-model/tst_DownloadsModelTests.cpp 2016-01-12 17:42:01 +0000 |
742 | @@ -1,5 +1,5 @@ |
743 | /* |
744 | - * Copyright 2015 Canonical Ltd. |
745 | + * Copyright 2015-2016 Canonical Ltd. |
746 | * |
747 | * This file is part of webbrowser-app. |
748 | * |
749 | @@ -60,6 +60,13 @@ |
750 | QVERIFY(roleNames.contains("created")); |
751 | } |
752 | |
753 | + void shouldContainAddedEntries() |
754 | + { |
755 | + QVERIFY(!model->contains(QStringLiteral("testid"))); |
756 | + model->add(QStringLiteral("testid"), QUrl(QStringLiteral("http://example.org/")), QStringLiteral("text/html")); |
757 | + QVERIFY(model->contains(QStringLiteral("testid"))); |
758 | + } |
759 | + |
760 | void shouldAddNewEntries() |
761 | { |
762 | QSignalSpy spy(model, SIGNAL(added(QString, QUrl, QString))); |
763 | |
764 | === modified file 'tests/unittests/qml/tst_Suggestions.qml' |
765 | --- tests/unittests/qml/tst_Suggestions.qml 2015-08-05 11:18:08 +0000 |
766 | +++ tests/unittests/qml/tst_Suggestions.qml 2016-01-12 17:42:01 +0000 |
767 | @@ -16,7 +16,7 @@ |
768 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
769 | */ |
770 | |
771 | -import QtQuick 2.0 |
772 | +import QtQuick 2.4 |
773 | import QtTest 1.0 |
774 | import Ubuntu.Test 1.0 |
775 | import "../../../src/app/webbrowser" |
FAILED: Continuous integration, rev:1335 jenkins. qa.ubuntu. com/job/ webbrowser- app-ci/ 2559/ jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- vivid-touch/ 5997 jenkins. qa.ubuntu. com/job/ webbrowser- app-vivid- amd64-ci/ 1312 jenkins. qa.ubuntu. com/job/ webbrowser- app-vivid- armhf-ci/ 1312 jenkins. qa.ubuntu. com/job/ webbrowser- app-vivid- armhf-ci/ 1312/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ webbrowser- app-vivid- i386-ci/ 1312 jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- runner- vivid-touch/ 4633 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-armhf/ 6008 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-armhf/ 6008/artifact/ work/output/ *zip*/output. zip s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 26578
http://
Executed test runs:
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/webbrowser- app-ci/ 2559/rebuild
http://