First implementation of C++<->JS comms.

The Help menu item now opens the readme in the default browser.
This commit is contained in:
WrinklyNinja
2014-07-12 16:33:45 +01:00
parent c6beb23b89
commit fd5264240c
6 changed files with 103 additions and 5 deletions
+10 -1
View File
@@ -193,6 +193,15 @@ function openLogLocation(evt) {
}
function openReadme(evt) {
// Create and send a new query.
var request_id = window.cefQuery({
request: 'openReadme',
persistent: false,
onSuccess: function(response) {},
onFailure: function(error_code, error_message) {
alert(error_code + error_message);
}
});
}
function updateMasterlist(evt) {
@@ -575,7 +584,7 @@ function processURLParams() {
var activePluginNo = 0;
var dirtyPluginNo = 0;
/* Fill report with data. */
document.getElementById('LOOTVersion').textContent = data.lootVersion;
document.getElementById('LOOTVersion').textContent = loot.version;
document.getElementById('masterlistRevision').textContent = data.masterlist.revision.substr(0, 9);
document.getElementById('masterlistDate').textContent = data.masterlist.date;
var generalMessagesList = document.getElementById('generalMessages').getElementsByTagName('ul')[0];
-1
View File
@@ -1,5 +1,4 @@
var data = {
"lootVersion": "0.5.0",
"masterlist": {
"revision": "f66688fbe946396bc8fa1d5dadb7c8211c189cee",
"date": "2014-05-10"
+17 -1
View File
@@ -68,11 +68,28 @@ namespace loot {
CefBrowserHost::CreateBrowser(window_info, handler.get(), url, browser_settings, NULL);
}
void LootApp::OnWebKitInitialized() {
// Create the renderer-side router for query handling.
CefMessageRouterConfig config;
message_router_ = CefMessageRouterRendererSide::Create(config);
}
bool LootApp::OnProcessMessageReceived(
CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) {
// Handle IPC messages from the browser process...
return message_router_->OnProcessMessageReceived(browser, source_process, message);
}
void LootApp::OnContextCreated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context) {
// Register javascript functions.
message_router_->OnContextCreated(browser, frame, context);
// Retrieve the context's window object.
CefRefPtr<CefV8Value> object = context->GetGlobal();
@@ -85,7 +102,6 @@ namespace loot {
lootObj->SetValue("version", CefV8Value::CreateString(IntToString(g_version_major) + "." + IntToString(g_version_minor) + "." + IntToString(g_version_patch)), V8_PROPERTY_ATTRIBUTE_NONE);
// Add the string to the window object as "window.myval". See the "JS Objects" section below.
object->SetValue("loot", lootObj, V8_PROPERTY_ATTRIBUTE_NONE);
}
}
+11 -2
View File
@@ -26,6 +26,7 @@
#define __LOOT_GUI_APP__
#include <include/cef_app.h>
#include <include/wrapper/cef_message_router.h>
#include <yaml-cpp/yaml.h>
@@ -43,10 +44,18 @@ namespace loot {
// Override CefBrowserProcessHandler methods.
virtual void OnContextInitialized() OVERRIDE;
virtual void OnWebKitInitialized() OVERRIDE;
// Override CefRenderProcessHandler methods.
virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) OVERRIDE;
private:
CefRefPtr<CefMessageRouterRendererSide> message_router_;
virtual void OnContextCreated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context) OVERRIDE;
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context) OVERRIDE;
IMPLEMENT_REFCOUNTING(LootApp);
};
+43
View File
@@ -39,6 +39,34 @@ namespace loot {
LootHandler * g_instance = NULL;
}
// Handler methods
//----------------
Handler::Handler() {}
// Called due to cefQuery execution in binding.html.
bool Handler::OnQuery(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
int64 query_id,
const CefString& request,
bool persistent,
CefRefPtr<Callback> callback) {
const std::string& message_name = request;
if (message_name.find("openReadme") == 0) {
// Open readme in default application.
std::string url = ToFileURL(g_path_readme);
int len = MultiByteToWideChar(CP_UTF8, 0, url.c_str(), url.length() + 1, 0, 0);
std::wstring wurl(len, NULL);
MultiByteToWideChar(CP_UTF8, 0, url.c_str(), url.length() + 1, &(wurl[0]), len);
ShellExecute(0, NULL, wurl.c_str(), NULL, NULL, SW_SHOWNORMAL);
callback->Success(request);
return true;
}
return false;
}
LootHandler::LootHandler() : is_closing_(false) {
assert(!g_instance);
g_instance = this;
@@ -67,6 +95,12 @@ namespace loot {
return this;
}
bool LootHandler::OnProcessMessageReceived( CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) {
return browser_side_router_->OnProcessMessageReceived(browser, source_process, message);
}
// CefDisplayHandler methods
//--------------------------
@@ -95,6 +129,12 @@ namespace loot {
// Add to the list of existing browsers.
browser_list_.push_back(browser);
// Create a message router.
CefMessageRouterConfig config;
browser_side_router_ = CefMessageRouterBrowserSide::Create(config);
browser_side_router_->AddHandler(new Handler(), false);
}
bool LootHandler::DoClose(CefRefPtr<CefBrowser> browser) {
@@ -116,6 +156,9 @@ namespace loot {
void LootHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
assert(CefCurrentlyOn(TID_UI));
// Cancel any javascript callbacks.
browser_side_router_->OnBeforeClose(browser);
// Remove from the list of existing browsers.
for (BrowserList::iterator bit = browser_list_.begin(); bit != browser_list_.end(); ++bit) {
if ((*bit)->IsSame(browser)) {
+22
View File
@@ -25,12 +25,29 @@
#ifndef __LOOT_GUI_HANDLER__
#define __LOOT_GUI_HANDLER__
#include "../backend/globals.h"
#include "../backend/helpers.h"
#include <include/cef_client.h>
#include <include/wrapper/cef_message_router.h>
#include <list>
namespace loot {
class Handler : public CefMessageRouterBrowserSide::Handler {
public:
Handler();
// Called due to cefQuery execution in binding.html.
virtual bool OnQuery(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
int64 query_id,
const CefString& request,
bool persistent,
CefRefPtr<Callback> callback) OVERRIDE;
};
class LootHandler : public CefClient,
public CefDisplayHandler,
public CefLifeSpanHandler,
@@ -48,6 +65,10 @@ namespace loot {
virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE;
virtual CefRefPtr<CefLoadHandler> GetLoadHandler() OVERRIDE;
virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) OVERRIDE;
// CefDisplayHandler methods
//--------------------------
virtual void OnTitleChange(CefRefPtr<CefBrowser> browser,
@@ -76,6 +97,7 @@ namespace loot {
// List of existing browser windows. Only accessed on the CEF UI thread.
typedef std::list<CefRefPtr<CefBrowser> > BrowserList;
BrowserList browser_list_;
CefRefPtr<CefMessageRouterBrowserSide> browser_side_router_;
bool is_closing_;