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

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 "chrome/browser/media/router/presentation_frame_map.h"
20 #include "content/public/browser/presentation_service_delegate.h"
21 #include "content/public/browser/web_contents_observer.h"
22 #include "content/public/browser/web_contents_user_data.h"
23
24 namespace content {
25 class RenderFrameHost;
26 class PresentationScreenAvailabilityListener;
27 class WebContents;
28 struct PresentationSessionInfo;
29 }
30
31 namespace media_router {
32
33 class MediaRoute;
34 class MediaSinksObserver;
35
36 // Implementation of PresentationServiceDelegate that that interfaces an
37 // instance of WebContents with the Chrome Media Router.
38 // In addition to fulfilling Presentation requests, it also
39 // provide tab-level information that is required for creating
40 // browser-initiated sessions.
41 class PresentationServiceDelegateImpl
42 : public content::WebContentsUserData<PresentationServiceDelegateImpl>,
43 public content::PresentationServiceDelegate {
44 public:
45 using RenderFrameHostId =
46 content::PresentationServiceDelegate::RenderFrameHostId;
47
48 ~PresentationServiceDelegateImpl() override;
49
50 // content::PresentationServiceDelegate implementation.
51 // PresentationScreenAvailabilityListener is one per
52 // (frame, presentation URL), while PresentationServiceDelegate::Observer
53 // is one per frame.
54 void AddObserver(
55 int render_process_id,
56 int render_frame_id,
57 content::PresentationServiceDelegate::Observer* observer) override;
58 void RemoveObserver(int render_process_id, int render_frame_id) override;
59 bool AddScreenAvailabilityListener(
60 int render_process_id,
61 int render_frame_id,
62 content::PresentationScreenAvailabilityListener* listener) override;
63 void RemoveScreenAvailabilityListener(
64 int render_process_id,
65 int render_frame_id,
66 content::PresentationScreenAvailabilityListener* listener) override;
67 void Reset(int render_process_id, int render_frame_id) override;
68 void SetDefaultPresentationUrl(
69 int render_process_id,
70 int render_frame_id,
71 const std::string& default_presentation_url,
72 const std::string& default_presentation_id) override;
73 void StartSession(int render_process_id,
74 int render_frame_id,
75 const std::string& presentation_url,
76 const std::string& presentation_id,
77 const PresentationSessionSuccessCallback& success_cb,
78 const PresentationSessionErrorCallback& error_cb) override;
79 void JoinSession(int render_process_id,
80 int render_frame_id,
81 const std::string& presentation_url,
82 const std::string& presentation_id,
83 const PresentationSessionSuccessCallback& success_cb,
84 const PresentationSessionErrorCallback& error_cb) override;
85 void ListenForSessionMessages(
86 int render_process_id,
87 int render_frame_id,
88 const PresentationSessionMessageCallback& message_cb) override;
89
90 // Notifies this object that |route| has been created or joined outside of a
91 // Presentation API request. The route could be due to
92 // browser action (e.g., browser initiated media router dialog) or
93 // a media route provider (e.g., autojoin).
94 void OnRouteCreated(const MediaRoute& route);
95
96 // Returns the default MediaSource for this tab if there is one.
97 // Returns an empty MediaSource otherwise.
98 MediaSource GetDefaultMediaSource() const;
99
100 // Observer interface for listening to default MediaSource changes for the
101 // WebContents.
102 class DefaultMediaSourceObserver {
103 public:
104 virtual ~DefaultMediaSourceObserver() {}
105
106 // Called when default media source for the corresponding WebContents has
107 // changed.
108 // |source|: New default MediaSource, or empty if default was removed.
109 // |source_host|: Host name of the frame that contains the default media
110 // source, or empty if there is no default media source.
111 virtual void OnDefaultMediaSourceChanged(
112 const MediaSource& source,
113 const std::string& source_host) = 0;
114 };
115
116 // Adds / removes an observer for listening to default MediaSource changes.
117 void AddDefaultMediaSourceObserver(DefaultMediaSourceObserver* observer);
118 void RemoveDefaultMediaSourceObserver(DefaultMediaSourceObserver* observer);
119
120 base::WeakPtr<PresentationServiceDelegateImpl> GetWeakPtr();
121
122 private:
123 explicit PresentationServiceDelegateImpl(content::WebContents* web_contents);
124 friend class content::WebContentsUserData<PresentationServiceDelegateImpl>;
125
126 friend class PresentationServiceDelegateImplTest;
127 friend class PresentationServiceDelegateImplBrowserTest;
128 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
129 AddScreenAvailabilityListener);
130 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
131 MaxNumObservers);
132 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest,
133 AddListenerSameUrlTwice);
134 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplTest, Reset);
135 FRIEND_TEST_ALL_PREFIXES(PresentationServiceDelegateImplBrowserTest,
136 RemoveObserversOnNavigation);
137
138 // Returns |listener|'s presentation URL as a MediaSource. If |listener| does
139 // not have a persentation URL, default to tab mirroring.
140 MediaSource GetMediaSourceFromListener(
141 content::PresentationScreenAvailabilityListener* listener);
142
143 // Returns the presentation ID to use for frame |rfh_id|.
144 // If |presentation_id| is non-empty, return it.
145 // Otherwise, check if a default presentation ID is set for that frame, and
146 // return it.
147 // Otherwise, returns a randomly generated string.
148 std::string GetOrGeneratePresentationId(
mark a. foltz 2015/05/14 22:20:46 This is an odd method - it seems like it would be
haibinlu 2015/05/15 23:32:30 removed the method for now. will split when adding
149 RenderFrameHostId rfh_id,
150 const std::string& presentation_id) const;
151
152 // Returns |true| is frame |rfh_id| is the main frame of |web_contents_|.
153 bool IsMainFrame(RenderFrameHostId rfh_id) const;
mark a. foltz 2015/05/14 22:20:46 This is to determine whether the frame's DPU has b
haibinlu 2015/05/15 23:32:30 This is for checking the main frame.
154
155 // Updates tab-level default MediaSource and source host name. If either
156 // changed, notify the observers.
157 void UpdateDefaultMediaSourceAndNotifyObservers(
158 const MediaSource& new_default_source,
159 const std::string& new_default_source_host);
160
161 void SetMediaRouterForTest(MediaRouter* router);
162
163 PresentationFrameMap frame_map_;
mark a. foltz 2015/05/14 22:20:46 Add docstrings for class members.
haibinlu 2015/05/15 23:32:30 Done.
164
165 MediaSource default_source_;
166 std::string default_source_host_;
mark a. foltz 2015/05/14 22:20:46 Can this be derived from default_source_?
167
168 content::WebContents* web_contents_;
169
170 // Observers listening for changes to default media source. Not owned by
171 // this class.
172 ObserverList<DefaultMediaSourceObserver> default_media_source_observers_;
173
174 // Does not own this object.
175 MediaRouter* router_;
176
177 // NOTE: All WeakPtrs must be invalidated before member variables.
178 base::WeakPtrFactory<PresentationServiceDelegateImpl> weak_factory_;
179
180 DISALLOW_COPY_AND_ASSIGN(PresentationServiceDelegateImpl);
181 };
182
183 } // namespace media_router
184
185 #endif // CHROME_BROWSER_MEDIA_ROUTER_PRESENTATION_SERVICE_DELEGATE_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698