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