1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*
2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved.
5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are
8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met:
9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions of source code must retain the above copyright
11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer.
12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions in binary form must reproduce the above
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer
14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the
15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution.
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Neither the name of Google Inc. nor the names of its
17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from
18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission.
19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h"
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "JSInspectorFrontendHost.h"
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(INSPECTOR)
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ContextMenuItem.h"
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "InspectorController.h"
40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "InspectorFrontendHost.h"
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "JSEvent.h"
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "MouseEvent.h"
43e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "PlatformString.h"
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <runtime/JSArray.h>
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <runtime/JSLock.h>
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <runtime/JSObject.h>
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/Vector.h>
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace JSC;
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
51643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebCore {
52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
535af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSInspectorFrontendHost::platform(ExecState* execState)
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if PLATFORM(MAC)
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, platform, ("mac"));
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#elif OS(WINDOWS)
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, platform, ("windows"));
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#elif OS(LINUX)
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, platform, ("linux"));
61bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#elif OS(FREEBSD)
62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_STATIC_LOCAL(const String, platform, ("freebsd"));
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, platform, ("unknown"));
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return jsString(execState, platform);
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
695af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSInspectorFrontendHost::port(ExecState* execState)
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if PLATFORM(QT)
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, port, ("qt"));
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#elif PLATFORM(GTK)
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, port, ("gtk"));
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#elif PLATFORM(WX)
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, port, ("wx"));
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_STATIC_LOCAL(const String, port, ("unknown"));
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return jsString(execState, port);
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
835af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSInspectorFrontendHost::showContextMenu(ExecState* exec)
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (exec->argumentCount() < 2)
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return jsUndefined();
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(CONTEXT_MENUS)
885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    Event* event = toEvent(exec->argument(0));
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSArray* array = asArray(exec->argument(1));
91d0825bca7fe65beaee391d30da42e937db621564Steve Block    Vector<ContextMenuItem*> items;
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (size_t i = 0; i < array->length(); ++i) {
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSObject* item = asObject(array->getIndex(i));
955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSValue label = item->get(exec, Identifier(exec, "label"));
96e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        JSValue type = item->get(exec, Identifier(exec, "type"));
975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSValue id = item->get(exec, Identifier(exec, "id"));
98e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        JSValue enabled = item->get(exec, Identifier(exec, "enabled"));
99e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        JSValue checked = item->get(exec, Identifier(exec, "checked"));
100e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (!type.isString())
101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            continue;
102e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
103e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        String typeString = ustringToString(type.toString(exec));
104e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (typeString == "separator") {
1050617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            items.append(new ContextMenuItem(SeparatorType,
1060617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                                             ContextMenuItemCustomTagNoAction,
1070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                                             String()));
108e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        } else {
1095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            ContextMenuAction typedId = static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + id.toInt32(exec));
110e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            ContextMenuItem* menuItem = new ContextMenuItem((typeString == "checkbox" ? CheckableActionType : ActionType), typedId, ustringToString(label.toString(exec)));
111e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            if (!enabled.isUndefined())
112e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                menuItem->setEnabled(enabled.toBoolean(exec));
113e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            if (!checked.isUndefined())
114e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                menuItem->setChecked(checked.toBoolean(exec));
115e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            items.append(menuItem);
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    impl()->showContextMenu(event, items);
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return jsUndefined();
122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebCore
125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif // ENABLE(INSPECTOR)
127