📄 pluginviewgtk.cpp
字号:
/* * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. * Copyright (C) 2008 Collabora Ltd. 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 "PluginView.h"#include "Document.h"#include "DocumentLoader.h"#include "Element.h"#include "FrameLoader.h"#include "FrameLoadRequest.h"#include "FrameTree.h"#include "Frame.h"#include "FrameView.h"#include "GraphicsContext.h"#include "Image.h"#include "HTMLNames.h"#include "HTMLPlugInElement.h"#include "KeyboardEvent.h"#include "MouseEvent.h"#include "NotImplemented.h"#include "Page.h"#include "PlatformMouseEvent.h"#include "PluginDebug.h"#include "PluginPackage.h"#include "RenderLayer.h"#include "Settings.h"#include "JSDOMBinding.h"#include "ScriptController.h"#include "npruntime_impl.h"#include "runtime.h"#include "runtime_root.h"#include <runtime/JSLock.h>#include <runtime/JSValue.h>#include <gdkconfig.h>#include <gtk/gtk.h>#if PLATFORM(X11)#include "gtk2xtbin.h"#include <gdk/gdkx.h>#endif#ifdef GDK_WINDOWING_WIN32#include "PluginMessageThrottlerWin.h"#include <gdk/gdkwin32.h>#endifusing JSC::ExecState;using JSC::Interpreter;using JSC::JSLock;using JSC::JSObject;using JSC::UString;using std::min;using namespace WTF;namespace WebCore {using namespace HTMLNames;bool PluginView::dispatchNPEvent(NPEvent& event){ // sanity check if (!m_plugin->pluginFuncs()->event) return false; PluginView::setCurrentPluginView(this); JSC::JSLock::DropAllLocks dropAllLocks(false); setCallingPlugin(true); bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event); setCallingPlugin(false); PluginView::setCurrentPluginView(0); return accepted;}void PluginView::updatePluginWidget(){ if (!parent() || !m_isWindowed) return; ASSERT(parent()->isFrameView()); FrameView* frameView = static_cast<FrameView*>(parent()); IntRect oldWindowRect = m_windowRect; IntRect oldClipRect = m_clipRect; m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size()); m_clipRect = windowClipRect(); m_clipRect.move(-m_windowRect.x(), -m_windowRect.y()); if (platformPluginWidget() && (m_windowRect != oldWindowRect || m_clipRect != oldClipRect)) setNPWindowIfNeeded();}void PluginView::setFocus(){ if (platformPluginWidget()) gtk_widget_grab_focus(platformPluginWidget()); Widget::setFocus();}void PluginView::show(){ setSelfVisible(true); if (isParentVisible() && platformPluginWidget()) gtk_widget_show(platformPluginWidget()); Widget::show();}void PluginView::hide(){ setSelfVisible(false); if (isParentVisible() && platformPluginWidget()) gtk_widget_hide(platformPluginWidget()); Widget::hide();}void PluginView::paint(GraphicsContext* context, const IntRect& rect){ if (!m_isStarted) { paintMissingPluginIcon(context, rect); return; } if (context->paintingDisabled()) return; setNPWindowIfNeeded(); if (m_isWindowed) return; NPEvent npEvent; /* Need to synthesize Xevents here */ m_npWindow.type = NPWindowTypeDrawable; ASSERT(parent()->isFrameView()); if (!dispatchNPEvent(npEvent)) LOG(Events, "PluginView::paint(): Paint event not accepted");}void PluginView::handleKeyboardEvent(KeyboardEvent* event){ NPEvent npEvent; /* FIXME: Synthesize an XEvent to pass through */ JSC::JSLock::DropAllLocks dropAllLocks(false); if (!dispatchNPEvent(npEvent)) event->setDefaultHandled();}void PluginView::handleMouseEvent(MouseEvent* event){ NPEvent npEvent; if (!m_isWindowed) return; /* FIXME: Synthesize an XEvent to pass through */ IntPoint p = static_cast<FrameView*>(parent())->contentsToWindow(IntPoint(event->pageX(), event->pageY())); JSC::JSLock::DropAllLocks dropAllLocks(false); if (!dispatchNPEvent(npEvent)) event->setDefaultHandled();}void PluginView::setParent(ScrollView* parent){ Widget::setParent(parent); if (parent) init(); else { if (!platformPluginWidget()) return; }}void PluginView::setNPWindowRect(const IntRect&){ setNPWindowIfNeeded();}void PluginView::setNPWindowIfNeeded(){ if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow) return; m_npWindow.x = m_windowRect.x(); m_npWindow.y = m_windowRect.y(); m_npWindow.width = m_windowRect.width(); m_npWindow.height = m_windowRect.height(); m_npWindow.clipRect.left = m_clipRect.x(); m_npWindow.clipRect.top = m_clipRect.y(); m_npWindow.clipRect.right = m_clipRect.width(); m_npWindow.clipRect.bottom = m_clipRect.height(); GtkAllocation allocation = { m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height() }; gtk_widget_size_allocate(platformPluginWidget(), &allocation);#if PLATFORM(X11) if (!m_needsXEmbed) { gtk_xtbin_set_position(GTK_XTBIN(platformPluginWidget()), m_windowRect.x(), m_windowRect.y()); gtk_xtbin_resize(platformPluginWidget(), m_windowRect.width(), m_windowRect.height()); }#endif PluginView::setCurrentPluginView(this); JSC::JSLock::DropAllLocks dropAllLocks(false); setCallingPlugin(true); m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow); setCallingPlugin(false); PluginView::setCurrentPluginView(0);}void PluginView::setParentVisible(bool visible){ if (isParentVisible() == visible) return; Widget::setParentVisible(visible); if (isSelfVisible() && platformPluginWidget()) { if (visible) gtk_widget_show(platformPluginWidget()); else gtk_widget_hide(platformPluginWidget()); }}void PluginView::stop(){ if (!m_isStarted) return; HashSet<RefPtr<PluginStream> > streams = m_streams; HashSet<RefPtr<PluginStream> >::iterator end = streams.end(); for (HashSet<RefPtr<PluginStream> >::iterator it = streams.begin(); it != end; ++it) { (*it)->stop(); disconnectStream((*it).get()); } ASSERT(m_streams.isEmpty()); m_isStarted = false; JSC::JSLock::DropAllLocks dropAllLocks(false); // Clear the window m_npWindow.window = 0; if (m_plugin->pluginFuncs()->setwindow && !m_plugin->quirks().contains(PluginQuirkDontSetNullWindowHandleOnDestroy)) { PluginView::setCurrentPluginView(this); setCallingPlugin(true); m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow); setCallingPlugin(false); PluginView::setCurrentPluginView(0); }#ifdef XP_UNIX if (m_isWindowed && m_npWindow.ws_info) delete (NPSetWindowCallbackStruct *)m_npWindow.ws_info; m_npWindow.ws_info = 0;#endif // Destroy the plugin { PluginView::setCurrentPluginView(this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -