22529536dea929d9cae14c7c924831fe47eee8e3
[platform/framework/web/chromium-efl.git] / tizen_src / ewk / efl_integration / public / ewk_context.cc
1 // Copyright 2013-2015 Samsung Electronics. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ewk_context.h"
6
7 // TODO: remove dependency
8 #include <../src/base/memory/ref_counted.h>
9 #include <../impl/browser/vibration/vibration_provider_client.h>
10 #include <../impl/browser_context_efl.h>
11 #include <../impl/http_user_agent_settings_efl.h>
12 #include <../impl/API/ewk_cookie_manager_private.h>
13 #include <../impl/API/ewk_context_form_autofill_profile_private.h>
14
15 #include <tizen_webview/public/tw_security_origin.h>
16 #include <tizen_webview/public/tw_web_context.h>
17 #include <tizen_webview/public/tw_url.h>
18
19 #include "public/ewk_security_origin.h"
20 #include "private/ewk_context_private.h"
21 #include "private/ewk_private.h"
22 #include "private/ewk_security_origin_private.h"
23 #include "private/chromium_glue.h"
24 #include "private/ewk_favicon_database_private.h"
25
26
27 using tizen_webview::WebContext;
28
29 Ewk_Context *ewk_context_ref(Ewk_Context *context)
30 {
31   EINA_SAFETY_ON_NULL_RETURN_VAL(context, NULL);
32   context->AddRef();
33   return context;
34 }
35
36 void ewk_context_unref(Ewk_Context *context)
37 {
38   EINA_SAFETY_ON_NULL_RETURN(context);
39   context->Release();
40 }
41
42 Ewk_Cookie_Manager* ewk_context_cookie_manager_get(const Ewk_Context* context)
43 {
44   EINA_SAFETY_ON_NULL_RETURN_VAL(context, 0);
45   return context->ewkCookieManager();
46 }
47
48 Ewk_Context* ewk_context_default_get()
49 {
50   return static_cast<Ewk_Context*>(WebContext::DefaultContext());
51 }
52
53 Ewk_Context* ewk_context_new()
54 {
55   return static_cast<Ewk_Context*>(WebContext::Create());
56 }
57
58 Ewk_Context *ewk_context_new_with_injected_bundle_path(const char *path)
59 {
60   //with chromium engine this API not used.
61   //returning default context
62   NOTIMPLEMENTED();
63   return NULL;
64 }
65
66 void ewk_context_delete(Ewk_Context* context)
67 {
68   if (context)
69     context->Release();
70 }
71
72 void ewk_context_proxy_uri_set(Ewk_Context* context, const char* proxy)
73 {
74   // browser only api
75   EINA_SAFETY_ON_NULL_RETURN(context);
76   EINA_SAFETY_ON_NULL_RETURN(proxy);
77   if (0 != strcmp(proxy,""))
78     context->SetProxyUri(proxy);
79 }
80
81 const char* ewk_context_proxy_uri_get(Ewk_Context* context)
82 {
83   EINA_SAFETY_ON_NULL_RETURN_VAL(context,0);
84   return context->GetProxyUri();
85 }
86
87 Eina_Bool ewk_context_notify_low_memory(Ewk_Context* context)
88 {
89   EINA_SAFETY_ON_NULL_RETURN_VAL(context, false);
90   context->NotifyLowMemory();
91   return true;
92 }
93
94 Eina_Bool ewk_context_origins_free(Eina_List* origins)
95 {
96   EINA_SAFETY_ON_NULL_RETURN_VAL(origins, false);
97
98   void* current_origin;
99   EINA_LIST_FREE(origins, current_origin) {
100     Ewk_Security_Origin* origin = static_cast<Ewk_Security_Origin*>(current_origin);
101     delete origin;
102   }
103   return true;
104 }
105
106 Eina_Bool ewk_context_application_cache_delete_all(Ewk_Context* context)
107 {
108   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
109   context->DeleteAllApplicationCache();
110   return true;
111 }
112
113 Eina_Bool ewk_context_application_cache_delete(Ewk_Context* context, Ewk_Security_Origin* origin)
114 {
115   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
116   EINA_SAFETY_ON_NULL_RETURN_VAL(origin, EINA_FALSE);
117   context->DeleteApplicationCacheForSite(origin->GetURL());
118   return true;
119 }
120
121 Eina_Bool ewk_context_application_cache_origins_get(Ewk_Context* context, Ewk_Web_Application_Cache_Origins_Get_Callback callback, void* user_data)
122 {
123   EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EINA_FALSE);
124   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
125
126   context->GetAllOriginsWithApplicationCache(callback, user_data);
127   return true;
128 }
129
130 Eina_Bool ewk_context_application_cache_usage_for_origin_get(Ewk_Context* context, const Ewk_Security_Origin* origin, Ewk_Web_Application_Cache_Usage_For_Origin_Get_Callback callback, void* user_data)
131 {
132   EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EINA_FALSE);
133   EINA_SAFETY_ON_NULL_RETURN_VAL(origin, EINA_FALSE);
134   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
135   context->GetApplicationCacheUsage(origin->GetURL(), callback, user_data);
136   return true;
137 }
138
139 Eina_Bool ewk_context_application_cache_quota_for_origin_set(Ewk_Context* context, const Ewk_Security_Origin* origin, int64_t quota)
140 {
141   NOTIMPLEMENTED() << "Chromium does not support quota management for individual features.";
142   return false;
143 }
144
145 Eina_Bool ewk_context_icon_database_path_set(Ewk_Context* context, const char* path)
146 {
147   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
148   return context->SetFaviconDatabasePath(path) ? EINA_TRUE : EINA_FALSE;
149 }
150
151 Evas_Object* ewk_context_icon_database_icon_object_add(Ewk_Context* context, const char* uri, Evas* canvas)
152 {
153   EINA_SAFETY_ON_NULL_RETURN_VAL(uri, NULL);
154   EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, NULL);
155   EINA_SAFETY_ON_NULL_RETURN_VAL(context, NULL);
156   return context->AddFaviconObject(uri, canvas);
157 }
158
159 Eina_Bool ewk_context_local_file_system_all_delete(Ewk_Context *context)
160 {
161   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
162   context->FileSystemDelete(tizen_webview::URL());
163   return true;
164 }
165
166 Eina_Bool ewk_context_local_file_system_delete(Ewk_Context *context, Ewk_Security_Origin *origin)
167 {
168   EINA_SAFETY_ON_NULL_RETURN_VAL(origin, EINA_FALSE);
169   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
170   context->FileSystemDelete(tizen_webview::URL(ewk_security_origin_host_get(origin)));
171   return true;
172 }
173
174 Eina_Bool ewk_context_local_file_system_origins_get(const Ewk_Context *context,
175                                                     Ewk_Local_File_System_Origins_Get_Callback callback,
176                                                     void *user_data)
177 {
178   EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EINA_FALSE);
179   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
180   context->GetAllOriginsWithFileSystem(callback, user_data);
181   return true;
182 }
183
184 Eina_Bool ewk_context_web_database_delete_all(Ewk_Context* context)
185 {
186   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
187   context->WebDBDelete(tizen_webview::URL());
188   return true;
189 }
190
191 Eina_Bool ewk_context_web_database_delete(Ewk_Context* context, Ewk_Security_Origin* origin)
192 {
193   EINA_SAFETY_ON_NULL_RETURN_VAL(origin, EINA_FALSE);
194   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
195   context->WebDBDelete(tizen_webview::URL(ewk_security_origin_host_get(origin)));
196   return true;
197 }
198
199 Eina_Bool ewk_context_web_database_origins_get(Ewk_Context* context,
200                                                Ewk_Web_Database_Origins_Get_Callback callback,
201                                                void* user_data)
202 {
203   EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EINA_FALSE);
204   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
205   context->GetAllOriginsWithWebDB(callback, user_data);
206   return true;
207 }
208
209 Eina_Bool ewk_context_web_database_quota_for_origin_get(Ewk_Context* context, Ewk_Web_Database_Quota_Get_Callback callback, void* userData, Ewk_Security_Origin* origin)
210 {
211   LOG_EWK_API_MOCKUP();
212   return false;
213 }
214
215 Eina_Bool ewk_context_web_database_quota_for_origin_set(Ewk_Context* context, Ewk_Security_Origin* origin, uint64_t quota)
216 {
217   LOG_EWK_API_MOCKUP();
218   return false;
219 }
220
221 Eina_Bool ewk_context_web_indexed_database_delete_all(Ewk_Context* context)
222 {
223   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
224   context->IndexedDBDelete();
225   return true;
226 }
227
228 Eina_Bool ewk_context_web_storage_delete_all(Ewk_Context* context)
229 {
230   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
231   context->WebStorageDelete();
232   return true;
233 }
234
235 Eina_Bool ewk_context_web_storage_origin_delete(Ewk_Context* context, Ewk_Security_Origin* origin)
236 {
237   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
238   EINA_SAFETY_ON_NULL_RETURN_VAL(origin, EINA_FALSE);
239
240   context->WebStorageDelete(origin->GetURL());
241   return EINA_TRUE;
242 }
243
244 Eina_Bool ewk_context_web_storage_origins_get(Ewk_Context* context, Ewk_Web_Storage_Origins_Get_Callback callback, void* user_data)
245 {
246   EINA_SAFETY_ON_NULL_RETURN_VAL(callback, EINA_FALSE);
247   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
248
249   context->WebStorageOriginsAllGet(callback, user_data);
250   return EINA_TRUE;
251 }
252
253 Eina_Bool ewk_context_web_storage_path_set(Ewk_Context* /*context*/, const char* /*path*/)
254 {
255   //With chromium engine no separate path for web storage supported.
256   //This API not implemented
257   NOTIMPLEMENTED();
258   return EINA_FALSE;
259 }
260
261 Eina_Bool ewk_context_web_storage_usage_for_origin_get(Ewk_Context* context, Ewk_Security_Origin* origin, Ewk_Web_Storage_Usage_Get_Callback callback, void* userData)
262 {
263   LOG_EWK_API_MOCKUP();
264   return false;
265 }
266
267 Eina_Bool ewk_context_soup_data_directory_set(Ewk_Context* /*context*/, const char* /*path*/)
268 {
269   //chomium engine does not use libsoup hence this API will not be implemented
270   NOTIMPLEMENTED();
271   return EINA_FALSE;
272 }
273
274 Eina_Bool ewk_context_cache_model_set(Ewk_Context* context, Ewk_Cache_Model model)
275 {
276   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
277   context->SetCacheModel(chromium_glue::to(model));
278   return true;
279 }
280
281 Ewk_Cache_Model ewk_context_cache_model_get(Ewk_Context* context)
282 {
283   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EWK_CACHE_MODEL_DOCUMENT_VIEWER);
284   return chromium_glue::from(context->GetCacheModel());
285 }
286
287 Eina_Bool ewk_context_cache_disabled_set(Ewk_Context* context, Eina_Bool cacheDisabled)
288 {
289   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
290   context->SetNetworkCacheEnable(!cacheDisabled);
291   return true;
292 }
293
294 Eina_Bool ewk_context_cache_disabled_get(Ewk_Context* context)
295 {
296   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
297   return !context->GetNetworkCacheEnable();
298 }
299
300 Eina_Bool ewk_context_certificate_file_set(Ewk_Context *context, const char *certificate_file)
301 {
302   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
303   EINA_SAFETY_ON_NULL_RETURN_VAL(certificate_file, EINA_FALSE);
304   context->SetCertificate(certificate_file);
305   return true;
306 }
307
308 const char* ewk_context_certificate_file_get(const Ewk_Context* context)
309 {
310   EINA_SAFETY_ON_NULL_RETURN_VAL(context, NULL);
311 #if !defined(EWK_BRINGUP)
312   return context->GetCertificate();
313 #else
314   LOG_EWK_API_MOCKUP();
315   return NULL;
316 #endif
317 }
318
319 Eina_Bool ewk_context_cache_clear(Ewk_Context* context)
320 {
321   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
322   context->ClearNetworkCache();
323   context->ClearWebkitCache();
324   return EINA_TRUE;
325 }
326
327 void ewk_context_did_start_download_callback_set(Ewk_Context* context,
328                                                  Ewk_Context_Did_Start_Download_Callback callback,
329                                                  void* userData)
330 {
331   EINA_SAFETY_ON_NULL_RETURN(context);
332   context->SetDidStartDownloadCallback(callback, userData);
333 }
334
335 void ewk_context_mime_override_callback_set(Ewk_Context* context, Ewk_Context_Override_Mime_For_Url_Callback callback, void* user_data)
336 {
337   EINA_SAFETY_ON_NULL_RETURN(context);
338   context->SetMimeOverrideCallback(callback, user_data);
339 }
340
341 void ewk_context_memory_sampler_start(Ewk_Context* context, double timerInterval)
342 {
343   LOG_EWK_API_MOCKUP();
344 }
345
346 void ewk_context_memory_sampler_stop(Ewk_Context* context)
347 {
348   LOG_EWK_API_MOCKUP();
349 }
350
351 Eina_Bool ewk_context_additional_plugin_path_set(Ewk_Context *context, const char *path)
352 {
353   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
354   EINA_SAFETY_ON_NULL_RETURN_VAL(path, EINA_FALSE);
355   context->AddExtraPluginDir(path);
356   return true;
357 }
358
359 void ewk_context_memory_saving_mode_set(Ewk_Context* context, Eina_Bool mode)
360 {
361   //memory saving mode should be handled in chromium in different way
362   //than it is handled in WebKit, so implementation of this feature
363   //is postponed, for now dummy implementation is enough
364   NOTIMPLEMENTED();
365   return;
366 }
367
368 void ewk_context_form_password_data_delete_all(Ewk_Context* context)
369 {
370   EINA_SAFETY_ON_NULL_RETURN(context);
371   context->ClearPasswordData();
372 }
373
374 void ewk_context_form_password_data_delete(Ewk_Context* ewkContext, const char* url)
375 {
376   LOG_EWK_API_MOCKUP();
377 }
378
379 Eina_List* ewk_context_form_password_data_list_get(Ewk_Context* ewkContext)
380 {
381   LOG_EWK_API_MOCKUP();
382   return NULL;
383 }
384
385 void ewk_context_form_password_data_list_free(Ewk_Context* ewkContext, Eina_List* list)
386 {
387   LOG_EWK_API_MOCKUP();
388 }
389
390 void ewk_context_form_candidate_data_delete_all(Ewk_Context* context)
391 {
392   EINA_SAFETY_ON_NULL_RETURN(context);
393   context->ClearCandidateData();
394 }
395
396 void ewk_context_form_autofill_profile_changed_callback_set(
397     Ewk_Context_Form_Autofill_Profile_Changed_Callback callback,
398     void* user_data)
399 {
400   EwkContextFormAutofillProfileManager::priv_form_autofill_profile_changed_callback_set(
401       callback, user_data);
402 }
403
404 Eina_List* ewk_context_form_autofill_profile_get_all(Ewk_Context* context)
405 {
406   if (NULL == context) {
407     return NULL;
408   }
409   return EwkContextFormAutofillProfileManager::priv_form_autofill_profile_get_all(context);
410 }
411
412 Ewk_Autofill_Profile* ewk_context_form_autofill_profile_get(Ewk_Context* context, unsigned id)
413 {
414   if (NULL == context) {
415     return NULL;
416   }
417   return EwkContextFormAutofillProfileManager::priv_form_autofill_profile_get(context, id);
418 }
419
420 Eina_Bool ewk_context_form_autofill_profile_set(Ewk_Context* context, unsigned id, Ewk_Autofill_Profile* profile)
421 {
422   if (NULL == context || NULL == profile) {
423     return EINA_FALSE;
424   }
425   return EwkContextFormAutofillProfileManager::priv_form_autofill_profile_set(context, id, profile);
426 }
427
428 Eina_Bool ewk_context_form_autofill_profile_add(Ewk_Context* context, Ewk_Autofill_Profile* profile)
429 {
430   if (NULL == context || NULL == profile) {
431     return EINA_FALSE;
432   }
433   return EwkContextFormAutofillProfileManager::priv_form_autofill_profile_add(context, profile);
434 }
435
436 Eina_Bool ewk_context_form_autofill_profile_remove(Ewk_Context* context, unsigned id)
437 {
438   if (NULL == context) {
439     return EINA_FALSE;
440   }
441   return EwkContextFormAutofillProfileManager::priv_form_autofill_profile_remove(context, id);
442 }
443
444 void ewk_context_vibration_client_callbacks_set(Ewk_Context* context,
445                                                 Ewk_Vibration_Client_Vibrate_Cb vibrate,
446                                                 Ewk_Vibration_Client_Vibration_Cancel_Cb cancel,
447                                                 void* data)
448 {
449   VibrationProviderClient* vibra_client = VibrationProviderClient::GetInstance();
450   vibra_client->SetVibrationClientCallbacks(vibrate, cancel, data);
451 }
452
453 Eina_Bool ewk_context_tizen_extensible_api_string_set(Ewk_Context* ewkContext,  const char* extensibleAPI, Eina_Bool enable)
454 {
455   LOG_EWK_API_MOCKUP();
456   return EINA_FALSE;
457 }
458
459 Eina_Bool ewk_context_tizen_extensible_api_set(Ewk_Context * /*context*/, Ewk_Extensible_API /*extensibleAPI*/, Eina_Bool /*enable*/)
460 {
461   //This API will not be implemented with chromium engine based Ewk View
462   NOTIMPLEMENTED();
463   return EINA_FALSE;
464 }
465
466 Eina_Bool ewk_context_tizen_extensible_api_get(Ewk_Context * /*context*/, Ewk_Extensible_API /*extensibleAPI*/)
467 {
468   //This API will not be implemented with chromium engine based Ewk View
469   NOTIMPLEMENTED();
470   return EINA_FALSE;
471 }
472
473 void ewk_context_storage_path_reset(Ewk_Context* /*context*/)
474 {
475   //not supported in chromium to dynamically update the storage path
476   NOTIMPLEMENTED();
477 }
478
479 Eina_Bool ewk_context_pixmap_set(Ewk_Context *context, int pixmap)
480 {
481   EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
482   context->SetPixmap(pixmap);
483   return true;
484 }
485
486 int ewk_context_pixmap_get(Ewk_Context *context)
487 {
488   EINA_SAFETY_ON_NULL_RETURN_VAL(context, 0);
489   return context->Pixmap();
490 }
491
492 unsigned int ewk_context_inspector_server_start(Ewk_Context* ewkContext, unsigned int port)
493 {
494   EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0);
495   return ewkContext->InspectorServerStart(port);
496 }
497
498 Eina_Bool ewk_context_inspector_server_stop(Ewk_Context* ewkContext)
499 {
500   EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, EINA_FALSE);
501   return ewkContext->InspectorServerStop();
502 }
503
504 void ewk_send_widget_info(Ewk_Context *context,
505                           int widget_handle,
506                           double scale,
507                           const char *theme,
508                           const char *encodedBundle)
509 {
510   EINA_SAFETY_ON_NULL_RETURN(theme);
511   EINA_SAFETY_ON_NULL_RETURN(encodedBundle);
512   EINA_SAFETY_ON_NULL_RETURN(context);
513   context->SendWidgetInfo(widget_handle, scale, theme, encodedBundle);
514 }
515
516 #if defined(OS_TIZEN_TV)
517 Ewk_Application_Cache_Manager* ewk_context_application_cache_manager_get(const Ewk_Context* ewkContext)
518 {
519   LOG_EWK_API_MOCKUP("for Tizen TV Browser");
520   return NULL;
521 }
522 #endif
523
524 Ewk_Favicon_Database* ewk_context_favicon_database_get(const Ewk_Context* ewkContext)
525 {
526 #if defined(OS_TIZEN_TV)
527   EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0);
528   Ewk_Favicon_Database *favicon_database = Ewk_Favicon_Database::Instance();
529   favicon_database->InitEwkFaviconDatabase(ewkContext);
530   return favicon_database;
531 #else
532   LOG_EWK_API_MOCKUP("Only for Tizen TV Browser");
533   return NULL;
534 #endif
535 }
536
537 void ewk_context_resource_cache_clear(Ewk_Context* ewkContext)
538 {
539   EINA_SAFETY_ON_NULL_RETURN(ewkContext);
540   ewkContext->ClearNetworkCache();
541   ewkContext->ClearWebkitCache();
542 }
543
544 #if defined(OS_TIZEN_TV)
545 Eina_Bool ewk_context_favicon_database_directory_set(Ewk_Context* ewkContext, const char* directoryPath)
546 {
547   LOG_EWK_API_MOCKUP("Tizen TV Browser");
548   return false;
549 }
550 #endif // OS_TIZEN_TV
551
552 void ewk_context_preferred_languages_set(Eina_List* languages)
553 {
554   std::string preferredLanguages;
555
556   Eina_List* it;
557   void* data;
558
559   EINA_LIST_FOREACH(languages, it, data) {
560     if (data) {
561       preferredLanguages.append(static_cast<char*>(data));
562       if (it->next) {
563         preferredLanguages.append(",");
564       }
565     }
566   }
567   std::transform(preferredLanguages.begin(), preferredLanguages.end(), preferredLanguages.begin(), ::tolower);
568   std::replace(preferredLanguages.begin(), preferredLanguages.end(), '_', '-');
569   HttpUserAgentSettingsEfl::SetAcceptLanguage(preferredLanguages);
570 }
571
572 #if defined(OS_TIZEN_TV)
573 Ewk_Storage_Manager* ewk_context_storage_manager_get(const Ewk_Context* ewkContext)
574 {
575   LOG_EWK_API_MOCKUP("Tizen TV Browser");
576   return NULL;
577 }
578 #endif // OS_TIZEN_TV