|
23 | 23 | #include "QtWebEngineTransfer.h"
|
24 | 24 | #include "QtWebEngineUrlRequestInterceptor.h"
|
25 | 25 | #include "QtWebEngineWebWidget.h"
|
| 26 | +#include "../../../../core/BookmarksManager.h" |
26 | 27 | #include "../../../../core/ContentFiltersManager.h"
|
27 | 28 | #include "../../../../core/HandlersManager.h"
|
28 | 29 | #include "../../../../core/NetworkManagerFactory.h"
|
|
37 | 38 | #include <QtCore/QCoreApplication>
|
38 | 39 | #include <QtCore/QDir>
|
39 | 40 | #include <QtCore/QRegularExpression>
|
| 41 | +#include <QtWebChannel/QtWebChannel> |
40 | 42 | #include <QtWebEngineWidgets/QWebEngineProfile>
|
41 | 43 | #include <QtWebEngineWidgets/QWebEngineSettings>
|
42 | 44 |
|
@@ -276,6 +278,11 @@ WebWidget* QtWebEngineWebBackend::createWidget(const QVariantMap ¶meters, Co
|
276 | 278 | return new QtWebEngineWebWidget(parameters, this, parent);
|
277 | 279 | }
|
278 | 280 |
|
| 281 | +BookmarksImportJob *QtWebEngineWebBackend::createBookmarksImportJob(BookmarksModel::Bookmark *folder, const QString &path, bool areDuplicatesAllowed) |
| 282 | +{ |
| 283 | + return new QtWebEngineBookmarksImportJob(folder, path, areDuplicatesAllowed, this); |
| 284 | +} |
| 285 | + |
279 | 286 | QString QtWebEngineWebBackend::getName() const
|
280 | 287 | {
|
281 | 288 | return QLatin1String("qtwebengine");
|
@@ -344,6 +351,205 @@ WebBackend::BackendCapabilities QtWebEngineWebBackend::getCapabilities() const
|
344 | 351 | return (UserScriptsCapability | GlobalCookiesPolicyCapability | GlobalContentFilteringCapability | GlobalDoNotTrackCapability | GlobalProxyCapability | GlobalReferrerCapability | GlobalUserAgentCapability);
|
345 | 352 | }
|
346 | 353 |
|
| 354 | +QtWebEngineBookmarksImportJob::QtWebEngineBookmarksImportJob(BookmarksModel::Bookmark *folder, const QString &path, bool areDuplicatesAllowed, QObject *parent) : BookmarksImportJob(folder, areDuplicatesAllowed, parent), |
| 355 | + m_path(path), |
| 356 | + m_currentAmount(0), |
| 357 | + m_totalAmount(-1), |
| 358 | + m_isRunning(false) |
| 359 | +{ |
| 360 | +} |
| 361 | + |
| 362 | +void QtWebEngineBookmarksImportJob::start() |
| 363 | +{ |
| 364 | + QFile file(m_path); |
| 365 | + |
| 366 | + if (!file.open(QIODevice::ReadOnly)) |
| 367 | + { |
| 368 | + endImport(); |
| 369 | + return; |
| 370 | + } |
| 371 | + |
| 372 | + m_isRunning = true; |
| 373 | + |
| 374 | + QWebEnginePage *page = new QWebEnginePage(this); |
| 375 | + QWebChannel *webChannel = new QWebChannel(this); |
| 376 | + |
| 377 | + page->settings()->setAttribute(QWebEngineSettings::AutoLoadImages, false); |
| 378 | + page->setWebChannel(webChannel); |
| 379 | + |
| 380 | + webChannel->registerObject("bookmarkImporter", this); |
| 381 | + |
| 382 | + connect(page, &QWebEnginePage::loadFinished, |
| 383 | + [this, page]() { |
| 384 | + QFile qWebChannelFile(":/qtwebchannel/qwebchannel.js"); |
| 385 | + |
| 386 | + if (!qWebChannelFile.open(QIODevice::ReadOnly)) |
| 387 | + { |
| 388 | + endImport(); |
| 389 | + return; |
| 390 | + } |
| 391 | + |
| 392 | + page->runJavaScript(QString::fromLatin1(qWebChannelFile.readAll())); |
| 393 | + |
| 394 | + QFile importBookmarksScriptFile(QLatin1String(":/modules/backends/web/qtwebengine/resources/importBookmarks.js")); |
| 395 | + |
| 396 | + if (!importBookmarksScriptFile.open(QIODevice::ReadOnly)) |
| 397 | + { |
| 398 | + endImport(); |
| 399 | + return; |
| 400 | + } |
| 401 | + |
| 402 | + page->runJavaScript(QString::fromLatin1(importBookmarksScriptFile.readAll())); |
| 403 | + }); |
| 404 | + |
| 405 | + page->setHtml(QString::fromLatin1(file.readAll())); |
| 406 | + |
| 407 | + file.close(); |
| 408 | +} |
| 409 | + |
| 410 | +void QtWebEngineBookmarksImportJob::cancel() |
| 411 | +{ |
| 412 | +} |
| 413 | + |
| 414 | +QDateTime QtWebEngineBookmarksImportJob::getDateTime(const QVariant &attribute) |
| 415 | +{ |
| 416 | +#if QT_VERSION < 0x050800 |
| 417 | + const uint seconds(attribute.toUInt()); |
| 418 | + |
| 419 | + return ((seconds > 0) ? QDateTime::fromTime_t(seconds) : QDateTime()); |
| 420 | +#else |
| 421 | + const qint64 seconds(attribute.toLongLong()); |
| 422 | + |
| 423 | + return ((seconds != 0) ? QDateTime::fromSecsSinceEpoch(seconds) : QDateTime()); |
| 424 | +#endif |
| 425 | +} |
| 426 | + |
| 427 | +bool QtWebEngineBookmarksImportJob::isRunning() const |
| 428 | +{ |
| 429 | + return m_isRunning; |
| 430 | +} |
| 431 | + |
| 432 | +void QtWebEngineBookmarksImportJob::beginImport(const int totalAmount, const int estimatedUrlsCount, const int estimatedKeywordsCount) |
| 433 | +{ |
| 434 | + m_totalAmount = totalAmount; |
| 435 | + |
| 436 | + emit importStarted(Importer::BookmarksImport, m_totalAmount); |
| 437 | + |
| 438 | + if (m_totalAmount == 0) |
| 439 | + { |
| 440 | + endImport(); |
| 441 | + return; |
| 442 | + } |
| 443 | + |
| 444 | + BookmarksManager::getModel()->beginImport(getImportFolder(), estimatedUrlsCount, estimatedKeywordsCount); |
| 445 | +} |
| 446 | + |
| 447 | +void QtWebEngineBookmarksImportJob::endImport() |
| 448 | +{ |
| 449 | + m_isRunning = false; |
| 450 | + |
| 451 | + BookmarksManager::getModel()->endImport(); |
| 452 | + |
| 453 | + if (m_totalAmount < 0 || m_currentAmount < m_totalAmount) |
| 454 | + { |
| 455 | + emit importFinished(Importer::BookmarksImport, Importer::FailedImport, m_totalAmount); |
| 456 | + emit jobFinished(false); |
| 457 | + } |
| 458 | + else |
| 459 | + { |
| 460 | + emit importFinished(Importer::BookmarksImport, Importer::SuccessfullImport, m_totalAmount); |
| 461 | + emit jobFinished(true); |
| 462 | + } |
| 463 | + |
| 464 | + deleteLater(); |
| 465 | +} |
| 466 | + |
| 467 | +void QtWebEngineBookmarksImportJob::beginFolder(QVariant itemVariant) |
| 468 | +{ |
| 469 | + ++m_currentAmount; |
| 470 | + emit importProgress(Importer::BookmarksImport, m_totalAmount, m_currentAmount); |
| 471 | + |
| 472 | + const QVariantMap itemMap = itemVariant.toMap(); |
| 473 | + const QString title = itemMap["title"].toString(); |
| 474 | + |
| 475 | + QMap<int, QVariant> metaData({{BookmarksModel::TitleRole, title}}); |
| 476 | + |
| 477 | + const QDateTime dateAdded(getDateTime(itemMap["dateAdded"])); |
| 478 | + const QDateTime dateModified(getDateTime(itemMap["dateModified"])); |
| 479 | + |
| 480 | + if (dateAdded.isValid()) |
| 481 | + { |
| 482 | + metaData[BookmarksModel::TimeAddedRole] = dateAdded; |
| 483 | + } |
| 484 | + |
| 485 | + if (dateModified.isValid()) |
| 486 | + { |
| 487 | + metaData[BookmarksModel::TimeAddedRole] = dateModified; |
| 488 | + } |
| 489 | + |
| 490 | + setCurrentFolder(BookmarksManager::addBookmark(BookmarksModel::FolderBookmark, metaData, getCurrentFolder())); |
| 491 | +} |
| 492 | + |
| 493 | +void QtWebEngineBookmarksImportJob::endFolder() |
| 494 | +{ |
| 495 | + goToParent(); |
| 496 | +} |
| 497 | + |
| 498 | +void QtWebEngineBookmarksImportJob::addBookmark(QVariant itemVariant) |
| 499 | +{ |
| 500 | + ++m_currentAmount; |
| 501 | + emit importProgress(Importer::BookmarksImport, m_totalAmount, m_currentAmount); |
| 502 | + |
| 503 | + const QVariantMap itemMap = itemVariant.toMap(); |
| 504 | + const QString typeString = itemMap["type"].toString(); |
| 505 | + const QString title = itemMap["title"].toString(); |
| 506 | + |
| 507 | + BookmarksModel::BookmarkType type(BookmarksModel::UnknownBookmark); |
| 508 | + QMap<int, QVariant> metaData({{BookmarksModel::TitleRole, title}}); |
| 509 | + |
| 510 | + if (typeString == "anchor" || typeString == "feed") |
| 511 | + { |
| 512 | + const QDateTime dateAdded(getDateTime(itemMap["dateAdded"])); |
| 513 | + const QDateTime dateModified(getDateTime(itemMap["dateModified"])); |
| 514 | + |
| 515 | + if (dateAdded.isValid()) |
| 516 | + { |
| 517 | + metaData[BookmarksModel::TimeAddedRole] = dateAdded; |
| 518 | + } |
| 519 | + |
| 520 | + if (dateModified.isValid()) |
| 521 | + { |
| 522 | + metaData[BookmarksModel::TimeAddedRole] = dateModified; |
| 523 | + } |
| 524 | + |
| 525 | + type = (typeString == "anchor" ? BookmarksModel::UrlBookmark : BookmarksModel::FeedBookmark); |
| 526 | + |
| 527 | + const QString url = itemMap["url"].toString(); |
| 528 | + |
| 529 | + if (!areDuplicatesAllowed() && BookmarksManager::hasBookmark(url)) |
| 530 | + { |
| 531 | + return; |
| 532 | + } |
| 533 | + |
| 534 | + const QVariant shortcutUrl = itemMap["keyword"]; |
| 535 | + if (!shortcutUrl.isNull()) |
| 536 | + { |
| 537 | + metaData[BookmarksModel::KeywordRole] = shortcutUrl.toString(); |
| 538 | + } |
| 539 | + |
| 540 | + metaData[BookmarksModel::UrlRole] = url; |
| 541 | + } |
| 542 | + else if (typeString == "separator") |
| 543 | + { |
| 544 | + type = BookmarksModel::SeparatorBookmark; |
| 545 | + } |
| 546 | + |
| 547 | + if (type != BookmarksModel::UnknownBookmark) |
| 548 | + { |
| 549 | + BookmarksManager::addBookmark(type, metaData, getCurrentFolder()); |
| 550 | + } |
| 551 | +} |
| 552 | + |
347 | 553 | bool QtWebEngineWebBackend::hasSslSupport() const
|
348 | 554 | {
|
349 | 555 | return true;
|
|
0 commit comments