@@ -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+
50120void 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+
64149void 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) {
77162void 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+
95187bool ClientHandler::OnQuotaRequest (CefRefPtr<CefBrowser> browser,
96188 const CefString& origin_url,
97189 int64 new_size,
0 commit comments