|  | /* | 
|  | * 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 <WebCore/Cursor.h> | 
|  | #include <WebCore/EventNames.h> | 
|  | #include <WebCore/GtkUtilities.h> | 
|  | #include <wtf/text/CString.h> | 
|  | #include <wtf/text/WTFString.h> | 
|  |  | 
|  | using namespace WebCore; | 
|  |  | 
|  | namespace WebKit { | 
|  |  | 
|  | PageClientImpl::PageClientImpl(GtkWidget* viewWidget) | 
|  | : m_viewWidget(viewWidget) | 
|  | { | 
|  | } | 
|  |  | 
|  | PageClientImpl::~PageClientImpl() | 
|  | { | 
|  | } | 
|  |  | 
|  | void PageClientImpl::getEditorCommandsForKeyEvent(const NativeWebKeyboardEvent& event, const AtomicString& eventType, Vector<WTF::String>& commandList) | 
|  | { | 
|  | ASSERT(eventType == eventNames().keydownEvent || eventType == eventNames().keypressEvent); | 
|  |  | 
|  | KeyBindingTranslator::EventType type = eventType == eventNames().keydownEvent ? | 
|  | KeyBindingTranslator::KeyDown : KeyBindingTranslator::KeyPress; | 
|  | m_keyBindingTranslator.getEditorCommandsForKeyEvent(const_cast<GdkEventKey*>(&event.nativeEvent()->key), type, commandList); | 
|  | } | 
|  |  | 
|  | // PageClient's pure virtual functions | 
|  | PassOwnPtr<DrawingAreaProxy> 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<WebEditCommandProxy>, 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<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy(WebPageProxy* page) | 
|  | { | 
|  | return WebPopupMenuProxyGtk::create(m_viewWidget, page); | 
|  | } | 
|  |  | 
|  | PassRefPtr<WebContextMenuProxy> PageClientImpl::createContextMenuProxy(WebPageProxy* page) | 
|  | { | 
|  | return WebContextMenuProxyGtk::create(m_viewWidget, page); | 
|  | } | 
|  |  | 
|  | #if ENABLE(INPUT_TYPE_COLOR) | 
|  | PassRefPtr<WebColorChooserProxy> PageClientImpl::createColorChooserProxy(WebPageProxy*, const WebCore::Color&, const WebCore::IntRect&) | 
|  | { | 
|  | notImplemented(); | 
|  | return 0; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | void PageClientImpl::setFindIndicator(PassRefPtr<FindIndicator>, 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::didCommitLoadForMainFrame(bool useCustomRepresentation) | 
|  | { | 
|  | } | 
|  |  | 
|  | void PageClientImpl::didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&) | 
|  | { | 
|  | } | 
|  |  | 
|  | double PageClientImpl::customRepresentationZoomFactor() | 
|  | { | 
|  | notImplemented(); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void PageClientImpl::setCustomRepresentationZoomFactor(double) | 
|  | { | 
|  | notImplemented(); | 
|  | } | 
|  |  | 
|  | void PageClientImpl::pageClosed() | 
|  | { | 
|  | notImplemented(); | 
|  | } | 
|  |  | 
|  | void PageClientImpl::flashBackingStoreUpdates(const Vector<IntRect>&) | 
|  | { | 
|  | notImplemented(); | 
|  | } | 
|  |  | 
|  | void PageClientImpl::findStringInCustomRepresentation(const String&, FindOptions, unsigned) | 
|  | { | 
|  | notImplemented(); | 
|  | } | 
|  |  | 
|  | void PageClientImpl::countStringMatchesInCustomRepresentation(const String&, FindOptions, unsigned) | 
|  | { | 
|  | notImplemented(); | 
|  | } | 
|  |  | 
|  | void PageClientImpl::updateTextInputState() | 
|  | { | 
|  | webkitWebViewBaseUpdateTextInputState(WEBKIT_WEB_VIEW_BASE(m_viewWidget)); | 
|  | } | 
|  |  | 
|  | void PageClientImpl::startDrag(const WebCore::DragData& dragData, PassRefPtr<ShareableBitmap> 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 |