diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 548ea394436b4..9e613f4bb692b 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1434,6 +1434,10 @@ bool WebContents::IsAudioMuted() { return web_contents()->IsAudioMuted(); } +bool WebContents::IsCurrentlyAudible() { + return web_contents()->IsCurrentlyAudible(); +} + void WebContents::Print(mate::Arguments* args) { PrintSettings settings = {false, false, base::string16()}; if (args->Length() >= 1 && !args->GetNext(&settings)) { @@ -2018,6 +2022,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("setIgnoreMenuShortcuts", &WebContents::SetIgnoreMenuShortcuts) .SetMethod("setAudioMuted", &WebContents::SetAudioMuted) .SetMethod("isAudioMuted", &WebContents::IsAudioMuted) + .SetMethod("isCurrentlyAudible", &WebContents::IsCurrentlyAudible) .SetMethod("undo", &WebContents::Undo) .SetMethod("redo", &WebContents::Redo) .SetMethod("cut", &WebContents::Cut) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 2155656ccbdcc..1e3c7a927adb9 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -143,6 +143,7 @@ class WebContents : public mate::TrackableObject, void SetIgnoreMenuShortcuts(bool ignore); void SetAudioMuted(bool muted); bool IsAudioMuted(); + bool IsCurrentlyAudible(); void Print(mate::Arguments* args); std::vector GetPrinterList(); void SetEmbedder(const WebContents* embedder); diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index efba30d5be16f..0740e7df6dcae 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -832,6 +832,10 @@ Mute the audio on the current web page. Returns `Boolean` - Whether this page has been muted. +#### `contents.isCurrentlyAudible()` + +Returns `Boolean` - Whether audio is currently playing. + #### `contents.setZoomFactor(factor)` * `factor` Number - Zoom factor. diff --git a/docs/api/webview-tag.md b/docs/api/webview-tag.md index 25edb6052f752..116e5a42fb3bd 100644 --- a/docs/api/webview-tag.md +++ b/docs/api/webview-tag.md @@ -450,6 +450,10 @@ Set guest page muted. Returns `Boolean` - Whether guest page has been muted. +#### `.isCurrentlyAudible()` + +Returns `Boolean` - Whether audio is currently playing. + ### `.undo()` Executes editing command `undo` in page. diff --git a/lib/renderer/web-view/web-view.js b/lib/renderer/web-view/web-view.js index 590991177595e..8cebdf156d92e 100644 --- a/lib/renderer/web-view/web-view.js +++ b/lib/renderer/web-view/web-view.js @@ -347,6 +347,7 @@ const registerWebViewElement = function () { 'inspectElement', 'setAudioMuted', 'isAudioMuted', + 'isCurrentlyAudible', 'undo', 'redo', 'cut', diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index b1b1d206a2934..2dc786753cf3c 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -4,12 +4,18 @@ const assert = require('assert') const http = require('http') const path = require('path') const {closeWindow} = require('./window-helpers') +const {emittedOnce} = require('./events-helpers') +const chai = require('chai') +const dirtyChai = require('dirty-chai') const {ipcRenderer, remote} = require('electron') const {BrowserWindow, webContents, ipcMain, session} = remote +const {expect} = chai const isCi = remote.getGlobal('isCi') +chai.use(dirtyChai) + /* The whole webContents API doesn't use standard callbacks */ /* eslint-disable standard/no-callback-literal */ @@ -116,6 +122,21 @@ describe('webContents module', () => { }) }) + describe('isCurrentlyAudible() API', () => { + it('returns whether audio is playing', async () => { + w.loadURL(`file://${path.join(__dirname, 'fixtures', 'api', 'is-currently-audible.html')}`) + w.show() + await emittedOnce(w.webContents, 'did-finish-load') + + expect(w.webContents.isCurrentlyAudible()).to.be.false() + + w.webContents.send('play') + await emittedOnce(ipcMain, 'playing') + + expect(w.webContents.isCurrentlyAudible()).to.be.true() + }) + }) + describe('getWebPreferences() API', () => { it('should not crash when called for devTools webContents', (done) => { w.webContents.openDevTools() diff --git a/spec/fixtures/api/is-currently-audible.html b/spec/fixtures/api/is-currently-audible.html new file mode 100644 index 0000000000000..a2fbe31d3a1ef --- /dev/null +++ b/spec/fixtures/api/is-currently-audible.html @@ -0,0 +1,21 @@ + + +
+ + + \ No newline at end of file