/* * Copyright (C) 2010 Apple Inc. All rights reserved. * Portions Copyright (c) 2010 Motorola Mobility, Inc. All rights reserved. * Copyright (C) 2011 Igalia S.L. * * 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 INC. 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 INC. 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. */ #include "config.h" #include "PageClientImpl.h" #include "DrawingAreaProxyImpl.h" #include "NativeWebKeyboardEvent.h" #include "NativeWebMouseEvent.h" #include "NotImplemented.h" #include "WebContext.h" #include "WebContextMenuProxyGtk.h" #include "WebEventFactory.h" #include "WebKitWebViewBasePrivate.h" #include "WebPageProxy.h" #include "WebPopupMenuProxyGtk.h" #include #include #include #include #include using namespace WebCore; namespace WebKit { PageClientImpl::PageClientImpl(GtkWidget* viewWidget) : m_viewWidget(viewWidget) { } PageClientImpl::~PageClientImpl() { } void PageClientImpl::getEditorCommandsForKeyEvent(const NativeWebKeyboardEvent& event, const AtomicString& eventType, Vector& commandList) { ASSERT(eventType == eventNames().keydownEvent || eventType == eventNames().keypressEvent); KeyBindingTranslator::EventType type = eventType == eventNames().keydownEvent ? KeyBindingTranslator::KeyDown : KeyBindingTranslator::KeyPress; m_keyBindingTranslator.getEditorCommandsForKeyEvent(const_cast(&event.nativeEvent()->key), type, commandList); } // PageClient's pure virtual functions PassOwnPtr PageClientImpl::createDrawingAreaProxy() { return DrawingAreaProxyImpl::create(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(m_viewWidget))); } void PageClientImpl::setViewNeedsDisplay(const WebCore::IntRect& rect) { gtk_widget_queue_draw_area(m_viewWidget, rect.x(), rect.y(), rect.width(), rect.height()); } void PageClientImpl::displayView() { notImplemented(); } void PageClientImpl::scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset) { setViewNeedsDisplay(scrollRect); } WebCore::IntSize PageClientImpl::viewSize() { if (!gtk_widget_get_realized(m_viewWidget)) return IntSize(); GtkAllocation allocation; gtk_widget_get_allocation(m_viewWidget, &allocation); return IntSize(allocation.width, allocation.height); } bool PageClientImpl::isViewWindowActive() { return webkitWebViewBaseIsInWindowActive(WEBKIT_WEB_VIEW_BASE(m_viewWidget)); } bool PageClientImpl::isViewFocused() { return webkitWebViewBaseIsFocused(WEBKIT_WEB_VIEW_BASE(m_viewWidget)); } bool PageClientImpl::isViewVisible() { return webkitWebViewBaseIsVisible(WEBKIT_WEB_VIEW_BASE(m_viewWidget)); } bool PageClientImpl::isViewInWindow() { return webkitWebViewBaseIsInWindow(WEBKIT_WEB_VIEW_BASE(m_viewWidget)); } void PageClientImpl::PageClientImpl::processDidCrash() { notImplemented(); } void PageClientImpl::didRelaunchProcess() { notImplemented(); } void PageClientImpl::takeFocus(bool) { notImplemented(); } void PageClientImpl::toolTipChanged(const String&, const String& newToolTip) { webkitWebViewBaseSetTooltipText(WEBKIT_WEB_VIEW_BASE(m_viewWidget), newToolTip.utf8().data()); } void PageClientImpl::setCursor(const Cursor& cursor) { if (!gtk_widget_get_realized(m_viewWidget)) return; // [GTK] Widget::setCursor() gets called frequently // http://bugs.webkit.org/show_bug.cgi?id=16388 // Setting the cursor may be an expensive operation in some backends, // so don't re-set the cursor if it's already set to the target value. GdkWindow* window = gtk_widget_get_window(m_viewWidget); GdkCursor* currentCursor = gdk_window_get_cursor(window); GdkCursor* newCursor = cursor.platformCursor().get(); if (currentCursor != newCursor) gdk_window_set_cursor(window, newCursor); } void PageClientImpl::setCursorHiddenUntilMouseMoves(bool hiddenUntilMouseMoves) { notImplemented(); } void PageClientImpl::didChangeViewportProperties(const WebCore::ViewportAttributes&) { notImplemented(); } void PageClientImpl::registerEditCommand(PassRefPtr, WebPageProxy::UndoOrRedo) { notImplemented(); } void PageClientImpl::clearAllEditCommands() { notImplemented(); } bool PageClientImpl::canUndoRedo(WebPageProxy::UndoOrRedo) { notImplemented(); return false; } void PageClientImpl::executeUndoRedo(WebPageProxy::UndoOrRedo) { notImplemented(); } FloatRect PageClientImpl::convertToDeviceSpace(const FloatRect& viewRect) { notImplemented(); return viewRect; } FloatRect PageClientImpl::convertToUserSpace(const FloatRect& viewRect) { notImplemented(); return viewRect; } IntPoint PageClientImpl::screenToWindow(const IntPoint& point) { IntPoint widgetPositionOnScreen = convertWidgetPointToScreenPoint(m_viewWidget, IntPoint()); IntPoint result(point); result.move(-widgetPositionOnScreen.x(), -widgetPositionOnScreen.y()); return result; } IntRect PageClientImpl::windowToScreen(const IntRect& rect) { return IntRect(convertWidgetPointToScreenPoint(m_viewWidget, rect.location()), rect.size()); } void PageClientImpl::doneWithKeyEvent(const NativeWebKeyboardEvent& event, bool wasEventHandled) { if (wasEventHandled) return; if (event.isFakeEventForComposition()) return; WebKitWebViewBase* webkitWebViewBase = WEBKIT_WEB_VIEW_BASE(m_viewWidget); webkitWebViewBaseForwardNextKeyEvent(webkitWebViewBase); gtk_main_do_event(event.nativeEvent()); } PassRefPtr PageClientImpl::createPopupMenuProxy(WebPageProxy* page) { return WebPopupMenuProxyGtk::create(m_viewWidget, page); } PassRefPtr PageClientImpl::createContextMenuProxy(WebPageProxy* page) { return WebContextMenuProxyGtk::create(m_viewWidget, page); } #if ENABLE(INPUT_TYPE_COLOR) PassRefPtr PageClientImpl::createColorPicker(WebPageProxy*, const WebCore::Color&, const WebCore::IntRect&) { notImplemented(); return 0; } #endif void PageClientImpl::setFindIndicator(PassRefPtr, bool fadeOut, bool animate) { notImplemented(); } #if USE(ACCELERATED_COMPOSITING) void PageClientImpl::enterAcceleratedCompositingMode(const LayerTreeContext&) { notImplemented(); } void PageClientImpl::exitAcceleratedCompositingMode() { notImplemented(); } void PageClientImpl::updateAcceleratedCompositingMode(const LayerTreeContext&) { notImplemented(); } #endif // USE(ACCELERATED_COMPOSITING) void PageClientImpl::pageClosed() { notImplemented(); } void PageClientImpl::preferencesDidChange() { notImplemented(); } void PageClientImpl::flashBackingStoreUpdates(const Vector&) { notImplemented(); } void PageClientImpl::updateTextInputState() { webkitWebViewBaseUpdateTextInputState(WEBKIT_WEB_VIEW_BASE(m_viewWidget)); } void PageClientImpl::startDrag(const WebCore::DragData& dragData, PassRefPtr dragImage) { webkitWebViewBaseStartDrag(WEBKIT_WEB_VIEW_BASE(m_viewWidget), dragData, dragImage); } void PageClientImpl::handleDownloadRequest(DownloadProxy* download) { webkitWebViewBaseHandleDownloadRequest(WEBKIT_WEB_VIEW_BASE(m_viewWidget), download); } } // namespace WebKit