chore: refactor webContents module isCurrentlyAudible api spec (#14410)

This commit is contained in:
Robo 2018-09-06 02:30:05 +05:30 committed by Charles Kerr
parent 4d23e200f0
commit 8441d09a18
4 changed files with 25 additions and 33 deletions

View file

@ -754,6 +754,11 @@ content::JavaScriptDialogManager* WebContents::GetJavaScriptDialogManager(
return dialog_manager_.get();
}
void WebContents::OnAudioStateChanged(content::WebContents* web_contents,
bool audible) {
Emit("-audio-state-changed", audible);
}
void WebContents::BeforeUnloadFired(const base::TimeTicks& proceed_time) {
// Do nothing, we override this method just to avoid compilation error since
// there are two virtual functions named BeforeUnloadFired.

View file

@ -345,6 +345,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
const content::BluetoothChooser::EventHandler& handler) override;
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
content::WebContents* source) override;
void OnAudioStateChanged(content::WebContents* web_contents,
bool audible) override;
// content::WebContentsObserver:
void BeforeUnloadFired(const base::TimeTicks& proceed_time) override;

View file

@ -122,19 +122,25 @@ describe('webContents module', () => {
})
})
// Disabled because flaky. See #13969
xdescribe('isCurrentlyAudible() API', () => {
describe('isCurrentlyAudible() API', () => {
it('returns whether audio is playing', async () => {
w.loadFile(path.join(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()
const webContents = remote.getCurrentWebContents()
const context = new window.AudioContext()
// Start in suspended state, because of the
// new web audio api policy.
context.suspend()
const oscillator = context.createOscillator()
oscillator.connect(context.destination)
oscillator.start()
await context.resume()
const [, audible] = await emittedOnce(webContents, '-audio-state-changed')
assert(webContents.isCurrentlyAudible() === audible)
expect(webContents.isCurrentlyAudible()).to.be.true()
oscillator.stop()
await emittedOnce(webContents, '-audio-state-changed')
expect(webContents.isCurrentlyAudible()).to.be.false()
oscillator.disconnect()
context.close()
})
})

View file

@ -1,21 +0,0 @@
<html>
<body>
<div id="video"></div>
<script type="text/javascript" charset="utf-8">
const {ipcRenderer} = window.top != null ? window.top.require('electron') : require('electron')
ipcRenderer.on('play', (event) => {
const context = new window.AudioContext();
const oscillator = context.createOscillator();
// A beep
oscillator.type = 'sine';
oscillator.frequency.value = 440
oscillator.connect(context.destination)
oscillator.start()
// It'll take a few ms before the beep shows up
setTimeout(() => event.sender.send('playing'), 100)
})
</script>
</body>
</html>