blob: 5b1b1f333847963ff64e1ba7af0ab0f580a89cf8 [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/renderer/render_widget_fullscreen_pepper.h"
#include "chrome/common/render_messages.h"
#include "chrome/renderer/render_thread.h"
#include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h"
#include "third_party/WebKit/WebKit/chromium/public/WebSize.h"
#include "third_party/WebKit/WebKit/chromium/public/WebWidget.h"
#include "webkit/glue/plugins/pepper_fullscreen_container.h"
#include "webkit/glue/plugins/pepper_plugin_instance.h"
using WebKit::WebCanvas;
using WebKit::WebCompositionUnderline;
using WebKit::WebCursorInfo;
using WebKit::WebInputEvent;
using WebKit::WebRect;
using WebKit::WebSize;
using WebKit::WebString;
using WebKit::WebTextDirection;
using WebKit::WebTextInputType;
using WebKit::WebVector;
using WebKit::WebWidget;
namespace {
// WebWidget that simply wraps the pepper plugin.
class PepperWidget : public WebWidget {
public:
PepperWidget(pepper::PluginInstance* plugin,
RenderWidgetFullscreenPepper* widget)
: plugin_(plugin),
widget_(widget),
cursor_(WebCursorInfo::TypePointer) {
}
// WebWidget API
virtual void close() {
delete this;
}
virtual WebSize size() {
return size_;
}
virtual void resize(const WebSize& size) {
size_ = size;
WebRect plugin_rect(0, 0, size_.width, size_.height);
// TODO(piman): transparently scale the plugin instead of resizing it.
plugin_->ViewChanged(plugin_rect, plugin_rect);
widget_->GenerateFullRepaint();
}
virtual void layout() {
}
virtual void paint(WebCanvas* canvas, const WebRect& rect) {
if (!plugin_)
return;
WebRect plugin_rect(0, 0, size_.width, size_.height);
plugin_->Paint(canvas, plugin_rect, rect);
}
virtual void composite(bool finish) {
NOTIMPLEMENTED();
}
virtual void themeChanged() {
NOTIMPLEMENTED();
}
virtual bool handleInputEvent(const WebInputEvent& event) {
if (!plugin_)
return false;
return plugin_->HandleInputEvent(event, &cursor_);
}
virtual void mouseCaptureLost() {
NOTIMPLEMENTED();
}
virtual void setFocus(bool focus) {
NOTIMPLEMENTED();
}
virtual bool setComposition(
const WebString& text,
const WebVector<WebCompositionUnderline>& underlines,
int selectionStart,
int selectionEnd) {
NOTIMPLEMENTED();
return false;
}
virtual bool confirmComposition() {
NOTIMPLEMENTED();
return false;
}
virtual WebTextInputType textInputType() {
NOTIMPLEMENTED();
return WebKit::WebTextInputTypeNone;
}
virtual WebRect caretOrSelectionBounds() {
NOTIMPLEMENTED();
return WebRect();
}
virtual void setTextDirection(WebTextDirection) {
NOTIMPLEMENTED();
}
virtual bool isAcceleratedCompositingActive() const {
// TODO(piman): see if supporting accelerated compositing makes sense.
return false;
}
private:
pepper::PluginInstance* plugin_;
RenderWidgetFullscreenPepper* widget_;
WebSize size_;
WebCursorInfo cursor_;
DISALLOW_COPY_AND_ASSIGN(PepperWidget);
};
// A FullscreenContainer that forwards the API calls to the
// RenderWidgetFullscreenPepper.
class WidgetFullscreenContainer : public pepper::FullscreenContainer {
public:
explicit WidgetFullscreenContainer(RenderWidgetFullscreenPepper* widget)
: widget_(widget) {
}
virtual ~WidgetFullscreenContainer() { }
virtual void Invalidate() {
widget_->GenerateFullRepaint();
}
virtual void InvalidateRect(const WebKit::WebRect& rect) {
widget_->didInvalidateRect(rect);
}
virtual void Destroy() {
widget_->SendClose();
}
private:
RenderWidgetFullscreenPepper* widget_;
DISALLOW_COPY_AND_ASSIGN(WidgetFullscreenContainer);
};
} // anonymous namespace
// static
RenderWidgetFullscreenPepper* RenderWidgetFullscreenPepper::Create(
int32 opener_id, RenderThreadBase* render_thread,
pepper::PluginInstance* plugin) {
DCHECK_NE(MSG_ROUTING_NONE, opener_id);
scoped_refptr<RenderWidgetFullscreenPepper> widget =
new RenderWidgetFullscreenPepper(render_thread, plugin);
widget->Init(opener_id);
return widget.release();
}
RenderWidgetFullscreenPepper::RenderWidgetFullscreenPepper(
RenderThreadBase* render_thread, pepper::PluginInstance* plugin)
: RenderWidgetFullscreen(render_thread, WebKit::WebPopupTypeSelect),
plugin_(plugin),
ALLOW_THIS_IN_INITIALIZER_LIST(
container_(new WidgetFullscreenContainer(this))) {
}
RenderWidgetFullscreenPepper::~RenderWidgetFullscreenPepper() {
}
WebWidget* RenderWidgetFullscreenPepper::CreateWebWidget() {
return new PepperWidget(plugin_, this);
}
void RenderWidgetFullscreenPepper::Close() {
// If the fullscreen window is closed (e.g. user pressed escape), reset to
// normal mode.
if (plugin_)
plugin_->SetFullscreen(false);
}
void RenderWidgetFullscreenPepper::DidInitiatePaint() {
if (plugin_)
plugin_->ViewInitiatedPaint();
}
void RenderWidgetFullscreenPepper::DidFlushPaint() {
if (plugin_)
plugin_->ViewFlushedPaint();
}
void RenderWidgetFullscreenPepper::SendClose() {
// This function is called by the plugin instance as it's going away, so reset
// plugin_ to NULL to avoid calling into a dangling pointer e.g. on Close().
plugin_ = NULL;
Send(new ViewHostMsg_Close(routing_id_));
}
void RenderWidgetFullscreenPepper::GenerateFullRepaint() {
didInvalidateRect(gfx::Rect(size_.width(), size_.height()));
}