summaryrefslogtreecommitdiffstats
path: root/WebKit/gtk
diff options
context:
space:
mode:
authorUpstream <upstream-import@none>1970-01-12 13:46:40 +0000
committerUpstream <upstream-import@none>1970-01-12 13:46:40 +0000
commitd8543bb6618c17b12da906afa77d216f58cf4058 (patch)
treec58dc05ed86825bd0ef8d305d58c8205106b540f /WebKit/gtk
downloadexternal_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.zip
external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.gz
external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.bz2
external/webkit r30707
Diffstat (limited to 'WebKit/gtk')
-rw-r--r--WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp316
-rw-r--r--WebKit/gtk/WebCoreSupport/ChromeClientGtk.h104
-rw-r--r--WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp75
-rw-r--r--WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.h54
-rw-r--r--WebKit/gtk/WebCoreSupport/DragClientGtk.cpp64
-rw-r--r--WebKit/gtk/WebCoreSupport/DragClientGtk.h51
-rw-r--r--WebKit/gtk/WebCoreSupport/EditorClientGtk.cpp451
-rw-r--r--WebKit/gtk/WebCoreSupport/EditorClientGtk.h118
-rw-r--r--WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp789
-rw-r--r--WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.h186
-rw-r--r--WebKit/gtk/WebCoreSupport/InspectorClientGtk.cpp80
-rw-r--r--WebKit/gtk/WebCoreSupport/InspectorClientGtk.h62
-rw-r--r--WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp49
-rw-r--r--WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.h49
-rw-r--r--WebKit/gtk/webkit.pc.in11
-rw-r--r--WebKit/gtk/webkit/headers.pri8
-rw-r--r--WebKit/gtk/webkit/webkit-marshal.list12
-rw-r--r--WebKit/gtk/webkit/webkit.h31
-rw-r--r--WebKit/gtk/webkit/webkitdefines.h63
-rw-r--r--WebKit/gtk/webkit/webkitnetworkrequest.cpp88
-rw-r--r--WebKit/gtk/webkit/webkitnetworkrequest.h62
-rw-r--r--WebKit/gtk/webkit/webkitprivate.cpp104
-rw-r--r--WebKit/gtk/webkit/webkitprivate.h130
-rw-r--r--WebKit/gtk/webkit/webkitwebbackforwardlist.cpp379
-rw-r--r--WebKit/gtk/webkit/webkitwebbackforwardlist.h101
-rw-r--r--WebKit/gtk/webkit/webkitwebframe.cpp690
-rw-r--r--WebKit/gtk/webkit/webkitwebframe.h96
-rw-r--r--WebKit/gtk/webkit/webkitwebhistoryitem.cpp330
-rw-r--r--WebKit/gtk/webkit/webkitwebhistoryitem.h79
-rw-r--r--WebKit/gtk/webkit/webkitwebsettings.cpp464
-rw-r--r--WebKit/gtk/webkit/webkitwebsettings.h65
-rw-r--r--WebKit/gtk/webkit/webkitwebview.cpp1938
-rw-r--r--WebKit/gtk/webkit/webkitwebview.h222
33 files changed, 7321 insertions, 0 deletions
diff --git a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
new file mode 100644
index 0000000..28cd9b6
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ * Copyright (C) 2007, 2008 Christian Dywan <christian@imendio.com>
+ *
+ * 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 "ChromeClientGtk.h"
+
+#include "FloatRect.h"
+#include "IntRect.h"
+#include "PlatformString.h"
+#include "CString.h"
+#include "HitTestResult.h"
+#include "KURL.h"
+#include "webkitwebview.h"
+#include "webkitprivate.h"
+#include "NotImplemented.h"
+#include "WindowFeatures.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+ChromeClient::ChromeClient(WebKitWebView* webView)
+ : m_webView(webView)
+{
+}
+
+void ChromeClient::chromeDestroyed()
+{
+ delete this;
+}
+
+FloatRect ChromeClient::windowRect()
+{
+ if (!m_webView)
+ return FloatRect();
+ GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
+ if (window) {
+ gint left, top, width, height;
+ gtk_window_get_position(GTK_WINDOW(window), &left, &top);
+ gtk_window_get_size(GTK_WINDOW(window), &width, &height);
+ return IntRect(left, top, width, height);
+ }
+ return FloatRect();
+}
+
+void ChromeClient::setWindowRect(const FloatRect& r)
+{
+ notImplemented();
+}
+
+FloatRect ChromeClient::pageRect()
+{
+ if (!m_webView)
+ return FloatRect();
+ GtkAllocation allocation = GTK_WIDGET(m_webView)->allocation;
+ return IntRect(allocation.x, allocation.y, allocation.width, allocation.height);
+}
+
+float ChromeClient::scaleFactor()
+{
+ // Not implementable
+ return 1.0;
+}
+
+void ChromeClient::focus()
+{
+ if (!m_webView)
+ return;
+ gtk_widget_grab_focus(GTK_WIDGET(m_webView));
+}
+
+void ChromeClient::unfocus()
+{
+ if (!m_webView)
+ return;
+ GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
+ if (window)
+ gtk_window_set_focus(GTK_WINDOW(window), NULL);
+}
+
+Page* ChromeClient::createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures& features)
+{
+ if (features.dialog) {
+ notImplemented();
+ return 0;
+ } else {
+ /* TODO: FrameLoadRequest is not used */
+ WebKitWebView* webView = WEBKIT_WEB_VIEW_GET_CLASS(m_webView)->create_web_view(m_webView);
+ if (!webView)
+ return 0;
+
+ WebKitWebViewPrivate* privateData = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
+ return privateData->corePage;
+ }
+}
+
+void ChromeClient::show()
+{
+ notImplemented();
+}
+
+bool ChromeClient::canRunModal()
+{
+ notImplemented();
+ return false;
+}
+
+void ChromeClient::runModal()
+{
+ notImplemented();
+}
+
+void ChromeClient::setToolbarsVisible(bool)
+{
+ notImplemented();
+}
+
+bool ChromeClient::toolbarsVisible()
+{
+ notImplemented();
+ return false;
+}
+
+void ChromeClient::setStatusbarVisible(bool)
+{
+ notImplemented();
+}
+
+bool ChromeClient::statusbarVisible()
+{
+ notImplemented();
+ return false;
+}
+
+void ChromeClient::setScrollbarsVisible(bool)
+{
+ notImplemented();
+}
+
+bool ChromeClient::scrollbarsVisible() {
+ notImplemented();
+ return false;
+}
+
+void ChromeClient::setMenubarVisible(bool)
+{
+ notImplemented();
+}
+
+bool ChromeClient::menubarVisible()
+{
+ notImplemented();
+ return false;
+}
+
+void ChromeClient::setResizable(bool)
+{
+ notImplemented();
+}
+
+void ChromeClient::closeWindowSoon()
+{
+ notImplemented();
+}
+
+bool ChromeClient::canTakeFocus(FocusDirection)
+{
+ if (!m_webView)
+ return false;
+ return GTK_WIDGET_CAN_FOCUS(m_webView);
+}
+
+void ChromeClient::takeFocus(FocusDirection)
+{
+ unfocus();
+}
+
+bool ChromeClient::canRunBeforeUnloadConfirmPanel()
+{
+ return true;
+}
+
+bool ChromeClient::runBeforeUnloadConfirmPanel(const WebCore::String& message, WebCore::Frame* frame)
+{
+ return runJavaScriptConfirm(frame, message);
+}
+
+void ChromeClient::addMessageToConsole(const WebCore::String& message, unsigned int lineNumber, const WebCore::String& sourceId)
+{
+ gboolean retval;
+ g_signal_emit_by_name(m_webView, "console-message", message.utf8().data(), lineNumber, sourceId.utf8().data(), &retval);
+}
+
+void ChromeClient::runJavaScriptAlert(Frame* frame, const String& message)
+{
+ gboolean retval;
+ g_signal_emit_by_name(m_webView, "script-alert", kit(frame), message.utf8().data(), &retval);
+}
+
+bool ChromeClient::runJavaScriptConfirm(Frame* frame, const String& message)
+{
+ gboolean retval;
+ gboolean didConfirm;
+ g_signal_emit_by_name(m_webView, "script-confirm", kit(frame), message.utf8().data(), &didConfirm, &retval);
+ return didConfirm == TRUE;
+}
+
+bool ChromeClient::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
+{
+ gboolean retval;
+ gchar* value = 0;
+ g_signal_emit_by_name(m_webView, "script-prompt", kit(frame), message.utf8().data(), defaultValue.utf8().data(), &value, &retval);
+ if (value) {
+ result = String::fromUTF8(value);
+ g_free(value);
+ return true;
+ }
+ return false;
+}
+
+void ChromeClient::setStatusbarText(const String& string)
+{
+ CString stringMessage = string.utf8();
+ g_signal_emit_by_name(m_webView, "status-bar-text-changed", stringMessage.data());
+}
+
+bool ChromeClient::shouldInterruptJavaScript()
+{
+ notImplemented();
+ return false;
+}
+
+bool ChromeClient::tabsToLinks() const
+{
+ return true;
+}
+
+IntRect ChromeClient::windowResizerRect() const
+{
+ notImplemented();
+ return IntRect();
+}
+
+void ChromeClient::addToDirtyRegion(const IntRect&)
+{
+ notImplemented();
+}
+
+void ChromeClient::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
+{
+ notImplemented();
+}
+
+void ChromeClient::updateBackingStore()
+{
+ notImplemented();
+}
+
+void ChromeClient::mouseDidMoveOverElement(const HitTestResult& hit, unsigned modifierFlags)
+{
+ // check if the element is a link...
+ bool isLink = hit.isLiveLink();
+ if (isLink) {
+ KURL url = hit.absoluteLinkURL();
+ if (!url.isEmpty() && url != m_hoveredLinkURL) {
+ CString titleString = hit.title().utf8();
+ CString urlString = url.prettyURL().utf8();
+ g_signal_emit_by_name(m_webView, "hovering-over-link", titleString.data(), urlString.data());
+ m_hoveredLinkURL = url;
+ }
+ } else if (!isLink && !m_hoveredLinkURL.isEmpty()) {
+ g_signal_emit_by_name(m_webView, "hovering-over-link", 0, 0);
+ m_hoveredLinkURL = KURL();
+ }
+}
+
+void ChromeClient::setToolTip(const String& toolTip)
+{
+#if GTK_CHECK_VERSION(2,12,0)
+ if (toolTip.isEmpty())
+ g_object_set(G_OBJECT(m_webView), "has-tooltip", FALSE, NULL);
+ else
+ gtk_widget_set_tooltip_text(GTK_WIDGET(m_webView), toolTip.utf8().data());
+#else
+ // TODO: Support older GTK+ versions
+ // See http://bugs.webkit.org/show_bug.cgi?id=15793
+ notImplemented();
+#endif
+}
+
+void ChromeClient::print(Frame* frame)
+{
+ webkit_web_frame_print(kit(frame));
+}
+
+void ChromeClient::exceededDatabaseQuota(Frame*, const String&)
+{
+ notImplemented();
+}
+
+}
diff --git a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
new file mode 100644
index 0000000..465dc9f
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef ChromeClientGtk_h
+#define ChromeClientGtk_h
+
+#include "ChromeClient.h"
+#include "KURL.h"
+
+typedef struct _WebKitWebView WebKitWebView;
+
+namespace WebKit {
+
+ class ChromeClient : public WebCore::ChromeClient {
+ public:
+ ChromeClient(WebKitWebView*);
+ WebKitWebView* webView() const { return m_webView; }
+
+ virtual void chromeDestroyed();
+
+ virtual void setWindowRect(const WebCore::FloatRect&);
+ virtual WebCore::FloatRect windowRect();
+
+ virtual WebCore::FloatRect pageRect();
+
+ virtual float scaleFactor();
+
+ virtual void focus();
+ virtual void unfocus();
+
+ virtual bool canTakeFocus(WebCore::FocusDirection);
+ virtual void takeFocus(WebCore::FocusDirection);
+
+ virtual WebCore::Page* createWindow(WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&);
+ virtual void show();
+
+ virtual bool canRunModal();
+ virtual void runModal();
+
+ virtual void setToolbarsVisible(bool);
+ virtual bool toolbarsVisible();
+
+ virtual void setStatusbarVisible(bool);
+ virtual bool statusbarVisible();
+
+ virtual void setScrollbarsVisible(bool);
+ virtual bool scrollbarsVisible();
+
+ virtual void setMenubarVisible(bool);
+ virtual bool menubarVisible();
+
+ virtual void setResizable(bool);
+
+ virtual void addMessageToConsole(const WebCore::String& message, unsigned int lineNumber,
+ const WebCore::String& sourceID);
+
+ virtual bool canRunBeforeUnloadConfirmPanel();
+ virtual bool runBeforeUnloadConfirmPanel(const WebCore::String& message, WebCore::Frame* frame);
+
+ virtual void closeWindowSoon();
+
+ virtual void runJavaScriptAlert(WebCore::Frame*, const WebCore::String&);
+ virtual bool runJavaScriptConfirm(WebCore::Frame*, const WebCore::String&);
+ virtual bool runJavaScriptPrompt(WebCore::Frame*, const WebCore::String& message, const WebCore::String& defaultValue, WebCore::String& result);
+ virtual void setStatusbarText(const WebCore::String&);
+ virtual bool shouldInterruptJavaScript();
+ virtual bool tabsToLinks() const;
+
+ virtual WebCore::IntRect windowResizerRect() const;
+ virtual void addToDirtyRegion(const WebCore::IntRect&);
+ virtual void scrollBackingStore(int dx, int dy, const WebCore::IntRect& scrollViewRect, const WebCore::IntRect& clipRect);
+ virtual void updateBackingStore();
+
+ virtual void mouseDidMoveOverElement(const WebCore::HitTestResult&, unsigned modifierFlags);
+
+ virtual void setToolTip(const WebCore::String&);
+
+ virtual void print(WebCore::Frame*);
+
+ virtual void exceededDatabaseQuota(WebCore::Frame*, const WebCore::String&);
+
+ private:
+ WebKitWebView* m_webView;
+ WebCore::KURL m_hoveredLinkURL;
+ };
+}
+
+#endif // ChromeClient_h
diff --git a/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp b/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp
new file mode 100644
index 0000000..6a2feb2
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp
@@ -0,0 +1,75 @@
+/*
+ * 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 "ContextMenu.h"
+#include "ContextMenuClientGtk.h"
+
+#include "HitTestResult.h"
+#include "KURL.h"
+#include "NotImplemented.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void ContextMenuClient::contextMenuDestroyed()
+{
+ delete this;
+}
+
+PlatformMenuDescription ContextMenuClient::getCustomMenuFromDefaultItems(ContextMenu* menu)
+{
+ return menu->releasePlatformDescription();
+}
+
+void ContextMenuClient::contextMenuItemSelected(ContextMenuItem*, const ContextMenu*)
+{
+ notImplemented();
+}
+
+void ContextMenuClient::downloadURL(const KURL& url)
+{
+ notImplemented();
+}
+
+void ContextMenuClient::copyImageToClipboard(const HitTestResult&)
+{
+ notImplemented();
+}
+
+void ContextMenuClient::searchWithGoogle(const Frame*)
+{
+ notImplemented();
+}
+
+void ContextMenuClient::lookUpInDictionary(Frame*)
+{
+ notImplemented();
+}
+
+void ContextMenuClient::speak(const String&)
+{
+ notImplemented();
+}
+
+void ContextMenuClient::stopSpeaking()
+{
+ notImplemented();
+}
+
+}
+
diff --git a/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.h b/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.h
new file mode 100644
index 0000000..c0e8069
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2006 Zack Rusin <zack@kde.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ContextMenuClientGtk_h
+#define ContextMenuClientGtk_h
+
+#include "ContextMenuClient.h"
+
+namespace WebCore {
+ class ContextMenu;
+}
+
+namespace WebKit {
+
+ class ContextMenuClient : public WebCore::ContextMenuClient
+ {
+ public:
+ virtual void contextMenuDestroyed();
+
+ virtual WebCore::PlatformMenuDescription getCustomMenuFromDefaultItems(WebCore::ContextMenu*);
+ virtual void contextMenuItemSelected(WebCore::ContextMenuItem*, const WebCore::ContextMenu*);
+
+ virtual void downloadURL(const WebCore::KURL& url);
+ virtual void copyImageToClipboard(const WebCore::HitTestResult&);
+ virtual void searchWithGoogle(const WebCore::Frame*);
+ virtual void lookUpInDictionary(WebCore::Frame*);
+ virtual void speak(const WebCore::String&);
+ virtual void stopSpeaking();
+ };
+}
+
+#endif
diff --git a/WebKit/gtk/WebCoreSupport/DragClientGtk.cpp b/WebKit/gtk/WebCoreSupport/DragClientGtk.cpp
new file mode 100644
index 0000000..f55b6ea
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/DragClientGtk.cpp
@@ -0,0 +1,64 @@
+/*
+ * 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 "DragClientGtk.h"
+
+#include "NotImplemented.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void DragClient::willPerformDragDestinationAction(DragDestinationAction, DragData*)
+{
+ notImplemented();
+}
+
+void DragClient::willPerformDragSourceAction(DragSourceAction, const IntPoint&, Clipboard*)
+{
+ notImplemented();
+}
+
+DragDestinationAction DragClient::actionMaskForDrag(DragData*)
+{
+ notImplemented();
+ return DragDestinationActionAny;
+}
+
+DragSourceAction DragClient::dragSourceActionMaskForPoint(const IntPoint&)
+{
+ notImplemented();
+ return DragSourceActionAny;
+}
+
+void DragClient::startDrag(DragImageRef, const IntPoint&, const IntPoint&, Clipboard*, Frame*, bool)
+{
+ notImplemented();
+}
+
+DragImageRef DragClient::createDragImageForLink(KURL&, const String& label, Frame*)
+{
+ notImplemented();
+ return 0;
+}
+
+void DragClient::dragControllerDestroyed()
+{
+ delete this;
+}
+}
+
diff --git a/WebKit/gtk/WebCoreSupport/DragClientGtk.h b/WebKit/gtk/WebCoreSupport/DragClientGtk.h
new file mode 100644
index 0000000..4367c68
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/DragClientGtk.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef DragClientGtk_h
+#define DragClientGtk_h
+
+#include "DragClient.h"
+
+namespace WebKit {
+ class DragClient : public WebCore::DragClient {
+ public:
+ virtual void willPerformDragDestinationAction(WebCore::DragDestinationAction, WebCore::DragData*);
+ virtual void willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::Clipboard*);
+ virtual WebCore::DragDestinationAction actionMaskForDrag(WebCore::DragData*);
+
+ virtual WebCore::DragSourceAction dragSourceActionMaskForPoint(const WebCore::IntPoint& windowPoint);
+
+ virtual void startDrag(WebCore::DragImageRef dragImage, const WebCore::IntPoint& dragImageOrigin, const WebCore::IntPoint& eventPos, WebCore::Clipboard*, WebCore::Frame*, bool linkDrag = false);
+ virtual WebCore::DragImageRef createDragImageForLink(WebCore::KURL&, const WebCore::String& label, WebCore::Frame*);
+
+ virtual void dragControllerDestroyed();
+ };
+}
+
+#endif
diff --git a/WebKit/gtk/WebCoreSupport/EditorClientGtk.cpp b/WebKit/gtk/WebCoreSupport/EditorClientGtk.cpp
new file mode 100644
index 0000000..8b6c954
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/EditorClientGtk.cpp
@@ -0,0 +1,451 @@
+/*
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
+ *
+ * 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 "EditorClientGtk.h"
+
+#include "EditCommand.h"
+#include "Editor.h"
+#include "FocusController.h"
+#include "Frame.h"
+#include "KeyboardCodes.h"
+#include "KeyboardEvent.h"
+#include "NotImplemented.h"
+#include "Page.h"
+#include "PlatformKeyboardEvent.h"
+#include "webkitprivate.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+static void imContextCommitted(GtkIMContext* context, const char* str, EditorClient* client)
+{
+ Frame* frame = core(client->m_webView)->focusController()->focusedOrMainFrame();
+ frame->editor()->insertTextWithoutSendingTextEvent(String::fromUTF8(str), false);
+}
+
+bool EditorClient::shouldDeleteRange(Range*)
+{
+ notImplemented();
+ return true;
+}
+
+bool EditorClient::shouldShowDeleteInterface(HTMLElement*)
+{
+ return false;
+}
+
+bool EditorClient::isContinuousSpellCheckingEnabled()
+{
+ notImplemented();
+ return false;
+}
+
+bool EditorClient::isGrammarCheckingEnabled()
+{
+ notImplemented();
+ return false;
+}
+
+int EditorClient::spellCheckerDocumentTag()
+{
+ notImplemented();
+ return 0;
+}
+
+bool EditorClient::shouldBeginEditing(WebCore::Range*)
+{
+ notImplemented();
+ return true;
+}
+
+bool EditorClient::shouldEndEditing(WebCore::Range*)
+{
+ notImplemented();
+ return true;
+}
+
+bool EditorClient::shouldInsertText(String, Range*, EditorInsertAction)
+{
+ notImplemented();
+ return true;
+}
+
+bool EditorClient::shouldChangeSelectedRange(Range*, Range*, EAffinity, bool)
+{
+ notImplemented();
+ return true;
+}
+
+bool EditorClient::shouldApplyStyle(WebCore::CSSStyleDeclaration*,
+ WebCore::Range*)
+{
+ notImplemented();
+ return true;
+}
+
+bool EditorClient::shouldMoveRangeAfterDelete(WebCore::Range*, WebCore::Range*)
+{
+ notImplemented();
+ return true;
+}
+
+void EditorClient::didBeginEditing()
+{
+ notImplemented();
+}
+
+void EditorClient::respondToChangedContents()
+{
+ notImplemented();
+}
+
+void EditorClient::respondToChangedSelection()
+{
+ notImplemented();
+}
+
+void EditorClient::didEndEditing()
+{
+ notImplemented();
+}
+
+void EditorClient::didWriteSelectionToPasteboard()
+{
+ notImplemented();
+}
+
+void EditorClient::didSetSelectionTypesForPasteboard()
+{
+ notImplemented();
+}
+
+bool EditorClient::isEditable()
+{
+ return webkit_web_view_get_editable(m_webView);
+}
+
+void EditorClient::registerCommandForUndo(WTF::PassRefPtr<WebCore::EditCommand>)
+{
+ notImplemented();
+}
+
+void EditorClient::registerCommandForRedo(WTF::PassRefPtr<WebCore::EditCommand>)
+{
+ notImplemented();
+}
+
+void EditorClient::clearUndoRedoOperations()
+{
+ notImplemented();
+}
+
+bool EditorClient::canUndo() const
+{
+ notImplemented();
+ return false;
+}
+
+bool EditorClient::canRedo() const
+{
+ notImplemented();
+ return false;
+}
+
+void EditorClient::undo()
+{
+ notImplemented();
+}
+
+void EditorClient::redo()
+{
+ notImplemented();
+}
+
+bool EditorClient::shouldInsertNode(Node*, Range*, EditorInsertAction)
+{
+ notImplemented();
+ return true;
+}
+
+void EditorClient::pageDestroyed()
+{
+ delete this;
+}
+
+bool EditorClient::smartInsertDeleteEnabled()
+{
+ notImplemented();
+ return false;
+}
+
+void EditorClient::toggleContinuousSpellChecking()
+{
+ notImplemented();
+}
+
+void EditorClient::toggleGrammarChecking()
+{
+}
+
+void EditorClient::handleKeyboardEvent(KeyboardEvent* event)
+{
+ Frame* frame = core(m_webView)->focusController()->focusedOrMainFrame();
+ if (!frame || !frame->document()->focusedNode())
+ return;
+
+ const PlatformKeyboardEvent* kevent = event->keyEvent();
+ if (!kevent || kevent->type() == PlatformKeyboardEvent::KeyUp)
+ return;
+
+ Node* start = frame->selectionController()->start().node();
+ if (!start)
+ return;
+
+ // FIXME: Use GtkBindingSet instead of this hard-coded switch
+ // http://bugs.webkit.org/show_bug.cgi?id=15911
+
+ if (start->isContentEditable()) {
+ switch (kevent->windowsVirtualKeyCode()) {
+ case VK_BACK:
+ frame->editor()->deleteWithDirection(SelectionController::BACKWARD,
+ kevent->ctrlKey() ? WordGranularity : CharacterGranularity, false, true);
+ break;
+ case VK_DELETE:
+ frame->editor()->deleteWithDirection(SelectionController::FORWARD,
+ kevent->ctrlKey() ? WordGranularity : CharacterGranularity, false, true);
+ break;
+ case VK_LEFT:
+ frame->selectionController()->modify(kevent->shiftKey() ? SelectionController::EXTEND : SelectionController::MOVE,
+ SelectionController::LEFT,
+ kevent->ctrlKey() ? WordGranularity : CharacterGranularity,
+ true);
+ break;
+ case VK_RIGHT:
+ frame->selectionController()->modify(kevent->shiftKey() ? SelectionController::EXTEND : SelectionController::MOVE,
+ SelectionController::RIGHT,
+ kevent->ctrlKey() ? WordGranularity : CharacterGranularity,
+ true);
+ break;
+ case VK_UP:
+ frame->selectionController()->modify(kevent->shiftKey() ? SelectionController::EXTEND : SelectionController::MOVE,
+ SelectionController::BACKWARD,
+ kevent->ctrlKey() ? ParagraphGranularity : LineGranularity,
+ true);
+ break;
+ case VK_DOWN:
+ frame->selectionController()->modify(kevent->shiftKey() ? SelectionController::EXTEND : SelectionController::MOVE,
+ SelectionController::FORWARD,
+ kevent->ctrlKey() ? ParagraphGranularity : LineGranularity,
+ true);
+ break;
+ case VK_PRIOR: // PageUp
+ frame->editor()->command("MovePageUp").execute();
+ break;
+ case VK_NEXT: // PageDown
+ frame->editor()->command("MovePageDown").execute();
+ break;
+ case VK_HOME:
+ if (kevent->ctrlKey() && kevent->shiftKey())
+ frame->editor()->command("MoveToBeginningOfDocumentAndModifySelection").execute();
+ else if (kevent->ctrlKey())
+ frame->editor()->command("MoveToBeginningOfDocument").execute();
+ else if (kevent->shiftKey())
+ frame->editor()->command("MoveToBeginningOfLineAndModifySelection").execute();
+ else
+ frame->editor()->command("MoveToBeginningOfLine").execute();
+ break;
+ case VK_END:
+ if (kevent->ctrlKey() && kevent->shiftKey())
+ frame->editor()->command("MoveToEndOfDocumentAndModifySelection").execute();
+ else if (kevent->ctrlKey())
+ frame->editor()->command("MoveToEndOfDocument").execute();
+ else if (kevent->shiftKey())
+ frame->editor()->command("MoveToEndOfLineAndModifySelection").execute();
+ else
+ frame->editor()->command("MoveToEndOfLine").execute();
+ break;
+ case VK_RETURN:
+ frame->editor()->command("InsertLineBreak").execute();
+ break;
+ case VK_TAB:
+ return;
+ default:
+ if (!kevent->ctrlKey() && !kevent->altKey() && !kevent->text().isEmpty()) {
+ if (kevent->text().length() == 1) {
+ UChar ch = kevent->text()[0];
+ // Don't insert null or control characters as they can result in unexpected behaviour
+ if (ch < ' ')
+ break;
+ }
+ frame->editor()->insertText(kevent->text(), event);
+ } else if (kevent->ctrlKey()) {
+ switch (kevent->windowsVirtualKeyCode()) {
+ case VK_B:
+ frame->editor()->command("ToggleBold").execute();
+ break;
+ case VK_I:
+ frame->editor()->command("ToggleItalic").execute();
+ break;
+ case VK_Y:
+ frame->editor()->command("Redo").execute();
+ break;
+ case VK_Z:
+ frame->editor()->command("Undo").execute();
+ break;
+ default:
+ return;
+ }
+ } else return;
+ }
+ } else {
+ switch (kevent->windowsVirtualKeyCode()) {
+ case VK_UP:
+ frame->editor()->command("MoveUp").execute();
+ break;
+ case VK_DOWN:
+ frame->editor()->command("MoveDown").execute();
+ break;
+ case VK_PRIOR: // PageUp
+ frame->editor()->command("MovePageUp").execute();
+ break;
+ case VK_NEXT: // PageDown
+ frame->editor()->command("MovePageDown").execute();
+ break;
+ case VK_HOME:
+ if (kevent->ctrlKey())
+ frame->editor()->command("MoveToBeginningOfDocument").execute();
+ break;
+ case VK_END:
+ if (kevent->ctrlKey())
+ frame->editor()->command("MoveToEndOfDocument").execute();
+ break;
+ default:
+ return;
+ }
+ }
+ event->setDefaultHandled();
+}
+
+
+void EditorClient::handleInputMethodKeydown(KeyboardEvent*)
+{
+ notImplemented();
+}
+
+EditorClient::EditorClient(WebKitWebView* webView)
+ : m_webView(webView)
+{
+ WebKitWebViewPrivate* priv = m_webView->priv;
+ g_signal_connect(priv->imContext, "commit", G_CALLBACK(imContextCommitted), this);
+}
+
+EditorClient::~EditorClient()
+{
+ WebKitWebViewPrivate* priv = m_webView->priv;
+ g_signal_handlers_disconnect_by_func(priv->imContext, (gpointer)imContextCommitted, this);
+}
+
+void EditorClient::textFieldDidBeginEditing(Element*)
+{
+ gtk_im_context_focus_in(WEBKIT_WEB_VIEW_GET_PRIVATE(m_webView)->imContext);
+}
+
+void EditorClient::textFieldDidEndEditing(Element*)
+{
+ WebKitWebViewPrivate* priv = m_webView->priv;
+
+ gtk_im_context_focus_out(priv->imContext);
+#ifdef MAEMO_CHANGES
+ hildon_gtk_im_context_hide(priv->imContext);
+#endif
+}
+
+void EditorClient::textDidChangeInTextField(Element*)
+{
+ notImplemented();
+}
+
+bool EditorClient::doTextFieldCommandFromEvent(Element* element, KeyboardEvent* event)
+{
+ WebKitWebViewPrivate* priv = m_webView->priv;
+ return gtk_im_context_filter_keypress(priv->imContext, event->keyEvent()->gdkEventKey());
+}
+
+void EditorClient::textWillBeDeletedInTextField(Element*)
+{
+ notImplemented();
+}
+
+void EditorClient::textDidChangeInTextArea(Element*)
+{
+ notImplemented();
+}
+
+void EditorClient::ignoreWordInSpellDocument(const String&)
+{
+ notImplemented();
+}
+
+void EditorClient::learnWord(const String&)
+{
+ notImplemented();
+}
+
+void EditorClient::checkSpellingOfString(const UChar*, int, int*, int*)
+{
+ notImplemented();
+}
+
+void EditorClient::checkGrammarOfString(const UChar*, int, Vector<GrammarDetail>&, int*, int*)
+{
+ notImplemented();
+}
+
+void EditorClient::updateSpellingUIWithGrammarString(const String&, const GrammarDetail&)
+{
+ notImplemented();
+}
+
+void EditorClient::updateSpellingUIWithMisspelledWord(const String&)
+{
+ notImplemented();
+}
+
+void EditorClient::showSpellingUI(bool)
+{
+ notImplemented();
+}
+
+bool EditorClient::spellingUIIsShowing()
+{
+ notImplemented();
+ return false;
+}
+
+void EditorClient::getGuessesForWord(const String&, Vector<String>&)
+{
+ notImplemented();
+}
+
+void EditorClient::setInputMethodState(bool)
+{
+}
+
+}
diff --git a/WebKit/gtk/WebCoreSupport/EditorClientGtk.h b/WebKit/gtk/WebCoreSupport/EditorClientGtk.h
new file mode 100644
index 0000000..f2bc194
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/EditorClientGtk.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2006 Zack Rusin <zack@kde.org>
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef EditorClientGtk_h
+#define EditorClientGtk_h
+
+#include "EditorClient.h"
+
+#include <wtf/Forward.h>
+
+typedef struct _WebKitWebView WebKitWebView;
+
+namespace WebCore {
+ class Page;
+}
+
+namespace WebKit {
+
+ class EditorClient : public WebCore::EditorClient {
+ public:
+ EditorClient(WebKitWebView*);
+ ~EditorClient();
+
+ // from EditorClient
+ virtual void pageDestroyed();
+
+ virtual bool shouldDeleteRange(WebCore::Range*);
+ virtual bool shouldShowDeleteInterface(WebCore::HTMLElement*);
+ virtual bool smartInsertDeleteEnabled();
+ virtual bool isContinuousSpellCheckingEnabled();
+ virtual void toggleContinuousSpellChecking();
+ virtual bool isGrammarCheckingEnabled();
+ virtual void toggleGrammarChecking();
+ virtual int spellCheckerDocumentTag();
+
+ virtual bool isEditable();
+
+ virtual bool shouldBeginEditing(WebCore::Range*);
+ virtual bool shouldEndEditing(WebCore::Range*);
+ virtual bool shouldInsertNode(WebCore::Node*, WebCore::Range*, WebCore::EditorInsertAction);
+ virtual bool shouldInsertText(WebCore::String, WebCore::Range*, WebCore::EditorInsertAction);
+ virtual bool shouldChangeSelectedRange(WebCore::Range* fromRange, WebCore::Range* toRange, WebCore::EAffinity, bool stillSelecting);
+
+ virtual bool shouldApplyStyle(WebCore::CSSStyleDeclaration*, WebCore::Range*);
+
+ virtual bool shouldMoveRangeAfterDelete(WebCore::Range*, WebCore::Range*);
+
+ virtual void didBeginEditing();
+ virtual void respondToChangedContents();
+ virtual void respondToChangedSelection();
+ virtual void didEndEditing();
+ virtual void didWriteSelectionToPasteboard();
+ virtual void didSetSelectionTypesForPasteboard();
+
+ virtual void registerCommandForUndo(WTF::PassRefPtr<WebCore::EditCommand>);
+ virtual void registerCommandForRedo(WTF::PassRefPtr<WebCore::EditCommand>);
+ virtual void clearUndoRedoOperations();
+
+ virtual bool canUndo() const;
+ virtual bool canRedo() const;
+
+ virtual void undo();
+ virtual void redo();
+
+ virtual void handleKeyboardEvent(WebCore::KeyboardEvent*);
+ virtual void handleInputMethodKeydown(WebCore::KeyboardEvent*);
+
+ virtual void textFieldDidBeginEditing(WebCore::Element*);
+ virtual void textFieldDidEndEditing(WebCore::Element*);
+ virtual void textDidChangeInTextField(WebCore::Element*);
+ virtual bool doTextFieldCommandFromEvent(WebCore::Element*, WebCore::KeyboardEvent*);
+ virtual void textWillBeDeletedInTextField(WebCore::Element*);
+ virtual void textDidChangeInTextArea(WebCore::Element*);
+
+ virtual void ignoreWordInSpellDocument(const WebCore::String&);
+ virtual void learnWord(const WebCore::String&);
+ virtual void checkSpellingOfString(const UChar*, int length, int* misspellingLocation, int* misspellingLength);
+ virtual void checkGrammarOfString(const UChar*, int length, WTF::Vector<WebCore::GrammarDetail>&, int* badGrammarLocation, int* badGrammarLength);
+ virtual void updateSpellingUIWithGrammarString(const WebCore::String&, const WebCore::GrammarDetail&);
+ virtual void updateSpellingUIWithMisspelledWord(const WebCore::String&);
+ virtual void showSpellingUI(bool show);
+ virtual bool spellingUIIsShowing();
+ virtual void getGuessesForWord(const WebCore::String&, WTF::Vector<WebCore::String>& guesses);
+ virtual void setInputMethodState(bool enabled);
+
+ WebKitWebView* m_webView;
+ };
+}
+
+#endif
+
+// vim: ts=4 sw=4 et
diff --git a/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp b/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp
new file mode 100644
index 0000000..d518f60
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp
@@ -0,0 +1,789 @@
+/*
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
+ * Copyright (C) 2007, 2008 Holger Hans Peter Freyther
+ * Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
+ *
+ * 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 "FrameLoaderClientGtk.h"
+
+#include "DocumentLoader.h"
+#include "FrameLoader.h"
+#include "FrameView.h"
+#include "FrameTree.h"
+#include "HTMLFormElement.h"
+#include "HTMLFrameElement.h"
+#include "HTMLFrameOwnerElement.h"
+#include "HTMLNames.h"
+#include "Language.h"
+#include "MIMETypeRegistry.h"
+#include "NotImplemented.h"
+#include "PlatformString.h"
+#include "ResourceRequest.h"
+#include "CString.h"
+#include "ProgressTracker.h"
+#include "kjs_binding.h"
+#include "kjs_proxy.h"
+#include "kjs_window.h"
+#include "webkitwebview.h"
+#include "webkitwebframe.h"
+#include "webkitprivate.h"
+
+#include <JavaScriptCore/APICast.h>
+#include <stdio.h>
+#if PLATFORM(UNIX)
+#include <sys/utsname.h>
+#endif
+
+using namespace WebCore;
+
+namespace WebKit {
+
+FrameLoaderClient::FrameLoaderClient(WebKitWebFrame* frame)
+ : m_frame(frame)
+ , m_userAgent("")
+{
+ ASSERT(m_frame);
+}
+
+static String agentPlatform()
+{
+#ifdef GDK_WINDOWING_X11
+ return "X11";
+#elif defined(GDK_WINDOWING_WIN32)
+ return "Windows";
+#elif defined(GDK_WINDOWING_QUARTZ)
+ return "Macintosh";
+#elif defined(GDK_WINDOWING_DIRECTFB)
+ return "DirectFB";
+#else
+ notImplemented();
+ return "Unknown";
+#endif
+}
+
+static String agentOS()
+{
+#if PLATFORM(DARWIN)
+#if PLATFORM(X86)
+ return "Intel Mac OS X";
+#else
+ return "PPC Mac OS X";
+#endif
+#elif PLATFORM(UNIX)
+ struct utsname name;
+ if (uname(&name) != -1)
+ return String::format("%s %s", name.sysname, name.machine);
+ else
+ return "Unknown";
+#elif PLATFORM(WIN_OS)
+ // FIXME: Compute the Windows version
+ return "Windows";
+#else
+ notImplemented();
+ return "Unknown";
+#endif
+}
+
+static String composeUserAgent()
+{
+ // This is a liberal interpretation of http://www.mozilla.org/build/revised-user-agent-strings.html
+ // See also http://developer.apple.com/internet/safari/faq.html#anchor2
+
+ String ua;
+
+ // Product
+ ua += "Mozilla/5.0";
+
+ // Comment
+ ua += " (";
+ ua += agentPlatform(); // Platform
+ ua += "; U; "; // Security
+ ua += agentOS(); // OS-or-CPU
+ ua += "; ";
+ ua += defaultLanguage(); // Localization information
+ ua += ") ";
+
+ // WebKit Product
+ // FIXME: The WebKit version is hardcoded
+ static const String webKitVersion = "525.1+";
+ ua += "AppleWebKit/" + webKitVersion;
+ ua += " (KHTML, like Gecko, ";
+ // We mention Safari since many broken sites check for it (OmniWeb does this too)
+ // We re-use the WebKit version, though it doesn't seem to matter much in practice
+ ua += "Safari/" + webKitVersion;
+ ua += ") ";
+
+ // Vendor Product
+ ua += g_get_prgname();
+
+ return ua;
+}
+
+String FrameLoaderClient::userAgent(const KURL&)
+{
+ if (m_userAgent.isEmpty())
+ m_userAgent = composeUserAgent();
+
+ return m_userAgent;
+}
+
+WTF::PassRefPtr<WebCore::DocumentLoader> FrameLoaderClient::createDocumentLoader(const WebCore::ResourceRequest& request, const SubstituteData& substituteData)
+{
+ RefPtr<DocumentLoader> loader = new DocumentLoader(request, substituteData);
+ return loader.release();
+}
+
+void FrameLoaderClient::dispatchWillSubmitForm(FramePolicyFunction policyFunction, PassRefPtr<FormState>)
+{
+ // FIXME: This is surely too simple
+ ASSERT(policyFunction);
+ if (!policyFunction)
+ return;
+ (core(m_frame)->loader()->*policyFunction)(PolicyUse);
+}
+
+
+void FrameLoaderClient::committedLoad(DocumentLoader* loader, const char* data, int length)
+{
+ FrameLoader *fl = loader->frameLoader();
+ fl->setEncoding(m_response.textEncodingName(), false);
+ fl->addData(data, length);
+}
+
+void FrameLoaderClient::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidCancelAuthenticationChallenge(DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchWillSendRequest(DocumentLoader*, unsigned long, ResourceRequest&, const ResourceResponse&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader*, const ResourceRequest&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::postProgressStartedNotification()
+{
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+ g_signal_emit_by_name(webView, "load-started", m_frame);
+}
+
+void FrameLoaderClient::postProgressEstimateChangedNotification()
+{
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+ Page* corePage = core(webView);
+
+ g_signal_emit_by_name(webView, "load-progress-changed", lround(corePage->progress()->estimatedProgress()*100));
+}
+
+void FrameLoaderClient::postProgressFinishedNotification()
+{
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+
+ g_signal_emit_by_name(webView, "load-finished", m_frame);
+}
+
+void FrameLoaderClient::frameLoaderDestroyed()
+{
+ m_frame = 0;
+ delete this;
+}
+
+void FrameLoaderClient::dispatchDidReceiveResponse(DocumentLoader*, unsigned long, const ResourceResponse& response)
+{
+ m_response = response;
+}
+
+void FrameLoaderClient::dispatchDecidePolicyForMIMEType(FramePolicyFunction policyFunction, const String&, const ResourceRequest&)
+{
+ // FIXME: we need to call directly here (comment copied from Qt version)
+ ASSERT(policyFunction);
+ if (!policyFunction)
+ return;
+ (core(m_frame)->loader()->*policyFunction)(PolicyUse);
+}
+
+void FrameLoaderClient::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction policyFunction, const NavigationAction&, const ResourceRequest&, const String&)
+{
+ ASSERT(policyFunction);
+ if (!policyFunction)
+ return;
+ // FIXME: I think Qt version marshals this to another thread so when we
+ // have multi-threaded download, we might need to do the same
+ (core(m_frame)->loader()->*policyFunction)(PolicyIgnore);
+}
+
+void FrameLoaderClient::dispatchDecidePolicyForNavigationAction(FramePolicyFunction policyFunction, const NavigationAction& action, const ResourceRequest& resourceRequest)
+{
+ ASSERT(policyFunction);
+ if (!policyFunction)
+ return;
+
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+ WebKitNetworkRequest* request = webkit_network_request_new(resourceRequest.url().string().utf8().data());
+ WebKitNavigationResponse response;
+
+ g_signal_emit_by_name(webView, "navigation-requested", m_frame, request, &response);
+
+ g_object_unref(request);
+
+ if (response == WEBKIT_NAVIGATION_RESPONSE_IGNORE) {
+ (core(m_frame)->loader()->*policyFunction)(PolicyIgnore);
+ return;
+ }
+
+ (core(m_frame)->loader()->*policyFunction)(PolicyUse);
+}
+
+Widget* FrameLoaderClient::createPlugin(const IntSize&, Element*, const KURL&, const Vector<String>&, const Vector<String>&, const String&, bool)
+{
+ notImplemented();
+ return 0;
+}
+
+PassRefPtr<Frame> FrameLoaderClient::createFrame(const KURL& url, const String& name, HTMLFrameOwnerElement* ownerElement,
+ const String& referrer, bool allowsScrolling, int marginWidth, int marginHeight)
+{
+ Frame* coreFrame = core(webFrame());
+
+ ASSERT(core(getViewFromFrame(webFrame())) == coreFrame->page());
+ WebKitWebFrame* gtkFrame = WEBKIT_WEB_FRAME(webkit_web_frame_init_with_web_view(getViewFromFrame(webFrame()), ownerElement));
+ RefPtr<Frame> childFrame(adoptRef(core(gtkFrame)));
+
+ coreFrame->tree()->appendChild(childFrame);
+
+ childFrame->tree()->setName(name);
+ childFrame->init();
+ childFrame->loader()->load(url, referrer, FrameLoadTypeRedirectWithLockedHistory, String(), 0, 0);
+
+ // The frame's onload handler may have removed it from the document.
+ if (!childFrame->tree()->parent())
+ return 0;
+
+ // Propagate the marginwidth/height and scrolling modes to the view.
+ if (ownerElement->hasTagName(HTMLNames::frameTag) || ownerElement->hasTagName(HTMLNames::iframeTag)) {
+ HTMLFrameElement* frameElt = static_cast<HTMLFrameElement*>(ownerElement);
+ if (frameElt->scrollingMode() == ScrollbarAlwaysOff)
+ childFrame->view()->setScrollbarsMode(ScrollbarAlwaysOff);
+ int marginWidth = frameElt->getMarginWidth();
+ int marginHeight = frameElt->getMarginHeight();
+ if (marginWidth != -1)
+ childFrame->view()->setMarginWidth(marginWidth);
+ if (marginHeight != -1)
+ childFrame->view()->setMarginHeight(marginHeight);
+ }
+
+ return childFrame.release();
+}
+
+void FrameLoaderClient::redirectDataToPlugin(Widget* pluginWidget)
+{
+ notImplemented();
+ return;
+}
+
+Widget* FrameLoaderClient::createJavaAppletWidget(const IntSize&, Element*, const KURL& baseURL,
+ const Vector<String>& paramNames, const Vector<String>& paramValues)
+{
+ notImplemented();
+ return 0;
+}
+
+ObjectContentType FrameLoaderClient::objectContentType(const KURL& url, const String& mimeType)
+{
+ String type = mimeType;
+ // We don't use MIMETypeRegistry::getMIMETypeForPath() because it returns "application/octet-stream" upon failure
+ if (type.isEmpty())
+ type = MIMETypeRegistry::getMIMETypeForExtension(url.path().substring(url.path().reverseFind('.') + 1));
+
+ if (type.isEmpty())
+ return WebCore::ObjectContentFrame;
+
+ if (MIMETypeRegistry::isSupportedImageMIMEType(type))
+ return WebCore::ObjectContentImage;
+
+ if (MIMETypeRegistry::isSupportedNonImageMIMEType(type))
+ return WebCore::ObjectContentFrame;
+
+ return WebCore::ObjectContentNone;
+}
+
+String FrameLoaderClient::overrideMediaType() const
+{
+ notImplemented();
+ return String();
+}
+
+void FrameLoaderClient::windowObjectCleared()
+{
+ // Is this obsolete now?
+ g_signal_emit_by_name(m_frame, "cleared");
+
+ Frame* coreFrame = core(webFrame());
+ ASSERT(coreFrame);
+
+ Settings* settings = coreFrame->settings();
+ if (!settings || !settings->isJavaScriptEnabled())
+ return;
+
+ // TODO: Consider using g_signal_has_handler_pending() to avoid the overhead
+ // when there are no handlers.
+ JSGlobalContextRef context = toGlobalRef(coreFrame->scriptProxy()->globalObject()->globalExec());
+ JSObjectRef windowObject = toRef(KJS::Window::retrieve(coreFrame)->getObject());
+ ASSERT(windowObject);
+
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+ g_signal_emit_by_name(webView, "window-object-cleared", m_frame, context, windowObject);
+
+ // TODO: Re-attach debug clients if present.
+ // The Win port has an example of how we might do this.
+}
+
+void FrameLoaderClient::didPerformFirstNavigation() const
+{
+}
+
+void FrameLoaderClient::registerForIconNotification(bool)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::setMainFrameDocumentReady(bool)
+{
+ // this is only interesting once we provide an external API for the DOM
+}
+
+bool FrameLoaderClient::hasWebView() const
+{
+ notImplemented();
+ return true;
+}
+
+bool FrameLoaderClient::hasFrameView() const
+{
+ notImplemented();
+ return true;
+}
+
+void FrameLoaderClient::dispatchDidFinishLoad()
+{
+ g_signal_emit_by_name(m_frame, "load-done", true);
+}
+
+void FrameLoaderClient::frameLoadCompleted()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::saveViewStateToItem(HistoryItem*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::restoreViewState()
+{
+ notImplemented();
+}
+
+bool FrameLoaderClient::shouldGoToHistoryItem(HistoryItem* item) const
+{
+ // FIXME: This is a very simple implementation. More sophisticated
+ // implementation would delegate the decision to a PolicyDelegate.
+ // See mac implementation for example.
+ return item != 0;
+}
+
+void FrameLoaderClient::makeRepresentation(DocumentLoader*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::forceLayout()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::forceLayoutForNonHTML()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::setCopiesOnScroll()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::detachedFromParent1()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::detachedFromParent2()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::detachedFromParent3()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::detachedFromParent4()
+{
+ ASSERT(m_frame);
+ g_object_unref(m_frame);
+ m_frame = 0;
+}
+
+void FrameLoaderClient::loadedFromCachedPage()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidHandleOnloadEvents()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidCancelClientRedirect()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchWillPerformClientRedirect(const KURL&, double, double)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidChangeLocationWithinPage()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchWillClose()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidReceiveIcon()
+{
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+
+ g_signal_emit_by_name(webView, "icon-loaded", m_frame);
+}
+
+void FrameLoaderClient::dispatchDidStartProvisionalLoad()
+{
+}
+
+void FrameLoaderClient::dispatchDidReceiveTitle(const String& title)
+{
+ g_signal_emit_by_name(m_frame, "title-changed", title.utf8().data());
+
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+ if (m_frame == webkit_web_view_get_main_frame(webView))
+ g_signal_emit_by_name(webView, "title-changed", m_frame, title.utf8().data());
+}
+
+void FrameLoaderClient::dispatchDidCommitLoad()
+{
+ /* Update the URI once first data has been received.
+ * This means the URI is valid and successfully identify the page that's going to be loaded.
+ */
+ WebKitWebFramePrivate* frameData = WEBKIT_WEB_FRAME_GET_PRIVATE(m_frame);
+ g_free(frameData->uri);
+ frameData->uri = g_strdup(core(m_frame)->loader()->url().prettyURL().utf8().data());
+
+ g_signal_emit_by_name(m_frame, "load-committed");
+
+ WebKitWebView* webView = getViewFromFrame(m_frame);
+ if (m_frame == webkit_web_view_get_main_frame(webView))
+ g_signal_emit_by_name(webView, "load-committed", m_frame);
+}
+
+void FrameLoaderClient::dispatchDidFinishDocumentLoad()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidFirstLayout()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchShow()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::cancelPolicyCheck()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidLoadMainResource(DocumentLoader*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::revertToProvisionalState(DocumentLoader*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::clearUnarchivingState(DocumentLoader*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::willChangeTitle(DocumentLoader*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::didChangeTitle(DocumentLoader *l)
+{
+ setTitle(l->title(), l->url());
+}
+
+void FrameLoaderClient::finalSetupForReplace(DocumentLoader*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::setDefersLoading(bool)
+{
+ notImplemented();
+}
+
+bool FrameLoaderClient::isArchiveLoadPending(ResourceLoader*) const
+{
+ notImplemented();
+ return false;
+}
+
+void FrameLoaderClient::cancelPendingArchiveLoad(ResourceLoader*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::clearArchivedResources()
+{
+ notImplemented();
+}
+
+bool FrameLoaderClient::canHandleRequest(const ResourceRequest&) const
+{
+ notImplemented();
+ return true;
+}
+
+bool FrameLoaderClient::canShowMIMEType(const String&) const
+{
+ notImplemented();
+ return true;
+}
+
+bool FrameLoaderClient::representationExistsForURLScheme(const String&) const
+{
+ notImplemented();
+ return false;
+}
+
+String FrameLoaderClient::generatedMIMETypeForURLScheme(const String&) const
+{
+ notImplemented();
+ return String();
+}
+
+void FrameLoaderClient::finishedLoading(DocumentLoader* documentLoader)
+{
+ ASSERT(documentLoader->frame());
+ // Setting the encoding on the frame loader is our way to get work done that is normally done
+ // when the first bit of data is received, even for the case of a document with no data (like about:blank).
+ String encoding = documentLoader->overrideEncoding();
+ bool userChosen = !encoding.isNull();
+ if (encoding.isNull())
+ encoding = documentLoader->response().textEncodingName();
+ documentLoader->frameLoader()->setEncoding(encoding, userChosen);
+}
+
+
+void FrameLoaderClient::provisionalLoadStarted()
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::didFinishLoad() {
+ notImplemented();
+}
+
+void FrameLoaderClient::prepareForDataSourceReplacement() { notImplemented(); }
+
+void FrameLoaderClient::setTitle(const String& title, const KURL& url)
+{
+ WebKitWebFramePrivate* frameData = WEBKIT_WEB_FRAME_GET_PRIVATE(m_frame);
+ g_free(frameData->title);
+ frameData->title = g_strdup(title.utf8().data());
+}
+
+void FrameLoaderClient::dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int lengthReceived)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::dispatchDidFailLoading(DocumentLoader*, unsigned long identifier, const ResourceError&)
+{
+ notImplemented();
+}
+
+bool FrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(DocumentLoader*, const ResourceRequest&, const ResourceResponse&, int length)
+{
+ notImplemented();
+ return false;
+}
+
+void FrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError&)
+{
+ g_signal_emit_by_name(m_frame, "load-done", false);
+}
+
+void FrameLoaderClient::dispatchDidFailLoad(const ResourceError&)
+{
+ g_signal_emit_by_name(m_frame, "load-done", false);
+}
+
+void FrameLoaderClient::download(ResourceHandle*, const ResourceRequest&, const ResourceRequest&, const ResourceResponse&)
+{
+ notImplemented();
+}
+
+ResourceError FrameLoaderClient::cancelledError(const ResourceRequest&)
+{
+ notImplemented();
+ return ResourceError();
+}
+
+ResourceError FrameLoaderClient::blockedError(const ResourceRequest&)
+{
+ notImplemented();
+ return ResourceError();
+}
+
+ResourceError FrameLoaderClient::cannotShowURLError(const ResourceRequest&)
+{
+ notImplemented();
+ return ResourceError();
+}
+
+ResourceError FrameLoaderClient::interruptForPolicyChangeError(const ResourceRequest&)
+{
+ notImplemented();
+ return ResourceError();
+}
+
+ResourceError FrameLoaderClient::cannotShowMIMETypeError(const ResourceResponse&)
+{
+ notImplemented();
+ return ResourceError();
+}
+
+ResourceError FrameLoaderClient::fileDoesNotExistError(const ResourceResponse&)
+{
+ notImplemented();
+ return ResourceError();
+}
+
+bool FrameLoaderClient::shouldFallBack(const ResourceError&)
+{
+ notImplemented();
+ return false;
+}
+
+bool FrameLoaderClient::willUseArchive(ResourceLoader*, const ResourceRequest&, const KURL& originalURL) const
+{
+ notImplemented();
+ return false;
+}
+
+bool FrameLoaderClient::canCachePage() const
+{
+ notImplemented();
+ return false;
+}
+
+Frame* FrameLoaderClient::dispatchCreatePage()
+{
+ notImplemented();
+ return 0;
+}
+
+void FrameLoaderClient::dispatchUnableToImplementPolicy(const ResourceError&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::setMainDocumentError(DocumentLoader*, const ResourceError&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::startDownload(const ResourceRequest&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::updateGlobalHistory(const KURL&)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::savePlatformDataToCachedPage(CachedPage*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::transitionToCommittedFromCachedPage(CachedPage*)
+{
+ notImplemented();
+}
+
+void FrameLoaderClient::transitionToCommittedForNewPage()
+{
+ notImplemented();
+}
+
+}
diff --git a/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.h b/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.h
new file mode 100644
index 0000000..7e5e8b8
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2006 Zack Rusin <zack@kde.org>
+ * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FrameLoaderClientGtk_h
+#define FrameLoaderClientGtk_h
+
+#include "FrameLoaderClient.h"
+#include "ResourceResponse.h"
+
+typedef struct _WebKitWebFrame WebKitWebFrame;
+
+namespace WebKit {
+
+ class FrameLoaderClient : public WebCore::FrameLoaderClient {
+ public:
+ FrameLoaderClient(WebKitWebFrame*);
+ virtual ~FrameLoaderClient() { }
+ virtual void frameLoaderDestroyed();
+
+ WebKitWebFrame* webFrame() const { return m_frame; }
+
+ virtual bool hasWebView() const;
+ virtual bool hasFrameView() const;
+
+ virtual void makeRepresentation(WebCore::DocumentLoader*);
+ virtual void forceLayout();
+ virtual void forceLayoutForNonHTML();
+
+ virtual void setCopiesOnScroll();
+
+ virtual void detachedFromParent1();
+ virtual void detachedFromParent2();
+ virtual void detachedFromParent3();
+ virtual void detachedFromParent4();
+
+ virtual void loadedFromCachedPage();
+
+ virtual void assignIdentifierToInitialRequest(unsigned long identifier, WebCore::DocumentLoader*, const WebCore::ResourceRequest&);
+
+ virtual void dispatchWillSendRequest(WebCore::DocumentLoader*, unsigned long identifier, WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse);
+ virtual void dispatchDidReceiveAuthenticationChallenge(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::AuthenticationChallenge&);
+ virtual void dispatchDidCancelAuthenticationChallenge(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::AuthenticationChallenge&);
+ virtual void dispatchDidReceiveResponse(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceResponse&);
+ virtual void dispatchDidReceiveContentLength(WebCore::DocumentLoader*, unsigned long identifier, int lengthReceived);
+ virtual void dispatchDidFinishLoading(WebCore::DocumentLoader*, unsigned long identifier);
+ virtual void dispatchDidFailLoading(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceError&);
+ virtual bool dispatchDidLoadResourceFromMemoryCache(WebCore::DocumentLoader*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, int length);
+
+ virtual void dispatchDidHandleOnloadEvents();
+ virtual void dispatchDidReceiveServerRedirectForProvisionalLoad();
+ virtual void dispatchDidCancelClientRedirect();
+ virtual void dispatchWillPerformClientRedirect(const WebCore::KURL&, double, double);
+ virtual void dispatchDidChangeLocationWithinPage();
+ virtual void dispatchWillClose();
+ virtual void dispatchDidReceiveIcon();
+ virtual void dispatchDidStartProvisionalLoad();
+ virtual void dispatchDidReceiveTitle(const WebCore::String&);
+ virtual void dispatchDidCommitLoad();
+ virtual void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&);
+ virtual void dispatchDidFailLoad(const WebCore::ResourceError&);
+ virtual void dispatchDidFinishDocumentLoad();
+ virtual void dispatchDidFinishLoad();
+ virtual void dispatchDidFirstLayout();
+
+ virtual WebCore::Frame* dispatchCreatePage();
+ virtual void dispatchShow();
+
+ virtual void dispatchDecidePolicyForMIMEType(WebCore::FramePolicyFunction, const WebCore::String& MIMEType, const WebCore::ResourceRequest&);
+ virtual void dispatchDecidePolicyForNewWindowAction(WebCore::FramePolicyFunction, const WebCore::NavigationAction&, const WebCore::ResourceRequest&, const WebCore::String& frameName);
+ virtual void dispatchDecidePolicyForNavigationAction(WebCore::FramePolicyFunction, const WebCore::NavigationAction&, const WebCore::ResourceRequest&);
+ virtual void cancelPolicyCheck();
+
+ virtual void dispatchUnableToImplementPolicy(const WebCore::ResourceError&);
+
+ virtual void dispatchWillSubmitForm(WebCore::FramePolicyFunction, WTF::PassRefPtr<WebCore::FormState>);
+
+ virtual void dispatchDidLoadMainResource(WebCore::DocumentLoader*);
+ virtual void revertToProvisionalState(WebCore::DocumentLoader*);
+ virtual void setMainDocumentError(WebCore::DocumentLoader*, const WebCore::ResourceError&);
+ virtual void clearUnarchivingState(WebCore::DocumentLoader*);
+
+ virtual void postProgressStartedNotification();
+ virtual void postProgressEstimateChangedNotification();
+ virtual void postProgressFinishedNotification();
+
+ virtual PassRefPtr<WebCore::Frame> createFrame(const WebCore::KURL& url, const WebCore::String& name, WebCore::HTMLFrameOwnerElement* ownerElement,
+ const WebCore::String& referrer, bool allowsScrolling, int marginWidth, int marginHeight);
+ virtual WebCore::Widget* createPlugin(const WebCore::IntSize&, WebCore::Element*, const WebCore::KURL&, const WTF::Vector<WebCore::String>&, const WTF::Vector<WebCore::String>&, const WebCore::String&, bool);
+ virtual void redirectDataToPlugin(WebCore::Widget* pluginWidget);
+ virtual WebCore::Widget* createJavaAppletWidget(const WebCore::IntSize&, WebCore::Element*, const WebCore::KURL& baseURL, const WTF::Vector<WebCore::String>& paramNames, const WTF::Vector<WebCore::String>& paramValues);
+ virtual WebCore::String overrideMediaType() const;
+ virtual void windowObjectCleared();
+ virtual void didPerformFirstNavigation() const;
+
+ virtual void registerForIconNotification(bool);
+
+ virtual WebCore::ObjectContentType objectContentType(const WebCore::KURL& url, const WebCore::String& mimeType);
+
+ virtual void setMainFrameDocumentReady(bool);
+
+ virtual void startDownload(const WebCore::ResourceRequest&);
+
+ virtual void willChangeTitle(WebCore::DocumentLoader*);
+ virtual void didChangeTitle(WebCore::DocumentLoader*);
+
+ virtual void committedLoad(WebCore::DocumentLoader*, const char*, int);
+ virtual void finishedLoading(WebCore::DocumentLoader*);
+ virtual void finalSetupForReplace(WebCore::DocumentLoader*);
+
+ virtual void updateGlobalHistory(const WebCore::KURL&);
+ virtual bool shouldGoToHistoryItem(WebCore::HistoryItem*) const;
+
+ virtual WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&);
+ virtual WebCore::ResourceError blockedError(const WebCore::ResourceRequest&);
+ virtual WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&);
+ virtual WebCore::ResourceError interruptForPolicyChangeError(const WebCore::ResourceRequest&);
+
+ virtual WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&);
+ virtual WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&);
+
+ virtual bool shouldFallBack(const WebCore::ResourceError&);
+
+ virtual void setDefersLoading(bool);
+
+ virtual bool willUseArchive(WebCore::ResourceLoader*, const WebCore::ResourceRequest&, const WebCore::KURL& originalURL) const;
+ virtual bool isArchiveLoadPending(WebCore::ResourceLoader*) const;
+ virtual void cancelPendingArchiveLoad(WebCore::ResourceLoader*);
+ virtual void clearArchivedResources();
+
+ virtual bool canHandleRequest(const WebCore::ResourceRequest&) const;
+ virtual bool canShowMIMEType(const WebCore::String&) const;
+ virtual bool representationExistsForURLScheme(const WebCore::String&) const;
+ virtual WebCore::String generatedMIMETypeForURLScheme(const WebCore::String&) const;
+
+ virtual void frameLoadCompleted();
+ virtual void saveViewStateToItem(WebCore::HistoryItem*);
+ virtual void restoreViewState();
+ virtual void provisionalLoadStarted();
+ virtual void didFinishLoad();
+ virtual void prepareForDataSourceReplacement();
+
+ virtual WTF::PassRefPtr<WebCore::DocumentLoader> createDocumentLoader(const WebCore::ResourceRequest&, const WebCore::SubstituteData&);
+ virtual void setTitle(const WebCore::String& title, const WebCore::KURL&);
+
+ virtual WebCore::String userAgent(const WebCore::KURL&);
+
+ virtual void savePlatformDataToCachedPage(WebCore::CachedPage*);
+ virtual void transitionToCommittedFromCachedPage(WebCore::CachedPage*);
+ virtual void transitionToCommittedForNewPage();
+
+ virtual bool canCachePage() const;
+ virtual void download(WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
+ private:
+ WebKitWebFrame* m_frame;
+ WebCore::ResourceResponse m_response;
+ WebCore::String m_userAgent;
+ };
+
+}
+
+#endif
diff --git a/WebKit/gtk/WebCoreSupport/InspectorClientGtk.cpp b/WebKit/gtk/WebCoreSupport/InspectorClientGtk.cpp
new file mode 100644
index 0000000..a54b6a0
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/InspectorClientGtk.cpp
@@ -0,0 +1,80 @@
+/*
+ * 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 "NotImplemented.h"
+#include "PlatformString.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void InspectorClient::inspectorDestroyed()
+{
+ delete this;
+}
+
+Page* InspectorClient::createPage()
+{
+ notImplemented();
+ return 0;
+}
+
+String InspectorClient::localizedStringsURL()
+{
+ notImplemented();
+ return String();
+}
+
+void InspectorClient::showWindow()
+{
+ notImplemented();
+}
+
+void InspectorClient::closeWindow()
+{
+ notImplemented();
+}
+
+void InspectorClient::attachWindow()
+{
+ notImplemented();
+}
+
+void InspectorClient::detachWindow()
+{
+ notImplemented();
+}
+
+void InspectorClient::highlight(Node* node)
+{
+ notImplemented();
+}
+
+void InspectorClient::hideHighlight()
+{
+ notImplemented();
+}
+
+void InspectorClient::inspectedURLChanged(const String&)
+{
+ notImplemented();
+}
+
+}
+
diff --git a/WebKit/gtk/WebCoreSupport/InspectorClientGtk.h b/WebKit/gtk/WebCoreSupport/InspectorClientGtk.h
new file mode 100644
index 0000000..9afd42b
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/InspectorClientGtk.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef InspectorClientGtk_h
+#define InspectorClientGtk_h
+
+#include "InspectorClient.h"
+
+namespace WebCore {
+ class Node;
+ class Page;
+ class String;
+}
+
+namespace WebKit {
+
+ class InspectorClient : public WebCore::InspectorClient {
+ public:
+ virtual void inspectorDestroyed();
+
+ virtual WebCore::Page* createPage();
+
+ virtual WebCore::String localizedStringsURL();
+
+ virtual void showWindow();
+ virtual void closeWindow();
+
+ virtual void attachWindow();
+ virtual void detachWindow();
+
+ virtual void highlight(WebCore::Node*);
+ virtual void hideHighlight();
+ virtual void inspectedURLChanged(const WebCore::String& newURL);
+ };
+}
+
+#endif
diff --git a/WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp b/WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp
new file mode 100644
index 0000000..9ef366d
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2007 Luca Bruno <lethalman88@gmail.com>
+ *
+ * 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 "Frame.h"
+#include "PasteboardHelperGtk.h"
+
+#include "webkitwebframe.h"
+#include "webkitwebview.h"
+#include "webkitprivate.h"
+
+#include <gtk/gtk.h>
+
+using namespace WebCore;
+
+namespace WebKit
+{
+
+GtkClipboard* PasteboardHelperGtk::getClipboard(Frame* frame) const {
+ WebKitWebView* webView = webkit_web_frame_get_web_view(kit(frame));
+ return gtk_widget_get_clipboard(GTK_WIDGET (webView),
+ GDK_SELECTION_CLIPBOARD);
+}
+
+GtkTargetList* PasteboardHelperGtk::getCopyTargetList(Frame* frame) const {
+ WebKitWebView* webView = webkit_web_frame_get_web_view(kit(frame));
+ return webkit_web_view_get_copy_target_list(webView);
+}
+
+GtkTargetList* PasteboardHelperGtk::getPasteTargetList(Frame* frame) const {
+ WebKitWebView* webView = webkit_web_frame_get_web_view(kit(frame));
+ return webkit_web_view_get_paste_target_list(webView);
+}
+
+}
diff --git a/WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.h b/WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.h
new file mode 100644
index 0000000..77e0457
--- /dev/null
+++ b/WebKit/gtk/WebCoreSupport/PasteboardHelperGtk.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2007 Luca Bruno <lethalman88@gmail.com>
+ * All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PasteboardHelperGtk_h
+#define PasteboardHelperGtk_h
+
+/*
+ * FIXME: this is for WebCore support and must be removed once
+ * a better solution is found
+ */
+
+#include "Frame.h"
+#include "PasteboardHelper.h"
+
+#include <gtk/gtk.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class PasteboardHelperGtk : public PasteboardHelper {
+public:
+ PasteboardHelperGtk() { }
+ virtual GtkClipboard* getClipboard(Frame*) const;
+ virtual GtkTargetList* getCopyTargetList(Frame*) const;
+ virtual GtkTargetList* getPasteTargetList(Frame*) const;
+};
+
+}
+
+#endif // PasteboardHelperGtk_h
diff --git a/WebKit/gtk/webkit.pc.in b/WebKit/gtk/webkit.pc.in
new file mode 100644
index 0000000..0ce6f71
--- /dev/null
+++ b/WebKit/gtk/webkit.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: WebKit
+Description: Web content engine for GTK+
+Version: @VERSION@
+Requires: gtk+-2.0
+Libs: -L${libdir} -lwebkit-1.0
+Cflags: -I${includedir}/webkit-1.0
diff --git a/WebKit/gtk/webkit/headers.pri b/WebKit/gtk/webkit/headers.pri
new file mode 100644
index 0000000..d53d825
--- /dev/null
+++ b/WebKit/gtk/webkit/headers.pri
@@ -0,0 +1,8 @@
+WEBKIT_API_HEADERS = $$PWD/webkit.h \
+ $$PWD/webkitdefines.h \
+ $$PWD/webkitnetworkrequest.h \
+ $$PWD/webkitwebbackforwardlist.h \
+ $$PWD/webkitwebframe.h \
+ $$PWD/webkitwebhistoryitem.h \
+ $$PWD/webkitwebsettings.h \
+ $$PWD/webkitwebview.h
diff --git a/WebKit/gtk/webkit/webkit-marshal.list b/WebKit/gtk/webkit/webkit-marshal.list
new file mode 100644
index 0000000..a8f2453
--- /dev/null
+++ b/WebKit/gtk/webkit/webkit-marshal.list
@@ -0,0 +1,12 @@
+VOID:OBJECT
+VOID:STRING
+VOID:STRING,STRING
+VOID:OBJECT,BOOLEAN
+VOID:OBJECT,STRING
+VOID:OBJECT,OBJECT
+VOID:OBJECT,POINTER,POINTER
+BOOLEAN:STRING,INT,STRING
+BOOLEAN:OBJECT,STRING
+BOOLEAN:OBJECT,STRING,BOOLEAN
+BOOLEAN:OBJECT,STRING,STRING,STRING
+INT:OBJECT,OBJECT
diff --git a/WebKit/gtk/webkit/webkit.h b/WebKit/gtk/webkit/webkit.h
new file mode 100644
index 0000000..babd50a
--- /dev/null
+++ b/WebKit/gtk/webkit/webkit.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __WEBKIT_H__
+#define __WEBKIT_H__
+
+#include <webkit/webkitdefines.h>
+#include <webkit/webkitnetworkrequest.h>
+#include <webkit/webkitwebframe.h>
+#include <webkit/webkitwebsettings.h>
+#include <webkit/webkitwebview.h>
+#include <webkit/webkitwebbackforwardlist.h>
+#include <webkit/webkitwebhistoryitem.h>
+
+#endif /* __WEBKIT_H__ */
diff --git a/WebKit/gtk/webkit/webkitdefines.h b/WebKit/gtk/webkit/webkitdefines.h
new file mode 100644
index 0000000..386c3e1
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitdefines.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WEBKIT_DEFINES_H
+#define WEBKIT_DEFINES_H
+
+#include <glib.h>
+
+#ifdef G_OS_WIN32
+ #ifdef BUILDING_WEBKIT
+ #define WEBKIT_API __declspec(dllexport)
+ #else
+ #define WEBKIT_API __declspec(dllimport)
+ #endif
+ #define WEBKIT_OBSOLETE_API WEBKIT_API
+#else
+ #define WEBKIT_API __attribute__((visibility("default")))
+ #define WEBKIT_OBSOLETE_API WEBKIT_API __attribute__((deprecated))
+#endif
+
+#ifndef WEBKIT_API
+ #define WEBKIT_API
+#endif
+
+G_BEGIN_DECLS
+
+typedef struct _WebKitNetworkRequest WebKitNetworkRequest;
+typedef struct _WebKitNetworkRequestClass WebKitNetworkRequestClass;
+
+typedef struct _WebKitWebBackForwardList WebKitWebBackForwardList;
+typedef struct _WebKitWebBackForwardListClass WebKitWebBackForwardListClass;
+
+typedef struct _WebKitWebHistoryItem WebKitWebHistoryItem;
+typedef struct _WebKitWebHistoryItemClass WebKitWebHistoryItemClass;
+
+typedef struct _WebKitWebFrame WebKitWebFrame;
+typedef struct _WebKitWebFrameClass WebKitWebFrameClass;
+
+typedef struct _WebKitWebSettings WebKitWebSettings;
+typedef struct _WebKitWebSettingsClass WebKitWebSettingsClass;
+
+typedef struct _WebKitWebView WebKitWebView;
+typedef struct _WebKitWebViewClass WebKitWebViewClass;
+
+G_END_DECLS
+
+#endif
diff --git a/WebKit/gtk/webkit/webkitnetworkrequest.cpp b/WebKit/gtk/webkit/webkitnetworkrequest.cpp
new file mode 100644
index 0000000..b8711db
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitnetworkrequest.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include "webkitnetworkrequest.h"
+
+extern "C" {
+
+G_DEFINE_TYPE(WebKitNetworkRequest, webkit_network_request, G_TYPE_OBJECT);
+
+struct _WebKitNetworkRequestPrivate {
+ gchar* uri;
+};
+
+#define WEBKIT_NETWORK_REQUEST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequestPrivate))
+
+static void webkit_network_request_finalize(GObject* object)
+{
+ WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object);
+ WebKitNetworkRequestPrivate* priv = request->priv;
+
+ g_free(priv->uri);
+
+ G_OBJECT_CLASS(webkit_network_request_parent_class)->finalize(object);
+}
+
+static void webkit_network_request_class_init(WebKitNetworkRequestClass* requestClass)
+{
+ G_OBJECT_CLASS(requestClass)->finalize = webkit_network_request_finalize;
+
+ g_type_class_add_private(requestClass, sizeof(WebKitNetworkRequestPrivate));
+}
+
+static void webkit_network_request_init(WebKitNetworkRequest* request)
+{
+ WebKitNetworkRequestPrivate* priv = WEBKIT_NETWORK_REQUEST_GET_PRIVATE(request);
+ request->priv = priv;
+}
+
+WebKitNetworkRequest* webkit_network_request_new(const gchar* uri)
+{
+ g_return_val_if_fail(uri, NULL);
+
+ WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, NULL));
+ WebKitNetworkRequestPrivate* priv = request->priv;
+
+ priv->uri = g_strdup(uri);
+
+ return request;
+}
+
+void webkit_network_request_set_uri(WebKitNetworkRequest* request, const gchar* uri)
+{
+ g_return_if_fail(WEBKIT_IS_NETWORK_REQUEST(request));
+ g_return_if_fail(uri);
+
+ WebKitNetworkRequestPrivate* priv = request->priv;
+
+ g_free(priv->uri);
+ priv->uri = g_strdup(uri);
+}
+
+const gchar* webkit_network_request_get_uri(WebKitNetworkRequest* request)
+{
+ g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL);
+
+ WebKitNetworkRequestPrivate* priv = request->priv;
+ return priv->uri;
+}
+
+}
diff --git a/WebKit/gtk/webkit/webkitnetworkrequest.h b/WebKit/gtk/webkit/webkitnetworkrequest.h
new file mode 100644
index 0000000..645144a
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitnetworkrequest.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WEBKIT_NETWORK_REQUEST_H
+#define WEBKIT_NETWORK_REQUEST_H
+
+#include <glib-object.h>
+
+#include <webkit/webkitdefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_NETWORK_REQUEST (webkit_network_request_get_type())
+#define WEBKIT_NETWORK_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequest))
+#define WEBKIT_NETWORK_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequestClass))
+#define WEBKIT_IS_NETWORK_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_NETWORK_REQUEST))
+#define WEBKIT_IS_NETWORK_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_NETWORK_REQUEST))
+#define WEBKIT_NETWORK_REQUEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequestClass))
+
+typedef struct _WebKitNetworkRequestPrivate WebKitNetworkRequestPrivate;
+
+struct _WebKitNetworkRequest {
+ GObject parent_instance;
+
+ WebKitNetworkRequestPrivate* priv;
+};
+
+struct _WebKitNetworkRequestClass {
+ GObjectClass parent_class;
+};
+
+WEBKIT_API GType
+webkit_network_request_get_type (void);
+
+WEBKIT_API WebKitNetworkRequest*
+webkit_network_request_new (const gchar* uri);
+
+WEBKIT_API void
+webkit_network_request_set_uri (WebKitNetworkRequest* request, const gchar* uri);
+
+WEBKIT_API const gchar*
+webkit_network_request_get_uri (WebKitNetworkRequest* request);
+
+G_END_DECLS
+
+#endif
diff --git a/WebKit/gtk/webkit/webkitprivate.cpp b/WebKit/gtk/webkit/webkitprivate.cpp
new file mode 100644
index 0000000..9ec51ba
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitprivate.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include "webkitprivate.h"
+#include "ChromeClientGtk.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClientGtk.h"
+#include "Logging.h"
+#include "MainThread.h"
+#include "NotImplemented.h"
+#include "Pasteboard.h"
+#include "PasteboardHelperGtk.h"
+
+#if ENABLE(DATABASE)
+#include "DatabaseTracker.h"
+#endif
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebKitWebView* getViewFromFrame(WebKitWebFrame* frame)
+{
+ WebKitWebFramePrivate* priv = frame->priv;
+ return priv->webView;
+}
+
+WebCore::Frame* core(WebKitWebFrame* frame)
+{
+ if (!frame)
+ return 0;
+
+ WebKitWebFramePrivate* priv = frame->priv;
+ return priv ? priv->coreFrame.get() : 0;
+}
+
+WebKitWebFrame* kit(WebCore::Frame* coreFrame)
+{
+ if (!coreFrame)
+ return 0;
+
+ ASSERT(coreFrame->loader());
+ WebKit::FrameLoaderClient* client = static_cast<WebKit::FrameLoaderClient*>(coreFrame->loader()->client());
+ return client ? client->webFrame() : 0;
+}
+
+WebCore::Page* core(WebKitWebView* webView)
+{
+ if (!webView)
+ return 0;
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ return priv ? priv->corePage : 0;
+}
+
+WebKitWebView* kit(WebCore::Page* corePage)
+{
+ if (!corePage)
+ return 0;
+
+ ASSERT(corePage->chrome());
+ WebKit::ChromeClient* client = static_cast<WebKit::ChromeClient*>(corePage->chrome()->client());
+ return client ? client->webView() : 0;
+}
+
+} /** end namespace WebCore */
+
+void webkit_init()
+{
+ static bool isInitialized = false;
+ if (isInitialized)
+ return;
+ isInitialized = true;
+
+ WebCore::initializeThreadingAndMainThread();
+ WebCore::InitializeLoggingChannelsIfNecessary();
+
+#if ENABLE(DATABASE)
+ // FIXME: It should be possible for client applications to override this default location
+ gchar* databaseDirectory = g_build_filename(g_get_user_data_dir(), "webkit", "databases", NULL);
+ WebCore::DatabaseTracker::tracker().setDatabaseDirectoryPath(databaseDirectory);
+ g_free(databaseDirectory);
+#endif
+
+ Pasteboard::generalPasteboard()->setHelper(new WebKit::PasteboardHelperGtk());
+}
diff --git a/WebKit/gtk/webkit/webkitprivate.h b/WebKit/gtk/webkit/webkitprivate.h
new file mode 100644
index 0000000..5c75928
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitprivate.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2007, 2008 Holger Hans Peter Freyther
+ * Copyrifht (C) 2008 Jan Michael C. Alonzo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WEBKIT_PRIVATE_H
+#define WEBKIT_PRIVATE_H
+
+/*
+ * This file knows the shared secret of WebKitWebView and WebKitWebFrame.
+ * They are using WebCore which musn't be exposed to the outer world.
+ */
+
+#include <webkit/webkitdefines.h>
+#include <webkit/webkitwebview.h>
+#include <webkit/webkitwebframe.h>
+#include <webkit/webkitwebsettings.h>
+#include <webkit/webkitnetworkrequest.h>
+#include <webkit/webkitwebbackforwardlist.h>
+
+#include "BackForwardList.h"
+#include "HistoryItem.h"
+#include "Settings.h"
+#include "Page.h"
+#include "Frame.h"
+#include "FrameLoaderClient.h"
+
+#include <glib.h>
+
+namespace WebKit {
+ WebKitWebView* getViewFromFrame(WebKitWebFrame*);
+
+ WebCore::Frame* core(WebKitWebFrame*);
+ WebKitWebFrame* kit(WebCore::Frame*);
+
+ WebCore::Page* core(WebKitWebView*);
+ WebKitWebView* kit(WebCore::Page*);
+
+ WebCore::HistoryItem* core(WebKitWebHistoryItem*);
+ WebKitWebHistoryItem* kit(WebCore::HistoryItem*);
+
+ WebCore::BackForwardList* core(WebKitWebBackForwardList*);
+}
+
+extern "C" {
+ void webkit_init();
+
+#define WEBKIT_PARAM_READABLE ((GParamFlags)(G_PARAM_READABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB))
+#define WEBKIT_PARAM_READWRITE ((GParamFlags)(G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB))
+
+ #define WEBKIT_WEB_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_VIEW, WebKitWebViewPrivate))
+ typedef struct _WebKitWebViewPrivate WebKitWebViewPrivate;
+ struct _WebKitWebViewPrivate {
+ WebCore::Page* corePage;
+ WebKitWebSettings* webSettings;
+
+ WebKitWebFrame* mainFrame;
+ WebCore::String applicationNameForUserAgent;
+ WebCore::String* userAgent;
+
+ WebKitWebBackForwardList* backForwardList;
+
+ gint lastPopupXPosition;
+ gint lastPopupYPosition;
+
+ HashSet<GtkWidget*> children;
+ bool editable;
+ GtkIMContext* imContext;
+
+ GtkTargetList* copy_target_list;
+ GtkTargetList* paste_target_list;
+
+ gboolean transparent;
+ };
+
+ #define WEBKIT_WEB_FRAME_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_FRAME, WebKitWebFramePrivate))
+ typedef struct _WebKitWebFramePrivate WebKitWebFramePrivate;
+ struct _WebKitWebFramePrivate {
+ WTF::RefPtr<WebCore::Frame> coreFrame;
+ WebCore::FrameLoaderClient* client;
+ WebKitWebView* webView;
+
+ gchar* name;
+ gchar* title;
+ gchar* uri;
+ };
+
+ #define WEBKIT_NETWORK_REQUEST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequestPrivate))
+ typedef struct _WebKitNetworkRequestPrivate WebKitNetworkRequestPrivate;
+ struct _WebKitNetworkRequestPrivate {
+ gchar* uri;
+ };
+
+ WebKitWebFrame*
+ webkit_web_frame_init_with_web_view(WebKitWebView*, WebCore::HTMLFrameOwnerElement*);
+
+ WebKitWebHistoryItem*
+ webkit_web_history_item_new_with_core_item(WebCore::HistoryItem*);
+
+ // FIXME: Move these to webkitwebframe.h once their API has been discussed.
+
+ WEBKIT_API GSList*
+ webkit_web_frame_get_children (WebKitWebFrame* frame);
+
+ WEBKIT_API gchar*
+ webkit_web_frame_get_inner_text (WebKitWebFrame* frame);
+
+ WEBKIT_API void
+ webkit_web_frame_print (WebKitWebFrame* frame);
+
+ WEBKIT_API gchar*
+ webkit_web_view_get_selected_text (WebKitWebView* web_view);
+}
+
+#endif
diff --git a/WebKit/gtk/webkit/webkitwebbackforwardlist.cpp b/WebKit/gtk/webkit/webkitwebbackforwardlist.cpp
new file mode 100644
index 0000000..c409557
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebbackforwardlist.cpp
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2008 Jan Michael C. Alonzo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include "webkitwebbackforwardlist.h"
+#include "webkitprivate.h"
+#include "webkitwebhistoryitem.h"
+#include "webkitwebview.h"
+
+#include <glib.h>
+
+#include "BackForwardList.h"
+#include "HistoryItem.h"
+
+using namespace WebKit;
+
+extern "C" {
+
+struct _WebKitWebBackForwardListPrivate {
+ WebCore::BackForwardList* backForwardList;
+};
+
+#define WEBKIT_WEB_BACK_FORWARD_LIST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_BACK_FORWARD_LIST, WebKitWebBackForwardListPrivate))
+
+G_DEFINE_TYPE(WebKitWebBackForwardList, webkit_web_back_forward_list, G_TYPE_OBJECT);
+
+static void webkit_web_back_forward_list_class_init(WebKitWebBackForwardListClass* klass)
+{
+ g_type_class_add_private(klass, sizeof(WebKitWebBackForwardListPrivate));
+}
+
+static void webkit_web_back_forward_list_init(WebKitWebBackForwardList* webBackForwardList)
+{
+ webBackForwardList->priv = WEBKIT_WEB_BACK_FORWARD_LIST_GET_PRIVATE(webBackForwardList);
+}
+
+/**
+ * webkit_web_back_forward_list_new_with_web_view:
+ * @webView: the back forward list's #WebKitWebView
+ *
+ * Creates an instance of the back forward list with a controlling #WebKitWebView
+ *
+ * Return value: a #WebKitWebBackForwardList
+ */
+WebKitWebBackForwardList* webkit_web_back_forward_list_new_with_web_view(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebBackForwardList* webBackForwardList;
+
+ webBackForwardList = WEBKIT_WEB_BACK_FORWARD_LIST(g_object_new(WEBKIT_TYPE_WEB_BACK_FORWARD_LIST, NULL));
+ WebKitWebBackForwardListPrivate* priv = webBackForwardList->priv;
+
+ priv->backForwardList = core(webView)->backForwardList();
+ priv->backForwardList->setEnabled(TRUE);
+
+ return webBackForwardList;
+}
+
+/**
+ * webkit_web_back_forward_list_go_forward:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ *
+ * Steps forward in the back forward list
+ */
+void webkit_web_back_forward_list_go_forward(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (backForwardList->enabled())
+ backForwardList->goForward();
+}
+
+/**
+ * webkit_web_back_forward_list_go_back:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ *
+ * Steps backward in the back forward list
+ */
+void webkit_web_back_forward_list_go_back(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (backForwardList->enabled())
+ backForwardList->goBack();
+}
+
+/**
+ * webkit_web_back_forward_list_contains_item:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ * @webHistoryItem: the #WebKitWebHistoryItem to check
+ *
+ * Checks if @webHistoryItem is in the back forward list
+ *
+ * Return: %TRUE if @webHistoryItem is in the back forward list, %FALSE if it doesn't
+ */
+gboolean webkit_web_back_forward_list_contains_item(WebKitWebBackForwardList* webBackForwardList, WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), FALSE);
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), FALSE);
+
+ WebCore::HistoryItem* historyItem = core(webHistoryItem);
+
+ g_return_val_if_fail(historyItem != NULL, FALSE);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+
+ return (backForwardList->enabled() ? backForwardList->containsItem(historyItem) : FALSE);
+}
+
+/**
+ * webkit_web_back_forward_list_go_to_item:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ * @webHistoryItem: the #WebKitWebHistoryItem to go to
+ *
+ * Go to the specified @webHistoryItem in the back forward list
+ */
+void webkit_web_back_forward_list_go_to_item(WebKitWebBackForwardList* webBackForwardList, WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
+ g_return_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem));
+
+ WebCore::HistoryItem* historyItem = core(webHistoryItem);
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+
+ if (backForwardList->enabled() && historyItem)
+ backForwardList->goToItem(historyItem);
+}
+
+/**
+ * webkit_web_back_forward_list_get_forward_list_with_limit:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ * @limit: the number of items to retrieve
+ *
+ * Returns a list of items that succeed the current item, limited by @limit
+ *
+ * Return value: a #GList of items succeeding the current item, limited by @limit
+ */
+GList* webkit_web_back_forward_list_get_forward_list_with_limit(WebKitWebBackForwardList* webBackForwardList, gint limit)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return NULL;
+
+ WebCore::HistoryItemVector items(limit);
+ GList* forwardItems = { 0 };
+
+ backForwardList->forwardListWithLimit(limit, items);
+
+ for (unsigned i = 0; i < items.size(); i++) {
+ WebKitWebHistoryItem* webHistoryItem = webkit_web_history_item_new_with_core_item(items[i].get());
+ forwardItems = g_list_prepend(forwardItems, g_object_ref(webHistoryItem));
+ }
+
+ return g_list_reverse(forwardItems);
+}
+
+/**
+ * webkit_web_back_forward_list_get_back_list_with_limit:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ * @limit: the number of items to retrieve
+ *
+ * Returns a list of items that precede the current item, limited by @limit
+ *
+ * Return value: a #GList of items preceding the current item, limited by @limit
+ */
+GList* webkit_web_back_forward_list_get_back_list_with_limit(WebKitWebBackForwardList* webBackForwardList, gint limit)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return NULL;
+
+ WebCore::HistoryItemVector items(limit);
+ GList* backItems = { 0 };
+
+ backForwardList->backListWithLimit(limit, items);
+
+ for (unsigned i = 0; i < items.size(); i++) {
+ WebKitWebHistoryItem* webHistoryItem = webkit_web_history_item_new_with_core_item(items[i].get());
+ backItems = g_list_prepend(backItems, g_object_ref(webHistoryItem));
+ }
+
+ return g_list_reverse(backItems);
+}
+/**
+ * webkit_web_back_forward_list_get_back_item:
+ * @webBackForwardList: a #WebBackForwardList
+ *
+ * Returns the item that precedes the current item
+ *
+ * Return value: the #WebKitWebHistoryItem preceding the current item
+ */
+WebKitWebHistoryItem* webkit_web_back_forward_list_get_back_item(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return NULL;
+
+ WebCore::HistoryItem* historyItem = backForwardList->backItem();
+
+ return (historyItem ? kit(historyItem) : NULL);
+}
+
+/**
+ * webkit_web_back_forward_list_get_current_item:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ *
+ * Returns the current item.
+ *
+ * Returns a NULL value if the back forward list is empty
+ *
+ * Return value: a #WebKitWebHistoryItem
+ */
+WebKitWebHistoryItem* webkit_web_back_forward_list_get_current_item(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return NULL;
+
+ WebCore::HistoryItem* historyItem = backForwardList->currentItem();
+
+ return (historyItem ? kit(historyItem) : NULL);
+}
+
+/**
+ * webkit_web_back_forward_list_get_forward_item:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ *
+ * Returns the item that succeeds the current item.
+ *
+ * Returns a NULL value if there nothing that succeeds the current item
+ *
+ * Return value: a #WebKitWebHistoryItem
+ */
+WebKitWebHistoryItem* webkit_web_back_forward_list_get_forward_item(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return NULL;
+
+ WebCore::HistoryItem* historyItem = backForwardList->forwardItem();
+
+ return (historyItem ? kit(historyItem) : NULL);
+}
+
+/**
+ * webkit_web_back_forward_list_get_nth_item:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ * @index: the index of the item
+ *
+ * Returns the item at a given index relative to the current item.
+ *
+ * Return value: the #WebKitWebHistoryItem located at the specified index relative to the current item
+ */
+WebKitWebHistoryItem* webkit_web_back_forward_list_get_nth_item(WebKitWebBackForwardList* webBackForwardList, gint index)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList)
+ return NULL;
+
+ WebCore::HistoryItem* historyItem = backForwardList->itemAtIndex(index);
+
+ return (historyItem ? kit(historyItem) : NULL);
+}
+
+/**
+ * webkit_web_back_forward_list_get_back_length:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ *
+ * Returns the number of items that preced the current item.
+ *
+ * Return value: a #gint corresponding to the number of items preceding the current item
+ */
+gint webkit_web_back_forward_list_get_back_length(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), 0);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return 0;
+
+ return backForwardList->backListCount();
+}
+
+/**
+ * webkit_web_back_forward_list_get_forward_length:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ *
+ * Returns the number of items that succeed the current item.
+ *
+ * Return value: a #gint corresponding to the nuber of items succeeding the current item
+ */
+gint webkit_web_back_forward_list_get_forward_length(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), 0);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return 0;
+
+ return backForwardList->forwardListCount();
+}
+
+/**
+ * webkit_web_back_forward_list_get_capacity:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ *
+ * Returns the maximum limit of the back forward list.
+ *
+ * Return value: a #gint indicating the number of #WebHistoryItem the back forward list can hold
+ */
+gint webkit_web_back_forward_list_get_limit(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), 0);
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (!backForwardList || !backForwardList->enabled())
+ return 0;
+
+ return backForwardList->capacity();
+}
+
+/**
+ * webkit_web_back_forward_list_set_limit:
+ * @webBackForwardList: a #WebKitWebBackForwardList
+ * @limit: the limit to set the back forward list to
+ *
+ * Sets the maximum limit of the back forward list. If the back forward list
+ * exceeds its capacity, items will be removed everytime a new item has been
+ * added.
+ */
+void webkit_web_back_forward_list_set_limit(WebKitWebBackForwardList* webBackForwardList, gint limit)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
+
+ WebCore::BackForwardList* backForwardList = core(webBackForwardList);
+ if (backForwardList)
+ backForwardList->setCapacity(limit);
+}
+
+} /* end extern "C" */
+
+WebCore::BackForwardList* WebKit::core(WebKitWebBackForwardList* webBackForwardList)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
+
+ return webBackForwardList->priv ? webBackForwardList->priv->backForwardList : 0;
+}
diff --git a/WebKit/gtk/webkit/webkitwebbackforwardlist.h b/WebKit/gtk/webkit/webkitwebbackforwardlist.h
new file mode 100644
index 0000000..e63505d
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebbackforwardlist.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2008 Jan Michael C. Alonzo <jmalonzo@unpluggable.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WEBKIT_WEB_BACK_FORWARD_LIST_H
+#define WEBKIT_WEB_BACK_FORWARD_LIST_H
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <webkit/webkitdefines.h>
+#include <webkit/webkitwebhistoryitem.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEB_BACK_FORWARD_LIST (webkit_web_back_forward_list_get_type())
+#define WEBKIT_WEB_BACK_FORWARD_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_WEB_BACK_FORWARD_LIST, WebKitWebBackForwardList))
+#define WEBKIT_WEB_BACK_FORWARD_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_WEB_BACK_FORWARD_LIST, WebKitWebBackForwardListClass))
+#define WEBKIT_IS_WEB_BACK_FORWARD_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_WEB_BACK_FORWARD_LIST))
+#define WEBKIT_IS_WEB_BACK_FORWARD_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_WEB_BACK_FORWARD_LIST))
+#define WEBKIT_WEB_BACK_FORWARD_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_WEB_BACK_FORWARD_LIST, WebKitWebBackForwardListClass))
+
+typedef struct _WebKitWebBackForwardListPrivate WebKitWebBackForwardListPrivate;
+
+struct _WebKitWebBackForwardList {
+ GObject parent_instance;
+
+ WebKitWebBackForwardListPrivate* priv;
+};
+
+struct _WebKitWebBackForwardListClass {
+ GObjectClass parent_class;
+};
+
+WEBKIT_API GType
+webkit_web_back_forward_list_get_type (void);
+
+WEBKIT_API WebKitWebBackForwardList*
+webkit_web_back_forward_list_new_with_web_view (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_back_forward_list_go_forward (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API void
+webkit_web_back_forward_list_go_back (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API gboolean
+webkit_web_back_forward_list_contains_item (WebKitWebBackForwardList* web_back_forward_list, WebKitWebHistoryItem* history_item);
+
+WEBKIT_API void
+webkit_web_back_forward_list_go_to_item (WebKitWebBackForwardList* web_back_forward_list, WebKitWebHistoryItem* history_item);
+
+WEBKIT_API GList*
+webkit_web_back_forward_list_get_forward_list_with_limit (WebKitWebBackForwardList* web_back_forward_list, gint limit);
+
+WEBKIT_API GList*
+webkit_web_back_forward_list_get_back_list_with_limit (WebKitWebBackForwardList* web_back_forward_list, gint limit);
+
+WEBKIT_API WebKitWebHistoryItem*
+webkit_web_back_forward_list_get_back_item (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API WebKitWebHistoryItem*
+webkit_web_back_forward_list_get_current_item (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API WebKitWebHistoryItem*
+webkit_web_back_forward_list_get_forward_item (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API WebKitWebHistoryItem*
+webkit_web_back_forward_list_get_nth_item (WebKitWebBackForwardList* web_back_forward_list, gint index);
+
+WEBKIT_API gint
+webkit_web_back_forward_list_get_back_length (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API gint
+webkit_web_back_forward_list_get_forward_length (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API gint
+webkit_web_back_forward_list_get_limit (WebKitWebBackForwardList* web_back_forward_list);
+
+WEBKIT_API void
+webkit_web_back_forward_list_set_limit (WebKitWebBackForwardList* web_back_forward_list, gint limit);
+
+G_END_DECLS
+
+
+#endif /* WEBKIT_WEB_BACK_FORWARD_LIST_H */
diff --git a/WebKit/gtk/webkit/webkitwebframe.cpp b/WebKit/gtk/webkit/webkitwebframe.cpp
new file mode 100644
index 0000000..0201f5c
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebframe.cpp
@@ -0,0 +1,690 @@
+/*
+ * Copyright (C) 2007, 2008 Holger Hans Peter Freyther
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
+ * Copyright (C) 2007 Apple Inc.
+ * Copyright (C) 2008 Christian Dywan <christian@imendio.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include "webkitwebframe.h"
+#include "webkitwebview.h"
+#include "webkit-marshal.h"
+#include "webkitprivate.h"
+
+#include "CString.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClientGtk.h"
+#include "FrameTree.h"
+#include "FrameView.h"
+#include "GraphicsContext.h"
+#include "HTMLFrameOwnerElement.h"
+#include "RenderView.h"
+#include "kjs_binding.h"
+#include "kjs_proxy.h"
+#include "kjs_window.h"
+
+#include <JavaScriptCore/APICast.h>
+
+using namespace WebKit;
+using namespace WebCore;
+using namespace std;
+
+extern "C" {
+
+enum {
+ CLEARED,
+ LOAD_COMMITTED,
+ LOAD_DONE,
+ TITLE_CHANGED,
+ HOVERING_OVER_LINK,
+ LAST_SIGNAL
+};
+
+enum {
+ PROP_0,
+
+ PROP_NAME,
+ PROP_TITLE,
+ PROP_URI
+};
+
+static guint webkit_web_frame_signals[LAST_SIGNAL] = { 0, };
+
+G_DEFINE_TYPE(WebKitWebFrame, webkit_web_frame, G_TYPE_OBJECT)
+
+static void webkit_web_frame_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
+{
+ WebKitWebFrame* frame = WEBKIT_WEB_FRAME(object);
+
+ switch(prop_id) {
+ case PROP_NAME:
+ g_value_set_string(value, webkit_web_frame_get_name(frame));
+ break;
+ case PROP_TITLE:
+ g_value_set_string(value, webkit_web_frame_get_title(frame));
+ break;
+ case PROP_URI:
+ g_value_set_string(value, webkit_web_frame_get_uri(frame));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void webkit_web_frame_finalize(GObject* object)
+{
+ WebKitWebFrame* frame = WEBKIT_WEB_FRAME(object);
+ WebKitWebFramePrivate* priv = frame->priv;
+
+ priv->coreFrame->loader()->cancelAndClear();
+ priv->coreFrame = 0;
+
+ g_free(priv->name);
+ g_free(priv->title);
+ g_free(priv->uri);
+
+ G_OBJECT_CLASS(webkit_web_frame_parent_class)->finalize(object);
+}
+
+static void webkit_web_frame_class_init(WebKitWebFrameClass* frameClass)
+{
+ webkit_init();
+
+ /*
+ * signals
+ */
+ webkit_web_frame_signals[CLEARED] = g_signal_new("cleared",
+ G_TYPE_FROM_CLASS(frameClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ webkit_web_frame_signals[LOAD_COMMITTED] = g_signal_new("load-committed",
+ G_TYPE_FROM_CLASS(frameClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ webkit_web_frame_signals[LOAD_DONE] = g_signal_new("load-done",
+ G_TYPE_FROM_CLASS(frameClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__BOOLEAN,
+ G_TYPE_NONE, 1,
+ G_TYPE_BOOLEAN);
+
+ webkit_web_frame_signals[TITLE_CHANGED] = g_signal_new("title-changed",
+ G_TYPE_FROM_CLASS(frameClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ webkit_marshal_VOID__STRING,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
+
+ webkit_web_frame_signals[HOVERING_OVER_LINK] = g_signal_new("hovering-over-link",
+ G_TYPE_FROM_CLASS(frameClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ webkit_marshal_VOID__STRING_STRING,
+ G_TYPE_NONE, 2,
+ G_TYPE_STRING, G_TYPE_STRING);
+
+ /*
+ * implementations of virtual methods
+ */
+ GObjectClass* objectClass = G_OBJECT_CLASS(frameClass);
+ objectClass->finalize = webkit_web_frame_finalize;
+ objectClass->get_property = webkit_web_frame_get_property;
+
+ /*
+ * properties
+ */
+ g_object_class_install_property(objectClass, PROP_NAME,
+ g_param_spec_string("name",
+ "Name",
+ "The name of the frame",
+ NULL,
+ WEBKIT_PARAM_READABLE));
+
+ g_object_class_install_property(objectClass, PROP_TITLE,
+ g_param_spec_string("title",
+ "Title",
+ "The document title of the frame",
+ NULL,
+ WEBKIT_PARAM_READABLE));
+
+ g_object_class_install_property(objectClass, PROP_URI,
+ g_param_spec_string("uri",
+ "URI",
+ "The current URI of the contents displayed by the frame",
+ NULL,
+ WEBKIT_PARAM_READABLE));
+
+ g_type_class_add_private(frameClass, sizeof(WebKitWebFramePrivate));
+}
+
+static void webkit_web_frame_init(WebKitWebFrame* frame)
+{
+ WebKitWebFramePrivate* priv = WEBKIT_WEB_FRAME_GET_PRIVATE(frame);
+
+ // TODO: Move constructor code here.
+ frame->priv = priv;
+}
+
+/**
+ * webkit_web_frame_new:
+ * @web_view: the controlling #WebKitWebView
+ *
+ * Creates a new #WebKitWebFrame initialized with a controlling #WebKitWebView.
+ *
+ * Returns: a new #WebKitWebFrame
+ **/
+WebKitWebFrame* webkit_web_frame_new(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebFrame* frame = WEBKIT_WEB_FRAME(g_object_new(WEBKIT_TYPE_WEB_FRAME, NULL));
+ WebKitWebFramePrivate* priv = frame->priv;
+ WebKitWebViewPrivate* viewPriv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
+
+ priv->client = new WebKit::FrameLoaderClient(frame);
+ priv->coreFrame = new Frame(viewPriv->corePage, 0, priv->client);
+
+ FrameView* frameView = new FrameView(priv->coreFrame.get());
+ frameView->setContainingWindow(GTK_CONTAINER(webView));
+ frameView->setGtkAdjustments(GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)),
+ GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)));
+ priv->coreFrame->setView(frameView);
+ frameView->deref();
+ priv->coreFrame->init();
+ priv->webView = webView;
+
+ return frame;
+}
+
+WebKitWebFrame* webkit_web_frame_init_with_web_view(WebKitWebView* webView, HTMLFrameOwnerElement* element)
+{
+ WebKitWebFrame* frame = WEBKIT_WEB_FRAME(g_object_new(WEBKIT_TYPE_WEB_FRAME, NULL));
+ WebKitWebFramePrivate* priv = frame->priv;
+ WebKitWebViewPrivate* viewPriv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
+
+ priv->client = new WebKit::FrameLoaderClient(frame);
+ priv->coreFrame = new Frame(viewPriv->corePage, element, priv->client);
+
+ FrameView* frameView = new FrameView(priv->coreFrame.get());
+ frameView->setContainingWindow(GTK_CONTAINER(webView));
+ priv->coreFrame->setView(frameView);
+ frameView->deref();
+ priv->coreFrame->init();
+ priv->webView = webView;
+
+ return frame;
+}
+
+/**
+ * webkit_web_frame_get_title:
+ * @frame: a #WebKitWebFrame
+ *
+ * Returns the @frame's document title
+ *
+ * Return value: the title of @frame
+ */
+const gchar* webkit_web_frame_get_title(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ WebKitWebFramePrivate* priv = frame->priv;
+ return priv->title;
+}
+
+/**
+ * webkit_web_frame_get_uri:
+ * @frame: a #WebKitWebFrame
+ *
+ * Returns the current URI of the contents displayed by the @frame
+ *
+ * Return value: the URI of @frame
+ */
+const gchar* webkit_web_frame_get_uri(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ WebKitWebFramePrivate* priv = frame->priv;
+ return priv->uri;
+}
+
+/**
+ * webkit_web_frame_get_web_view:
+ * @frame: a #WebKitWebFrame
+ *
+ * Returns the #WebKitWebView that manages this #WebKitWebFrame.
+ *
+ * The #WebKitWebView returned manages the entire hierarchy of #WebKitWebFrame
+ * objects that contains @frame.
+ *
+ * Return value: the #WebKitWebView that manages @frame
+ */
+WebKitWebView* webkit_web_frame_get_web_view(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ WebKitWebFramePrivate* priv = frame->priv;
+ return priv->webView;
+}
+
+/**
+ * webkit_web_frame_get_name:
+ * @frame: a #WebKitWebFrame
+ *
+ * Returns the @frame's name
+ *
+ * Return value: the name of @frame
+ */
+const gchar* webkit_web_frame_get_name(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ WebKitWebFramePrivate* priv = frame->priv;
+
+ if (priv->name)
+ return priv->name;
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ String string = coreFrame->tree()->name();
+ priv->name = g_strdup(string.utf8().data());
+ return priv->name;
+}
+
+/**
+ * webkit_web_frame_get_parent:
+ * @frame: a #WebKitWebFrame
+ *
+ * Returns the @frame's parent frame, or %NULL if it has none.
+ *
+ * Return value: the parent #WebKitWebFrame or %NULL in case there is none
+ */
+WebKitWebFrame* webkit_web_frame_get_parent(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ return kit(coreFrame->tree()->parent());
+}
+
+/**
+ * webkit_web_frame_load_request:
+ * @frame: a #WebKitWebFrame
+ * @request: a #WebKitNetworkRequest
+ *
+ * Connects to a given URI by initiating an asynchronous client request.
+ *
+ * Creates a provisional data source that will transition to a committed data
+ * source once any data has been received. Use webkit_web_frame_stop_loading() to
+ * stop the load. This function is typically invoked on the main frame.
+ */
+void webkit_web_frame_load_request(WebKitWebFrame* frame, WebKitNetworkRequest* request)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_FRAME(frame));
+ g_return_if_fail(WEBKIT_IS_NETWORK_REQUEST(request));
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ // TODO: Use the ResourceRequest carried by WebKitNetworkRequest when it is implemented.
+ String string = String::fromUTF8(webkit_network_request_get_uri(request));
+ coreFrame->loader()->load(ResourceRequest(KURL(string)));
+}
+
+/**
+ * webkit_web_frame_stop_loading:
+ * @frame: a #WebKitWebFrame
+ *
+ * Stops any pending loads on @frame's data source, and those of its children.
+ */
+void webkit_web_frame_stop_loading(WebKitWebFrame* frame)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_FRAME(frame));
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ coreFrame->loader()->stopAllLoaders();
+}
+
+/**
+ * webkit_web_frame_reload:
+ * @frame: a #WebKitWebFrame
+ *
+ * Reloads the initial request.
+ */
+void webkit_web_frame_reload(WebKitWebFrame* frame)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_FRAME(frame));
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ coreFrame->loader()->reload();
+}
+
+/**
+ * webkit_web_frame_find_frame:
+ * @frame: a #WebKitWebFrame
+ * @name: the name of the frame to be found
+ *
+ * For pre-defined names, returns @frame if @name is "_self" or "_current",
+ * returns @frame's parent frame if @name is "_parent", and returns the main
+ * frame if @name is "_top". Also returns @frame if it is the main frame and
+ * @name is either "_parent" or "_top". For other names, this function returns
+ * the first frame that matches @name. This function searches @frame and its
+ * descendents first, then @frame's parent and its children moving up the
+ * hierarchy until a match is found. If no match is found in @frame's
+ * hierarchy, this function will search for a matching frame in other main
+ * frame hierarchies. Returns %NULL if no match is found.
+ *
+ * Return value: the found #WebKitWebFrame or %NULL in case none is found
+ */
+WebKitWebFrame* webkit_web_frame_find_frame(WebKitWebFrame* frame, const gchar* name)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+ g_return_val_if_fail(name, NULL);
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ String nameString = String::fromUTF8(name);
+ return kit(coreFrame->tree()->find(AtomicString(nameString)));
+}
+
+/**
+ * webkit_web_frame_get_global_context:
+ * @frame: a #WebKitWebFrame
+ *
+ * Gets the global JavaScript execution context. Use this function to bridge
+ * between the WebKit and JavaScriptCore APIs.
+ *
+ * Return value: the global JavaScript context
+ */
+JSGlobalContextRef webkit_web_frame_get_global_context(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ return toGlobalRef(coreFrame->scriptProxy()->globalObject()->globalExec());
+}
+
+/**
+ * webkit_web_frame_get_children:
+ * @frame: a #WebKitWebFrame
+ *
+ * Return value: child frames of @frame
+ */
+GSList* webkit_web_frame_get_children(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ GSList* children = NULL;
+ for (Frame* child = coreFrame->tree()->firstChild(); child; child = child->tree()->nextSibling()) {
+ FrameLoader* loader = child->loader();
+ WebKit::FrameLoaderClient* client = static_cast<WebKit::FrameLoaderClient*>(loader->client());
+ if (client)
+ children = g_slist_append(children, client->webFrame());
+ }
+
+ return children;
+}
+
+/**
+ * webkit_web_frame_get_inner_text:
+ * @frame: a #WebKitWebFrame
+ *
+ * Return value: inner text of @frame
+ */
+gchar* webkit_web_frame_get_inner_text(WebKitWebFrame* frame)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_FRAME(frame), NULL);
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ FrameView* view = coreFrame->view();
+
+ if (view->layoutPending())
+ view->layout();
+
+ Element* documentElement = coreFrame->document()->documentElement();
+ String string = documentElement->innerText();
+ return g_strdup(string.utf8().data());
+}
+
+#if GTK_CHECK_VERSION(2,10,0)
+
+// This could be shared between ports once it's complete
+class PrintContext
+{
+public:
+ PrintContext(Frame* frame)
+ : m_frame(frame)
+ {
+ }
+
+ ~PrintContext()
+ {
+ m_pageRects.clear();
+ }
+
+ int pageCount()
+ {
+ return m_pageRects.size();
+ }
+
+ void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
+ {
+ m_pageRects.clear();
+ outPageHeight = 0;
+
+ if (!m_frame->document() || !m_frame->view() || !m_frame->document()->renderer())
+ return;
+
+ RenderView* root = static_cast<RenderView*>(m_frame->document()->renderer());
+
+ if (!root) {
+ LOG_ERROR("document to be printed has no renderer");
+ return;
+ }
+
+ if (userScaleFactor <= 0) {
+ LOG_ERROR("userScaleFactor has bad value %.2f", userScaleFactor);
+ return;
+ }
+
+ float ratio = printRect.height() / printRect.width();
+
+ float pageWidth = (float)root->docWidth();
+ float pageHeight = pageWidth * ratio;
+ outPageHeight = pageHeight; // this is the height of the page adjusted by margins
+ pageHeight -= headerHeight + footerHeight;
+
+ if (pageHeight <= 0) {
+ LOG_ERROR("pageHeight has bad value %.2f", pageHeight);
+ return;
+ }
+
+ float currPageHeight = pageHeight / userScaleFactor;
+ float docHeight = root->layer()->height();
+ float currPageWidth = pageWidth / userScaleFactor;
+
+ // always return at least one page, since empty files should print a blank page
+ float printedPagesHeight = 0.0;
+ do {
+ float proposedBottom = min(docHeight, printedPagesHeight + pageHeight);
+ m_frame->adjustPageHeight(&proposedBottom, printedPagesHeight, proposedBottom, printedPagesHeight);
+ currPageHeight = max(1.0f, proposedBottom - printedPagesHeight);
+
+ m_pageRects.append(IntRect(0, (int)printedPagesHeight, (int)currPageWidth, (int)currPageHeight));
+ printedPagesHeight += currPageHeight;
+ } while (printedPagesHeight < docHeight);
+ }
+
+ // TODO: eliminate width param
+ void begin(float width)
+ {
+ // By imaging to a width a little wider than the available pixels,
+ // thin pages will be scaled down a little, matching the way they
+ // print in IE and Camino. This lets them use fewer sheets than they
+ // would otherwise, which is presumably why other browsers do this.
+ // Wide pages will be scaled down more than this.
+ const float PrintingMinimumShrinkFactor = 1.25f;
+
+ // This number determines how small we are willing to reduce the page content
+ // in order to accommodate the widest line. If the page would have to be
+ // reduced smaller to make the widest line fit, we just clip instead (this
+ // behavior matches MacIE and Mozilla, at least)
+ const float PrintingMaximumShrinkFactor = 2.0f;
+
+ float minLayoutWidth = width * PrintingMinimumShrinkFactor;
+ float maxLayoutWidth = width * PrintingMaximumShrinkFactor;
+
+ // FIXME: This will modify the rendering of the on-screen frame.
+ // Could lead to flicker during printing.
+ m_frame->setPrinting(true, minLayoutWidth, maxLayoutWidth, true);
+ }
+
+ // TODO: eliminate width param
+ void spoolPage(GraphicsContext& ctx, int pageNumber, float width)
+ {
+ IntRect pageRect = m_pageRects[pageNumber];
+ float scale = width / pageRect.width();
+
+ ctx.save();
+ ctx.scale(FloatSize(scale, scale));
+ ctx.translate(-pageRect.x(), -pageRect.y());
+ ctx.clip(pageRect);
+ m_frame->paint(&ctx, pageRect);
+ ctx.restore();
+ }
+
+ void end()
+ {
+ m_frame->setPrinting(false, 0, 0, true);
+ }
+
+protected:
+ Frame* m_frame;
+ Vector<IntRect> m_pageRects;
+};
+
+static void begin_print(GtkPrintOperation* op, GtkPrintContext* context, gpointer user_data)
+{
+ PrintContext* printContext = reinterpret_cast<PrintContext*>(user_data);
+
+ float width = gtk_print_context_get_width(context);
+ float height = gtk_print_context_get_height(context);
+ FloatRect printRect = FloatRect(0, 0, width, height);
+
+ printContext->begin(width);
+
+ // TODO: Margin adjustments and header/footer support
+ float headerHeight = 0;
+ float footerHeight = 0;
+ float pageHeight; // height of the page adjusted by margins
+ printContext->computePageRects(printRect, headerHeight, footerHeight, 1.0, pageHeight);
+ gtk_print_operation_set_n_pages(op, printContext->pageCount());
+}
+
+static void draw_page(GtkPrintOperation* op, GtkPrintContext* context, gint page_nr, gpointer user_data)
+{
+ PrintContext* printContext = reinterpret_cast<PrintContext*>(user_data);
+
+ cairo_t* cr = gtk_print_context_get_cairo_context(context);
+ GraphicsContext ctx(cr);
+ float width = gtk_print_context_get_width(context);
+ printContext->spoolPage(ctx, page_nr, width);
+}
+
+static void end_print(GtkPrintOperation* op, GtkPrintContext* context, gpointer user_data)
+{
+ PrintContext* printContext = reinterpret_cast<PrintContext*>(user_data);
+ printContext->end();
+}
+
+void webkit_web_frame_print(WebKitWebFrame* frame)
+{
+ GtkWidget* topLevel = gtk_widget_get_toplevel(GTK_WIDGET(webkit_web_frame_get_web_view(frame)));
+ if (!GTK_WIDGET_TOPLEVEL(topLevel))
+ topLevel = NULL;
+
+ Frame* coreFrame = core(frame);
+ ASSERT(coreFrame);
+
+ PrintContext printContext(coreFrame);
+
+ GtkPrintOperation* op = gtk_print_operation_new();
+ g_signal_connect(G_OBJECT(op), "begin-print", G_CALLBACK(begin_print), &printContext);
+ g_signal_connect(G_OBJECT(op), "draw-page", G_CALLBACK(draw_page), &printContext);
+ g_signal_connect(G_OBJECT(op), "end-print", G_CALLBACK(end_print), &printContext);
+ GError *error = NULL;
+ gtk_print_operation_run(op, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, GTK_WINDOW(topLevel), &error);
+ g_object_unref(op);
+
+ if (error) {
+ GtkWidget* dialog = gtk_message_dialog_new(GTK_WINDOW(topLevel),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "%s", error->message);
+ g_error_free(error);
+
+ g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL);
+ gtk_widget_show(dialog);
+ }
+}
+
+#else
+
+void webkit_web_frame_print(WebKitWebFrame*)
+{
+ g_warning("Printing support is not available in older versions of GTK+");
+}
+
+#endif
+
+}
diff --git a/WebKit/gtk/webkit/webkitwebframe.h b/WebKit/gtk/webkit/webkitwebframe.h
new file mode 100644
index 0000000..a89da46
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebframe.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WEBKIT_WEB_FRAME_H
+#define WEBKIT_WEB_FRAME_H
+
+#include <glib-object.h>
+#include <JavaScriptCore/JSBase.h>
+
+#include <webkit/webkitdefines.h>
+#include <webkit/webkitnetworkrequest.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEB_FRAME (webkit_web_frame_get_type())
+#define WEBKIT_WEB_FRAME(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_WEB_FRAME, WebKitWebFrame))
+#define WEBKIT_WEB_FRAME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_WEB_FRAME, WebKitWebFrameClass))
+#define WEBKIT_IS_WEB_FRAME(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_WEB_FRAME))
+#define WEBKIT_IS_WEB_FRAME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_WEB_FRAME))
+#define WEBKIT_WEB_FRAME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_WEB_FRAME, WebKitWebFrameClass))
+
+typedef struct _WebKitWebFramePrivate WebKitWebFramePrivate;
+
+struct _WebKitWebFrame {
+ GObject parent_instance;
+
+ WebKitWebFramePrivate* priv;
+};
+
+struct _WebKitWebFrameClass {
+ GObjectClass parent_class;
+
+ void (*_webkit_reserved1) (void);
+ void (*_webkit_reserved2) (void);
+ void (*_webkit_reserved3) (void);
+ void (*_webkit_reserved4) (void);
+ void (*_webkit_reserved5) (void);
+ void (*_webkit_reserved6) (void);
+};
+
+WEBKIT_API GType
+webkit_web_frame_get_type (void);
+
+WEBKIT_API WebKitWebFrame*
+webkit_web_frame_new (WebKitWebView* web_view);
+
+WEBKIT_API WebKitWebView*
+webkit_web_frame_get_web_view (WebKitWebFrame* frame);
+
+WEBKIT_API const gchar*
+webkit_web_frame_get_name (WebKitWebFrame* frame);
+
+WEBKIT_API const gchar*
+webkit_web_frame_get_title (WebKitWebFrame* frame);
+
+WEBKIT_API const gchar*
+webkit_web_frame_get_uri (WebKitWebFrame* frame);
+
+WEBKIT_API WebKitWebFrame*
+webkit_web_frame_get_parent (WebKitWebFrame* frame);
+
+WEBKIT_API void
+webkit_web_frame_load_request (WebKitWebFrame* frame, WebKitNetworkRequest* request);
+
+WEBKIT_API void
+webkit_web_frame_stop_loading (WebKitWebFrame* frame);
+
+WEBKIT_API void
+webkit_web_frame_reload (WebKitWebFrame* frame);
+
+WEBKIT_API WebKitWebFrame*
+webkit_web_frame_find_frame (WebKitWebFrame* frame, const gchar* name);
+
+WEBKIT_API JSGlobalContextRef
+webkit_web_frame_get_global_context (WebKitWebFrame* frame);
+
+G_END_DECLS
+
+#endif
diff --git a/WebKit/gtk/webkit/webkitwebhistoryitem.cpp b/WebKit/gtk/webkit/webkitwebhistoryitem.cpp
new file mode 100644
index 0000000..d9c8cd0
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebhistoryitem.cpp
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2008 Jan Michael C. Alonzo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+
+#include "config.h"
+
+#include "webkitwebhistoryitem.h"
+#include "webkitprivate.h"
+
+#include <glib.h>
+
+#include "CString.h"
+#include "HistoryItem.h"
+#include "PlatformString.h"
+
+using namespace WebKit;
+
+extern "C" {
+
+struct _WebKitWebHistoryItemPrivate {
+ WebCore::HistoryItem* historyItem;
+
+ gchar* title;
+ gchar* alternateTitle;
+ gchar* uri;
+ gchar* originalUri;
+};
+
+#define WEBKIT_WEB_HISTORY_ITEM_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_HISTORY_ITEM, WebKitWebHistoryItemPrivate))
+
+G_DEFINE_TYPE(WebKitWebHistoryItem, webkit_web_history_item, G_TYPE_OBJECT);
+
+
+static GHashTable* webkit_history_items()
+{
+ static GHashTable* historyItems = g_hash_table_new(g_direct_hash, g_direct_equal);
+ return historyItems;
+}
+
+static void webkit_history_item_add(WebKitWebHistoryItem* webHistoryItem, WebCore::HistoryItem* historyItem)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem));
+
+ GHashTable* table = webkit_history_items();
+
+ historyItem->ref();
+ g_hash_table_insert(table, historyItem, g_object_ref(webHistoryItem));
+}
+
+static void webkit_history_item_remove(WebCore::HistoryItem* historyItem)
+{
+ GHashTable* table = webkit_history_items();
+ WebKitWebHistoryItem* webHistoryItem = (WebKitWebHistoryItem*) g_hash_table_lookup(table, historyItem);
+
+ g_return_if_fail(webHistoryItem != NULL);
+
+ g_hash_table_remove(table, historyItem);
+ historyItem->deref();
+ g_object_unref(webHistoryItem);
+}
+
+static void webkit_web_history_item_dispose(GObject* object)
+{
+ WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(object);
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+
+ webkit_history_item_remove(priv->historyItem);
+ delete priv->historyItem;
+
+ /* destroy table if empty */
+ GHashTable* table = webkit_history_items();
+ if (!g_hash_table_size(table))
+ g_hash_table_destroy(table);
+
+ G_OBJECT_CLASS(webkit_web_history_item_parent_class)->dispose(object);
+}
+
+static void webkit_web_history_item_finalize(GObject* object)
+{
+ WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(object);
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+
+ g_free(priv->title);
+ g_free(priv->alternateTitle);
+ g_free(priv->uri);
+ g_free(priv->originalUri);
+
+ G_OBJECT_CLASS(webkit_web_history_item_parent_class)->finalize(object);
+}
+
+static void webkit_web_history_item_class_init(WebKitWebHistoryItemClass* klass)
+{
+ GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
+
+ gobject_class->dispose = webkit_web_history_item_dispose;
+ gobject_class->finalize = webkit_web_history_item_finalize;
+
+ g_type_class_add_private(gobject_class, sizeof(WebKitWebHistoryItemPrivate));
+}
+
+static void webkit_web_history_item_init(WebKitWebHistoryItem* webHistoryItem)
+{
+ webHistoryItem->priv = WEBKIT_WEB_HISTORY_ITEM_GET_PRIVATE(webHistoryItem);
+}
+
+/* Helper function to create a new WebHistoryItem instance when needed */
+WebKitWebHistoryItem* webkit_web_history_item_new_with_core_item(WebCore::HistoryItem* item)
+{
+ WebKitWebHistoryItem* webHistoryItem = kit(item);
+
+ if (!webHistoryItem) {
+ webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(g_object_new(WEBKIT_TYPE_WEB_HISTORY_ITEM, NULL));
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+ priv->historyItem = item;
+ webkit_history_item_add(webHistoryItem, priv->historyItem);
+ }
+
+ return webHistoryItem;
+}
+
+
+/**
+ * webkit_web_history_item_new:
+ *
+ * Creates a new #WebKitWebHistoryItem instance
+ *
+ * Return value: the new #WebKitWebHistoryItem
+ */
+WebKitWebHistoryItem* webkit_web_history_item_new(void)
+{
+ WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(g_object_new(WEBKIT_TYPE_WEB_HISTORY_ITEM, NULL));
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+
+ priv->historyItem = new WebCore::HistoryItem();
+ webkit_history_item_add(webHistoryItem, priv->historyItem);
+
+ return webHistoryItem;
+}
+
+/**
+ * webkit_web_history_item_new_with_data:
+ * @uri: the uri of the page
+ * @title: the title of the page
+ *
+ * Creates a new #WebKitWebHistoryItem with the given URI and title
+ *
+ * Return value: the new #WebKitWebHistoryItem
+ */
+WebKitWebHistoryItem* webkit_web_history_item_new_with_data(const gchar* uri, const gchar* title)
+{
+ WebCore::KURL historyUri(uri);
+ WebCore::String historyTitle(title);
+
+ WebKitWebHistoryItem* webHistoryItem = webkit_web_history_item_new();
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+
+ priv->historyItem = new WebCore::HistoryItem(historyUri, historyTitle);
+ webkit_history_item_add(webHistoryItem, priv->historyItem);
+
+ return webHistoryItem;
+}
+
+/**
+ * webkit_web_history_item_get_title:
+ * @webHistoryItem: a #WebKitWebHistoryItem
+ *
+ * Returns the page title of @webHistoryItem
+ */
+const gchar* webkit_web_history_item_get_title(WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL);
+
+ WebCore::HistoryItem* item = core(webHistoryItem);
+
+ g_return_val_if_fail(item != NULL, NULL);
+
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+ WebCore::String title = item->title();
+ g_free(priv->title);
+ priv->title = g_strdup(title.utf8().data());
+
+ return priv->title;
+}
+
+/**
+ * webkit_web_history_item_get_alternate_title:
+ * @webHistoryItem: a #WebKitWebHistoryItem
+ *
+ * Returns the alternate title of @webHistoryItem
+ *
+ * Return value: the alternate title of @webHistoryItem
+ */
+const gchar* webkit_web_history_item_get_alternate_title(WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL);
+
+ WebCore::HistoryItem* item = core(webHistoryItem);
+
+ g_return_val_if_fail(item != NULL, NULL);
+
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+ WebCore::String alternateTitle = item->alternateTitle();
+ g_free(priv->alternateTitle);
+ priv->alternateTitle = g_strdup(alternateTitle.utf8().data());
+
+ return priv->alternateTitle;
+}
+
+/**
+ * webkit_web_history_item_set_alternate_title:
+ * @webHistoryItem: a #WebKitWebHistoryItem
+ * @title: the alternate title for @this history item
+ *
+ * Sets an alternate title for @webHistoryItem
+ */
+void webkit_web_history_item_set_alternate_title(WebKitWebHistoryItem* webHistoryItem, const gchar* title)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem));
+
+ WebCore::HistoryItem* item = core(webHistoryItem);
+
+ item->setAlternateTitle(WebCore::String::fromUTF8(title));
+}
+
+/**
+ * webkit_web_history_item_get_uri:
+ * @webHistoryItem: a #WebKitWebHistoryItem
+ *
+ * Returns the URI of @this
+ *
+ * Return value: the URI of @webHistoryItem
+ */
+const gchar* webkit_web_history_item_get_uri(WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL);
+
+ WebCore::HistoryItem* item = core(WEBKIT_WEB_HISTORY_ITEM(webHistoryItem));
+
+ g_return_val_if_fail(item != NULL, NULL);
+
+ WebCore::String uri = item->urlString();
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+ g_free(priv->uri);
+ priv->uri = g_strdup(uri.utf8().data());
+
+ return priv->uri;
+}
+
+/**
+ * webkit_web_history_item_get_original_uri:
+ * @webHistoryItem: a #WebKitWebHistoryItem
+ *
+ * Returns the original URI of @webHistoryItem.
+ *
+ * Return value: the original URI of @webHistoryITem
+ */
+const gchar* webkit_web_history_item_get_original_uri(WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL);
+
+ WebCore::HistoryItem* item = core(WEBKIT_WEB_HISTORY_ITEM(webHistoryItem));
+
+ g_return_val_if_fail(item != NULL, NULL);
+
+ WebCore::String originalUri = item->originalURLString();
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+ g_free(priv->originalUri);
+ priv->originalUri = g_strdup(originalUri.utf8().data());
+
+ return webHistoryItem->priv->originalUri;
+}
+
+/**
+ * webkit_web_history_item_get_last_visisted_time :
+ * @webHistoryItem: a #WebKitWebHistoryItem
+ *
+ * Returns the last time @webHistoryItem was visited
+ *
+ * Return value: the time in seconds this @webHistoryItem was last visited
+ */
+gdouble webkit_web_history_item_get_last_visited_time(WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), 0);
+
+ WebCore::HistoryItem* item = core(WEBKIT_WEB_HISTORY_ITEM(webHistoryItem));
+
+ g_return_val_if_fail(item != NULL, 0);
+
+ return item->lastVisitedTime();
+}
+
+} /* end extern "C" */
+
+WebCore::HistoryItem* WebKit::core(WebKitWebHistoryItem* webHistoryItem)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL);
+
+ WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv;
+ WebCore::HistoryItem* historyItem = priv->historyItem;
+
+ return historyItem ? historyItem : 0;
+}
+
+WebKitWebHistoryItem* WebKit::kit(WebCore::HistoryItem* historyItem)
+{
+ g_return_val_if_fail(historyItem != NULL, NULL);
+
+ WebKitWebHistoryItem* webHistoryItem;
+ GHashTable* table = webkit_history_items();
+
+ webHistoryItem = (WebKitWebHistoryItem*) g_hash_table_lookup(table, historyItem);
+ return webHistoryItem;
+}
+
diff --git a/WebKit/gtk/webkit/webkitwebhistoryitem.h b/WebKit/gtk/webkit/webkitwebhistoryitem.h
new file mode 100644
index 0000000..267ffb5
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebhistoryitem.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2008 Jan Michael C. Alonzo
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WEBKIT_WEB_HISTORY_ITEM_H
+#define WEBKIT_WEB_HISTORY_ITEM_H
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gdk/gdk.h>
+
+#include <webkit/webkitdefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEB_HISTORY_ITEM (webkit_web_history_item_get_type())
+#define WEBKIT_WEB_HISTORY_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_WEB_HISTORY_ITEM, WebKitWebHistoryItem))
+#define WEBKIT_WEB_HISTORY_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_WEB_HISTORY_ITEM, WebKitWebHistoryItemClass))
+#define WEBKIT_IS_WEB_HISTORY_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_WEB_HISTORY_ITEM))
+#define WEBKIT_IS_WEB_HISTORY_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_WEB_HISTORY_ITEM))
+#define WEBKIT_WEB_HISTORY_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_WEB_HISTORY_ITEM, WebKitWebHistoryItemClass))
+
+typedef struct _WebKitWebHistoryItemPrivate WebKitWebHistoryItemPrivate;
+
+struct _WebKitWebHistoryItem {
+ GObject parent_instance;
+
+ WebKitWebHistoryItemPrivate* priv;
+};
+
+struct _WebKitWebHistoryItemClass {
+ GObjectClass parent_class;
+};
+
+WEBKIT_API GType
+webkit_web_history_item_get_type (void);
+
+WEBKIT_API WebKitWebHistoryItem*
+webkit_web_history_item_new (void);
+
+WEBKIT_API WebKitWebHistoryItem*
+webkit_web_history_item_new_with_data (const gchar* uri, const gchar* title);
+
+WEBKIT_API const gchar*
+webkit_web_history_item_get_title (WebKitWebHistoryItem* web_history_item);
+
+WEBKIT_API const gchar*
+webkit_web_history_item_get_alternate_title (WebKitWebHistoryItem* web_history_item);
+
+WEBKIT_API void
+webkit_web_history_item_set_alternate_title (WebKitWebHistoryItem* web_history_item, const gchar* title);
+
+WEBKIT_API const gchar*
+webkit_web_history_item_get_uri (WebKitWebHistoryItem* web_history_item);
+
+WEBKIT_API const gchar*
+webkit_web_history_item_get_original_uri (WebKitWebHistoryItem* web_history_item);
+
+WEBKIT_API gdouble
+webkit_web_history_item_get_last_visited_time (WebKitWebHistoryItem* web_history_item);
+
+G_END_DECLS
+
+#endif /* WEBKIT_WEB_HISTORY_ITEM_H */
diff --git a/WebKit/gtk/webkit/webkitwebsettings.cpp b/WebKit/gtk/webkit/webkitwebsettings.cpp
new file mode 100644
index 0000000..43b2209
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebsettings.cpp
@@ -0,0 +1,464 @@
+/*
+ * Copyright (C) 2008 Christian Dywan <christian@imendio.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include "webkitwebsettings.h"
+#include "webkitprivate.h"
+
+extern "C" {
+
+G_DEFINE_TYPE(WebKitWebSettings, webkit_web_settings, G_TYPE_OBJECT)
+
+struct _WebKitWebSettingsPrivate {
+ gchar* default_encoding;
+ gchar* cursive_font_family;
+ gchar* default_font_family;
+ gchar* fantasy_font_family;
+ gchar* monospace_font_family;
+ gchar* sans_serif_font_family;
+ gchar* serif_font_family;
+ guint default_font_size;
+ guint default_monospace_font_size;
+ guint minimum_font_size;
+ guint minimum_logical_font_size;
+ gboolean auto_load_images;
+ gboolean auto_shrink_images;
+ gboolean print_backgrounds;
+ gboolean enable_scripts;
+ gboolean enable_plugins;
+ gboolean resizable_text_areas;
+ gchar* user_stylesheet_uri;
+};
+
+#define WEBKIT_WEB_SETTINGS_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_SETTINGS, WebKitWebSettingsPrivate))
+
+enum {
+ PROP_0,
+
+ PROP_DEFAULT_ENCODING,
+ PROP_CURSIVE_FONT_FAMILY,
+ PROP_DEFAULT_FONT_FAMILY,
+ PROP_FANTASY_FONT_FAMILY,
+ PROP_MONOSPACE_FONT_FAMILY,
+ PROP_SANS_SERIF_FONT_FAMILY,
+ PROP_SERIF_FONT_FAMILY,
+ PROP_DEFAULT_FONT_SIZE,
+ PROP_DEFAULT_MONOSPACE_FONT_SIZE,
+ PROP_MINIMUM_FONT_SIZE,
+ PROP_MINIMUM_LOGICAL_FONT_SIZE,
+ PROP_AUTO_LOAD_IMAGES,
+ PROP_AUTO_SHRINK_IMAGES,
+ PROP_PRINT_BACKGROUNDS,
+ PROP_ENABLE_SCRIPTS,
+ PROP_ENABLE_PLUGINS,
+ PROP_RESIZABLE_TEXT_AREAS,
+ PROP_USER_STYLESHEET_URI
+};
+
+static void webkit_web_settings_finalize(GObject* object);
+
+static void webkit_web_settings_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec);
+
+static void webkit_web_settings_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec);
+
+static void webkit_web_settings_class_init(WebKitWebSettingsClass* klass)
+{
+ GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
+ gobject_class->finalize = webkit_web_settings_finalize;
+ gobject_class->set_property = webkit_web_settings_set_property;
+ gobject_class->get_property = webkit_web_settings_get_property;
+
+ GParamFlags flags = (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+
+ g_object_class_install_property(gobject_class,
+ PROP_DEFAULT_ENCODING,
+ g_param_spec_string(
+ "default-encoding",
+ "Default Encoding",
+ "The default encoding used to display text.",
+ "iso-8859-1",
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_CURSIVE_FONT_FAMILY,
+ g_param_spec_string(
+ "cursive-font-family",
+ "Cursive Font Family",
+ "The default Cursive font family used to display text.",
+ "serif",
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_DEFAULT_FONT_FAMILY,
+ g_param_spec_string(
+ "default-font-family",
+ "Default Font Family",
+ "The default font family used to display text.",
+ "sans-serif",
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_FANTASY_FONT_FAMILY,
+ g_param_spec_string(
+ "fantasy-font-family",
+ "Fantasy Font Family",
+ "The default Fantasy font family used to display text.",
+ "serif",
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_MONOSPACE_FONT_FAMILY,
+ g_param_spec_string(
+ "monospace-font-family",
+ "Monospace Font Family",
+ "The default font family used to display monospace text.",
+ "monospace",
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_SANS_SERIF_FONT_FAMILY,
+ g_param_spec_string(
+ "sans-serif-font-family",
+ "Sans Serif Font Family",
+ "The default Sans Serif font family used to display text.",
+ "sans-serif",
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_SERIF_FONT_FAMILY,
+ g_param_spec_string(
+ "serif-font-family",
+ "Serif Font Family",
+ "The default Serif font family used to display text.",
+ "serif",
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_DEFAULT_FONT_SIZE,
+ g_param_spec_int(
+ "default-font-size",
+ "Default Font Size",
+ "The default font size used to display text.",
+ 5, G_MAXINT, 10,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_DEFAULT_MONOSPACE_FONT_SIZE,
+ g_param_spec_int(
+ "default-monospace-font-size",
+ "Default Monospace Font Size",
+ "The default font size used to display monospace text.",
+ 5, G_MAXINT, 10,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_MINIMUM_FONT_SIZE,
+ g_param_spec_int(
+ "minimum-font-size",
+ "Minimum Font Size",
+ "The minimum font size used to display text.",
+ 1, G_MAXINT, 5,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_MINIMUM_LOGICAL_FONT_SIZE,
+ g_param_spec_int(
+ "minimum-logical-font-size",
+ "Minimum Logical Font Size",
+ "The minimum logical font size used to display text.",
+ 1, G_MAXINT, 5,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_AUTO_LOAD_IMAGES,
+ g_param_spec_boolean(
+ "auto-load-images",
+ "Auto Load Images",
+ "Load images automatically.",
+ TRUE,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_AUTO_SHRINK_IMAGES,
+ g_param_spec_boolean(
+ "auto-shrink-images",
+ "Auto Shrink Images",
+ "Automatically shrink standalone images to fit.",
+ TRUE,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_PRINT_BACKGROUNDS,
+ g_param_spec_boolean(
+ "print-backgrounds",
+ "Print Backgrounds",
+ "Whether background images should be printed.",
+ TRUE,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_ENABLE_SCRIPTS,
+ g_param_spec_boolean(
+ "enable-scripts",
+ "Enable Scripts",
+ "Enable embedded scripting languages.",
+ TRUE,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_ENABLE_PLUGINS,
+ g_param_spec_boolean(
+ "enable-plugins",
+ "Enable Plugins",
+ "Enable embedded plugin objects.",
+ TRUE,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_RESIZABLE_TEXT_AREAS,
+ g_param_spec_boolean(
+ "resizable-text-areas",
+ "Resizable Text Areas",
+ "Whether text areas are resizable.",
+ TRUE,
+ flags));
+
+ g_object_class_install_property(gobject_class,
+ PROP_USER_STYLESHEET_URI,
+ g_param_spec_string("user-stylesheet-uri",
+ "User Stylesheet URI",
+ "The URI of a stylesheet that is applied to every page.",
+ 0,
+ flags));
+
+ g_type_class_add_private(klass, sizeof(WebKitWebSettingsPrivate));
+}
+
+static void webkit_web_settings_init(WebKitWebSettings* web_settings)
+{
+ web_settings->priv = WEBKIT_WEB_SETTINGS_GET_PRIVATE(web_settings);
+}
+
+static void webkit_web_settings_finalize(GObject* object)
+{
+ WebKitWebSettings* web_settings = WEBKIT_WEB_SETTINGS(object);
+ WebKitWebSettingsPrivate* priv = web_settings->priv;
+
+ g_free(priv->default_encoding);
+ g_free(priv->cursive_font_family);
+ g_free(priv->default_font_family);
+ g_free(priv->fantasy_font_family);
+ g_free(priv->monospace_font_family);
+ g_free(priv->sans_serif_font_family);
+ g_free(priv->serif_font_family);
+ g_free(priv->user_stylesheet_uri);
+
+ G_OBJECT_CLASS(webkit_web_settings_parent_class)->finalize(object);
+}
+
+static void webkit_web_settings_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
+{
+ WebKitWebSettings* web_settings = WEBKIT_WEB_SETTINGS(object);
+ WebKitWebSettingsPrivate* priv = web_settings->priv;
+
+ switch(prop_id) {
+ case PROP_DEFAULT_ENCODING:
+ g_free(priv->default_encoding);
+ priv->default_encoding = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_CURSIVE_FONT_FAMILY:
+ g_free(priv->cursive_font_family);
+ priv->cursive_font_family = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_DEFAULT_FONT_FAMILY:
+ g_free(priv->default_font_family);
+ priv->default_font_family = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_FANTASY_FONT_FAMILY:
+ g_free(priv->fantasy_font_family);
+ priv->fantasy_font_family = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_MONOSPACE_FONT_FAMILY:
+ g_free(priv->monospace_font_family);
+ priv->monospace_font_family = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_SANS_SERIF_FONT_FAMILY:
+ g_free(priv->sans_serif_font_family);
+ priv->sans_serif_font_family = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_SERIF_FONT_FAMILY:
+ g_free(priv->serif_font_family);
+ priv->serif_font_family = g_strdup(g_value_get_string(value));
+ break;
+ case PROP_DEFAULT_FONT_SIZE:
+ priv->default_font_size = g_value_get_int(value);
+ break;
+ case PROP_DEFAULT_MONOSPACE_FONT_SIZE:
+ priv->default_monospace_font_size = g_value_get_int(value);
+ break;
+ case PROP_MINIMUM_FONT_SIZE:
+ priv->minimum_font_size = g_value_get_int(value);
+ break;
+ case PROP_MINIMUM_LOGICAL_FONT_SIZE:
+ priv->minimum_logical_font_size = g_value_get_int(value);
+ break;
+ case PROP_AUTO_LOAD_IMAGES:
+ priv->auto_load_images = g_value_get_boolean(value);
+ break;
+ case PROP_AUTO_SHRINK_IMAGES:
+ priv->auto_shrink_images = g_value_get_boolean(value);
+ break;
+ case PROP_PRINT_BACKGROUNDS:
+ priv->print_backgrounds = g_value_get_boolean(value);
+ break;
+ case PROP_ENABLE_SCRIPTS:
+ priv->enable_scripts = g_value_get_boolean(value);
+ break;
+ case PROP_ENABLE_PLUGINS:
+ priv->enable_plugins = g_value_get_boolean(value);
+ break;
+ case PROP_RESIZABLE_TEXT_AREAS:
+ priv->resizable_text_areas = g_value_get_boolean(value);
+ break;
+ case PROP_USER_STYLESHEET_URI:
+ g_free(priv->user_stylesheet_uri);
+ priv->user_stylesheet_uri = g_strdup(g_value_get_string(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void webkit_web_settings_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
+{
+ WebKitWebSettings* web_settings = WEBKIT_WEB_SETTINGS(object);
+ WebKitWebSettingsPrivate* priv = web_settings->priv;
+
+ switch (prop_id) {
+ case PROP_DEFAULT_ENCODING:
+ g_value_set_string(value, priv->default_encoding);
+ break;
+ case PROP_CURSIVE_FONT_FAMILY:
+ g_value_set_string(value, priv->cursive_font_family);
+ break;
+ case PROP_DEFAULT_FONT_FAMILY:
+ g_value_set_string(value, priv->default_font_family);
+ break;
+ case PROP_FANTASY_FONT_FAMILY:
+ g_value_set_string(value, priv->fantasy_font_family);
+ break;
+ case PROP_MONOSPACE_FONT_FAMILY:
+ g_value_set_string(value, priv->monospace_font_family);
+ break;
+ case PROP_SANS_SERIF_FONT_FAMILY:
+ g_value_set_string(value, priv->sans_serif_font_family);
+ break;
+ case PROP_SERIF_FONT_FAMILY:
+ g_value_set_string(value, priv->serif_font_family);
+ break;
+ case PROP_DEFAULT_FONT_SIZE:
+ g_value_set_int(value, priv->default_font_size);
+ break;
+ case PROP_DEFAULT_MONOSPACE_FONT_SIZE:
+ g_value_set_int(value, priv->default_monospace_font_size);
+ break;
+ case PROP_MINIMUM_FONT_SIZE:
+ g_value_set_int(value, priv->minimum_font_size);
+ break;
+ case PROP_MINIMUM_LOGICAL_FONT_SIZE:
+ g_value_set_int(value, priv->minimum_logical_font_size);
+ break;
+ case PROP_AUTO_LOAD_IMAGES:
+ g_value_set_boolean(value, priv->auto_load_images);
+ break;
+ case PROP_AUTO_SHRINK_IMAGES:
+ g_value_set_boolean(value, priv->auto_shrink_images);
+ break;
+ case PROP_PRINT_BACKGROUNDS:
+ g_value_set_boolean(value, priv->print_backgrounds);
+ break;
+ case PROP_ENABLE_SCRIPTS:
+ g_value_set_boolean(value, priv->enable_scripts);
+ break;
+ case PROP_ENABLE_PLUGINS:
+ g_value_set_boolean(value, priv->enable_plugins);
+ break;
+ case PROP_RESIZABLE_TEXT_AREAS:
+ g_value_set_boolean(value, priv->resizable_text_areas);
+ break;
+ case PROP_USER_STYLESHEET_URI:
+ g_value_set_string(value, priv->user_stylesheet_uri);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+/**
+ * webkit_web_settings_new:
+ *
+ * Creates a new #WebKitWebSettings instance with default values. It must
+ * be manually attached to a WebView.
+ *
+ * Returns: a new #WebKitWebSettings instance
+ **/
+WebKitWebSettings* webkit_web_settings_new()
+{
+ return WEBKIT_WEB_SETTINGS(g_object_new(WEBKIT_TYPE_WEB_SETTINGS, NULL));
+}
+
+/**
+ * webkit_web_settings_copy:
+ *
+ * Copies an existing #WebKitWebSettings instance.
+ *
+ * Returns: a new #WebKitWebSettings instance
+ **/
+WebKitWebSettings* webkit_web_settings_copy(WebKitWebSettings* web_settings)
+{
+ WebKitWebSettingsPrivate* priv = web_settings->priv;
+
+ WebKitWebSettings* copy = WEBKIT_WEB_SETTINGS(g_object_new(WEBKIT_TYPE_WEB_SETTINGS,
+ "default-encoding", priv->default_encoding,
+ "cursive-font-family", priv->cursive_font_family,
+ "default-font-family", priv->default_font_family,
+ "fantasy-font-family", priv->fantasy_font_family,
+ "monospace-font-family", priv->monospace_font_family,
+ "sans-serif-font-family", priv->sans_serif_font_family,
+ "serif-font-family", priv->serif_font_family,
+ "default-font-size", priv->default_font_size,
+ "default-monospace-font-size", priv->default_monospace_font_size,
+ "minimum-font-size", priv->minimum_font_size,
+ "minimum-logical-font-size", priv->minimum_logical_font_size,
+ "auto-load-images", priv->auto_load_images,
+ "auto-shrink-images", priv->auto_shrink_images,
+ "print-backgrounds", priv->print_backgrounds,
+ "enable-scripts", priv->enable_scripts,
+ "enable-plugins", priv->enable_plugins,
+ "resizable-text-areas", priv->resizable_text_areas,
+ "user-stylesheet-uri", priv->user_stylesheet_uri,
+ NULL));
+
+ return copy;
+}
+
+}
diff --git a/WebKit/gtk/webkit/webkitwebsettings.h b/WebKit/gtk/webkit/webkitwebsettings.h
new file mode 100644
index 0000000..a21ccf4
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebsettings.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2008 Christian Dywan <christian@imendio.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __WEBKIT_WEB_SETTINGS_H__
+#define __WEBKIT_WEB_SETTINGS_H__
+
+#include <glib-object.h>
+
+#include <webkit/webkitdefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEB_SETTINGS (webkit_web_settings_get_type())
+#define WEBKIT_WEB_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_WEB_SETTINGS, WebKitWebSettings))
+#define WEBKIT_WEB_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_WEB_SETTINGS, WebKitWebSettingsClass))
+#define WEBKIT_IS_WEB_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_WEB_SETTINGS))
+#define WEBKIT_IS_WEB_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_WEB_SETTINGS))
+#define WEBKIT_WEB_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_WEB_SETTINGS, WebKitWebSettingsClass))
+
+typedef struct _WebKitWebSettingsPrivate WebKitWebSettingsPrivate;
+
+struct _WebKitWebSettings {
+ GObject parent_instance;
+
+ WebKitWebSettingsPrivate* priv;
+};
+
+struct _WebKitWebSettingsClass {
+ GObjectClass parent_class;
+
+ /* Padding for future expansion */
+ void (*_webkit_reserved1) (void);
+ void (*_webkit_reserved2) (void);
+ void (*_webkit_reserved3) (void);
+ void (*_webkit_reserved4) (void);
+};
+
+WEBKIT_API GType
+webkit_web_settings_get_type(void);
+
+WEBKIT_API WebKitWebSettings*
+webkit_web_settings_new(void);
+
+WEBKIT_API WebKitWebSettings*
+webkit_web_settings_copy(WebKitWebSettings* web_settings);
+
+G_END_DECLS
+
+#endif /* __WEBKIT_WEB_SETTINGS_H__ */
diff --git a/WebKit/gtk/webkit/webkitwebview.cpp b/WebKit/gtk/webkit/webkitwebview.cpp
new file mode 100644
index 0000000..81b196c
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebview.cpp
@@ -0,0 +1,1938 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ * Copyright (C) 2007, 2008 Christian Dywan <christian@imendio.com>
+ * Copyright (C) 2007 Xan Lopez <xan@gnome.org>
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
+ * Copyright (C) 2008 Jan Alonzo <jmalonzo@unpluggable.com>
+ *
+ * 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 "webkitwebview.h"
+#include "webkit-marshal.h"
+#include "webkitprivate.h"
+#include "webkitwebbackforwardlist.h"
+#include "webkitwebhistoryitem.h"
+
+#include "NotImplemented.h"
+#include "BackForwardList.h"
+#include "CString.h"
+#include "ChromeClientGtk.h"
+#include "ContextMenu.h"
+#include "ContextMenuClientGtk.h"
+#include "ContextMenuController.h"
+#include "Cursor.h"
+#include "DragClientGtk.h"
+#include "Editor.h"
+#include "EditorClientGtk.h"
+#include "EventHandler.h"
+#include "FocusController.h"
+#include "FrameLoaderTypes.h"
+#include "HitTestRequest.h"
+#include "HitTestResult.h"
+#include "GraphicsContext.h"
+#include "InspectorClientGtk.h"
+#include "FrameLoader.h"
+#include "FrameView.h"
+#include "Editor.h"
+#include "PasteboardHelper.h"
+#include "PlatformKeyboardEvent.h"
+#include "PlatformWheelEvent.h"
+#include "SubstituteData.h"
+
+#include <gdk/gdkkeysyms.h>
+
+static const double defaultDPI = 96.0;
+
+using namespace WebKit;
+using namespace WebCore;
+
+extern "C" {
+
+enum {
+ /* normal signals */
+ NAVIGATION_REQUESTED,
+ WINDOW_OBJECT_CLEARED,
+ LOAD_STARTED,
+ LOAD_COMMITTED,
+ LOAD_PROGRESS_CHANGED,
+ LOAD_FINISHED,
+ TITLE_CHANGED,
+ HOVERING_OVER_LINK,
+ POPULATE_POPUP,
+ STATUS_BAR_TEXT_CHANGED,
+ ICOND_LOADED,
+ SELECTION_CHANGED,
+ CONSOLE_MESSAGE,
+ SCRIPT_ALERT,
+ SCRIPT_CONFIRM,
+ SCRIPT_PROMPT,
+ SELECT_ALL,
+ COPY_CLIPBOARD,
+ PASTE_CLIPBOARD,
+ CUT_CLIPBOARD,
+ LAST_SIGNAL
+};
+
+enum {
+ PROP_0,
+
+ PROP_COPY_TARGET_LIST,
+ PROP_PASTE_TARGET_LIST,
+ PROP_EDITABLE,
+ PROP_SETTINGS,
+ PROP_TRANSPARENT
+};
+
+static guint webkit_web_view_signals[LAST_SIGNAL] = { 0, };
+
+G_DEFINE_TYPE(WebKitWebView, webkit_web_view, GTK_TYPE_CONTAINER)
+
+static void webkit_web_view_context_menu_position_func(GtkMenu*, gint* x, gint* y, gboolean* pushIn, WebKitWebViewPrivate* data)
+{
+ *pushIn = FALSE;
+ *x = data->lastPopupXPosition;
+ *y = data->lastPopupYPosition;
+}
+
+static gboolean webkit_web_view_forward_context_menu_event(WebKitWebView* webView, const PlatformMouseEvent& event)
+{
+ Page* page = core(webView);
+ page->contextMenuController()->clearContextMenu();
+ Frame* focusedFrame = page->focusController()->focusedOrMainFrame();
+ focusedFrame->view()->setCursor(pointerCursor());
+ bool handledEvent = focusedFrame->eventHandler()->sendContextMenuEvent(event);
+ if (!handledEvent)
+ return FALSE;
+
+ ContextMenu* coreMenu = page->contextMenuController()->contextMenu();
+ if (!coreMenu)
+ return FALSE;
+
+ GtkMenu* menu = GTK_MENU(coreMenu->platformDescription());
+ if (!menu)
+ return FALSE;
+
+ g_signal_emit(webView, webkit_web_view_signals[POPULATE_POPUP], 0, menu);
+
+ GList* items = gtk_container_get_children(GTK_CONTAINER(menu));
+ bool empty = !g_list_nth(items, 0);
+ g_list_free(items);
+ if (empty)
+ return FALSE;
+
+ WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
+ priv->lastPopupXPosition = event.globalX();
+ priv->lastPopupYPosition = event.globalY();
+ gtk_menu_popup(menu, NULL, NULL,
+ reinterpret_cast<GtkMenuPositionFunc>(webkit_web_view_context_menu_position_func),
+ priv, event.button() + 1, gtk_get_current_event_time());
+ return TRUE;
+}
+
+static gboolean webkit_web_view_popup_menu_handler(GtkWidget* widget)
+{
+ static const int contextMenuMargin = 1;
+
+ // The context menu event was generated from the keyboard, so show the context menu by the current selection.
+ Page* page = core(WEBKIT_WEB_VIEW(widget));
+ FrameView* view = page->mainFrame()->view();
+ Position start = page->mainFrame()->selectionController()->selection().start();
+ Position end = page->mainFrame()->selectionController()->selection().end();
+
+ int rightAligned = FALSE;
+ IntPoint location;
+
+ if (!start.node() || !end.node())
+ location = IntPoint(rightAligned ? view->contentsWidth() - contextMenuMargin : contextMenuMargin, contextMenuMargin);
+ else {
+ RenderObject* renderer = start.node()->renderer();
+ if (!renderer)
+ return FALSE;
+
+ // Calculate the rect of the first line of the selection (cribbed from -[WebCoreFrameBridge firstRectForDOMRange:]).
+ int extraWidthToEndOfLine = 0;
+ IntRect startCaretRect = renderer->caretRect(start.offset(), DOWNSTREAM, &extraWidthToEndOfLine);
+ IntRect endCaretRect = renderer->caretRect(end.offset(), UPSTREAM);
+
+ IntRect firstRect;
+ if (startCaretRect.y() == endCaretRect.y())
+ firstRect = IntRect(MIN(startCaretRect.x(), endCaretRect.x()),
+ startCaretRect.y(),
+ abs(endCaretRect.x() - startCaretRect.x()),
+ MAX(startCaretRect.height(), endCaretRect.height()));
+ else
+ firstRect = IntRect(startCaretRect.x(),
+ startCaretRect.y(),
+ startCaretRect.width() + extraWidthToEndOfLine,
+ startCaretRect.height());
+
+ location = IntPoint(rightAligned ? firstRect.right() : firstRect.x(), firstRect.bottom());
+ }
+
+ int x, y;
+ gdk_window_get_origin(GTK_WIDGET(view->containingWindow())->window, &x, &y);
+
+ // FIXME: The IntSize(0, -1) is a hack to get the hit-testing to result in the selected element.
+ // Ideally we'd have the position of a context menu event be separate from its target node.
+ location = view->contentsToWindow(location) + IntSize(0, -1);
+ IntPoint global = location + IntSize(x, y);
+ PlatformMouseEvent event(location, global, NoButton, MouseEventPressed, 0, false, false, false, false, gtk_get_current_event_time());
+
+ return webkit_web_view_forward_context_menu_event(WEBKIT_WEB_VIEW(widget), event);
+}
+
+static void webkit_web_view_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
+
+ switch(prop_id) {
+ case PROP_COPY_TARGET_LIST:
+ g_value_set_boxed(value, webkit_web_view_get_copy_target_list(webView));
+ break;
+ case PROP_PASTE_TARGET_LIST:
+ g_value_set_boxed(value, webkit_web_view_get_paste_target_list(webView));
+ break;
+ case PROP_EDITABLE:
+ g_value_set_boolean(value, webkit_web_view_get_editable(webView));
+ break;
+ case PROP_SETTINGS:
+ g_value_set_object(value, webkit_web_view_get_settings(webView));
+ break;
+ case PROP_TRANSPARENT:
+ g_value_set_boolean(value, webkit_web_view_get_transparent(webView));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void webkit_web_view_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec *pspec)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
+
+ switch(prop_id) {
+ case PROP_EDITABLE:
+ webkit_web_view_set_editable(webView, g_value_get_boolean(value));
+ break;
+ case PROP_SETTINGS:
+ webkit_web_view_set_settings(webView, WEBKIT_WEB_SETTINGS(g_value_get_object(value)));
+ break;
+ case PROP_TRANSPARENT:
+ webkit_web_view_set_transparent(webView, g_value_get_boolean(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static gboolean webkit_web_view_expose_event(GtkWidget* widget, GdkEventExpose* event)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ Frame* frame = core(webView)->mainFrame();
+ GdkRectangle clip;
+ gdk_region_get_clipbox(event->region, &clip);
+ cairo_t* cr = gdk_cairo_create(event->window);
+ GraphicsContext ctx(cr);
+ ctx.setGdkExposeEvent(event);
+ if (frame->renderer()) {
+ frame->view()->layoutIfNeededRecursive();
+
+ if (priv->transparent) {
+ cairo_save(cr);
+ cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
+ cairo_paint(cr);
+ cairo_restore(cr);
+ }
+
+ frame->view()->paint(&ctx, clip);
+ }
+ cairo_destroy(cr);
+
+ return FALSE;
+}
+
+static gboolean webkit_web_view_key_press_event(GtkWidget* widget, GdkEventKey* event)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ PlatformKeyboardEvent keyboardEvent(event);
+
+ if (frame->eventHandler()->keyEvent(keyboardEvent))
+ return TRUE;
+
+ FrameView* view = frame->view();
+ SelectionController::EAlteration alteration;
+ if (event->state & GDK_SHIFT_MASK)
+ alteration = SelectionController::EXTEND;
+ else
+ alteration = SelectionController::MOVE;
+
+ // TODO: We probably want to use GTK+ key bindings here and perhaps take an
+ // approach more like the Win and Mac ports for key handling.
+ switch (event->keyval) {
+ case GDK_Down:
+ view->scrollBy(0, LINE_STEP);
+ return TRUE;
+ case GDK_Up:
+ view->scrollBy(0, -LINE_STEP);
+ return TRUE;
+ case GDK_Right:
+ view->scrollBy(LINE_STEP, 0);
+ return TRUE;
+ case GDK_Left:
+ view->scrollBy(-LINE_STEP, 0);
+ return TRUE;
+ case GDK_Home:
+ frame->selectionController()->modify(alteration, SelectionController::BACKWARD, DocumentBoundary, true);
+ return TRUE;
+ case GDK_End:
+ frame->selectionController()->modify(alteration, SelectionController::FORWARD, DocumentBoundary, true);
+ return TRUE;
+ }
+
+ /* Chain up to our parent class for binding activation */
+ return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->key_press_event(widget, event);
+}
+
+static gboolean webkit_web_view_key_release_event(GtkWidget* widget, GdkEventKey* event)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ PlatformKeyboardEvent keyboardEvent(event);
+
+ if (frame->eventHandler()->keyEvent(keyboardEvent))
+ return TRUE;
+
+ /* Chain up to our parent class for binding activation */
+ return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->key_release_event(widget, event);
+}
+
+static gboolean webkit_web_view_button_press_event(GtkWidget* widget, GdkEventButton* event)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ Frame* frame = core(webView)->mainFrame();
+
+ // FIXME: need to keep track of subframe focus for key events
+ gtk_widget_grab_focus(widget);
+
+ if (event->button == 3)
+ return webkit_web_view_forward_context_menu_event(webView, PlatformMouseEvent(event));
+
+ return frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));
+}
+
+static gboolean webkit_web_view_button_release_event(GtkWidget* widget, GdkEventButton* event)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+ WebKitWebViewPrivate* priv = webView->priv;
+ Frame* focusedFrame = core(webView)->focusController()->focusedFrame();
+
+ if (focusedFrame && focusedFrame->editor()->canEdit()) {
+ GdkWindow* window = gtk_widget_get_parent_window(widget);
+ gtk_im_context_set_client_window(priv->imContext, window);
+#ifdef MAEMO_CHANGES
+ hildon_gtk_im_context_filter_event(priv->imContext, (GdkEvent*)event);
+ hildon_gtk_im_context_show(priv->imContext);
+#endif
+ }
+
+ return focusedFrame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event));
+}
+
+static gboolean webkit_web_view_motion_event(GtkWidget* widget, GdkEventMotion* event)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ Frame* frame = core(webView)->mainFrame();
+ return frame->eventHandler()->mouseMoved(PlatformMouseEvent(event));
+}
+
+static gboolean webkit_web_view_scroll_event(GtkWidget* widget, GdkEventScroll* event)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ Frame* frame = core(webView)->mainFrame();
+ PlatformWheelEvent wheelEvent(event);
+ return frame->eventHandler()->handleWheelEvent(wheelEvent);
+}
+
+static void webkit_web_view_size_allocate(GtkWidget* widget, GtkAllocation* allocation)
+{
+ GTK_WIDGET_CLASS(webkit_web_view_parent_class)->size_allocate(widget,allocation);
+
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ Frame* frame = core(webView)->mainFrame();
+ frame->view()->resize(allocation->width, allocation->height);
+ frame->forceLayout();
+ frame->view()->adjustViewSize();
+}
+
+static gboolean webkit_web_view_focus_in_event(GtkWidget* widget, GdkEventFocus* event)
+{
+ // TODO: Improve focus handling as suggested in
+ // http://bugs.webkit.org/show_bug.cgi?id=16910
+ GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
+ if (GTK_WIDGET_TOPLEVEL(toplevel) && gtk_window_has_toplevel_focus(GTK_WINDOW(toplevel))) {
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(widget);
+
+ Frame* frame = core(webView)->mainFrame();
+ core(webView)->focusController()->setActive(frame);
+ }
+ return GTK_WIDGET_CLASS(webkit_web_view_parent_class)->focus_in_event(widget, event);
+}
+
+static void webkit_web_view_realize(GtkWidget* widget)
+{
+ GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+
+ GdkWindowAttr attributes;
+ attributes.window_type = GDK_WINDOW_CHILD;
+ attributes.x = widget->allocation.x;
+ attributes.y = widget->allocation.y;
+ attributes.width = widget->allocation.width;
+ attributes.height = widget->allocation.height;
+ attributes.wclass = GDK_INPUT_OUTPUT;
+ attributes.visual = gtk_widget_get_visual (widget);
+ attributes.colormap = gtk_widget_get_colormap (widget);
+ attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK
+ | GDK_EXPOSURE_MASK
+ | GDK_BUTTON_PRESS_MASK
+ | GDK_BUTTON_RELEASE_MASK
+ | GDK_POINTER_MOTION_MASK
+ | GDK_KEY_PRESS_MASK
+ | GDK_KEY_RELEASE_MASK
+ | GDK_BUTTON_MOTION_MASK
+ | GDK_BUTTON1_MOTION_MASK
+ | GDK_BUTTON2_MOTION_MASK
+ | GDK_BUTTON3_MOTION_MASK;
+
+ gint attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+ widget->window = gdk_window_new(gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
+ gdk_window_set_user_data(widget->window, widget);
+
+ widget->style = gtk_style_attach(widget->style, widget->window);
+ gdk_window_set_background(widget->window, &widget->style->base[GTK_WIDGET_STATE(widget)]);
+}
+
+static void webkit_web_view_set_scroll_adjustments(WebKitWebView* webView, GtkAdjustment* hadj, GtkAdjustment* vadj)
+{
+ FrameView* view = core(webkit_web_view_get_main_frame(webView))->view();
+ view->setGtkAdjustments(hadj, vadj);
+}
+
+static void webkit_web_view_container_add(GtkContainer* container, GtkWidget* widget)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(container);
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ priv->children.add(widget);
+ if (GTK_WIDGET_REALIZED(container))
+ gtk_widget_set_parent_window(widget, GTK_WIDGET(webView)->window);
+ gtk_widget_set_parent(widget, GTK_WIDGET(container));
+}
+
+static void webkit_web_view_container_remove(GtkContainer* container, GtkWidget* widget)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(container);
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ if (priv->children.contains(widget)) {
+ gtk_widget_unparent(widget);
+ priv->children.remove(widget);
+ }
+}
+
+static void webkit_web_view_container_forall(GtkContainer* container, gboolean, GtkCallback callback, gpointer callbackData)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(container);
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ HashSet<GtkWidget*> children = priv->children;
+ HashSet<GtkWidget*>::const_iterator end = children.end();
+ for (HashSet<GtkWidget*>::const_iterator current = children.begin(); current != end; ++current)
+ (*callback)(*current, callbackData);
+}
+
+static WebKitWebView* webkit_web_view_real_create_web_view(WebKitWebView*)
+{
+ notImplemented();
+ return 0;
+}
+
+static WebKitNavigationResponse webkit_web_view_real_navigation_requested(WebKitWebView*, WebKitWebFrame* frame, WebKitNetworkRequest*)
+{
+ notImplemented();
+ return WEBKIT_NAVIGATION_RESPONSE_ACCEPT;
+}
+
+static void webkit_web_view_real_window_object_cleared(WebKitWebView*, WebKitWebFrame*, JSGlobalContextRef context, JSObjectRef window_object)
+{
+ notImplemented();
+}
+
+static gchar* webkit_web_view_real_choose_file(WebKitWebView*, WebKitWebFrame*, const gchar* old_name)
+{
+ notImplemented();
+ return g_strdup(old_name);
+}
+
+typedef enum {
+ WEBKIT_SCRIPT_DIALOG_ALERT,
+ WEBKIT_SCRIPT_DIALOG_CONFIRM,
+ WEBKIT_SCRIPT_DIALOG_PROMPT
+ } WebKitScriptDialogType;
+
+static gboolean webkit_web_view_script_dialog(WebKitWebView* webView, WebKitWebFrame* frame, const gchar* message, WebKitScriptDialogType type, const gchar* defaultValue, gchar** value)
+{
+ GtkMessageType messageType;
+ GtkButtonsType buttons;
+ gint defaultResponse;
+ GtkWidget* window;
+ GtkWidget* dialog;
+ GtkWidget* entry = 0;
+ gboolean didConfirm = FALSE;
+
+ switch (type) {
+ case WEBKIT_SCRIPT_DIALOG_ALERT:
+ messageType = GTK_MESSAGE_WARNING;
+ buttons = GTK_BUTTONS_CLOSE;
+ defaultResponse = GTK_RESPONSE_CLOSE;
+ break;
+ case WEBKIT_SCRIPT_DIALOG_CONFIRM:
+ messageType = GTK_MESSAGE_QUESTION;
+ buttons = GTK_BUTTONS_YES_NO;
+ defaultResponse = GTK_RESPONSE_YES;
+ break;
+ case WEBKIT_SCRIPT_DIALOG_PROMPT:
+ messageType = GTK_MESSAGE_QUESTION;
+ buttons = GTK_BUTTONS_OK_CANCEL;
+ defaultResponse = GTK_RESPONSE_OK;
+ break;
+ default:
+ g_warning("Unknown value for WebKitScriptDialogType.");
+ return FALSE;
+ }
+
+ window = gtk_widget_get_toplevel(GTK_WIDGET(webView));
+ dialog = gtk_message_dialog_new(GTK_WIDGET_TOPLEVEL(window) ? GTK_WINDOW(window) : 0, GTK_DIALOG_DESTROY_WITH_PARENT, messageType, buttons, "%s", message);
+ gchar* title = g_strconcat("JavaScript - ", webkit_web_frame_get_uri(frame), NULL);
+ gtk_window_set_title(GTK_WINDOW(dialog), title);
+ g_free(title);
+
+ if (type == WEBKIT_SCRIPT_DIALOG_PROMPT) {
+ entry = gtk_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(entry), defaultValue);
+ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), entry);
+ gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
+ gtk_widget_show(entry);
+ }
+
+ gtk_dialog_set_default_response(GTK_DIALOG(dialog), defaultResponse);
+ gint response = gtk_dialog_run(GTK_DIALOG(dialog));
+
+ switch (response) {
+ case GTK_RESPONSE_YES:
+ didConfirm = TRUE;
+ break;
+ case GTK_RESPONSE_OK:
+ didConfirm = TRUE;
+ if (entry)
+ *value = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
+ else
+ *value = 0;
+ break;
+ case GTK_RESPONSE_NO:
+ case GTK_RESPONSE_CANCEL:
+ didConfirm = FALSE;
+ break;
+
+ }
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+ return didConfirm;
+}
+
+static gboolean webkit_web_view_real_script_alert(WebKitWebView* webView, WebKitWebFrame* frame, const gchar* message)
+{
+ webkit_web_view_script_dialog(webView, frame, message, WEBKIT_SCRIPT_DIALOG_ALERT, 0, 0);
+ return TRUE;
+}
+
+static gboolean webkit_web_view_real_script_confirm(WebKitWebView* webView, WebKitWebFrame* frame, const gchar* message, gboolean* didConfirm)
+{
+ *didConfirm = webkit_web_view_script_dialog(webView, frame, message, WEBKIT_SCRIPT_DIALOG_CONFIRM, 0, 0);
+ return TRUE;
+}
+
+static gboolean webkit_web_view_real_script_prompt(WebKitWebView* webView, WebKitWebFrame* frame, const gchar* message, const gchar* defaultValue, gchar** value)
+{
+ if (!webkit_web_view_script_dialog(webView, frame, message, WEBKIT_SCRIPT_DIALOG_PROMPT, defaultValue, value))
+ *value = NULL;
+ return TRUE;
+}
+
+static gboolean webkit_web_view_real_console_message(WebKitWebView* webView, const gchar* message, unsigned int line, const gchar* sourceId)
+{
+ g_print("console message: %s @%d: %s\n", sourceId, line, message);
+ return TRUE;
+}
+
+static void webkit_web_view_real_select_all(WebKitWebView* webView)
+{
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ frame->editor()->command("SelectAll").execute();
+}
+
+static void webkit_web_view_real_cut_clipboard(WebKitWebView* webView)
+{
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ frame->editor()->command("Cut").execute();
+}
+
+static void webkit_web_view_real_copy_clipboard(WebKitWebView* webView)
+{
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ frame->editor()->command("Copy").execute();
+}
+
+static void webkit_web_view_real_paste_clipboard(WebKitWebView* webView)
+{
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ frame->editor()->command("Paste").execute();
+}
+
+static void webkit_web_view_finalize(GObject* object)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(object);
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ webkit_web_view_stop_loading(WEBKIT_WEB_VIEW(object));
+
+ core(priv->mainFrame)->loader()->detachChildren();
+ delete priv->corePage;
+
+ g_object_unref(priv->backForwardList);
+ g_object_unref(priv->webSettings);
+ g_object_unref(priv->mainFrame);
+ g_object_unref(priv->imContext);
+ gtk_target_list_unref(priv->copy_target_list);
+ gtk_target_list_unref(priv->paste_target_list);
+ delete priv->userAgent;
+
+ G_OBJECT_CLASS(webkit_web_view_parent_class)->finalize(object);
+}
+
+static gboolean webkit_navigation_request_handled(GSignalInvocationHint* ihint, GValue* returnAccu, const GValue* handlerReturn, gpointer dummy)
+{
+ gboolean continueEmission = TRUE;
+ int signalHandled = g_value_get_int(handlerReturn);
+ g_value_set_int(returnAccu, signalHandled);
+
+ if (signalHandled != WEBKIT_NAVIGATION_RESPONSE_ACCEPT)
+ continueEmission = FALSE;
+
+ return continueEmission;
+}
+
+static void webkit_web_view_class_init(WebKitWebViewClass* webViewClass)
+{
+ GtkBindingSet* binding_set;
+
+ webkit_init();
+
+ /*
+ * Signals
+ */
+
+ webkit_web_view_signals[NAVIGATION_REQUESTED] = g_signal_new("navigation-requested",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET (WebKitWebViewClass, navigation_requested),
+ webkit_navigation_request_handled,
+ NULL,
+ webkit_marshal_INT__OBJECT_OBJECT,
+ G_TYPE_INT, 2,
+ G_TYPE_OBJECT,
+ G_TYPE_OBJECT);
+
+ /**
+ * WebKitWebView::window-object-cleared:
+ * @web_view: the object on which the signal is emitted
+ * @frame: the #WebKitWebFrame to which @window_object belongs
+ * @context: the #JSGlobalContextRef holding the global object and other
+ * execution state; equivalent to the return value of
+ * webkit_web_frame_get_global_context(@frame)
+ *
+ * @window_object: the #JSObjectRef representing the frame's JavaScript
+ * window object
+ *
+ * Emitted when the JavaScript window object in a #WebKitWebFrame has been
+ * cleared in preparation for a new load. This is the preferred place to
+ * set custom properties on the window object using the JavaScriptCore API.
+ */
+ webkit_web_view_signals[WINDOW_OBJECT_CLEARED] = g_signal_new("window-object-cleared",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET (WebKitWebViewClass, window_object_cleared),
+ NULL,
+ NULL,
+ webkit_marshal_VOID__OBJECT_POINTER_POINTER,
+ G_TYPE_NONE, 3,
+ WEBKIT_TYPE_WEB_FRAME,
+ G_TYPE_POINTER,
+ G_TYPE_POINTER);
+
+ /**
+ * WebKitWebView::load-started:
+ * @web_view: the object on which the signal is emitted
+ * @frame: the frame going to do the load
+ *
+ * When a #WebKitWebFrame begins to load this signal is emitted.
+ */
+ webkit_web_view_signals[LOAD_STARTED] = g_signal_new("load-started",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ WEBKIT_TYPE_WEB_FRAME);
+
+ /**
+ * WebKitWebView::load-committed:
+ * @web_view: the object on which the signal is emitted
+ * @frame: the main frame that received the first data
+ *
+ * When a #WebKitWebFrame loaded the first data this signal is emitted.
+ */
+ webkit_web_view_signals[LOAD_COMMITTED] = g_signal_new("load-committed",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ WEBKIT_TYPE_WEB_FRAME);
+
+
+ /**
+ * WebKitWebView::load-progress-changed:
+ * @web_view: the #WebKitWebView
+ * @progress: the global progress
+ */
+ webkit_web_view_signals[LOAD_PROGRESS_CHANGED] = g_signal_new("load-progress-changed",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE, 1,
+ G_TYPE_INT);
+
+ webkit_web_view_signals[LOAD_FINISHED] = g_signal_new("load-finished",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ WEBKIT_TYPE_WEB_FRAME);
+
+ /**
+ * WebKitWebView::title-changed:
+ * @web_view: the object on which the signal is emitted
+ * @frame: the main frame
+ * @title: the new title
+ *
+ * When a #WebKitWebFrame changes the document title this signal is emitted.
+ */
+ webkit_web_view_signals[TITLE_CHANGED] = g_signal_new("title-changed",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ webkit_marshal_VOID__OBJECT_STRING,
+ G_TYPE_NONE, 2,
+ WEBKIT_TYPE_WEB_FRAME,
+ G_TYPE_STRING);
+
+ webkit_web_view_signals[HOVERING_OVER_LINK] = g_signal_new("hovering-over-link",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ webkit_marshal_VOID__STRING_STRING,
+ G_TYPE_NONE, 2,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+
+ /**
+ * WebKitWebView::populate-popup:
+ * @web_view: the object on which the signal is emitted
+ * @menu: the context menu
+ *
+ * When a context menu is about to be displayed this signal is emitted.
+ *
+ * Add menu items to #menu to extend the context menu.
+ */
+ webkit_web_view_signals[POPULATE_POPUP] = g_signal_new("populate-popup",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ GTK_TYPE_MENU);
+
+ webkit_web_view_signals[STATUS_BAR_TEXT_CHANGED] = g_signal_new("status-bar-text-changed",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
+
+ webkit_web_view_signals[ICOND_LOADED] = g_signal_new("icon-loaded",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ webkit_web_view_signals[SELECTION_CHANGED] = g_signal_new("selection-changed",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /**
+ * WebKitWebView::console-message:
+ * @web_view: the object on which the signal is emitted
+ * @message: the message text
+ * @line: the line where the error occured
+ * @source_id: the source id
+ * @return: TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
+ *
+ * A JavaScript console message was created.
+ */
+ webkit_web_view_signals[CONSOLE_MESSAGE] = g_signal_new("console-message",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, console_message),
+ g_signal_accumulator_true_handled,
+ NULL,
+ webkit_marshal_BOOLEAN__STRING_INT_STRING,
+ G_TYPE_BOOLEAN, 3,
+ G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING);
+
+ /**
+ * WebKitWebView::script-alert:
+ * @web_view: the object on which the signal is emitted
+ * @frame: the relevant frame
+ * @message: the message text
+ * @return: TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
+ *
+ * A JavaScript alert dialog was created.
+ */
+ webkit_web_view_signals[SCRIPT_ALERT] = g_signal_new("script-alert",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, script_alert),
+ g_signal_accumulator_true_handled,
+ NULL,
+ webkit_marshal_BOOLEAN__OBJECT_STRING,
+ G_TYPE_BOOLEAN, 2,
+ G_TYPE_OBJECT, G_TYPE_STRING);
+
+ /**
+ * WebKitWebView::script-confirm:
+ * @web_view: the object on which the signal is emitted
+ * @frame: the relevant frame
+ * @message: the message text
+ * @confirmed: whether the dialog has been confirmed
+ * @return: TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
+ *
+ * A JavaScript confirm dialog was created, providing Yes and No buttons.
+ */
+ webkit_web_view_signals[SCRIPT_CONFIRM] = g_signal_new("script-confirm",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, script_confirm),
+ g_signal_accumulator_true_handled,
+ NULL,
+ webkit_marshal_BOOLEAN__OBJECT_STRING_BOOLEAN,
+ G_TYPE_BOOLEAN, 3,
+ G_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_BOOLEAN);
+
+ /**
+ * WebKitWebView::script-prompt:
+ * @web_view: the object on which the signal is emitted
+ * @frame: the relevant frame
+ * @message: the message text
+ * @default: the default value
+ * @text: To be filled with the return value or NULL if the dialog was cancelled.
+ * @return: TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
+ *
+ * A JavaScript prompt dialog was created, providing an entry to input text.
+ */
+ webkit_web_view_signals[SCRIPT_PROMPT] = g_signal_new("script-prompt",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, script_prompt),
+ g_signal_accumulator_true_handled,
+ NULL,
+ webkit_marshal_BOOLEAN__OBJECT_STRING_STRING_STRING,
+ G_TYPE_BOOLEAN, 4,
+ G_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+
+ /**
+ * WebKitWebView::select-all:
+ * @web_view: the object which received the signal
+ *
+ * The ::select-all signal is a keybinding signal which gets emitted to
+ * select the complete contents of the text view.
+ *
+ * The default bindings for this signal is Ctrl-a.
+ */
+ webkit_web_view_signals[SELECT_ALL] = g_signal_new("select-all",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, select_all),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /**
+ * WebKitWebView::cut-clipboard:
+ * @web_view: the object which received the signal
+ *
+ * The ::cut-clipboard signal is a keybinding signal which gets emitted to
+ * cut the selection to the clipboard.
+ *
+ * The default bindings for this signal are Ctrl-x and Shift-Delete.
+ */
+ webkit_web_view_signals[CUT_CLIPBOARD] = g_signal_new("cut-clipboard",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, cut_clipboard),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /**
+ * WebKitWebView::copy-clipboard:
+ * @web_view: the object which received the signal
+ *
+ * The ::copy-clipboard signal is a keybinding signal which gets emitted to
+ * copy the selection to the clipboard.
+ *
+ * The default bindings for this signal are Ctrl-c and Ctrl-Insert.
+ */
+ webkit_web_view_signals[COPY_CLIPBOARD] = g_signal_new("copy-clipboard",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, copy_clipboard),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /**
+ * WebKitWebView::paste-clipboard:
+ * @web_view: the object which received the signal
+ *
+ * The ::paste-clipboard signal is a keybinding signal which gets emitted to
+ * paste the contents of the clipboard into the Web view.
+ *
+ * The default bindings for this signal are Ctrl-v and Shift-Insert.
+ */
+ webkit_web_view_signals[PASTE_CLIPBOARD] = g_signal_new("paste-clipboard",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, paste_clipboard),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /*
+ * implementations of virtual methods
+ */
+ webViewClass->create_web_view = webkit_web_view_real_create_web_view;
+ webViewClass->navigation_requested = webkit_web_view_real_navigation_requested;
+ webViewClass->window_object_cleared = webkit_web_view_real_window_object_cleared;
+ webViewClass->choose_file = webkit_web_view_real_choose_file;
+ webViewClass->script_alert = webkit_web_view_real_script_alert;
+ webViewClass->script_confirm = webkit_web_view_real_script_confirm;
+ webViewClass->script_prompt = webkit_web_view_real_script_prompt;
+ webViewClass->console_message = webkit_web_view_real_console_message;
+ webViewClass->select_all = webkit_web_view_real_select_all;
+ webViewClass->cut_clipboard = webkit_web_view_real_cut_clipboard;
+ webViewClass->copy_clipboard = webkit_web_view_real_copy_clipboard;
+ webViewClass->paste_clipboard = webkit_web_view_real_paste_clipboard;
+
+ GObjectClass* objectClass = G_OBJECT_CLASS(webViewClass);
+ objectClass->finalize = webkit_web_view_finalize;
+ objectClass->get_property = webkit_web_view_get_property;
+ objectClass->set_property = webkit_web_view_set_property;
+
+ GtkWidgetClass* widgetClass = GTK_WIDGET_CLASS(webViewClass);
+ widgetClass->realize = webkit_web_view_realize;
+ widgetClass->expose_event = webkit_web_view_expose_event;
+ widgetClass->key_press_event = webkit_web_view_key_press_event;
+ widgetClass->key_release_event = webkit_web_view_key_release_event;
+ widgetClass->button_press_event = webkit_web_view_button_press_event;
+ widgetClass->button_release_event = webkit_web_view_button_release_event;
+ widgetClass->motion_notify_event = webkit_web_view_motion_event;
+ widgetClass->scroll_event = webkit_web_view_scroll_event;
+ widgetClass->size_allocate = webkit_web_view_size_allocate;
+ widgetClass->popup_menu = webkit_web_view_popup_menu_handler;
+ widgetClass->focus_in_event = webkit_web_view_focus_in_event;
+
+ GtkContainerClass* containerClass = GTK_CONTAINER_CLASS(webViewClass);
+ containerClass->add = webkit_web_view_container_add;
+ containerClass->remove = webkit_web_view_container_remove;
+ containerClass->forall = webkit_web_view_container_forall;
+
+ /*
+ * make us scrollable (e.g. addable to a GtkScrolledWindow)
+ */
+ webViewClass->set_scroll_adjustments = webkit_web_view_set_scroll_adjustments;
+ GTK_WIDGET_CLASS(webViewClass)->set_scroll_adjustments_signal = g_signal_new("set-scroll-adjustments",
+ G_TYPE_FROM_CLASS(webViewClass),
+ (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+ G_STRUCT_OFFSET(WebKitWebViewClass, set_scroll_adjustments),
+ NULL, NULL,
+ webkit_marshal_VOID__OBJECT_OBJECT,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
+
+ /*
+ * Key bindings
+ */
+
+ binding_set = gtk_binding_set_by_class(webViewClass);
+
+ gtk_binding_entry_add_signal(binding_set, GDK_a, GDK_CONTROL_MASK,
+ "select_all", 0);
+
+ /* Cut/copy/paste */
+
+ gtk_binding_entry_add_signal(binding_set, GDK_x, GDK_CONTROL_MASK,
+ "cut_clipboard", 0);
+ gtk_binding_entry_add_signal(binding_set, GDK_c, GDK_CONTROL_MASK,
+ "copy_clipboard", 0);
+ gtk_binding_entry_add_signal(binding_set, GDK_v, GDK_CONTROL_MASK,
+ "paste_clipboard", 0);
+
+ gtk_binding_entry_add_signal(binding_set, GDK_Delete, GDK_SHIFT_MASK,
+ "cut_clipboard", 0);
+ gtk_binding_entry_add_signal(binding_set, GDK_Insert, GDK_CONTROL_MASK,
+ "copy_clipboard", 0);
+ gtk_binding_entry_add_signal(binding_set, GDK_Insert, GDK_SHIFT_MASK,
+ "paste_clipboard", 0);
+
+ /*
+ * properties
+ */
+ g_object_class_install_property(objectClass, PROP_COPY_TARGET_LIST,
+ g_param_spec_boxed("copy-target-list",
+ "Target list",
+ "The list of targets this Web view supports for copying to the clipboard",
+ GTK_TYPE_TARGET_LIST,
+ WEBKIT_PARAM_READABLE));
+
+ g_object_class_install_property(objectClass, PROP_PASTE_TARGET_LIST,
+ g_param_spec_boxed("paste-target-list",
+ "Target list",
+ "The list of targets this Web view supports for pasting to the clipboard",
+ GTK_TYPE_TARGET_LIST,
+ WEBKIT_PARAM_READABLE));
+
+ g_object_class_install_property(objectClass, PROP_SETTINGS,
+ g_param_spec_object("settings",
+ "Settings",
+ "An associated WebKitWebSettings instance",
+ WEBKIT_TYPE_WEB_SETTINGS,
+ WEBKIT_PARAM_READWRITE));
+
+ g_object_class_install_property(objectClass, PROP_EDITABLE,
+ g_param_spec_boolean("editable",
+ "Editable",
+ "Whether content can be modified by the user",
+ FALSE,
+ WEBKIT_PARAM_READWRITE));
+
+ g_object_class_install_property(objectClass, PROP_TRANSPARENT,
+ g_param_spec_boolean("transparent",
+ "Transparent",
+ "Whether content has a transparent background",
+ FALSE,
+ WEBKIT_PARAM_READWRITE));
+
+ g_type_class_add_private(webViewClass, sizeof(WebKitWebViewPrivate));
+}
+
+static void webkit_web_view_screen_changed(WebKitWebView* webView, GdkScreen* previousScreen, gpointer userdata)
+{
+ WebKitWebViewPrivate* priv = webView->priv;
+ WebKitWebSettings* webSettings = priv->webSettings;
+ Settings* settings = core(webView)->settings();
+
+ guint defaultFontSize, defaultMonospaceFontSize, minimumFontSize, minimumLogicalFontSize;
+
+ g_object_get(G_OBJECT(webSettings),
+ "default-font-size", &defaultFontSize,
+ "default-monospace-font-size", &defaultMonospaceFontSize,
+ "minimum-font-size", &minimumFontSize,
+ "minimum-logical-font-size", &minimumLogicalFontSize,
+ NULL);
+
+ gdouble DPI = defaultDPI;
+#if GTK_CHECK_VERSION(2,10,0)
+ GdkScreen* screen = gtk_widget_has_screen(GTK_WIDGET(webView)) ? gtk_widget_get_screen(GTK_WIDGET(webView)) : gdk_screen_get_default();
+ if (screen) {
+ DPI = gdk_screen_get_resolution(screen);
+ // gdk_screen_get_resolution() returns -1 when no DPI is set.
+ if (DPI == -1)
+ DPI = defaultDPI;
+ }
+#endif
+ ASSERT(DPI > 0);
+ settings->setDefaultFontSize(defaultFontSize / 72.0 * DPI);
+ settings->setDefaultFixedFontSize(defaultMonospaceFontSize / 72.0 * DPI);
+ settings->setMinimumFontSize(minimumFontSize / 72.0 * DPI);
+ settings->setMinimumLogicalFontSize(minimumLogicalFontSize / 72.0 * DPI);
+}
+
+static void webkit_web_view_update_settings(WebKitWebView* webView)
+{
+ WebKitWebViewPrivate* priv = webView->priv;
+ WebKitWebSettings* webSettings = priv->webSettings;
+ Settings* settings = core(webView)->settings();
+
+ gchar* defaultEncoding, *cursiveFontFamily, *defaultFontFamily, *fantasyFontFamily, *monospaceFontFamily, *sansSerifFontFamily, *serifFontFamily, *userStylesheetUri;
+ gboolean autoLoadImages, autoShrinkImages, printBackgrounds, enableScripts, enablePlugins, resizableTextAreas;
+
+ g_object_get(G_OBJECT(webSettings),
+ "default-encoding", &defaultEncoding,
+ "cursive-font-family", &cursiveFontFamily,
+ "default-font-family", &defaultFontFamily,
+ "fantasy-font-family", &fantasyFontFamily,
+ "monospace-font-family", &monospaceFontFamily,
+ "sans-serif-font-family", &sansSerifFontFamily,
+ "serif-font-family", &serifFontFamily,
+ "auto-load-images", &autoLoadImages,
+ "auto-shrink-images", &autoShrinkImages,
+ "print-backgrounds", &printBackgrounds,
+ "enable-scripts", &enableScripts,
+ "enable-plugins", &enablePlugins,
+ "resizable-text-areas", &resizableTextAreas,
+ "user-stylesheet-uri", &userStylesheetUri,
+ NULL);
+
+ settings->setDefaultTextEncodingName(defaultEncoding);
+ settings->setCursiveFontFamily(cursiveFontFamily);
+ settings->setStandardFontFamily(defaultFontFamily);
+ settings->setFantasyFontFamily(fantasyFontFamily);
+ settings->setFixedFontFamily(monospaceFontFamily);
+ settings->setSansSerifFontFamily(sansSerifFontFamily);
+ settings->setSerifFontFamily(serifFontFamily);
+ settings->setLoadsImagesAutomatically(autoLoadImages);
+ settings->setShrinksStandaloneImagesToFit(autoShrinkImages);
+ settings->setShouldPrintBackgrounds(printBackgrounds);
+ settings->setJavaScriptEnabled(enableScripts);
+ settings->setPluginsEnabled(enablePlugins);
+ settings->setTextAreasAreResizable(resizableTextAreas);
+ settings->setUserStyleSheetLocation(KURL(userStylesheetUri));
+
+ g_free(defaultEncoding);
+ g_free(cursiveFontFamily);
+ g_free(defaultFontFamily);
+ g_free(fantasyFontFamily);
+ g_free(monospaceFontFamily);
+ g_free(sansSerifFontFamily);
+ g_free(serifFontFamily);
+ g_free(userStylesheetUri);
+
+ webkit_web_view_screen_changed(webView, NULL, NULL);
+}
+
+static void webkit_web_view_settings_notify(WebKitWebSettings* webSettings, GParamSpec* pspec, WebKitWebView* webView)
+{
+ Settings* settings = core(webView)->settings();
+
+ const gchar* name = g_intern_string(pspec->name);
+ GValue value = {0, 0};
+ g_value_init(&value, pspec->value_type);
+ g_object_get_property(G_OBJECT(webSettings), name, &value);
+
+ if (name == g_intern_string("default-encoding"))
+ settings->setDefaultTextEncodingName(g_value_get_string(&value));
+ else if (name == g_intern_string("cursive-font-family"))
+ settings->setCursiveFontFamily(g_value_get_string(&value));
+ else if (name == g_intern_string("default-font-family"))
+ settings->setStandardFontFamily(g_value_get_string(&value));
+ else if (name == g_intern_string("fantasy-font-family"))
+ settings->setFantasyFontFamily(g_value_get_string(&value));
+ else if (name == g_intern_string("monospace-font-family"))
+ settings->setFixedFontFamily(g_value_get_string(&value));
+ else if (name == g_intern_string("sans-serif-font-family"))
+ settings->setSansSerifFontFamily(g_value_get_string(&value));
+ else if (name == g_intern_string("serif-font-family"))
+ settings->setSerifFontFamily(g_value_get_string(&value));
+ else if (name == g_intern_string("default-font-size"))
+ settings->setDefaultFontSize(g_value_get_int(&value));
+ else if (name == g_intern_string("default-monospace-font-size"))
+ settings->setDefaultFixedFontSize(g_value_get_int(&value));
+ else if (name == g_intern_string("minimum-font-size"))
+ settings->setMinimumFontSize(g_value_get_int(&value));
+ else if (name == g_intern_string("minimum-logical-font-size"))
+ settings->setMinimumLogicalFontSize(g_value_get_int(&value));
+ else if (name == g_intern_string("auto-load-images"))
+ settings->setLoadsImagesAutomatically(g_value_get_boolean(&value));
+ else if (name == g_intern_string("auto-shrink-images"))
+ settings->setShrinksStandaloneImagesToFit(g_value_get_boolean(&value));
+ else if (name == g_intern_string("print-backgrounds"))
+ settings->setShouldPrintBackgrounds(g_value_get_boolean(&value));
+ else if (name == g_intern_string("enable-scripts"))
+ settings->setJavaScriptEnabled(g_value_get_boolean(&value));
+ else if (name == g_intern_string("enable-plugins"))
+ settings->setPluginsEnabled(g_value_get_boolean(&value));
+ else if (name == g_intern_string("resizable-text-areas"))
+ settings->setTextAreasAreResizable(g_value_get_boolean(&value));
+ else if (name == g_intern_string("user-stylesheet-uri"))
+ settings->setUserStyleSheetLocation(KURL(g_value_get_string(&value)));
+ else
+ g_warning("Unexpected setting '%s'", name);
+ g_value_unset(&value);
+}
+
+static void webkit_web_view_init(WebKitWebView* webView)
+{
+ WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
+ webView->priv = priv;
+
+ priv->imContext = gtk_im_multicontext_new();
+ priv->corePage = new Page(new WebKit::ChromeClient(webView), new WebKit::ContextMenuClient, new WebKit::EditorClient(webView), new WebKit::DragClient, new WebKit::InspectorClient);
+
+ GTK_WIDGET_SET_FLAGS(webView, GTK_CAN_FOCUS);
+ priv->mainFrame = WEBKIT_WEB_FRAME(webkit_web_frame_new(webView));
+ priv->lastPopupXPosition = priv->lastPopupYPosition = -1;
+ priv->editable = false;
+
+ priv->backForwardList = webkit_web_back_forward_list_new_with_web_view(webView);
+
+#if GTK_CHECK_VERSION(2,10,0)
+ GdkAtom textHtml = gdk_atom_intern_static_string("text/html");
+#else
+ GdkAtom textHtml = gdk_atom_intern("text/html", false);
+#endif
+ /* Targets for copy */
+ priv->copy_target_list = gtk_target_list_new(NULL, 0);
+ gtk_target_list_add(priv->copy_target_list, textHtml, 0, WEBKIT_WEB_VIEW_TARGET_INFO_HTML);
+ gtk_target_list_add_text_targets(priv->copy_target_list, WEBKIT_WEB_VIEW_TARGET_INFO_TEXT);
+
+ /* Targets for pasting */
+ priv->paste_target_list = gtk_target_list_new(NULL, 0);
+ gtk_target_list_add(priv->paste_target_list, textHtml, 0, WEBKIT_WEB_VIEW_TARGET_INFO_HTML);
+ gtk_target_list_add_text_targets(priv->paste_target_list, WEBKIT_WEB_VIEW_TARGET_INFO_TEXT);
+
+ priv->webSettings = webkit_web_settings_new();
+ webkit_web_view_update_settings(webView);
+ g_signal_connect(webView, "screen-changed", G_CALLBACK(webkit_web_view_screen_changed), NULL);
+ g_signal_connect(priv->webSettings, "notify", G_CALLBACK(webkit_web_view_settings_notify), webView);
+}
+
+GtkWidget* webkit_web_view_new(void)
+{
+ WebKitWebView* webView = WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW, NULL));
+
+ return GTK_WIDGET(webView);
+}
+
+void webkit_web_view_set_settings(WebKitWebView* webView, WebKitWebSettings* webSettings)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+ g_return_if_fail(WEBKIT_IS_WEB_SETTINGS(webSettings));
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ g_signal_handlers_disconnect_by_func(priv->webSettings, (gpointer)webkit_web_view_settings_notify, webView);
+ g_object_unref(priv->webSettings);
+ g_object_ref(webSettings);
+ priv->webSettings = webSettings;
+ webkit_web_view_update_settings(webView);
+ g_signal_connect(webSettings, "notify", G_CALLBACK(webkit_web_view_settings_notify), webView);
+}
+
+WebKitWebSettings* webkit_web_view_get_settings(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ return priv->webSettings;
+}
+
+/**
+ * webkit_web_view_set_maintains_back_forward_list:
+ * @webView: a #WebKitWebView
+ * @flag: to tell the view to maintain a back or forward list
+ *
+ * Set the view to maintain a back or forward list of history items.
+ */
+void webkit_web_view_set_maintains_back_forward_list(WebKitWebView* webView, gboolean flag)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ core(webView)->backForwardList()->setEnabled(flag);
+}
+
+/**
+ * webkit_web_view_get_back_forward_list:
+ * @webView: a #WebKitWebView
+ *
+ * Returns a #WebKitWebBackForwardList
+ *
+ * Return value: the #WebKitWebBackForwardList
+ */
+WebKitWebBackForwardList* webkit_web_view_get_back_forward_list(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ if (!core(webView) || !core(webView)->backForwardList()->enabled())
+ return NULL;
+
+ return priv->backForwardList;
+}
+
+/**
+ * webkit_web_view_go_to_back_forward_item:
+ * @webView: a #WebKitWebView
+ * @item: a #WebKitWebHistoryItem*
+ *
+ * Go to the specified #WebKitWebHistoryItem
+ *
+ * Return value: %TRUE if loading of item is successful, %FALSE if not
+ */
+gboolean webkit_web_view_go_to_back_forward_item(WebKitWebView* webView, WebKitWebHistoryItem* item)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+ g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(item), FALSE);
+
+ // FIXME: This always returns TRUE
+ core(webView)->goToItem(core(item), FrameLoadTypeIndexedBackForward);
+ return TRUE;
+}
+
+/**
+ * webkit_web_view_go_backward:
+ * @webView: the #WebKitWebView
+ *
+ * @Deprecated: Use webkit_web_view_go_back() instead.
+ *
+ * Go to the previous page, if there's any.
+ */
+void webkit_web_view_go_backward(WebKitWebView* webView)
+{
+ g_warning("webkit_web_view_go_backward() is obsolete; use webkit_web_view_go_back()");
+ webkit_web_view_go_back(webView);
+}
+
+/**
+ * webkit_web_view_go_back:
+ * @web_view: a #WebKitWebView
+ *
+ * Loads the previous history item.
+ */
+void webkit_web_view_go_back(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ core(webView)->goBack();
+}
+
+/**
+ * webkit_web_view_go_back_or_forward:
+ * @web_view: a #WebKitWebView
+ * @steps: the number of steps
+ *
+ * Loads the history item that is the number of @steps away from the current
+ * item. Negative values represent steps backward while positive values
+ * represent steps forward.
+ */
+void webkit_web_view_go_back_or_forward(WebKitWebView* webView, gint steps)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ Frame* frame = core(webView)->mainFrame();
+ frame->loader()->goBackOrForward(steps);
+}
+
+/**
+ * webkit_web_view_go_forward:
+ * @web_view: a #WebKitWebView
+ *
+ * Loads the next history item.
+ */
+void webkit_web_view_go_forward(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ core(webView)->goForward();
+}
+
+/**
+ * webkit_web_view_can_go_backward:
+ * @webView: the #WebKitWebView
+ *
+ * Checks whether the view can go back to the previous page
+ *
+ * @Deprecated: Use webkit_web_view_can_go_back() instead.
+ *
+ * Return value: %TRUE if the page can go back, otherwise returns %FALSE
+ */
+gboolean webkit_web_view_can_go_backward(WebKitWebView* webView)
+{
+ g_warning("webkit_web_view_can_go_backward() is obsolete; use webkit_web_view_can_go_back()");
+ return webkit_web_view_can_go_back(webView);
+}
+
+/**
+ * webkit_web_view_can_go_back:
+ * @web_view: a #WebKitWebView
+ *
+ * Determines whether #web_view has a previous history item.
+ *
+ * Return value: %TRUE if able to move back, %FALSE otherwise
+ */
+gboolean webkit_web_view_can_go_back(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ if (!core(webView) || !core(webView)->backForwardList()->backItem())
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * webkit_web_view_can_go_back_or_forward:
+ * @web_view: a #WebKitWebView
+ * @steps: the number of steps
+ *
+ * Determines whether #web_view has a history item of @steps. Negative values
+ * represent steps backward while positive values represent steps forward.
+ *
+ * Return value: %TRUE if able to move back or forward the given number of
+ * steps, %FALSE otherwise
+ */
+gboolean webkit_web_view_can_go_back_or_forward(WebKitWebView* webView, gint steps)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ Frame* frame = core(webView)->mainFrame();
+ return frame->loader()->canGoBackOrForward(steps);
+}
+
+/**
+ * webkit_web_view_can_go_forward:
+ * @web_view: a #WebKitWebView
+ *
+ * Determines whether #web_view has a next history item.
+ *
+ * Return value: %TRUE if able to move forward, %FALSE otherwise
+ */
+gboolean webkit_web_view_can_go_forward(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ Page* page = core(webView);
+
+ if (!page)
+ return FALSE;
+
+ if (!page->backForwardList()->forwardItem())
+ return FALSE;
+
+ return TRUE;
+}
+
+void webkit_web_view_open(WebKitWebView* webView, const gchar* uri)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+ g_return_if_fail(uri);
+
+ Frame* frame = core(webView)->mainFrame();
+ frame->loader()->load(ResourceRequest(KURL(String::fromUTF8(uri))));
+}
+
+void webkit_web_view_reload(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ core(webView)->mainFrame()->loader()->reload();
+}
+
+void webkit_web_view_load_string(WebKitWebView* webView, const gchar* content, const gchar* contentMimeType, const gchar* contentEncoding, const gchar* baseUri)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+ g_return_if_fail(content);
+
+ Frame* frame = core(webView)->mainFrame();
+
+ KURL url(baseUri ? String::fromUTF8(baseUri) : "");
+ RefPtr<SharedBuffer> sharedBuffer = new SharedBuffer(strdup(content), strlen(content));
+ SubstituteData substituteData(sharedBuffer.release(), contentMimeType ? String(contentMimeType) : "text/html", contentEncoding ? String(contentEncoding) : "UTF-8", KURL("about:blank"), url);
+
+ frame->loader()->load(ResourceRequest(url), substituteData);
+}
+
+void webkit_web_view_load_html_string(WebKitWebView* webView, const gchar* content, const gchar* baseUri)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+ g_return_if_fail(content);
+
+ webkit_web_view_load_string(webView, content, NULL, NULL, baseUri);
+}
+
+void webkit_web_view_stop_loading(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ Frame* frame = core(webView)->mainFrame();
+
+ if (FrameLoader* loader = frame->loader())
+ loader->stopAllLoaders();
+}
+
+/**
+ * webkit_web_view_search_text:
+ * @web_view: a #WebKitWebView
+ * @text: a string to look for
+ * @forward: whether to find forward or not
+ * @case_sensitive: whether to respect the case of text
+ * @wrap: whether to continue looking at the beginning after reaching the end
+ *
+ * Looks for a specified string inside #web_view.
+ *
+ * Return value: %TRUE on success or %FALSE on failure
+ */
+gboolean webkit_web_view_search_text(WebKitWebView* webView, const gchar* string, gboolean caseSensitive, gboolean forward, gboolean shouldWrap)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+ g_return_val_if_fail(string, FALSE);
+
+ TextCaseSensitivity caseSensitivity = caseSensitive ? TextCaseSensitive : TextCaseInsensitive;
+ FindDirection direction = forward ? FindDirectionForward : FindDirectionBackward;
+
+ return core(webView)->findString(String::fromUTF8(string), caseSensitivity, direction, shouldWrap);
+}
+
+/**
+ * webkit_web_view_mark_text_matches:
+ * @web_view: a #WebKitWebView
+ * @string: a string to look for
+ * @case_sensitive: whether to respect the case of text
+ * @limit: the maximum number of strings to look for or %0 for all
+ *
+ * Attempts to highlight all occurances of #string inside #web_view.
+ *
+ * Return value: the number of strings highlighted
+ */
+guint webkit_web_view_mark_text_matches(WebKitWebView* webView, const gchar* string, gboolean caseSensitive, guint limit)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+ g_return_val_if_fail(string, 0);
+
+ TextCaseSensitivity caseSensitivity = caseSensitive ? TextCaseSensitive : TextCaseInsensitive;
+
+ return core(webView)->markAllMatchesForText(String::fromUTF8(string), caseSensitivity, false, limit);
+}
+
+/**
+ * webkit_web_view_set_highlight_text_matches:
+ * @web_view: a #WebKitWebView
+ * @highlight: whether to highlight text matches
+ *
+ * Highlights text matches previously marked by webkit_web_view_mark_text_matches.
+ */
+void webkit_web_view_set_highlight_text_matches(WebKitWebView* webView, gboolean shouldHighlight)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ core(webView)->mainFrame()->setMarkedTextMatchesAreHighlighted(shouldHighlight);
+}
+
+/**
+ * webkit_web_view_unmark_text_matches:
+ * @web_view: a #WebKitWebView
+ *
+ * Removes highlighting previously set by webkit_web_view_mark_text_matches.
+ */
+void webkit_web_view_unmark_text_matches(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ return core(webView)->unmarkAllTextMatches();
+}
+
+WebKitWebFrame* webkit_web_view_get_main_frame(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ return priv->mainFrame;
+}
+
+/**
+ * webkit_web_view_get_focused_frame:
+ * @web_view: a #WebKitWebView
+ *
+ * Returns the frame that has focus or an active text selection.
+ *
+ * Return value: The focused #WebKitWebFrame or %NULL if no frame is focused
+ */
+WebKitWebFrame* webkit_web_view_get_focused_frame(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ Frame* focusedFrame = core(webView)->focusController()->focusedFrame();
+ return kit(focusedFrame);
+}
+
+void webkit_web_view_execute_script(WebKitWebView* webView, const gchar* script)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+ g_return_if_fail(script);
+
+ if (FrameLoader* loader = core(webView)->mainFrame()->loader())
+ loader->executeScript(String::fromUTF8(script), true);
+}
+
+/**
+ * webkit_web_view_cut_clipboard:
+ * @web_view: a #WebKitWebView
+ *
+ * Determines whether or not it is currently possible to cut to the clipboard.
+ *
+ * Return value: %TRUE if a selection can be cut, %FALSE if not
+ */
+gboolean webkit_web_view_can_cut_clipboard(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ return frame->editor()->canCut() || frame->editor()->canDHTMLCut();
+}
+
+/**
+ * webkit_web_view_copy_clipboard:
+ * @web_view: a #WebKitWebView
+ *
+ * Determines whether or not it is currently possible to copy to the clipboard.
+ *
+ * Return value: %TRUE if a selection can be copied, %FALSE if not
+ */
+gboolean webkit_web_view_can_copy_clipboard(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ return frame->editor()->canCopy() || frame->editor()->canDHTMLCopy();
+}
+
+/**
+ * webkit_web_view_paste_clipboard:
+ * @web_view: a #WebKitWebView
+ *
+ * Determines whether or not it is currently possible to paste from the clipboard.
+ *
+ * Return value: %TRUE if a selection can be pasted, %FALSE if not
+ */
+gboolean webkit_web_view_can_paste_clipboard(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ return frame->editor()->canPaste() || frame->editor()->canDHTMLPaste();
+}
+
+/**
+ * webkit_web_view_cut_clipboard:
+ * @web_view: a #WebKitWebView
+ *
+ * Cuts the current selection inside the @web_view to the clipboard.
+ */
+void webkit_web_view_cut_clipboard(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ if (webkit_web_view_can_cut_clipboard(webView))
+ g_signal_emit(webView, webkit_web_view_signals[CUT_CLIPBOARD], 0);
+}
+
+/**
+ * webkit_web_view_copy_clipboard:
+ * @web_view: a #WebKitWebView
+ *
+ * Copies the current selection inside the @web_view to the clipboard.
+ */
+void webkit_web_view_copy_clipboard(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ if (webkit_web_view_can_copy_clipboard(webView))
+ g_signal_emit(webView, webkit_web_view_signals[COPY_CLIPBOARD], 0);
+}
+
+/**
+ * webkit_web_view_paste_clipboard:
+ * @web_view: a #WebKitWebView
+ *
+ * Pastes the current contents of the clipboard to the @web_view.
+ */
+void webkit_web_view_paste_clipboard(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ if (webkit_web_view_can_paste_clipboard(webView))
+ g_signal_emit(webView, webkit_web_view_signals[PASTE_CLIPBOARD], 0);
+}
+
+/**
+ * webkit_web_view_delete_selection:
+ * @web_view: a #WebKitWebView
+ *
+ * Deletes the current selection inside the @web_view.
+ */
+void webkit_web_view_delete_selection(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ frame->editor()->performDelete();
+}
+
+/**
+ * webkit_web_view_has_selection:
+ * @web_view: a #WebKitWebView
+ *
+ * Determines whether text was selected.
+ *
+ * Return value: %TRUE if there is selected text, %FALSE if not
+ */
+gboolean webkit_web_view_has_selection(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ return !core(webView)->selection().isNone();
+}
+
+/**
+ * webkit_web_view_get_selected_text:
+ * @web_view: a #WebKitWebView
+ *
+ * Retrieves the selected text if any.
+ *
+ * Return value: a newly allocated string with the selection or %NULL
+ */
+gchar* webkit_web_view_get_selected_text(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+
+ Frame* frame = core(webView)->focusController()->focusedOrMainFrame();
+ return g_strdup(frame->selectedText().utf8().data());
+}
+
+/**
+ * webkit_web_view_select_all:
+ * @web_view: a #WebKitWebView
+ *
+ * Attempts to select everything inside the @web_view.
+ */
+void webkit_web_view_select_all(WebKitWebView* webView)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ g_signal_emit(webView, webkit_web_view_signals[SELECT_ALL], 0);
+}
+
+/**
+ * webkit_web_view_get_editable:
+ * @web_view: a #WebKitWebView
+ *
+ * Returns whether the user is allowed to edit the document.
+ *
+ * Returns %TRUE if @web_view allows the user to edit the HTML document, %FALSE if
+ * it doesn't. You can change @web_view's document programmatically regardless of
+ * this setting.
+ *
+ * Return value: a #gboolean indicating the editable state
+ */
+gboolean webkit_web_view_get_editable(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), FALSE);
+
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ return priv->editable;
+}
+
+/**
+ * webkit_web_view_set_editable:
+ * @web_view: a #WebKitWebView
+ * @flag: a #gboolean indicating the editable state
+ *
+ * Sets whether @web_view allows the user to edit its HTML document.
+ *
+ * If @flag is %TRUE, @web_view allows the user to edit the document. If @flag is
+ * %FALSE, an element in @web_view's document can only be edited if the
+ * CONTENTEDITABLE attribute has been set on the element or one of its parent
+ * elements. You can change @web_view's document programmatically regardless of
+ * this setting. By default a #WebKitWebView is not editable.
+
+ * Normally, an HTML document is not editable unless the elements within the
+ * document are editable. This function provides a low-level way to make the
+ * contents of a #WebKitWebView editable without altering the document or DOM
+ * structure.
+ */
+void webkit_web_view_set_editable(WebKitWebView* webView, gboolean flag)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ WebKitWebViewPrivate* priv = webView->priv;
+
+ Frame* frame = core(webView)->mainFrame();
+ g_return_if_fail(frame);
+
+ // TODO: What happens when the frame is replaced?
+ flag = flag != FALSE;
+ if (flag == priv->editable)
+ return;
+
+ priv->editable = flag;
+
+ if (flag) {
+ frame->applyEditingStyleToBodyElement();
+ // TODO: If the WebKitWebView is made editable and the selection is empty, set it to something.
+ //if (!webkit_web_view_get_selected_dom_range(webView))
+ // mainFrame->setSelectionFromNone();
+ } else
+ frame->removeEditingStyleFromBodyElement();
+}
+
+/**
+ * webkit_web_view_get_copy_target_list:
+ * @web_view: a #WebKitWebView
+ *
+ * This function returns the list of targets this #WebKitWebView can
+ * provide for clipboard copying and as DND source. The targets in the list are
+ * added with %info values from the #WebKitWebViewTargetInfo enum,
+ * using gtk_target_list_add() and
+ * gtk_target_list_add_text_targets().
+ *
+ * Return value: the #GtkTargetList
+ **/
+GtkTargetList* webkit_web_view_get_copy_target_list(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ return priv->copy_target_list;
+}
+
+/**
+ * webkit_web_view_get_paste_target_list:
+ * @web_view: a #WebKitWebView
+ *
+ * This function returns the list of targets this #WebKitWebView can
+ * provide for clipboard pasting and as DND destination. The targets in the list are
+ * added with %info values from the #WebKitWebViewTargetInfo enum,
+ * using gtk_target_list_add() and
+ * gtk_target_list_add_text_targets().
+ *
+ * Return value: the #GtkTargetList
+ **/
+GtkTargetList* webkit_web_view_get_paste_target_list(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ return priv->paste_target_list;
+}
+
+/**
+ * webkit_web_view_get_transparent:
+ * @web_view: a #WebKitWebView
+ *
+ * Returns whether the #WebKitWebView has a transparent background.
+ *
+ * Return value: %FALSE when the #WebKitWebView draws a solid background
+ * (the default), otherwise %TRUE.
+ */
+gboolean webkit_web_view_get_transparent(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ return priv->transparent;
+}
+
+/**
+ * webkit_web_view_set_transparent:
+ * @web_view: a #WebKitWebView
+ *
+ * Sets whether the #WebKitWebView has a transparent background.
+ *
+ * Pass %FALSE to have the #WebKitWebView draw a solid background
+ * (the default), otherwise %TRUE.
+ */
+void webkit_web_view_set_transparent(WebKitWebView* webView, gboolean flag)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+
+ WebKitWebViewPrivate* priv = webView->priv;
+ priv->transparent = flag;
+
+ // TODO: This needs to be made persistent or it could become a problem when
+ // the main frame is replaced.
+ Frame* frame = core(webView)->mainFrame();
+ g_return_if_fail(frame);
+ frame->view()->setTransparent(flag);
+}
+
+}
diff --git a/WebKit/gtk/webkit/webkitwebview.h b/WebKit/gtk/webkit/webkitwebview.h
new file mode 100644
index 0000000..0c5a675
--- /dev/null
+++ b/WebKit/gtk/webkit/webkitwebview.h
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ * Copyright (C) 2007, 2008 Alp Toker <alp@atoker.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WEBKIT_WEB_VIEW_H
+#define WEBKIT_WEB_VIEW_H
+
+#include <gtk/gtk.h>
+#include <JavaScriptCore/JSBase.h>
+
+#include <webkit/webkitdefines.h>
+#include <webkit/webkitwebbackforwardlist.h>
+#include <webkit/webkitwebhistoryitem.h>
+#include <webkit/webkitwebsettings.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEB_VIEW (webkit_web_view_get_type())
+#define WEBKIT_WEB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_WEB_VIEW, WebKitWebView))
+#define WEBKIT_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_WEB_VIEW, WebKitWebViewClass))
+#define WEBKIT_IS_WEB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_WEB_VIEW))
+#define WEBKIT_IS_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_WEB_VIEW))
+#define WEBKIT_WEB_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_WEB_VIEW, WebKitWebViewClass))
+
+typedef struct _WebKitWebViewPrivate WebKitWebViewPrivate;
+
+typedef enum {
+ WEBKIT_NAVIGATION_RESPONSE_ACCEPT,
+ WEBKIT_NAVIGATION_RESPONSE_IGNORE,
+ WEBKIT_NAVIGATION_RESPONSE_DOWNLOAD
+} WebKitNavigationResponse;
+
+typedef enum
+{
+ WEBKIT_WEB_VIEW_TARGET_INFO_HTML = - 1,
+ WEBKIT_WEB_VIEW_TARGET_INFO_TEXT = - 2
+} WebKitWebViewTargetInfo;
+
+struct _WebKitWebView {
+ GtkContainer parent_instance;
+
+ WebKitWebViewPrivate* priv;
+};
+
+struct _WebKitWebViewClass {
+ GtkContainerClass parent_class;
+
+ /*
+ * default handler/virtual methods
+ * DISCUSS: create_web_view needs a request and should we make this a signal with default handler? this would
+ * require someone doing a g_signal_stop_emission_by_name
+ * WebUIDelegate has nothing for create_frame, WebPolicyDelegate as well...
+ */
+ WebKitWebView* (*create_web_view) (WebKitWebView* web_view);
+
+ /*
+ * TODO: FIXME: Create something like WebPolicyDecisionListener_Protocol instead
+ */
+ WebKitNavigationResponse (*navigation_requested) (WebKitWebView* web_view, WebKitWebFrame* frame, WebKitNetworkRequest* request);
+
+ void (*window_object_cleared) (WebKitWebView* web_view, WebKitWebFrame* frame, JSGlobalContextRef context, JSObjectRef window_object);
+ gchar* (*choose_file) (WebKitWebView* web_view, WebKitWebFrame* frame, const gchar* old_file);
+ gboolean (*script_alert) (WebKitWebView* web_view, WebKitWebFrame* frame, const gchar* alert_message);
+ gboolean (*script_confirm) (WebKitWebView* web_view, WebKitWebFrame* frame, const gchar* confirm_message, gboolean* did_confirm);
+ gboolean (*script_prompt) (WebKitWebView* web_view, WebKitWebFrame* frame, const gchar* message, const gchar* default_value, gchar** value);
+ gboolean (*console_message) (WebKitWebView* web_view, const gchar* message, unsigned int line_number, const gchar* source_id);
+ void (*select_all) (WebKitWebView* web_view);
+ void (*cut_clipboard) (WebKitWebView* web_view);
+ void (*copy_clipboard) (WebKitWebView* web_view);
+ void (*paste_clipboard) (WebKitWebView* web_view);
+
+ /*
+ * internal
+ */
+ void (*set_scroll_adjustments) (WebKitWebView*, GtkAdjustment*, GtkAdjustment*);
+};
+
+WEBKIT_API GType
+webkit_web_view_get_type (void);
+
+WEBKIT_API GtkWidget*
+webkit_web_view_new (void);
+
+WEBKIT_API void
+webkit_web_view_set_maintains_back_forward_list (WebKitWebView* web_view, gboolean flag);
+
+WEBKIT_API WebKitWebBackForwardList*
+webkit_web_view_get_back_forward_list (WebKitWebView* web_view);
+
+WEBKIT_API gboolean
+webkit_web_view_go_to_back_forward_item (WebKitWebView *web_view, WebKitWebHistoryItem* item);
+
+WEBKIT_API gboolean
+webkit_web_view_can_go_back (WebKitWebView* web_view);
+
+WEBKIT_API gboolean
+webkit_web_view_can_go_back_or_forward (WebKitWebView* web_view, gint steps);
+
+WEBKIT_API gboolean
+webkit_web_view_can_go_forward (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_go_back (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_go_back_or_forward (WebKitWebView* web_view, gint steps);
+
+WEBKIT_API void
+webkit_web_view_go_forward (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_stop_loading (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_open (WebKitWebView* web_view, const gchar* uri);
+
+WEBKIT_API void
+webkit_web_view_reload (WebKitWebView *web_view);
+
+WEBKIT_API void
+webkit_web_view_load_string (WebKitWebView* web_view, const gchar* content, const gchar* content_mime_type, const gchar* content_encoding, const gchar* base_uri);
+
+WEBKIT_API void
+webkit_web_view_load_html_string (WebKitWebView* web_view, const gchar* content, const gchar* base_uri);
+
+WEBKIT_API gboolean
+webkit_web_view_search_text (WebKitWebView* web_view, const gchar* string, gboolean case_sensitive, gboolean forward, gboolean wrap);
+
+WEBKIT_API guint
+webkit_web_view_mark_text_matches (WebKitWebView* web_view, const gchar* string, gboolean case_sensitive, guint limit);
+
+WEBKIT_API void
+webkit_web_view_set_highlight_text_matches (WebKitWebView* web_view, gboolean highlight);
+
+WEBKIT_API void
+webkit_web_view_unmark_text_matches (WebKitWebView* web_view);
+
+WEBKIT_API WebKitWebFrame*
+webkit_web_view_get_main_frame (WebKitWebView* web_view);
+
+WEBKIT_API WebKitWebFrame*
+webkit_web_view_get_focused_frame (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_execute_script (WebKitWebView* web_view, const gchar* script);
+
+WEBKIT_API gboolean
+webkit_web_view_can_cut_clipboard (WebKitWebView* web_view);
+
+WEBKIT_API gboolean
+webkit_web_view_can_copy_clipboard (WebKitWebView* web_view);
+
+WEBKIT_API gboolean
+webkit_web_view_can_paste_clipboard (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_cut_clipboard (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_copy_clipboard (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_paste_clipboard (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_delete_selection (WebKitWebView* web_view);
+
+WEBKIT_API gboolean
+webkit_web_view_has_selection (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_select_all (WebKitWebView* web_view);
+
+WEBKIT_API gboolean
+webkit_web_view_get_editable (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_set_editable (WebKitWebView* web_view, gboolean flag);
+
+WEBKIT_API GtkTargetList*
+webkit_web_view_get_copy_target_list (WebKitWebView* web_view);
+
+WEBKIT_API GtkTargetList*
+webkit_web_view_get_paste_target_list (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_set_settings (WebKitWebView* web_view, WebKitWebSettings* settings);
+
+WEBKIT_API WebKitWebSettings*
+webkit_web_view_get_settings (WebKitWebView* web_view);
+
+WEBKIT_OBSOLETE_API gboolean
+webkit_web_view_can_go_backward (WebKitWebView* web_view);
+
+WEBKIT_OBSOLETE_API void
+webkit_web_view_go_backward (WebKitWebView* web_view);
+
+WEBKIT_API gboolean
+webkit_web_view_get_transparent (WebKitWebView* web_view);
+
+WEBKIT_API void
+webkit_web_view_set_transparent (WebKitWebView* web_view, gboolean flag);
+
+G_END_DECLS
+
+#endif