blob: 78f55437956c9736d8be91b7d54767caa1b23891 [file] [log] [blame]
/*
* Copyright (C) 2008 Gustavo Noronha Silva
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include "InspectorClientGtk.h"
#include "webkitwebview.h"
#include "webkitwebinspector.h"
#include "webkitprivate.h"
#include "CString.h"
#include "InspectorController.h"
#include "NotImplemented.h"
#include "PlatformString.h"
using namespace WebCore;
namespace WebKit {
static void notifyWebViewDestroyed(WebKitWebView* webView, InspectorClient* inspectorClient)
{
inspectorClient->webViewDestroyed();
}
InspectorClient::InspectorClient(WebKitWebView* webView)
: m_webView(0)
, m_inspectedWebView(webView)
, m_webInspector(0)
{}
void InspectorClient::inspectorDestroyed()
{
if (m_webView) {
gboolean handled = FALSE;
g_signal_emit_by_name(m_webInspector, "destroy", &handled);
/* we can now dispose our own reference */
g_object_unref(m_webInspector);
}
delete this;
}
void InspectorClient::webViewDestroyed()
{
m_webView = 0;
core(m_inspectedWebView)->inspectorController()->pageDestroyed();
// createPage will be called again, if the user chooses to inspect
// something else, and the inspector will be referenced again,
// there.
g_object_unref(m_webInspector);
}
Page* InspectorClient::createPage()
{
if (m_webView) {
gboolean handled = FALSE;
g_signal_emit_by_name(m_webInspector, "destroy", &handled);
/* we can now dispose our own reference */
g_object_unref(m_webInspector);
}
// This g_object_get will ref the inspector. We're not doing an
// unref if this method succeeds because the inspector object must
// be alive even after the inspected WebView is destroyed - the
// close-window and destroy signals still need to be
// emitted.
WebKitWebInspector* webInspector;
g_object_get(m_inspectedWebView, "web-inspector", &webInspector, NULL);
m_webInspector = webInspector;
g_signal_emit_by_name(m_webInspector, "inspect-web-view", m_inspectedWebView, &m_webView);
if (!m_webView) {
g_object_unref(m_webInspector);
return 0;
}
webkit_web_inspector_set_web_view(m_webInspector, m_webView);
g_signal_connect(m_webView, "destroy",
G_CALLBACK(notifyWebViewDestroyed), (gpointer)this);
GOwnPtr<gchar> inspectorURI;
// Make the Web Inspector work when running tests
if (g_file_test("WebCore/inspector/front-end/inspector.html", G_FILE_TEST_EXISTS)) {
GOwnPtr<gchar> currentDirectory(g_get_current_dir());
GOwnPtr<gchar> fullPath(g_strdup_printf("%s/WebCore/inspector/front-end/inspector.html", currentDirectory.get()));
inspectorURI.set(g_filename_to_uri(fullPath.get(), NULL, NULL));
} else
inspectorURI.set(g_filename_to_uri(DATA_DIR"/webkit-1.0/webinspector/inspector.html", NULL, NULL));
webkit_web_view_load_uri(m_webView, inspectorURI.get());
gtk_widget_show(GTK_WIDGET(m_webView));
return core(m_webView);
}
String InspectorClient::localizedStringsURL()
{
GOwnPtr<gchar> URL;
// Make the Web Inspector work when running tests
if (g_file_test("WebCore/English.lproj/localizedStrings.js", G_FILE_TEST_EXISTS)) {
GOwnPtr<gchar> currentDirectory(g_get_current_dir());
GOwnPtr<gchar> fullPath(g_strdup_printf("%s/WebCore/English.lproj/localizedStrings.js", currentDirectory.get()));
URL.set(g_filename_to_uri(fullPath.get(), NULL, NULL));
} else
URL.set(g_filename_to_uri(DATA_DIR"/webkit-1.0/webinspector/localizedStrings.js", NULL, NULL));
// FIXME: support l10n of localizedStrings.js
return String::fromUTF8(URL.get());
}
String InspectorClient::hiddenPanels()
{
notImplemented();
return String();
}
void InspectorClient::showWindow()
{
if (!m_webView)
return;
gboolean handled = FALSE;
g_signal_emit_by_name(m_webInspector, "show-window", &handled);
core(m_inspectedWebView)->inspectorController()->setWindowVisible(true);
}
void InspectorClient::closeWindow()
{
if (!m_webView)
return;
gboolean handled = FALSE;
g_signal_emit_by_name(m_webInspector, "close-window", &handled);
core(m_inspectedWebView)->inspectorController()->setWindowVisible(false);
}
void InspectorClient::attachWindow()
{
if (!m_webView)
return;
gboolean handled = FALSE;
g_signal_emit_by_name(m_webInspector, "attach-window", &handled);
}
void InspectorClient::detachWindow()
{
if (!m_webView)
return;
gboolean handled = FALSE;
g_signal_emit_by_name(m_webInspector, "detach-window", &handled);
}
void InspectorClient::setAttachedWindowHeight(unsigned height)
{
notImplemented();
}
void InspectorClient::highlight(Node* node)
{
notImplemented();
}
void InspectorClient::hideHighlight()
{
notImplemented();
}
void InspectorClient::inspectedURLChanged(const String& newURL)
{
if (!m_webView)
return;
webkit_web_inspector_set_inspected_uri(m_webInspector, newURL.utf8().data());
}
void InspectorClient::inspectorWindowObjectCleared()
{
notImplemented();
}
void InspectorClient::populateSetting(const String& key, InspectorController::Setting& setting)
{
notImplemented();
}
void InspectorClient::storeSetting(const String& key, const InspectorController::Setting& setting)
{
notImplemented();
}
void InspectorClient::removeSetting(const String& key)
{
notImplemented();
}
}