diff options
19 files changed, 615 insertions, 56 deletions
diff --git a/LICENSE.GPLv2 b/LICENSE.GPLv2 new file mode 100644 index 000000000..6dbb032fd --- /dev/null +++ b/LICENSE.GPLv2 @@ -0,0 +1,292 @@ + GNU GENERAL PUBLIC LICENSE + + The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ + + You may use, distribute and copy the Qt GUI Toolkit under the terms of + GNU General Public License version 2, which is displayed below. + +------------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +Preamble + + The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free software +--to make sure the software is free for all its users. This General +Public License applies to most of the Free Software Foundation's +software and to any other program whose authors commit to using it. +(Some other Free Software Foundation software is covered by the GNU +Lesser General Public License instead.) You can apply it to your +programs, too. + +When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for this +service if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone +to deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis + or for a fee, you must give the recipients all the rights that you +have. You must make sure that they, too, receive or can get the source +code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent +must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a +notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of running +the Program is not restricted, and the output from the Program is +covered only if its contents constitute a work based on the Program +(independent of having been made by running the Program). Whether that +is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source +code as you receive it, in any medium, provided that you conspicuously +and appropriately publish on each copy an appropriate copyright notice +and disclaimer of warranty; keep intact all the notices that refer to +this License and to the absence of any warranty; and give any other +recipients of the Program a copy of this License along with the +Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of +it, thus forming a work based on the Program, and copy and distribute +such modifications or work under the terms of Section 1 above, provided +that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the + Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a +storage or distribution medium does not bring the other work under the +scope of this License. + +3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software + interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your cost + of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to control +compilation and installation of the executable. However, as a special +exception, the source code distributed need not include anything that +is normally distributed (in either source or binary form) with the +major components (compiler, kernel, and so on) of the operating system +on which the executable runs, unless that component itself accompanies +the executable. + +If distribution of executable or object code is made by offering access +to copy from a designated place, then offering equivalent access to +copy the source code from the same place counts as distribution of the +source code, even though third parties are not compelled to copy the +source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt otherwise +to copy, modify, sublicense or distribute the Program is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this License +will not have their licenses terminated so long as such parties remain +in full compliance. + +5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further restrictions +on the recipients' exercise of the rights granted herein. You are not +responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent license +would not permit royalty-free redistribution of the Program by all +those who receive copies directly or indirectly through you, then the +only way you could satisfy both it and this License would be to refrain +entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License may +add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among countries +not thus excluded. In such case, this License incorporates the limitation +as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail +to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Program does not specify a version +number of this License, you may choose any version ever published by +the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the +author to ask for permission. For software which is copyrighted by +the Free Software Foundation, write to the Free Software Foundation; +we sometimes make exceptions for this. Our decision will be guided by +the two goals of preserving the free status of all derivatives of our +free software and of promoting the sharing and reuse of software +generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE +ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH +YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY +MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE +TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS diff --git a/dist/changes-5.5.0 b/dist/changes-5.5.0 new file mode 100644 index 000000000..3b5c9f6ed --- /dev/null +++ b/dist/changes-5.5.0 @@ -0,0 +1,84 @@ +Qt 5.5 introduces many new features and improvements as well as bugfixes +over the 5.4.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.5 series is binary compatible with the 5.4.x series. +Applications compiled for 5.4 will continue to run with 5.5. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + + - Chromium Snapshot: + * The Chromium version has been updated to 40.0.2214.115. + * The ninja version has been updated to 1.5.3. + + - Platform Support: + * Support for embedded Android has been removed from Qt WebEngine. + * [QTBUG-45796] Fix prefix build. + * Localization fixes and support for --lang command line switch + + - Web Features: + * Windows: WebGL and accelerated 2D Canvas are enabled, + when using an ANGLE-based Qt-build. + +**************************************************************************** +* QtWebEngineQML * +**************************************************************************** + + - QQuickWebEngineDownloadItem: + * A new API for handling downloads in QtQuick had been added. + + - QQuickWebEngineCertificateError: + * A new API for handling certificate errors has been added. + + - QQuickWebEngineProfile: + * Add a new API for profiles applying to groups of QQuickWebEnginePages. + + - QQuickWebEngineViewExperimental: + * The inspectable property has been replaced by an environment variable + QTWEBENGINE_REMOTE_DEBUGGING + + - QQuickWebEngineView: + * New API has been added to allow installing of user scripts. + * The findText function was moved to public API. + * Public API was added to react to javascript requestFullScreen. + * Support for HTML5 form validation has been added. + * The featurePermissionRequested API was made public. + * An integration for using QtWebChannel over chromium IPC has been added. + +**************************************************************************** +* QtWebEngineWidgets * +**************************************************************************** + + - QWebEngineDownloadItem: + * An API for handling downloads in Widgets has been added. + + - QWebEngineProfile: + * Add a new API for profiles applying to groups of QWebEnginePages. + * New API has been added to allow installing of user scripts. + + - QWebEnginePage: + * New API has been added to deal with certificate errors. + + - QWebEngineView: + * Support for HTML5 form validation was added. + +**************************************************************************** +* Examples * +**************************************************************************** + + - WebEngineWidgets Example Browser: + * [QTBUG-44633] Fix example on retina display. + * Re-add user stylesheets example. + * Private browsing mode has been re-introduced. diff --git a/examples/webenginewidgets/browser/browserapplication.cpp b/examples/webenginewidgets/browser/browserapplication.cpp index 3bc801295..ca28b2d0b 100644 --- a/examples/webenginewidgets/browser/browserapplication.cpp +++ b/examples/webenginewidgets/browser/browserapplication.cpp @@ -83,11 +83,11 @@ static void setUserStyleSheet(QWebEngineProfile *profile, const QString &styleSh Q_ASSERT(profile); QString scriptName(QStringLiteral("userStyleSheet")); QWebEngineScript script; - QList<QWebEngineScript> styleSheets = profile->scripts().findScripts(scriptName); + QList<QWebEngineScript> styleSheets = profile->scripts()->findScripts(scriptName); if (!styleSheets.isEmpty()) script = styleSheets.first(); Q_FOREACH (const QWebEngineScript &s, styleSheets) - profile->scripts().remove(s); + profile->scripts()->remove(s); if (script.isNull()) { script.setName(scriptName); @@ -106,7 +106,7 @@ static void setUserStyleSheet(QWebEngineProfile *profile, const QString &styleSh "css.innerText = \"%1\";"\ "})()").arg(styleSheet); script.setSourceCode(source); - profile->scripts().insert(script); + profile->scripts()->insert(script); // run the script on the already loaded views // this has to be deferred as it could mess with the storage initialization on startup if (mainWindow) @@ -122,14 +122,8 @@ BrowserApplication::BrowserApplication(int &argc, char **argv) QCoreApplication::setOrganizationName(QLatin1String("Qt")); QCoreApplication::setApplicationName(QLatin1String("demobrowser")); QCoreApplication::setApplicationVersion(QLatin1String("0.1")); -#ifdef Q_WS_QWS - // Use a different server name for QWS so we can run an X11 - // browser and a QWS browser in parallel on the same machine for - // debugging - QString serverName = QCoreApplication::applicationName() + QLatin1String("_qws"); -#else - QString serverName = QCoreApplication::applicationName(); -#endif + QString serverName = QCoreApplication::applicationName() + + QString::fromLatin1(QT_VERSION_STR).remove('.') + QLatin1String("webengine"); QLocalSocket socket; socket.connectToServer(serverName); if (socket.waitForConnected(500)) { diff --git a/src/3rdparty b/src/3rdparty -Subproject 0decf91700ad48612b885a549e79bb6252196d4 +Subproject 85827b2c3db3c4cb6308ce8a4c2069c0e403cd9 diff --git a/src/core/config/embedded_linux.pri b/src/core/config/embedded_linux.pri index 91b14003c..cc8c40f8e 100644 --- a/src/core/config/embedded_linux.pri +++ b/src/core/config/embedded_linux.pri @@ -43,6 +43,7 @@ GYP_CONFIG += \ use_openssl=1 \ use_ozone=1 \ use_pango=0 \ + use_system_fontconfig=1 \ use_system_icu=1 \ icu_use_data_file_flag=0 \ use_x11=0 \ diff --git a/src/core/gyp_run.pro b/src/core/gyp_run.pro index 4c6eb8c56..3f631302c 100644 --- a/src/core/gyp_run.pro +++ b/src/core/gyp_run.pro @@ -19,6 +19,7 @@ cross_compile { GYP_CONFIG += disable_glibcxx_debug=1 !webcore_debug: GYP_CONFIG += remove_webcore_debug_symbols=1 +!v8base_debug: GYP_CONFIG += remove_v8base_debug_symbols=1 linux:contains(QT_CONFIG, separate_debug_info): GYP_CONFIG += linux_dump_symbols=1 diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp index e7764fbcb..340d7b33e 100644 --- a/src/core/web_contents_view_qt.cpp +++ b/src/core/web_contents_view_qt.cpp @@ -50,6 +50,7 @@ namespace QtWebEngineCore { void WebContentsViewQt::initialize(WebContentsAdapterClient* client) { m_client = client; + m_factoryClient = client; // Check if a RWHV was created before the initialization. if (m_webContents->GetRenderWidgetHostView()) diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index f5210a816..51dcb61eb 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -710,6 +710,15 @@ void QQuickWebEngineView::setProfile(QQuickWebEngineProfile *profile) Q_D(QQuickWebEngineView); d->setProfile(profile); } +/*! + * \qmlproperty WebEngineSettings QQuickWebEngineView::settings + * \readonly settings + * \since QtWebEngine 1.1 + * + * The \a settings property holds the settings used by this view. + * + * \sa WebEngineSettings + */ QQuickWebEngineSettings *QQuickWebEngineView::settings() const { diff --git a/src/webenginewidgets/api/qwebenginedownloaditem.cpp b/src/webenginewidgets/api/qwebenginedownloaditem.cpp index 703570587..7df044e66 100644 --- a/src/webenginewidgets/api/qwebenginedownloaditem.cpp +++ b/src/webenginewidgets/api/qwebenginedownloaditem.cpp @@ -156,9 +156,9 @@ void QWebEngineDownloadItem::cancel() Returns the download item's id. */ -quint32 QWebEngineDownloadItem::id() +quint32 QWebEngineDownloadItem::id() const { - Q_D(QWebEngineDownloadItem); + Q_D(const QWebEngineDownloadItem); return d->downloadId; } @@ -205,9 +205,9 @@ quint32 QWebEngineDownloadItem::id() \sa QWebEngineDownloadItem::DownloadState */ -QWebEngineDownloadItem::DownloadState QWebEngineDownloadItem::state() +QWebEngineDownloadItem::DownloadState QWebEngineDownloadItem::state() const { - Q_D(QWebEngineDownloadItem); + Q_D(const QWebEngineDownloadItem); return d->downloadState; } @@ -217,9 +217,9 @@ QWebEngineDownloadItem::DownloadState QWebEngineDownloadItem::state() -1 means the size is unknown. */ -qint64 QWebEngineDownloadItem::totalBytes() +qint64 QWebEngineDownloadItem::totalBytes() const { - Q_D(QWebEngineDownloadItem); + Q_D(const QWebEngineDownloadItem); return d->totalBytes; } @@ -229,9 +229,9 @@ qint64 QWebEngineDownloadItem::totalBytes() -1 means the size is unknown. */ -qint64 QWebEngineDownloadItem::receivedBytes() +qint64 QWebEngineDownloadItem::receivedBytes() const { - Q_D(QWebEngineDownloadItem); + Q_D(const QWebEngineDownloadItem); return d->receivedBytes; } @@ -239,9 +239,9 @@ qint64 QWebEngineDownloadItem::receivedBytes() Returns the download's origin url. */ -QUrl QWebEngineDownloadItem::url() +QUrl QWebEngineDownloadItem::url() const { - Q_D(QWebEngineDownloadItem); + Q_D(const QWebEngineDownloadItem); return d->downloadUrl; } @@ -252,9 +252,9 @@ QUrl QWebEngineDownloadItem::url() and file name is deduced not to overwrite already existing files. */ -QString QWebEngineDownloadItem::path() +QString QWebEngineDownloadItem::path() const { - Q_D(QWebEngineDownloadItem); + Q_D(const QWebEngineDownloadItem); return d->downloadPath; } @@ -282,9 +282,9 @@ void QWebEngineDownloadItem::setPath(QString path) \sa finished(), state(), */ -bool QWebEngineDownloadItem::isFinished() +bool QWebEngineDownloadItem::isFinished() const { - Q_D(QWebEngineDownloadItem); + Q_D(const QWebEngineDownloadItem); return d->downloadFinished; } diff --git a/src/webenginewidgets/api/qwebenginedownloaditem.h b/src/webenginewidgets/api/qwebenginedownloaditem.h index ee3ab221d..d362131f2 100644 --- a/src/webenginewidgets/api/qwebenginedownloaditem.h +++ b/src/webenginewidgets/api/qwebenginedownloaditem.h @@ -61,14 +61,14 @@ public: }; Q_ENUMS(DownloadState) - quint32 id(); - DownloadState state(); - qint64 totalBytes(); - qint64 receivedBytes(); - QUrl url(); - QString path(); + quint32 id() const; + DownloadState state() const; + qint64 totalBytes() const; + qint64 receivedBytes() const; + QUrl url() const; + QString path() const; void setPath(QString path); - bool isFinished(); + bool isFinished() const; public Q_SLOTS: void accept(); diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index bf5868925..f2941d952 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -1093,20 +1093,27 @@ QStringList QWebEnginePage::chooseFiles(FileSelectionMode mode, const QStringLis // can work with) and mimetypes ranging from text/plain or images/* to application/vnd.openxmlformats-officedocument.spreadsheetml.sheet Q_UNUSED(acceptedMimeTypes); QStringList ret; + QString str; switch (static_cast<FilePickerController::FileChooserMode>(mode)) { case FilePickerController::OpenMultiple: ret = QFileDialog::getOpenFileNames(view(), QString()); break; // Chromium extension, not exposed as part of the public API for now. case FilePickerController::UploadFolder: - ret << QFileDialog::getExistingDirectory(view(), tr("Select folder to upload")) + QLatin1Char('/'); + str = QFileDialog::getExistingDirectory(view(), tr("Select folder to upload")) + QLatin1Char('/'); + if (!str.isNull()) + ret << str; break; case FilePickerController::Save: - ret << QFileDialog::getSaveFileName(view(), QString(), (QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + oldFiles.first())); + str = QFileDialog::getSaveFileName(view(), QString(), (QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + oldFiles.first())); + if (!str.isNull()) + ret << str; break; default: case FilePickerController::Open: - ret << QFileDialog::getOpenFileName(view(), QString(), oldFiles.first()); + str = QFileDialog::getOpenFileName(view(), QString(), oldFiles.first()); + if (!str.isNull()) + ret << str; break; } return ret; diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp index eda242102..afe2277f2 100644 --- a/src/webenginewidgets/api/qwebengineprofile.cpp +++ b/src/webenginewidgets/api/qwebengineprofile.cpp @@ -104,8 +104,8 @@ using QtWebEngineCore::BrowserContextAdapter; */ QWebEngineProfilePrivate::QWebEngineProfilePrivate(BrowserContextAdapter* browserContext) - : scriptCollection(new QWebEngineScriptCollectionPrivate(browserContext->userScriptController())) - , m_settings(new QWebEngineSettings()) + : m_settings(new QWebEngineSettings()) + , m_scriptCollection(new QWebEngineScriptCollection(new QWebEngineScriptCollectionPrivate(browserContext->userScriptController()))) , m_browserContextRef(browserContext) { m_browserContextRef->addClient(this); @@ -451,10 +451,10 @@ bool QWebEngineProfile::visitedLinksContainsUrl(const QUrl &url) const Returns the script collection used by this profile. \sa QWebEngineScriptCollection */ -QWebEngineScriptCollection &QWebEngineProfile::scripts() +QWebEngineScriptCollection *QWebEngineProfile::scripts() const { - Q_D(QWebEngineProfile); - return d->scriptCollection; + Q_D(const QWebEngineProfile); + return d->m_scriptCollection.data(); } /*! diff --git a/src/webenginewidgets/api/qwebengineprofile.h b/src/webenginewidgets/api/qwebengineprofile.h index ab36a7b16..b13f3d631 100644 --- a/src/webenginewidgets/api/qwebengineprofile.h +++ b/src/webenginewidgets/api/qwebengineprofile.h @@ -102,7 +102,7 @@ public: bool visitedLinksContainsUrl(const QUrl &url) const; QWebEngineSettings *settings() const; - QWebEngineScriptCollection &scripts(); + QWebEngineScriptCollection *scripts() const; static QWebEngineProfile *defaultProfile(); diff --git a/src/webenginewidgets/api/qwebengineprofile_p.h b/src/webenginewidgets/api/qwebengineprofile_p.h index b0bfc88b9..55941580d 100644 --- a/src/webenginewidgets/api/qwebengineprofile_p.h +++ b/src/webenginewidgets/api/qwebengineprofile_p.h @@ -43,6 +43,7 @@ #include "qwebenginescriptcollection.h" #include <QMap> #include <QPointer> +#include <QScopedPointer> namespace QtWebEngineCore { class BrowserContextAdapter; @@ -72,10 +73,10 @@ public: void removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *); void clearUrlSchemeHandlers(); - QWebEngineScriptCollection scriptCollection; private: QWebEngineProfile *q_ptr; QWebEngineSettings *m_settings; + QScopedPointer<QWebEngineScriptCollection> m_scriptCollection; QExplicitlySharedDataPointer<QtWebEngineCore::BrowserContextAdapter> m_browserContextRef; QMap<quint32, QPointer<QWebEngineDownloadItem> > m_ongoingDownloads; QMap<QByteArray, QPointer<QWebEngineUrlSchemeHandler> > m_urlSchemeHandlers; diff --git a/src/webenginewidgets/api/qwebenginescript.cpp b/src/webenginewidgets/api/qwebenginescript.cpp index e2f267330..e834c5067 100644 --- a/src/webenginewidgets/api/qwebenginescript.cpp +++ b/src/webenginewidgets/api/qwebenginescript.cpp @@ -41,10 +41,63 @@ using QtWebEngineCore::UserScript; +/*! + \class QWebEngineScript + \inmodule QtWebEngineWidgets + \since 5.5 + \brief The QWebEngineScript class encapsulates a JavaScript program. + \preliminary + + QWebEngineScript allows the programatic injection of so called "user scripts" in the + javascript engine at different points, determined by injectionPoint(), during the loading of web contents. + + Scripts can be executed either in the main javascript world, along with the rest of the JavaScript coming + from the web contents, or in their own isolated world. While the DOM of the page can be accessed from any world, + JavaScript variables a function defined in one world are not accessible from a different one. + ScriptWorldId provides some predefined ids for this purpose. + +*/ +/*! + \enum QWebEngineScript::InjectionPoint + + This enum describes the timing for when the script injection should happen. + + \value DocumentCreation The script will be executed as soon as the document is created. This is not suitable for + any DOM operation. + \value DocumentReady The script will run as soon as the DOM is ready. This is equivalent to the DOMContentLoaded + event firing in JavaScript. + \value Deferred The script will run when the page load finishes, or 500ms after the document is ready, whichever + comes first. + +*/ +/*! + \enum QWebEngineScript::ScriptWorldId + + This enum provides pre defined world ids for isolating user scripts into different worlds. + + \value MainWorld The world used by the page's web contents. It can be useful in order to expose custom functionality + to web contents in certain scenarios. + \value ApplicationWorld The default isolated world used for application level functionality implemented in JavaScript. + \value UserWorld The first isolated world to be used by scripts set by users if the application is not making use + of more worlds. As a rule of thumbs, if that functionality is exposed to the application users, each individual script + should probably get its own isolated world. + +*/ + +/*! + * \brief QWebEngineScript::QWebEngineScript + * + * Constructs a null script. + */ + QWebEngineScript::QWebEngineScript() : d(new UserScript) { } +/*! + * \brief QWebEngineScript::isNull + * \return \c true is the script is null, \c false otherwise. + */ QWebEngineScript::QWebEngineScript(const QWebEngineScript &other) : d(other.d) @@ -66,11 +119,24 @@ bool QWebEngineScript::isNull() const return d->isNull(); } +/*! + * \brief QWebEngineScript::name + * \return The name of the script. Can be useful to retrieve a given script from a QWebEngineScriptCollection. + * + * \sa QWebEngineScriptCollection::findScript(), QWebEngineScriptCollection::findScripts() + */ + QString QWebEngineScript::name() const { return d->name(); } +/*! + * \brief QWebEngineScript::setName + * \param scriptName + * + * Sets the script name to \a scriptName. + */ void QWebEngineScript::setName(const QString &scriptName) { if (scriptName == name()) @@ -78,11 +144,20 @@ void QWebEngineScript::setName(const QString &scriptName) d->setName(scriptName); } +/*! + * \brief QWebEngineScript::sourceCode + * \return the source of the script. + */ QString QWebEngineScript::sourceCode() const { return d->sourceCode(); } +/*! + * \brief QWebEngineScript::setSourceCode + * \param scriptSource + * Sets the script source to \a scriptSource. + */ void QWebEngineScript::setSourceCode(const QString &scriptSource) { if (scriptSource == sourceCode()) @@ -94,11 +169,24 @@ ASSERT_ENUMS_MATCH(QWebEngineScript::Deferred, UserScript::AfterLoad) ASSERT_ENUMS_MATCH(QWebEngineScript::DocumentReady, UserScript::DocumentLoadFinished) ASSERT_ENUMS_MATCH(QWebEngineScript::DocumentCreation, UserScript::DocumentElementCreation) +/*! + * \brief QWebEngineScript::injectionPoint + * \return the point in the loading process at which the script will be executed. + * The default value is QWebEngineScript::Deferred. + * + * \sa setInjectionPoint + */ QWebEngineScript::InjectionPoint QWebEngineScript::injectionPoint() const { return static_cast<QWebEngineScript::InjectionPoint>(d->injectionPoint()); } - +/*! + * \brief QWebEngineScript::setInjectionPoint + * \param p + * Sets the point at which to execute the script to be \p. + * + * \sa QWebEngineScript::InjectionPoint + */ void QWebEngineScript::setInjectionPoint(QWebEngineScript::InjectionPoint p) { if (p == injectionPoint()) @@ -106,11 +194,20 @@ void QWebEngineScript::setInjectionPoint(QWebEngineScript::InjectionPoint p) d->setInjectionPoint(static_cast<UserScript::InjectionPoint>(p)); } +/*! + * \brief QWebEngineScript::worldId + * \return the world id defining which world the script is executed in. + */ quint32 QWebEngineScript::worldId() const { return d->worldId(); } +/*! + * \brief QWebEngineScript::setWorldId + * \param id + * Sets the world id of the isolated world to use when running this script. + */ void QWebEngineScript::setWorldId(quint32 id) { if (id == d->worldId()) @@ -118,11 +215,20 @@ void QWebEngineScript::setWorldId(quint32 id) d->setWorldId(id); } +/*! + * \brief QWebEngineScript::runsOnSubFrames + * \return \c true if the script is executed on every frame in the page, \c false if it is only ran for the main frame. + */ bool QWebEngineScript::runsOnSubFrames() const { return d->runsOnSubFrames(); } +/*! + * \brief QWebEngineScript::setRunsOnSubFrames + * \param on + * Sets whether or not the script is executed on sub frames in addition to the main frame. + */ void QWebEngineScript::setRunsOnSubFrames(bool on) { if (runsOnSubFrames() == on) @@ -130,6 +236,11 @@ void QWebEngineScript::setRunsOnSubFrames(bool on) d->setRunsOnSubFrames(on); } +/*! + * \brief QWebEngineScript::operator == + * \param other + * \return \c true if this QWebEngineScript is equal to \a other, otherwise returns \c false. + */ bool QWebEngineScript::operator==(const QWebEngineScript &other) const { return d == other.d || *d == *(other.d); diff --git a/src/webenginewidgets/api/qwebenginescriptcollection.cpp b/src/webenginewidgets/api/qwebenginescriptcollection.cpp index 2f1f31b0e..21cb0d05e 100644 --- a/src/webenginewidgets/api/qwebenginescriptcollection.cpp +++ b/src/webenginewidgets/api/qwebenginescriptcollection.cpp @@ -41,6 +41,14 @@ using QtWebEngineCore::UserScript; +/*! + \class QWebEngineScriptCollection + \inmodule QtWebEngineWidgets + \since 5.5 + \brief The QWebEngineScriptCollection class represents a collection of user scripts. + +*/ + QWebEngineScriptCollection::QWebEngineScriptCollection(QWebEngineScriptCollectionPrivate *collectionPrivate) :d(collectionPrivate) { @@ -50,31 +58,67 @@ QWebEngineScriptCollection::~QWebEngineScriptCollection() { } +/*! + * \brief QWebEngineScriptCollection::count + * \return the number of elements in the collection. + */ + int QWebEngineScriptCollection::count() const { return d->count(); } +/*! + * \brief QWebEngineScriptCollection::contains + * \param value + * \return \c true if the collection contains an occurrence of \a value; otherwise returns false. + */ + bool QWebEngineScriptCollection::contains(const QWebEngineScript &value) const { return d->contains(value); } +/*! + * \brief QWebEngineScriptCollection::findScript + * \param name + * \return the first script found in collection the name property of which is \a name, or a null QWebEngineScript if none was found. + * \note the order in which the script collection is traversed is undefined, which means this should be used when the unicity is + * guaranteed at the application level. + * \sa findScripts() + */ + QWebEngineScript QWebEngineScriptCollection::findScript(const QString &name) const { return d->find(name); } +/*! + * \brief QWebEngineScriptCollection::findScripts + * \param name + * \return the list of scripts in the collection the name property of which is \a name, or an empty list if none was found. + */ + QList<QWebEngineScript> QWebEngineScriptCollection::findScripts(const QString &name) const { return d->toList(name); } - +/*! + * \brief QWebEngineScriptCollection::insert + * \param s + * + * Inserts script \c s into the collection. + */ void QWebEngineScriptCollection::insert(const QWebEngineScript &s) { d->insert(s); } - +/*! + * \brief QWebEngineScriptCollection::insert + * \param list + * + * Inserts scripts \c list into the collection. + */ void QWebEngineScriptCollection::insert(const QList<QWebEngineScript> &list) { d->reserve(list.size()); @@ -82,16 +126,30 @@ void QWebEngineScriptCollection::insert(const QList<QWebEngineScript> &list) d->insert(s); } +/*! + * \brief QWebEngineScriptCollection::remove + * \param script + * Removes \a script from the collection, if it is present. + * \return \c true if the script was found and successfully removed from the collection, \c false otherwise. + */ bool QWebEngineScriptCollection::remove(const QWebEngineScript &script) { return d->remove(script); } +/*! + * \brief QWebEngineScriptCollection::clear + * Removes all scripts from this collection. + */ void QWebEngineScriptCollection::clear() { d->clear(); } +/*! + * \brief QWebEngineScriptCollection::toList + * \return a QList with the values of the scripts used in this collection. + */ QList<QWebEngineScript> QWebEngineScriptCollection::toList() const { return d->toList(); diff --git a/src/webenginewidgets/api/qwebenginescriptcollection.h b/src/webenginewidgets/api/qwebenginescriptcollection.h index 72cb5e813..fe3ce2861 100644 --- a/src/webenginewidgets/api/qwebenginescriptcollection.h +++ b/src/webenginewidgets/api/qwebenginescriptcollection.h @@ -37,7 +37,7 @@ #ifndef QWEBENGINESCRIPTCOLLECTION_H #define QWEBENGINESCRIPTCOLLECTION_H -#include "qtwebengineglobal.h" +#include "qtwebenginewidgetsglobal.h" #include "qwebenginescript.h" #include <QtCore/QScopedPointer> @@ -67,6 +67,7 @@ public: QList<QWebEngineScript> toList() const; private: + Q_DISABLE_COPY(QWebEngineScriptCollection) friend class QWebEnginePagePrivate; friend class QWebEngineProfilePrivate; QWebEngineScriptCollection(QWebEngineScriptCollectionPrivate *); diff --git a/src/webenginewidgets/api/qwebenginescriptcollection_p.h b/src/webenginewidgets/api/qwebenginescriptcollection_p.h index 9a3a425ba..76267c70c 100644 --- a/src/webenginewidgets/api/qwebenginescriptcollection_p.h +++ b/src/webenginewidgets/api/qwebenginescriptcollection_p.h @@ -37,7 +37,7 @@ #ifndef QWEBENGINESCRIPTCOLLECTION_P_H #define QWEBENGINESCRIPTCOLLECTION_P_H -#include "qtwebengineglobal.h" +#include "qtwebenginewidgetsglobal.h" #include "qwebenginescript.h" diff --git a/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc b/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc index 9b7de27e2..ed1f1a773 100644 --- a/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc +++ b/src/webenginewidgets/doc/src/qtwebenginewidgets.qdoc @@ -99,17 +99,16 @@ \section1 Architecture - The easiest way to render content is through the QWebEngineView class. As a - widget it can be embedded into your forms and it provides convenience functions - for downloading and rendering web sites. + Use the QWebEngineView class to display web pages in the simplest way. + Because it's a widget, you can embed QWebEngineView into your forms and use + its convenience functions to download and display web sites. \snippet snippets/simple/main.cpp Using QWebEngineView - QWebEngineView is used to view Web pages. An instance of QWebEngineView has one - QWebEnginePage. QWebEnginePage provides access to the page's navigation history, - allows to run JavaScript code in the context of the page's main frame and enables - customization of handlers for specific events such as showing custom authentication - dialogs. + An instance of QWebEngineView has one QWebEnginePage. QWebEnginePage + provides access to the page's navigation history, ability to run JavaScript + code in the context of the page's main frame, and enables customization of + handlers for specific events like showing custom authentication dialogs. \section1 Reference Documentation @@ -131,7 +130,7 @@ GNU Library General Public License (LGPLv2). Developers using the Open Source Edition can choose to redistribute - the module under the GNU LGPLv3. + the module under the GNU LGPLv3 or GPLv2 and up. \legalese |