feat: add webContents.getMediaSourceId() method (#31204)
* feat: add webContents.getMediaSourceId() method * fix: account for null frame_hosts in webContents.getMediaSourceId() * fix: move webContents.getMediaSourceId definition to be more organised * fix: move webContents.getMediaSourceId implementation * fix: move webContents.getMediaSourceId docs
This commit is contained in:
parent
63eed52626
commit
23cdf65c53
4 changed files with 47 additions and 0 deletions
|
@ -1923,6 +1923,14 @@ Setting the WebRTC IP handling policy allows you to control which IPs are
|
||||||
exposed via WebRTC. See [BrowserLeaks](https://browserleaks.com/webrtc) for
|
exposed via WebRTC. See [BrowserLeaks](https://browserleaks.com/webrtc) for
|
||||||
more details.
|
more details.
|
||||||
|
|
||||||
|
#### `contents.getMediaSourceId(requestWebContents)`
|
||||||
|
|
||||||
|
* `requestWebContents` WebContents - Web contents that the id will be registered to.
|
||||||
|
|
||||||
|
Returns `String` - The identifier of a WebContents stream. This identifier can be used
|
||||||
|
with `navigator.mediaDevices.getUserMedia` using a `chromeMediaSource` of `tab`.
|
||||||
|
The identifier is restricted to the web contents that it is registered to and is only valid for 10 seconds.
|
||||||
|
|
||||||
#### `contents.getOSProcessId()`
|
#### `contents.getOSProcessId()`
|
||||||
|
|
||||||
Returns `Integer` - The operating system `pid` of the associated renderer
|
Returns `Integer` - The operating system `pid` of the associated renderer
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "content/browser/renderer_host/render_widget_host_view_base.h" // nogncheck
|
#include "content/browser/renderer_host/render_widget_host_view_base.h" // nogncheck
|
||||||
#include "content/public/browser/child_process_security_policy.h"
|
#include "content/public/browser/child_process_security_policy.h"
|
||||||
#include "content/public/browser/context_menu_params.h"
|
#include "content/public/browser/context_menu_params.h"
|
||||||
|
#include "content/public/browser/desktop_media_id.h"
|
||||||
|
#include "content/public/browser/desktop_streams_registry.h"
|
||||||
#include "content/public/browser/download_request_utils.h"
|
#include "content/public/browser/download_request_utils.h"
|
||||||
#include "content/public/browser/favicon_status.h"
|
#include "content/public/browser/favicon_status.h"
|
||||||
#include "content/public/browser/file_select_listener.h"
|
#include "content/public/browser/file_select_listener.h"
|
||||||
|
@ -2198,6 +2200,33 @@ void WebContents::SetWebRTCIPHandlingPolicy(
|
||||||
web_contents()->SyncRendererPrefs();
|
web_contents()->SyncRendererPrefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string WebContents::GetMediaSourceID(
|
||||||
|
content::WebContents* request_web_contents) {
|
||||||
|
auto* frame_host = web_contents()->GetMainFrame();
|
||||||
|
if (!frame_host)
|
||||||
|
return std::string();
|
||||||
|
|
||||||
|
content::DesktopMediaID media_id(
|
||||||
|
content::DesktopMediaID::TYPE_WEB_CONTENTS,
|
||||||
|
content::DesktopMediaID::kNullId,
|
||||||
|
content::WebContentsMediaCaptureId(frame_host->GetProcess()->GetID(),
|
||||||
|
frame_host->GetRoutingID()));
|
||||||
|
|
||||||
|
auto* request_frame_host = request_web_contents->GetMainFrame();
|
||||||
|
if (!request_frame_host)
|
||||||
|
return std::string();
|
||||||
|
|
||||||
|
std::string id =
|
||||||
|
content::DesktopStreamsRegistry::GetInstance()->RegisterStream(
|
||||||
|
request_frame_host->GetProcess()->GetID(),
|
||||||
|
request_frame_host->GetRoutingID(),
|
||||||
|
url::Origin::Create(
|
||||||
|
request_frame_host->GetLastCommittedURL().GetOrigin()),
|
||||||
|
media_id, "", content::kRegistryStreamTypeTab);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
bool WebContents::IsCrashed() const {
|
bool WebContents::IsCrashed() const {
|
||||||
return web_contents()->IsCrashed();
|
return web_contents()->IsCrashed();
|
||||||
}
|
}
|
||||||
|
@ -3875,6 +3904,7 @@ v8::Local<v8::ObjectTemplate> WebContents::FillObjectTemplate(
|
||||||
.SetMethod("isBeingCaptured", &WebContents::IsBeingCaptured)
|
.SetMethod("isBeingCaptured", &WebContents::IsBeingCaptured)
|
||||||
.SetMethod("setWebRTCIPHandlingPolicy",
|
.SetMethod("setWebRTCIPHandlingPolicy",
|
||||||
&WebContents::SetWebRTCIPHandlingPolicy)
|
&WebContents::SetWebRTCIPHandlingPolicy)
|
||||||
|
.SetMethod("getMediaSourceId", &WebContents::GetMediaSourceID)
|
||||||
.SetMethod("getWebRTCIPHandlingPolicy",
|
.SetMethod("getWebRTCIPHandlingPolicy",
|
||||||
&WebContents::GetWebRTCIPHandlingPolicy)
|
&WebContents::GetWebRTCIPHandlingPolicy)
|
||||||
.SetMethod("takeHeapSnapshot", &WebContents::TakeHeapSnapshot)
|
.SetMethod("takeHeapSnapshot", &WebContents::TakeHeapSnapshot)
|
||||||
|
|
|
@ -185,6 +185,7 @@ class WebContents : public gin::Wrappable<WebContents>,
|
||||||
int GetHistoryLength() const;
|
int GetHistoryLength() const;
|
||||||
const std::string GetWebRTCIPHandlingPolicy() const;
|
const std::string GetWebRTCIPHandlingPolicy() const;
|
||||||
void SetWebRTCIPHandlingPolicy(const std::string& webrtc_ip_handling_policy);
|
void SetWebRTCIPHandlingPolicy(const std::string& webrtc_ip_handling_policy);
|
||||||
|
std::string GetMediaSourceID(content::WebContents* request_web_contents);
|
||||||
bool IsCrashed() const;
|
bool IsCrashed() const;
|
||||||
void ForcefullyCrashRenderer();
|
void ForcefullyCrashRenderer();
|
||||||
void SetUserAgent(const std::string& user_agent);
|
void SetUserAgent(const std::string& user_agent);
|
||||||
|
|
|
@ -838,6 +838,14 @@ describe('webContents module', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getMediaSourceId()', () => {
|
||||||
|
afterEach(closeAllWindows);
|
||||||
|
it('returns a valid stream id', () => {
|
||||||
|
const w = new BrowserWindow({ show: false });
|
||||||
|
expect(w.webContents.getMediaSourceId(w.webContents)).to.be.a('string').that.is.not.empty();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('userAgent APIs', () => {
|
describe('userAgent APIs', () => {
|
||||||
it('can set the user agent (functions)', () => {
|
it('can set the user agent (functions)', () => {
|
||||||
const w = new BrowserWindow({ show: false });
|
const w = new BrowserWindow({ show: false });
|
||||||
|
|
Loading…
Reference in a new issue