⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pluginviewgtk.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -