[chrome-gnome-shell/feature/connector-update-check: 1/2] Moved update check code to native connector.



commit fb7c15761b6125da8945956d2867beaef5f34593
Author: Yuri Konotopov <ykonotopov gmail com>
Date:   Mon Sep 19 18:48:03 2016 +0300

    Moved update check code to native connector.

 README.md                       |    1 +
 connector/chrome-gnome-shell.py |   55 +++++++++++
 extension/include/update.js     |  195 ++++++++++++++++++++++----------------
 3 files changed, 169 insertions(+), 82 deletions(-)
---
diff --git a/README.md b/README.md
index ca0166a..27a8ea1 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@ Requirements
  * GNOME Shell up to 3.20
  * Python 2.7+ or 3.x
  * PyGObject
+ * Python Requests 2.x
 
 Installation
 ------------
diff --git a/connector/chrome-gnome-shell.py b/connector/chrome-gnome-shell.py
index 628bdb7..77d8cdf 100755
--- a/connector/chrome-gnome-shell.py
+++ b/connector/chrome-gnome-shell.py
@@ -16,6 +16,7 @@ from gi.repository import GLib, Gio
 import json
 import os
 import re
+import requests
 import struct
 import sys
 import traceback
@@ -96,6 +97,53 @@ def dbus_call_response(method, parameters, resultProperty):
     except GLib.GError as e:
         send_error(e.message)
 
+def check_update(update_url):
+    result = proxy.call_sync("ListExtensions",
+                             None,
+                             Gio.DBusCallFlags.NONE,
+                             -1,
+                             None)
+
+    extensions = result.unpack()[0]
+
+    if extensions:
+        http_request = {
+            'shell_version': proxy.get_cached_property("ShellVersion").unpack(),
+            'installed': {}
+        }
+
+        for uuid in extensions:
+            if isUUID(uuid):
+                try:
+                    http_request['installed'][uuid] = {
+                        'version': int(extensions[uuid]['version'])
+                    }
+                except ValueError:
+                    http_request['installed'][uuid] = {
+                        'version': 1
+                    }
+
+        http_request['installed'] = json.dumps(http_request['installed'])
+
+        try:
+            response = requests.get(
+                                    update_url,
+                                    params=http_request,
+                                    timeout=5
+                                    )
+            response.raise_for_status()
+            send_message({
+                         'success': True,
+                         'extensions': extensions,
+                         'upgrade': response.json()}
+                         )
+        except (
+                requests.ConnectionError, requests.HTTPError, requests.Timeout,
+                requests.TooManyRedirects, requests.RequestException, ValueError
+                ) as ex:
+            send_message({'success': False, 'message': str(ex.message) if ('message' in ex) else str(ex)})
+
+
 # Callback that reads messages from the webapp.
 def process_input(user_data):
     rlist, _, _ = select([sys.stdin], [], [], 1)
@@ -217,6 +265,13 @@ def process_input(user_data):
                                GLib.Variant.new_tuple(GLib.Variant.new_string(request['uuid'])),
                                "status")
 
+        elif request['execute'] == 'checkUpdate':
+            update_url = 'https://extensions.gnome.org/update-info/'
+            if 'url' in request:
+                update_url = request['url']
+
+            check_update(update_url)
+
         debug('[%d] Execute: from %s' % (os.getpid(), request['execute']))
         mutex.release()
 
diff --git a/extension/include/update.js b/extension/include/update.js
index 36fd788..5ac37c4 100644
--- a/extension/include/update.js
+++ b/extension/include/update.js
@@ -32,105 +32,136 @@ GSC.update = (function($) {
                        {
                                var shellVersion = response.properties.shellVersion;
 
-                               GSC.sendNativeRequest({execute: 'listExtensions'}, function 
(extensionsResponse) {
-                                       if (response.success)
-                                       {
-                                               if ($.isEmptyObject(extensionsResponse.extensions))
-                                                       return;
-
-                                               var request = {
-                                                       shell_version: shellVersion,
-                                                       installed: {}
-                                               };
-
-                                               for (uuid in extensionsResponse.extensions)
+                               // TODO: remove deprecated in version 9
+                               if(response.properties.connectorVersion >= 8)
+                               {
+                                       GSC.sendNativeRequest({execute: 'checkUpdate', url: UPDATE_URL}, 
function (response) {
+                                               if (response.success)
                                                {
-                                                       if (GSC.isUUID(uuid) && 
extensionsResponse.extensions[uuid].type == EXTENSION_TYPE.PER_USER)
-                                                       {
-                                                               request.installed[uuid] = {version: 
parseInt(extensionsResponse.extensions[uuid].version) || 1};
-                                                       }
+                                                       onSweetToothResponse(response.upgrade, 
response.extensions);
+                                               }
+                                               else
+                                               {
+                                                       createUpdateFailedNotification(response.message ? 
response.message : m('native_request_failed', 'checkUpdate'));
                                                }
+                                       });
+                               }
+                               else
+                               {
+                                       _frontendCheck(shellVersion);
+                               }
+                       }
+                       else
+                       {
+                               createUpdateFailedNotification(response.message ? response.message : 
m('native_request_failed', 'initialize'));
+                       }
+               });
+       }
 
-                                               request.installed = JSON.stringify(request.installed);
+       /*
+        * TODO: remove in version 9
+        * @Deprecated
+        */
+       function _frontendCheck(shellVersion)
+       {
+               GSC.sendNativeRequest({execute: 'listExtensions'}, function (extensionsResponse) {
+                       if (extensionsResponse.success)
+                       {
+                               if ($.isEmptyObject(extensionsResponse.extensions))
+                                       return;
 
-                                               chrome.permissions.contains({
-                                                       permissions: ["webRequest"]
-                                               }, function(webRequestEnabled) {
-                                                       if(webRequestEnabled)
-                                                       {
-                                                               chrome.webRequest.onErrorOccurred.addListener(
-                                                                       onNetworkError,
-                                                                       {
-                                                                               urls: [ UPDATE_URL + "*" ],
-                                                                               types: [ 'xmlhttprequest' ]
-                                                                       }
-                                                               );
-                                                       }
+                               var request = {
+                                       shell_version: shellVersion,
+                                       installed: {}
+                               };
 
-                                                       $.ajax({
-                                                               url: UPDATE_URL,
-                                                               data: request,
-                                                               dataType: 'json',
-                                                               method: 'GET',
-                                                               cache: false
-                                                       }).done(function (data, textStatus, jqXHR) {
-                                                               
GSC.notifications.remove(NOTIFICATION_UPDATE_CHECK_FAILED);
-
-                                                               var toUpgrade = [];
-                                                               for (uuid in data)
-                                                               {
-                                                                       if 
(extensionsResponse.extensions[uuid] && $.inArray(data[uuid], ['upgrade', 'downgrade']) !== -1)
-                                                                       {
-                                                                               toUpgrade.push({
-                                                                                       title: 
extensionsResponse.extensions[uuid].name,
-                                                                                       message: 
m('extension_status_' + data[uuid])
-                                                                               });
-                                                                       }
-                                                               }
+                               for (uuid in extensionsResponse.extensions)
+                               {
+                                       if (GSC.isUUID(uuid) && extensionsResponse.extensions[uuid].type == 
EXTENSION_TYPE.PER_USER)
+                                       {
+                                               request.installed[uuid] = {version: 
parseInt(extensionsResponse.extensions[uuid].version) || 1};
+                                       }
+                               }
 
-                                                               if (toUpgrade.length > 0)
-                                                               {
-                                                                       
GSC.notifications.create(NOTIFICATION_UPDATE_AVAILABLE, {
-                                                                               type: 
chrome.notifications.TemplateType.LIST,
-                                                                               title: m('update_available'),
-                                                                               message: '',
-                                                                               items: toUpgrade
-                                                                       });
-                                                               }
+                               request.installed = JSON.stringify(request.installed);
 
-                                                               chrome.storage.local.set({
-                                                                       lastUpdateCheck: new 
Date().toLocaleString()
-                                                               });
-                                                       }).fail(function (jqXHR, textStatus, errorThrown) {
-                                                               if(textStatus === 'error' && !errorThrown)
+                               chrome.permissions.contains({
+                                       permissions: ["webRequest"]
+                               }, function (webRequestEnabled) {
+                                       if (webRequestEnabled)
+                                       {
+                                               chrome.webRequest.onErrorOccurred.addListener(
+                                                               onNetworkError,
                                                                {
-                                                                       if(webRequestEnabled)
-                                                                       {
-                                                                               return;
-                                                                       }
-
-                                                                       textStatus = m('network_error');
+                                                                       urls: [UPDATE_URL + "*"],
+                                                                       types: ['xmlhttprequest']
                                                                }
+                                               );
+                                       }
 
-                                                               createUpdateFailedNotification(textStatus);
-                                                       }).always(function() {
-                                                               if(webRequestEnabled)
+                                       $.ajax({
+                                               url: UPDATE_URL,
+                                               data: request,
+                                               dataType: 'json',
+                                               method: 'GET',
+                                               cache: false
+                                       })
+                                               .done(function(data) {
+                                                       onSweetToothResponse(data, 
extensionsResponse.extensions)
+                                               })
+                                               .fail(function (jqXHR, textStatus, errorThrown) {
+                                                       if (textStatus === 'error' && !errorThrown)
+                                                       {
+                                                               if (webRequestEnabled)
                                                                {
-                                                                       
chrome.webRequest.onErrorOccurred.removeListener(onNetworkError);
+                                                                       return;
                                                                }
-                                                       });
+
+                                                               textStatus = m('network_error');
+                                                       }
+
+                                                       createUpdateFailedNotification(textStatus);
+                                               }).always(function () {
+                                                       if (webRequestEnabled)
+                                                       {
+                                                               
chrome.webRequest.onErrorOccurred.removeListener(onNetworkError);
+                                                       }
                                                });
-                                       }
-                                       else
-                                       {
-                                               createUpdateFailedNotification(response.message ? 
response.message : m('native_request_failed', 'listExtensions'));
-                                       }
                                });
+                       } else
+                       {
+                               createUpdateFailedNotification(response.message ? response.message : 
m('native_request_failed', 'listExtensions'));
                        }
-                       else
+               });
+       }
+
+       function onSweetToothResponse(data, installedExtensions) {
+               GSC.notifications.remove(NOTIFICATION_UPDATE_CHECK_FAILED);
+
+               var toUpgrade = [];
+               for (uuid in data)
+               {
+                       if (installedExtensions[uuid] && $.inArray(data[uuid], ['upgrade', 'downgrade']) !== 
-1)
                        {
-                               createUpdateFailedNotification(response.message ? response.message : 
m('native_request_failed', 'initialize'));
+                               toUpgrade.push({
+                                       title: installedExtensions[uuid].name,
+                                       message: m('extension_status_' + data[uuid])
+                               });
                        }
+               }
+
+               if (toUpgrade.length > 0)
+               {
+                       GSC.notifications.create(NOTIFICATION_UPDATE_AVAILABLE, {
+                               type: chrome.notifications.TemplateType.LIST,
+                               title: m('update_available'),
+                               message: '',
+                               items: toUpgrade
+                       });
+               }
+
+               chrome.storage.local.set({
+                       lastUpdateCheck: new Date().toLocaleString()
                });
        }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]