我有一个针对OS X的Chromium客户端实现。我想支持对我的chrome客户端内部可以读取和显示的数据文件的双击操作。为此我需要实现方法application:openFile
。在应用程序完全初始化之前很长时间调用此方法。为此,我需要在完全初始化chrome客户端并且存在NSWindow之后调用application:openFile
。
在铬完全初始化并且可以使用镀铬窗口后,会自动调用哪种方法?
答案 0 :(得分:0)
班级CefLoadHandler
有一个名为OnLoadEnd
的方法。当浏览器加载web-app
时,将调用此方法。不过要小心!目前,web-app
的JavaScript部分不得已初始化。因此,如果您依赖于完整初始化的JavaScript(所有JavaScript对象等),那么您必须在JavaScript代码中进行检查。
查看完整答案如何为Chromium Clients实施application:openFile
:
经过大量的研究和调试后,我想出了一个解决方案,如何在OS X上为基于Chromium的应用程序实现application:openFile
。首先,有3个部分/层需要解决
application:openFile
从 1 开始:
application:openFile的Apple文档已在讨论部分中描述,application:openFile
之前调用了applicationDidFinishLaunching
。这意味着,如果你依赖一个完整的初始化客户端(我无法想象它是怎么回事?),你必须在某处存储文件的URL,例如application:openFile
中的ivar/property或我的std::vector
Chromium handler
中我的示例中的{{3}}。只有当应用程序完全初始化并显示浏览器窗口时,您才能直接调用Chromium handler method
,然后调用相应的JavaScript函数!
// ***
// application:openFile
// ***
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename {
AUApplication * clientApp = (AUApplication *)theApplication;
NSWindow* targetWindow = [clientApp findTargetWindow];
//Check if browser window is up and running
if (targetWindow) {
[self processFile:filename];
}
else {
//This method saves the file URL to open the file
//when the application+JavaScript is fully initialized
au::test::Handler* handler = au::test::Handler::GetInstance();
handler->AddPendingFile([filename UTF8String]);
}
return YES;
}
// ***
// processFile
// ***
- (BOOL)processFile:(NSString *)file
{
//This method calls the JavaScript function to open the file
std::string fileName([file UTF8String]);
au::test::Handler* handler = au::test::Handler::GetInstance();
handler->OnOpenFile(fileName);
return YES;
}
2 部分:
在Chromium side
上,您必须将文件URL存储在适当的结构中。我正在使用std::vector
。文件网址保存在Chromium方法OnLoadEnd
中。这里Chromium已经在浏览器中加载了您的HTML + JavaScript部分。不过要小心。 JavaScript的初始化还没有完成!在下面的示例中,我必须指定一个JavaScript属性来存储文件URL。
// ***
// Handler::OnLoadEnd
// ***
void Handler::OnLoadEnd(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
int httpStatusCode) {
if (!m_pendingOpenFiles.empty()) {
std::string file(m_pendingOpenFiles[0]);
std::cout << "Pending file for later opening: " << file << std::endl;
//This method below is calling a JavaScript function to assign
//a property `pendingFile`
OnPendingFile(file);
//Don't forget to pop the file URL afterwards
//or use another store container instead of `std::vector`
//if you don't plan to implement `application:openFiles` as well!!!
m_pendingOpenFiles.pop_back();
}
}
3 部分:
在JavaScript方面,如果分配了属性pendingFile
,则必须在应用程序初始化后进行检查,以便正确打开文件。