使用firebreath插件打开文件夹对话框并异步返回文件夹选择,这样就不会阻止java脚本

时间:2012-10-02 14:17:36

标签: javascript c++ firebreath

我希望一次只能打开一个文件夹选择对话框。 用户选择文件夹后,将触发事件,通知所选文件夹的javaScript。

要打开对话框,我在项目中包含了以下要点中的代码 DialogManager abstraction for FireBreath

pluginAPI cpp

我维护一个指向插件的全局指针,因此可以从任何上下文调用它的函数

问:这是最好的方法吗?

#include "DialogManagerWin.h"
pluginAPI * g_thePlugin;

我在pluginAPI CTOR

中设置了它
g_thePlugin = this;

pluginAPI.h

这适用于pluginAPI

这是我想给javascript选择文件夹的事件

FB_JSAPI_EVENT(folderselected, 1, (const std::string&));

从javaScript调用的API:

调用gist中的代码在另一个线程中打开文件夹选择,以避免阻塞并导致浏览器冻结。

void pluginAPI::SelectFolder(std::string initialFolderPath)
{
  FB::PluginWindow* pluginWindow = pluginAPI::getPlugin()->GetWindow();
  DialogManager* dlg_mgr = DialogManager::get();
  dlg_mgr->OpenFolderDialog(m_host, pluginWindow, folderSelectorCallback);

  return;
}

回调

一旦用户选择了文件夹

,就会调用此回调
void folderSelectorCallback(const std::string& folderSelected)
{
    g_thePlugin->fire_folderselected(folderSelected);
    return ;
}

1 个答案:

答案 0 :(得分:3)

首先,插件和根JSAPI对象之间存在差异;你正在维护一个指向根JSAPI对象的全局指针。

不,这不是一个好主意,你永远不应该这样做。

其次,你可能想要做的不是激活JSAPI事件,而是实际上只是调用异步回调。在FBTestPlugin和blog post on the subject中有一些例子。

你需要做的就是接受一个const JSObjectPtr& js函数的回调参数,然后将其传递给对话框抽象的回调。

如果你正在使用抽象,就像它在gist中一样,它看起来像这样:

void MyPluginAPI::someJavascriptMethod(const FB::JSObjectPtr& callback) {
    PathCallback dlgCallback = boost::bind(MyPluginAPI::doCallback, this, callback, _1);
    DialogManager::get()->OpenFolderDialog(m_host, getPlugin()->GetWindow(), dlgCallback);
}

void MyPluginAPI::doCallback(const FB::JSObjectPtr& callback, const std::string& path) {
    callback->InvokeAsync("", FB::variant_list_of(path));
}

尚未完全测试该代码,但应该接近。