📄 pluginviewgtk.cpp
字号:
setCallingPlugin(true); m_plugin->pluginFuncs()->destroy(m_instance, 0); setCallingPlugin(false); PluginView::setCurrentPluginView(0); } m_instance->pdata = 0;}static const char* MozillaUserAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0";const char* PluginView::userAgent(){ if (m_plugin->quirks().contains(PluginQuirkWantsMozillaUserAgent)) return MozillaUserAgent; if (m_userAgent.isNull()) m_userAgent = m_parentFrame->loader()->userAgent(m_url).utf8(); return m_userAgent.data();}const char* PluginView::userAgentStatic(){ //FIXME - Lie and say we are Mozilla return MozillaUserAgent;}NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf){ String filename(buf, len); if (filename.startsWith("file:///")) filename = filename.substring(8); // Get file info if (!g_file_test ((filename.utf8()).data(), (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))) return NPERR_FILE_NOT_FOUND; //FIXME - read the file data into buffer FILE* fileHandle = fopen((filename.utf8()).data(), "r"); if (fileHandle == 0) return NPERR_FILE_NOT_FOUND; //buffer.resize(); int bytesRead = fread(buffer.data(), 1, 0, fileHandle); fclose(fileHandle); if (bytesRead <= 0) return NPERR_FILE_NOT_FOUND; return NPERR_NO_ERROR;}NPError PluginView::getValueStatic(NPNVariable variable, void* value){ switch (variable) { case NPNVToolkit:#if PLATFORM(GTK) *static_cast<uint32*>(value) = 2;#else *static_cast<uint32*>(value) = 0;#endif return NPERR_NO_ERROR; case NPNVSupportsXEmbedBool:#if PLATFORM(X11) *static_cast<NPBool*>(value) = true;#else *static_cast<NPBool*>(value) = false;#endif return NPERR_NO_ERROR; case NPNVjavascriptEnabledBool: *static_cast<NPBool*>(value) = true; return NPERR_NO_ERROR; default: return NPERR_GENERIC_ERROR; }}NPError PluginView::getValue(NPNVariable variable, void* value){ switch (variable) { case NPNVxDisplay:#if PLATFORM(X11) if (m_needsXEmbed) *(void **)value = (void *)GDK_DISPLAY(); else *(void **)value = (void *)GTK_XTBIN(platformPluginWidget())->xtclient.xtdisplay; return NPERR_NO_ERROR;#else return NPERR_GENERIC_ERROR;#endif#if PLATFORM(X11) case NPNVxtAppContext: if (!m_needsXEmbed) { *(void **)value = XtDisplayToApplicationContext (GTK_XTBIN(platformPluginWidget())->xtclient.xtdisplay); return NPERR_NO_ERROR; } else return NPERR_GENERIC_ERROR;#endif#if ENABLE(NETSCAPE_PLUGIN_API) case NPNVWindowNPObject: { if (m_isJavaScriptPaused) return NPERR_GENERIC_ERROR; NPObject* windowScriptObject = m_parentFrame->script()->windowScriptNPObject(); // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugin/npruntime.html> if (windowScriptObject) _NPN_RetainObject(windowScriptObject); void** v = (void**)value; *v = windowScriptObject; return NPERR_NO_ERROR; } case NPNVPluginElementNPObject: { if (m_isJavaScriptPaused) return NPERR_GENERIC_ERROR; NPObject* pluginScriptObject = 0; if (m_element->hasTagName(appletTag) || m_element->hasTagName(embedTag) || m_element->hasTagName(objectTag)) pluginScriptObject = static_cast<HTMLPlugInElement*>(m_element)->getNPObject(); // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugin/npruntime.html> if (pluginScriptObject) _NPN_RetainObject(pluginScriptObject); void** v = (void**)value; *v = pluginScriptObject; return NPERR_NO_ERROR; }#endif case NPNVnetscapeWindow: {#if PLATFORM(X11) void* w = reinterpret_cast<void*>(value); *((XID *)w) = GDK_WINDOW_XWINDOW(m_parentFrame->view()->hostWindow()->platformWindow()->window);#endif#ifdef GDK_WINDOWING_WIN32 HGDIOBJ* w = reinterpret_cast<HGDIOBJ*>(value); *w = GDK_WINDOW_HWND(m_parentFrame->view()->hostWindow()->platformWindow()->window);#endif return NPERR_NO_ERROR; } default: return getValueStatic(variable, value); }}void PluginView::invalidateRect(const IntRect& rect){ if (m_isWindowed) { gtk_widget_queue_draw_area(GTK_WIDGET(platformPluginWidget()), rect.x(), rect.y(), rect.width(), rect.height()); return; } invalidateWindowlessPluginRect(rect);}void PluginView::invalidateRect(NPRect* rect){ if (!rect) { invalidate(); return; } IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top); invalidateRect(r);}void PluginView::forceRedraw(){ if (m_isWindowed) gtk_widget_queue_draw(platformPluginWidget()); else gtk_widget_queue_draw(m_parentFrame->view()->hostWindow()->platformWindow());}PluginView::~PluginView(){ stop(); deleteAllValues(m_requests); freeStringArray(m_paramNames, m_paramCount); freeStringArray(m_paramValues, m_paramCount); m_parentFrame->script()->cleanupScriptObjectsForPlugin(this); if (m_plugin && !(m_plugin->quirks().contains(PluginQuirkDontUnloadPlugin))) m_plugin->unload();}static gbooleanplug_removed_cb(GtkSocket *socket, gpointer){ return TRUE;}void PluginView::init(){ if (m_haveInitialized) return; m_haveInitialized = true; if (!m_plugin) { ASSERT(m_status == PluginStatusCanNotFindPlugin); return; } if (!m_plugin->load()) { m_plugin = 0; m_status = PluginStatusCanNotLoadPlugin; return; } if (!start()) { m_status = PluginStatusCanNotLoadPlugin; return; } if (m_plugin->pluginFuncs()->getvalue) { PluginView::setCurrentPluginView(this); JSC::JSLock::DropAllLocks dropAllLocks(false); setCallingPlugin(true); m_plugin->pluginFuncs()->getvalue(m_instance, NPPVpluginNeedsXEmbed, &m_needsXEmbed); setCallingPlugin(false); PluginView::setCurrentPluginView(0); }#if PLATFORM(X11) if (m_needsXEmbed) { setPlatformWidget(gtk_socket_new()); gtk_container_add(GTK_CONTAINER(m_parentFrame->view()->hostWindow()->platformWindow()), platformPluginWidget()); g_signal_connect(platformPluginWidget(), "plug_removed", G_CALLBACK(plug_removed_cb), NULL); } else if (m_isWindowed) setPlatformWidget(gtk_xtbin_new(m_parentFrame->view()->hostWindow()->platformWindow()->window, 0));#else setPlatformWidget(gtk_socket_new()); gtk_container_add(GTK_CONTAINER(m_parentFrame->view()->hostWindow()->platformWindow()), platformPluginWidget());#endif show(); if (m_isWindowed) { m_npWindow.type = NPWindowTypeWindow;#if PLATFORM(X11) NPSetWindowCallbackStruct *ws = new NPSetWindowCallbackStruct(); ws->type = 0; if (m_needsXEmbed) { gtk_widget_realize(platformPluginWidget()); m_npWindow.window = (void*)gtk_socket_get_id(GTK_SOCKET(platformPluginWidget())); ws->display = GDK_WINDOW_XDISPLAY(platformPluginWidget()->window); ws->visual = GDK_VISUAL_XVISUAL(gdk_drawable_get_visual(GDK_DRAWABLE(platformPluginWidget()->window))); ws->depth = gdk_drawable_get_visual(GDK_DRAWABLE(platformPluginWidget()->window))->depth; ws->colormap = GDK_COLORMAP_XCOLORMAP(gdk_drawable_get_colormap(GDK_DRAWABLE(platformPluginWidget()->window))); } else { m_npWindow.window = (void*)GTK_XTBIN(platformPluginWidget())->xtwindow; ws->display = GTK_XTBIN(platformPluginWidget())->xtdisplay; ws->visual = GTK_XTBIN(platformPluginWidget())->xtclient.xtvisual; ws->depth = GTK_XTBIN(platformPluginWidget())->xtclient.xtdepth; ws->colormap = GTK_XTBIN(platformPluginWidget())->xtclient.xtcolormap; } XFlush (ws->display); m_npWindow.ws_info = ws;#elif defined(GDK_WINDOWING_WIN32) m_npWindow.window = (void*)GDK_WINDOW_HWND(platformPluginWidget()->window);#endif } else { m_npWindow.type = NPWindowTypeDrawable; m_npWindow.window = 0; } // TODO remove in favor of null events, like mac port? if (!(m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))) updatePluginWidget(); // was: setNPWindowIfNeeded(), but this doesn't produce 0x0 rects at first go m_status = PluginStatusLoadedSuccessfully;}} // namespace WebCore
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -