diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API')
7 files changed, 282 insertions, 190 deletions
diff --git a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp index 0ca7569b9..054bfcbf7 100644 --- a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp +++ b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp @@ -284,7 +284,7 @@ void PageClientImpl::countStringMatchesInCustomRepresentation(const String&, Fin void PageClientImpl::handleDownloadRequest(DownloadProxy* download) { RefPtr<Ewk_Download_Job> ewkDownload = Ewk_Download_Job::create(download, m_viewWidget); - ewk_context_download_job_add(ewk_view_context_get(m_viewWidget), ewkDownload.get()); + ewk_view_context_get(m_viewWidget)->addDownloadJob(ewkDownload.get()); } #if USE(TILED_BACKING_STORE) diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp index 9fb889213..32991c5c8 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp @@ -31,6 +31,7 @@ #include "WKString.h" #include "WebContext.h" #include "WebIconDatabase.h" +#include "WebSoupRequestManagerProxy.h" #include "ewk_context_download_client_private.h" #include "ewk_context_history_client_private.h" #include "ewk_context_private.h" @@ -69,148 +70,199 @@ struct Ewk_Url_Scheme_Handler { { } }; -typedef HashMap<String, Ewk_Url_Scheme_Handler> URLSchemeHandlerMap; +typedef HashMap<WKContextRef, Ewk_Context*> ContextMap; -struct Ewk_Context { - unsigned __ref; /**< the reference count of the object */ - WKRetainPtr<WKContextRef> context; - - OwnPtr<Ewk_Cookie_Manager> cookieManager; - OwnPtr<Ewk_Favicon_Database> faviconDatabase; -#if ENABLE(BATTERY_STATUS) - RefPtr<BatteryProvider> batteryProvider; -#endif -#if ENABLE(NETWORK_INFO) - RefPtr<NetworkInfoProvider> networkInfoProvider; -#endif -#if ENABLE(VIBRATION) - RefPtr<VibrationProvider> vibrationProvider; -#endif - HashMap<uint64_t, RefPtr<Ewk_Download_Job> > downloadJobs; - - WKRetainPtr<WKSoupRequestManagerRef> requestManager; - URLSchemeHandlerMap urlSchemeHandlers; +static inline ContextMap& contextMap() +{ + DEFINE_STATIC_LOCAL(ContextMap, map, ()); + return map; +} - Ewk_Context_History_Client historyClient; +Ewk_Context::Ewk_Context(WKContextRef context) + : m_context(context) + , m_requestManager(WKContextGetSoupRequestManager(context)) + , m_historyClient() +{ + ContextMap::AddResult result = contextMap().add(context, this); + ASSERT_UNUSED(result, result.isNewEntry); - Ewk_Context(WKRetainPtr<WKContextRef> contextRef) - : __ref(1) - , context(contextRef) - , requestManager(WKContextGetSoupRequestManager(contextRef.get())) - , historyClient() - { #if ENABLE(BATTERY_STATUS) - batteryProvider = BatteryProvider::create(context.get()); + m_batteryProvider = BatteryProvider::create(context); #endif #if ENABLE(NETWORK_INFO) - networkInfoProvider = NetworkInfoProvider::create(context.get()); + m_networkInfoProvider = NetworkInfoProvider::create(context); #endif #if ENABLE(VIBRATION) - vibrationProvider = VibrationProvider::create(context.get()); + m_vibrationProvider = VibrationProvider::create(context); #endif #if ENABLE(MEMORY_SAMPLER) - static bool initializeMemorySampler = false; - static const char environmentVariable[] = "SAMPLE_MEMORY"; + static bool initializeMemorySampler = false; + static const char environmentVariable[] = "SAMPLE_MEMORY"; - if (!initializeMemorySampler && getenv(environmentVariable)) { - WKRetainPtr<WKDoubleRef> interval(AdoptWK, WKDoubleCreate(0.0)); - WKContextStartMemorySampler(context.get(), interval.get()); - initializeMemorySampler = true; - } + if (!initializeMemorySampler && getenv(environmentVariable)) { + WKRetainPtr<WKDoubleRef> interval(AdoptWK, WKDoubleCreate(0.0)); + WKContextStartMemorySampler(context, interval.get()); + initializeMemorySampler = true; + } #endif - ewk_context_request_manager_client_attach(this); - ewk_context_download_client_attach(this); - ewk_context_history_client_attach(this); + #if ENABLE(SPELLCHECK) - ewk_text_checker_client_attach(); - if (ewk_settings_continuous_spell_checking_enabled_get()) { - // Load the default language. - ewk_settings_spell_checking_languages_set(0); - } -#endif + ewk_text_checker_client_attach(); + if (ewk_settings_continuous_spell_checking_enabled_get()) { + // Load the default language. + ewk_settings_spell_checking_languages_set(0); } -}; +#endif -Ewk_Context* ewk_context_ref(Ewk_Context* ewkContext) + ewk_context_request_manager_client_attach(this); + ewk_context_download_client_attach(this); + ewk_context_history_client_attach(this); +} + +Ewk_Context::~Ewk_Context() { - EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); - ++ewkContext->__ref; + ASSERT(contextMap().get(m_context.get()) == this); + contextMap().remove(m_context.get()); +} - return ewkContext; +PassRefPtr<Ewk_Context> Ewk_Context::create(WKContextRef context) +{ + if (contextMap().contains(context)) + return contextMap().get(context); // Will be ref-ed automatically. + + return adoptRef(new Ewk_Context(context)); } -void ewk_context_unref(Ewk_Context* ewkContext) +PassRefPtr<Ewk_Context> Ewk_Context::create() { - EINA_SAFETY_ON_NULL_RETURN(ewkContext); - EINA_SAFETY_ON_FALSE_RETURN(ewkContext->__ref > 0); + return create(adoptWK(WKContextCreate()).get()); +} - if (--ewkContext->__ref) - return; +PassRefPtr<Ewk_Context> Ewk_Context::create(const String& injectedBundlePath) +{ + if (!fileExists(injectedBundlePath)) + return 0; + + WKRetainPtr<WKStringRef> injectedBundlePathWK = adoptWK(toCopiedAPI(injectedBundlePath)); + WKRetainPtr<WKContextRef> contextWK = adoptWK(WKContextCreateWithInjectedBundlePath(injectedBundlePathWK.get())); - delete ewkContext; + return create(contextWK.get()); } -Ewk_Cookie_Manager* ewk_context_cookie_manager_get(const Ewk_Context* ewkContext) +PassRefPtr<Ewk_Context> Ewk_Context::defaultContext() { - EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); - - if (!ewkContext->cookieManager) - const_cast<Ewk_Context*>(ewkContext)->cookieManager = Ewk_Cookie_Manager::create(WKContextGetCookieManager(ewkContext->context.get())); + static RefPtr<Ewk_Context> defaultInstance = create(adoptWK(WKContextCreate()).get()); - return ewkContext->cookieManager.get(); + return defaultInstance; } -Ewk_Favicon_Database* ewk_context_favicon_database_get(const Ewk_Context* ewkContext) +Ewk_Cookie_Manager* Ewk_Context::cookieManager() { - EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); + if (!m_cookieManager) + m_cookieManager = Ewk_Cookie_Manager::create(WKContextGetCookieManager(m_context.get())); + + return m_cookieManager.get(); +} - if (!ewkContext->faviconDatabase) { - WKRetainPtr<WKIconDatabaseRef> iconDatabase = WKContextGetIconDatabase(ewkContext->context.get()); +Ewk_Favicon_Database* Ewk_Context::faviconDatabase() +{ + if (!m_faviconDatabase) { + WKRetainPtr<WKIconDatabaseRef> iconDatabase = WKContextGetIconDatabase(m_context.get()); // Set the database path if it is not open yet. if (!toImpl(iconDatabase.get())->isOpen()) { - WebContext* webContext = toImpl(ewkContext->context.get()); + WebContext* webContext = toImpl(m_context.get()); String databasePath = webContext->iconDatabasePath() + "/" + WebCore::IconDatabase::defaultDatabaseFilename(); webContext->setIconDatabasePath(databasePath); } - const_cast<Ewk_Context*>(ewkContext)->faviconDatabase = Ewk_Favicon_Database::create(iconDatabase.get()); + m_faviconDatabase = Ewk_Favicon_Database::create(iconDatabase.get()); } - return ewkContext->faviconDatabase.get(); + return m_faviconDatabase.get(); } -WKContextRef ewk_context_WKContext_get(const Ewk_Context* ewkContext) +bool Ewk_Context::registerURLScheme(const String& scheme, Ewk_Url_Scheme_Request_Cb callback, void* userData) { - return ewkContext->context.get(); + EINA_SAFETY_ON_NULL_RETURN_VAL(callback, false); + + m_urlSchemeHandlers.set(scheme, Ewk_Url_Scheme_Handler(callback, userData)); + toImpl(m_requestManager.get())->registerURIScheme(scheme); + + return true; } -/** - * @internal - * Create Ewk_Context from WKContext. - */ -Ewk_Context* ewk_context_new_from_WKContext(WKContextRef contextRef) +#if ENABLE(VIBRATION) +PassRefPtr<VibrationProvider> Ewk_Context::vibrationProvider() +{ + return m_vibrationProvider; +} +#endif + +void Ewk_Context::addVisitedLink(const String& visitedURL) { - EINA_SAFETY_ON_NULL_RETURN_VAL(contextRef, 0); + toImpl(m_context.get())->addVisitedLink(visitedURL); +} + +void Ewk_Context::setCacheModel(Ewk_Cache_Model cacheModel) +{ + WKContextSetCacheModel(m_context.get(), static_cast<Ewk_Cache_Model>(cacheModel)); +} + +Ewk_Cache_Model Ewk_Context::cacheModel() const +{ + return static_cast<Ewk_Cache_Model>(WKContextGetCacheModel(m_context.get())); +} + +Ewk_Context* ewk_context_ref(Ewk_Context* ewkContext) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); + + ewkContext->ref(); + + return ewkContext; +} + +void ewk_context_unref(Ewk_Context* ewkContext) +{ + EINA_SAFETY_ON_NULL_RETURN(ewkContext); + + ewkContext->deref(); +} + +Ewk_Cookie_Manager* ewk_context_cookie_manager_get(const Ewk_Context* ewkContext) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); + + return const_cast<Ewk_Context*>(ewkContext)->cookieManager(); +} - return new Ewk_Context(contextRef); +Ewk_Favicon_Database* ewk_context_favicon_database_get(const Ewk_Context* ewkContext) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); + + return const_cast<Ewk_Context*>(ewkContext)->faviconDatabase(); +} + +WKContextRef Ewk_Context::wkContext() +{ + return m_context.get(); } /** * @internal * Registers that a new download has been requested. */ -void ewk_context_download_job_add(Ewk_Context* ewkContext, Ewk_Download_Job* ewkDownload) +void Ewk_Context::addDownloadJob(Ewk_Download_Job* ewkDownload) { - EINA_SAFETY_ON_NULL_RETURN(ewkContext); EINA_SAFETY_ON_NULL_RETURN(ewkDownload); uint64_t downloadId = ewkDownload->id(); - if (ewkContext->downloadJobs.contains(downloadId)) + if (m_downloadJobs.contains(downloadId)) return; - ewkContext->downloadJobs.add(downloadId, ewkDownload); + m_downloadJobs.add(downloadId, ewkDownload); } /** @@ -218,11 +270,9 @@ void ewk_context_download_job_add(Ewk_Context* ewkContext, Ewk_Download_Job* ewk * Returns the #Ewk_Download_Job with the given @a downloadId, or * @c 0 in case of failure. */ -Ewk_Download_Job* ewk_context_download_job_get(const Ewk_Context* ewkContext, uint64_t downloadId) +Ewk_Download_Job* Ewk_Context::downloadJob(uint64_t downloadId) { - EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); - - return ewkContext->downloadJobs.get(downloadId).get(); + return m_downloadJobs.get(downloadId).get(); } /** @@ -230,10 +280,9 @@ Ewk_Download_Job* ewk_context_download_job_get(const Ewk_Context* ewkContext, ui * Removes the #Ewk_Download_Job with the given @a downloadId from the internal * HashMap. */ -void ewk_context_download_job_remove(Ewk_Context* ewkContext, uint64_t downloadId) +void Ewk_Context::removeDownloadJob(uint64_t downloadId) { - EINA_SAFETY_ON_NULL_RETURN(ewkContext); - ewkContext->downloadJobs.remove(downloadId); + m_downloadJobs.remove(downloadId); } /** @@ -241,9 +290,9 @@ void ewk_context_download_job_remove(Ewk_Context* ewkContext, uint64_t downloadI * * @param ewkContext a #Ewk_Context object. */ -WKSoupRequestManagerRef ewk_context_request_manager_get(const Ewk_Context* ewkContext) +WKSoupRequestManagerRef Ewk_Context::requestManager() { - return ewkContext->requestManager.get(); + return m_requestManager.get(); } /** @@ -253,12 +302,11 @@ WKSoupRequestManagerRef ewk_context_request_manager_get(const Ewk_Context* ewkCo * @param ewkContext a #Ewk_Context object. * @param schemeRequest a #Ewk_Url_Scheme_Request object. */ -void ewk_context_url_scheme_request_received(Ewk_Context* ewkContext, Ewk_Url_Scheme_Request* schemeRequest) +void Ewk_Context::urlSchemeRequestReceived(Ewk_Url_Scheme_Request* schemeRequest) { - EINA_SAFETY_ON_NULL_RETURN(ewkContext); EINA_SAFETY_ON_NULL_RETURN(schemeRequest); - Ewk_Url_Scheme_Handler handler = ewkContext->urlSchemeHandlers.get(schemeRequest->scheme()); + Ewk_Url_Scheme_Handler handler = m_urlSchemeHandlers.get(schemeRequest->scheme()); if (!handler.callback) return; @@ -267,38 +315,27 @@ void ewk_context_url_scheme_request_received(Ewk_Context* ewkContext, Ewk_Url_Sc Ewk_Context* ewk_context_default_get() { - static Ewk_Context defaultContext(adoptWK(WKContextCreate())); - - return &defaultContext; + return Ewk_Context::defaultContext().get(); } Ewk_Context* ewk_context_new() { - return new Ewk_Context(adoptWK(WKContextCreate())); + return Ewk_Context::create().leakRef(); } Ewk_Context* ewk_context_new_with_injected_bundle_path(const char* path) { EINA_SAFETY_ON_NULL_RETURN_VAL(path, 0); - WKRetainPtr<WKStringRef> pathRef(AdoptWK, WKStringCreateWithUTF8CString(path)); - if (!fileExists(toImpl(pathRef.get())->string())) - return 0; - - return new Ewk_Context(adoptWK(WKContextCreateWithInjectedBundlePath(pathRef.get()))); + return Ewk_Context::create(String::fromUTF8(path)).leakRef(); } Eina_Bool ewk_context_url_scheme_register(Ewk_Context* ewkContext, const char* scheme, Ewk_Url_Scheme_Request_Cb callback, void* userData) { EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, false); EINA_SAFETY_ON_NULL_RETURN_VAL(scheme, false); - EINA_SAFETY_ON_NULL_RETURN_VAL(callback, false); - ewkContext->urlSchemeHandlers.set(String::fromUTF8(scheme), Ewk_Url_Scheme_Handler(callback, userData)); - WKRetainPtr<WKStringRef> wkScheme(AdoptWK, WKStringCreateWithUTF8CString(scheme)); - WKSoupRequestManagerRegisterURIScheme(ewkContext->requestManager.get(), wkScheme.get()); - - return true; + return ewkContext->registerURLScheme(String::fromUTF8(scheme), callback, userData); } void ewk_context_vibration_client_callbacks_set(Ewk_Context* ewkContext, Ewk_Vibration_Client_Vibrate_Cb vibrate, Ewk_Vibration_Client_Vibration_Cancel_Cb cancel, void* data) @@ -306,7 +343,7 @@ void ewk_context_vibration_client_callbacks_set(Ewk_Context* ewkContext, Ewk_Vib EINA_SAFETY_ON_NULL_RETURN(ewkContext); #if ENABLE(VIBRATION) - ewkContext->vibrationProvider->setVibrationClientCallbacks(vibrate, cancel, data); + ewkContext->vibrationProvider()->setVibrationClientCallbacks(vibrate, cancel, data); #endif } @@ -314,28 +351,22 @@ void ewk_context_history_callbacks_set(Ewk_Context* ewkContext, Ewk_History_Navi { EINA_SAFETY_ON_NULL_RETURN(ewkContext); - ewkContext->historyClient.navigate_func = navigate; - ewkContext->historyClient.client_redirect_func = clientRedirect; - ewkContext->historyClient.server_redirect_func = serverRedirect; - ewkContext->historyClient.title_update_func = titleUpdate; - ewkContext->historyClient.populate_visited_links_func = populateVisitedLinks; - ewkContext->historyClient.user_data = data; + Ewk_Context_History_Client& historyClient = ewkContext->historyClient(); + historyClient.navigate_func = navigate; + historyClient.client_redirect_func = clientRedirect; + historyClient.server_redirect_func = serverRedirect; + historyClient.title_update_func = titleUpdate; + historyClient.populate_visited_links_func = populateVisitedLinks; + historyClient.user_data = data; } -const Ewk_Context_History_Client* ewk_context_history_client_get(const Ewk_Context* ewkContext) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, 0); - - return &ewkContext->historyClient; -} void ewk_context_visited_link_add(Ewk_Context* ewkContext, const char* visitedURL) { EINA_SAFETY_ON_NULL_RETURN(ewkContext); EINA_SAFETY_ON_NULL_RETURN(visitedURL); - WKRetainPtr<WKStringRef> wkVisitedURL(AdoptWK, WKStringCreateWithUTF8CString(visitedURL)); - WKContextAddVisitedLink(ewkContext->context.get(), wkVisitedURL.get()); + ewkContext->addVisitedLink(visitedURL); } // Ewk_Cache_Model enum validation @@ -346,14 +377,16 @@ COMPILE_ASSERT_MATCHING_ENUM(EWK_CACHE_MODEL_PRIMARY_WEBBROWSER, kWKCacheModelPr Eina_Bool ewk_context_cache_model_set(Ewk_Context* ewkContext, Ewk_Cache_Model cacheModel) { EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, false); - WKContextSetCacheModel(ewk_context_WKContext_get(ewkContext), static_cast<Ewk_Cache_Model>(cacheModel)); + + ewkContext->setCacheModel(cacheModel); + return true; } Ewk_Cache_Model ewk_context_cache_model_get(const Ewk_Context* ewkContext) { EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, EWK_CACHE_MODEL_DOCUMENT_VIEWER); - WKCacheModel cacheModel = WKContextGetCacheModel(ewk_context_WKContext_get(ewkContext)); - return static_cast<Ewk_Cache_Model>(cacheModel); + + return ewkContext->cacheModel(); } diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_context_download_client.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_context_download_client.cpp index 11647b41e..2fa86e9a7 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_context_download_client.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_context_download_client.cpp @@ -50,7 +50,7 @@ static inline Ewk_Context* toEwkContext(const void* clientInfo) static WKStringRef decideDestinationWithSuggestedFilename(WKContextRef, WKDownloadRef wkDownload, WKStringRef filename, bool* /*allowOverwrite*/, const void* clientInfo) { - Ewk_Download_Job* download = ewk_context_download_job_get(toEwkContext(clientInfo), toImpl(wkDownload)->downloadID()); + Ewk_Download_Job* download = toEwkContext(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID()); ASSERT(download); download->setSuggestedFileName(toImpl(filename)->string().utf8().data()); @@ -67,14 +67,14 @@ static WKStringRef decideDestinationWithSuggestedFilename(WKContextRef, WKDownlo static void didReceiveResponse(WKContextRef, WKDownloadRef wkDownload, WKURLResponseRef wkResponse, const void* clientInfo) { - Ewk_Download_Job* download = ewk_context_download_job_get(toEwkContext(clientInfo), toImpl(wkDownload)->downloadID()); + Ewk_Download_Job* download = toEwkContext(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID()); ASSERT(download); download->setResponse(Ewk_Url_Response::create(wkResponse)); } static void didCreateDestination(WKContextRef, WKDownloadRef wkDownload, WKStringRef /*path*/, const void* clientInfo) { - Ewk_Download_Job* download = ewk_context_download_job_get(toEwkContext(clientInfo), toImpl(wkDownload)->downloadID()); + Ewk_Download_Job* download = toEwkContext(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID()); ASSERT(download); download->setState(EWK_DOWNLOAD_JOB_STATE_DOWNLOADING); @@ -82,7 +82,7 @@ static void didCreateDestination(WKContextRef, WKDownloadRef wkDownload, WKStrin static void didReceiveData(WKContextRef, WKDownloadRef wkDownload, uint64_t length, const void* clientInfo) { - Ewk_Download_Job* download = ewk_context_download_job_get(toEwkContext(clientInfo), toImpl(wkDownload)->downloadID()); + Ewk_Download_Job* download = toEwkContext(clientInfo)->downloadJob(toImpl(wkDownload)->downloadID()); ASSERT(download); download->incrementReceivedData(length); } @@ -90,35 +90,35 @@ static void didReceiveData(WKContextRef, WKDownloadRef wkDownload, uint64_t leng static void didFail(WKContextRef, WKDownloadRef wkDownload, WKErrorRef error, const void* clientInfo) { uint64_t downloadId = toImpl(wkDownload)->downloadID(); - Ewk_Download_Job* download = ewk_context_download_job_get(toEwkContext(clientInfo), downloadId); + Ewk_Download_Job* download = toEwkContext(clientInfo)->downloadJob(downloadId); ASSERT(download); OwnPtr<Ewk_Error> ewkError = Ewk_Error::create(error); download->setState(EWK_DOWNLOAD_JOB_STATE_FAILED); ewk_view_download_job_failed(download->view(), download, ewkError.get()); - ewk_context_download_job_remove(toEwkContext(clientInfo), downloadId); + toEwkContext(clientInfo)->removeDownloadJob(downloadId); } static void didCancel(WKContextRef, WKDownloadRef wkDownload, const void* clientInfo) { uint64_t downloadId = toImpl(wkDownload)->downloadID(); - Ewk_Download_Job* download = ewk_context_download_job_get(toEwkContext(clientInfo), downloadId); + Ewk_Download_Job* download = toEwkContext(clientInfo)->downloadJob(downloadId); ASSERT(download); download->setState(EWK_DOWNLOAD_JOB_STATE_CANCELLED); ewk_view_download_job_cancelled(download->view(), download); - ewk_context_download_job_remove(toEwkContext(clientInfo), downloadId); + toEwkContext(clientInfo)->removeDownloadJob(downloadId); } static void didFinish(WKContextRef, WKDownloadRef wkDownload, const void* clientInfo) { uint64_t downloadId = toImpl(wkDownload)->downloadID(); - Ewk_Download_Job* download = ewk_context_download_job_get(toEwkContext(clientInfo), downloadId); + Ewk_Download_Job* download = toEwkContext(clientInfo)->downloadJob(downloadId); ASSERT(download); download->setState(EWK_DOWNLOAD_JOB_STATE_FINISHED); ewk_view_download_job_finished(download->view(), download); - ewk_context_download_job_remove(toEwkContext(clientInfo), downloadId); + toEwkContext(clientInfo)->removeDownloadJob(downloadId); } void ewk_context_download_client_attach(Ewk_Context* ewkContext) @@ -136,7 +136,7 @@ void ewk_context_download_client_attach(Ewk_Context* ewkContext) wkDownloadClient.didFail = didFail; wkDownloadClient.didFinish = didFinish; - WKContextSetDownloadClient(ewk_context_WKContext_get(ewkContext), &wkDownloadClient); + WKContextSetDownloadClient(ewkContext->wkContext(), &wkDownloadClient); } diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_context_history_client.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_context_history_client.cpp index 1038b4df5..4f793b9d0 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_context_history_client.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_context_history_client.cpp @@ -41,75 +41,70 @@ using namespace WebKit; -static inline const Ewk_Context_History_Client* getEwkHistoryDelegate(const void* clientInfo) +static inline const Ewk_Context_History_Client& getEwkHistoryClient(const void* clientInfo) { ASSERT(clientInfo); - return ewk_context_history_client_get(static_cast<const Ewk_Context*>(clientInfo)); + return static_cast<const Ewk_Context*>(clientInfo)->historyClient(); } static void didNavigateWithNavigationData(WKContextRef, WKPageRef page, WKNavigationDataRef navigationData, WKFrameRef, const void* clientInfo) { - const Ewk_Context_History_Client* historyDelegate = getEwkHistoryDelegate(clientInfo); - ASSERT(historyDelegate); + const Ewk_Context_History_Client& historyClient = getEwkHistoryClient(clientInfo); - if (!historyDelegate->navigate_func) + if (!historyClient.navigate_func) return; RefPtr<Ewk_Navigation_Data> navigationDataEwk = Ewk_Navigation_Data::create(navigationData); - historyDelegate->navigate_func(ewk_view_from_page_get(toImpl(page)), navigationDataEwk.get(), historyDelegate->user_data); + historyClient.navigate_func(ewk_view_from_page_get(toImpl(page)), navigationDataEwk.get(), historyClient.user_data); } static void didPerformClientRedirect(WKContextRef, WKPageRef page, WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef, const void* clientInfo) { - const Ewk_Context_History_Client* historyDelegate = getEwkHistoryDelegate(clientInfo); - ASSERT(historyDelegate); + const Ewk_Context_History_Client& historyClient = getEwkHistoryClient(clientInfo); - if (!historyDelegate->client_redirect_func) + if (!historyClient.client_redirect_func) return; WKEinaSharedString sourceURLString(sourceURL); WKEinaSharedString destinationURLString(destinationURL); - historyDelegate->client_redirect_func(ewk_view_from_page_get(toImpl(page)), sourceURLString, destinationURLString, historyDelegate->user_data); + historyClient.client_redirect_func(ewk_view_from_page_get(toImpl(page)), sourceURLString, destinationURLString, historyClient.user_data); } static void didPerformServerRedirect(WKContextRef, WKPageRef page, WKURLRef sourceURL, WKURLRef destinationURL, WKFrameRef, const void* clientInfo) { - const Ewk_Context_History_Client* historyDelegate = getEwkHistoryDelegate(clientInfo); - ASSERT(historyDelegate); + const Ewk_Context_History_Client& historyClient = getEwkHistoryClient(clientInfo); - if (!historyDelegate->server_redirect_func) + if (!historyClient.server_redirect_func) return; WKEinaSharedString sourceURLString(sourceURL); WKEinaSharedString destinationURLString(destinationURL); - historyDelegate->server_redirect_func(ewk_view_from_page_get(toImpl(page)), sourceURLString, destinationURLString, historyDelegate->user_data); + historyClient.server_redirect_func(ewk_view_from_page_get(toImpl(page)), sourceURLString, destinationURLString, historyClient.user_data); } static void didUpdateHistoryTitle(WKContextRef, WKPageRef page, WKStringRef title, WKURLRef URL, WKFrameRef, const void* clientInfo) { - const Ewk_Context_History_Client* historyDelegate = getEwkHistoryDelegate(clientInfo); - ASSERT(historyDelegate); + const Ewk_Context_History_Client& historyClient = getEwkHistoryClient(clientInfo); - if (!historyDelegate->title_update_func) + if (!historyClient.title_update_func) return; WKEinaSharedString titleString(title); WKEinaSharedString stringURL(URL); - historyDelegate->title_update_func(ewk_view_from_page_get(toImpl(page)), titleString, stringURL, historyDelegate->user_data); + historyClient.title_update_func(ewk_view_from_page_get(toImpl(page)), titleString, stringURL, historyClient.user_data); } static void populateVisitedLinks(WKContextRef, const void* clientInfo) { - const Ewk_Context_History_Client* historyDelegate = getEwkHistoryDelegate(clientInfo); - ASSERT(historyDelegate); + const Ewk_Context_History_Client& historyClient = getEwkHistoryClient(clientInfo); - if (!historyDelegate->populate_visited_links_func) + if (!historyClient.populate_visited_links_func) return; - historyDelegate->populate_visited_links_func(historyDelegate->user_data); + historyClient.populate_visited_links_func(historyClient.user_data); } void ewk_context_history_client_attach(Ewk_Context* ewkContext) @@ -126,5 +121,5 @@ void ewk_context_history_client_attach(Ewk_Context* ewkContext) wkHistoryClient.didUpdateHistoryTitle = didUpdateHistoryTitle; wkHistoryClient.populateVisitedLinks = populateVisitedLinks; - WKContextSetHistoryClient(ewk_context_WKContext_get(ewkContext), &wkHistoryClient); + WKContextSetHistoryClient(ewkContext->wkContext(), &wkHistoryClient); } diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h b/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h index 705739a16..489f05189 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h +++ b/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h @@ -20,22 +20,87 @@ #ifndef ewk_context_private_h #define ewk_context_private_h -#include <WebKit2/WKBase.h> +#include "WKAPICast.h" +#include "WKRetainPtr.h" +#include "ewk_context_history_client_private.h" -typedef struct Ewk_Context Ewk_Context; -typedef struct Ewk_Download_Job Ewk_Download_Job; -typedef struct Ewk_Url_Scheme_Request Ewk_Url_Scheme_Request; -typedef struct Ewk_Context_History_Client Ewk_Context_History_Client; +class Ewk_Download_Job; +class Ewk_Url_Scheme_Request; +class Ewk_Cookie_Manager; +class Ewk_Favicon_Database; +#if ENABLE(BATTERY_STATUS) +class BatteryProvider; +#endif +#if ENABLE(NETWORK_INFO) +class NetworkInfoProvider; +#endif +#if ENABLE(VIBRATION) +class VibrationProvider; +#endif -WKContextRef ewk_context_WKContext_get(const Ewk_Context*); -Ewk_Context* ewk_context_new_from_WKContext(WKContextRef); -WKSoupRequestManagerRef ewk_context_request_manager_get(const Ewk_Context*); -void ewk_context_url_scheme_request_received(Ewk_Context*, Ewk_Url_Scheme_Request*); +class Ewk_Context : public RefCounted<Ewk_Context> { +public: + static PassRefPtr<Ewk_Context> create(WKContextRef context); + static PassRefPtr<Ewk_Context> create(); + static PassRefPtr<Ewk_Context> create(const String& injectedBundlePath); -void ewk_context_download_job_add(Ewk_Context*, Ewk_Download_Job*); -Ewk_Download_Job* ewk_context_download_job_get(const Ewk_Context*, uint64_t downloadId); -void ewk_context_download_job_remove(Ewk_Context*, uint64_t downloadId); + static PassRefPtr<Ewk_Context> defaultContext(); -const Ewk_Context_History_Client* ewk_context_history_client_get(const Ewk_Context*); + ~Ewk_Context(); + + Ewk_Cookie_Manager* cookieManager(); + + Ewk_Favicon_Database* faviconDatabase(); + + bool registerURLScheme(const String& scheme, Ewk_Url_Scheme_Request_Cb callback, void* userData); + +#if ENABLE(VIBRATION) + PassRefPtr<VibrationProvider> vibrationProvider(); +#endif + + void addVisitedLink(const String& visitedURL); + + void setCacheModel(Ewk_Cache_Model); + + Ewk_Cache_Model cacheModel() const; + + WKContextRef wkContext(); + + WKSoupRequestManagerRef requestManager(); + + void urlSchemeRequestReceived(Ewk_Url_Scheme_Request*); + + void addDownloadJob(Ewk_Download_Job*); + Ewk_Download_Job* downloadJob(uint64_t downloadId); + void removeDownloadJob(uint64_t downloadId); + + const Ewk_Context_History_Client& historyClient() const { return m_historyClient; } + Ewk_Context_History_Client& historyClient() { return m_historyClient; } + +private: + explicit Ewk_Context(WKContextRef); + + WKRetainPtr<WKContextRef> m_context; + + OwnPtr<Ewk_Cookie_Manager> m_cookieManager; + OwnPtr<Ewk_Favicon_Database> m_faviconDatabase; +#if ENABLE(BATTERY_STATUS) + RefPtr<BatteryProvider> m_batteryProvider; +#endif +#if ENABLE(NETWORK_INFO) + RefPtr<NetworkInfoProvider> m_networkInfoProvider; +#endif +#if ENABLE(VIBRATION) + RefPtr<VibrationProvider> m_vibrationProvider; +#endif + HashMap<uint64_t, RefPtr<Ewk_Download_Job> > m_downloadJobs; + + WKRetainPtr<WKSoupRequestManagerRef> m_requestManager; + + typedef HashMap<String, class Ewk_Url_Scheme_Handler> URLSchemeHandlerMap; + URLSchemeHandlerMap m_urlSchemeHandlers; + + Ewk_Context_History_Client m_historyClient; +}; #endif // ewk_context_private_h diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_context_request_manager_client.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_context_request_manager_client.cpp index b2573ca8e..fe801ce6b 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_context_request_manager_client.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_context_request_manager_client.cpp @@ -41,7 +41,7 @@ static inline Ewk_Context* toEwkContext(const void* clientInfo) static void didReceiveURIRequest(WKSoupRequestManagerRef soupRequestManagerRef, WKURLRef urlRef, WKPageRef, uint64_t requestID, const void* clientInfo) { RefPtr<Ewk_Url_Scheme_Request> schemeRequest = Ewk_Url_Scheme_Request::create(soupRequestManagerRef, urlRef, requestID); - ewk_context_url_scheme_request_received(toEwkContext(clientInfo), schemeRequest.get()); + toEwkContext(clientInfo)->urlSchemeRequestReceived(schemeRequest.get()); } void ewk_context_request_manager_client_attach(Ewk_Context* context) @@ -53,5 +53,5 @@ void ewk_context_request_manager_client_attach(Ewk_Context* context) wkRequestManagerClient.clientInfo = context; wkRequestManagerClient.didReceiveURIRequest = didReceiveURIRequest; - WKSoupRequestManagerSetClient(ewk_context_request_manager_get(context), &wkRequestManagerClient); + WKSoupRequestManagerSetClient(context->requestManager(), &wkRequestManagerClient); } diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp index fc955ec82..e77751934 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp @@ -132,7 +132,7 @@ struct Ewk_View_Private_Data { OwnPtr<Ewk_Settings> settings; bool areMouseEventsEnabled; WKRetainPtr<WKColorPickerResultListenerRef> colorPickerResultListener; - Ewk_Context* context; + RefPtr<Ewk_Context> context; #if ENABLE(TOUCH_EVENTS) bool areTouchEventsEnabled; #endif @@ -152,7 +152,6 @@ struct Ewk_View_Private_Data { Ewk_View_Private_Data() : areMouseEventsEnabled(false) - , context(0) #if ENABLE(TOUCH_EVENTS) , areTouchEventsEnabled(false) #endif @@ -171,7 +170,7 @@ struct Ewk_View_Private_Data { ~Ewk_View_Private_Data() { /* Unregister icon change callback */ - Ewk_Favicon_Database* iconDatabase = ewk_context_favicon_database_get(context); + Ewk_Favicon_Database* iconDatabase = context->faviconDatabase(); iconDatabase->unwatchChanges(_ewk_view_on_favicon_changed); void* item; @@ -477,7 +476,6 @@ static Ewk_View_Private_Data* _ewk_view_priv_new(Ewk_View_Smart_Data* smartData) static void _ewk_view_priv_del(Ewk_View_Private_Data* priv) { - ewk_context_unref(priv->context); delete priv; } @@ -795,7 +793,7 @@ static inline Evas_Smart* _ewk_view_smart_class_new(void) return smart; } -static void _ewk_view_initialize(Evas_Object* ewkView, Ewk_Context* context, WKPageGroupRef pageGroupRef) +static void _ewk_view_initialize(Evas_Object* ewkView, PassRefPtr<Ewk_Context> context, WKPageGroupRef pageGroupRef) { EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv); @@ -807,9 +805,9 @@ static void _ewk_view_initialize(Evas_Object* ewkView, Ewk_Context* context, WKP priv->pageClient = PageClientImpl::create(ewkView); if (pageGroupRef) - priv->pageProxy = toImpl(ewk_context_WKContext_get(context))->createWebPage(priv->pageClient.get(), toImpl(pageGroupRef)); + priv->pageProxy = toImpl(context->wkContext())->createWebPage(priv->pageClient.get(), toImpl(pageGroupRef)); else - priv->pageProxy = toImpl(ewk_context_WKContext_get(context))->createWebPage(priv->pageClient.get(), WebPageGroup::create().get()); + priv->pageProxy = toImpl(context->wkContext())->createWebPage(priv->pageClient.get(), WebPageGroup::create().get()); addToPageViewMap(ewkView); @@ -822,7 +820,7 @@ static void _ewk_view_initialize(Evas_Object* ewkView, Ewk_Context* context, WKP priv->backForwardList = Ewk_Back_Forward_List::create(toAPI(priv->pageProxy->backForwardList())); priv->settings = adoptPtr(new Ewk_Settings(WKPageGroupGetPreferences(WKPageGetPageGroup(toAPI(priv->pageProxy.get()))))); - priv->context = ewk_context_ref(context); + priv->context = context; #if USE(COORDINATED_GRAPHICS) priv->pageViewportControllerClient = PageViewportControllerClientEfl::create(ewkView); @@ -842,7 +840,7 @@ static void _ewk_view_initialize(Evas_Object* ewkView, Ewk_Context* context, WKP priv->resourceLoadClient = ResourceLoadClientEfl::create(ewkView); /* Listen for favicon changes */ - Ewk_Favicon_Database* iconDatabase = ewk_context_favicon_database_get(priv->context); + Ewk_Favicon_Database* iconDatabase = priv->context->faviconDatabase(); iconDatabase->watchChanges(IconChangeCallbackData(_ewk_view_on_favicon_changed, ewkView)); } @@ -882,7 +880,7 @@ Evas_Object* ewk_view_base_add(Evas* canvas, WKContextRef contextRef, WKPageGrou if (!ewkView) return 0; - _ewk_view_initialize(ewkView, ewk_context_new_from_WKContext(contextRef), pageGroupRef); + _ewk_view_initialize(ewkView, Ewk_Context::create(contextRef), pageGroupRef); return ewkView; } @@ -904,6 +902,7 @@ Evas_Object* ewk_view_smart_add(Evas* canvas, Evas_Smart* smart, Ewk_Context* co Evas_Object* ewk_view_add_with_context(Evas* canvas, Ewk_Context* context) { + EINA_SAFETY_ON_NULL_RETURN_VAL(context, 0); return ewk_view_smart_add(canvas, _ewk_view_smart_class_new(), context); } @@ -917,7 +916,7 @@ Ewk_Context* ewk_view_context_get(const Evas_Object* ewkView) EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, 0); EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, 0); - return priv->context; + return priv->context.get(); } /** @@ -1544,7 +1543,7 @@ void ewk_view_update_icon(Evas_Object* ewkView) EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv); - Ewk_Favicon_Database* iconDatabase = ewk_context_favicon_database_get(priv->context); + Ewk_Favicon_Database* iconDatabase = priv->context->faviconDatabase(); ASSERT(iconDatabase); priv->faviconURL = ewk_favicon_database_icon_url_get(iconDatabase, priv->url); |