summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp')
-rw-r--r--Source/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp545
1 files changed, 545 insertions, 0 deletions
diff --git a/Source/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp b/Source/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
new file mode 100644
index 0000000..e9904c6
--- /dev/null
+++ b/Source/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
@@ -0,0 +1,545 @@
+/*
+ * Copyright (C) 2006 Zack Rusin <zack@kde.org>
+ * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2008 Kenneth Rohde Christiansen
+ * Copyright (C) 2008 Diego Gonzalez
+ * Copyright (C) 2009-2010 ProFUSION embedded systems
+ * Copyright (C) 2009-2010 Samsung Electronics
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * 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.
+ */
+
+#include "config.h"
+#include "ChromeClientEfl.h"
+
+#if ENABLE(DATABASE)
+#include "DatabaseDetails.h"
+#include "DatabaseTracker.h"
+#endif
+#include "EWebKit.h"
+#include "FileChooser.h"
+#include "FloatRect.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClientEfl.h"
+#include "HitTestResult.h"
+#include "IntRect.h"
+#include "KURL.h"
+#include "NavigationAction.h"
+#include "NotImplemented.h"
+#include "PlatformString.h"
+#include "SecurityOrigin.h"
+#include "PopupMenuEfl.h"
+#include "SearchPopupMenuEfl.h"
+#include "ViewportArguments.h"
+#include "WindowFeatures.h"
+#include "ewk_private.h"
+#include <Ecore_Evas.h>
+#include <Evas.h>
+#include <wtf/text/CString.h>
+
+using namespace WebCore;
+
+static inline Evas_Object* kit(Frame* frame)
+{
+ if (!frame)
+ return 0;
+
+ FrameLoaderClientEfl* client = static_cast<FrameLoaderClientEfl*>(frame->loader()->client());
+ return client ? client->webFrame() : 0;
+}
+
+namespace WebCore {
+
+ChromeClientEfl::ChromeClientEfl(Evas_Object* view)
+ : m_view(view)
+{
+}
+
+ChromeClientEfl::~ChromeClientEfl()
+{
+}
+
+void ChromeClientEfl::chromeDestroyed()
+{
+ delete this;
+}
+
+void ChromeClientEfl::focusedNodeChanged(Node*)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::focusedFrameChanged(Frame*)
+{
+}
+
+FloatRect ChromeClientEfl::windowRect()
+{
+ Ecore_Evas* ee = 0;
+ int x, y, w, h;
+
+ if (!m_view)
+ return FloatRect();
+
+ ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_view));
+ ecore_evas_geometry_get(ee, &x, &y, &w, &h);
+ return FloatRect(x, y, w, h);
+}
+
+void ChromeClientEfl::setWindowRect(const FloatRect& rect)
+{
+ Ecore_Evas* ee = 0;
+ IntRect intrect = IntRect(rect);
+
+ if (!m_view)
+ return;
+
+ if (!ewk_view_setting_enable_auto_resize_window_get(m_view))
+ return;
+
+ ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_view));
+ ecore_evas_move(ee, intrect.x(), intrect.y());
+ ecore_evas_resize(ee, intrect.width(), intrect.height());
+}
+
+FloatRect ChromeClientEfl::pageRect()
+{
+ if (!m_view)
+ return FloatRect();
+
+ return ewk_view_page_rect_get(m_view);
+}
+
+float ChromeClientEfl::scaleFactor()
+{
+ notImplemented();
+ return 1.0;
+}
+
+void ChromeClientEfl::focus()
+{
+ evas_object_focus_set(m_view, EINA_TRUE);
+}
+
+void ChromeClientEfl::unfocus()
+{
+ evas_object_focus_set(m_view, EINA_FALSE);
+}
+
+Page* ChromeClientEfl::createWindow(Frame*, const FrameLoadRequest& frameLoadRequest, const WindowFeatures& features, const NavigationAction&)
+{
+ Evas_Object* newView = ewk_view_window_create(m_view, EINA_TRUE, &features);
+ if (!newView)
+ return 0;
+
+ return ewk_view_core_page_get(newView);
+}
+
+void ChromeClientEfl::show()
+{
+ ewk_view_ready(m_view);
+}
+
+bool ChromeClientEfl::canRunModal()
+{
+ notImplemented();
+ return false;
+}
+
+void ChromeClientEfl::runModal()
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::setToolbarsVisible(bool visible)
+{
+ ewk_view_toolbars_visible_set(m_view, visible);
+}
+
+bool ChromeClientEfl::toolbarsVisible()
+{
+ Eina_Bool visible;
+
+ ewk_view_toolbars_visible_get(m_view, &visible);
+ return visible;
+}
+
+void ChromeClientEfl::setStatusbarVisible(bool visible)
+{
+ ewk_view_statusbar_visible_set(m_view, visible);
+}
+
+bool ChromeClientEfl::statusbarVisible()
+{
+ Eina_Bool visible;
+
+ ewk_view_statusbar_visible_get(m_view, &visible);
+ return visible;
+}
+
+void ChromeClientEfl::setScrollbarsVisible(bool visible)
+{
+ ewk_view_scrollbars_visible_set(m_view, visible);
+}
+
+bool ChromeClientEfl::scrollbarsVisible()
+{
+ Eina_Bool visible;
+
+ ewk_view_scrollbars_visible_get(m_view, &visible);
+ return visible;
+}
+
+void ChromeClientEfl::setMenubarVisible(bool visible)
+{
+ ewk_view_menubar_visible_set(m_view, visible);
+}
+
+bool ChromeClientEfl::menubarVisible()
+{
+ Eina_Bool visible;
+
+ ewk_view_menubar_visible_get(m_view, &visible);
+ return visible;
+}
+
+void ChromeClientEfl::createSelectPopup(PopupMenuClient* client, int selected, const IntRect& rect)
+{
+ ewk_view_popup_new(m_view, client, selected, rect);
+}
+
+bool ChromeClientEfl::destroySelectPopup()
+{
+ return ewk_view_popup_destroy(m_view);
+}
+
+void ChromeClientEfl::setResizable(bool)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::closeWindowSoon()
+{
+ ewk_view_window_close(m_view);
+}
+
+bool ChromeClientEfl::canTakeFocus(FocusDirection)
+{
+ // This is called when cycling through links/focusable objects and we
+ // reach the last focusable object.
+ return false;
+}
+
+void ChromeClientEfl::takeFocus(FocusDirection)
+{
+ unfocus();
+}
+
+bool ChromeClientEfl::canRunBeforeUnloadConfirmPanel()
+{
+ return true;
+}
+
+bool ChromeClientEfl::runBeforeUnloadConfirmPanel(const String& message, Frame* frame)
+{
+ return runJavaScriptConfirm(frame, message);
+}
+
+void ChromeClientEfl::addMessageToConsole(MessageSource, MessageType, MessageLevel, const String& message,
+ unsigned int lineNumber, const String& sourceID)
+{
+ ewk_view_add_console_message(m_view, message.utf8().data(), lineNumber, sourceID.utf8().data());
+}
+
+void ChromeClientEfl::runJavaScriptAlert(Frame* frame, const String& message)
+{
+ ewk_view_run_javascript_alert(m_view, kit(frame), message.utf8().data());
+}
+
+bool ChromeClientEfl::runJavaScriptConfirm(Frame* frame, const String& message)
+{
+ return ewk_view_run_javascript_confirm(m_view, kit(frame), message.utf8().data());
+}
+
+bool ChromeClientEfl::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
+{
+ char* value = 0;
+ ewk_view_run_javascript_prompt(m_view, kit(frame), message.utf8().data(), defaultValue.utf8().data(), &value);
+ if (value) {
+ result = String::fromUTF8(value);
+ free(value);
+ return true;
+ }
+ return false;
+}
+
+void ChromeClientEfl::setStatusbarText(const String& string)
+{
+ ewk_view_statusbar_text_set(m_view, string.utf8().data());
+}
+
+bool ChromeClientEfl::shouldInterruptJavaScript()
+{
+ return ewk_view_should_interrupt_javascript(m_view);
+}
+
+bool ChromeClientEfl::tabsToLinks() const
+{
+ return true;
+}
+
+IntRect ChromeClientEfl::windowResizerRect() const
+{
+ notImplemented();
+ // Implementing this function will make repaint being
+ // called during resize, but as this will be done with
+ // a minor delay it adds a weird "filling" effect due
+ // to us using an evas image for showing the cairo
+ // context. So instead of implementing this function
+ // we call paint directly during resize with
+ // the new object size as its argument.
+ return IntRect();
+}
+
+void ChromeClientEfl::contentsSizeChanged(Frame* frame, const IntSize& size) const
+{
+ ewk_frame_contents_size_changed(kit(frame), size.width(), size.height());
+ if (ewk_view_frame_main_get(m_view) == kit(frame))
+ ewk_view_contents_size_changed(m_view, size.width(), size.height());
+}
+
+IntRect ChromeClientEfl::windowToScreen(const IntRect& rect) const
+{
+ notImplemented();
+ return rect;
+}
+
+IntPoint ChromeClientEfl::screenToWindow(const IntPoint& point) const
+{
+ notImplemented();
+ return point;
+}
+
+PlatformPageClient ChromeClientEfl::platformPageClient() const
+{
+ return m_view;
+}
+
+void ChromeClientEfl::scrollbarsModeDidChange() const
+{
+}
+
+void ChromeClientEfl::mouseDidMoveOverElement(const HitTestResult& hit, unsigned modifierFlags)
+{
+ // FIXME, compare with old link, look at Qt impl.
+ bool isLink = hit.isLiveLink();
+ if (isLink) {
+ KURL url = hit.absoluteLinkURL();
+ if (!url.isEmpty() && url != m_hoveredLinkURL) {
+ const char* link[2];
+ TextDirection dir;
+ CString urlStr = url.prettyURL().utf8();
+ CString titleStr = hit.title(dir).utf8();
+ link[0] = urlStr.data();
+ link[1] = titleStr.data();
+ ewk_view_mouse_link_hover_in(m_view, link);
+ m_hoveredLinkURL = url;
+ }
+ } else if (!isLink && !m_hoveredLinkURL.isEmpty()) {
+ ewk_view_mouse_link_hover_out(m_view);
+ m_hoveredLinkURL = KURL();
+ }
+}
+
+void ChromeClientEfl::setToolTip(const String& toolTip, TextDirection)
+{
+ ewk_view_tooltip_text_set(m_view, toolTip.utf8().data());
+}
+
+void ChromeClientEfl::print(Frame* frame)
+{
+ notImplemented();
+}
+
+#if ENABLE(OFFLINE_WEB_APPLICATIONS)
+void ChromeClientEfl::reachedMaxAppCacheSize(int64_t spaceNeeded)
+{
+ // FIXME: Free some space.
+ notImplemented();
+}
+
+void ChromeClientEfl::reachedApplicationCacheOriginQuota(SecurityOrigin*)
+{
+ notImplemented();
+}
+#endif
+
+#if ENABLE(DATABASE)
+void ChromeClientEfl::exceededDatabaseQuota(Frame* frame, const String& databaseName)
+{
+ uint64_t quota;
+ SecurityOrigin* origin = frame->document()->securityOrigin();
+
+ DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(databaseName, origin);
+ quota = ewk_view_exceeded_database_quota(m_view,
+ kit(frame), databaseName.utf8().data(),
+ details.currentUsage(), details.expectedUsage());
+
+ /* if client did not set quota, and database is being created now, the
+ * default quota is applied
+ */
+ if (!quota && !DatabaseTracker::tracker().hasEntryForOrigin(origin))
+ quota = ewk_settings_web_database_default_quota_get();
+
+ DatabaseTracker::tracker().setQuota(origin, quota);
+}
+#endif
+
+void ChromeClientEfl::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> prpFileChooser)
+{
+ RefPtr<FileChooser> chooser = prpFileChooser;
+ bool confirm;
+ Eina_List* selectedFilenames = 0;
+ Eina_List* suggestedFilenames = 0;
+ void* filename;
+ Vector<String> filenames;
+
+ for (unsigned i = 0; i < chooser->filenames().size(); i++) {
+ CString str = chooser->filenames()[i].utf8();
+ filename = strdup(str.data());
+ suggestedFilenames = eina_list_append(suggestedFilenames, filename);
+ }
+
+ confirm = ewk_view_run_open_panel(m_view, kit(frame), chooser->allowsMultipleFiles(), suggestedFilenames, &selectedFilenames);
+ EINA_LIST_FREE(suggestedFilenames, filename)
+ free(filename);
+
+ if (!confirm)
+ return;
+
+ EINA_LIST_FREE(selectedFilenames, filename) {
+ filenames.append((char *)filename);
+ free(filename);
+ }
+
+ if (chooser->allowsMultipleFiles())
+ chooser->chooseFiles(filenames);
+ else
+ chooser->chooseFile(filenames[0]);
+}
+
+void ChromeClientEfl::formStateDidChange(const Node*)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::setCursor(const Cursor&)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
+{
+ // See the comment in WebCore/page/ChromeClient.h
+ notImplemented();
+}
+
+void ChromeClientEfl::cancelGeolocationPermissionRequestForFrame(Frame*, Geolocation*)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::cancelGeolocationPermissionForFrame(Frame*, Geolocation*)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::invalidateContents(const IntRect& updateRect, bool immediate)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::invalidateWindow(const IntRect& updateRect, bool immediate)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::invalidateContentsAndWindow(const IntRect& updateRect, bool immediate)
+{
+ Evas_Coord x, y, w, h;
+
+ x = updateRect.x();
+ y = updateRect.y();
+ w = updateRect.width();
+ h = updateRect.height();
+ ewk_view_repaint(m_view, x, y, w, h);
+}
+
+void ChromeClientEfl::invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate)
+{
+ invalidateContentsAndWindow(updateRect, immediate);
+}
+
+void ChromeClientEfl::scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect)
+{
+ ewk_view_scroll(m_view, scrollDelta.width(), scrollDelta.height(), rectToScroll.x(), rectToScroll.y(), rectToScroll.width(), rectToScroll.height(), clipRect.x(), clipRect.y(), clipRect.width(), clipRect.height(), EINA_TRUE);
+}
+
+void ChromeClientEfl::cancelGeolocationPermissionRequestForFrame(Frame*)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::iconForFiles(const Vector<String, 0u>&, PassRefPtr<FileChooser>)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::chooseIconForFiles(const Vector<String>&, FileChooser*)
+{
+ notImplemented();
+}
+
+void ChromeClientEfl::dispatchViewportDataDidChange(const ViewportArguments& arguments) const
+{
+ ewk_view_viewport_attributes_set(m_view, arguments);
+}
+
+bool ChromeClientEfl::selectItemWritingDirectionIsNatural()
+{
+ return true;
+}
+
+PassRefPtr<PopupMenu> ChromeClientEfl::createPopupMenu(PopupMenuClient* client) const
+{
+ return adoptRef(new PopupMenuEfl(client));
+}
+
+PassRefPtr<SearchPopupMenu> ChromeClientEfl::createSearchPopupMenu(PopupMenuClient* client) const
+{
+ return adoptRef(new SearchPopupMenuEfl(client));
+}
+
+}