📄 jsbridge.js
字号:
const JSBRIDGE_CONTRACTID = "@participatoryculture.org/dtv/jsbridge;1";
const JSBRIDGE_CLASSID = Components.ID("{421AA951-F53D-4499-B362-E432CAE920F4}");
var pybridge = Components.classes["@participatoryculture.org/dtv/pybridge;1"].
getService(Components.interfaces.pcfIDTVPyBridge);
function writelog(str) {
Components.classes['@mozilla.org/consoleservice;1']
.getService(Components.interfaces.nsIConsoleService)
.logStringMessage(str);
}
function twoDigits(data) {
if (data < 10) return "0" + data;
else return ""+data;
}
function LoadFinishedListener(area)
{
this.area = area;
}
var actionGroupCommands = {
'ChannelSelected': Array('copychannellink', 'recommendcurrentchannel'),
'ChannelFolderSelected': Array(),
'VideoSelected': Array('copyvideourl', 'savevideoas'),
'VideosSelected': Array('removevideo'),
'PlaylistLikeSelected': Array('renameplaylist'),
'PlaylistLikesSelected': Array('removeplaylist'),
'ChannelLikesSelected': Array(),
'ChannelLikeSelected': Array('renamechannel', 'removechannel', 'updatechannel'),
'ChannelsSelected': Array(),
'VideoPlayable': Array(),
}
LoadFinishedListener.prototype =
{
QueryInterface : function(aIID)
{
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
{
return this;
}
throw Components.results.NS_NOINTERFACE;
},
onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus)
{
var allFlags = (Components.interfaces.nsIWebProgressListener.STATE_STOP |
Components.interfaces.nsIWebProgressListener.STATE_IS_WINDOW);
if((aStateFlags & allFlags) == allFlags) {
pybridge.pageLoadFinished(this.area, aRequest.name);
}
},
onProgressChange : function(aWebProgress, aRequest, aCurSelfProgress,
aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) { },
onLocationChange : function(aWebProgress, aRequest, aLocation) { },
onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage) { },
onSecurityChange : function(aWebProgress, aRequest, aState) { }
}
// Reference to the progress listeners we create, addProgressListener uses a
// weak reference, so we need to keep a real reference around or else they
// will magically disapear
var progressListeners = {}
function jsBridge() { }
jsBridge.prototype = {
QueryInterface: function(iid) {
if (iid.equals(Components.interfaces.pcfIDTVJSBridge) ||
iid.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
},
init: function(window) {
this.window = window;
this.document = window.document;
this.initBrowser("mainDisplay");
this.initBrowser("videoInfoDisplay");
this.initBrowser("channelsDisplay");
this.hideVideoControlsTimer = Components.classes["@mozilla.org/timer;1"].
createInstance(Components.interfaces.nsITimer);
this.videoFilename = null;
this.searchEngineTitles = this.searchEngineNames = null;
var self = this;
self.lastMouseDownX = self.lastMouseDownY = 0;
var saveMousedownPosition = function(event) {
self.lastMouseDownX = event.screenX;
self.lastMouseDownY = event.screenY;
}
this.document.addEventListener('mousedown', saveMousedownPosition, true);
},
closeWindow: function() {
this.window.close();
},
initBrowser: function(area) {
var browser = this.document.getElementById(area);
var listener = new LoadFinishedListener(area);
browser.addProgressListener(listener);
progressListeners[area] = listener;
},
copyTextToClipboard: function(text) {
var gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
gClipboardHelper.copyString(text);
},
showContextMenu: function(menuItems) {
var popup = this.document.getElementById('contextPopup');
while (popup.firstChild) {
popup.removeChild(popup.firstChild);
}
menu = menuItems.split("\n");
for(var i = 0; i < menu.length; i++) {
if(menu[i]) {
var newItem = this.document.createElement('menuitem');
if(menu[i].charAt(0) != '_') {
newItem.setAttribute("label", menu[i]);
} else {
newItem.setAttribute("label", menu[i].substr(1));
newItem.setAttribute("disabled", "true");
}
newItem.setAttribute("oncommand",
"pybridge.handleContextMenu(" + i + ");");
} else {
var newItem = this.document.createElement('menuseparator');
}
popup.appendChild(newItem);
}
popup.showPopup(this.document.documentElement, this.lastMouseDownX,
this.lastMouseDownY, "popup", null, null);
},
showSearchMenu: function() {
if(!this.searchEngineNames || !this.searchEngineTitles) return;
var popup = this.document.getElementById('searchMenu');
while (popup.firstChild) {
popup.removeChild(popup.firstChild);
}
for (var i = 0; i < this.searchEngineNames.length; i++) {
var newItem = this.document.createElement('menuitem');
newItem.setAttribute("label", this.searchEngineTitles[i]);
newItem.setAttribute("image", "chrome://dtv/content/images/search_icon_" + this.searchEngineNames[i] + ".png");
newItem.setAttribute("class", "menuitem-iconic");
newItem.setAttribute("oncommand",
"jsbridge.setSearchEngine('" + this.searchEngineNames[i] + "');");
popup.appendChild(newItem);
}
var textbox = this.document.getElementById('search-textbox');
popup.showPopup(textbox, -1, -1, "popup", "bottomleft", "topleft");
},
showChoiceDialog: function(id, title, description, defaultLabel, otherLabel) {
var params = { "id": id, "title": title, "description" : description,
"defaultLabel": defaultLabel, "otherLabel": otherLabel, "out" : -1};
this.window.openDialog("chrome://dtv/content/choice_dialog.xul",
"dialog", "chrome,dependent,centerscreen,modal", params);
},
showThreeChoiceDialog: function(id, title, description, defaultLabel,
secondLabel, thirdLabel) {
var params = { "id": id, "title": title, "description" : description,
"defaultLabel": defaultLabel, "secondLabel": secondLabel,
"thirdLabel": thirdLabel, "out" : -1};
this.window.openDialog("chrome://dtv/content/three_choice_dialog.xul",
"dialog", "chrome,dependent,centerscreen,modal", params);
},
showMessageBoxDialog: function(id, title, description) {
var params = { "id": id, "title": title, "description" : description,
"out" : -1};
this.window.openDialog("chrome://dtv/content/message_box_dialog.xul",
"dialog", "chrome,dependent,centerscreen,modal", params);
},
showHTTPAuthDialog: function(id, description, prefillUser, prefillPassword) {
var params = {"id": id, "text" : description, "prefillUser": prefillUser,
"prefillPassword": prefillPassword, "out" : null};
this.window.openDialog("chrome://dtv/content/password.xul",
"dialog", "chrome,dependent,centerscreen,modal", params);
},
showBugReportDialog: function(when, report) {
var params = {"when" : when, "report": report};
this.window.openDialog("chrome://dtv/content/bugreport.xul",
"choice", "chrome,dependent,centerscreen,modal", params);
},
showTextEntryDialog: function(id, title, description, defaultLabel,
otherLabel, prefillText) {
var params = { "id": id, "title": title, "description" : description,
"defaultLabel": defaultLabel, "otherLabel": otherLabel,
"prefillText": prefillText, "out" : -1};
this.window.openDialog("chrome://dtv/content/text_entry_dialog.xul",
"dialog", "chrome,dependent,centerscreen,modal", params);
},
showSearchChannelDialog: function(id, channels, engines, defaultTerm, defaultStyle, defaultChannel, defaultEngine, defaultURL) {
var params = { "id": id, "channels" : channels, "engines" : engines,
"defaultTerm": defaultTerm, "defaultStyle": defaultStyle,
"defaultChannel": defaultChannel, "defaultEngine": defaultEngine,
"defaultURL": defaultURL, "Out" : -1};
this.window.openDialog("chrome://dtv/content/searchchannel.xul",
"dialog", "chrome,dependent,centerscreen,modal", params);
},
setCollapsed: function(id, value) {
var elt = this.document.getElementById(id);
elt.setAttribute("collapsed", value);
},
setActive: function(id, active) {
var elt = this.document.getElementById(id);
if(active) elt.className = id;
else elt.className = id + "-inactive";
},
showVideoDisplay: function() {
this.setCollapsed("video-box", "false");
this.setCollapsed("mainDisplay", "true");
this.setActive("bottom-buttons-previous", true);
this.setActive("bottom-buttons-stop", true);
this.setActive("bottom-buttons-play", true);
this.setActive("bottom-buttons-fullscreen", true);
this.setActive("bottom-buttons-next", true);
this.setActive("progress-slider", true);
},
hideVideoDisplay: function() {
this.setCollapsed("video-box", "true");
this.setCollapsed("mainDisplay", "false");
this.setActive("bottom-buttons-previous", false);
this.setActive("bottom-buttons-stop", false);
this.setActive("bottom-buttons-play", false);
this.setActive("bottom-buttons-fullscreen", false);
this.setActive("bottom-buttons-next", false);
this.setActive("progress-slider", false);
},
positionVolumeSlider: function(volume) {
var left = 25;
var right= 98;
var position = left + (right-left) * volume;
position = Math.min(right, Math.max(left, position));
this.document.getElementById("knob").left = position;
},
hideForFullscreen: Array('channelsDisplay', 'mainSplitter',
'resizer-left', 'bottom-left', 'resizer-bottom-right'),
showForFullscreen: Array('bottom-left-blank', 'bottom-right-blank'),
toggleFullscreen: function() {
if(this.window.fullScreen) this.leaveFullscreen();
else this.enterFullscreen();
},
enterFullscreen: function() {
if(this.window.fullScreen) return;
this.window.fullScreen = true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -