Skip to content

Commit f30b4a0

Browse files
committed
Add new options: log_file, log_severity, cache_path, ... (#221)
remote_debugging_port, external_drag, command_line_switches, context_menu. WebRTC and Flash are enabled by default from now on.
1 parent 648ac50 commit f30b4a0

File tree

12 files changed

+276
-17
lines changed

12 files changed

+276
-17
lines changed

build.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ if [[ ${rc} = 0 ]]; then
3535
fi
3636
cp -r src/www/ build/bin/
3737
./build/bin/phpdesktop
38-
rm -r blob_storage/
39-
rm -r GPUCache/
38+
#rm -r build/bin/blob_storage/
39+
#rm -r build/bin/GPUCache/
4040
else
4141
echo "ERROR";
4242
exit ${rc};

src/app.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,62 @@
55
#include "app.h"
66
#include "include/wrapper/cef_helpers.h"
77
#include "print_handler_gtk.h"
8+
#include "settings.h"
89

910
App::App() {
1011
}
1112

13+
// CefApp
14+
15+
void App::OnBeforeCommandLineProcessing(
16+
const CefString& process_type,
17+
CefRefPtr<CefCommandLine> command_line) {
18+
// command_line_switches option
19+
if (process_type.empty()) {
20+
// Browser process type is an empty string
21+
json_value* app_settings = get_app_settings();
22+
json_value switches =
23+
(*app_settings)["chrome"]["command_line_switches"];
24+
if (switches.type == json_object) {
25+
int length = switches.u.object.length;
26+
for (int i = 0; i < length; i++) {
27+
std::string name = switches.u.object.values[i].name;
28+
std::string value = static_cast<const char*>(
29+
*switches.u.object.values[i].value);
30+
if (name.find("-") == 0) {
31+
LOG(WARNING) << "Invalid command line switch: " << name;
32+
continue;
33+
}
34+
if (value.empty()) {
35+
LOG(INFO) << "Processing switch: " << name;
36+
} else {
37+
LOG(INFO) << "Processing switch: " << name << "=" << value;
38+
}
39+
if (command_line->HasSwitch(name)) {
40+
if (value.empty()) {
41+
// Switch already set, do nothing
42+
} else {
43+
std::string old_value =
44+
command_line->GetSwitchValue(name);
45+
if (old_value != value) {
46+
// Overwrite the switch with a new value
47+
command_line->AppendSwitchWithValue(name, value);
48+
}
49+
}
50+
} else {
51+
if (value.empty()) {
52+
command_line->AppendSwitch(name);
53+
} else {
54+
command_line->AppendSwitchWithValue(name, value);
55+
}
56+
}
57+
}
58+
}
59+
}
60+
}
61+
62+
// CefBrowserProcessHandler
63+
1264
void App::OnContextInitialized() {
1365
CEF_REQUIRE_UI_THREAD();
1466
print_handler_ = new ClientPrintHandlerGtk();

src/app.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@ class App : public CefApp,
1111
public:
1212
App();
1313

14-
// CefApp methods:
14+
// CefApp
1515
virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()
1616
override {
1717
return this;
1818
}
19+
virtual void OnBeforeCommandLineProcessing(
20+
const CefString& process_type,
21+
CefRefPtr<CefCommandLine> command_line) override;
1922

20-
// CefBrowserProcessHandler methods:
23+
// CefBrowserProcessHandler
2124
virtual void OnContextInitialized() override;
2225
virtual CefRefPtr<CefPrintHandler> GetPrintHandler() override;
2326

src/client_handler.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,76 @@ CefRefPtr<CefBrowser> ClientHandler::FindBrowserByXid(::Window xid) {
4747
return NULL;
4848
}
4949

50+
// CefContextMenuHandler
51+
52+
#define _MENU_ID_DEVTOOLS MENU_ID_USER_FIRST + 1
53+
#define _MENU_ID_RELOAD_PAGE MENU_ID_USER_FIRST + 2
54+
55+
void ClientHandler::OnBeforeContextMenu(CefRefPtr<CefBrowser> browser,
56+
CefRefPtr<CefFrame> frame,
57+
CefRefPtr<CefContextMenuParams> params,
58+
CefRefPtr<CefMenuModel> model) {
59+
CEF_REQUIRE_UI_THREAD();
60+
61+
json_value* settings = get_app_settings();
62+
bool enable_menu = (*settings)["chrome"]["context_menu"]["enable_menu"];
63+
bool navigation = (*settings)["chrome"]["context_menu"]["navigation"];
64+
bool print = (*settings)["chrome"]["context_menu"]["print"];
65+
bool view_source = (*settings)["chrome"]["context_menu"]["view_source"];
66+
bool devtools = (*settings)["chrome"]["context_menu"]["devtools"];
67+
68+
if (!enable_menu) {
69+
model->Clear();
70+
return;
71+
}
72+
73+
if (!navigation) {
74+
model->Remove(MENU_ID_BACK);
75+
model->Remove(MENU_ID_FORWARD);
76+
// Remote separator.
77+
model->RemoveAt(0);
78+
}
79+
if (!print) {
80+
model->Remove(MENU_ID_PRINT);
81+
}
82+
if (!view_source) {
83+
model->Remove(MENU_ID_VIEW_SOURCE);
84+
}
85+
86+
if (!params->IsEditable() && params->GetSelectionText().empty()
87+
&& (params->GetPageUrl().length()
88+
|| params->GetFrameUrl().length())) {
89+
if (navigation) {
90+
model->InsertItemAt(2, _MENU_ID_RELOAD_PAGE, "Reload");
91+
}
92+
if (devtools) {
93+
model->AddSeparator();
94+
model->AddItem(_MENU_ID_DEVTOOLS, "Show Developer Tools");
95+
}
96+
}
97+
}
98+
99+
bool ClientHandler::OnContextMenuCommand(CefRefPtr<CefBrowser> browser,
100+
CefRefPtr<CefFrame> frame,
101+
CefRefPtr<CefContextMenuParams> params,
102+
int command_id,
103+
EventFlags event_flags) {
104+
CEF_REQUIRE_UI_THREAD();
105+
if (command_id == _MENU_ID_RELOAD_PAGE) {
106+
browser->ReloadIgnoreCache();
107+
return true;
108+
} else if (command_id == _MENU_ID_DEVTOOLS) {
109+
CefWindowInfo window_info;
110+
CefBrowserSettings settings;
111+
CefPoint inspect;
112+
browser->GetHost()->ShowDevTools(window_info, NULL, settings, inspect);
113+
return true;
114+
}
115+
return false;
116+
}
117+
118+
// CefDownloadHandler
119+
50120
void ClientHandler::OnBeforeDownload(
51121
CefRefPtr<CefBrowser> browser,
52122
CefRefPtr<CefDownloadItem> download_item,
@@ -61,6 +131,21 @@ void ClientHandler::OnBeforeDownload(
61131
}
62132
}
63133

134+
// CefDragHandler
135+
136+
bool ClientHandler::OnDragEnter(CefRefPtr<CefBrowser> browser,
137+
CefRefPtr<CefDragData> dragData,
138+
DragOperationsMask mask) {
139+
bool external_drag = (*get_app_settings())["chrome"]["external_drag"];
140+
if (external_drag) {
141+
return false;
142+
} else {
143+
return true;
144+
}
145+
}
146+
147+
// CefLifeSpanHandler
148+
64149
void ClientHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
65150
CEF_REQUIRE_UI_THREAD();
66151
// Add to the list of existing browsers.
@@ -77,6 +162,11 @@ void ClientHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
77162
void ClientHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
78163
CEF_REQUIRE_UI_THREAD();
79164

165+
// Cookies are not flushed to disk when closing app immediately.
166+
// Need to call FlushStore manually when browser is closing.
167+
browser->GetHost()->GetRequestContext()->GetDefaultCookieManager(NULL)
168+
->FlushStore(NULL);
169+
80170
// Remove from the list of existing browsers.
81171
BrowserList::iterator bit = browser_list_.begin();
82172
for (; bit != browser_list_.end(); ++bit) {
@@ -92,6 +182,8 @@ void ClientHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
92182
}
93183
}
94184

185+
// CefRequestHandler
186+
95187
bool ClientHandler::OnQuotaRequest(CefRefPtr<CefBrowser> browser,
96188
const CefString& origin_url,
97189
int64 new_size,

src/client_handler.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
#include "dialog_handler_gtk.h"
1111

1212
class ClientHandler : public CefClient,
13+
public CefContextMenuHandler,
1314
public CefDisplayHandler,
1415
public CefDownloadHandler,
16+
public CefDragHandler,
1517
public CefLifeSpanHandler,
1618
public CefLoadHandler,
1719
public CefRequestHandler
@@ -26,6 +28,9 @@ class ClientHandler : public CefClient,
2628
virtual CefRefPtr<CefBrowser> FindBrowserByXid(::Window xid);
2729

2830
// CefClient methods:
31+
CefRefPtr<CefContextMenuHandler> GetContextMenuHandler() override {
32+
return this;
33+
}
2934
CefRefPtr<CefDialogHandler> GetDialogHandler() override {
3035
return dialog_handler_;
3136
}
@@ -35,6 +40,9 @@ class ClientHandler : public CefClient,
3540
CefRefPtr<CefDownloadHandler> GetDownloadHandler() override {
3641
return this;
3742
}
43+
CefRefPtr<CefDragHandler> GetDragHandler() override {
44+
return this;
45+
}
3846
CefRefPtr<CefJSDialogHandler> GetJSDialogHandler() override {
3947
return dialog_handler_;
4048
}
@@ -48,13 +56,29 @@ class ClientHandler : public CefClient,
4856
return this;
4957
}
5058

59+
// CefContextMenuHandler
60+
virtual void OnBeforeContextMenu(CefRefPtr<CefBrowser> browser,
61+
CefRefPtr<CefFrame> frame,
62+
CefRefPtr<CefContextMenuParams> params,
63+
CefRefPtr<CefMenuModel> model) override;
64+
virtual bool OnContextMenuCommand(CefRefPtr<CefBrowser> browser,
65+
CefRefPtr<CefFrame> frame,
66+
CefRefPtr<CefContextMenuParams> params,
67+
int command_id,
68+
EventFlags event_flags) override;
69+
5170
// CefDownloadHandler
5271
virtual void OnBeforeDownload(
5372
CefRefPtr<CefBrowser> browser,
5473
CefRefPtr<CefDownloadItem> download_item,
5574
const CefString& suggested_name,
5675
CefRefPtr<CefBeforeDownloadCallback> callback) override;
5776

77+
// CefDragHandler
78+
virtual bool OnDragEnter(CefRefPtr<CefBrowser> browser,
79+
CefRefPtr<CefDragData> dragData,
80+
DragOperationsMask mask) override;
81+
5882
// CefLifeSpanHandler
5983
virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) override;
6084
virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) override;

src/main.cpp

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,51 @@ int main(int argc, char **argv) {
164164
// Start Mongoose server
165165
mongoose_start();
166166

167-
// Specify CEF global settings here.
168-
CefSettings settings;
169-
settings.no_sandbox = true;
170-
CefString( &settings.log_file ) = "debug.log"; // @TODO from settings.json
171-
settings.log_severity = LOGSEVERITY_INFO; // @TODO from settings.json
172-
// @TODO cache_path settings.json option
167+
// Specify CEF global settings here
168+
CefSettings cef_settings;
169+
cef_settings.no_sandbox = true;
170+
171+
// log_file
172+
std::string log_file((*app_settings)["chrome"]["log_file"]);
173+
log_file = get_full_path(log_file);
174+
CefString(&cef_settings.log_file) = log_file;
175+
176+
// log_severity
177+
std::string log_severity((*app_settings)["chrome"]["log_severity"]);
178+
if (log_severity == "verbose") {
179+
cef_settings.log_severity = LOGSEVERITY_VERBOSE;
180+
} else if (log_severity == "info") {
181+
cef_settings.log_severity = LOGSEVERITY_INFO;
182+
} else if (log_severity == "warning") {
183+
cef_settings.log_severity = LOGSEVERITY_WARNING;
184+
} else if (log_severity == "error") {
185+
cef_settings.log_severity = LOGSEVERITY_ERROR;
186+
} else if (log_severity == "disable") {
187+
cef_settings.log_severity = LOGSEVERITY_DISABLE;
188+
} else {
189+
cef_settings.log_severity = LOGSEVERITY_DEFAULT;
190+
}
173191

174-
// Remote debugging port
175-
// @todo from settings.json
192+
// cache_path
193+
std::string cache_path((*app_settings)["chrome"]["cache_path"]);
194+
cache_path = get_full_path(cache_path);
195+
CefString(&cef_settings.cache_path) = cache_path;
196+
197+
// remote_debugging_port
198+
int remote_debugging_port(
199+
(*app_settings)["chrome"]["remote_debugging_port"]);
200+
if (remote_debugging_port == 0) {
201+
remote_debugging_port = random(49152, 65535+1);
202+
int i = 100;
203+
while (((i--) > 0)
204+
&& remote_debugging_port == mongoose_get_port_int()) {
205+
remote_debugging_port = random(49152, 65535+1);
206+
}
207+
}
208+
if (remote_debugging_port > 0) {
209+
LOG(INFO) << "remote_debugging_port = " << remote_debugging_port;
210+
cef_settings.remote_debugging_port = remote_debugging_port;
211+
}
176212

177213
// App implements application-level callbacks for the browser
178214
// process.
@@ -188,7 +224,7 @@ int main(int argc, char **argv) {
188224
// file only after CEF was initialized. Before CEF is initialized
189225
// all logs are only printed to console.
190226
LOG(INFO) << "Initialize CEF";
191-
CefInitialize(main_args, settings, app.get(), NULL);
227+
CefInitialize(main_args, cef_settings, app.get(), NULL);
192228

193229
// The Chromium sandbox requires that there only be a single thread during
194230
// initialization. Therefore initialize GTK after CEF.

src/mongoose_server.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
#include "version.h"
88
#include "include/base/cef_logging.h"
99

10-
std::string g_mongoose_port = "0"; // @TODO from settings.json
10+
std::string g_mongoose_port = "0";
11+
int g_mongoose_port_int = 0;
1112
std::string g_mongoose_ip_address = "127.0.0.1"; // @TODO from settings.json
1213
std::string g_mongoose_url = "";
1314

@@ -123,6 +124,7 @@ bool mongoose_start() {
123124
// When port was set to 0 then a random free port was assigned
124125
// by OS.
125126
int port = mg_get_listening_port(g_mongoose_context);
127+
g_mongoose_port_int = port;
126128
std::stringstream port_ss;
127129
port_ss << port;
128130
g_mongoose_port = port_ss.str();
@@ -149,6 +151,10 @@ std::string mongoose_get_port() {
149151
return g_mongoose_port;
150152
}
151153

154+
int mongoose_get_port_int() {
155+
return g_mongoose_port_int;
156+
}
157+
152158
std::string mongoose_get_ip_address() {
153159
return g_mongoose_ip_address;
154160
}

src/mongoose_server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
bool mongoose_start();
88
void mongoose_stop();
99
std::string mongoose_get_port();
10+
int mongoose_get_port_int();
1011
std::string mongoose_get_ip_address();
1112
std::string mongoose_get_url();

src/settings.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@
2424
"cache_path": "webcache",
2525
"external_drag": true,
2626
"remote_debugging_port": 0,
27-
"command_line_switches": {},
27+
"command_line_switches": {
28+
"enable-media-stream": "",
29+
"enable-system-flash": ""
30+
},
2831
"enable_downloads": true,
2932
"context_menu": {
3033
"enable_menu": true,
3134
"navigation": true,
3235
"print": true,
3336
"view_source": true,
34-
"open_in_external_browser": true,
3537
"devtools": true
3638
}
3739
}

0 commit comments

Comments
 (0)