mirror of
https://github.com/fergalmoran/chrometophone.git
synced 2025-12-22 09:41:51 +00:00
Added Opera to Phone version 1.2
This commit is contained in:
27
third_party/operatophone/config.xml
vendored
Normal file
27
third_party/operatophone/config.xml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<widget xmlns="http://www.w3.org/ns/widgets" id="extensions:opera-to-phone" version="1.0_beta">
|
||||||
|
<name short="OperaToPhone">Opera to Phone</name>
|
||||||
|
<description>This extension adds a button to Opera that lets you 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.</description>
|
||||||
|
<author href="http://opera.com" email="richt@opera.com">Rich Tibbett</author>
|
||||||
|
<access origin="https://chrometophone.appspot.com/*"/>
|
||||||
|
<icon src="icon_64.png"/>
|
||||||
|
<license>
|
||||||
|
Copyright 2010 Opera Software ASA.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Portions of this work are modifications based on work created and shared
|
||||||
|
by Google and used according to terms described in the Creative Commons 3.0
|
||||||
|
Attribution License.
|
||||||
|
</license>
|
||||||
|
</widget>
|
||||||
32
third_party/operatophone/constants.js
vendored
Normal file
32
third_party/operatophone/constants.js
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* 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';
|
||||||
|
var signOutUrl = baseUrl + '/signout?extret=' +
|
||||||
|
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?logout';
|
||||||
|
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_REGISTER_USERJS = 'register_userjs';
|
||||||
|
var ACTION_DEREGISTER_USERJS = 'deregister_userjs';
|
||||||
|
var ACTION_CAPTURE_SELECTION = 'capture_selection';
|
||||||
|
var ACTION_SELECTION_CAPTURED = 'selection_captured';
|
||||||
|
|
||||||
|
var STATUS_SUCCESS = 'success';
|
||||||
|
var STATUS_LOGIN_REQUIRED = 'login_required';
|
||||||
|
var STATUS_DEVICE_NOT_REGISTERED = 'device_not_registered';
|
||||||
|
var STATUS_HTTP_PAGES_ONLY = 'http_pages_only';
|
||||||
|
var STATUS_GENERAL_ERROR = 'general_error';
|
||||||
|
var STATUS_NO_TAB_ACCESS = 'no_tab_access';
|
||||||
|
|
||||||
|
var BROWSER_CHANNEL_RETRY_INTERVAL_MS = 10000 * (1 + Math.random() - 0.5);
|
||||||
46
third_party/operatophone/help.html
vendored
Normal file
46
third_party/operatophone/help.html
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Opera to Phone</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1%2B%2FAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAuVSURBVGiBxZp7jFzXXcc%2F55x779zZ2Z3ZGe%2Fatb2sEztZxzWRRZUEmbiGBuoohjataEgoShoKxJFogmgLERFqSiNKpSLSlkdrTJSCCBGNQiFSiVIJV2mdBhnba5N0s36sXa%2B9tjvr9czO7Ozs3Mf58cfsjGdf9rjOhp%2F0k2bOfZzf9%2Fc%2B51wlIlwPKaXavve%2B%2B%2B67OZvNvt%2FzvM1a65scx%2Bnp7u5eFUWRDzQFmX1nXCwW8yKSt9YerdVqb166dOm1l1566dSc%2Bd8NAI%2Fu2vXhzq6uT%2Fi%2Bf7vneascx%2FESiQS1Wo19%2B%2FaRSqXQWiMiKKUIggDP89i6dStBEBBFEVEUBUEQXJienv7%2B5OTkM88%2B%2B%2ByhJoBr0eJbN2%2FMpWK2afhVBTuBPsAKDItS%2Fx657t6TH%2Fj513d8%2FR9mAJ7Y9chT%2FnvWfL6nZwXpdBrXdVFKYa1lZmaGsbGxJoAGRVGEtZb%2B%2Fn6MMVhrsdZSrVYplUrk8%2Fnw4sWL9%2B7Zs%2BeVtgEc37Dxgy7ygBG1DVitIKVAN56UOkeiVFm0Go1cd%2B%2F3Nq0%2Fl9%2Fyvi%2FfMDBAGAScP3%2BefD7PxMQE5XKZmZkZoigiCII5c7muSzKZxHVduru7yWazdHd309PTQy6Xo1KpcPTo0ZEjR45sd64m%2BPCGjXcmhC8aYbvmMlANxEAkoABHgQbHimRVJFk3rm1RHRlW9vdz5PBh9u%2Ffz%2BjoKKVSienp6aaWG9xKWmu01hhjSCQS%2BL5PKpWit7eXgYEBtm3bxrp16zZcunTps1e0wPD6gacS8JSpy4hQ%2F6GAshCUhP8IhAMafF%2FxS2nFB5IKLBDHMd%2F75EMcGB%2FnWy%2B8QLlcXqDpayVjDF1dXdx44408%2BOCDlEqlt5e0wPD6gecS8LCiLlCDBChZTozE3P%2FRM8cOtVz6wn%2F1D%2FzmWsM3kwovBKQjxZHB7zIxMYFSCmPMdQEQEYrFIoODg9x%2B%2B%2B1s3rx5tV7sxh%2BtH9jtKh4WBbaFRUEVKqciPjxPeAB%2BefTYC3nLowFgtSKWy%2B7hOE7TNX5aNsbgui5QD3QRUQsAHL5hYJcLj0Bd860cA9OWZ%2B49e%2BztpbS0%2FfSx56rCD%2BjwEeeyxpVS7xg3rGGtZQ6AH%2FTf1O9p%2FtLM%2BrG0MEAoVCZivrGU8A2aEf4mjiw2ts2wf6cBNGhODHQa%2FQWj6IxbhG5qEIjghzvOHBu7GoCJkO9i4kIcx1mlNUqpOXn%2BeqnVCs23vvYzN%2Fe7igfUIsJD0xL72pngnrFjxWpH15B1XBRy3b6%2FGDeoaYGk4WNakbCLilQHEAmH2wEAMC7Om6Fwp57V%2FjtpAT1rVUCaABzFTs3i2qc%2BLlYYaXeSasIfQ9WrxnIAAFBKOQ7At1etX6%2FhltaAnU8iTCGU2p2kaBJjCE3%2Ff6djYNYCdQBpT9%2BhFNkrAoBiYCm3O0lXpThq4xCll88CMBsDWsmvKbR%2FpYcEpgozerrdSdaWxwsVG6HUwsC7XmrEgIg0g%2FgXUailAniWagfHnbDdSSq2XgWWw4VaWxIHQFB9amnvaZD9HG%2B1v%2FoRpNEoLlcMWGvrACzC1RZmIrS%2F6pk3mTFm2WJAA8Rwug3Vmlc7NrcthQHNPAsYowE9Jy6up5A1K3Ek8qoI9koqVopENhd5bQPQqp4gZrtIYwxKGTo6DFFs0No0x38abgSxBqhY%2BU6EVK8iU1fClVS7ABxForFh0NBapaLZ%2BSuaz%2BxSFCY1tFinXZ7fV2mAY0Hw3zWRvLCwhW7hbqCzfQA6J8yNAVEaoxWffaLKp37bMll2r9mdGusKa%2B1lC%2Fzp%2BFh%2BWmQwpN7zL8Edoki3CyBnzHtqtQQX8jVGz5QplDSFSUO5YmDa8ud%2FVOH3H65RLDlXBWGMwXGc5mKmWCwSx3FdUY0Ji8LLKZFfd1k6n7qom4A3W8ei4TWbQX8I5UZKO6AMShvGvmPv2dJ7kmRnzJlfSNCdgVg07%2FvZACmDqglPf2YKEHb%2Fcyc9WYXWC7OhiBDHMUEQUK1WqVQqVCqVBYWMt5CX01YuZZTKLVXQNLIF%2BPbcUXsBiT6KBHeIVaBAUKz%2BIPS53%2BLu7Q54DsSToARmhLgMaIUpK57%2B9BRhWOMre1x6cwqRumuICFEUEcdxY2OrvgKbl4WaAP5s9GTxX9bdtNsX%2BROj1AIrCKDhzvmgnFsuTERv99wP6gDIitYH40BDYIEAWsvIbAzGMZgpw5f%2BOGCmOsnfPgdGK%2BaXjEbhmr8pMGdBA%2FA%2FjvlyAX5igWgRDmDrqRs2rVkAYtPFHwN%2FP3%2F88ibM0gk6DgHt8bnHXHp7NMLimWc%2BoEUBPDNytHDGmD8oi8WKELVwLEIgkrpE9LvzhYiGsutBHpq7ihaMCtEqRiuLVhajhDm2FTBpxYV8jbs%2FEZMf13hu%2B2vjBQAAHjt59F%2FPav3XMyIIczNRCJSFT19Yv2lDU%2FjhNSvRiW%2Bi3LUoLxZJlMOKTzCVpBKtIjJZxOtC3BTW82E2kzSEP5MP2fHxkAOHNB3JJQ21KM2JgVbader449%2B44ebVa639mKsUccu1KSQzYsOXyxtu%2BUjXyPBxUDOo5O%2BhO2vFr8itw69He6ZFuiKBk7%2F1APsO%2FZCDB%2FeTSHhUKhG%2F8ZEEX3rCQBxz%2BlzMzocihoY16TSIQDv7zK0utOTO3KM7d97%2FtVde2bMmjj7ZwWUQAlwU3ntAov2Hbhz4p2P38L8WdEVm7pgUebAqkmiYtVxSnDkbcfzEFI7rE4XC2DkDK1xGDsLOh0KOHacp%2FLXSFQHwd1%2B1j8PvfHH9xgNrovAvcqiMQRFRd62CSHcpjh93ZjNWJIKlnmAEEKNwPHBdwXU1yaShFFpW9hjOndTs%2BHjAyVNCOq1mtXptgjf4qt3lkyePfv1rUXD3a7WZV09HgQ1FMErhzQZSo3o3xoxSTIswHIVxaHTY2dlJGIaICF5Cc2Qo4t4Hqpz8sSWTufYOPQgCjDFkMhmiKGrngEMlQRJAT9ZLvH9rsmP7Bi%2BxeZU2q5Jap1yljQCB2Kgc28o5G51%2Fu1Z78%2FVadd%2Fnn3zymTAMci%2B%2B%2BCKjo6OIWKLIoLSmI9neRm%2BjEsdxjIjQ1dXFbbfdxo4dOzh37tzMVc8HqHepVaBYCGon%2FjOo%2FSPQA6zD9XI9rtMRAcUwqBBGeWAUuAR0WBv%2Fle%2F7bNmyhZUrVzIxMcHk5CTVapUgCJobv42utVWZjVTpOA5dXV10dnayYsUKstksq1evbgJyWl%2FQJlkgP8tXsp4ClLWWMAzxPI%2B%2Bvj76%2B%2Fux1jZ7mzAMm%2Bdj1locx8Fai1IK3%2FfxfR%2BnvnlCGIZNXtALLQe1KiaXy5FMJimVSkxNTeH7Pn19fbiuS7FYpFqtorUmjmMymQypVIpKpUKhUCCKIrLZLL7vMzU11WoxtZwArLU2bmg2k8mQyWQIw5BisYjWmnQ6je%2F7lEolZmZmmn2%2B7%2FvkcjmUUoyPj6OUIpPJkE6nm02etZY4jmvLCWCmUqlcSKfTvVprDh48SBRFpFIpMpkMQRDwxhtvEMcx6XS6CaZarTI8PMzg4CC%2B79Pd3Y2IMDg4SBAEdHR0sHHjRmq1GpVK5fhyApB8Pv%2BG53m3Oo5Db29v80LD13t7e%2Bu5XGvuuusutm3bxvPPP9%2FUciM2lFKsWLECEWmuiSuVCmfPnv23ZY2Bw4cP7%2FY875FGEM5PFo3%2FjuNw%2FPhxisUihUIBY0yzdixGWmvOnz%2F%2Fo7179%2B5eVgBDQ0OHMpnMH65ateoZrXXzlHL%2BSYu1lqGhIWq1GtlstnlPa3pt%2FE4kEhQKhfLIyMinoiiaeFc%2BNdi0adOHent7HzPGbBORZEOoxd6zmDwtLXRorf3%2B2bNnnz5x4sRr8C59KzFLXl9f3625XO7nfN9%2FrzFmrVIqq5RKKaU8mSuIAiIRqYhIwVr7k1qtNlwoFA6ePn36EFBr3vhufq0yjwyQAZKAx9y9hNkjOaaBEvWlyOLzXy%2BA%2F2%2F6PzBw4Z94LQ3uAAAAAElFTkSuQmCC" style="margin-right: 4px;"/>
|
||||||
|
<h2>Opera to Phone Extension - Help</h2>
|
||||||
|
|
||||||
|
<p><em>Welcome to Opera to Phone.</em></p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This extension adds a button to Opera that allows users to send links from their Opera desktop browser to their Android device using Android's Cloud to Device Messaging service.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You need to install the <a href="http://code.google.com/p/chrometophone/wiki/AndroidApp">Chrome to Phone Android application</a> on your
|
||||||
|
phone for this extension to work. The application can be downloaded from Android Market (search for 'Chrome to Phone'). Requires a mobile
|
||||||
|
phone running Android 2.2 ("Froyo") or later.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Extension Features:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Send links to browser.</li>
|
||||||
|
<li>Google Maps links launch the Google Maps app.</li>
|
||||||
|
<li>YouTube links launch the YouTube app.</li>
|
||||||
|
<li>Selecting phone numbers in Web pages, launches the dialer with the number pre-populated.</li>
|
||||||
|
<li>Selected text populates the Android clipboard (long-press on text boxes to get paste option).</li>
|
||||||
|
<li>Right click on links and selections.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Requirements</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Opera 11 (Alpha build 1024+)</li>
|
||||||
|
<li>Android 2.2 ("Froyo") device</li>
|
||||||
|
<li><a href="http://code.google.com/p/chrometophone/wiki/AndroidApp">Chrome to Phone</a> application installed on Android device</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p style="color:#cc0000; font-weight:bold;">
|
||||||
|
*** This is an experimental port of the Chrome to Phone extension to Opera 11 but it has been tested and is working ***
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>If you have any questions, comments or feedback, please email me at <a href="mailto:richt@opera.com">richt@opera.com</a>.
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
third_party/operatophone/icon.png
vendored
Normal file
BIN
third_party/operatophone/icon.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 405 B |
BIN
third_party/operatophone/icon_64.png
vendored
Normal file
BIN
third_party/operatophone/icon_64.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
64
third_party/operatophone/includes/operatophone.js
vendored
Normal file
64
third_party/operatophone/includes/operatophone.js
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// ==UserScript==
|
||||||
|
// @include *
|
||||||
|
// ==/UserScript==
|
||||||
|
|
||||||
|
// obtain access to all tabs
|
||||||
|
|
||||||
|
var ACTION_REGISTER_USERJS = 'register_userjs';
|
||||||
|
var ACTION_DEREGISTER_USERJS = 'deregister_userjs';
|
||||||
|
var ACTION_CAPTURE_SELECTION = 'capture_selection';
|
||||||
|
var ACTION_SEND_PAGE = 'send_to_phone';
|
||||||
|
|
||||||
|
function S4() {
|
||||||
|
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
|
||||||
|
}
|
||||||
|
function guid() {
|
||||||
|
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!window.top.userJS_UUID) {
|
||||||
|
window.top.userJS_UUID = guid();
|
||||||
|
|
||||||
|
window.addEventListener('focus', function(){
|
||||||
|
opera.extension.postMessage({action: ACTION_REGISTER_USERJS, uuid: window.top.userJS_UUID});
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
window.addEventListener('blur', function(){
|
||||||
|
opera.extension.postMessage({action: ACTION_DEREGISTER_USERJS, uuid: window.top.userJS_UUID});
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
// register this tab as the active userjs onload
|
||||||
|
opera.extension.postMessage({action: ACTION_REGISTER_USERJS, uuid: window.top.userJS_UUID});
|
||||||
|
}
|
||||||
|
|
||||||
|
opera.extension.addEventListener('message', function(request) {
|
||||||
|
|
||||||
|
//opera.postError('Callback received at UserJS: ' + request.data.action);
|
||||||
|
|
||||||
|
if(request.data.action==ACTION_CAPTURE_SELECTION
|
||||||
|
&& request.data.uuid==window.top.userJS_UUID) {
|
||||||
|
|
||||||
|
var currentUrl = document.location.href;
|
||||||
|
|
||||||
|
var pageInfo = {
|
||||||
|
action: ACTION_SEND_PAGE,
|
||||||
|
data: {
|
||||||
|
link: encodeURIComponent(currentUrl),
|
||||||
|
title: encodeURIComponent(document.title),
|
||||||
|
selection: encodeURIComponent(window.getSelection())
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// URL overrides
|
||||||
|
if (currentUrl.match(/^http[s]?:\/\/maps\.google\./) ||
|
||||||
|
currentUrl.match(/^http[s]?:\/\/www\.google\.[a-z]{2,3}(\.[a-z]{2})\/maps/)) {
|
||||||
|
var link = document.getElementById('link');
|
||||||
|
if (link && link.href)
|
||||||
|
pageInfo.data.link = encodeURIComponent(link.href);
|
||||||
|
}
|
||||||
|
|
||||||
|
opera.extension.postMessage(pageInfo);
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
//opera.postError("UserJS loaded: " + window.location.href + " / " + window.top.userJS_UUID);
|
||||||
108
third_party/operatophone/index.html
vendored
Normal file
108
third_party/operatophone/index.html
vendored
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
<!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: false,
|
||||||
|
title: "Opera to Phone",
|
||||||
|
icon: "icon.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 currentTab = null; // tracks currently focused tab
|
||||||
|
|
||||||
|
opera.extension.addEventListener('message', function(request) { onMessage(request); }, false);
|
||||||
|
|
||||||
|
var currentUserJS = null; // keeps track of which UserJS is in focus
|
||||||
|
var timoutTimer = null;
|
||||||
|
|
||||||
|
function onMessage(request) {
|
||||||
|
|
||||||
|
if (request.data.action==ACTION_REGISTER_USERJS) {
|
||||||
|
|
||||||
|
currentUserJS = request.data.uuid;
|
||||||
|
//opera.postError("BG: Registered UserJS[" + currentUserJS + "]");
|
||||||
|
|
||||||
|
} else if (request.data.action==ACTION_DEREGISTER_USERJS) {
|
||||||
|
|
||||||
|
// deregister after a short delay, so the button has time to capture the currentUserJS
|
||||||
|
window.setTimeout(function() {
|
||||||
|
if(currentUserJS==request.data.uuid) {
|
||||||
|
//opera.postError("BG: Deregistering UserJS[" + currentUserJS + "]");
|
||||||
|
currentUserJS = null;
|
||||||
|
}
|
||||||
|
}, 300);
|
||||||
|
|
||||||
|
} else if(request.data.action==ACTION_START_SEND) {
|
||||||
|
|
||||||
|
var captureSelection = {
|
||||||
|
action: ACTION_CAPTURE_SELECTION,
|
||||||
|
uuid: currentUserJS
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the selected text (if any) from the UserJS
|
||||||
|
opera.extension.broadcastMessage(captureSelection);
|
||||||
|
|
||||||
|
// Set timeoutTimer to throw an error after 1 second...
|
||||||
|
timeoutTimer = window.setTimeout(function() {
|
||||||
|
request.data.action = ACTION_SEND_PAGE;
|
||||||
|
onMessage(request); // stop waiting for UserJS and go to next step
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
} else if (request.data.action==ACTION_SEND_PAGE) {
|
||||||
|
|
||||||
|
// Cancel timeoutTimer
|
||||||
|
if(timeoutTimer) window.clearTimeout(timeoutTimer);
|
||||||
|
|
||||||
|
var userJS_data = {};
|
||||||
|
if(request.data.data) userJS_data = request.data.data;
|
||||||
|
|
||||||
|
// Set currentTab pointer
|
||||||
|
currentTab = opera.extension.tabs.getFocused();
|
||||||
|
|
||||||
|
if(currentTab || userJS_data.link) {
|
||||||
|
|
||||||
|
var url = userJS_data.link ? userJS_data.link : encodeURIComponent(currentTab.url);
|
||||||
|
var title = userJS_data.title ? userJS_data.title : encodeURIComponent(currentTab.title);
|
||||||
|
var sel = userJS_data.selection ? userJS_data.selection : '';
|
||||||
|
var msgType = (sel && sel.length > 0) ? 'selection' : 'page';
|
||||||
|
|
||||||
|
var urlCheck = decodeURIComponent(url);
|
||||||
|
if (urlCheck.indexOf('http:') == 0 || urlCheck.indexOf('https:') == 0) {
|
||||||
|
sendToPhone(title, url, sel, msgType, function(status) {
|
||||||
|
// Display sendToPhone result in popup.html
|
||||||
|
opera.extension.broadcastMessage({action: status});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
opera.extension.broadcastMessage({action: STATUS_NO_TAB_ACCESS});
|
||||||
|
}
|
||||||
|
|
||||||
|
} else { // no object means that the extension does not have access to the current tab :(
|
||||||
|
|
||||||
|
opera.extension.broadcastMessage({action: STATUS_NO_TAB_ACCESS});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset currentTab pointer
|
||||||
|
currentTab = null;
|
||||||
|
|
||||||
|
} else if (request.data.action==ACTION_APK_REQUIRED) {
|
||||||
|
|
||||||
|
opera.extension.tabs.create({url: apkUrl, focused:true});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
114
third_party/operatophone/popup.html
vendored
Normal file
114
third_party/operatophone/popup.html
vendored
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style type="text/css">
|
||||||
|
body {
|
||||||
|
padding: 0px;
|
||||||
|
margin: 1px;
|
||||||
|
min-width: 320px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
font-family: verdana;
|
||||||
|
font-size: 12px;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
/*
|
||||||
|
* 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';
|
||||||
|
var signOutUrl = baseUrl + '/signout?extret=' +
|
||||||
|
encodeURIComponent('http://code.google.com/p/chrometophone/logo') + '?logout';
|
||||||
|
var registerUrl = baseUrl + '/register?ver=' + apiVersion;
|
||||||
|
|
||||||
|
var ACTION_START_SEND = 'start_send_process';
|
||||||
|
var ACTION_SEND_PAGE = 'send_to_phone';
|
||||||
|
var ACTION_APK_REQUIRED = 'apk_required';
|
||||||
|
var ACTION_REGISTER_USERJS = 'register_userjs';
|
||||||
|
var ACTION_DEREGISTER_USERJS = 'deregister_userjs';
|
||||||
|
var ACTION_CAPTURE_SELECTION = 'capture_selection';
|
||||||
|
|
||||||
|
var STATUS_SUCCESS = 'success';
|
||||||
|
var STATUS_LOGIN_REQUIRED = 'login_required';
|
||||||
|
var STATUS_DEVICE_NOT_REGISTERED = 'device_not_registered';
|
||||||
|
var STATUS_HTTP_PAGES_ONLY = 'http_pages_only';
|
||||||
|
var STATUS_GENERAL_ERROR = 'general_error';
|
||||||
|
|
||||||
|
var STATUS_NO_TAB_ACCESS = 'no_tab_access';
|
||||||
|
|
||||||
|
var BROWSER_CHANNEL_RETRY_INTERVAL_MS = 10000 * (1 + Math.random() - 0.5);
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
function loadHandler() {
|
||||||
|
document.getElementById('msg').innerHTML = "Sending to phone...";
|
||||||
|
document.getElementById('help').innerHTML = "Help";
|
||||||
|
document.getElementById('signout').innerHTML = "Sign out";
|
||||||
|
|
||||||
|
setSignOutVisibility(false);
|
||||||
|
|
||||||
|
opera.extension.postMessage({action: ACTION_START_SEND});
|
||||||
|
|
||||||
|
// Callback from the background process
|
||||||
|
opera.extension.addEventListener('message', function(status) {
|
||||||
|
if (status.data.action == STATUS_SUCCESS) {
|
||||||
|
document.getElementById('msg').innerHTML = "Sent to phone."
|
||||||
|
activateSignOutLink();
|
||||||
|
} else if (status.data.action == STATUS_LOGIN_REQUIRED) {
|
||||||
|
var signinLink = '<a href="' + signInUrl + '" target="_o2pTab">sign in</a>';
|
||||||
|
document.getElementById('msg').innerHTML = "Please " + signinLink + " to Opera to Phone.";
|
||||||
|
setSignOutVisibility(false);
|
||||||
|
} else if (status.data.action == STATUS_DEVICE_NOT_REGISTERED) {
|
||||||
|
opera.extension.postMessage({action: ACTION_APK_REQUIRED});
|
||||||
|
document.getElementById('msg').innerHTML = "Device not registered for user.";
|
||||||
|
activateSignOutLink();
|
||||||
|
} else if (status.data.action == STATUS_NO_TAB_ACCESS) {
|
||||||
|
document.getElementById('msg').innerHTML = "Only HTTP URLs are supported (or try refreshing the page).";
|
||||||
|
} else if (status.data.action == STATUS_GENERAL_ERROR) {
|
||||||
|
document.getElementById('msg').innerHTML = "Error sending to phone: " + status.data.action;
|
||||||
|
activateSignOutLink();
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function activateSignOutLink() {
|
||||||
|
setSignOutVisibility(true);
|
||||||
|
var signOutLink = document.getElementById('signout');
|
||||||
|
signOutLink.style.color = 'blue';
|
||||||
|
signOutLink.href=signOutUrl;
|
||||||
|
signOutLink.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSignOutVisibility(visible) {
|
||||||
|
var signOutLink = document.getElementById('signout');
|
||||||
|
signOutLink.style.visibility = visible ? 'visible' : 'hidden';
|
||||||
|
signOutLink.href = null;
|
||||||
|
var sep = document.getElementById('sep');
|
||||||
|
sep.style.visibility = visible ? 'visible' : 'hidden';
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("load", loadHandler, false);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="48px"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1%2B%2FAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAuVSURBVGiBxZp7jFzXXcc%2F55x779zZ2Z3ZGe%2Fatb2sEztZxzWRRZUEmbiGBuoohjataEgoShoKxJFogmgLERFqSiNKpSLSlkdrTJSCCBGNQiFSiVIJV2mdBhnba5N0s36sXa%2B9tjvr9czO7Ozs3Mf58cfsjGdf9rjOhp%2F0k2bOfZzf9%2Fc%2B51wlIlwPKaXavve%2B%2B%2B67OZvNvt%2FzvM1a65scx%2Bnp7u5eFUWRDzQFmX1nXCwW8yKSt9YerdVqb166dOm1l1566dSc%2Bd8NAI%2Fu2vXhzq6uT%2Fi%2Bf7vneascx%2FESiQS1Wo19%2B%2FaRSqXQWiMiKKUIggDP89i6dStBEBBFEVEUBUEQXJienv7%2B5OTkM88%2B%2B%2ByhJoBr0eJbN2%2FMpWK2afhVBTuBPsAKDItS%2Fx657t6TH%2Fj513d8%2FR9mAJ7Y9chT%2FnvWfL6nZwXpdBrXdVFKYa1lZmaGsbGxJoAGRVGEtZb%2B%2Fn6MMVhrsdZSrVYplUrk8%2Fnw4sWL9%2B7Zs%2BeVtgEc37Dxgy7ygBG1DVitIKVAN56UOkeiVFm0Go1cd%2B%2F3Nq0%2Fl9%2Fyvi%2FfMDBAGAScP3%2BefD7PxMQE5XKZmZkZoigiCII5c7muSzKZxHVduru7yWazdHd309PTQy6Xo1KpcPTo0ZEjR45sd64m%2BPCGjXcmhC8aYbvmMlANxEAkoABHgQbHimRVJFk3rm1RHRlW9vdz5PBh9u%2Ffz%2BjoKKVSienp6aaWG9xKWmu01hhjSCQS%2BL5PKpWit7eXgYEBtm3bxrp16zZcunTps1e0wPD6gacS8JSpy4hQ%2F6GAshCUhP8IhAMafF%2FxS2nFB5IKLBDHMd%2F75EMcGB%2FnWy%2B8QLlcXqDpayVjDF1dXdx44408%2BOCDlEqlt5e0wPD6gecS8LCiLlCDBChZTozE3P%2FRM8cOtVz6wn%2F1D%2FzmWsM3kwovBKQjxZHB7zIxMYFSCmPMdQEQEYrFIoODg9x%2B%2B%2B1s3rx5tV7sxh%2BtH9jtKh4WBbaFRUEVKqciPjxPeAB%2BefTYC3nLowFgtSKWy%2B7hOE7TNX5aNsbgui5QD3QRUQsAHL5hYJcLj0Bd860cA9OWZ%2B49e%2BztpbS0%2FfSx56rCD%2BjwEeeyxpVS7xg3rGGtZQ6AH%2FTf1O9p%2FtLM%2BrG0MEAoVCZivrGU8A2aEf4mjiw2ts2wf6cBNGhODHQa%2FQWj6IxbhG5qEIjghzvOHBu7GoCJkO9i4kIcx1mlNUqpOXn%2BeqnVCs23vvYzN%2Fe7igfUIsJD0xL72pngnrFjxWpH15B1XBRy3b6%2FGDeoaYGk4WNakbCLilQHEAmH2wEAMC7Om6Fwp57V%2FjtpAT1rVUCaABzFTs3i2qc%2BLlYYaXeSasIfQ9WrxnIAAFBKOQ7At1etX6%2FhltaAnU8iTCGU2p2kaBJjCE3%2Ff6djYNYCdQBpT9%2BhFNkrAoBiYCm3O0lXpThq4xCll88CMBsDWsmvKbR%2FpYcEpgozerrdSdaWxwsVG6HUwsC7XmrEgIg0g%2FgXUailAniWagfHnbDdSSq2XgWWw4VaWxIHQFB9amnvaZD9HG%2B1v%2FoRpNEoLlcMWGvrACzC1RZmIrS%2F6pk3mTFm2WJAA8Rwug3Vmlc7NrcthQHNPAsYowE9Jy6up5A1K3Ek8qoI9koqVopENhd5bQPQqp4gZrtIYwxKGTo6DFFs0No0x38abgSxBqhY%2BU6EVK8iU1fClVS7ABxForFh0NBapaLZ%2BSuaz%2BxSFCY1tFinXZ7fV2mAY0Hw3zWRvLCwhW7hbqCzfQA6J8yNAVEaoxWffaLKp37bMll2r9mdGusKa%2B1lC%2Fzp%2BFh%2BWmQwpN7zL8Edoki3CyBnzHtqtQQX8jVGz5QplDSFSUO5YmDa8ud%2FVOH3H65RLDlXBWGMwXGc5mKmWCwSx3FdUY0Ji8LLKZFfd1k6n7qom4A3W8ei4TWbQX8I5UZKO6AMShvGvmPv2dJ7kmRnzJlfSNCdgVg07%2FvZACmDqglPf2YKEHb%2Fcyc9WYXWC7OhiBDHMUEQUK1WqVQqVCqVBYWMt5CX01YuZZTKLVXQNLIF%2BPbcUXsBiT6KBHeIVaBAUKz%2BIPS53%2BLu7Q54DsSToARmhLgMaIUpK57%2B9BRhWOMre1x6cwqRumuICFEUEcdxY2OrvgKbl4WaAP5s9GTxX9bdtNsX%2BROj1AIrCKDhzvmgnFsuTERv99wP6gDIitYH40BDYIEAWsvIbAzGMZgpw5f%2BOGCmOsnfPgdGK%2BaXjEbhmr8pMGdBA%2FA%2FjvlyAX5igWgRDmDrqRs2rVkAYtPFHwN%2FP3%2F88ibM0gk6DgHt8bnHXHp7NMLimWc%2BoEUBPDNytHDGmD8oi8WKELVwLEIgkrpE9LvzhYiGsutBHpq7ihaMCtEqRiuLVhajhDm2FTBpxYV8jbs%2FEZMf13hu%2B2vjBQAAHjt59F%2FPav3XMyIIczNRCJSFT19Yv2lDU%2FjhNSvRiW%2Bi3LUoLxZJlMOKTzCVpBKtIjJZxOtC3BTW82E2kzSEP5MP2fHxkAOHNB3JJQ21KM2JgVbader449%2B44ebVa639mKsUccu1KSQzYsOXyxtu%2BUjXyPBxUDOo5O%2BhO2vFr8itw69He6ZFuiKBk7%2F1APsO%2FZCDB%2FeTSHhUKhG%2F8ZEEX3rCQBxz%2BlzMzocihoY16TSIQDv7zK0utOTO3KM7d97%2FtVde2bMmjj7ZwWUQAlwU3ntAov2Hbhz4p2P38L8WdEVm7pgUebAqkmiYtVxSnDkbcfzEFI7rE4XC2DkDK1xGDsLOh0KOHacp%2FLXSFQHwd1%2B1j8PvfHH9xgNrovAvcqiMQRFRd62CSHcpjh93ZjNWJIKlnmAEEKNwPHBdwXU1yaShFFpW9hjOndTs%2BHjAyVNCOq1mtXptgjf4qt3lkyePfv1rUXD3a7WZV09HgQ1FMErhzQZSo3o3xoxSTIswHIVxaHTY2dlJGIaICF5Cc2Qo4t4Hqpz8sSWTufYOPQgCjDFkMhmiKGrngEMlQRJAT9ZLvH9rsmP7Bi%2BxeZU2q5Jap1yljQCB2Kgc28o5G51%2Fu1Z78%2FVadd%2Fnn3zymTAMci%2B%2B%2BCKjo6OIWKLIoLSmI9neRm%2BjEsdxjIjQ1dXFbbfdxo4dOzh37tzMVc8HqHepVaBYCGon%2FjOo%2FSPQA6zD9XI9rtMRAcUwqBBGeWAUuAR0WBv%2Fle%2F7bNmyhZUrVzIxMcHk5CTVapUgCJobv42utVWZjVTpOA5dXV10dnayYsUKstksq1evbgJyWl%2FQJlkgP8tXsp4ClLWWMAzxPI%2B%2Bvj76%2B%2Fux1jZ7mzAMm%2Bdj1locx8Fai1IK3%2FfxfR%2BnvnlCGIZNXtALLQe1KiaXy5FMJimVSkxNTeH7Pn19fbiuS7FYpFqtorUmjmMymQypVIpKpUKhUCCKIrLZLL7vMzU11WoxtZwArLU2bmg2k8mQyWQIw5BisYjWmnQ6je%2F7lEolZmZmmn2%2B7%2FvkcjmUUoyPj6OUIpPJkE6nm02etZY4jmvLCWCmUqlcSKfTvVprDh48SBRFpFIpMpkMQRDwxhtvEMcx6XS6CaZarTI8PMzg4CC%2B79Pd3Y2IMDg4SBAEdHR0sHHjRmq1GpVK5fhyApB8Pv%2BG53m3Oo5Db29v80LD13t7e%2Bu5XGvuuusutm3bxvPPP9%2FUciM2lFKsWLECEWmuiSuVCmfPnv23ZY2Bw4cP7%2FY875FGEM5PFo3%2FjuNw%2FPhxisUihUIBY0yzdixGWmvOnz%2F%2Fo7179%2B5eVgBDQ0OHMpnMH65ateoZrXXzlHL%2BSYu1lqGhIWq1GtlstnlPa3pt%2FE4kEhQKhfLIyMinoiiaeFc%2BNdi0adOHent7HzPGbBORZEOoxd6zmDwtLXRorf3%2B2bNnnz5x4sRr8C59KzFLXl9f3625XO7nfN9%2FrzFmrVIqq5RKKaU8mSuIAiIRqYhIwVr7k1qtNlwoFA6ePn36EFBr3vhufq0yjwyQAZKAx9y9hNkjOaaBEvWlyOLzXy%2BA%2F2%2F6PzBw4Z94LQ3uAAAAAElFTkSuQmCC" style="margin-right: 4px;"/></td>
|
||||||
|
<td valign="middle">
|
||||||
|
<b><div id="msg"></div></b>
|
||||||
|
<p><a id="help" href="help.html" target="_o2pTab"></a> <span id="sep">|</span>
|
||||||
|
<a id="signout" target="_o2pTab" style="color: gray;"></a></p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
37
third_party/operatophone/send_logic.js
vendored
Normal file
37
third_party/operatophone/send_logic.js
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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(title, url, sel, msgType, 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// title, url and sel have already been encoded...
|
||||||
|
var data = 'title=' + title + '&url=' + url +
|
||||||
|
'&sel=' + sel + '&type=' + encodeURIComponent(msgType);
|
||||||
|
req.send(data);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user