/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWebEngine module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "utils.h"

#ifndef QT_NO_WIDGETS
#include <QtWidgets/QApplication>
typedef QApplication Application;
#else
#include <QtGui/QGuiApplication>
typedef QGuiApplication Application;
#endif
#include <QtQml/QQmlApplicationEngine>
#include <QtQml/QQmlContext>
#include <QtQml/QQmlComponent>
#include <QtWebEngine/qtwebengineglobal.h>
#include <QtWebEngine/QQuickWebEngineProfile>
#include <QtWebEngineCore/qwebenginecookiestore.h>

static QUrl startupUrl()
{
    QUrl ret;
    QStringList args(qApp->arguments());
    args.takeFirst();
    for (const QString &arg : qAsConst(args)) {
        if (arg.startsWith(QLatin1Char('-')))
             continue;
        ret = Utils::fromUserInput(arg);
        if (ret.isValid())
            return ret;
    }
    return QUrl(QStringLiteral("http://qt.io/"));
}

int main(int argc, char **argv)
{
    Application app(argc, argv);

    // Enable dev tools by default for the test browser
    if (qgetenv("QTWEBENGINE_REMOTE_DEBUGGING").isNull())
        qputenv("QTWEBENGINE_REMOTE_DEBUGGING", "1337");
    QtWebEngine::initialize();

    QQmlApplicationEngine appEngine;
    Utils utils;
    appEngine.rootContext()->setContextProperty("utils", &utils);
    appEngine.load(QUrl("qrc:/ApplicationRoot.qml"));

    QObject *rootObject = appEngine.rootObjects().first();

    QQuickWebEngineProfile *profile = new QQuickWebEngineProfile(rootObject);

    const QMetaObject *rootMeta = rootObject->metaObject();
    int index = rootMeta->indexOfProperty("thirdPartyCookiesEnabled");
    Q_ASSERT(index != -1);
    QMetaProperty thirdPartyCookiesProperty = rootMeta->property(index);
    profile->cookieStore()->setCookieFilter(
            [rootObject,&thirdPartyCookiesProperty](const QWebEngineCookieStore::FilterRequest &request)
            {
                return !request.thirdParty || thirdPartyCookiesProperty.read(rootObject).toBool();
            });

    index = rootMeta->indexOfProperty("testProfile");
    Q_ASSERT(index != -1);
    QMetaProperty profileProperty = rootMeta->property(index);
    profileProperty.write(rootObject, QVariant::fromValue(profile));

    QMetaObject::invokeMethod(rootObject, "load", Q_ARG(QVariant, startupUrl()));

    return app.exec();
}
