Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(912)

Side by Side Diff: chrome/renderer/chrome_ppb_talk_private_impl.cc

Issue 9666020: Add a private PPB_Talk_Private interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/chrome_ppb_talk_private_impl.h ('k') | ppapi/api/private/ppb_talk_private.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. 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 "chrome/renderer/chrome_ppb_talk_private_impl.h"
6
7 #include "content/public/render_view.h"
8 #include "content/public/render_view_observer.h"
9 #include "ppapi/c/private/ppb_talk_private.h"
10 #include "ppapi/proxy/ppapi_param_traits.h"
11
12 using ppapi::thunk::PPB_Talk_Private_API;
13
14 namespace chrome {
15
16 namespace {
17
18 PP_Resource Create(PP_Instance instance) {
19 return (new PPB_Talk_Private_Impl(instance))->GetReference();
20 }
21
22 int32_t GetPermission(PP_Resource talk_resource,
23 PP_CompletionCallback callback) {
24 ppapi::EnterResource<PPB_Talk_API> enter(resource, callback, true);
25 if (enter.failed())
26 return enter.retval();
27 return enter.SetResult(enter.object()->GetPermission(callback));
28 }
29
30 const PPB_Talk_Private_1_0 talk_interface = {
31 &Create,
32 &GetPermission
33 };
34
35 } // namespace
36
37 // This observer adds itself to the render view to listen for reply messages.
38 class PPB_Talk_Private_Impl::Observer : public content::RenderViewObserver {
39 public:
40 Observer(PPB_Talk_Private_Impl* talk)
41 : RenderViewObserver(talk->GetRenderView()),
42 talk_(talk) {
43 }
44
45 // RenderViewObserver message filter. We return true only when the message
46 // is the reply message for this particular resource (since there could be
47 // multiple replies pending for different resources).
48 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
49 // TODO add this message type in the same place
50 // ChromeViewHostMsg_PDFHasUnsupportedFeature is declared. First param
51 // should be host resource, second int32.
52 if (message->type() == ChromeViewHostMsg_GetTalkPermissionACK) {
53 // Manually extract the first parameter from the message to see if it's
54 // our resource.
55 void** iter = NULL;
56 ppapi::HostResource resource;
57 int32 result;
58 if (IPC::ParamTraits<HostResource>::Read(&message, iter, &resource) &&
59 IPC::ParamTraits<int32>::Read(&message, iter, &result) &&
60 resource == talk_->host_resource()) {
61 talk_->ReplyReceived(result);
62 return true;
63 }
64 }
65 return false;
66 }
67
68 private:
69 PPB_Talk_Private_Impl* talk_;
70
71 DISALLOW_COPY_AND_ASSIGN(Observer);
72 };
73
74 PPB_Talk_Private_Impl::PPB_Talk_Private_Impl(PP_Instance instance)
75 : Resource(ppapi::OBJECT_IS_IMPL) {
76 observer_.reset(new Observer(this));
77 }
78
79 PPB_Talk_Private_Impl::~PPB_Talk_Private_Impl() {
80 }
81
82 // static
83 const PPB_Talk_Private_1_0* PPB_Talk_Private_Impl::GetInterface() {
84 return &talk_interface;
85 }
86
87 PPB_Talk_Private_API* PPB_Talk_Private_Impl::AsPPB_Talk_Private_API() {
88 return this;
89 }
90
91 int32_t PPB_Talk_Private_Impl::GetPermission(
92 const PP_CompletionCallback& callback) {
93 RenderView* render_view = GetRenderView();
94 if (!render_view)
95 return PP_ERROR_FAILED;
96
97 callback_ = new TrackedCallback(this, callback);
98
99 render_view->Send(new ChromeViewHostMsg_GetTalkPermission(
100 render_view->GetRoutingID(), host_resource()));
101 }
102
103 content::RenderView* PPB_Talk_Private_Impl::GetRenderView() {
104 WebView* view = instance->container()->element().document().frame()->view();
105 return content::RenderView::FromWebView(view);
106 }
107
108 void PPB_Talk_Private_Impl::ReplyReceived(int32_t result) {
109 if (ppapi::TrackedCallback::IsPending(&callback_))
110 ppapi::TrackedCallback::ClearAndRun(&callback_, result);
111 }
112
113 } // namespace chrome
OLDNEW
« no previous file with comments | « chrome/renderer/chrome_ppb_talk_private_impl.h ('k') | ppapi/api/private/ppb_talk_private.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698