1/*
2 * Copyright (C) 2010, 2011 Nokia Inc. All rights reserved.
3 * Copyright (C) 2011 University of Szeged. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 * THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "config.h"
28
29#if ENABLE(PLUGIN_PROCESS)
30
31#include "NetscapePluginModule.h"
32#include "PluginProcess.h"
33#include "WebKit2Initialize.h"
34#include <QDebug>
35#include <QGuiApplication>
36#include <QStringList>
37#include <QtGlobal>
38#include <WebCore/RunLoop.h>
39
40using namespace WebCore;
41
42namespace WebKit {
43
44static void messageHandler(QtMsgType type, const QMessageLogContext&, const QString& message)
45{
46    if (type == QtCriticalMsg) {
47        fprintf(stderr, "%s\n", qPrintable(message));
48        return;
49    }
50
51    // Do nothing
52}
53
54static bool initializeGtk()
55{
56    QLibrary gtkLibrary(QLatin1String("libgtk-x11-2.0"), 0);
57    if (!gtkLibrary.load())
58        return false;
59    typedef void* (*gtk_init_ptr)(void*, void*);
60    gtk_init_ptr gtkInit = reinterpret_cast<gtk_init_ptr>(gtkLibrary.resolve("gtk_init"));
61    if (!gtkInit)
62        return false;
63    gtkInit(0, 0);
64    return true;
65}
66
67Q_DECL_EXPORT int PluginProcessMain(int argc, char** argv)
68{
69    QByteArray suppressOutput = qgetenv("QT_WEBKIT_SUPPRESS_WEB_PROCESS_OUTPUT");
70    if (!suppressOutput.isEmpty() && suppressOutput != "0")
71        qInstallMessageHandler(messageHandler);
72
73    QGuiApplication app(argc, argv);
74
75    // Workaround the issue that some versions of flash does not initialize Gtk properly.
76    if (!initializeGtk())
77        return EXIT_FAILURE;
78
79    InitializeWebKit2();
80
81    if (argc <= 1)
82        return EXIT_FAILURE;
83
84    if (app.arguments().at(1) == QLatin1String("-scanPlugin")) {
85        if (argc != 3)
86            return EXIT_FAILURE;
87        String pluginPath(app.arguments().at(2));
88        if (!NetscapePluginModule::scanPlugin(pluginPath))
89            return EXIT_FAILURE;
90        return EXIT_SUCCESS;
91    }
92
93    // Create the connection.
94    bool isNumber = false;
95    int identifier = app.arguments().at(1).toInt(&isNumber, 10);
96    if (!isNumber)
97        return EXIT_FAILURE;
98
99    WebKit::ChildProcessInitializationParameters parameters;
100    parameters.connectionIdentifier = identifier;
101    parameters.extraInitializationData.add("plugin-path", app.arguments().at(2));
102
103    WebKit::PluginProcess::shared().initialize(parameters);
104
105    RunLoop::run();
106
107    return 0;
108}
109
110}
111
112#endif // ENABLE(PLUGIN_PROCESS)
113