FireBreath插件不会在所有插件实例上绘制

时间:2016-07-17 19:27:06

标签: c++ opengl firebreath browser-plugin

我正在构建一个浏览器插件,它将在浏览器窗口中以幻灯片形式绘制图片,但是我创建的插件仅在第一个插件实例上绘制。如果我打开插件的多个实例,它会继续在第一个插件窗口上绘制,重叠每张图片。

我正在使用opengl从网址中绘制图片。

以下是使用线程在循环中绘制虚拟opengl tringle的代码:

FB :: PluginWindowWin * pluginWindowWin = dynamic_cast(pluginWindow);

EnableOpenGL(pluginWindowWin->getHWND(), &hDC, &hRC);
SetFocus(pluginWindowWin->getHWND());
//FB::
static int fps = 1;
GLfloat rotate = 0;
static double start = 0, diff, wait;
wait = 1 / fps;

//return 0;
while (true)
{

    //lets check for keyboard input
    try
    {
        FB::Rect pos = pluginWindow->getWindowPosition();

        PAINTSTRUCT ps;
        if (pluginWindowWin){
            hDC = BeginPaint(pluginWindowWin->getHWND(), &ps);

            pos.right -= pos.left;
            pos.left = 0;
            pos.bottom -= pos.top;
            pos.top = 0;

            rotate += 0.1f;

            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT);

            glPushMatrix();
            glRotatef(rotate, 0.0f, 1.0f, 0.0f);
            glBegin(GL_TRIANGLES);

            glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
            glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f);
            glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f);
            glEnd();

            glBegin(GL_QUADS);                                              // Draw A Quad
            glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.0f);                           // Top Left
            glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f);                            // Top Right
            glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.0f);                           // Bottom Right
            glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f);                           // Bottom Left
            glEnd();                                                        // Done Drawing The Quad
            glPopMatrix();
            glRotatef(rotate, 0.0f, 1.0f, 0.0f);


            SwapBuffers(hDC);
        }
        //rtri+=0.1f;
        ::SetTextAlign(hDC, TA_CENTER | TA_BASELINE);
        LPCTSTR pszText = _T("FireBreath Plugin!\n:-)");

        ::TextOut(hDC, pos.left + (pos.right - pos.left) / 2, pos.top + (pos.bottom - pos.top) / 2, pszText, lstrlen(pszText));

        if (pluginWindowWin) {
            // Release the device context
            EndPaint(pluginWindowWin->getHWND(), &ps);
        }
    }
    catch (...)
    {
        return 0;
    }



    Sleep(10);


}//end of while run

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

根据你在评论中告诉我的内容,你的主要问题是你从一个有缺陷的例子开始。请记住,插件的每个实例都在同一个进程中启动;您正在使用的示例是一个简化的示例,它不使用插件的良好实践。更具体地说,它使用了几个全局变量。

除了你是线程之外,似乎没有做任何锁定以确保你完全线程安全。你生活在别人的过程中,你不拥有它 - 浏览器就是这样。你需要非常小心很多事情。

你的崩溃很可能与你的线程代码中没有干净关闭或者竞争条件有关。排除故障的最佳方法是附加一个调试器,找出它崩溃的地方,而不是只是在圈子里跑来跑去询问“为什么???为什么???!” (显然是为了效果)。你会感到震惊的是,很少有人做这么简单的步骤 - 连接一个调试器 - 直到我告诉他们,但它应该是你解决崩溃的第一步。

最后,值得一提的是:您是否意识到您正在使用6个月内无法使用的技术来构建它? FireFox将在今年年底取消对NPAPI的支持。我希望ActiveX的工作时间比这要长一些,但是edge不支持它。

FireBreath 2(在2.0分支中)是firebreath 1的一个重大变化,但它通过本机消息支持Chrome,并且也支持FireFox。有很多trying to convince MS to add native messaging support to Edge,但我们会看到这是怎么回事。请随意关注该链接并进行投票,因为它对我有所帮助,我怀疑。

事实是,你没有得到SDL或SDL2 w / native messaging;你必须使用WebGL并在javascript端执行dev,然后通过本机消息传递数据。或者你可以考虑使用NaCL,它有一些opengl /绘图的东西(甚至可能是SDL?不确定)但是是沙箱,可能有也可能没有你需要的网络东西。当然,它也适用于Chrome。

深思熟虑。祝你好运。