}
}
+void XWalkExtensionManager::SetRuntimeMessageHandler(
+ const std::string& type,
+ XWalkRuntimeMessageHandler handler) {
+ if (!handler || (type == ""))
+ return;
+
+ LOG(INFO) << "[" << type << "] is added in callback";
+ base::AutoLock lock(xmanager_instance_lock);
+ message_callbacks_[type] = handler;
+}
+
+std::string XWalkExtensionManager::HandleRuntimeMessageCallback(
+ const std::string& type,
+ const std::string& value) {
+ base::AutoLock lock(xmanager_instance_lock);
+ if (message_callbacks_.find(type) != message_callbacks_.end()) {
+ auto callback = message_callbacks_[type];
+ char* allocated_result = callback(value.c_str());
+ std::unique_ptr<char, base::FreeDeleter> result(allocated_result);
+ return std::string(result.get());
+ } else {
+ return std::string();
+ }
+}
+
std::string XWalkExtensionManager::HandleRuntimeMessageInternal(
const std::string& type, const std::string& value) {
+ auto result = HandleRuntimeMessageCallback(type, value);
+ if (!result.empty())
+ return result;
+
if (delegate_)
return delegate_->HandleRuntimeMessageInternal(type, value);
namespace wrt {
+typedef char* (*XWalkRuntimeMessageHandler)(const char*);
+
class XWalkExtensionManager : public mojom::XWalkExtensionBrowser {
public:
typedef std::map<std::string, std::unique_ptr<XWalkExtension>> ExtensionMap;
void SetDelegate(std::unique_ptr<XWalkExtensionBrowserDelegate> delegate) {
delegate_ = std::move(delegate);
}
+ void SetRuntimeMessageHandler(const std::string& type,
+ XWalkRuntimeMessageHandler handler);
void SetPreloadHandle(const std::string& lib_path, void* handle);
void UnloadExtensions();
void UnregisterInstance(XWalkExtension::Instance* instance);
virtual std::string HandleRuntimeMessageInternal(
const std::string& type, const std::string& value);
+ std::string HandleRuntimeMessageCallback(const std::string& type,
+ const std::string& value);
bool is_loaded_by_path_ = false;
bool is_loaded_for_service_app_ = false;
std::set<std::string> extension_symbols_;
ExtensionMap extensions_;
std::map<std::string, void*> preload_handle_;
+ std::map<std::string, XWalkRuntimeMessageHandler> message_callbacks_;
mojo::ReceiverSet<mojom::XWalkExtensionBrowser> receivers_;
std::map<mojo::ReceiverId, mojo::Remote<mojom::XWalkExtensionRenderer>>
#include "renderer/content_renderer_client_efl.h"
#include "ui/base/resource/resource_bundle.h"
-#if BUILDFLAG(IS_TIZEN)
-#include "components/xwalk_extensions/browser/xwalk_extension_manager.h"
-#endif
-
#if BUILDFLAG(IS_TIZEN_TV)
#include "content/public/browser/render_process_host.h"
#include "devtools_port_manager.h"
extension_manager->PreloadExtensions();
extension_manager->SetDelegate(std::make_unique<XWalkExtensionBrowserEfl>());
}
+
+void ContentMainDelegateEfl::SetXWalkExtensionMessageHandler(
+ const std::string& type,
+ wrt::XWalkRuntimeMessageHandler handler) {
+ auto* extension_manager = wrt::XWalkExtensionManager::GetInstance();
+ extension_manager->SetRuntimeMessageHandler(type, handler);
+}
#endif
/* LCOV_EXCL_STOP */
#include "content/public/renderer/content_renderer_client.h"
#include "common/content_client_efl.h"
+#if BUILDFLAG(IS_TIZEN)
+#include "components/xwalk_extensions/browser/xwalk_extension_manager.h"
+#endif
+
namespace content {
class ContentMainDelegateEfl
#if BUILDFLAG(IS_TIZEN)
void InitializeXWalkExtensions(const std::string& extension_path);
+ void SetXWalkExtensionMessageHandler(const std::string& type,
+ wrt::XWalkRuntimeMessageHandler handler);
#endif
#if BUILDFLAG(IS_TIZEN_TV)
void ProcessExiting(const std::string& process_type) override;
->GetContentMainDelegateEfl()
.InitializeXWalkExtensions(extension_path);
#endif
+}
+
+void EWebContext::SetXWalkExtensionMessageHandler(
+ const std::string& type,
+ Ewk_RuntimeMessageHandler handler) {
+#if BUILDFLAG(IS_TIZEN)
+ EwkGlobalData::GetInstance()
+ ->GetContentMainDelegateEfl()
+ .SetXWalkExtensionMessageHandler(type, handler);
+#endif
} /* LCOV_EXCL_STOP */
void EnableAppControl(bool enabled);
void SetMaxRefreshRate(int max_refresh_rate);
void SetXWalkExtensionProfile(const std::string& extension_path);
+ void SetXWalkExtensionMessageHandler(const std::string& type,
+ Ewk_RuntimeMessageHandler handler);
private:
EWebContext(bool incognito, const std::string& injectedBundlePath);
void Ewk_Context::SetXWalkExtensionProfile(const std::string& extension_path) {
impl->SetXWalkExtensionProfile(extension_path);
}
+
+void Ewk_Context::SetXWalkExtensionMessageHandler(
+ const std::string& type,
+ Ewk_RuntimeMessageHandler handler) {
+ impl->SetXWalkExtensionMessageHandler(type, handler);
+}
void EnableAppControl(bool enabled);
void SetMaxRefreshRate(int max_refresh_rate);
void SetXWalkExtensionProfile(const std::string& extension_path);
+ void SetXWalkExtensionMessageHandler(const std::string& type,
+ Ewk_RuntimeMessageHandler handler);
private:
EWebContext* impl;
}
/* LCOV_EXCL_STOP */
+void ewk_context_add_xwalk_extension_message_handler(Ewk_Context* ewk_context,
+ const char* type,
+ Ewk_RuntimeMessageHandler handler) {
+ EINA_SAFETY_ON_NULL_RETURN(ewk_context);
+ LOG(INFO) << "type : " << type;
+ ewk_context->SetXWalkExtensionMessageHandler(type, handler);
+}
+
Eina_Bool ewk_context_background_music_get(Ewk_Context* context)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE);
Ewk_Context* ewk_context,
const char* extension_path);
+/**
+ * @brief Sets a callback to handle xwalk extension internal message
+ *
+ * @details SetXWalkExtensionMessageHandler handles runtime message like as tizen://exit
+ * file
+ *
+ *
+ * @param[in] context object
+ * @param[in] runtime message type
+ * @param[in] message callback handler - char* (*callback)(const char* argument)
+ *
+ * i.e.)
+ * ewk_context_add_xwalk_extension_message_handler(context, "tizen://exit", AppExit);
+ *
+ * char* AppExit(const char* argument) {
+ * // TODO
+ * return strdup("success");
+ * }
+ */
+
+typedef char* (*Ewk_RuntimeMessageHandler)(const char*);
+EXPORT_API void ewk_context_add_xwalk_extension_message_handler(
+ Ewk_Context* ewk_context,
+ const char* type,
+ Ewk_RuntimeMessageHandler handler);
+
/**
* @}
*/