Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview | 6 * @fileoverview |
| 7 * Class handling creation and teardown of a remoting client session. | 7 * Class handling creation and teardown of a remoting client session. |
| 8 * | 8 * |
| 9 * The ClientSession class controls lifetime of the client plugin | 9 * The ClientSession class controls lifetime of the client plugin |
| 10 * object and provides the plugin with the functionality it needs to | 10 * object and provides the plugin with the functionality it needs to |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 | 160 |
| 161 if (this.mode_ == remoting.ClientSession.Mode.IT2ME) { | 161 if (this.mode_ == remoting.ClientSession.Mode.IT2ME) { |
| 162 // Resize-to-client is not supported for IT2Me hosts. | 162 // Resize-to-client is not supported for IT2Me hosts. |
| 163 this.resizeToClientButton_.hidden = true; | 163 this.resizeToClientButton_.hidden = true; |
| 164 } else { | 164 } else { |
| 165 this.resizeToClientButton_.hidden = false; | 165 this.resizeToClientButton_.hidden = false; |
| 166 } | 166 } |
| 167 | 167 |
| 168 this.fullScreenButton_.addEventListener( | 168 this.fullScreenButton_.addEventListener( |
| 169 'click', this.callToggleFullScreen_, false); | 169 'click', this.callToggleFullScreen_, false); |
| 170 | |
| 171 this.isVideoRecording_ = false; | |
| 172 this.videoRecordingFileWriter_ = null; | |
|
Jamie
2014/08/01 01:28:36
Have you run this through jscompile? I'm surprised
Wez
2014/08/19 00:15:52
I am doing now, yes; compile fails because of pre-
| |
| 173 var toggleRecordingButton = document.getElementById('start-stop-recording'); | |
| 174 toggleRecordingButton.addEventListener( | |
| 175 'click', this.startStopRecording_.bind(this), false); | |
| 176 var toggleRecordingMenu = document.querySelector('.menu-start-stop-recording') ; | |
|
Jamie
2014/08/01 01:28:36
You're using a mix of getElementById and querySele
Jamie
2014/08/01 01:28:37
Nit: line-length.
Wez
2014/08/19 00:15:53
I just cribbed from the relevant toolbar and menu
| |
| 177 toggleRecordingMenu.addEventListener( | |
| 178 'click', this.startStopRecording_.bind(this), false); | |
| 179 | |
| 180 console.log("WIBBLE"); | |
|
Jamie
2014/08/01 01:28:37
I think we can probably live without this line :)
Wez
2014/08/19 00:15:53
Done.
| |
| 181 | |
| 170 this.defineEvents(Object.keys(remoting.ClientSession.Events)); | 182 this.defineEvents(Object.keys(remoting.ClientSession.Events)); |
| 171 }; | 183 }; |
| 172 | 184 |
| 173 base.extend(remoting.ClientSession, base.EventSource); | 185 base.extend(remoting.ClientSession, base.EventSource); |
| 174 | 186 |
| 175 /** @enum {string} */ | 187 /** @enum {string} */ |
| 176 remoting.ClientSession.Events = { | 188 remoting.ClientSession.Events = { |
| 177 stateChanged: 'stateChanged', | 189 stateChanged: 'stateChanged', |
| 178 videoChannelStateChanged: 'videoChannelStateChanged' | 190 videoChannelStateChanged: 'videoChannelStateChanged' |
| 179 }; | 191 }; |
| (...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1063 } | 1075 } |
| 1064 | 1076 |
| 1065 this.capabilities_ = capabilities; | 1077 this.capabilities_ = capabilities; |
| 1066 if (this.hasCapability_( | 1078 if (this.hasCapability_( |
| 1067 remoting.ClientSession.Capability.SEND_INITIAL_RESOLUTION)) { | 1079 remoting.ClientSession.Capability.SEND_INITIAL_RESOLUTION)) { |
| 1068 var clientArea = this.getClientArea_(); | 1080 var clientArea = this.getClientArea_(); |
| 1069 this.plugin_.notifyClientResolution(clientArea.width, | 1081 this.plugin_.notifyClientResolution(clientArea.width, |
| 1070 clientArea.height, | 1082 clientArea.height, |
| 1071 window.devicePixelRatio); | 1083 window.devicePixelRatio); |
| 1072 } | 1084 } |
| 1085 if (this.hasCapability_( | |
| 1086 remoting.ClientSession.Capability.VIDEO_RECORDER)) { | |
|
Jamie
2014/08/01 01:28:37
There are a couple of ways of handling this withou
Wez
2014/08/19 00:15:53
OptionsMenu now sets this based on ClientSession.c
| |
| 1087 var recordingButton = document.getElementById('start-stop-recording'); | |
| 1088 recordingButton.hidden = false; | |
| 1089 var recordingMenu = document.querySelector('.menu-start-stop-recording'); | |
| 1090 recordingMenu.hidden = false; | |
| 1091 } | |
| 1073 }; | 1092 }; |
| 1074 | 1093 |
| 1075 /** | 1094 /** |
| 1076 * @private | 1095 * @private |
| 1077 * @param {remoting.ClientSession.State} newState The new state for the session. | 1096 * @param {remoting.ClientSession.State} newState The new state for the session. |
| 1078 * @return {void} Nothing. | 1097 * @return {void} Nothing. |
| 1079 */ | 1098 */ |
| 1080 remoting.ClientSession.prototype.setState_ = function(newState) { | 1099 remoting.ClientSession.prototype.setState_ = function(newState) { |
| 1081 var oldState = this.state_; | 1100 var oldState = this.state_; |
| 1082 this.state_ = newState; | 1101 this.state_ = newState; |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1544 * @param {number} hotspotY | 1563 * @param {number} hotspotY |
| 1545 */ | 1564 */ |
| 1546 remoting.ClientSession.prototype.updateMouseCursorImage_ = | 1565 remoting.ClientSession.prototype.updateMouseCursorImage_ = |
| 1547 function(url, hotspotX, hotspotY) { | 1566 function(url, hotspotX, hotspotY) { |
| 1548 this.mouseCursorOverlay_.hidden = !url; | 1567 this.mouseCursorOverlay_.hidden = !url; |
| 1549 if (url) { | 1568 if (url) { |
| 1550 this.mouseCursorOverlay_.style.marginLeft = '-' + hotspotX + 'px'; | 1569 this.mouseCursorOverlay_.style.marginLeft = '-' + hotspotX + 'px'; |
| 1551 this.mouseCursorOverlay_.style.marginTop = '-' + hotspotY + 'px'; | 1570 this.mouseCursorOverlay_.style.marginTop = '-' + hotspotY + 'px'; |
| 1552 this.mouseCursorOverlay_.src = url; | 1571 this.mouseCursorOverlay_.src = url; |
| 1553 } | 1572 } |
| 1554 }; | 1573 }; |
| 1574 | |
| 1575 remoting.ClientSession.prototype.startStopRecording_ = function() { | |
|
Jamie
2014/08/01 01:28:36
I think there is enough code here that it's worth
Wez
2014/08/19 00:15:52
Agreed; already done.
| |
| 1576 var data = {}; | |
| 1577 if (this.isVideoRecording_) { | |
| 1578 data = { type: 'stop' } | |
| 1579 this.isVideoRecording_ = false; | |
| 1580 | |
| 1581 console.log("CLICKY!"); | |
|
Jamie
2014/08/01 01:28:36
I don't think so...
Wez
2014/08/19 00:15:53
Totally.
| |
| 1582 | |
| 1583 chrome.fileSystem.chooseEntry( | |
| 1584 {type: 'saveFile', suggestedName: "videoRecording.pb"}, | |
| 1585 this.onVideoRecordingFileChosen_.bind(this)); | |
| 1586 } else { | |
| 1587 data = { type: 'start' } | |
| 1588 this.isVideoRecording_ = true; | |
| 1589 } | |
| 1590 this.plugin_.sendClientMessage('video-recorder', JSON.stringify(data)); | |
| 1591 } | |
| 1592 | |
| 1593 remoting.ClientSession.prototype.onVideoRecordingFileChosen_ = function(entry) { | |
| 1594 if (!entry) { | |
| 1595 console.log("Cancelled save of video frames."); | |
| 1596 } else { | |
| 1597 chrome.fileSystem.getDisplayPath(entry, function(path) { | |
| 1598 console.log("Saving video frames to:" + path); | |
| 1599 }); | |
| 1600 entry.createWriter(this.onVideoRecordingFileWriter_.bind(this)); | |
| 1601 } | |
| 1602 } | |
| 1603 | |
| 1604 remoting.ClientSession.prototype.onVideoRecordingFileWriter_ = | |
| 1605 function(writer) { | |
| 1606 console.log("Obtained FileWriter for video frame write"); | |
| 1607 writer.onwriteend = this.onVideoRecordingWriteComplete_.bind(this); | |
| 1608 this.videoRecordingFileWriter_ = writer; | |
| 1609 this.fetchNextVideoRecordingFrame_(); | |
| 1610 } | |
| 1611 | |
| 1612 remoting.ClientSession.prototype.onVideoRecordingWriteComplete_ = function(e) { | |
| 1613 console.log("Video frame write complete"); | |
| 1614 this.fetchNextVideoRecordingFrame_(); | |
| 1615 } | |
| 1616 | |
| 1617 remoting.ClientSession.prototype.fetchNextVideoRecordingFrame_ = function() { | |
| 1618 console.log("Request next video frame"); | |
| 1619 var data = { type: 'next-frame' } | |
| 1620 this.plugin_.sendClientMessage('video-recorder', JSON.stringify(data)); | |
| 1621 } | |
| 1622 | |
| 1623 remoting.ClientSession.prototype.handleVideoRecorderMessage = | |
| 1624 function(type, data) { | |
| 1625 if (type != 'video-recorder') { | |
| 1626 return false; | |
| 1627 } | |
| 1628 | |
| 1629 var message = getJsonObjectFromString(data); | |
| 1630 | |
| 1631 if (message.type == 'next-frame-reply') { | |
| 1632 if (!this.videoRecordingFileWriter_) { | |
| 1633 console.log("Received frame but have no writer"); | |
| 1634 return true; | |
| 1635 } | |
| 1636 if (!message.data) { | |
| 1637 console.log("Finished receiving frames"); | |
| 1638 this.videoRecordingFileWriter_ = null; | |
| 1639 return true; | |
| 1640 } | |
| 1641 | |
| 1642 console.log("Received frame"); | |
| 1643 var videoPacketString = atob(message.data); | |
|
Wez
2014/08/19 00:15:52
This line angers jscompile, but there's no obvious
Jamie
2014/08/19 00:48:56
I would add it to dom_proto.js. It's not DOM-relat
Wez
2014/08/19 21:19:00
Done.
| |
| 1644 | |
| 1645 console.log("Converted from Base64 - length:" + videoPacketString.length); | |
| 1646 var byteArrays = []; | |
| 1647 | |
| 1648 for (var offset = 0; offset < videoPacketString.length; offset += 512) { | |
| 1649 var slice = videoPacketString.slice(offset, offset + 512); | |
| 1650 var byteNumbers = new Array(slice.length); | |
| 1651 for (var i = 0; i < slice.length; i++) { | |
| 1652 byteNumbers[i] = slice.charCodeAt(i); | |
| 1653 } | |
| 1654 var byteArray = new Uint8Array(byteNumbers); | |
| 1655 byteArrays.push(byteArray); | |
| 1656 } | |
| 1657 | |
| 1658 console.log("Writing frame"); | |
| 1659 videoPacketString = null; | |
| 1660 var videoPacketBlob = new Blob(byteArrays); | |
| 1661 byteArrays = null; | |
| 1662 | |
| 1663 this.videoRecordingFileWriter_.write(videoPacketBlob); | |
| 1664 | |
| 1665 return true; | |
| 1666 } | |
| 1667 | |
| 1668 console.log("Unrecognized message: " + message.type); | |
| 1669 return true; | |
| 1670 } | |
| OLD | NEW |