[M53_2785] Chromium upversion to m53_2785 branch.
[platform/framework/web/chromium-efl.git] / tizen_src / ewk / efl_integration / wrt / wrt_widget_host.cc
1 // Copyright (c) 2014,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 "wrt_widget_host.h"
6
7 #include "base/lazy_instance.h"
8 #include "common/render_messages_ewk.h"
9 #include "content/public/browser/browser_message_filter.h"
10 #include "content/public/browser/render_process_host.h"
11 #include "content/public/browser/resource_request_info.h"
12 #include "ipc/ipc_message_macros.h"
13 #include "ipc_message_start_ewk.h"
14 #include "net/url_request/url_request.h"
15 #include "url/gurl.h"
16
17 namespace {
18 // TODO(z.kostrzewa) I would prefer not make it a singleton, check out
19 // if it can't be a member of ContentMainDelegateEfl (but keep the static
20 // getter, maybe?).
21 base::LazyInstance<std::unique_ptr<WrtWidgetHost> > g_wrt_widget_host =
22     LAZY_INSTANCE_INITIALIZER;
23
24 bool SendToAllRenderers(IPC::Message* message) {
25   bool result = false;
26   content::RenderProcessHost::iterator it =
27       content::RenderProcessHost::AllHostsIterator();
28   while (!it.IsAtEnd()) {
29     if (it.GetCurrentValue()->Send(message))
30       result = true;
31     it.Advance();
32   }
33   return result;
34 }
35
36 bool SendToRenderer(int renderer_id, IPC::Message* message) {
37   return content::RenderProcessHost::FromID(renderer_id)->Send(message);
38 }
39 }
40
41 class WrtWidgetHostMessageFilter : public content::BrowserMessageFilter {
42  public:
43   explicit WrtWidgetHostMessageFilter(WrtWidgetHost* wrt_widget_host);
44
45  private:
46   bool OnMessageReceived(const IPC::Message& message) override;
47
48   WrtWidgetHost* wrt_widget_host_;
49 };
50
51 WrtWidgetHostMessageFilter::WrtWidgetHostMessageFilter(
52     WrtWidgetHost* wrt_widget_host)
53     : content::BrowserMessageFilter(EwkMsgStart),
54       wrt_widget_host_(wrt_widget_host) {
55 }
56
57 bool WrtWidgetHostMessageFilter::OnMessageReceived(const IPC::Message& message) {
58   bool handled = true;
59   IPC_BEGIN_MESSAGE_MAP(WrtWidgetHostMessageFilter, message)
60     IPC_MESSAGE_FORWARD(WrtMsg_ParseUrlResponse, wrt_widget_host_, WrtWidgetHost::OnUrlRetrieved)
61     IPC_MESSAGE_UNHANDLED(handled = false)
62   IPC_END_MESSAGE_MAP()
63   return handled;
64 }
65
66 WrtWidgetHost* WrtWidgetHost::Get() {
67   // TODO(z.kostrzewa) LazyInstance is thread-safe but creating
68   // WrtWidgetHost is not - make it thread-safe.
69   if (!g_wrt_widget_host.Get().get())
70     g_wrt_widget_host.Get().reset(new WrtWidgetHost);
71   return g_wrt_widget_host.Get().get();
72 }
73
74 WrtWidgetHost::WrtWidgetHost()
75     : message_filter_(new WrtWidgetHostMessageFilter(this)) {
76 }
77
78 void WrtWidgetHost::GetUrlForRequest(
79     net::URLRequest* request,
80     base::Callback<void(const GURL&)> callback) {
81   // TODO(z.kostrzewa) Check on which thread(s) callbacks_ is touched
82   // and provide synchronization if required (either via a lock or
83   // by assuring that it is referenced only on one thread)
84   int callback_id = callback_id_generator_.GetNext();
85   callbacks_[callback_id] = callback;
86
87   int renderer_id, frame_id;
88   if (content::ResourceRequestInfo::GetRenderFrameForRequest(request, &renderer_id,
89                                                              &frame_id))
90     if (SendToRenderer(renderer_id, new WrtMsg_ParseUrl(callback_id, request->url())))
91       return;
92
93   callbacks_.erase(callback_id);
94   callback.Run(GURL());
95 }
96
97 void WrtWidgetHost::SendWrtMessage(
98     const Ewk_Wrt_Message_Data& message) {
99   SendToAllRenderers(new WrtMsg_SendWrtMessage(message));
100 }
101
102 // It's only used by the wrt_file_protocol_handler which is not going to be used in the future
103 // Candidate for deletion.
104 bool WrtWidgetHost::InWrt() const {
105   return false;
106 }
107
108 // It's only used by the wrt_file_protocol_handler which is not going to be used in the future
109 // Candidate for deletion.
110 std::string WrtWidgetHost::TizenId() const {
111   return std::string();
112 }
113
114 void WrtWidgetHost::OnUrlRetrieved(int callback_id, const GURL& url) {
115   callbacks_type::iterator it = callbacks_.find(callback_id);
116   if (callbacks_.end() == it)
117     return;
118
119   callbacks_type::mapped_type callback = it->second;
120   callbacks_.erase(callback_id);
121   callback.Run(url);
122 }
123