diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2013-06-19 13:47:04 +0200 |
---|---|---|
committer | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2013-06-19 13:47:04 +0200 |
commit | 90022906e060ae0dc8ad60b5770b3b23ffd6cde1 (patch) | |
tree | 48544460bc71732cf2e30bc190125b5a1a531f0a /lib/render_widget_host_view_qt.cpp | |
parent | eb530b3752e1af68956feaa833e5b86b1e49e2e1 (diff) |
Move API layer-only classes back from the shared static lib.
Since ContentBrowserClientQt::OverrideCreateWebContentsView now
takes care of using our Qt layer at runtime without relying on
the static RenderWidgetHostView::CreateViewForWidget, we can
now avoid linking this layer into the render process.
Diffstat (limited to 'lib/render_widget_host_view_qt.cpp')
-rw-r--r-- | lib/render_widget_host_view_qt.cpp | 469 |
1 files changed, 469 insertions, 0 deletions
diff --git a/lib/render_widget_host_view_qt.cpp b/lib/render_widget_host_view_qt.cpp new file mode 100644 index 000000000..2d21410d0 --- /dev/null +++ b/lib/render_widget_host_view_qt.cpp @@ -0,0 +1,469 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "render_widget_host_view_qt.h" + +#include "backing_store_qt.h" +#include "render_widget_host_view_qt_delegate.h" +#include "web_event_factory.h" + +#include "shared/shared_globals.h" + +#include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/common/gpu/gpu_messages.h" + +#include <QEvent> +#include <QFocusEvent> +#include <QKeyEvent> +#include <QMouseEvent> +#include <QWheelEvent> +#include <QWindow> + +namespace content { + +RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget) + : m_host(content::RenderWidgetHostImpl::From(widget)) + , m_delegate(0) +{ + m_host->SetView(this); +} + +RenderWidgetHostViewQt::~RenderWidgetHostViewQt() +{ +} + +bool RenderWidgetHostViewQt::handleEvent(QEvent* event) { + + switch(event->type()) { + case QEvent::MouseButtonDblClick: + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + case QEvent::MouseMove: + handleMouseEvent(static_cast<QMouseEvent*>(event)); + break; + case QEvent::KeyPress: + case QEvent::KeyRelease: + handleKeyEvent(static_cast<QKeyEvent*>(event)); + break; + case QEvent::Wheel: + handleWheelEvent(static_cast<QWheelEvent*>(event)); + break; + case QEvent::FocusIn: + case QEvent::FocusOut: + handleFocusEvent(static_cast<QFocusEvent*>(event)); + break; + default: + return false; + } + return true; +} + +BackingStoreQt* RenderWidgetHostViewQt::GetBackingStore() +{ + bool force_create = !m_host->empty(); + return static_cast<BackingStoreQt*>(m_host->GetBackingStore(force_create)); +} + +content::BackingStore *RenderWidgetHostViewQt::AllocBackingStore(const gfx::Size &size) +{ + return new BackingStoreQt(m_host, size, new QWindow); +} + +void RenderWidgetHostViewQt::InitAsChild(gfx::NativeView parent_view) +{ +} + +void RenderWidgetHostViewQt::InitAsPopup(content::RenderWidgetHostView*, const gfx::Rect&) +{ +} + +void RenderWidgetHostViewQt::InitAsFullscreen(content::RenderWidgetHostView*) +{ +} + +content::RenderWidgetHost* RenderWidgetHostViewQt::GetRenderWidgetHost() const +{ + return m_host; +} + +void RenderWidgetHostViewQt::SetSize(const gfx::Size& size) +{ + int width = size.width(); + int height = size.height(); + // int width = std::min(size.width(), kMaxWindowWidth); + // int height = std::min(size.height(), kMaxWindowHeight); + // if (IsPopup()) + // m_delegate->resize(width,height); + + if (m_requestedSize.width() != width || + m_requestedSize.height() != height) { + m_requestedSize = gfx::Size(width, height); + // m_host->SendScreenRects(); + m_host->WasResized(); + } +} + +void RenderWidgetHostViewQt::SetBounds(const gfx::Rect& rect) +{ + // This is called when webkit has sent us a Move message. + // if (IsPopup()) + // m_delegate->setGeometry(rect.x(), rect.y(), rect.width(), rect.height()); + SetSize(rect.size()); +} + +// FIXME: Should this really return a QWindow pointer? +gfx::NativeView RenderWidgetHostViewQt::GetNativeView() const +{ + QT_NOT_YET_IMPLEMENTED + return gfx::NativeView(); +} + +gfx::NativeViewId RenderWidgetHostViewQt::GetNativeViewId() const +{ + QT_NOT_YET_IMPLEMENTED + return gfx::NativeViewId(); +} + +gfx::NativeViewAccessible RenderWidgetHostViewQt::GetNativeViewAccessible() +{ + NOTIMPLEMENTED(); + return NULL; +} + +// Set focus to the associated View component. +void RenderWidgetHostViewQt::Focus() +{ + // m_delegate->setFocus(Qt::MouseFocusReason); +} + +bool RenderWidgetHostViewQt::HasFocus() const +{ + // return m_delegate->hasFocus(); + return true; +} + +bool RenderWidgetHostViewQt::IsSurfaceAvailableForCopy() const +{ + return true; +} + +void RenderWidgetHostViewQt::Show() +{ + m_delegate->show(); +} + +void RenderWidgetHostViewQt::Hide() +{ + m_delegate->hide(); +} + +bool RenderWidgetHostViewQt::IsShowing() +{ + return m_delegate->isVisible(); +} + +// Retrieve the bounds of the View, in screen coordinates. +gfx::Rect RenderWidgetHostViewQt::GetViewBounds() const +{ + QRectF p = m_delegate->screenRect(); + return gfx::Rect(p.x(), p.y(), p.width(), p.height()); +} + +// Subclasses should override this method to do what is appropriate to set +// the custom background for their platform. +void RenderWidgetHostViewQt::SetBackground(const SkBitmap& background) +{ + RenderWidgetHostViewBase::SetBackground(background); + // Send(new ViewMsg_SetBackground(m_host->GetRoutingID(), background)); +} + +// Return value indicates whether the mouse is locked successfully or not. +bool RenderWidgetHostViewQt::LockMouse() +{ + QT_NOT_YET_IMPLEMENTED + return false; +} +void RenderWidgetHostViewQt::UnlockMouse() +{ + QT_NOT_YET_IMPLEMENTED +} + +// Returns true if the mouse pointer is currently locked. +bool RenderWidgetHostViewQt::IsMouseLocked() +{ + QT_NOT_YET_IMPLEMENTED + return false; +} + +// FIXME: remove TOOLKIT_GTK related things. +#if defined(TOOLKIT_GTK) +// Gets the event for the last mouse down. +GdkEventButton* RenderWidgetHostViewQt::GetLastMouseDown() +{ + return 0; +} + +gfx::NativeView RenderWidgetHostViewQt::BuildInputMethodsGtkMenu() +{ +} +#endif // defined(TOOLKIT_GTK) + +void RenderWidgetHostViewQt::WasShown() +{ + if (m_delegate->isVisible()) + return; + + m_host->WasShown(); +} + +void RenderWidgetHostViewQt::WasHidden() +{ + if (!m_delegate->isVisible()) + return; + + m_host->WasHidden(); +} + +void RenderWidgetHostViewQt::MovePluginWindows(const gfx::Vector2d&, const std::vector<webkit::npapi::WebPluginGeometry>&) +{ + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::Blur() +{ + m_host->Blur(); +} + +void RenderWidgetHostViewQt::UpdateCursor(const WebCursor&) +{ + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::SetIsLoading(bool) +{ + QT_NOT_YET_IMPLEMENTED + // Give visual feedback for loading process. +} + +void RenderWidgetHostViewQt::TextInputStateChanged(const ViewHostMsg_TextInputState_Params&) +{ + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::ImeCancelComposition() +{ + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::ImeCompositionRangeChanged(const ui::Range&, const std::vector<gfx::Rect>&) +{ + // FIXME: not implemented? + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::DidUpdateBackingStore(const gfx::Rect& scroll_rect, const gfx::Vector2d& scroll_delta, const std::vector<gfx::Rect>& copy_rects) +{ + if (!m_delegate->isVisible()) + return; + + Paint(scroll_rect); + + for (size_t i = 0; i < copy_rects.size(); ++i) { + gfx::Rect rect = gfx::SubtractRects(copy_rects[i], scroll_rect); + if (rect.IsEmpty()) + continue; + Paint(rect); + } +} + +void RenderWidgetHostViewQt::RenderViewGone(base::TerminationStatus, int) +{ + Destroy(); +} + +void RenderWidgetHostViewQt::Destroy() +{ + delete m_delegate; + m_delegate = 0; +} + +void RenderWidgetHostViewQt::SetTooltipText(const string16&) +{ + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::SelectionBoundsChanged(const ViewHostMsg_SelectionBounds_Params&) +{ + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::ScrollOffsetChanged() +{ + // FIXME: not implemented? +} + +void RenderWidgetHostViewQt::CopyFromCompositingSurface(const gfx::Rect& src_subrect, const gfx::Size& /* dst_size */, const base::Callback<void(bool, const SkBitmap&)>& callback) +{ + // Grab the snapshot from the renderer as that's the only reliable way to + // readback from the GPU for this platform right now. + // FIXME: is this true? + GetRenderWidgetHost()->GetSnapshotFromRenderer(src_subrect, callback); +} + +void RenderWidgetHostViewQt::CopyFromCompositingSurfaceToVideoFrame(const gfx::Rect& src_subrect, const scoped_refptr<media::VideoFrame>& target, const base::Callback<void(bool)>& callback) +{ + NOTIMPLEMENTED(); + callback.Run(false); +} + +bool RenderWidgetHostViewQt::CanCopyToVideoFrame() const +{ + return false; +} + +void RenderWidgetHostViewQt::OnAcceleratedCompositingStateChange() +{ + // bool activated = m_host->is_accelerated_compositing_active(); + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::AcceleratedSurfaceBuffersSwapped(const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, int gpu_host_id) +{ + AcceleratedSurfaceMsg_BufferPresented_Params ack_params; + ack_params.sync_point = 0; + content::RenderWidgetHostImpl::AcknowledgeBufferPresent(params.route_id, gpu_host_id, ack_params); +} + +void RenderWidgetHostViewQt::AcceleratedSurfacePostSubBuffer(const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, int gpu_host_id) +{ + AcceleratedSurfaceMsg_BufferPresented_Params ack_params; + ack_params.sync_point = 0; + content::RenderWidgetHostImpl::AcknowledgeBufferPresent(params.route_id, gpu_host_id, ack_params); +} + +void RenderWidgetHostViewQt::AcceleratedSurfaceSuspend() +{ + //FIXME: not implemented? +} + +void RenderWidgetHostViewQt::AcceleratedSurfaceRelease() +{ + //FIXME: not implemented? +} + +bool RenderWidgetHostViewQt::HasAcceleratedSurface(const gfx::Size&) +{ + return false; +} + +void RenderWidgetHostViewQt::GetScreenInfo(WebKit::WebScreenInfo* results) +{ + QWindow* window = m_delegate->window(); + if (!window) + return; + GetScreenInfoFromNativeWindow(window, results); +} + +gfx::Rect RenderWidgetHostViewQt::GetBoundsInRootWindow() +{ + if (!m_delegate->window()) + return gfx::Rect(); + + QRect r = m_delegate->window()->frameGeometry(); + return gfx::Rect(r.x(), r.y(), r.width(), r.height()); +} + +gfx::GLSurfaceHandle RenderWidgetHostViewQt::GetCompositingSurface() +{ + QT_NOT_YET_IMPLEMENTED + return gfx::GLSurfaceHandle(); +} + +void RenderWidgetHostViewQt::SetHasHorizontalScrollbar(bool) { } + +void RenderWidgetHostViewQt::SetScrollOffsetPinning(bool, bool) { } + +void RenderWidgetHostViewQt::OnAccessibilityNotifications(const std::vector<AccessibilityHostMsg_NotificationParams>&) +{ + QT_NOT_YET_IMPLEMENTED +} + +void RenderWidgetHostViewQt::Paint(const gfx::Rect& damage_rect) +{ + QRect r(damage_rect.x(), damage_rect.y(), damage_rect.width(), damage_rect.height()); + m_delegate->update(r); +} + +bool RenderWidgetHostViewQt::IsPopup() const +{ + return popup_type_ != WebKit::WebPopupTypeNone; +} + +void RenderWidgetHostViewQt::handleMouseEvent(QMouseEvent* ev) +{ + m_host->ForwardMouseEvent(WebEventFactory::toWebMouseEvent(ev)); +} + +void RenderWidgetHostViewQt::handleKeyEvent(QKeyEvent *ev) +{ + m_host->ForwardKeyboardEvent(WebEventFactory::toWebKeyboardEvent(ev)); +} + +void RenderWidgetHostViewQt::handleWheelEvent(QWheelEvent *ev) +{ + m_host->ForwardWheelEvent(WebEventFactory::toWebWheelEvent(ev)); +} + +void RenderWidgetHostViewQt::handleFocusEvent(QFocusEvent *ev) +{ + if (ev->gotFocus()) { + m_host->GotFocus(); + m_host->SetActive(true); + ev->accept(); + } else if (ev->lostFocus()) { + m_host->SetActive(false); + m_host->Blur(); + ev->accept(); + } +} + +} + |