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

Side by Side Diff: chrome/browser/media/router/presentation_service_delegate_impl.h

Issue 1132903002: [MediaRouter] Add implementation of PresentationServiceDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
OLDNEW
(Empty)
1 // Copyright 2015 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 #ifndef CHROME_BROWSER_MEDIA_ROUTER_PRESENTATION_SERVICE_DELEGATE_IMPL_H_
6 #define CHROME_BROWSER_MEDIA_ROUTER_PRESENTATION_SERVICE_DELEGATE_IMPL_H_
7
8 #include <map>
9 #include <string>
10 #include <utility>
11
12 #include "base/gtest_prod_util.h"
13 #include "base/macros.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/observer_list.h"
17 #include "chrome/browser/media/router/media_router.h"
18 #include "chrome/browser/media/router/media_source.h"
19 #include "content/public/browser/presentation_service_delegate.h"
20 #include "content/public/browser/web_contents_observer.h"
21 #include "content/public/browser/web_contents_user_data.h"
22
23 namespace content {
24 class RenderFrameHost;
25 class PresentationScreenAvailabilityListener;
26 class WebContents;
27 struct PresentationSessionInfo;
28 struct PresentationSessionMessage;
29 }
30
31 namespace media_router {
32
33 class MediaRoute;
34 class MediaSinksObserver;
35 class PresentationFrameMap;
36
37 // Implementation of PresentationServiceDelegate that that interfaces an
38 // instance of WebContents with the Chrome Media Router.
39 // In addition to fulfilling Presentation requests, it also
40 // provide tab-level information that is required for creating
41 // browser-initiated sessions.
42 class PresentationServiceDelegateImpl
43 : public content::WebContentsUserData<PresentationServiceDelegateImpl>,
44 public content::PresentationServiceDelegate {
45 public:
46 using RenderFrameHostId =
imcheng (use chromium acct) 2015/05/18 20:54:08 Can this be moved to private?
haibinlu 2015/05/18 23:40:47 Done.
47 content::PresentationServiceDelegate::RenderFrameHostId;
48
49 ~PresentationServiceDelegateImpl() override;
50
51 // content::PresentationServiceDelegate implementation.
52 // PresentationScreenAvailabilityListener is one per
53 // (frame, presentation URL), while PresentationServiceDelegate::Observer
54 // is one per frame.
55 void AddObserver(
56 int render_process_id,
57 int render_frame_id,
58 content::PresentationServiceDelegate::Observer* observer) override;
59 void RemoveObserver(int render_process_id, int render_frame_id) override;
60 bool AddScreenAvailabilityListener(
61 int render_process_id,
62 int render_frame_id,
63 content::PresentationScreenAvailabilityListener* listener) override;
64 void RemoveScreenAvailabilityListener(
65 int render_process_id,
66 int render_frame_id,
67 content::PresentationScreenAvailabilityListener* listener) override;
68 void Reset(int render_process_id, int render_frame_id) override;
69 void SetDefaultPresentationUrl(
70 int render_process_id,
71 int render_frame_id,
72 const std::string& default_presentation_url,
73 const std::string& default_presentation_id) override;
74 void StartSession(int render_process_id,
75 int render_frame_id,
76 const std::string& presentation_url,
77 const std::string& presentation_id,
78 const PresentationSessionSuccessCallback& success_cb,
79 const PresentationSessionErrorCallback& error_cb) override;
80 void JoinSession(int render_process_id,
81 int render_frame_id,
82 const std::string& presentation_url,
83 const std::string& presentation_id,
84 const PresentationSessionSuccessCallback& success_cb,
85 const PresentationSessionErrorCallback& error_cb) override;
86 void ListenForSessionMessages(
87 int render_process_id,
88 int render_frame_id,
89 const PresentationSessionMessageCallback& message_cb) override;
90 void SendMessage(
91 int render_process_id,
92 int render_frame_id,
93 scoped_ptr<content::PresentationSessionMessage> message_request,
94 const SendMessageCallback& send_message_cb) override;
95
96 // Notifies this object that |route| has been created or joined outside of a
97 // Presentation API request. The route could be due to
98 // browser action (e.g., browser initiated media router dialog) or
99 // a media route provider (e.g., autojoin).
100 void OnRouteCreated(const MediaRoute& route);
101
102 // Returns the default MediaSource for this tab if there is one.
103 // Returns an empty MediaSource otherwise.
104 MediaSource GetDefaultMediaSource() const;
imcheng (use chromium acct) 2015/05/18 20:54:08 default_source() ?
haibinlu 2015/05/18 23:40:47 Done.
105
106 // Observer interface for listening to default MediaSource changes for the
107 // WebContents.
108 class DefaultMediaSourceObserver {
109 public:
110 virtual ~DefaultMediaSourceObserver() {}
111
112 // Called when default media source for the corresponding WebContents has
113 // changed.
114 // |source|: New default MediaSource, or empty if default was removed.
115 // |source_host|: Host name of the frame that contains the default media
116 // source, or empty if there is no default media source.
117 virtual void OnDefaultMediaSourceChanged(
118 const MediaSource& source,
119 const std::string& source_host) = 0;
120 };
121
122 // Adds / removes an observer for listening to default MediaSource changes.
123 void AddDefaultMediaSourceObserver(DefaultMediaSourceObserver* observer);
124 void RemoveDefaultMediaSourceObserver(DefaultMediaSourceObserver* observer);
125
126 base::WeakPtr<PresentationServiceDelegateImpl> GetWeakPtr();
127
128 // Maximum number of sources that can be registered at a time.
129 static const size_t kMaxNumSources = 256;
imcheng (use chromium acct) 2015/05/18 20:54:08 static const variables go at the top of public: bl
haibinlu 2015/05/18 23:40:47 Done.
130
131 private:
132 explicit PresentationServiceDelegateImpl(content::WebContents* web_contents);
133 friend class content::WebContentsUserData<PresentationServiceDelegateImpl>;
134
135 friend class PresentationServiceDelegateImplTest;
136 friend class PresentationServiceDelegateImplBrowserTest;
137 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
138 AddScreenAvailabilityListener);
139 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
140 MaxNumObservers);
141 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
142 AddListenerSameUrlTwice);
143 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest, Reset);
144 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
145 DelegateObservers);
146 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplBrowserTest,
147 RemoveObserversOnNavigation);
148
149 // Returns |listener|'s presentation URL as a MediaSource. If |listener| does
150 // not have a persentation URL, default to tab mirroring.
imcheng (use chromium acct) 2015/05/18 20:54:08 how about: returns the tab mirroring MediaSource.
haibinlu 2015/05/18 23:40:48 Done.
151 MediaSource GetMediaSourceFromListener(
152 content::PresentationScreenAvailabilityListener* listener);
153
154 // Returns |true| is frame |rfh_id| is the main frame of |web_contents_|.
imcheng (use chromium acct) 2015/05/18 20:54:08 Returns |true| if ...
haibinlu 2015/05/18 23:40:47 Done.
155 bool IsMainFrame(RenderFrameHostId rfh_id) const;
156
157 // Updates tab-level default MediaSource and source host name. If either
158 // changed, notify the observers.
159 void UpdateDefaultMediaSourceAndNotifyObservers(
160 const MediaSource& new_default_source,
161 const std::string& new_default_source_host);
162
163 void SetMediaRouterForTest(MediaRouter* router);
164
165 bool HasScreenAvailabilityListenerFor(RenderFrameHostId rfh_id,
166 const MediaSourceId& source_id) const;
167
168 // Manages frames that are using presentation API.
169 scoped_ptr<PresentationFrameMap> frame_map_;
170
171 MediaSource default_source_;
172 std::string default_source_host_;
173
174 content::WebContents* web_contents_;
175
176 // Observers listening for changes to default media source. Not owned by
177 // this class.
178 ObserverList<DefaultMediaSourceObserver> default_media_source_observers_;
179
180 // Does not own this object.
181 MediaRouter* router_;
182
183 // NOTE: All WeakPtrs must be invalidated before member variables.
184 base::WeakPtrFactory<PresentationServiceDelegateImpl> weak_factory_;
185
186 DISALLOW_COPY_AND_ASSIGN(PresentationServiceDelegateImpl);
187 };
188
189 } // namespace media_router
190
191 #endif // CHROME_BROWSER_MEDIA_ROUTER_PRESENTATION_SERVICE_DELEGATE_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698