11
votes

Utilisation du navigateur pour UI de bureau

Comment puis-je utiliser le navigateur en tant qu'UI pour une application de bureau? Les voies que j'ai montées jusqu'à présent sont ...

  1. Utilisez tout HTML / JavaScript. Problème: Impossible d'accéder au système de fichiers ou à n'importe quoi d'autre chose.
  2. Exécutez un serveur Web local pendant que l'application est utilisée. Problème: Comment puis-je le tuer lorsque l'utilisateur est terminé? Mes utilisateurs ne sont pas suffisamment techniques pour Ctrl + c.
  3. Incorporer un composant de navigateur dans une interface graphique régulière. Problème: Les composants de navigateur embarqués ont tendance à être glitchy au mieux. Le support pour JavaScript / CSS n'est jamais aussi bon que dans un vrai navigateur.
  4. ...?

    La solution idéale fonctionnerait avec n'importe quelle technologie. Je sais qu'il y a des options telles que l'écriture des extensions de Firefox, mais je veux avoir une liberté totale dans la technologie de contrôle et l'indépendance du navigateur.


2 commentaires

Intéressant Vous devez demander: Je suis en train de créer un plugin NPAPI (Firefox, Chrome) pour découvrir "Applications de bureau" disponibles via HTTP. Il est basé sur la découverte du service Avahi MDNS.


J'ai également ouvert des "bugs" sur chrome pour avoir contribué à cet objectif.


6 Réponses :


2
votes

dans Windows, vous pouvez intégrer le contrôle ActiveX IE, qui utilise le même moteur de rendu que c'est à dire. (C'est un plus et un moins) Vous pouvez définir la propriété scriptObject dans votre code hôte et y accéder à JavaScript sous la fenêtre .external pour faire des choses que JavaScript ne peut pas faire. < / p>

Si vous exécutez un serveur Web local, vous pouvez avoir un lien de sortie dans l'application qui tue la webSever.


5 commentaires

Ce que j'ai du mal à comprendre, c'est comment écrire le lien de tuer. J'ai monté une solution, mais c'est très hacky. Les serveurs que j'ai essayés ont tous été python, mais tout exemple de béton serait cool.


Et bien sûr, il y a le problème que l'utilisateur peut ne pas cliquer sur le lien Kill.


Si vous hébergez un contrôle WebBrowser, vous pouvez tuer le serveur lorsque l'application hôte quitte. Sinon, vous pouvez tuer le serveur un peu de temps après la dernière demande et envoyer des battements de coeur dans vos pages au cas où l'utilisateur le quitte seul pendant un moment. Ou, vous pouvez simplement laisser ça courir.


J'aime l'idée d'envoyer des battements de coeur. J'ai du mal à trouver l'interrupteur OFF sur n'importe quel serveur Web Python. Ils semblent tous supposer que vous ne voudriez jamais tuer le serveur en code.


Je ne peux pas vous aider là-bas. Vous pouvez poser une question distincte ici.



1
votes

Vous n'avez pas mentionné le système d'exploitation que vous devrez cibler. Mais vous pourrez peut-être créer un serveur Web stataire de programme, puis a lié le navigateur par défaut. Attendez que le navigateur soit terminé par l'utilisateur, puis fermez le serveur Web.

Donc, par exemple, sous Windows, vous pouvez utiliser CreateProcess () pour apparaître le processus Ensuite, msgwaitAlformultiplateObjects () pour attendre qu'il soit fini d'exécuter.


6 commentaires

L'indépendance du système d'exploitation serait également fabuleuse, mais Windows est ce que je travaille. Cela semble que cela pourrait fonctionner. L'utilisateur pourrait toujours laisser le navigateur ouverte et l'utiliser pour naviguer sur d'autres sites, mais au moins je sais finalement il sera fermé. Il peut y avoir un problème si le navigateur décide d'ouvrir l'application dans un nouvel onglet plutôt que du nouveau navigateur. Je pense que Firefox fait cela même quand appelé de la ligne de commande.


Si vous attendez que le navigateur ferme, vous n'arrêterez jamais d'attendre. N'oubliez pas que tous les navigateurs modernes appuient des onglets, de sorte que beaucoup de gens, moi-même inclus, courent un navigateur 24h / 24 et 7j / 7.


En outre, si le navigateur est déjà en cours d'exécution, vous n'obtiendrez même pas de nouveau processus pour attendre.


... Sauf sur Google Chrome: chaque onglet est un processus distinct.


Oui, mais je ne pense pas que ce processus séparé est le même que vous avez lancé. (Je pourrais toutefois avoir tord)


Si le programme serveur / parent apporte une fenêtre de navigateur pour les E / S, il peut ensuite sonder pour l'existence de la fenêtre (par exemple, pour Enumwindows () {EnumChildWindows ())} - Cela fonctionnera également pour les onglets). Pas de fenêtre? Emballer et rentrer à la maison. Le serveur se termine lorsque l'onglet est fermé, le navigateur est fermé ou la machine est fermée.



10
votes

Veuillez noter que si vous choisissez d'exécuter un serveur Web local, vous créez un risque de sécurité.

Toute page Web exécutée sur la même machine qui connaît votre application peut envoyer des demandes à votre serveur à l'aide de JavaScript et que vous n'avez pas de moyen simple et fiable de savoir quelle est la demande. (Ne faites pas confiance au référateur en-tête)

Google Desktop, qui utilise une approche similaire, a eu plusieurs vulnérabilités réelles qui permettent à toute page Web de lire n'importe quel fichier sur disque.

Il y a plusieurs façons de protéger contre cela; Je recommanderais de demander à chaque demande d'avoir une clé authentifiée générée de manière aléatoire par machine (et expire à un moment donné), que vous pouvez mettre dans la source pour les pages réelles. La protection XHR empêcherait les sites Web malveillants de lire la clé d'autorisation, de les rendre impuissants.


4 commentaires

Le serveur local ne peut pas être défini pour accepter uniquement les demandes de la même machine qu'il s'exécute?


Oui; Je voulais dire que JavaScript sur le même client pourrait envoyer de telles demandes.


Pourquoi la protection XHR n'empêche-t-elle pas les demandes en premier lieu? Je ne suis pas sûr que je comprends complètement cela ici.


XHR empêche d'autres pages de lire les réponses, mais pas de l'envoi de demandes. Le niveau de vulnérabilité dépend de ce que font les demandes. Je ne sais pas comment la vulnérabilité de Google Desktop a permis aux attaquants de lire des fichiers, mais je crois que cela a fait.



1
votes

Les applications HTML (HTA, pour courtes) ont été autour depuis un moment. Vous pouvez lire tout sur eux ici . Ils sont fondamentalement HTML et JavaScript avec des options supplémentaires pour créer une fenêtre et avec accès au système de fichiers local. Ils semblent être exactement ce que vous voulez. C'est Microsoft Technology, de sorte que cela ne fonctionnera que avec IE sur les systèmes Windows. J'ai utilisé avec succès cela comme front-end pour un CD-ROM qui a été utilisé pour distribuer des logiciels aux étudiants de première année

Une autre option serait d'utiliser Adobe Air. Je ne suis pas tout ce qui connaît la technologie, mais il semble fournir un cadre pour déployer des pages Web en tant qu'applications de bureau. Je ne peux pas poster un deuxième lien comme invité, mais juste Google It et vous le trouverez assez tôt.


1 commentaires

En fait, c'est exactement ce que je ne veux pas, car "je veux avoir une liberté totale dans la technologie de contrôle et l'indépendance du navigateur".



4
votes

Si vous recherchez un serveur Web Python avec un lien Kill, vous pouvez toujours vérifier Cherrypy.

import webbrowser
import cherrypy
import threading

class MyApp:
    """ Sample request handler class. """

    @cherrypy.expose
    def index(self):
        return """<html><head><title>An example application</title></head>
<body>
<h1>This is my sample application</h1>
Put the content here...
<hr>
<a href="/exit">Quit</a>
</body></html>"""

    @cherrypy.expose
    def exit(self):
        raise SystemExit(0)


class MyBGThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.start()

    def run(self):
        cherrypy.tree.mount(MyApp())
        cherrypy.quickstart()

myThread = MyBGThread()
webbrowser.open("http://127.0.0.1:8080")


1 commentaires

C'est le genre de choses que je cherche. Merci.



4
votes

Je cherche à faire exactement la même chose (application Desktop qui utilise un navigateur HTML5 / CSS3 à jour en tant que GUI de l'application de bureau), uniquement avec Ruby (diverses raisons pour lesquelles j'ai décidé de travailler avec Ruby). Son incroyable le nombre de bibliothèques de plateformes croisées est proposée. Mais pourtant, peu de personnes à personne, n'a fait de travail sur la tentative d'obtenir un navigateur Web d'être un UI d'application de bureau. Problème de plate-forme croisée ... Eh bien, je ne dirai pas résolue, mais je dirai plusieurs étapes dans la bonne direction prise.

Pour moi, ce serait parfait avec les nouvelles normes HTML5 / CSS3 qui sortent. Je sais que cela peut être fait avec un serveur Web fonctionnant localement.

Une autre façon peut être comme la façon dont les gars de "280 nord" font ce qu'ils font. Ils ont développé Objective-J (une extension de JavaScript régulier qui imite comment Objective-C s'étend régulièrement C) et cappuccino (l'équivalent objectif-j équivalent de l'œuvre de cacao de l'objectif-C sur le Mac). Ils ont également développé "Atlas" qui est la version de 280 nord du "Builder d'interface" d'Apple à partir de Xcode, pour leurs frameworks Objective-J et Cappuccino pour construire des applications Internet. Atlas est en fait une application Web de cappuccino en cours d'exécution sur votre bureau comme application de bureau. Dans ce cas, ils utilisent le narwhal ... une plate-forme transversale, un objectif général, une plate-forme JavaScript pour développer des applications JS en dehors du navigateur (essentiellement un serveur Web spécialisé).

Si quelqu'un peut proposer une idée de faire "navigateur, connexion directe Connect to Desktop" Travailler sans avoir besoin d'un serveur Web coexistant et de manipuler la région locale, je serais très intéressé ... Hmmm ... maintenant que j'y pense, je me demande si le nouveau projet Google Chrome "Native Client" peut être utilisé pour le faire. NaCl ressemble beaucoup à ACTIF X Sauf que vous ne vous limitez pas à une plate-forme Windows (mais sera limitée au navigateur Google Chrome, au moins pour l'instant). Seulement une sécurité supplémentaire via Sandboxing, mais vous pouvez manipuler le FS local ... plus j'y pense, plus je commence à soupçonner que cela puisse être fait.

Toutes les pensées?


0 commentaires