mirror of
https://github.com/fergalmoran/chrometophone.git
synced 2025-12-22 09:41:51 +00:00
This commit is contained in:
24
third_party/firefox_sendtophone/chrome.manifest
vendored
24
third_party/firefox_sendtophone/chrome.manifest
vendored
@@ -1,24 +0,0 @@
|
|||||||
content sendtophone chrome/content/
|
|
||||||
skin sendtophone classic/1.0 chrome/skin/
|
|
||||||
resource sendtophone modules/
|
|
||||||
|
|
||||||
locale sendtophone cs chrome/locale/cs/
|
|
||||||
locale sendtophone de chrome/locale/de/
|
|
||||||
locale sendtophone en-US chrome/locale/en-US/
|
|
||||||
locale sendtophone es chrome/locale/es/
|
|
||||||
locale sendtophone fr chrome/locale/fr/
|
|
||||||
locale sendtophone ga-IE chrome/locale/ga-IE/
|
|
||||||
locale sendtophone hi-IN chrome/locale/hi-IN/
|
|
||||||
locale sendtophone hu chrome/locale/hu/
|
|
||||||
locale sendtophone it chrome/locale/it/
|
|
||||||
locale sendtophone ja-JP chrome/locale/ja-JP/
|
|
||||||
locale sendtophone nl chrome/locale/nl/
|
|
||||||
locale sendtophone pt-BR chrome/locale/pt-BR/
|
|
||||||
locale sendtophone ru chrome/locale/ru/
|
|
||||||
locale sendtophone sr chrome/locale/sr/
|
|
||||||
locale sendtophone sv chrome/locale/sv/
|
|
||||||
locale sendtophone zh-CN chrome/locale/zh-CN/
|
|
||||||
|
|
||||||
overlay chrome://browser/content/browser.xul chrome://sendtophone/content/ff-overlay.xul
|
|
||||||
style chrome://global/content/customizeToolbar.xul chrome://sendtophone/skin/overlay.css
|
|
||||||
|
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2010 Alfonso Martínez de Lizarrondo & Patrick O'Reilly
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
sendtophone.init = function()
|
|
||||||
{
|
|
||||||
// Try to install the toolbar button, but only once
|
|
||||||
if (!this.prefs.getBoolPref("installedButton"))
|
|
||||||
{
|
|
||||||
this.installToolbarButton();
|
|
||||||
this.prefs.setBoolPref( "installedButton", true ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementById("contentAreaContextMenu").
|
|
||||||
addEventListener("popupshowing", function (e){ sendtophone.showFirefoxContextMenu(e); }, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
sendtophone.installToolbarButton = function()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
var firefoxnav = document.getElementById("nav-bar");
|
|
||||||
var curSet = firefoxnav.currentSet;
|
|
||||||
if (curSet.indexOf("sendtophone-toolbar-button") == -1)
|
|
||||||
{
|
|
||||||
var set;
|
|
||||||
// Place the button before the urlbar
|
|
||||||
if (curSet.indexOf("urlbar-container") != -1)
|
|
||||||
set = curSet.replace(/urlbar-container/, "urlbar-container,sendtophone-toolbar-button");
|
|
||||||
else // at the end
|
|
||||||
set = curSet + ",sendtophone-toolbar-button";
|
|
||||||
firefoxnav.setAttribute("currentset", set);
|
|
||||||
firefoxnav.currentSet = set;
|
|
||||||
document.persist("nav-bar", "currentset");
|
|
||||||
// If you don't do the following call, funny things happen
|
|
||||||
try {
|
|
||||||
BrowserToolboxCustomizeDone(true);
|
|
||||||
}
|
|
||||||
catch (e) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(e) { }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Toggle Protocol Prefrences onFlyout Menu Click
|
|
||||||
sendtophone.onToggleOption = function(menuitem)
|
|
||||||
{
|
|
||||||
var option = menuitem.getAttribute("option");
|
|
||||||
var checked = menuitem.getAttribute("checked") == "true";
|
|
||||||
this.prefs.setBoolPref("protocols."+option, checked );
|
|
||||||
if (!option.indexOf("sms"))
|
|
||||||
this.prefs.setBoolPref("protocols."+option+"to", checked );
|
|
||||||
}
|
|
||||||
|
|
||||||
//Set MenuItem as checked based on preferences.
|
|
||||||
sendtophone.onOptionsShowing= function(popup)
|
|
||||||
{
|
|
||||||
for (var child = popup.firstChild; child; child = child.nextSibling)
|
|
||||||
{
|
|
||||||
if (child.localName == "menuitem")
|
|
||||||
{
|
|
||||||
var option = child.getAttribute("option");
|
|
||||||
if (option)
|
|
||||||
{
|
|
||||||
var checked = this.prefs.getBoolPref("protocols."+option);
|
|
||||||
child.setAttribute("checked", checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sendtophone.showFirefoxContextMenu = function(event) {
|
|
||||||
// show or hide the menuitem based on what the context menu is on
|
|
||||||
// see http://kb.mozillazine.org/Adding_items_to_menus
|
|
||||||
var mediaURL = gContextMenu.mediaURL;
|
|
||||||
|
|
||||||
gContextMenu.showItem("context-sendtophone-link", gContextMenu.onLink);
|
|
||||||
gContextMenu.showItem("context-sendtophone-image", false);
|
|
||||||
gContextMenu.showItem("context-sendtophone-qrimage", false);
|
|
||||||
gContextMenu.showItem("context-sendtophone-video", false);
|
|
||||||
if (gContextMenu.onImage)
|
|
||||||
{
|
|
||||||
var data = this.detectQR( mediaURL );
|
|
||||||
if (data)
|
|
||||||
{
|
|
||||||
gContextMenu.showItem("context-sendtophone-qrimage", true);
|
|
||||||
var label = this.getString("qrContextMenu");
|
|
||||||
label = label.replace("%s", data.substring(0, 20) + "..." );
|
|
||||||
document.getElementById("context-sendtophone-qrimage").setAttribute("label", label);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
gContextMenu.showItem("context-sendtophone-image", true);
|
|
||||||
}
|
|
||||||
/* TBC
|
|
||||||
if(mediaURL.match(/.webm$/i)){
|
|
||||||
gContextMenu.showItem("context-sendtophone-video", true);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
gContextMenu.showItem("context-sendtophone-text", gContextMenu.isTextSelected ||
|
|
||||||
(gContextMenu.onTextInput && gContextMenu.target.selectionEnd > gContextMenu.target.selectionStart) );
|
|
||||||
|
|
||||||
gContextMenu.showItem("context-sendtophone-page", !( gContextMenu.inDirList || gContextMenu.isContentSelected || gContextMenu.onTextInput || gContextMenu.onLink || gContextMenu.onImage ));
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// https://developer.mozilla.org/En/DragDrop/Drag_and_Drop
|
|
||||||
sendtophone.checkDrag = function(event)
|
|
||||||
{
|
|
||||||
//event.dataTransfer.dropEffect = "copy";
|
|
||||||
var types = event.dataTransfer.types;
|
|
||||||
if (types.contains("text/plain") || types.contains("text/uri-list") || types.contains("text/x-moz-url"))
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
if (this.prefs.getCharPref( "fileServerUrl" ) && types.contains("application/x-moz-file") )
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
sendtophone.doDrop = function(event)
|
|
||||||
{
|
|
||||||
var dt = event.dataTransfer;
|
|
||||||
var types = dt.types;
|
|
||||||
var supportedTypes = ["application/x-moz-file", "text/x-moz-url", "text/uri-list", "text/plain"];
|
|
||||||
types = supportedTypes.filter(function (value) {return types.contains(value)});
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
switch (types[0])
|
|
||||||
{
|
|
||||||
case "text/plain":
|
|
||||||
var plainText = dt.getData(types[0]);
|
|
||||||
sendtophoneCore.send("Selection", "http://google.com", plainText);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "text/x-moz-url":
|
|
||||||
var mozUrlArray = dt.getData(types[1]).split("\n");
|
|
||||||
var mozUrl = mozUrlArray[0];
|
|
||||||
var mozTitle = mozUrlArray[1] || '';
|
|
||||||
sendtophoneCore.send(mozTitle, mozUrl, "");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "text/uri-list":
|
|
||||||
var mozUrl = dt.getData(types[0]);
|
|
||||||
sendtophoneCore.send("", mozUrl, "");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "application/x-moz-file":
|
|
||||||
for (var i = 0; i < dt.mozItemCount; i++)
|
|
||||||
{
|
|
||||||
var file = dt.mozGetDataAt("application/x-moz-file", i);
|
|
||||||
if (file instanceof Ci.nsIFile )
|
|
||||||
sendtophoneCore.sendFile(file);
|
|
||||||
else
|
|
||||||
this.alert(this.getString("InvalidFile"));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sendtophone.pickFile = function(folder)
|
|
||||||
{
|
|
||||||
var fp = Cc["@mozilla.org/filepicker;1"]
|
|
||||||
.createInstance(Ci.nsIFilePicker);
|
|
||||||
|
|
||||||
if (folder)
|
|
||||||
fp.init(window, this.getString("SendFolderToPhone"), Ci.nsIFilePicker.modeGetFolder);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fp.init(window, this.getString("SendFileToPhone"), Ci.nsIFilePicker.modeOpenMultiple);
|
|
||||||
fp.appendFilters(Ci.nsIFilePicker.filterAll | Ci.nsIFilePicker.filterImages);
|
|
||||||
}
|
|
||||||
|
|
||||||
var rv = fp.show();
|
|
||||||
|
|
||||||
if (rv == Ci.nsIFilePicker.returnOK)
|
|
||||||
{
|
|
||||||
var files = fp.files;
|
|
||||||
while (files.hasMoreElements())
|
|
||||||
{
|
|
||||||
var file = files.getNext().QueryInterface(Ci.nsILocalFile);
|
|
||||||
sendtophoneCore.sendFile( file );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<?xml-stylesheet href="chrome://sendtophone/skin/overlay.css" type="text/css"?>
|
|
||||||
<!DOCTYPE overlay SYSTEM "chrome://sendtophone/locale/overlay.dtd">
|
|
||||||
<overlay id="sendtophone-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
|
||||||
<script src="overlay.js"/>
|
|
||||||
<script src="ff-overlay.js"/>
|
|
||||||
|
|
||||||
<stringbundleset id="stringbundleset">
|
|
||||||
<stringbundle id="sendtophone-strings" src="chrome://sendtophone/locale/overlay.properties"/>
|
|
||||||
</stringbundleset>
|
|
||||||
|
|
||||||
<popupset id="mainPopupSet">
|
|
||||||
<menupopup id="sendtophoneContextMenu" onpopupshowing="sendtophone.initPopup();">
|
|
||||||
<menuitem label="&sendtophoneContextSendClipboard.label;"
|
|
||||||
accesskey="&sendtophoneContextSendClipboard.accesskey;"
|
|
||||||
oncommand="sendtophone.sendClipboard()" id="sendtophoneContextMenuSendClipboard"/>
|
|
||||||
<menuitem label="&sendtophoneContextSendFile.label;"
|
|
||||||
accesskey="&sendtophoneContextSendFile.accesskey;"
|
|
||||||
oncommand="sendtophone.pickFile(false)" id="sendtophoneContextMenuSendFiles"/>
|
|
||||||
<menuitem label="&sendtophoneContextSendFolder.label;"
|
|
||||||
accesskey="&sendtophoneContextSendFolder.accesskey;"
|
|
||||||
oncommand="sendtophone.pickFile(true)" id="sendtophoneContextMenuSendFolder"/>
|
|
||||||
<menu label="&sendtophoneProtocols.label;">
|
|
||||||
<menupopup id="menu_Protocols" onpopupshowing="sendtophone.onOptionsShowing(this)">
|
|
||||||
<menuitem type="checkbox" id="marketcheck" label="market:" oncommand="sendtophone.onToggleOption(this)" option="market"/>
|
|
||||||
<menuitem type="checkbox" id="smscheck" label="sms:" oncommand="sendtophone.onToggleOption(this)" option="sms"/>
|
|
||||||
<menuitem type="checkbox" id="telcheck" label="tel:" oncommand="sendtophone.onToggleOption(this)" option="tel"/>
|
|
||||||
</menupopup>
|
|
||||||
</menu>
|
|
||||||
<menuitem label="&sendtophoneContextLogout.label;"
|
|
||||||
accesskey="&sendtophoneContextLogout.accesskey;"
|
|
||||||
oncommand="sendtophone.logout()" id="sendtophoneContextMenuLogout"/>
|
|
||||||
</menupopup>
|
|
||||||
|
|
||||||
</popupset>
|
|
||||||
|
|
||||||
<menupopup id="contentAreaContextMenu">
|
|
||||||
<menuitem id="context-sendtophone-link" label="&sendtophoneContext.label;"
|
|
||||||
class="menuitem-iconic"
|
|
||||||
accesskey="&sendtophoneContext.accesskey;"
|
|
||||||
insertafter="context-sendlink"
|
|
||||||
oncommand="sendtophone.onMenuItemCommand(event, 'link')"/>
|
|
||||||
<menuitem id="context-sendtophone-image" label="&sendtophoneContextImage.label;"
|
|
||||||
class="menuitem-iconic"
|
|
||||||
accesskey="&sendtophoneContextImage.accesskey;"
|
|
||||||
insertafter="context-sendimage"
|
|
||||||
oncommand="sendtophone.onMenuItemCommand(event, 'image')"/>
|
|
||||||
<menuitem id="context-sendtophone-qrimage" label="&sendtophoneContextQrImage.label;"
|
|
||||||
class="menuitem-iconic"
|
|
||||||
accesskey="&sendtophoneContextQrImage.accesskey;"
|
|
||||||
insertafter="context-sendimage"
|
|
||||||
oncommand="sendtophone.onMenuItemCommand(event, 'qr')"/>
|
|
||||||
<menuitem id="context-sendtophone-video" label="&sendtophoneContextVideo.label;"
|
|
||||||
class="menuitem-iconic"
|
|
||||||
accesskey="&sendtophoneContextVideo.accesskey;"
|
|
||||||
insertafter="context-sendvideo"
|
|
||||||
oncommand="sendtophone.onMenuItemCommand(event, 'video')"/>
|
|
||||||
|
|
||||||
<menuitem id="context-sendtophone-text" label="&sendtophoneContextText.label;"
|
|
||||||
class="menuitem-iconic"
|
|
||||||
accesskey="&sendtophoneContextText.accesskey;"
|
|
||||||
insertafter="context-searchselect"
|
|
||||||
oncommand="sendtophone.onMenuItemCommand(event, 'text')"/>
|
|
||||||
<menuitem id="context-sendtophone-page" label="&sendtophoneContextPage.label;"
|
|
||||||
class="menuitem-iconic"
|
|
||||||
accesskey="&sendtophoneContextPage.accesskey;"
|
|
||||||
insertafter="context-sendpage"
|
|
||||||
oncommand="sendtophone.onMenuItemCommand(event, 'page')"/>
|
|
||||||
</menupopup>
|
|
||||||
|
|
||||||
<toolbarpalette id="BrowserToolbarPalette">
|
|
||||||
<toolbarbutton id="sendtophone-toolbar-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
|
|
||||||
label="&sendtophoneToolbarButton.label;" tooltiptext="&sendtophoneToolbarButton.tooltip;"
|
|
||||||
context="sendtophoneContextMenu"
|
|
||||||
|
|
||||||
ondragenter="sendtophone.checkDrag(event)"
|
|
||||||
ondragover="sendtophone.checkDrag(event)"
|
|
||||||
ondrop="sendtophone.doDrop(event)"
|
|
||||||
|
|
||||||
oncommand="sendtophone.onToolbarButtonCommand()"/>
|
|
||||||
</toolbarpalette>
|
|
||||||
|
|
||||||
</overlay>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
|
|
||||||
<!DOCTYPE window SYSTEM "chrome://sendtophone/locale/overlay.dtd">
|
|
||||||
|
|
||||||
<prefwindow id="sendtophone-prefs"
|
|
||||||
title="&sendtophoneOptions.title;"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
|
||||||
|
|
||||||
<prefpane>
|
|
||||||
<preferences>
|
|
||||||
<preference id="extensions.sendtophone.protocols.market" name="extensions.sendtophone.protocols.market" type="bool"/>
|
|
||||||
<preference id="extensions.sendtophone.protocols.sms" name="extensions.sendtophone.protocols.sms" type="bool"/>
|
|
||||||
<preference id="extensions.sendtophone.protocols.smsto" name="extensions.sendtophone.protocols.smsto" type="bool"/>
|
|
||||||
<preference id="extensions.sendtophone.protocols.tel" name="extensions.sendtophone.protocols.tel" type="bool"/>
|
|
||||||
</preferences>
|
|
||||||
|
|
||||||
<groupbox style="padding:1em;" label="ProtocolsGroup">
|
|
||||||
<caption label="&sendtophoneProtocols.label;"/>
|
|
||||||
|
|
||||||
<checkbox preference="extensions.sendtophone.protocols.market"
|
|
||||||
label="market:" />
|
|
||||||
|
|
||||||
<checkbox id="sms" preference="extensions.sendtophone.protocols.sms"
|
|
||||||
label="sms:" oncommand="var o = document.getElementById('smsto'); o.checked=this.checked; o.doCommand();" />
|
|
||||||
<checkbox id="smsto" preference="extensions.sendtophone.protocols.smsto"
|
|
||||||
label="smsto:" style="display:none"/>
|
|
||||||
|
|
||||||
<checkbox preference="extensions.sendtophone.protocols.tel"
|
|
||||||
label="tel:" />
|
|
||||||
</groupbox>
|
|
||||||
|
|
||||||
</prefpane>
|
|
||||||
|
|
||||||
</prefwindow>
|
|
||||||
@@ -1,301 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2010 Alfonso Martínez de Lizarrondo & Patrick O'Reilly
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
// Core functions
|
|
||||||
Components.utils.import("resource://sendtophone/sendtophone.js");
|
|
||||||
// Protocol handlers
|
|
||||||
Components.utils.import("resource://sendtophone/protocolHandlers.js");
|
|
||||||
|
|
||||||
var sendtophone = {
|
|
||||||
|
|
||||||
init: function()
|
|
||||||
{
|
|
||||||
// Each app will implement its specific initialization
|
|
||||||
},
|
|
||||||
|
|
||||||
onLoad: function()
|
|
||||||
{
|
|
||||||
var me = sendtophone;
|
|
||||||
|
|
||||||
me.strings = document.getElementById("sendtophone-strings");
|
|
||||||
|
|
||||||
me.prefs = Components.classes["@mozilla.org/preferences-service;1"]
|
|
||||||
.getService(Ci.nsIPrefService)
|
|
||||||
.getBranch("extensions.sendtophone.") ;
|
|
||||||
|
|
||||||
me.init();
|
|
||||||
},
|
|
||||||
|
|
||||||
getString: function(name)
|
|
||||||
{
|
|
||||||
return this.strings.getString(name);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Detect images of QR codes generated by the Google Charts API
|
|
||||||
detectQR: function( url )
|
|
||||||
{
|
|
||||||
var match = url.match(/^http:\/\/chart.apis.google.com\/chart\?(.*)/i);
|
|
||||||
if (!match)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var chartLink=/^chl=/;
|
|
||||||
var qrArray = match[0].split("&");
|
|
||||||
for(var qrI=0; qrI<qrArray.length; qrI++){
|
|
||||||
if(chartLink.test(qrArray[qrI])){
|
|
||||||
//Decode any data encoded in the QR Image Link
|
|
||||||
return decodeURIComponent(qrArray[qrI].replace(chartLink, ''));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onMenuItemCommand: function(e, type)
|
|
||||||
{
|
|
||||||
var title, url, selection = '';
|
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case 'link':
|
|
||||||
title = gContextMenu.linkText();
|
|
||||||
url = gContextMenu.linkURL;
|
|
||||||
break;
|
|
||||||
case 'image':
|
|
||||||
title = gContextMenu.target.title || gContextMenu.target.alt;
|
|
||||||
url = gContextMenu.mediaURL;
|
|
||||||
break;
|
|
||||||
case 'video':
|
|
||||||
title = gContextMenu.target.title || gContextMenu.target.alt;
|
|
||||||
url = gContextMenu.mediaURL;
|
|
||||||
if(!title)
|
|
||||||
title=this.getString("videoTitle");
|
|
||||||
break;
|
|
||||||
case 'qr':
|
|
||||||
title = gContextMenu.target.title || gContextMenu.target.alt;
|
|
||||||
url = gContextMenu.mediaURL;
|
|
||||||
|
|
||||||
var data = this.detectQR(url);
|
|
||||||
if (this.validURI(data))
|
|
||||||
url = data;
|
|
||||||
else
|
|
||||||
selection = data;
|
|
||||||
|
|
||||||
//If the QR Image has no title text, give it one.
|
|
||||||
if (!title)
|
|
||||||
title=this.getString("qrTitle");
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'text':
|
|
||||||
title = "Selection";
|
|
||||||
url = 'http://google.com/';
|
|
||||||
var input = gContextMenu.target;
|
|
||||||
if (gContextMenu.onTextInput && input && input.value)
|
|
||||||
{
|
|
||||||
selection = input.value.substring(input.selectionStart, input.selectionEnd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Get the selection from the correct iframe
|
|
||||||
var focusedWindow = document.commandDispatcher.focusedWindow;
|
|
||||||
selection = focusedWindow.getSelection().toString();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'pageButton':
|
|
||||||
// Check if there's a single image with a QR code in the contents
|
|
||||||
var images = gBrowser.contentDocument.getElementsByTagName( "img" );
|
|
||||||
|
|
||||||
// 0: search and prompt, 1: search and launch automatically, 2: don't search
|
|
||||||
var pref = this.prefs.getIntPref("SearchQR");
|
|
||||||
if (pref!=2)
|
|
||||||
{
|
|
||||||
var QRs = [];
|
|
||||||
for( var i=0; i<images.length; i++)
|
|
||||||
{
|
|
||||||
var imgData = this.detectQR( images[i].src );
|
|
||||||
if (imgData)
|
|
||||||
QRs.push({data: imgData, img: images[i]});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QRs.length==1)
|
|
||||||
{
|
|
||||||
var data = QRs[0].data;
|
|
||||||
if (pref == 0)
|
|
||||||
{
|
|
||||||
var question = this.getString("ConfirmQR").replace("%s", data.substring(0, 80)) ;
|
|
||||||
var answer = this.confirm( question );
|
|
||||||
pref = (answer.confirm ? 1 : 2 );
|
|
||||||
if (answer.remember)
|
|
||||||
this.prefs.setIntPref("SearchQR", pref);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( pref!=2 )
|
|
||||||
{
|
|
||||||
title = QRs[0].img.title || QRs[0].img.alt;
|
|
||||||
|
|
||||||
if (this.validURI(data))
|
|
||||||
url = data;
|
|
||||||
else
|
|
||||||
selection = data;
|
|
||||||
|
|
||||||
if (!title)
|
|
||||||
title=this.getString("qrTitle");
|
|
||||||
|
|
||||||
// We got the data, break out of the select
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // pref != 2
|
|
||||||
|
|
||||||
// fall through
|
|
||||||
case 'page':
|
|
||||||
default:
|
|
||||||
var info = this.getInfo();
|
|
||||||
title = info.title;
|
|
||||||
url = info.url;
|
|
||||||
selection = info.selection;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sendtophoneCore.send(title, url, selection);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Shows a message in a modal alert
|
|
||||||
alert: function(text)
|
|
||||||
{
|
|
||||||
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
||||||
.getService(Ci.nsIPromptService);
|
|
||||||
promptService.alert(window, this.getString("SendToPhoneTitle"),
|
|
||||||
text);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Shows a message in a modal confirm
|
|
||||||
confirm: function(text)
|
|
||||||
{
|
|
||||||
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
||||||
.getService(Ci.nsIPromptService);
|
|
||||||
|
|
||||||
// https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIPromptService#confirmEx
|
|
||||||
var check = {value: false};
|
|
||||||
|
|
||||||
var button = promptService.confirmEx(window, this.getString("SendToPhoneTitle"),
|
|
||||||
text, promptService.STD_YES_NO_BUTTONS, "", "", "", this.getString("RememberMyDecision"), check);
|
|
||||||
// confirmEx returns the pressed button, and Yes it's the first one.
|
|
||||||
return ({confirm: (0 == button), remember: check.value});
|
|
||||||
},
|
|
||||||
|
|
||||||
onToolbarButtonCommand: function(e) {
|
|
||||||
// just reuse the function above.
|
|
||||||
sendtophone.onMenuItemCommand(e, 'pageButton');
|
|
||||||
},
|
|
||||||
|
|
||||||
getInfo: function() {
|
|
||||||
var doc = gBrowser.contentDocument,
|
|
||||||
href = doc.location.href;
|
|
||||||
|
|
||||||
// Is it the Google Maps page?
|
|
||||||
if (this.isMapsURL(href))
|
|
||||||
{
|
|
||||||
// Then try to send the current view:
|
|
||||||
var link = doc.getElementById('link');
|
|
||||||
if (link && link.href)
|
|
||||||
href = link.href;
|
|
||||||
}
|
|
||||||
|
|
||||||
var focusedWindow = document.commandDispatcher.focusedWindow;
|
|
||||||
var selection = focusedWindow.getSelection().toString();
|
|
||||||
|
|
||||||
return {
|
|
||||||
"title": doc.title,
|
|
||||||
"url": href,
|
|
||||||
"selection": selection
|
|
||||||
};
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
isMapsURL: function(url)
|
|
||||||
{
|
|
||||||
return url.match("http://maps\\.google\\.[a-z]{2,3}(\\.[a-z]{2})?[/?].*") || url.match("http://www\\.google\\.[a-z]{2,3}(\\.[a-z]{2})?/maps.*");
|
|
||||||
},
|
|
||||||
|
|
||||||
validURI: function(uri)
|
|
||||||
{
|
|
||||||
return (/^(https?|market|tel|sms(to)?|mailto|ftp):/i).test( uri );
|
|
||||||
},
|
|
||||||
|
|
||||||
initPopup: function()
|
|
||||||
{
|
|
||||||
var fileServerUrl = this.prefs.getCharPref( "fileServerUrl" );
|
|
||||||
if (!fileServerUrl)
|
|
||||||
{
|
|
||||||
document.getElementById("sendtophoneContextMenuSendFiles").hidden = true;
|
|
||||||
document.getElementById("sendtophoneContextMenuSendFolder").hidden = true;
|
|
||||||
}
|
|
||||||
document.getElementById("sendtophoneContextMenuSendClipboard").disabled = !this.clipboardHasText();
|
|
||||||
|
|
||||||
// returning true will make the popup show
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
clipboardHasText : function()
|
|
||||||
{
|
|
||||||
var clip = Cc["@mozilla.org/widget/clipboard;1"].getService(Ci.nsIClipboard);
|
|
||||||
if (!clip) return false;
|
|
||||||
|
|
||||||
if (!clip.hasDataMatchingFlavors(["text/unicode"], 1, clip.kGlobalClipboard))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
sendClipboard : function()
|
|
||||||
{
|
|
||||||
// https://developer.mozilla.org/en/using_the_clipboard
|
|
||||||
// Access Clipboard
|
|
||||||
var clip = Cc["@mozilla.org/widget/clipboard;1"].getService(Ci.nsIClipboard);
|
|
||||||
if (!clip) return;
|
|
||||||
|
|
||||||
if (!clip.hasDataMatchingFlavors(["text/unicode"], 1, clip.kGlobalClipboard))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
|
|
||||||
if (!trans) return;
|
|
||||||
trans.addDataFlavor("text/unicode");
|
|
||||||
|
|
||||||
// Get the data
|
|
||||||
clip.getData(trans, clip.kGlobalClipboard);
|
|
||||||
|
|
||||||
var str = new Object();
|
|
||||||
var strLength = new Object();
|
|
||||||
var pastetext;
|
|
||||||
|
|
||||||
trans.getTransferData("text/unicode", str, strLength);
|
|
||||||
|
|
||||||
// Convert to js string
|
|
||||||
if (str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
|
|
||||||
if (str) pastetext = str.data.substring(0, strLength.value / 2);
|
|
||||||
|
|
||||||
// Send it.
|
|
||||||
if (pastetext)
|
|
||||||
sendtophoneCore.send("Clipboard", "http://google.com", pastetext);
|
|
||||||
},
|
|
||||||
|
|
||||||
logout: function()
|
|
||||||
{
|
|
||||||
sendtophoneCore.logout();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener("load", sendtophone.onLoad, false);
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
richlistitem[type="upload"][state="0"] {
|
|
||||||
-moz-binding: url('chrome://sendtophone/content/upload.xml#uploading');
|
|
||||||
-moz-box-orient: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
richlistitem[type="upload"][state="1"] {
|
|
||||||
-moz-binding: url('chrome://sendtophone/content/upload.xml#compressing');
|
|
||||||
-moz-box-orient: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Only focus buttons in the selected item*/
|
|
||||||
richlistitem[type="upload"]:not([selected="true"]) button {
|
|
||||||
-moz-user-focus: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<!DOCTYPE bindings [
|
|
||||||
<!ENTITY % downloadManagerDTD SYSTEM "chrome://mozapps/locale/downloads/downloads.dtd">
|
|
||||||
%downloadManagerDTD;
|
|
||||||
<!ENTITY % uploadDTD SYSTEM "chrome://sendtophone/locale/uploads.dtd" >
|
|
||||||
%uploadDTD;
|
|
||||||
]>
|
|
||||||
|
|
||||||
<bindings id="uploadBindings"
|
|
||||||
xmlns="http://www.mozilla.org/xbl"
|
|
||||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
|
||||||
xmlns:xbl="http://www.mozilla.org/xbl">
|
|
||||||
|
|
||||||
<binding id="upload-base" extends="chrome://global/content/bindings/richlistbox.xml#richlistitem">
|
|
||||||
<resources>
|
|
||||||
<stylesheet src="chrome://sendtophone/skin/uploads.css"/>
|
|
||||||
</resources>
|
|
||||||
<implementation>
|
|
||||||
<property name="inProgress">
|
|
||||||
<getter>
|
|
||||||
<![CDATA[
|
|
||||||
var state = parseInt(this.getAttribute("state"));
|
|
||||||
var currBytes = Number(this.getAttribute("currBytes"));
|
|
||||||
var maxBytes = Number(this.getAttribute("maxBytes"));
|
|
||||||
|
|
||||||
return (state == 0 && (currBytes<maxBytes));
|
|
||||||
]]>
|
|
||||||
</getter>
|
|
||||||
</property>
|
|
||||||
|
|
||||||
<property name="buttons">
|
|
||||||
<getter>
|
|
||||||
<![CDATA[
|
|
||||||
var startEl = document.getAnonymousNodes(this);
|
|
||||||
if (!startEl.length)
|
|
||||||
startEl = [this];
|
|
||||||
|
|
||||||
const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
|
||||||
return startEl[0].getElementsByTagNameNS(XULNS, "button");
|
|
||||||
]]>
|
|
||||||
</getter>
|
|
||||||
</property>
|
|
||||||
</implementation>
|
|
||||||
</binding>
|
|
||||||
|
|
||||||
<binding id="uploading" extends="chrome://sendtophone/content/upload.xml#upload-base">
|
|
||||||
<content>
|
|
||||||
<xul:hbox flex="1" class="downloadContentBox">
|
|
||||||
<xul:vbox pack="center">
|
|
||||||
<xul:image class="uploadTypeIcon" validate="always"
|
|
||||||
xbl:inherits="src=image"/>
|
|
||||||
</xul:vbox>
|
|
||||||
<xul:vbox flex="1">
|
|
||||||
<xul:label xbl:inherits="value=target,tooltiptext=file"
|
|
||||||
crop="center" flex="2" class="name"/>
|
|
||||||
<xul:hbox>
|
|
||||||
<xul:vbox flex="1">
|
|
||||||
<xul:progressmeter mode="normal" value="0" flex="1"
|
|
||||||
anonid="progressmeter"
|
|
||||||
xbl:inherits="value=progress,mode=progressmode"/>
|
|
||||||
</xul:vbox>
|
|
||||||
<xul:button class="cancel mini-button" tooltiptext="&cmd.cancel.label;"
|
|
||||||
cmd="cmd_cancel" ondblclick="event.stopPropagation();"
|
|
||||||
oncommand="performCommand('cmd_cancel', this);"/>
|
|
||||||
</xul:hbox>
|
|
||||||
<xul:label xbl:inherits="value=status,tooltiptext=statusTip" flex="1"
|
|
||||||
crop="right" class="status"/>
|
|
||||||
<xul:spacer flex="1"/>
|
|
||||||
</xul:vbox>
|
|
||||||
|
|
||||||
</xul:hbox>
|
|
||||||
</content>
|
|
||||||
</binding>
|
|
||||||
|
|
||||||
<binding id="compressing" extends="chrome://sendtophone/content/upload.xml#upload-base">
|
|
||||||
<content>
|
|
||||||
<xul:hbox flex="1">
|
|
||||||
<xul:vbox pack="center">
|
|
||||||
<xul:image class="uploadTypeIcon" validate="always"
|
|
||||||
src="moz-icon://.zip?size=32"/>
|
|
||||||
</xul:vbox>
|
|
||||||
<xul:vbox pack="start" flex="1">
|
|
||||||
<xul:label xbl:inherits="value=target,tooltiptext=file"
|
|
||||||
crop="center" flex="2" class="name"/>
|
|
||||||
<xul:hbox>
|
|
||||||
<xul:vbox flex="1">
|
|
||||||
<xul:progressmeter mode="undetermined" flex="1" />
|
|
||||||
</xul:vbox>
|
|
||||||
</xul:hbox>
|
|
||||||
<xul:label value="&compressing.label;" class="status"/>
|
|
||||||
<xul:spacer flex="1"/>
|
|
||||||
</xul:vbox>
|
|
||||||
</xul:hbox>
|
|
||||||
|
|
||||||
</content>
|
|
||||||
</binding>
|
|
||||||
|
|
||||||
</bindings>
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
var Cc = Components.classes;
|
|
||||||
var Ci = Components.interfaces;
|
|
||||||
let Cu = Components.utils;
|
|
||||||
Cu.import("resource://gre/modules/DownloadUtils.jsm");
|
|
||||||
Cu.import("resource://gre/modules/PluralForm.jsm");
|
|
||||||
|
|
||||||
Cu.import("resource://sendtophone/uploadsManager.js");
|
|
||||||
|
|
||||||
let gUploadManager = sendtophoneUploadsManager;
|
|
||||||
let gUploadsView = null;
|
|
||||||
|
|
||||||
function addFile(upload)
|
|
||||||
{
|
|
||||||
let dl = document.createElement("richlistitem");
|
|
||||||
|
|
||||||
dl.setAttribute("file", upload.file.path);
|
|
||||||
dl.setAttribute("target", upload.file.leafName);
|
|
||||||
dl.setAttribute("image", "moz-icon://" + upload.file.path + "?size=32");
|
|
||||||
|
|
||||||
dl.setAttribute("state", upload.state);
|
|
||||||
dl.setAttribute("startTime", upload.startTime);
|
|
||||||
dl.setAttribute("currBytes", upload.currBytes);
|
|
||||||
dl.setAttribute("maxBytes", upload.maxBytes);
|
|
||||||
dl.setAttribute("lastSeconds", Infinity);
|
|
||||||
|
|
||||||
// Initialize other attributes
|
|
||||||
dl.setAttribute("type", "upload");
|
|
||||||
dl.setAttribute("id", "upl" + upload.id);
|
|
||||||
dl.setAttribute("uploadId", upload.id);
|
|
||||||
|
|
||||||
gUploadsView.appendChild( dl );
|
|
||||||
}
|
|
||||||
|
|
||||||
var checkTimerEvent =
|
|
||||||
{
|
|
||||||
notify: function(timer)
|
|
||||||
{
|
|
||||||
if (sendtophoneUploadsManager.isWindowNeeded())
|
|
||||||
{
|
|
||||||
if (gUploadsView.children.length==0)
|
|
||||||
window.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancelUpload(item)
|
|
||||||
{
|
|
||||||
gUploadManager.cancelUpload( parseInt(item.getAttribute("uploadId"), 10) );
|
|
||||||
}
|
|
||||||
|
|
||||||
let gUploadListener = {
|
|
||||||
fileAdded: function(data)
|
|
||||||
{
|
|
||||||
addFile(data);
|
|
||||||
},
|
|
||||||
progressUpdate: function(data)
|
|
||||||
{
|
|
||||||
let item = document.getElementById( "upl" + data.id);
|
|
||||||
item.setAttribute("currBytes", data.currBytes);
|
|
||||||
item.setAttribute("maxBytes", data.maxBytes);
|
|
||||||
|
|
||||||
let percentComplete = Math.round(100 * data.currBytes / data.maxBytes);
|
|
||||||
item.setAttribute("progress", percentComplete);
|
|
||||||
|
|
||||||
// Status text
|
|
||||||
updateStatus(item);
|
|
||||||
},
|
|
||||||
fileFinished: function(data)
|
|
||||||
{
|
|
||||||
let item = document.getElementById("upl" + data.id);
|
|
||||||
gUploadsView.removeChild(item);
|
|
||||||
|
|
||||||
// If no more pending uploads, close the tab.
|
|
||||||
// Use a 0 ms timeout to avoid flicker while compress -> upload a folder
|
|
||||||
let checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
|
||||||
checkTimer.initWithCallback(checkTimerEvent, 0, Ci.nsITimer.TYPE_ONE_SHOT);
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function Startup()
|
|
||||||
{
|
|
||||||
gUploadsView = document.getElementById("UploadsBox");
|
|
||||||
|
|
||||||
gUploadManager.addListener(gUploadListener);
|
|
||||||
|
|
||||||
for (let id in gUploadManager.uploads)
|
|
||||||
addFile( gUploadManager.uploads[id] );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function Shutdown()
|
|
||||||
{
|
|
||||||
gUploadManager.removeListener(gUploadListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
//// Command Updating and Command Handlers
|
|
||||||
|
|
||||||
var gUploadViewController = {
|
|
||||||
isCommandEnabled: function(aCommand, aItem)
|
|
||||||
{
|
|
||||||
let dl = aItem;
|
|
||||||
|
|
||||||
switch (aCommand) {
|
|
||||||
case "cmd_cancel":
|
|
||||||
return dl.inProgress;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
doCommand: function(aCommand, aItem)
|
|
||||||
{
|
|
||||||
if (this.isCommandEnabled(aCommand, aItem))
|
|
||||||
this.commands[aCommand](aItem);
|
|
||||||
},
|
|
||||||
|
|
||||||
commands: {
|
|
||||||
cmd_cancel: function(aSelectedItem) {
|
|
||||||
cancelUpload(aSelectedItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper function to do commands.
|
|
||||||
*
|
|
||||||
* @param aCmd
|
|
||||||
* The command to be performed.
|
|
||||||
* @param aItem
|
|
||||||
* The richlistitem that represents the download that will have the
|
|
||||||
* command performed on it. If this is null, the command is performed on
|
|
||||||
* all downloads. If the item passed in is not a richlistitem that
|
|
||||||
* represents a download, it will walk up the parent nodes until it finds
|
|
||||||
* a DOM node that is.
|
|
||||||
*/
|
|
||||||
function performCommand(aCmd, aItem)
|
|
||||||
{
|
|
||||||
let elm = aItem;
|
|
||||||
|
|
||||||
while (elm.nodeName != "richlistitem" ||
|
|
||||||
elm.getAttribute("type") != "upload")
|
|
||||||
elm = elm.parentNode;
|
|
||||||
|
|
||||||
gUploadViewController.doCommand(aCmd, elm);
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateStatus(aItem)
|
|
||||||
{
|
|
||||||
let currBytes = Number(aItem.getAttribute("currBytes"));
|
|
||||||
let maxBytes = Number(aItem.getAttribute("maxBytes"));
|
|
||||||
|
|
||||||
let elapsedTime = (Date.now() - Number(aItem.getAttribute("startTime"))) / 1000;
|
|
||||||
// If we don't have an active upload, assume 0 bytes/sec
|
|
||||||
let speed = (currBytes>0) ? currBytes/elapsedTime : 0;
|
|
||||||
let lastSec = Number(aItem.getAttribute("lastSeconds"));
|
|
||||||
|
|
||||||
let status, newLast;
|
|
||||||
[status, newLast] =
|
|
||||||
DownloadUtils.getDownloadStatus(currBytes, maxBytes, speed, lastSec);
|
|
||||||
|
|
||||||
// Update lastSeconds to be the new value
|
|
||||||
aItem.setAttribute("lastSeconds", newLast);
|
|
||||||
|
|
||||||
aItem.setAttribute("status", status);
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
|
|
||||||
<?xml-stylesheet href="chrome://sendtophone/content/upload.css"?>
|
|
||||||
<?xml-stylesheet href="chrome://sendtophone/skin/uploads.css"?>
|
|
||||||
|
|
||||||
<!DOCTYPE window SYSTEM "chrome://sendtophone/locale/overlay.dtd">
|
|
||||||
|
|
||||||
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
|
||||||
id="sendtophoneUploadsWindow"
|
|
||||||
onload="Startup();" onunload="Shutdown();"
|
|
||||||
onclose="return closeWindow(false);">
|
|
||||||
|
|
||||||
<script type="application/javascript" src="chrome://sendtophone/content/uploads.js"/>
|
|
||||||
|
|
||||||
<richlistbox id="UploadsBox" flex="1">
|
|
||||||
</richlistbox>
|
|
||||||
|
|
||||||
</window>
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Odeslat tuto stránku do telefonu">
|
|
||||||
<!ENTITY sendtophoneContext.label "Odeslat tento odkaz do telefonu">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Odeslat tento obrázek do telefonu">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Odeslat tento text do telefonu">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Odeslat tuto stránku do telefonu">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Odhlásit">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Nastavení">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protokoly">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Odeslat soubory...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Odeslat složku...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Odeslat odkaz z QR kódu do telefonu">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Odeslat obsah schránky">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Odeslat video do telefonu">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Odešle aktuální stránku do telefonu
|
|
||||||
SendToPhoneTitle=Fox To Phone
|
|
||||||
InvalidScheme=Nevalidní schéma, odesílejte prosím pouze http:// nebo https:// odkazy.
|
|
||||||
InfoSent=Odkaz byl odeslán do Vašeho telefonu.
|
|
||||||
ErrorOnSend=Během odesílání se vyskytla chyba:
|
|
||||||
LoginRequired=Pro odeslání odkazu je potřeba být přihlášen.
|
|
||||||
LoginSuccessful=Byl(a) jste přihlášen(a).
|
|
||||||
DeviceNotRegistered=Nainstalujte chrometophone.apk na Váš telefon
|
|
||||||
LogoutSuccessful=Byl(a) jste odhlášen(a)
|
|
||||||
marketLink=Odkaz na market
|
|
||||||
smsLink=SMS číslo
|
|
||||||
smstoLink=SMS číslo
|
|
||||||
telLink=Telefonní číslo
|
|
||||||
InvalidFile=Soubor není validní
|
|
||||||
SendFileToPhone=Odeslat soubory do telefonu.
|
|
||||||
SendFolderToPhone=Odeslat složku do telefonu.
|
|
||||||
qrTitle=Odkaz na QR obrázek
|
|
||||||
ConfirmQR=Byl detekován QR obrázek\n"%s"\nOpravdu ho chcete odeslat namísto stránky?
|
|
||||||
RememberMyDecision=Zapamatovat
|
|
||||||
qrContextMenu=Odeslat "%s" do telefonu
|
|
||||||
FileUploadsDisabled=Není možné odeslat soubory do telefonu.
|
|
||||||
FileTooBig=Soubor je příliš veliký.
|
|
||||||
videoTitle=Odkaz na video
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Komprimuji složku">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Diese Seite auf Ihr Android Gerät schicken.">
|
|
||||||
<!ENTITY sendtophoneContext.label "Link auf Android senden">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Grafik auf Android senden">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Markierten Text auf Android senden">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Seite auf Android senden">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Abmelden">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Send To Phone Einstellungen">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protokolle">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Send files...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Sendet die aktuelle Seite auf Ihr Android Gerät
|
|
||||||
SendToPhoneTitle=Fox To Phone
|
|
||||||
InvalidScheme=Protokoll nicht unterstützt, bitte senden Sie nur http:// oder https:// links.
|
|
||||||
InfoSent=Der Link wurde auf Ihr Android Gerät geschickt.
|
|
||||||
ErrorOnSend=Es gab einen Fehler beim Senden:
|
|
||||||
LoginRequired=Login erforderlich zum Senden des Links.
|
|
||||||
LoginSuccessful=Sie sind eingeloggt
|
|
||||||
DeviceNotRegistered=Die Chome2Phone-App muss auf dem Android Gerät, das mit diesem GMail Account verbunden ist, installiert sein.
|
|
||||||
LogoutSuccessful=Sie sind abgemeldet.
|
|
||||||
marketLink=Market Link
|
|
||||||
smsLink=SMS-Nummer
|
|
||||||
smstoLink=SMS-Nummer
|
|
||||||
telLink=Telefonnummer
|
|
||||||
InvalidFile=Not a valid file
|
|
||||||
SendFileToPhone=Send files to your phone.
|
|
||||||
SendFolderToPhone=Send a folder to your phone.
|
|
||||||
qrTitle=QR Image Link
|
|
||||||
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
|
|
||||||
RememberMyDecision=Auswahl merken
|
|
||||||
qrContextMenu=Send "%s" to Android
|
|
||||||
FileUploadsDisabled=It's not possible to upload files to the phone.
|
|
||||||
FileTooBig=The file is too big.
|
|
||||||
videoTitle=Video Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Send this page to your Android Phone">
|
|
||||||
<!ENTITY sendtophoneContext.label "Send this link to Android">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Send this image to Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Send this text to Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Send this page to Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Logout">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox To Phone Preferences">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocols">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Send files...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Sends the current page to your Android phone
|
|
||||||
SendToPhoneTitle=Fox To Phone
|
|
||||||
InvalidScheme=Invalid scheme, please only send http:// or https:// links.
|
|
||||||
InfoSent=The link has been sent to your phone.
|
|
||||||
ErrorOnSend=There was an error sending:
|
|
||||||
LoginRequired=Login required to send the link.
|
|
||||||
LoginSuccessful=You have logged in.
|
|
||||||
DeviceNotRegistered=You must install the chrometophone.apk on your phone registered to this GMail account
|
|
||||||
LogoutSuccessful=You are logged out
|
|
||||||
marketLink=Market Link
|
|
||||||
smsLink=SMS Number
|
|
||||||
smstoLink=SMS Number
|
|
||||||
telLink=Telephone Number
|
|
||||||
InvalidFile=Not a valid file
|
|
||||||
SendFileToPhone=Send files to your phone.
|
|
||||||
SendFolderToPhone=Send a folder to your phone.
|
|
||||||
qrTitle=QR Image Link
|
|
||||||
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
|
|
||||||
RememberMyDecision=Remember my decision
|
|
||||||
qrContextMenu=Send "%s" to Android
|
|
||||||
FileUploadsDisabled=It's not possible to upload files to the phone.
|
|
||||||
FileTooBig=The file is too big.
|
|
||||||
videoTitle=Video Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Enviar página a Android">
|
|
||||||
<!ENTITY sendtophoneContext.label "Enviar enlace a Android">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Enviar imagen a Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Enviar el texto a Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Enviar página a Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Salir">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Opciones de Fox to Phone">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocolos">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Enviar ficheros...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "E">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Enviar carpeta...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Enviar imagen QR a Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Enviar el portapapeles">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Enviar video a Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Envía la página actual a su teléfono Android
|
|
||||||
SendToPhoneTitle=Enviar a teléfono
|
|
||||||
InvalidScheme=Esquema no válido, por favor, envíe sólo enlaces http:// o https://.
|
|
||||||
InfoSent=El enlace ha sido enviado a su teléfono.
|
|
||||||
ErrorOnSend=Se ha producido un error al enviar:
|
|
||||||
LoginRequired=Es necesario identificarse para enviar el enlace.
|
|
||||||
LoginSuccessful=Se ha identificado correctamente.
|
|
||||||
DeviceNotRegistered=Debe instalar la aplicación en su teléfono y registrar la misma cuenta de correo
|
|
||||||
LogoutSuccessful=Ha cerrado su sesión
|
|
||||||
marketLink=Market link
|
|
||||||
smsLink=Número SMS
|
|
||||||
smstoLink=Número SMS
|
|
||||||
telLink=Número de teléfono
|
|
||||||
InvalidFile=No es un fichero válido.
|
|
||||||
SendFileToPhone=Envía ficheros al teléfono.
|
|
||||||
SendFolderToPhone=Envía una carpeta al teléfono.
|
|
||||||
qrTitle=Imagen QR
|
|
||||||
ConfirmQR=Se ha detectado una imagen QR\n"%s"\n¿Quiere enviarlo en lugar de la página?
|
|
||||||
RememberMyDecision=Recordar mi decisión
|
|
||||||
qrContextMenu=Enviar "%s" a Android
|
|
||||||
FileUploadsDisabled=No se pueden enviar ficheros al teléfono.
|
|
||||||
FileTooBig=El fichero que quiere enviar es demasiado grande.
|
|
||||||
videoTitle=Video Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Comprimiendo carpeta">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Envoyer vers un téléphone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Envoyer cette page à votre portable Android">
|
|
||||||
<!ENTITY sendtophoneContext.label "Envoyer ce lien vers Android">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Envoyer cette image vers Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "i">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Envoyer ce texte vers Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "t">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Envoyer cette page vers Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "e">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Déconnexion">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "D">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Envoyer vers les préférences du portable">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocoles">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Send files...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Envoie la page en cours sur votre téléphone Android
|
|
||||||
SendToPhoneTitle=Envoyer vers un téléphone portable
|
|
||||||
InvalidScheme=Format d'adresse invalide, veuillez envoyer uniquement des liens http:// ou https://.
|
|
||||||
InfoSent=Le lien a été envoyé à votre mobile.
|
|
||||||
ErrorOnSend=Une erreur s'est produite au cours de l'envoi :
|
|
||||||
LoginRequired=Connexion nécessaire pour envoyer ce lien.
|
|
||||||
LoginSuccessful=Vous êtes connecté(e).
|
|
||||||
DeviceNotRegistered=Vous devez installer le chrometophone.apk sur votre téléphone inscrit à ce compte GMail
|
|
||||||
LogoutSuccessful=Vous êtes déconnecté(e)
|
|
||||||
marketLink=Lien commercial
|
|
||||||
smsLink=Nombre de SMS
|
|
||||||
smstoLink=Nombre de SMS
|
|
||||||
telLink=Numéro de téléphone
|
|
||||||
InvalidFile=Not a valid file
|
|
||||||
SendFileToPhone=Send files to your phone.
|
|
||||||
SendFolderToPhone=Send a folder to your phone.
|
|
||||||
qrTitle=QR Image Link
|
|
||||||
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
|
|
||||||
RememberMyDecision=Se souvenir de mon choix
|
|
||||||
qrContextMenu=Send "%s" to Android
|
|
||||||
FileUploadsDisabled=It's not possible to upload files to the phone.
|
|
||||||
FileTooBig=The file is too big.
|
|
||||||
videoTitle=Video Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Sionnach chuig Fón">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Seol an leathanach seo le do Android Seol an leathanach seo le do Android Fón">
|
|
||||||
<!ENTITY sendtophoneContext.label "Seol an nasc seo chun Android">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Send this image to Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Send this text to Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Send this page to Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Logout">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox to Phone Preferences">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocols">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Seol files...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Seol folder...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Seol nasc QR chun Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Seol Clipboard">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Seol Video chun Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Cuireann an leathanach reatha ar do ghuthán Android
|
|
||||||
SendToPhoneTitle=Sionnach Chun Fón
|
|
||||||
InvalidScheme=Scéim neamhbhailí, le do thoil seol http:// amháin nó http:// naisc.
|
|
||||||
InfoSent=Tá nasc chuig do ghuthán.
|
|
||||||
ErrorOnSend=Tharla earráid agus a sheoladh:
|
|
||||||
LoginRequired=Logáil isteach ag teastáil chun a sheoladh chuig an nasc.
|
|
||||||
LoginSuccessful=Tá tú logáilte isteach
|
|
||||||
DeviceNotRegistered=Ní mór duit a shuiteáil ar do ghuthán chrometophone.apk cláraithe leis an gcuntas seo Gmail
|
|
||||||
LogoutSuccessful=Tá tú logáilte amach
|
|
||||||
marketLink=Nasc chuig an Margadh
|
|
||||||
smsLink=Uimhir SMS
|
|
||||||
smstoLink=Uimhir SMS
|
|
||||||
telLink=Uimhir Theileafóin
|
|
||||||
InvalidFile=Gan comhad bailí
|
|
||||||
SendFileToPhone=Seol comhad ar do ghuthán.
|
|
||||||
SendFolderToPhone=Seol an fhillteáin le do ghuthán.
|
|
||||||
qrTitle=Nasc íomhá QR
|
|
||||||
ConfirmQR=Tá an íomhá QR a bhraitear\n"%s"\nAn bhfuil tú ag iarraidh a sheoladh go in ionad an leathanach seo?
|
|
||||||
RememberMyDecision=Cuimhnigh mo chinneadh
|
|
||||||
qrContextMenu=Seol "%s" ar do ghuthán.
|
|
||||||
FileUploadsDisabled=Níl sé indéanta chun comhaid a uaslódáil chuig an bhfón.
|
|
||||||
FileTooBig=Tá an comhad ró-mhór.
|
|
||||||
videoTitle=Nasc Video
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "फोन पर भेजें">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "अपने Android फोन करने के लिए इस पृष्ठ को भेजें">
|
|
||||||
<!ENTITY sendtophoneContext.label "भेजें Android के लिए इस कड़ी">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Send this image to Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Send this text to Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Send this page to Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Logout">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox to Phone Preferences">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocols">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Send files...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=अपने Android फोन करने के लिए वर्तमान पृष्ठ पर भेजता है
|
|
||||||
SendToPhoneTitle=भेजने के लिए फोन
|
|
||||||
InvalidScheme=अवैध योजना, केवल http:// या https: / / लिंक: भेजें.
|
|
||||||
InfoSent=लिंक आपके फोन करने के लिए भेजा गया है.
|
|
||||||
ErrorOnSend=वहाँ एक भेजने में त्रुटि थी:
|
|
||||||
LoginRequired=लॉगइन करने के लिए लिंक भेज आवश्यक है.
|
|
||||||
LoginSuccessful=तुम अंदर लॉग इन किया है
|
|
||||||
DeviceNotRegistered=आप अपने फोन पर स्थापित chrometophone.apk इस जीमेल खाते में दर्ज करना होगा
|
|
||||||
LogoutSuccessful=तुम बाहर लॉग इन किया है
|
|
||||||
marketLink=बाजार के लिए लिंक
|
|
||||||
smsLink=एसएमएस संख्या
|
|
||||||
smstoLink=एसएमएस संख्या
|
|
||||||
telLink=टेलीफोन नंबर
|
|
||||||
InvalidFile=Not a valid file
|
|
||||||
SendFileToPhone=Send files to your phone.
|
|
||||||
SendFolderToPhone=Send a folder to your phone.
|
|
||||||
qrTitle=QR Image Link
|
|
||||||
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
|
|
||||||
qrContextMenu=Send "%s" to Android
|
|
||||||
FileUploadsDisabled=It's not possible to upload files to the phone.
|
|
||||||
FileTooBig=The file is too big.
|
|
||||||
videoTitle=Video Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Ezt az oldalt elküldi az Android telefonodra">
|
|
||||||
<!ENTITY sendtophoneContext.label "Link küldése az Androidra">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Kép küldése az Androidra">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Szöveg küldése az Androidra">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Oldal küldése az Androidra">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Kijelentkezés">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Küldés a Telefon beállításaiba">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocols">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Fájlok küldése...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Mappa küldése...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Dekódolt QR link küldése az Androidra">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Vágólap küldése">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Videó küldése az Androidra">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Jelenlegi oldal küldése az Android telefonra
|
|
||||||
SendToPhoneTitle=Fox To Phone
|
|
||||||
InvalidScheme=Hibás formátum, kérlek csak http:// vagy https:// linkeket küldj.
|
|
||||||
InfoSent=A link el lett küldve a telefonodra.
|
|
||||||
ErrorOnSend=Hiba a küldésnél:
|
|
||||||
LoginRequired=A link küldéshez szükséges a bejelentkezés.
|
|
||||||
LoginSuccessful=Előbb jelentkezz be.
|
|
||||||
DeviceNotRegistered=Először telepítsd a chrometophone.apk fájlt a telefonodra, majd regisztráld a GMail fiókodat.
|
|
||||||
LogoutSuccessful=Kijelentkeztél.
|
|
||||||
marketLink=Market link
|
|
||||||
smsLink=SMS szám
|
|
||||||
smstoLink=SMS szám
|
|
||||||
telLink=Telefon szám
|
|
||||||
InvalidFile=Nem valós fájl
|
|
||||||
SendFileToPhone=Fájlok küldése a telefonodra.
|
|
||||||
SendFolderToPhone=Mappa küldése a telefonodra.
|
|
||||||
qrTitle=QR kép link
|
|
||||||
ConfirmQR=QR kép észéeéve\n"%s"\nEzt akartod küldeni az oldallal együtt?
|
|
||||||
RememberMyDecision=Emlékezzen, hogyan döntöttem
|
|
||||||
qrContextMenu="%s" küldése az Androidra
|
|
||||||
FileUploadsDisabled=Fájlok feltöltése nem lehetséges a telefonra.
|
|
||||||
FileTooBig=A fájl mérete túl nagy.
|
|
||||||
videoTitle=Videó Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Mappa tömörítése">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Invia A Cellulare">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Invia questa pagina al tuo telefono Android">
|
|
||||||
<!ENTITY sendtophoneContext.label "Invia questo link per Android">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Invia questa immagine per Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Invia questo testo per Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Invia questa pagina ad Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Logout">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox To Phone Preferences">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocols">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Send files...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Invia la pagina corrente al vostro telefono Android
|
|
||||||
SendToPhoneTitle=Fox a Cellulare
|
|
||||||
InvalidScheme=Schema non valido, si prega di inviare solo http:// o https: / / link.
|
|
||||||
InfoSent=Il link è stato inviato al tuo telefono cellulare.
|
|
||||||
ErrorOnSend=Si è verificato un errore durante l'invio:
|
|
||||||
LoginRequired=Accesso necessario per inviare il link.
|
|
||||||
LoginSuccessful=Hai loggato
|
|
||||||
DeviceNotRegistered=È necessario installare il chrometophone.apk sul telefono registrato a questo account GMail
|
|
||||||
LogoutSuccessful=Sei disconnesso
|
|
||||||
marketLink=Mercato Link
|
|
||||||
smsLink=Numero di SMS
|
|
||||||
smstoLink=Numero di SMS
|
|
||||||
telLink=Numero di telefono
|
|
||||||
InvalidFile=Not a valid file
|
|
||||||
SendFileToPhone=Send files to your phone.
|
|
||||||
SendFolderToPhone=Send a folder to your phone.
|
|
||||||
qrTitle=QR Image Link
|
|
||||||
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
|
|
||||||
qrContextMenu=Send "%s" to Android
|
|
||||||
FileUploadsDisabled=It's not possible to upload files to the phone.
|
|
||||||
FileTooBig=The file is too big.
|
|
||||||
videoTitle=Video Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "このページを Android に送信">
|
|
||||||
<!ENTITY sendtophoneContext.label "リンクを Android に送信">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "画像を Android に送信">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "選択したテキストを Android に送信">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "このページを Android に送信">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "ログアウト">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox to Phone の設定">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "プロトコル">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "送信するファイル...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "送信するフォルダ...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "解読した QR リンクを Android に送信">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "クリップボードを Android に送信">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "動画を Android に送信">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=読んでいるページを Android 携帯へ送信します
|
|
||||||
SendToPhoneTitle=Fox To Phone
|
|
||||||
InvalidScheme=無効なスキームです。http:// か https:// のリンクを送って下さい。
|
|
||||||
InfoSent=リンクを携帯電話に送信しています。
|
|
||||||
ErrorOnSend=送信エラーが発生:
|
|
||||||
LoginRequired=リンクを送信するためにログインが必要です。
|
|
||||||
LoginSuccessful=ログインしました。
|
|
||||||
DeviceNotRegistered=この Gmail アカウントを登録している携帯電話に chrometophone.apk をインストールして下さい
|
|
||||||
LogoutSuccessful=ログアウトしました
|
|
||||||
marketLink=マーケットへのリンク
|
|
||||||
smsLink=SMS番号
|
|
||||||
smstoLink=SMS番号
|
|
||||||
telLink=電話番号
|
|
||||||
InvalidFile=無効なファイル
|
|
||||||
SendFileToPhone=ファイルを携帯電話へ送信します。
|
|
||||||
SendFolderToPhone=フォルダを携帯電話へ送信します。
|
|
||||||
qrTitle=QR 画像リンク
|
|
||||||
ConfirmQR=QR 画像が解読されました\n"%s"\nこれをページの代わりに送信しますか?
|
|
||||||
RememberMyDecision=決定を記憶
|
|
||||||
qrContextMenu="%s" を Android に送信
|
|
||||||
FileUploadsDisabled=このファイルは携帯電話へアップロード出来ません。
|
|
||||||
FileTooBig=このファイルは大きすぎます。
|
|
||||||
videoTitle=動画リンク
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "フォルダを圧縮">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox to Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Verzend deze pagina naar uw Android-telefoon">
|
|
||||||
<!ENTITY sendtophoneContext.label "Deze koppeling naar Android verzenden">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Deze afbeelding naar Android verzenden">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Deze tekst naar Android verzenden">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Deze pagina naar Android verzenden">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Afmelden">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox to Phone-voorkeuren">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocollen">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Bestanden verzenden…">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "z">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Map verzenden…">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "M">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Gedecodeerde QR-koppeling naar Android verzenden">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Klembord verzenden">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "K">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Video naar Android verzenden">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Verzendt de huidige pagina naar uw Android-telefoon
|
|
||||||
SendToPhoneTitle=Fox to Phone
|
|
||||||
InvalidScheme=Ongeldig protocol, verzend a.u.b. alleen koppelingen van het type http:// of https://.
|
|
||||||
InfoSent=De koppeling is verzonden naar uw telefoon.
|
|
||||||
ErrorOnSend=Er is een fout opgetreden bij het verzenden:
|
|
||||||
LoginRequired=U dient aangemeld te zijn om een koppeling te verzenden.
|
|
||||||
LoginSuccessful=U bent aangemeld.
|
|
||||||
DeviceNotRegistered=U dient chrometophone.apk te installeren op uw bij deze Gmail-account geregistreerde telefoon
|
|
||||||
LogoutSuccessful=U bent afgemeld
|
|
||||||
marketLink=Marktkoppeling
|
|
||||||
smsLink=SMS-nummer
|
|
||||||
smstoLink=SMS-nummer
|
|
||||||
telLink=Telefoonnummer
|
|
||||||
InvalidFile=Geen geldig bestand
|
|
||||||
SendFileToPhone=Bestanden naar uw telefoon verzenden.
|
|
||||||
SendFolderToPhone=Een map naar uw telefoon verzenden.
|
|
||||||
qrTitle=QR-afbeeldingskoppeling
|
|
||||||
ConfirmQR=Er is een QR-afbeelding gedetecteerd\n“%s”\nWilt u deze verzenden in plaats van de pagina?
|
|
||||||
RememberMyDecision=Mijn keuze onthouden
|
|
||||||
qrContextMenu=“%s” naar Android verzenden
|
|
||||||
FileUploadsDisabled=Het is niet mogelijk om bestanden naar de telefoon te uploaden.
|
|
||||||
FileTooBig=Het bestand is te groot.
|
|
||||||
videoTitle=Videokoppeling
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Envia esta página para seu celular Android">
|
|
||||||
<!ENTITY sendtophoneContext.label "Enviar este link para o Android">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "l">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Enviar esta imagem para o Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "i">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Enviar este texto para o Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "t">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Enviar esta página para o Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "g">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Logout">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Preferências do Fox To Phone">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocolos">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Enviar arquivos...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "a">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Enviar pasta...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "p">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Enviar link QR decodificado para o Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Enviar área de transferência">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "t">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Enviar vídeo para o Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "v">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Envia a página atual para seu celular Android
|
|
||||||
SendToPhoneTitle=Fox To Phone
|
|
||||||
InvalidScheme=Esquema inválido. Por favor, só envie links http:// ou https://
|
|
||||||
InfoSent=O link foi enviado para seu celular.
|
|
||||||
ErrorOnSend=Houve um erro ao enviar:
|
|
||||||
LoginRequired=É necessário fazer login para enviar o link.
|
|
||||||
LoginSuccessful=Você se logou.
|
|
||||||
DeviceNotRegistered=Você deve instalar o chrometophone.apk no celular registrado com essa conta do GMail
|
|
||||||
LogoutSuccessful=Você se deslogou
|
|
||||||
marketLink=Link de mercado
|
|
||||||
smsLink=Número SMS
|
|
||||||
smstoLink=Número SMS
|
|
||||||
telLink=Número do celular
|
|
||||||
InvalidFile=Não é um arquivo válido
|
|
||||||
SendFileToPhone=Enviar arquivos para seu celular.
|
|
||||||
SendFolderToPhone=Enviar uma pasta para seu celular.
|
|
||||||
qrTitle=Link de imagem QR
|
|
||||||
ConfirmQR=Uma imagem QR foi detectada\n"%s"\nVocê quer enviá-la ao invés da página?
|
|
||||||
RememberMyDecision=Lembrar minha decisão
|
|
||||||
qrContextMenu=Enviar "%s" para o Android
|
|
||||||
FileUploadsDisabled=Não é possível enviar arquivos para o celular.
|
|
||||||
FileTooBig=O arquivo é grande demais.
|
|
||||||
videoTitle=Link para vídeo
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compactando pasta">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Отправить страницу в телефон">
|
|
||||||
<!ENTITY sendtophoneContext.label "Отправить ссылку в телефон">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Послать картинку в телефон">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Отправить текст в телефон">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Отправить страницу в телефон">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Выйти">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Настройки Fox To Phone">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Протоколы">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Отправить файл(ы)…">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Отправить папку…">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Отправить QR-ссылку в телефон">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Отправить содержимое буфера обмена в телефон">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Отправить видео в телефон">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Отправляет страницу в телефон
|
|
||||||
SendToPhoneTitle=Отправить в телефон
|
|
||||||
InvalidScheme=Неверная ссылка. Отправлять можно только http и https ссылки
|
|
||||||
InfoSent=Ссылка была отправлен в телефон
|
|
||||||
ErrorOnSend=Ошибка отправки:
|
|
||||||
LoginRequired=Необходимо войти на сайт Google для отправки ссылки
|
|
||||||
LoginSuccessful=Вы вошли на сайт Google
|
|
||||||
DeviceNotRegistered=Установите chrometophone.apk на Ваш телефон и зарегистрируйте в нем ваш Google-аккаунт
|
|
||||||
LogoutSuccessful=Вы вышли из системы
|
|
||||||
marketLink=Ссылка на Market
|
|
||||||
smsLink=Телефон для отправки SMS
|
|
||||||
smstoLink=Телефон для отправки SMS
|
|
||||||
telLink=Номер телефона
|
|
||||||
InvalidFile=Неправильный файл
|
|
||||||
SendFileToPhone=Отправить файл(ы) в телефон
|
|
||||||
SendFolderToPhone=Отправить папку в телефон
|
|
||||||
qrTitle=QR-ссылка
|
|
||||||
ConfirmQR=Обнаружена картинка с QR-ссылкой.\n"%s"\nВы хотите отправить ссылку вместо страницы?
|
|
||||||
RememberMyDecision=Запомнить выбор
|
|
||||||
qrContextMenu=Отправить "%s" в телефон
|
|
||||||
FileUploadsDisabled=Невозможно загрузить файл(ы) на телефон
|
|
||||||
FileTooBig=Файл слишком большой
|
|
||||||
videoTitle=Ссылка на видео
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Сжатие папки">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Пошаљи на телефон">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Пошаљи ову страницу на свој телефон Андроид">
|
|
||||||
<!ENTITY sendtophoneContext.label "Пошаљи ову везу на Андроид">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "А">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Пошаљи ову слику на Андроид">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "С">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Пошаљи овај текст на Андроид">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "Т">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Пошаљи ову страницу на свој телефон Андроид">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "Р">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Одјави се">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "О">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Подешавања слања у телефон">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Протоколи">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Пошаљи датотеке...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "Д">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Пошаљи фасциклу...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "Ф">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Пошаљи декодирану QR везу на Андроид">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "В">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Пошаљи садржај оставе">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "Т">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Пошаљи видео на Андроид">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "Д">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Пошаљи тренутну страницу на свој телефон Андроид
|
|
||||||
SendToPhoneTitle=Пошаљи на телефон
|
|
||||||
InvalidScheme=Неважећа шема. Пошаљите само http:// или https:// везе.
|
|
||||||
InfoSent=Веза је послата на телефон.
|
|
||||||
ErrorOnSend=Дошло је до грешке приликом слања:
|
|
||||||
LoginRequired=Потребно је да се пријавите да бисте послали везу.
|
|
||||||
LoginSuccessful=Пријавили сте се.
|
|
||||||
DeviceNotRegistered=Морате да инсталирате chrometophone.apk на телефон са регистрованим налогом за GMail
|
|
||||||
LogoutSuccessful=Одјављени сте
|
|
||||||
marketLink=Тржишна веза
|
|
||||||
smsLink=SMS број
|
|
||||||
smstoLink=SMS број
|
|
||||||
telLink=Број телефона
|
|
||||||
InvalidFile=Неважећа датотека
|
|
||||||
SendFileToPhone=Пошаљите датотеке на свој телефон
|
|
||||||
SendFolderToPhone=Пошаљите фасциклу на свој телефон
|
|
||||||
qrTitle=QR веза до слике
|
|
||||||
ConfirmQR=Препозната је QR слика\n„%s”\nЖелите ли да је пошаљете уместо ове странице?
|
|
||||||
RememberMyDecision=Упамти мој одговор
|
|
||||||
qrContextMenu=Пошаљи „%s” у Андроид
|
|
||||||
FileUploadsDisabled=Није могуће слати слике на телефон.
|
|
||||||
FileTooBig=Датотека је превелика.
|
|
||||||
videoTitle=Веза до видео снимка
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Сажимање фасцикле">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Skicka till Telefon">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "Skicka denna sida till din Android Telefonerna">
|
|
||||||
<!ENTITY sendtophoneContext.label "Skicka denna länk till Android">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "Skicka denna bild till Android">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "Skicka denna text till Android">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "Skicka denna sida till Android">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "Logga ut">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox To Phone Preferences">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Protocols">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "Send files...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "Send folder...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "Send decoded QR Link to Android">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "Send Clipboard">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "Send Video to Android">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=Skickar den aktuella sidan till din Android telefonen
|
|
||||||
SendToPhoneTitle=Fox till Telefon
|
|
||||||
InvalidScheme=Ogiltig, vänligen skicka bara http:// eller https: / / länkar.
|
|
||||||
InfoSent=Länken har skickats till telefonen.
|
|
||||||
ErrorOnSend=Det uppstod ett fel sändning:
|
|
||||||
LoginRequired=Kräver inloggning för att skicka länken.
|
|
||||||
LoginSuccessful=Du har loggat in
|
|
||||||
DeviceNotRegistered=Du måste installera chrometophone.apk på telefonen registrerad i detta Gmail-konto
|
|
||||||
LogoutSuccessful=Du är utloggad
|
|
||||||
marketLink=Market Link
|
|
||||||
smsLink=SMS nummer
|
|
||||||
smstoLink=SMS nummer
|
|
||||||
telLink=Telefonnummer
|
|
||||||
InvalidFile=Not a valid file
|
|
||||||
SendFileToPhone=Send files to your phone.
|
|
||||||
SendFolderToPhone=Send a folder to your phone.
|
|
||||||
qrTitle=QR Image Link
|
|
||||||
ConfirmQR=A QR image has been detected\n"%s"\nDo you want to send that instead of the page?
|
|
||||||
RememberMyDecision=Remember my decision
|
|
||||||
qrContextMenu=Send "%s" to Android
|
|
||||||
FileUploadsDisabled=It's not possible to upload files to the phone.
|
|
||||||
FileTooBig=The file is too big.
|
|
||||||
videoTitle=Video Link
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "Compressing folder">
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<!ENTITY sendtophoneToolbarButton.label "Fox To Phone<6E><65><EFBFBD><EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneToolbarButton.tooltip "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD>İ<EFBFBD><EFBFBD>ֻ<EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContext.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD>ֻ<EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContext.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextImage.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD>ֻ<EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContextImage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextText.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD>ֻ<EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContextText.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextPage.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD>İ<EFBFBD><EFBFBD>ֻ<EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContextPage.accesskey "A">
|
|
||||||
<!ENTITY sendtophoneContextLogout.label "<22>˳<EFBFBD><CBB3><EFBFBD>¼">
|
|
||||||
<!ENTITY sendtophoneContextLogout.accesskey "L">
|
|
||||||
<!ENTITY sendtophoneOptions.title "Fox To Phone <20><><EFBFBD><EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneProtocols.label "Э<><D0AD>">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.label "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>...">
|
|
||||||
<!ENTITY sendtophoneContextSendFile.accesskey "S">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.label "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>...">
|
|
||||||
<!ENTITY sendtophoneContextSendFolder.accesskey "F">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.label "<22>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD>QR<51><52><EFBFBD>ӷ<EFBFBD><D3B7>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ֻ<EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContextQrImage.accesskey "Q">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.label "<22><><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContextSendClipboard.accesskey "C">
|
|
||||||
<!ENTITY sendtophoneContextVideo.label "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD>ֻ<EFBFBD>">
|
|
||||||
<!ENTITY sendtophoneContextVideo.accesskey "V">
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extensions.sendtophone@martinezdelizarrondo.com.description=发送当前页面到您的Android手机
|
|
||||||
SendToPhoneTitle=Fox To Phone
|
|
||||||
InvalidScheme=无效的计划,请只发送http://或https:/ /链接。
|
|
||||||
InfoSent=该链接已发送到您的手机。
|
|
||||||
ErrorOnSend=发生一个错误发送:
|
|
||||||
LoginRequired=登录后才可发送链接。
|
|
||||||
LoginSuccessful=您已登录
|
|
||||||
DeviceNotRegistered=您必须安装chrometophone.apk在您的手机从而注册此Gmail帐户
|
|
||||||
LogoutSuccessful=您已经登出
|
|
||||||
marketLink=市场链接
|
|
||||||
smsLink=SMS号码
|
|
||||||
smstoLink=SMS号码
|
|
||||||
telLink=电话号码
|
|
||||||
InvalidFile=不是一个有效的文件
|
|
||||||
SendFileToPhone=发送文件到您的手机。
|
|
||||||
SendFolderToPhone=发送到您的手机文件夹。
|
|
||||||
qrTitle=QR图像链接
|
|
||||||
ConfirmQR=一个QR图像被检测到了\n"%s"\n发送QR图像代替此页?
|
|
||||||
RememberMyDecision=记住我的决定
|
|
||||||
qrContextMenu=发送“%s”给Android
|
|
||||||
FileUploadsDisabled=不能上传文件到手机上。
|
|
||||||
FileTooBig=该文件太大了。
|
|
||||||
videoTitle=视频链接
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!ENTITY compressing.label "ѹ<><D1B9><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>">
|
|
||||||
BIN
third_party/firefox_sendtophone/chrome/skin/icon.png
vendored
BIN
third_party/firefox_sendtophone/chrome/skin/icon.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 2.7 KiB |
@@ -1,32 +0,0 @@
|
|||||||
#sendtophone-toolbar-button
|
|
||||||
{
|
|
||||||
list-style-image: url("chrome://sendtophone/skin/toolbar-button.png");
|
|
||||||
-moz-image-region: rect(0px 24px 24px 0px);
|
|
||||||
}
|
|
||||||
#sendtophone-toolbar-button:hover
|
|
||||||
{
|
|
||||||
-moz-image-region: rect(24px 24px 48px 0px);
|
|
||||||
}
|
|
||||||
[iconsize="small"] #sendtophone-toolbar-button
|
|
||||||
{
|
|
||||||
-moz-image-region: rect( 0px 40px 16px 24px);
|
|
||||||
}
|
|
||||||
[iconsize="small"] #sendtophone-toolbar-button:hover
|
|
||||||
{
|
|
||||||
-moz-image-region: rect(24px 40px 40px 24px);
|
|
||||||
}
|
|
||||||
|
|
||||||
#sendtophone-toolbar-button:-moz-drag-over {
|
|
||||||
border: 1px solid black;
|
|
||||||
}
|
|
||||||
|
|
||||||
#context-sendtophone-link,
|
|
||||||
#context-sendtophone-image,
|
|
||||||
#context-sendtophone-qrimage,
|
|
||||||
#context-sendtophone-text,
|
|
||||||
#context-sendtophone-page
|
|
||||||
{
|
|
||||||
-moz-binding: url(chrome://global/content/bindings/menu.xml#menuitem-iconic) !important;
|
|
||||||
list-style-image: url("chrome://sendtophone/skin/toolbar-button.png") !important;
|
|
||||||
-moz-image-region: rect( 0px 40px 16px 24px) !important;
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.9 KiB |
@@ -1,63 +0,0 @@
|
|||||||
#UploadsBox {
|
|
||||||
-moz-appearance: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
border-width: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Upload View Items */
|
|
||||||
richlistitem[type="upload"] {
|
|
||||||
padding: 5px;
|
|
||||||
min-height: 44px !important;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
richlistitem[type="upload"]:not([selected="true"]):nth-child(odd) {
|
|
||||||
background-color: -moz-oddtreerow;
|
|
||||||
}
|
|
||||||
|
|
||||||
richlistitem[type="upload"] .status {
|
|
||||||
font-size: smaller;
|
|
||||||
color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
richlistitem[selected="true"][type="upload"] {
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
richlistbox:focus > richlistitem[selected="true"][type="upload"] .status {
|
|
||||||
color: highlighttext;
|
|
||||||
}
|
|
||||||
|
|
||||||
richlistitem[type="upload"] button {
|
|
||||||
-moz-appearance: none;
|
|
||||||
min-height: 16px;
|
|
||||||
min-width: 16px;
|
|
||||||
max-height: 16px;
|
|
||||||
max-width: 16px;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0 1px 0 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Images for buttons in the interface
|
|
||||||
*/
|
|
||||||
richlistitem[type="upload"] button {
|
|
||||||
list-style-image: url(chrome://mozapps/skin/downloads/buttons.png);
|
|
||||||
}
|
|
||||||
.cancel {
|
|
||||||
-moz-image-region: rect(0px, 16px, 16px, 0px);
|
|
||||||
}
|
|
||||||
.cancel:hover {
|
|
||||||
-moz-image-region: rect(0px, 32px, 16px, 16px);
|
|
||||||
}
|
|
||||||
.cancel:hover:active {
|
|
||||||
-moz-image-region: rect(0px, 48px, 16px, 32px);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* prevent flickering when changing states */
|
|
||||||
.uploadTypeIcon {
|
|
||||||
min-height: 32px;
|
|
||||||
min-width: 32px;
|
|
||||||
-moz-padding-end: 2px;
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
pref("extensions.sendtophone.installedButton", false);
|
|
||||||
pref("extensions.sendtophone.appUrl", "https://chrometophone.appspot.com");
|
|
||||||
|
|
||||||
pref("extensions.sendtophone.proxyUrl", "http://foxtophone.com/f2p.php?link=");
|
|
||||||
pref("extensions.sendtophone.fileServerUrl", "");
|
|
||||||
pref("extensions.sendtophone.fileUploadMaxKb", 50000);
|
|
||||||
pref("extensions.sendtophone.SearchQR", 0); // 0: search and prompt, 1: search and launch automatically, 2: don't search
|
|
||||||
|
|
||||||
pref("extensions.sendtophone.protocols.market", true);
|
|
||||||
pref("extensions.sendtophone.protocols.sms", true);
|
|
||||||
pref("extensions.sendtophone.protocols.smsto", true);
|
|
||||||
pref("extensions.sendtophone.protocols.tel", true);
|
|
||||||
|
|
||||||
// https://developer.mozilla.org/en/Localizing_extension_descriptions
|
|
||||||
pref("extensions.sendtophone@martinezdelizarrondo.com.description", "chrome://sendtophone/locale/overlay.properties");
|
|
||||||
34
third_party/firefox_sendtophone/install.rdf
vendored
34
third_party/firefox_sendtophone/install.rdf
vendored
@@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
|
|
||||||
<Description about="urn:mozilla:install-manifest">
|
|
||||||
<em:id>sendtophone@martinezdelizarrondo.com</em:id>
|
|
||||||
<em:type>2</em:type>
|
|
||||||
<em:name>Fox To Phone</em:name>
|
|
||||||
<em:version>1.1.2beta4</em:version>
|
|
||||||
<em:creator>Alfonso & Patrick</em:creator>
|
|
||||||
<em:description>Send links to your Android 2.2 phone using the new C2DM service. Based on the ChromeToPhone extension.</em:description>
|
|
||||||
|
|
||||||
<em:iconURL>chrome://sendtophone/skin/icon.png</em:iconURL>
|
|
||||||
<em:homepageURL>http://www.foxtophone.com</em:homepageURL>
|
|
||||||
<em:optionsURL>chrome://sendtophone/content/options.xul</em:optionsURL>
|
|
||||||
<em:contributor>Anil K Solanki (icons)</em:contributor>
|
|
||||||
<em:contributor>BabelZilla translators:</em:contributor>
|
|
||||||
<em:contributor>markh van BabelZilla.org (Dutch)</em:contributor>
|
|
||||||
<em:contributor>Goofy (French)</em:contributor>
|
|
||||||
<em:contributor>Emanuel S. (German)</em:contributor>
|
|
||||||
<em:contributor>ДакСРБИЈА (Serbian)</em:contributor>
|
|
||||||
<em:contributor>Martin Zubek (Czech)</em:contributor>
|
|
||||||
<em:contributor>mjy (Japanese)</em:contributor>
|
|
||||||
<em:contributor>Marcelo Ghelman (ghelman.net) (Portuguese (Brazilian))</em:contributor>
|
|
||||||
<em:contributor>LA (Russian)</em:contributor>
|
|
||||||
<em:contributor>yongdong7 (Chinese simplified)</em:contributor>
|
|
||||||
|
|
||||||
<em:targetApplication>
|
|
||||||
<Description>
|
|
||||||
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- Firefox -->
|
|
||||||
<em:minVersion>3.5</em:minVersion>
|
|
||||||
<em:maxVersion>6.0a1</em:maxVersion>
|
|
||||||
</Description>
|
|
||||||
</em:targetApplication>
|
|
||||||
</Description>
|
|
||||||
</RDF>
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
/* This js module doesn't export anything, it's meant to handle the protocol registration/unregistration */
|
|
||||||
var EXPORTED_SYMBOLS = [];
|
|
||||||
|
|
||||||
const Cc = Components.classes;
|
|
||||||
const Ci = Components.interfaces;
|
|
||||||
|
|
||||||
var manager = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
|
||||||
var strings = Cc["@mozilla.org/intl/stringbundle;1"]
|
|
||||||
.getService(Ci.nsIStringBundleService)
|
|
||||||
.createBundle("chrome://sendtophone/locale/overlay.properties");
|
|
||||||
|
|
||||||
// Utility function to handle the preferences
|
|
||||||
// https://developer.mozilla.org/en/Code_snippets/Preferences
|
|
||||||
function PrefListener(branchName, func) {
|
|
||||||
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
|
|
||||||
.getService(Ci.nsIPrefService);
|
|
||||||
var branch = prefService.getBranch(branchName);
|
|
||||||
branch.QueryInterface(Components.interfaces.nsIPrefBranch2);
|
|
||||||
|
|
||||||
this.register = function() {
|
|
||||||
branch.addObserver("", this, false);
|
|
||||||
branch.getChildList("", { })
|
|
||||||
.forEach(function (name) { func(branch, name); });
|
|
||||||
};
|
|
||||||
|
|
||||||
this.unregister = function unregister() {
|
|
||||||
if (branch)
|
|
||||||
branch.removeObserver("", this);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.observe = function(subject, topic, data) {
|
|
||||||
if (topic == "nsPref:changed")
|
|
||||||
func(branch, data);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// our XPCOM components to handle the protocols
|
|
||||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
||||||
|
|
||||||
function SendToPhone_ProtocolWrapper( properties )
|
|
||||||
{
|
|
||||||
var myHandler = function() {};
|
|
||||||
|
|
||||||
myHandler.prototype = {
|
|
||||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolHandler]),
|
|
||||||
|
|
||||||
_xpcom_factory: {
|
|
||||||
singleton: null,
|
|
||||||
createInstance: function (aOuter, aIID) {
|
|
||||||
if (aOuter) throw Components.results.NS_ERROR_NO_AGGREGATION;
|
|
||||||
|
|
||||||
if (!this.singleton) this.singleton = new myHandler();
|
|
||||||
return this.singleton.QueryInterface(aIID);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// nsIProtocolHandler implementation:
|
|
||||||
|
|
||||||
// default attributes
|
|
||||||
protocolFlags : Ci.nsIProtocolHandler.URI_LOADABLE_BY_ANYONE,
|
|
||||||
defaultPort : -1,
|
|
||||||
|
|
||||||
newURI : function(aSpec, aCharset, aBaseURI)
|
|
||||||
{
|
|
||||||
var uri = Components.classes["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI);
|
|
||||||
uri.spec = aSpec;
|
|
||||||
return uri;
|
|
||||||
},
|
|
||||||
|
|
||||||
newChannel : function(aURI)
|
|
||||||
{
|
|
||||||
var myURI = decodeURI(aURI.spec);
|
|
||||||
|
|
||||||
// Core functions loaded on demand
|
|
||||||
if (typeof sendtophoneCore == "undefined")
|
|
||||||
Components.utils.import("resource://sendtophone/sendtophone.js");
|
|
||||||
|
|
||||||
sendtophoneCore.send(this.linkTitle, myURI, "")
|
|
||||||
|
|
||||||
// return a fake empty channel so current window doesn't change
|
|
||||||
return Components.classes[ "@mozilla.org/network/input-stream-channel;1" ].createInstance(Ci.nsIChannel);
|
|
||||||
},
|
|
||||||
scheme : properties.scheme,
|
|
||||||
classDescription : "SendToPhone handler for " + properties.scheme,
|
|
||||||
classID : Components.ID( properties.ID ),
|
|
||||||
contractID : "@mozilla.org/network/protocol;1?name=" + properties.scheme,
|
|
||||||
linkTitle : strings.GetStringFromName( properties.scheme + "Link" ) // Translations
|
|
||||||
}
|
|
||||||
|
|
||||||
return myHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function takes care of register/unregister the protocol handlers as requested
|
|
||||||
// It's called when the preferences change.
|
|
||||||
function toggleProtocolHandler(branch, name)
|
|
||||||
{
|
|
||||||
// Get the value in preferences
|
|
||||||
var register = branch.getBoolPref(name);
|
|
||||||
// Retrieve the object for that protocol
|
|
||||||
var protocolHandler = sendToPhoneProtocols[ name ];
|
|
||||||
// If someone did change the defaults for mms or mmsto this
|
|
||||||
// function will be called, but the handlers have been removed.
|
|
||||||
if (!protocolHandler)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var proto = protocolHandler.prototype;
|
|
||||||
|
|
||||||
if (register)
|
|
||||||
{
|
|
||||||
if (!protocolHandler.registered)
|
|
||||||
manager.registerFactory(proto.classID,
|
|
||||||
proto.classDescription,
|
|
||||||
proto.contractID,
|
|
||||||
proto._xpcom_factory);
|
|
||||||
|
|
||||||
protocolHandler.registered = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (protocolHandler.registered)
|
|
||||||
manager.unregisterFactory(proto.classID, proto._xpcom_factory);
|
|
||||||
protocolHandler.registered = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each protocol handler
|
|
||||||
var sendToPhoneProtocols = {
|
|
||||||
market: SendToPhone_ProtocolWrapper( { scheme: "market", ID: "{751de080-95d1-11df-981c-0800200c9a66}" } ) ,
|
|
||||||
sms: SendToPhone_ProtocolWrapper( { scheme: "sms", ID: "{345de080-95d1-11df-981c-0800200c9a66}" } ) ,
|
|
||||||
smsto: SendToPhone_ProtocolWrapper( { scheme: "smsto", ID: "{854de080-95d1-11df-981c-0800200c9a66}" } ) ,
|
|
||||||
tel: SendToPhone_ProtocolWrapper( { scheme: "tel", ID: "{948de080-95d1-11df-981c-0800200c9a66}" } )
|
|
||||||
};
|
|
||||||
|
|
||||||
// Listen for changes in the preferences and register the protocols as needed.
|
|
||||||
var preferencesListener = new PrefListener("extensions.sendtophone.protocols.", toggleProtocolHandler);
|
|
||||||
preferencesListener.register();
|
|
||||||
@@ -1,522 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2010 Alfonso Martínez de Lizarrondo & Patrick O'Reilly
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// https://developer.mozilla.org/en/JavaScript_code_modules/Using_JavaScript_code_modules
|
|
||||||
var EXPORTED_SYMBOLS = ["sendtophoneCore"];
|
|
||||||
|
|
||||||
const Cc = Components.classes;
|
|
||||||
const Ci = Components.interfaces;
|
|
||||||
|
|
||||||
var sendtophoneCore = {
|
|
||||||
req : null,
|
|
||||||
apiVersion : 4,
|
|
||||||
loggedInUrl : "http://code.google.com/p/chrometophone/logo?login",
|
|
||||||
loggedOutUrl : "http://code.google.com/p/chrometophone/logo?logout",
|
|
||||||
apkUrl : "http://code.google.com/p/chrometophone/wiki/AndroidApp",
|
|
||||||
retryCount : 0,
|
|
||||||
|
|
||||||
init: function()
|
|
||||||
{
|
|
||||||
this.strings = Cc["@mozilla.org/intl/stringbundle;1"]
|
|
||||||
.getService(Ci.nsIStringBundleService)
|
|
||||||
.createBundle("chrome://sendtophone/locale/overlay.properties");
|
|
||||||
|
|
||||||
this.prefs = Cc["@mozilla.org/preferences-service;1"]
|
|
||||||
.getService(Ci.nsIPrefService)
|
|
||||||
.getBranch("extensions.sendtophone.") ;
|
|
||||||
|
|
||||||
// Allow the people to use their own server if they prefer to not trust this server
|
|
||||||
var baseUrl = this.prefs.getCharPref( "appUrl" ) ;
|
|
||||||
|
|
||||||
this.sendUrl = baseUrl + '/send?ver=' + this.apiVersion;
|
|
||||||
this.logInUrl = baseUrl + '/signin?ver=' + this.apiVersion + '&extret=' + encodeURIComponent(this.loggedInUrl);
|
|
||||||
this.logOutUrl = baseUrl + '/signout?ver=' + this.apiVersion + '&extret=' + encodeURIComponent(this.loggedOutUrl);
|
|
||||||
},
|
|
||||||
|
|
||||||
getString: function(name)
|
|
||||||
{
|
|
||||||
return this.strings.GetStringFromName(name);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Shows a message in a modal alert
|
|
||||||
alert: function(text)
|
|
||||||
{
|
|
||||||
var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"]
|
|
||||||
.getService(Ci.nsIPromptService);
|
|
||||||
promptService.alert(null, this.getString("SendToPhoneTitle"),
|
|
||||||
text);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Shows a message in a growl-like notification
|
|
||||||
popupNotification: function(text)
|
|
||||||
{
|
|
||||||
var title = this.getString("SendToPhoneTitle");
|
|
||||||
var image = "chrome://sendtophone/skin/icon.png";
|
|
||||||
try {
|
|
||||||
// Avoid crash on Fedora 12.
|
|
||||||
// Reported on 8th June https://addons.mozilla.org/en-US/firefox/reviews/display/161941
|
|
||||||
var listener = {
|
|
||||||
observe: function(subject, topic, data) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
Cc['@mozilla.org/alerts-service;1']
|
|
||||||
.getService(Ci.nsIAlertsService)
|
|
||||||
.showAlertNotification(image, title, text, false, '', listener);
|
|
||||||
} catch(e)
|
|
||||||
{
|
|
||||||
// prevents runtime error on platforms that don't implement nsIAlertsService
|
|
||||||
var win = Cc['@mozilla.org/embedcomp/window-watcher;1']
|
|
||||||
.getService(Ci.nsIWindowWatcher)
|
|
||||||
.openWindow(null, 'chrome://global/content/alerts/alert.xul',
|
|
||||||
'_blank', 'chrome,titlebar=no,popup=yes', null);
|
|
||||||
win.arguments = [image, title, text, false, ''];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// For use while debugging
|
|
||||||
toConsole: function(text)
|
|
||||||
{
|
|
||||||
var aConsoleService = Cc["@mozilla.org/consoleservice;1"]
|
|
||||||
.getService(Ci.nsIConsoleService);
|
|
||||||
|
|
||||||
aConsoleService.logStringMessage( text );
|
|
||||||
},
|
|
||||||
|
|
||||||
processXHR: function(url, method, data, callback)
|
|
||||||
{
|
|
||||||
var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
|
|
||||||
.createInstance(Ci.nsIXMLHttpRequest);
|
|
||||||
|
|
||||||
req.open(method, url, true);
|
|
||||||
req.setRequestHeader('X-Same-Domain', 'true'); // XSRF protector
|
|
||||||
|
|
||||||
if (method=='POST')
|
|
||||||
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
req.onreadystatechange = function()
|
|
||||||
{
|
|
||||||
// here this == req
|
|
||||||
if (this.readyState == 4)
|
|
||||||
{
|
|
||||||
var body = req.responseText;
|
|
||||||
if (req.status == 200)
|
|
||||||
{
|
|
||||||
// Check if the body is a html redirect
|
|
||||||
var redirectMatch = body.match(/<meta http-equiv="refresh" content="\d;\s*url=(')?(.*)\1">/);
|
|
||||||
if (redirectMatch)
|
|
||||||
{
|
|
||||||
var redirectUrl = redirectMatch[2].replace(/&/g, '&');
|
|
||||||
if (redirectUrl == sendtophoneCore.loggedOutUrl)
|
|
||||||
{
|
|
||||||
sendtophoneCore.logoutSuccessful();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Do the redirect and use the original callback
|
|
||||||
sendtophoneCore.processXHR( redirectUrl, 'GET', null, callback);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
callback.call( sendtophoneCore, req );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (req.status==500 && body.substr(0,27) =="ERROR (Unable to send link)"){
|
|
||||||
sendtophoneCore.openTab( "http://www.foxtophone.com/help/error-500/" );
|
|
||||||
}
|
|
||||||
else if (req.status==400&&this.retryCount<4){
|
|
||||||
this.retryCount++;
|
|
||||||
this.processXHR(this.sendUrl, 'POST', this.pendingMessage, this.processSentData);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sendtophoneCore.alert(sendtophoneCore.getString("ErrorOnSend") + ' (status ' + req.status + ')\r\n' + body);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// To send correctly cookies.
|
|
||||||
// Force the request to include cookies even though this chrome code
|
|
||||||
// is seen as a third-party, so the server knows the user for which we are
|
|
||||||
// requesting favorites (or anything else user-specific in the future).
|
|
||||||
// This only works in Firefox 3.6; in Firefox 3.5 the request will instead
|
|
||||||
// fail to send cookies if the user has disabled third-party cookies.
|
|
||||||
try {
|
|
||||||
req.channel.QueryInterface(Ci.nsIHttpChannelInternal).
|
|
||||||
forceAllowThirdPartyCookie = true;
|
|
||||||
}
|
|
||||||
catch(ex) { /* user is using Firefox 3.5 */ }
|
|
||||||
|
|
||||||
req.send( data );
|
|
||||||
},
|
|
||||||
|
|
||||||
// Main function
|
|
||||||
// This is method that has to be called from outside this module
|
|
||||||
// The other available method is sendFile
|
|
||||||
send: function(title, url, selection)
|
|
||||||
{
|
|
||||||
if (!this.sendUrl)
|
|
||||||
this.init();
|
|
||||||
|
|
||||||
// Local files: upload them to a web server
|
|
||||||
if ((/^file:/i).test(url))
|
|
||||||
{
|
|
||||||
var nsFile = Cc["@mozilla.org/network/io-service;1"]
|
|
||||||
.getService(Ci.nsIIOService)
|
|
||||||
.getProtocolHandler("file")
|
|
||||||
.QueryInterface(Ci.nsIFileProtocolHandler)
|
|
||||||
.getFileFromURLSpec(url);
|
|
||||||
this.sendFile(nsFile);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(/^(https?|market|tel|sms(to)?|mailto|ftp):/i).test( url ))
|
|
||||||
{
|
|
||||||
this.alert(this.getString("InvalidScheme"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var max_length = 1024;
|
|
||||||
if (selection.length > max_length)
|
|
||||||
selection = selection.substring(0, max_length);
|
|
||||||
|
|
||||||
// Send the protocols that aren't currently whitelisted through a proxy server
|
|
||||||
if (!(/^(https?):/i).test( url ))
|
|
||||||
{
|
|
||||||
// Rewrite the URI so it's send first to the proxy
|
|
||||||
var proxyUrl;
|
|
||||||
proxyUrl = this.prefs.getCharPref( "proxyUrl" );
|
|
||||||
if (proxyUrl)
|
|
||||||
url = proxyUrl + encodeURIComponent( url);
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = 'title=' + encodeURIComponent(title) +
|
|
||||||
'&url=' + encodeURIComponent(url) + '&sel=' + encodeURIComponent(selection);
|
|
||||||
|
|
||||||
this.pendingMessage = data;
|
|
||||||
this.processXHR(this.sendUrl, 'POST', data, this.processSentData);
|
|
||||||
},
|
|
||||||
|
|
||||||
processSentData : function(req)
|
|
||||||
{
|
|
||||||
var body = req.responseText;
|
|
||||||
|
|
||||||
if (body.substring(0, 2) == 'OK')
|
|
||||||
{
|
|
||||||
delete this.pendingMessage;
|
|
||||||
this.retryCount=0;
|
|
||||||
this.popupNotification(this.getString("InfoSent"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (body.indexOf('LOGIN_REQUIRED') == 0)
|
|
||||||
{
|
|
||||||
this.popupNotification( this.getString("LoginRequired") );
|
|
||||||
|
|
||||||
//Open Google login page and close tab when done
|
|
||||||
this.openTab(this.logInUrl, this.loggedInUrl, function() {sendtophoneCore.loginSuccessful();} );
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (body.indexOf('DEVICE_NOT_REGISTERED') == 0)
|
|
||||||
{
|
|
||||||
this.popupNotification(this.getString("DeviceNotRegistered"));
|
|
||||||
|
|
||||||
// Open tab with apk download
|
|
||||||
this.openTab(this.apkUrl);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.alert(this.getString("ErrorOnSend") + '\r\n' + body);
|
|
||||||
},
|
|
||||||
|
|
||||||
logout: function()
|
|
||||||
{
|
|
||||||
if (!this.prefs)
|
|
||||||
this.init();
|
|
||||||
|
|
||||||
// Open Google logout page, and close tab when finished
|
|
||||||
this.openTab(this.logOutUrl, this.loggedOutUrl, function() {sendtophoneCore.logoutSuccessful();} );
|
|
||||||
|
|
||||||
/*
|
|
||||||
// This doesn't work if third party cookies are bloqued. Why???
|
|
||||||
this.processXHR(this.logOutUrl, 'GET', null, function(req)
|
|
||||||
{
|
|
||||||
// This will be called only if there's a problem
|
|
||||||
this.alert(this.getString("LogoutError") + '\r\n' + req.responseText );
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
},
|
|
||||||
|
|
||||||
openTab: function(url, successUrl, callback)
|
|
||||||
{
|
|
||||||
var gBrowser = Cc["@mozilla.org/appshell/window-mediator;1"]
|
|
||||||
.getService(Ci.nsIWindowMediator)
|
|
||||||
.getMostRecentWindow("navigator:browser")
|
|
||||||
.gBrowser;
|
|
||||||
|
|
||||||
var lastTabIndex = gBrowser.tabContainer.selectedIndex;
|
|
||||||
var tab = gBrowser.addTab(url);
|
|
||||||
gBrowser.selectedTab = tab;
|
|
||||||
|
|
||||||
if (successUrl && callback)
|
|
||||||
{
|
|
||||||
var c2pTab = gBrowser.getBrowserForTab(tab);
|
|
||||||
//Add listener for callback URL
|
|
||||||
c2pTab.addEventListener("load", function () {
|
|
||||||
if(successUrl==c2pTab.currentURI.spec){
|
|
||||||
callback();
|
|
||||||
|
|
||||||
// Close tab
|
|
||||||
gBrowser.removeTab(tab);
|
|
||||||
// ReFocus on tab being sent
|
|
||||||
gBrowser.selectedTab = gBrowser.tabContainer.childNodes[lastTabIndex];
|
|
||||||
}
|
|
||||||
}, true);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
logoutSuccessful: function()
|
|
||||||
{
|
|
||||||
this.popupNotification(this.getString("LogoutSuccessful"));
|
|
||||||
},
|
|
||||||
|
|
||||||
loginSuccessful: function()
|
|
||||||
{
|
|
||||||
this.popupNotification( this.getString("LoginSuccessful") );
|
|
||||||
|
|
||||||
// Send pending message
|
|
||||||
this.processXHR(this.sendUrl, 'POST', this.pendingMessage, this.processSentData);
|
|
||||||
},
|
|
||||||
|
|
||||||
toUTF8: function(str)
|
|
||||||
{
|
|
||||||
var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
|
|
||||||
.createInstance(Ci.nsIScriptableUnicodeConverter);
|
|
||||||
converter.charset = "utf-8";
|
|
||||||
var data = converter.ConvertFromUnicode(str);
|
|
||||||
return data + converter.Finish();
|
|
||||||
},
|
|
||||||
|
|
||||||
sendFile: function( nsFile, callback )
|
|
||||||
{
|
|
||||||
if (!this.prefs)
|
|
||||||
this.init();
|
|
||||||
|
|
||||||
let uri = this.prefs.getCharPref( "fileServerUrl" );
|
|
||||||
if (!uri)
|
|
||||||
{
|
|
||||||
this.alert( this.getString("FileUploadsDisabled") );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof sendtophoneUploadsManager == "undefined")
|
|
||||||
Components.utils.import("resource://sendtophone/uploadsManager.js");
|
|
||||||
|
|
||||||
if (nsFile.isDirectory())
|
|
||||||
{
|
|
||||||
// There's no progress notification while compressing, only on end.
|
|
||||||
let progressId = sendtophoneUploadsManager.addZip(nsFile);
|
|
||||||
// Compress the contents to a zip file
|
|
||||||
zipFolder(nsFile, function(nsZip)
|
|
||||||
{
|
|
||||||
sendtophoneUploadsManager.finishedUpload( progressId );
|
|
||||||
|
|
||||||
// Send the zip and delete it afterwards
|
|
||||||
sendtophoneCore.sendFile(nsZip, function() { nsZip.remove(false) });
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nsFile.isFile())
|
|
||||||
{
|
|
||||||
this.alert(this.getString("InvalidFile"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let size = Math.round(nsFile.fileSize / 1024);
|
|
||||||
let maxSize = this.prefs.getIntPref( "fileUploadMaxKb" );
|
|
||||||
if (maxSize>0 && size>maxSize)
|
|
||||||
{
|
|
||||||
this.alert( this.getString("FileTooBig") );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let uploadName = nsFile.leafName;
|
|
||||||
// Try to determine the MIME type of the file
|
|
||||||
var mimeType = "text/plain";
|
|
||||||
try {
|
|
||||||
var mimeService = Cc["@mozilla.org/mime;1"]
|
|
||||||
.getService(Ci.nsIMIMEService);
|
|
||||||
mimeType = mimeService.getTypeFromFile(nsFile); // nsFile is an nsIFile instance
|
|
||||||
}
|
|
||||||
catch(e) { /* eat it; just use text/plain */ }
|
|
||||||
|
|
||||||
// Buffer the upload file
|
|
||||||
var inStream = Cc["@mozilla.org/network/file-input-stream;1"]
|
|
||||||
.createInstance(Ci.nsIFileInputStream);
|
|
||||||
inStream.init(nsFile, 1, 1, inStream.CLOSE_ON_EOF);
|
|
||||||
var bufInStream = Cc["@mozilla.org/network/buffered-input-stream;1"]
|
|
||||||
.createInstance(Ci.nsIBufferedInputStream);
|
|
||||||
bufInStream.init(inStream, 4096);
|
|
||||||
|
|
||||||
//Setup the boundary start stream
|
|
||||||
var boundary = "--SendToPhone-------------" + Math.random();
|
|
||||||
var startBoundryStream = Cc["@mozilla.org/io/string-input-stream;1"]
|
|
||||||
.createInstance(Ci.nsIStringInputStream);
|
|
||||||
startBoundryStream.setData("\r\n--"+boundary+"\r\n",-1);
|
|
||||||
|
|
||||||
// Setup the boundary end stream
|
|
||||||
var endBoundryStream = Cc["@mozilla.org/io/string-input-stream;1"]
|
|
||||||
.createInstance(Ci.nsIStringInputStream);
|
|
||||||
endBoundryStream.setData("\r\n--"+boundary+"--",-1);
|
|
||||||
|
|
||||||
// Setup the mime-stream - the 'part' of a multi-part mime type
|
|
||||||
var mimeStream = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci.nsIMIMEInputStream);
|
|
||||||
mimeStream.addContentLength = false;
|
|
||||||
mimeStream.addHeader("Content-disposition","form-data; charset: utf-8; name=\"upload\"; filename=\"" + this.toUTF8(uploadName) + "\"");
|
|
||||||
mimeStream.addHeader("Content-type", mimeType);
|
|
||||||
mimeStream.setData(bufInStream);
|
|
||||||
|
|
||||||
// Setup a multiplex stream
|
|
||||||
var multiStream = Cc["@mozilla.org/io/multiplex-input-stream;1"]
|
|
||||||
.createInstance(Ci.nsIMultiplexInputStream);
|
|
||||||
multiStream.appendStream(startBoundryStream);
|
|
||||||
multiStream.appendStream(mimeStream);
|
|
||||||
multiStream.appendStream(endBoundryStream);
|
|
||||||
|
|
||||||
var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
|
|
||||||
.createInstance(Ci.nsIXMLHttpRequest);
|
|
||||||
|
|
||||||
// Show the progress of uploads
|
|
||||||
sendtophoneUploadsManager.addUpload(nsFile, req);
|
|
||||||
|
|
||||||
req.open('POST', uri, true);
|
|
||||||
|
|
||||||
req.setRequestHeader("Content-length",multiStream.available());
|
|
||||||
req.setRequestHeader("Content-type","multipart/form-data; charset: utf-8; boundary="+boundary);
|
|
||||||
req.addEventListener("load", function(event)
|
|
||||||
{
|
|
||||||
// If there's a callback (to delete temporary files) we call it now
|
|
||||||
if (callback)
|
|
||||||
callback();
|
|
||||||
|
|
||||||
var body = event.target.responseXML;
|
|
||||||
var uploads;
|
|
||||||
if (body && (uploads = body.documentElement.getElementsByTagName("upload")))
|
|
||||||
{
|
|
||||||
var data = uploads[0].firstChild.data;
|
|
||||||
// sendtophoneCore.toConsole(data);
|
|
||||||
sendtophoneCore.send(uploadName, data, "");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// error.
|
|
||||||
sendtophoneCore.alert(uri + "\r\n" + event.target.responseText);
|
|
||||||
}, false);
|
|
||||||
// Handle errors or aborted uploads
|
|
||||||
req.addEventListener("error", function(evt)
|
|
||||||
{
|
|
||||||
sendtophoneCore.alert("Error while sending the file to the server:\r\n" + uri);
|
|
||||||
|
|
||||||
// If there's a callback (to delete temporary files) we call it now
|
|
||||||
if (callback)
|
|
||||||
callback();
|
|
||||||
}, false);
|
|
||||||
req.addEventListener("abort", function(evt)
|
|
||||||
{
|
|
||||||
// Silent.
|
|
||||||
|
|
||||||
// If there's a callback (to delete temporary files) we call it now
|
|
||||||
if (callback)
|
|
||||||
callback();
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
/*
|
|
||||||
if required for cookies... don't think so.
|
|
||||||
try {
|
|
||||||
req.channel.QueryInterface(Ci.nsIHttpChannelInternal).
|
|
||||||
forceAllowThirdPartyCookie = true;
|
|
||||||
}
|
|
||||||
catch(ex) {}
|
|
||||||
*/
|
|
||||||
req.send(multiStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Zipping functions */
|
|
||||||
const PR_RDONLY = 0x01;
|
|
||||||
const PR_WRONLY = 0x02;
|
|
||||||
const PR_RDWR = 0x04;
|
|
||||||
const PR_CREATE_FILE = 0x08;
|
|
||||||
const PR_APPEND = 0x10;
|
|
||||||
const PR_TRUNCATE = 0x20;
|
|
||||||
const PR_SYNC = 0x40;
|
|
||||||
const PR_EXCL = 0x80;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* folder is a nsFile pointing to a folder
|
|
||||||
* callback is a function that it's called after the zip is created. It has one parameter: the nsFile created
|
|
||||||
*/
|
|
||||||
function zipFolder(folder, callback)
|
|
||||||
{
|
|
||||||
// get TMP directory
|
|
||||||
var nsFile = Cc["@mozilla.org/file/directory_service;1"].
|
|
||||||
getService(Ci.nsIProperties).
|
|
||||||
get("TmpD", Ci.nsIFile);
|
|
||||||
|
|
||||||
// Create a new file
|
|
||||||
nsFile.append( folder.leafName + ".zip");
|
|
||||||
nsFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
|
|
||||||
|
|
||||||
var zipWriter = Components.Constructor("@mozilla.org/zipwriter;1", "nsIZipWriter");
|
|
||||||
var zipW = new zipWriter();
|
|
||||||
|
|
||||||
zipW.open(nsFile, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE);
|
|
||||||
|
|
||||||
addFolderContentsToZip(zipW, folder, "");
|
|
||||||
|
|
||||||
// We don't want to block the main thread, so the zipping is done asynchronously
|
|
||||||
// and here we get the notification that it has finished
|
|
||||||
var observer = {
|
|
||||||
onStartRequest: function(request, context) {},
|
|
||||||
onStopRequest: function(request, context, status)
|
|
||||||
{
|
|
||||||
zipW.close();
|
|
||||||
// Notify that we're done. Now it must be sent and deleted afterwards
|
|
||||||
callback(nsFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
zipW.processQueue(observer, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* function to add the contents of a folder recursively
|
|
||||||
* zipW a nsIZipWriter object
|
|
||||||
* folder a nsFile object pointing to a folder
|
|
||||||
* root a string defining the relative path for this folder in the zip
|
|
||||||
*/
|
|
||||||
function addFolderContentsToZip(zipW, folder, root)
|
|
||||||
{
|
|
||||||
var entries = folder.directoryEntries;
|
|
||||||
while(entries.hasMoreElements())
|
|
||||||
{
|
|
||||||
var entry = entries.getNext();
|
|
||||||
entry.QueryInterface(Ci.nsIFile);
|
|
||||||
zipW.addEntryFile(root + entry.leafName, Ci.nsIZipWriter.COMPRESSION_DEFAULT, entry, true);
|
|
||||||
if (entry.isDirectory())
|
|
||||||
addFolderContentsToZip(zipW, entry, root + entry.leafName + "/");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,278 +0,0 @@
|
|||||||
var EXPORTED_SYMBOLS = ["sendtophoneUploadsManager"];
|
|
||||||
|
|
||||||
const Cc = Components.classes;
|
|
||||||
const Ci = Components.interfaces;
|
|
||||||
|
|
||||||
var sendtophoneUploadsManager = {
|
|
||||||
uploads: {},
|
|
||||||
_counter : 0,
|
|
||||||
|
|
||||||
_listeners: [],
|
|
||||||
|
|
||||||
// Add a listener that will be called when there's any change on the uploads
|
|
||||||
addListener: function( obj )
|
|
||||||
{
|
|
||||||
this._listeners.push( obj );
|
|
||||||
},
|
|
||||||
|
|
||||||
// Remove an existing listener object
|
|
||||||
removeListener: function( obj )
|
|
||||||
{
|
|
||||||
for(let i=0, listener; listener = this._listeners[i]; i++)
|
|
||||||
{
|
|
||||||
if (obj == listener)
|
|
||||||
{
|
|
||||||
this._listeners.splice(i, 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a new upload
|
|
||||||
* nsFile: The file that it's being send
|
|
||||||
* req: the XmlHttpRequest that will send that file
|
|
||||||
*/
|
|
||||||
addUpload: function(nsFile, req)
|
|
||||||
{
|
|
||||||
let id = this._addToUploads( {file:nsFile, req:req, state:0, percent:0,
|
|
||||||
startTime: Date.now() - 100, currBytes: 0, maxBytes: nsFile.fileSize} );
|
|
||||||
|
|
||||||
req.upload.addEventListener("progress", function(evt)
|
|
||||||
{
|
|
||||||
if (evt.lengthComputable) {
|
|
||||||
sendtophoneUploadsManager.updateProgress(id, evt.loaded, evt.total);
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
req.upload.addEventListener("load", function(evt)
|
|
||||||
{
|
|
||||||
sendtophoneUploadsManager.updateProgress(id, evt.loaded, evt.total);
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
// Clear row when it has finished
|
|
||||||
req.addEventListener("load", function(evt)
|
|
||||||
{
|
|
||||||
sendtophoneUploadsManager.finishedUpload(id);
|
|
||||||
}, false);
|
|
||||||
// If there's an error or it's aborted, finish its tracking.
|
|
||||||
req.addEventListener("error", function(evt)
|
|
||||||
{
|
|
||||||
sendtophoneUploadsManager.finishedUpload(id);
|
|
||||||
}, false);
|
|
||||||
req.addEventListener("abort", function(evt)
|
|
||||||
{
|
|
||||||
sendtophoneUploadsManager.finishedUpload(id);
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a zip (it's not an upload, but this way we can show that something is going on)
|
|
||||||
* nsFolder: a nsFile object pointing to the folder being compressed
|
|
||||||
* When the compression has finished, the external code has to call .finishedUpload(id)
|
|
||||||
* with the id returned in this method.
|
|
||||||
*/
|
|
||||||
addZip: function(nsFolder)
|
|
||||||
{
|
|
||||||
return this._addToUploads( {file:nsFolder, state:1} );
|
|
||||||
},
|
|
||||||
|
|
||||||
_addToUploads: function( obj )
|
|
||||||
{
|
|
||||||
initShowTest();
|
|
||||||
|
|
||||||
// Creates a counter to automatically assign new ids to each upload
|
|
||||||
let id = this._counter++;
|
|
||||||
obj.id = id;
|
|
||||||
this.uploads[id] = obj;
|
|
||||||
|
|
||||||
for(let i=0, listener; listener = this._listeners[i]; i++)
|
|
||||||
listener.fileAdded( obj );
|
|
||||||
|
|
||||||
return id;
|
|
||||||
},
|
|
||||||
|
|
||||||
showWindow: function()
|
|
||||||
{
|
|
||||||
// Open the tab
|
|
||||||
openAndReuseOneTabPerURL("chrome://sendtophone/content/uploads.xul");
|
|
||||||
},
|
|
||||||
|
|
||||||
updateProgress: function(id, loaded, total)
|
|
||||||
{
|
|
||||||
let upload = this.uploads[id];
|
|
||||||
|
|
||||||
// The progress events are fired when the data is sent,
|
|
||||||
// but that leads to wrong speed because we don't know how long
|
|
||||||
// it has really taken to process the packet
|
|
||||||
// As long as the upload progress the speed converges to a more correct value
|
|
||||||
// But here we will try to adjust it (fake it) sooner
|
|
||||||
if (!upload.firstPacket)
|
|
||||||
upload.firstPacket = Date.now();
|
|
||||||
else
|
|
||||||
if (!upload.adjusted)
|
|
||||||
{
|
|
||||||
upload.adjusted = true;
|
|
||||||
// let elapsed = Date.now() - upload.firstPacket; // time to send a packet to the server and get back
|
|
||||||
let elapsed = Date.now() - upload.startTime; //
|
|
||||||
upload.startTime = upload.startTime - elapsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
upload.currBytes = loaded;
|
|
||||||
upload.maxBytes = total;
|
|
||||||
|
|
||||||
this._listeners.forEach( function( listener ) {
|
|
||||||
listener.progressUpdate( upload );
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
finishedUpload: function(id)
|
|
||||||
{
|
|
||||||
let upload = this.uploads[id];
|
|
||||||
delete this.uploads[id];
|
|
||||||
|
|
||||||
// Review if there are pending files to cancel the show timer
|
|
||||||
let count = 0;
|
|
||||||
for(let id in this.uploads)
|
|
||||||
count++;
|
|
||||||
if (count == 0)
|
|
||||||
cancelShowTimer();
|
|
||||||
|
|
||||||
// Notify the listeners
|
|
||||||
this._listeners.forEach( function( listener ) {
|
|
||||||
listener.fileFinished( upload );
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
cancelUpload: function(id)
|
|
||||||
{
|
|
||||||
let upload = this.uploads[id];
|
|
||||||
upload.req.abort();
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
// For use while debugging
|
|
||||||
toConsole: function(text)
|
|
||||||
{
|
|
||||||
var aConsoleService = Cc["@mozilla.org/consoleservice;1"]
|
|
||||||
.getService(Ci.nsIConsoleService);
|
|
||||||
|
|
||||||
aConsoleService.logStringMessage( text );
|
|
||||||
},
|
|
||||||
|
|
||||||
// Check if we might need to show the window.
|
|
||||||
// Either some folder is being compressed,
|
|
||||||
// or there's some file that might take longer than 2 seconds.
|
|
||||||
// If there's some file that we still don't know the speed
|
|
||||||
// then consider it also as needed.
|
|
||||||
isWindowNeeded: function()
|
|
||||||
{
|
|
||||||
for (let id in this.uploads)
|
|
||||||
{
|
|
||||||
let upload = this.uploads[id] ;
|
|
||||||
|
|
||||||
// zipping folder: if takes so long to compress it, it will also take some time to upload it
|
|
||||||
if (upload.state==1)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// If it still hasn't uploaded anything then something might be wrong
|
|
||||||
if (upload.currBytes==0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
let elapsedTime = (Date.now() - upload.startTime) / 1000;
|
|
||||||
let speed = upload.currBytes/elapsedTime;
|
|
||||||
let remainingSecs = (upload.maxBytes - upload.currBytes) / speed;
|
|
||||||
// this.toConsole(elapsedTime + " " + speed + " " + remainingSecs);
|
|
||||||
|
|
||||||
if (remainingSecs > 2)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// if (remainingSecs > 1 && elapsedTime> 2)
|
|
||||||
// return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal function
|
|
||||||
* Instead of poping up the uploads window inmediately wait a little
|
|
||||||
* trying to avoid flicker for small files
|
|
||||||
*/
|
|
||||||
let showTimer = null;
|
|
||||||
|
|
||||||
// we need a nsITimerCallback compatible...
|
|
||||||
// ... interface for the callbacks.
|
|
||||||
var showTimerEvent =
|
|
||||||
{
|
|
||||||
notify: function(timer)
|
|
||||||
{
|
|
||||||
if (sendtophoneUploadsManager.isWindowNeeded())
|
|
||||||
{
|
|
||||||
cancelShowTimer();
|
|
||||||
sendtophoneUploadsManager.showWindow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function initShowTest()
|
|
||||||
{
|
|
||||||
if (showTimer)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Now it is time to create the timer...
|
|
||||||
showTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
|
||||||
showTimer.initWithCallback(showTimerEvent, 400, Ci.nsITimer.TYPE_REPEATING_SLACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancelShowTimer()
|
|
||||||
{
|
|
||||||
if (!showTimer)
|
|
||||||
return;
|
|
||||||
|
|
||||||
showTimer.cancel();
|
|
||||||
showTimer = null
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://developer.mozilla.org/en/Code_snippets/Tabbed_browser#Reusing_tabs
|
|
||||||
function openAndReuseOneTabPerURL(url) {
|
|
||||||
var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
|
|
||||||
.getService(Ci.nsIWindowMediator);
|
|
||||||
var browserEnumerator = wm.getEnumerator("navigator:browser");
|
|
||||||
|
|
||||||
// Check each browser instance for our URL
|
|
||||||
var found = false;
|
|
||||||
while (!found && browserEnumerator.hasMoreElements()) {
|
|
||||||
var browserWin = browserEnumerator.getNext();
|
|
||||||
var tabbrowser = browserWin.gBrowser;
|
|
||||||
|
|
||||||
// Check each tab of this browser instance
|
|
||||||
var numTabs = tabbrowser.browsers.length;
|
|
||||||
for (var index = 0; index < numTabs; index++) {
|
|
||||||
var currentBrowser = tabbrowser.getBrowserAtIndex(index);
|
|
||||||
if (url == currentBrowser.currentURI.spec) {
|
|
||||||
|
|
||||||
// The URL is already opened. Select this tab.
|
|
||||||
tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];
|
|
||||||
|
|
||||||
// Focus *this* browser-window
|
|
||||||
browserWin.focus();
|
|
||||||
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Our URL isn't open. Open it now.
|
|
||||||
if (!found) {
|
|
||||||
var recentWindow = wm.getMostRecentWindow("navigator:browser");
|
|
||||||
if (recentWindow) {
|
|
||||||
// Use an existing browser window
|
|
||||||
recentWindow.delayedOpenTab(url, null, null, null, null);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// No browser windows are open, so open a new one.
|
|
||||||
window.open(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
28
third_party/operatophone/README
vendored
28
third_party/operatophone/README
vendored
@@ -1,28 +0,0 @@
|
|||||||
Browser to Phone for Opera 11+
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
The Opera to Phone extension is available from the following URL:
|
|
||||||
|
|
||||||
https://addons.opera.com/addons/extensions/details/opera-to-phone
|
|
||||||
|
|
||||||
* Details *
|
|
||||||
|
|
||||||
Seamlessly push links, maps, youtube videos, phone numbers and text to copy to the clipboard directly to your Android device.
|
|
||||||
|
|
||||||
You also need to install the Chrome to Phone Android application on your phone. The application can be downloaded from Android Market (search for 'Chrome to Phone'). Requires a mobile phone running Android 2.2 ("Froyo") or later.
|
|
||||||
|
|
||||||
* Features *
|
|
||||||
|
|
||||||
- Click the Opera to Phone button to open the current page on your Android browser.
|
|
||||||
- Click the Opera to Phone button on Google Maps to launch the Android Google Maps App.
|
|
||||||
- Click the Opera to Phone button on YouTube to launch the Android YouTube app.
|
|
||||||
- Select a phone number on the current web page and click the Opera to Phone button to launch the Android Dialer.
|
|
||||||
- Select some text on the current web page and click the Opera to Phone button to copy the selected text to the Android clipboard (long-press on text boxes to get the paste option in Android).
|
|
||||||
|
|
||||||
* Further information *
|
|
||||||
|
|
||||||
If you have any feedback on this extension please feel free to drop me an email:
|
|
||||||
|
|
||||||
richDOTtibREMOVEbettATgmailDOTcom
|
|
||||||
|
|
||||||
|
|
||||||
22
third_party/operatophone/config.xml
vendored
22
third_party/operatophone/config.xml
vendored
@@ -1,22 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
|
||||||
<widget xmlns="http://www.w3.org/ns/widgets" id="https://addons.opera.com/addons/extensions/details/opera-to-phone/" version="1.3.4">
|
|
||||||
<name>Opera to Phone</name>
|
|
||||||
<access origin="https://chrometophone.appspot.com"/>
|
|
||||||
<icon src="icon_64x64.png"/>
|
|
||||||
<license>Copyright 2010 Rich Tibbett
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.</license>
|
|
||||||
<author href="http://my.opera.com/richtr/blog/2010/12/13/opera-to-phone-extension-support-page">Rich Tibbett</author>
|
|
||||||
<update-description href="https://extension-updates.opera.com/api/w3c-wd1/update/f128c3fa-3357-4e76-8b14-5561a568337c/"/>
|
|
||||||
<description xml:lang="en">Seamlessly push links, maps, youtube videos, phone numbers and text to copy to the clipboard directly to your Android device.</description>
|
|
||||||
</widget>
|
|
||||||
30
third_party/operatophone/constants.js
vendored
30
third_party/operatophone/constants.js
vendored
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Portions of this page are modifications based on work created and shared
|
|
||||||
* by Google and used according to terms described in the Creative Commons 3.0
|
|
||||||
* Attribution License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var apiVersion = 5;
|
|
||||||
var baseUrl = 'https://chrometophone.appspot.com';
|
|
||||||
var sendUrl = baseUrl + '/send?ver=' + apiVersion;
|
|
||||||
var signInUrl = baseUrl + '/signin?extret=' +
|
|
||||||
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?login&ver=' + apiVersion;
|
|
||||||
var signOutUrl = baseUrl + '/signout?extret=' +
|
|
||||||
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?logout&ver=' + apiVersion;
|
|
||||||
var registerUrl = baseUrl + '/register?ver=' + apiVersion;
|
|
||||||
var apkUrl = 'http://code.google.com/p/chrometophone/wiki/AndroidApp';
|
|
||||||
|
|
||||||
var ACTION_START_SEND = 'start_send_process';
|
|
||||||
var ACTION_SEND_PAGE = 'send_to_phone';
|
|
||||||
var ACTION_APK_REQUIRED = 'apk_required';
|
|
||||||
var ACTION_CAPTURE_SELECTION = 'capture_selection';
|
|
||||||
var ACTION_OPEN_TAB = 'open_tab';
|
|
||||||
var ACTION_CLOSE_TAB = 'close_tab';
|
|
||||||
|
|
||||||
var STATUS_SUCCESS = 'success';
|
|
||||||
var STATUS_LOGIN_REQUIRED = 'login_required';
|
|
||||||
var STATUS_DEVICE_NOT_REGISTERED = 'device_not_registered';
|
|
||||||
var STATUS_NO_TAB_ACCESS = 'no_tab_access';
|
|
||||||
var STATUS_GENERAL_ERROR = 'general_error';
|
|
||||||
|
|
||||||
var BROWSER_CHANNEL_RETRY_INTERVAL_MS = 10000 * (1 + Math.random() - 0.5);
|
|
||||||
BIN
third_party/operatophone/icon_18x18.png
vendored
BIN
third_party/operatophone/icon_18x18.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 515 B |
BIN
third_party/operatophone/icon_64x64.png
vendored
BIN
third_party/operatophone/icon_64x64.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 4.6 KiB |
@@ -1,80 +0,0 @@
|
|||||||
// ==UserScript==
|
|
||||||
// @include http://*
|
|
||||||
// @include https://*
|
|
||||||
// ==/UserScript==
|
|
||||||
|
|
||||||
if ( window.location === window.parent.location) {
|
|
||||||
|
|
||||||
var ACTION_CAPTURE_SELECTION = 'capture_selection';
|
|
||||||
var ACTION_SEND_PAGE = 'send_to_phone';
|
|
||||||
var ACTION_CLOSE_TAB = 'close_tab';
|
|
||||||
|
|
||||||
var currentUrl = document.location.href;
|
|
||||||
|
|
||||||
opera.extension.addEventListener( 'message', function( message ) {
|
|
||||||
if( message.data.action === ACTION_CAPTURE_SELECTION ) {
|
|
||||||
var pageInfo = {
|
|
||||||
action: ACTION_SEND_PAGE,
|
|
||||||
data: {
|
|
||||||
link: currentUrl,
|
|
||||||
title: document.title,
|
|
||||||
selection: window.getSelection() ? window.getSelection().toString() : null
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// URL overrides
|
|
||||||
if ( currentUrl.match( /^http[s]?:\/\/maps\.google\./i ) ||
|
|
||||||
currentUrl.match( /^http[s]?:\/\/www\.google\.[a-z]{2,3}(\.[a-z]{2})\/maps/i ) ) {
|
|
||||||
var link = document.getElementById('link');
|
|
||||||
if (link && link.href)
|
|
||||||
pageInfo.data.link = link.href;
|
|
||||||
}
|
|
||||||
opera.extension.postMessage( pageInfo );
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
function findAndReplace(searchText, replacement, searchNode) {
|
|
||||||
if (!searchText || typeof replacement === 'undefined') {
|
|
||||||
// Throw error here if you want...
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var regex = typeof searchText === 'string' ?
|
|
||||||
new RegExp(searchText, 'g') : searchText,
|
|
||||||
childNodes = (searchNode || document.body).childNodes,
|
|
||||||
cnLength = childNodes.length,
|
|
||||||
excludes = 'html,head,style,title,link,meta,script,object,iframe';
|
|
||||||
while (cnLength--) {
|
|
||||||
var currentNode = childNodes[cnLength];
|
|
||||||
if (currentNode.nodeType === 1 &&
|
|
||||||
(excludes + ',').indexOf(currentNode.nodeName.toLowerCase() + ',') === -1) {
|
|
||||||
arguments.callee(searchText, replacement, currentNode);
|
|
||||||
}
|
|
||||||
if (currentNode.nodeType !== 3 || !regex.test(currentNode.data) ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
var parent = currentNode.parentNode,
|
|
||||||
frag = (function(){
|
|
||||||
var html = currentNode.data.replace(regex, replacement),
|
|
||||||
wrap = document.createElement('div'),
|
|
||||||
frag = document.createDocumentFragment();
|
|
||||||
wrap.innerHTML = html;
|
|
||||||
while (wrap.firstChild) {
|
|
||||||
frag.appendChild(wrap.firstChild);
|
|
||||||
}
|
|
||||||
return frag;
|
|
||||||
})();
|
|
||||||
parent.insertBefore(frag, currentNode);
|
|
||||||
parent.removeChild(currentNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
window.addEventListener( 'DOMContentLoaded', function() {
|
|
||||||
if( currentUrl.match( /^http[s]?:\/\/www\.google\.com\/accounts\/ServiceLogin\?(.*)?ahname=Chrome\+to\+Phone(.*)?$/i ) ) {
|
|
||||||
// Opera log in message so users know what they are logging in to.
|
|
||||||
findAndReplace('Chrome', 'Opera', document.body);
|
|
||||||
} else if (currentUrl.match( /^http:\/\/code\.google\.com\/p\/chrometophone\/logo(.*)?$/i )) {
|
|
||||||
opera.extension.postMessage({
|
|
||||||
action: ACTION_CLOSE_TAB
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
}
|
|
||||||
103
third_party/operatophone/index.html
vendored
103
third_party/operatophone/index.html
vendored
@@ -1,103 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<script type="text/javascript" src="constants.js"></script>
|
|
||||||
<script type="text/javascript" src="send_logic.js"></script>
|
|
||||||
<script>
|
|
||||||
var UIItemProperties = { // options for the button
|
|
||||||
disabled: true,
|
|
||||||
title: "Opera to Phone",
|
|
||||||
icon: "icon_18x18.png",
|
|
||||||
popup: {
|
|
||||||
href: 'popup.html',
|
|
||||||
width: "320px",
|
|
||||||
height: "60px"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var operaBtn = opera.contexts.toolbar.createItem( UIItemProperties ); // create the button
|
|
||||||
opera.contexts.toolbar.addItem( operaBtn ); // add button to UI
|
|
||||||
|
|
||||||
var timoutTimer = null;
|
|
||||||
|
|
||||||
function onMessage( message ) {
|
|
||||||
var currentTab = opera.extension.tabs.getFocused();
|
|
||||||
|
|
||||||
switch( message.data.action ) {
|
|
||||||
case ACTION_START_SEND:
|
|
||||||
if( currentTab ) {
|
|
||||||
var captureSelection = {
|
|
||||||
action: ACTION_CAPTURE_SELECTION
|
|
||||||
};
|
|
||||||
currentTab.postMessage(captureSelection);
|
|
||||||
}
|
|
||||||
timeoutTimer = window.setTimeout( function() {
|
|
||||||
message.data.action = ACTION_SEND_PAGE;
|
|
||||||
onMessage( message );
|
|
||||||
}, 1000);
|
|
||||||
break;
|
|
||||||
case ACTION_SEND_PAGE:
|
|
||||||
window.clearTimeout( timeoutTimer ); // Cancel timeout error timer
|
|
||||||
var pageData = message.data.data || {};
|
|
||||||
if( currentTab ) {
|
|
||||||
var data = {
|
|
||||||
title: pageData.title || currentTab.title,
|
|
||||||
url: pageData.link || currentTab.url,
|
|
||||||
sel: pageData.selection || null,
|
|
||||||
type: pageData.selection ? 'selection' : 'page'
|
|
||||||
};
|
|
||||||
sendToPhone( data, function( status ) {
|
|
||||||
// Display sendToPhone result in Popup
|
|
||||||
opera.extension.broadcastMessage({
|
|
||||||
action: status
|
|
||||||
});
|
|
||||||
} );
|
|
||||||
} else {
|
|
||||||
opera.extension.broadcastMessage({
|
|
||||||
action: STATUS_NO_TAB_ACCESS
|
|
||||||
});
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ACTION_OPEN_TAB:
|
|
||||||
if(message.data.data && message.data.data.url) {
|
|
||||||
var tabData = {
|
|
||||||
url: message.data.data.url,
|
|
||||||
focused: true
|
|
||||||
};
|
|
||||||
opera.extension.tabs.create( tabData );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ACTION_CLOSE_TAB:
|
|
||||||
if( currentTab )
|
|
||||||
currentTab.close();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
opera.extension.addEventListener( 'message' , onMessage, false );
|
|
||||||
|
|
||||||
function enableButton() {
|
|
||||||
var tab = opera.extension.tabs.getFocused();
|
|
||||||
if (tab) {
|
|
||||||
operaBtn.disabled = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
operaBtn.disabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Enable the button when a tab is ready.
|
|
||||||
opera.extension.addEventListener( 'connect', function() {
|
|
||||||
enableButton();
|
|
||||||
}, false );
|
|
||||||
opera.extension.tabs.addEventListener( 'focus', function() {
|
|
||||||
enableButton();
|
|
||||||
}, false );
|
|
||||||
opera.extension.tabs.addEventListener( 'blur', function() {
|
|
||||||
enableButton();
|
|
||||||
}, false );
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
43
third_party/operatophone/o2p_help.html
vendored
43
third_party/operatophone/o2p_help.html
vendored
File diff suppressed because one or more lines are too long
105
third_party/operatophone/popup.html
vendored
105
third_party/operatophone/popup.html
vendored
@@ -1,105 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<style type="text/css">
|
|
||||||
body {
|
|
||||||
padding: 0px;
|
|
||||||
margin: 1px;
|
|
||||||
min-width: 320px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
a, a:visited, a:active {
|
|
||||||
color: blue;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
font-family: Verdana, Arial;
|
|
||||||
font-size: 12px;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript" src="constants.js"></script>
|
|
||||||
<script>
|
|
||||||
function loadHandler() {
|
|
||||||
var msg = document.getElementById('msg'),
|
|
||||||
helpLink = document.getElementById('help'),
|
|
||||||
signOutLink = document.getElementById('signout');
|
|
||||||
helpLink.addEventListener( 'click', function() {
|
|
||||||
opera.extension.postMessage({
|
|
||||||
action: ACTION_OPEN_TAB,
|
|
||||||
data: {
|
|
||||||
url: '/o2p_help.html?' + Math.floor(Math.random()*1e10) // to prevent caching issue
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, false );
|
|
||||||
signOutLink.href = signOutUrl;
|
|
||||||
|
|
||||||
// Callback from the background process
|
|
||||||
opera.extension.addEventListener( 'message', function( message ) {
|
|
||||||
var msgRcvd = false;
|
|
||||||
switch(message.data.action) {
|
|
||||||
case STATUS_SUCCESS:
|
|
||||||
msg.innerHTML = "Sent to phone."
|
|
||||||
setSignoutVisibility(true);
|
|
||||||
msgRcvd = true;
|
|
||||||
break;
|
|
||||||
case STATUS_LOGIN_REQUIRED:
|
|
||||||
var signinLink = '<a href="' + signInUrl + '" target="_o2pTab_ext">sign in</a>';
|
|
||||||
msg.innerHTML = "Please " + signinLink + " to Opera to Phone.";
|
|
||||||
setSignoutVisibility(false);
|
|
||||||
msgRcvd = true;
|
|
||||||
break;
|
|
||||||
case STATUS_DEVICE_NOT_REGISTERED:
|
|
||||||
opera.extension.postMessage({
|
|
||||||
action: ACTION_OPEN_URL,
|
|
||||||
data: {
|
|
||||||
url: apkUrl
|
|
||||||
}
|
|
||||||
});
|
|
||||||
msg.innerHTML = "Device not registered for user.";
|
|
||||||
setSignoutVisibility(true);
|
|
||||||
msgRcvd = true;
|
|
||||||
break;
|
|
||||||
case STATUS_NO_TAB_ACCESS:
|
|
||||||
msg.innerHTML = "Cannot access the current tab.";
|
|
||||||
msgRcvd = true;
|
|
||||||
break;
|
|
||||||
case STATUS_GENERAL_ERROR:
|
|
||||||
msg.innerHTML = "Error sending to phone: " + message.data.action;
|
|
||||||
setSignoutVisibility(false);
|
|
||||||
msgRcvd = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(msgRcvd) {
|
|
||||||
window.setTimeout(function() {
|
|
||||||
window.close();
|
|
||||||
}, 3000);
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
function setSignoutVisibility(visible) {
|
|
||||||
signOutLink.style.visibility = visible ? 'visible' : 'hidden';
|
|
||||||
signOutLink.style.color = visible ? 'blue' : 'gray';
|
|
||||||
document.getElementById('sep').style.visibility = visible ? 'visible' : 'hidden';
|
|
||||||
}
|
|
||||||
|
|
||||||
opera.extension.postMessage({
|
|
||||||
action: ACTION_START_SEND
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener("load", loadHandler, false);
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td valign="top" width="48px"><img src="/icon_64x64.png" width="48px" height="48px" style="margin-right: 4px;"/></td>
|
|
||||||
<td valign="middle">
|
|
||||||
<b><div id="msg">Sending to phone...</div></b>
|
|
||||||
<p><a id="help" href="#">Help</a> <span id="sep" style="visibility:hidden;">|</span>
|
|
||||||
<a id="signout" href="#" target="_o2ptab_ext" style="color: gray; visibility: hidden;">Sign out</a></p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
41
third_party/operatophone/send_logic.js
vendored
41
third_party/operatophone/send_logic.js
vendored
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Portions of this page are modifications based on work created and shared
|
|
||||||
* by Google and used according to terms described in the Creative Commons 3.0
|
|
||||||
* Attribution License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var channel;
|
|
||||||
var socket;
|
|
||||||
var req = new XMLHttpRequest();
|
|
||||||
|
|
||||||
function sendToPhone( data, listener ) {
|
|
||||||
req.open('POST', sendUrl, true);
|
|
||||||
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
req.setRequestHeader('X-Same-Domain', 'true'); // XSRF protector
|
|
||||||
|
|
||||||
req.onreadystatechange = function() {
|
|
||||||
if (this.readyState == 4) {
|
|
||||||
if (req.status == 200) {
|
|
||||||
var body = req.responseText;
|
|
||||||
if (body.indexOf('OK') == 0) {
|
|
||||||
listener(STATUS_SUCCESS);
|
|
||||||
} else if (body.indexOf('LOGIN_REQUIRED') == 0) {
|
|
||||||
listener(STATUS_LOGIN_REQUIRED);
|
|
||||||
} else if (body.indexOf('DEVICE_NOT_REGISTERED') == 0) {
|
|
||||||
listener(STATUS_DEVICE_NOT_REGISTERED);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
listener(STATUS_GENERAL_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var postData = '';
|
|
||||||
for(var key in data) {
|
|
||||||
if(postData.length > 1)
|
|
||||||
postData += '&';
|
|
||||||
if( data[key] !== null )
|
|
||||||
postData += key + '=' + encodeURIComponent( data[key] );
|
|
||||||
}
|
|
||||||
req.send(postData);
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user