Merge lp:~osomon/webbrowser-app/address-downloads-issues into lp:webbrowser-app

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
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-in-browser functionality.

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"

Subscribers

People subscribed via source and target branches

to status/vote changes: