| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											2001-03-02 02:01:40 +00:00
										 |  |  | """Interfaces for launching and remotely controlling Web browsers.""" | 
					
						
							| 
									
										
										
										
											2007-07-01 08:11:35 +00:00
										 |  |  | # Maintained by Georg Brandl. | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2007-03-21 11:51:25 +00:00
										 |  |  | import shlex | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | import stat | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  | import subprocess | 
					
						
							|  |  |  | import time | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | __all__ = ["Error", "open", "open_new", "open_new_tab", "get", "register"] | 
					
						
							| 
									
										
										
										
											2001-03-01 04:27:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | class Error(Exception): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-09 20:06:00 +00:00
										 |  |  | _browsers = {}          # Dictionary of available browser controllers | 
					
						
							|  |  |  | _tryorder = []          # Preference order of available browsers | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | def register(name, klass, instance=None, update_tryorder=1): | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  |     """Register a browser connector and, optionally, connection.""" | 
					
						
							|  |  |  |     _browsers[name.lower()] = [klass, instance] | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     if update_tryorder > 0: | 
					
						
							|  |  |  |         _tryorder.append(name) | 
					
						
							|  |  |  |     elif update_tryorder < 0: | 
					
						
							|  |  |  |         _tryorder.insert(0, name) | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  | def get(using=None): | 
					
						
							|  |  |  |     """Return a browser launcher instance appropriate for the environment.""" | 
					
						
							| 
									
										
										
										
											2002-06-02 03:04:52 +00:00
										 |  |  |     if using is not None: | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  |         alternatives = [using] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         alternatives = _tryorder | 
					
						
							|  |  |  |     for browser in alternatives: | 
					
						
							| 
									
										
										
										
											2004-05-04 09:21:43 +00:00
										 |  |  |         if '%s' in browser: | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |             # User gave us a command line, split it into name and args | 
					
						
							| 
									
										
										
										
											2007-03-21 11:51:25 +00:00
										 |  |  |             browser = shlex.split(browser) | 
					
						
							|  |  |  |             if browser[-1] == '&': | 
					
						
							|  |  |  |                 return BackgroundBrowser(browser[:-1]) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return GenericBrowser(browser) | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             # User gave us a browser name or path. | 
					
						
							| 
									
										
										
										
											2001-04-12 22:07:27 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 command = _browsers[browser.lower()] | 
					
						
							|  |  |  |             except KeyError: | 
					
						
							|  |  |  |                 command = _synthesize(browser) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             if command[1] is not None: | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  |                 return command[1] | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             elif command[0] is not None: | 
					
						
							|  |  |  |                 return command[0]() | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  |     raise Error("could not locate runnable browser") | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Please note: the following definition hides a builtin function. | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | # It is recommended one does "import webbrowser" and uses webbrowser.open(url) | 
					
						
							|  |  |  | # instead of "from webbrowser import *". | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  | def open(url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     for name in _tryorder: | 
					
						
							|  |  |  |         browser = get(name) | 
					
						
							|  |  |  |         if browser.open(url, new, autoraise): | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  |     return False | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | def open_new(url): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     return open(url, 1) | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | def open_new_tab(url): | 
					
						
							|  |  |  |     return open(url, 2) | 
					
						
							| 
									
										
										
										
											2001-04-12 22:07:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _synthesize(browser, update_tryorder=1): | 
					
						
							| 
									
										
										
										
											2001-04-12 22:07:27 +00:00
										 |  |  |     """Attempt to synthesize a controller base on existing controllers.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This is useful to create a controller when a user specifies a path to | 
					
						
							|  |  |  |     an entry in the BROWSER environment variable -- we can copy a general | 
					
						
							|  |  |  |     controller to operate using a specific installation of the desired | 
					
						
							|  |  |  |     browser in this way. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If we can't create a controller in this way, or if there is no | 
					
						
							|  |  |  |     executable for the requested browser, return [None, None]. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     cmd = browser.split()[0] | 
					
						
							|  |  |  |     if not _iscommand(cmd): | 
					
						
							| 
									
										
										
										
											2001-04-12 22:07:27 +00:00
										 |  |  |         return [None, None] | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     name = os.path.basename(cmd) | 
					
						
							| 
									
										
										
										
											2001-04-12 22:07:27 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         command = _browsers[name.lower()] | 
					
						
							|  |  |  |     except KeyError: | 
					
						
							|  |  |  |         return [None, None] | 
					
						
							|  |  |  |     # now attempt to clone to fit the new name: | 
					
						
							|  |  |  |     controller = command[1] | 
					
						
							|  |  |  |     if controller and name.lower() == controller.basename: | 
					
						
							|  |  |  |         import copy | 
					
						
							|  |  |  |         controller = copy.copy(controller) | 
					
						
							|  |  |  |         controller.name = browser | 
					
						
							|  |  |  |         controller.basename = os.path.basename(browser) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |         register(browser, None, controller, update_tryorder) | 
					
						
							| 
									
										
										
										
											2001-04-12 22:07:27 +00:00
										 |  |  |         return [None, controller] | 
					
						
							| 
									
										
										
										
											2001-08-13 14:37:23 +00:00
										 |  |  |     return [None, None] | 
					
						
							| 
									
										
										
										
											2001-04-12 22:07:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | if sys.platform[:3] == "win": | 
					
						
							|  |  |  |     def _isexecutable(cmd): | 
					
						
							|  |  |  |         cmd = cmd.lower() | 
					
						
							| 
									
										
										
										
											2006-06-09 20:43:48 +00:00
										 |  |  |         if os.path.isfile(cmd) and cmd.endswith((".exe", ".bat")): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             return True | 
					
						
							|  |  |  |         for ext in ".exe", ".bat": | 
					
						
							|  |  |  |             if os.path.isfile(cmd + ext): | 
					
						
							|  |  |  |                 return True | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     def _isexecutable(cmd): | 
					
						
							|  |  |  |         if os.path.isfile(cmd): | 
					
						
							|  |  |  |             mode = os.stat(cmd)[stat.ST_MODE] | 
					
						
							|  |  |  |             if mode & stat.S_IXUSR or mode & stat.S_IXGRP or mode & stat.S_IXOTH: | 
					
						
							|  |  |  |                 return True | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | def _iscommand(cmd): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     """Return True if cmd is executable or can be found on the executable
 | 
					
						
							|  |  |  |     search path."""
 | 
					
						
							|  |  |  |     if _isexecutable(cmd): | 
					
						
							|  |  |  |         return True | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |     path = os.environ.get("PATH") | 
					
						
							|  |  |  |     if not path: | 
					
						
							| 
									
										
										
										
											2002-04-04 22:55:58 +00:00
										 |  |  |         return False | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |     for d in path.split(os.pathsep): | 
					
						
							|  |  |  |         exe = os.path.join(d, cmd) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |         if _isexecutable(exe): | 
					
						
							| 
									
										
										
										
											2002-04-04 22:55:58 +00:00
										 |  |  |             return True | 
					
						
							|  |  |  |     return False | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | # General parent classes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BaseBrowser(object): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     """Parent class for all browsers. Do not use directly.""" | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     args = ['%s'] | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     def __init__(self, name=""): | 
					
						
							|  |  |  |         self.name = name | 
					
						
							| 
									
										
										
										
											2005-10-08 20:47:38 +00:00
										 |  |  |         self.basename = name | 
					
						
							| 
									
										
										
										
											2005-12-25 23:18:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |     def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2005-10-04 03:17:49 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     def open_new(self, url): | 
					
						
							|  |  |  |         return self.open(url, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def open_new_tab(self, url): | 
					
						
							|  |  |  |         return self.open(url, 2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | class GenericBrowser(BaseBrowser): | 
					
						
							|  |  |  |     """Class for all browsers started with a command
 | 
					
						
							|  |  |  |        and without remote functionality."""
 | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     def __init__(self, name): | 
					
						
							|  |  |  |         if isinstance(name, basestring): | 
					
						
							|  |  |  |             self.name = name | 
					
						
							| 
									
										
										
										
											2007-07-01 08:11:35 +00:00
										 |  |  |             self.args = ["%s"] | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             # name should be a list with arguments | 
					
						
							|  |  |  |             self.name = name[0] | 
					
						
							|  |  |  |             self.args = name[1:] | 
					
						
							| 
									
										
										
										
											2005-10-08 20:47:38 +00:00
										 |  |  |         self.basename = os.path.basename(self.name) | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |     def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  |         cmdline = [self.name] + [arg.replace("%s", url) | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |                                  for arg in self.args] | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2006-09-24 10:36:01 +00:00
										 |  |  |             if sys.platform[:3] == 'win': | 
					
						
							|  |  |  |                 p = subprocess.Popen(cmdline) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 p = subprocess.Popen(cmdline, close_fds=True) | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |             return not p.wait() | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BackgroundBrowser(GenericBrowser): | 
					
						
							|  |  |  |     """Class for all browsers which are to be started in the
 | 
					
						
							|  |  |  |        background."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |     def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         cmdline = [self.name] + [arg.replace("%s", url) | 
					
						
							|  |  |  |                                  for arg in self.args] | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2006-09-24 10:36:01 +00:00
										 |  |  |             if sys.platform[:3] == 'win': | 
					
						
							|  |  |  |                 p = subprocess.Popen(cmdline) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 setsid = getattr(os, 'setsid', None) | 
					
						
							|  |  |  |                 if not setsid: | 
					
						
							|  |  |  |                     setsid = getattr(os, 'setpgrp', None) | 
					
						
							|  |  |  |                 p = subprocess.Popen(cmdline, close_fds=True, preexec_fn=setsid) | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |             return (p.poll() is None) | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             return False | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | class UnixBrowser(BaseBrowser): | 
					
						
							|  |  |  |     """Parent class for all Unix browsers with remote functionality.""" | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     raise_opts = None | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     remote_args = ['%action', '%s'] | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     remote_action = None | 
					
						
							|  |  |  |     remote_action_newwin = None | 
					
						
							|  |  |  |     remote_action_newtab = None | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     background = False | 
					
						
							|  |  |  |     redirect_stdout = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _invoke(self, args, remote, autoraise): | 
					
						
							|  |  |  |         raise_opt = [] | 
					
						
							|  |  |  |         if remote and self.raise_opts: | 
					
						
							|  |  |  |             # use autoraise argument only for remote invocation | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |             autoraise = int(autoraise) | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |             opt = self.raise_opts[autoraise] | 
					
						
							|  |  |  |             if opt: raise_opt = [opt] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cmdline = [self.name] + raise_opt + args | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         if remote or self.background: | 
					
						
							|  |  |  |             inout = file(os.devnull, "r+") | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             # for TTY browsers, we need stdin/out | 
					
						
							|  |  |  |             inout = None | 
					
						
							|  |  |  |         # if possible, put browser in separate process group, so | 
					
						
							|  |  |  |         # keyboard interrupts don't affect browser as well as Python | 
					
						
							|  |  |  |         setsid = getattr(os, 'setsid', None) | 
					
						
							|  |  |  |         if not setsid: | 
					
						
							|  |  |  |             setsid = getattr(os, 'setpgrp', None) | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         p = subprocess.Popen(cmdline, close_fds=True, stdin=inout, | 
					
						
							|  |  |  |                              stdout=(self.redirect_stdout and inout or None), | 
					
						
							|  |  |  |                              stderr=inout, preexec_fn=setsid) | 
					
						
							|  |  |  |         if remote: | 
					
						
							|  |  |  |             # wait five secons. If the subprocess is not finished, the | 
					
						
							|  |  |  |             # remote invocation has (hopefully) started a new instance. | 
					
						
							|  |  |  |             time.sleep(1) | 
					
						
							|  |  |  |             rc = p.poll() | 
					
						
							|  |  |  |             if rc is None: | 
					
						
							|  |  |  |                 time.sleep(4) | 
					
						
							|  |  |  |                 rc = p.poll() | 
					
						
							|  |  |  |                 if rc is None: | 
					
						
							|  |  |  |                     return True | 
					
						
							|  |  |  |             # if remote call failed, open() will try direct invocation | 
					
						
							|  |  |  |             return not rc | 
					
						
							|  |  |  |         elif self.background: | 
					
						
							|  |  |  |             if p.poll() is None: | 
					
						
							|  |  |  |                 return True | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return False | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return not p.wait() | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |     def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |         if new == 0: | 
					
						
							|  |  |  |             action = self.remote_action | 
					
						
							|  |  |  |         elif new == 1: | 
					
						
							|  |  |  |             action = self.remote_action_newwin | 
					
						
							|  |  |  |         elif new == 2: | 
					
						
							|  |  |  |             if self.remote_action_newtab is None: | 
					
						
							|  |  |  |                 action = self.remote_action_newwin | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 action = self.remote_action_newtab | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |             raise Error("Bad 'new' parameter to open(); " + | 
					
						
							|  |  |  |                         "expected 0, 1, or 2, got %s" % new) | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         args = [arg.replace("%s", url).replace("%action", action) | 
					
						
							|  |  |  |                 for arg in self.remote_args] | 
					
						
							|  |  |  |         success = self._invoke(args, True, autoraise) | 
					
						
							|  |  |  |         if not success: | 
					
						
							|  |  |  |             # remote invocation failed, try straight way | 
					
						
							|  |  |  |             args = [arg.replace("%s", url) for arg in self.args] | 
					
						
							|  |  |  |             return self._invoke(args, False, False) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return True | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | class Mozilla(UnixBrowser): | 
					
						
							|  |  |  |     """Launcher class for Mozilla/Netscape browsers.""" | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     raise_opts = ["-noraise", "-raise"] | 
					
						
							| 
									
										
										
										
											2002-10-10 22:49:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     remote_args = ['-remote', 'openURL(%s%action)'] | 
					
						
							|  |  |  |     remote_action = "" | 
					
						
							|  |  |  |     remote_action_newwin = ",new-window" | 
					
						
							|  |  |  |     remote_action_newtab = ",new-tab" | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     background = True | 
					
						
							| 
									
										
										
										
											2002-10-10 22:49:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | Netscape = Mozilla | 
					
						
							| 
									
										
										
										
											2002-10-10 22:49:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | class Galeon(UnixBrowser): | 
					
						
							|  |  |  |     """Launcher class for Galeon/Epiphany browsers.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     raise_opts = ["-noraise", ""] | 
					
						
							|  |  |  |     remote_args = ['%action', '%s'] | 
					
						
							|  |  |  |     remote_action = "-n" | 
					
						
							|  |  |  |     remote_action_newwin = "-w" | 
					
						
							| 
									
										
										
										
											2002-10-10 22:49:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     background = True | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  | class Opera(UnixBrowser): | 
					
						
							|  |  |  |     "Launcher class for Opera browser." | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     raise_opts = ["", "-raise"] | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     remote_args = ['-remote', 'openURL(%s%action)'] | 
					
						
							|  |  |  |     remote_action = "" | 
					
						
							|  |  |  |     remote_action_newwin = ",new-window" | 
					
						
							|  |  |  |     remote_action_newtab = ",new-page" | 
					
						
							|  |  |  |     background = True | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  | class Elinks(UnixBrowser): | 
					
						
							|  |  |  |     "Launcher class for Elinks browsers." | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     remote_args = ['-remote', 'openURL(%s%action)'] | 
					
						
							|  |  |  |     remote_action = "" | 
					
						
							|  |  |  |     remote_action_newwin = ",new-window" | 
					
						
							|  |  |  |     remote_action_newtab = ",new-tab" | 
					
						
							|  |  |  |     background = False | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     # elinks doesn't like its stdout to be redirected - | 
					
						
							|  |  |  |     # it uses redirected stdout as a signal to do -dump | 
					
						
							|  |  |  |     redirect_stdout = False | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  | class Konqueror(BaseBrowser): | 
					
						
							|  |  |  |     """Controller for the KDE File Manager (kfm, or Konqueror).
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     See the output of ``kfmclient --commands`` | 
					
						
							|  |  |  |     for more information on the Konqueror remote-control interface. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |     def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         # XXX Currently I know no way to prevent KFM from opening a new win. | 
					
						
							|  |  |  |         if new == 2: | 
					
						
							|  |  |  |             action = "newTab" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             action = "openURL" | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         devnull = file(os.devnull, "r+") | 
					
						
							|  |  |  |         # if possible, put browser in separate process group, so | 
					
						
							|  |  |  |         # keyboard interrupts don't affect browser as well as Python | 
					
						
							|  |  |  |         setsid = getattr(os, 'setsid', None) | 
					
						
							|  |  |  |         if not setsid: | 
					
						
							|  |  |  |             setsid = getattr(os, 'setpgrp', None) | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             p = subprocess.Popen(["kfmclient", action, url], | 
					
						
							|  |  |  |                                  close_fds=True, stdin=devnull, | 
					
						
							|  |  |  |                                  stdout=devnull, stderr=devnull) | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             # fall through to next variant | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             p.wait() | 
					
						
							|  |  |  |             # kfmclient's return code unfortunately has no meaning as it seems | 
					
						
							|  |  |  |             return True | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             p = subprocess.Popen(["konqueror", "--silent", url], | 
					
						
							|  |  |  |                                  close_fds=True, stdin=devnull, | 
					
						
							|  |  |  |                                  stdout=devnull, stderr=devnull, | 
					
						
							|  |  |  |                                  preexec_fn=setsid) | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             # fall through to next variant | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             if p.poll() is None: | 
					
						
							|  |  |  |                 # Should be running now. | 
					
						
							|  |  |  |                 return True | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             p = subprocess.Popen(["kfm", "-d", url], | 
					
						
							|  |  |  |                                  close_fds=True, stdin=devnull, | 
					
						
							|  |  |  |                                  stdout=devnull, stderr=devnull, | 
					
						
							|  |  |  |                                  preexec_fn=setsid) | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return (p.poll() is None) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Grail(BaseBrowser): | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |     # There should be a way to maintain a connection to Grail, but the | 
					
						
							|  |  |  |     # Grail remote control protocol doesn't really allow that at this | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     # point.  It probably never will! | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |     def _find_grail_rc(self): | 
					
						
							|  |  |  |         import glob | 
					
						
							|  |  |  |         import pwd | 
					
						
							|  |  |  |         import socket | 
					
						
							|  |  |  |         import tempfile | 
					
						
							|  |  |  |         tempdir = os.path.join(tempfile.gettempdir(), | 
					
						
							|  |  |  |                                ".grail-unix") | 
					
						
							| 
									
										
										
										
											2001-10-13 16:00:52 +00:00
										 |  |  |         user = pwd.getpwuid(os.getuid())[0] | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |         filename = os.path.join(tempdir, user + "-*") | 
					
						
							|  |  |  |         maybes = glob.glob(filename) | 
					
						
							|  |  |  |         if not maybes: | 
					
						
							|  |  |  |             return None | 
					
						
							|  |  |  |         s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) | 
					
						
							|  |  |  |         for fn in maybes: | 
					
						
							|  |  |  |             # need to PING each one until we find one that's live | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 s.connect(fn) | 
					
						
							|  |  |  |             except socket.error: | 
					
						
							|  |  |  |                 # no good; attempt to clean it out, but don't fail: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     os.unlink(fn) | 
					
						
							|  |  |  |                 except IOError: | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _remote(self, action): | 
					
						
							|  |  |  |         s = self._find_grail_rc() | 
					
						
							|  |  |  |         if not s: | 
					
						
							|  |  |  |             return 0 | 
					
						
							|  |  |  |         s.send(action) | 
					
						
							|  |  |  |         s.close() | 
					
						
							|  |  |  |         return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |     def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |         if new: | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             ok = self._remote("LOADNEW " + url) | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             ok = self._remote("LOAD " + url) | 
					
						
							|  |  |  |         return ok | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-09 20:06:00 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  | # Platform support for Unix | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | # These are the right tests because all these Unix browsers require either | 
					
						
							|  |  |  | # a console terminal or an X display to run. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-04 03:17:49 +00:00
										 |  |  | def register_X_browsers(): | 
					
						
							| 
									
										
										
										
											2007-03-16 07:55:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # The default GNOME browser | 
					
						
							|  |  |  |     if "GNOME_DESKTOP_SESSION_ID" in os.environ and _iscommand("gnome-open"): | 
					
						
							|  |  |  |         register("gnome-open", None, BackgroundBrowser("gnome-open")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # The default KDE browser | 
					
						
							|  |  |  |     if "KDE_FULL_SESSION" in os.environ and _iscommand("kfmclient"): | 
					
						
							|  |  |  |         register("kfmclient", Konqueror, Konqueror("kfmclient")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # The Mozilla/Netscape browsers | 
					
						
							| 
									
										
										
										
											2005-11-22 19:18:01 +00:00
										 |  |  |     for browser in ("mozilla-firefox", "firefox", | 
					
						
							|  |  |  |                     "mozilla-firebird", "firebird", | 
					
						
							| 
									
										
										
										
											2006-04-28 16:31:17 +00:00
										 |  |  |                     "seamonkey", "mozilla", "netscape"): | 
					
						
							| 
									
										
										
										
											2005-11-22 19:18:01 +00:00
										 |  |  |         if _iscommand(browser): | 
					
						
							|  |  |  |             register(browser, None, Mozilla(browser)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     # Konqueror/kfm, the KDE browser. | 
					
						
							| 
									
										
										
										
											2005-10-08 20:47:38 +00:00
										 |  |  |     if _iscommand("kfm"): | 
					
						
							|  |  |  |         register("kfm", Konqueror, Konqueror("kfm")) | 
					
						
							|  |  |  |     elif _iscommand("konqueror"): | 
					
						
							|  |  |  |         register("konqueror", Konqueror, Konqueror("konqueror")) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Gnome's Galeon and Epiphany | 
					
						
							|  |  |  |     for browser in ("galeon", "epiphany"): | 
					
						
							|  |  |  |         if _iscommand(browser): | 
					
						
							|  |  |  |             register(browser, None, Galeon(browser)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Skipstone, another Gtk/Mozilla based browser | 
					
						
							|  |  |  |     if _iscommand("skipstone"): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         register("skipstone", None, BackgroundBrowser("skipstone")) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Opera, quite popular | 
					
						
							|  |  |  |     if _iscommand("opera"): | 
					
						
							|  |  |  |         register("opera", None, Opera("opera")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Next, Mosaic -- old but still in use. | 
					
						
							|  |  |  |     if _iscommand("mosaic"): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         register("mosaic", None, BackgroundBrowser("mosaic")) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Grail, the Python browser. Does anybody still use it? | 
					
						
							|  |  |  |     if _iscommand("grail"): | 
					
						
							|  |  |  |         register("grail", Grail, None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-04 03:17:49 +00:00
										 |  |  | # Prefer X browsers if present | 
					
						
							|  |  |  | if os.environ.get("DISPLAY"): | 
					
						
							|  |  |  |     register_X_browsers() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | # Also try console browsers | 
					
						
							|  |  |  | if os.environ.get("TERM"): | 
					
						
							|  |  |  |     # The Links/elinks browsers <http://artax.karlin.mff.cuni.cz/~mikulas/links/> | 
					
						
							|  |  |  |     if _iscommand("links"): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         register("links", None, GenericBrowser("links")) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     if _iscommand("elinks"): | 
					
						
							|  |  |  |         register("elinks", None, Elinks("elinks")) | 
					
						
							|  |  |  |     # The Lynx browser <http://lynx.isc.org/>, <http://lynx.browser.org/> | 
					
						
							|  |  |  |     if _iscommand("lynx"): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         register("lynx", None, GenericBrowser("lynx")) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     # The w3m browser <http://w3m.sourceforge.net/> | 
					
						
							|  |  |  |     if _iscommand("w3m"): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |         register("w3m", None, GenericBrowser("w3m")) | 
					
						
							| 
									
										
										
										
											2001-07-19 03:46:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Platform support for Windows | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  | if sys.platform[:3] == "win": | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     class WindowsDefault(BaseBrowser): | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |         def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2007-03-16 07:55:09 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 os.startfile(url) | 
					
						
							|  |  |  |             except WindowsError: | 
					
						
							|  |  |  |                 # [Error 22] No application is associated with the specified | 
					
						
							|  |  |  |                 # file for this operation: '<URL>' | 
					
						
							|  |  |  |                 return False | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 return True | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     _tryorder = [] | 
					
						
							|  |  |  |     _browsers = {} | 
					
						
							| 
									
										
										
										
											2007-03-16 07:55:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # First try to use the default Windows browser | 
					
						
							|  |  |  |     register("windows-default", WindowsDefault) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Detect some common Windows browsers, fallback to IE | 
					
						
							|  |  |  |     iexplore = os.path.join(os.environ.get("PROGRAMFILES", "C:\\Program Files"), | 
					
						
							|  |  |  |                             "Internet Explorer\\IEXPLORE.EXE") | 
					
						
							| 
									
										
										
										
											2006-05-03 17:46:13 +00:00
										 |  |  |     for browser in ("firefox", "firebird", "seamonkey", "mozilla", | 
					
						
							| 
									
										
										
										
											2007-03-16 07:55:09 +00:00
										 |  |  |                     "netscape", "opera", iexplore): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |         if _iscommand(browser): | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |             register(browser, None, BackgroundBrowser(browser)) | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  | # Platform support for MacOS | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2000-07-09 16:45:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import ic | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     class InternetConfig(BaseBrowser): | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |         def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             ic.launchurl(url) | 
					
						
							|  |  |  |             return True # Any way to get status? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     register("internet-config", InternetConfig, update_tryorder=-1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if sys.platform == 'darwin': | 
					
						
							|  |  |  |     # Adapted from patch submitted to SourceForge by Steven J. Burr | 
					
						
							|  |  |  |     class MacOSX(BaseBrowser): | 
					
						
							|  |  |  |         """Launcher class for Aqua browsers on Mac OS X
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Optionally specify a browser name on instantiation.  Note that this | 
					
						
							|  |  |  |         will not work for Aqua browsers if the user has moved the application | 
					
						
							|  |  |  |         package after installation. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         If no browser is specified, the default browser, as specified in the | 
					
						
							|  |  |  |         Internet System Preferences panel, will be used. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         def __init__(self, name): | 
					
						
							|  |  |  |             self.name = name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 14:19:08 +00:00
										 |  |  |         def open(self, url, new=0, autoraise=True): | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             assert "'" not in url | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |             # hack for local urls | 
					
						
							|  |  |  |             if not ':' in url: | 
					
						
							|  |  |  |                 url = 'file:'+url | 
					
						
							| 
									
										
										
										
											2006-01-20 23:40:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             # new must be 0 or 1 | 
					
						
							|  |  |  |             new = int(bool(new)) | 
					
						
							|  |  |  |             if self.name == "default": | 
					
						
							|  |  |  |                 # User called open, open_new or get without a browser parameter | 
					
						
							| 
									
										
										
										
											2005-11-09 21:42:48 +00:00
										 |  |  |                 script = 'open location "%s"' % url.replace('"', '%22') # opens in default browser | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 # User called get and chose a browser | 
					
						
							|  |  |  |                 if self.name == "OmniWeb": | 
					
						
							|  |  |  |                     toWindow = "" | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     # Include toWindow parameter of OpenURL command for browsers | 
					
						
							|  |  |  |                     # that support it.  0 == new window; -1 == existing | 
					
						
							|  |  |  |                     toWindow = "toWindow %d" % (new - 1) | 
					
						
							| 
									
										
										
										
											2005-11-09 21:42:48 +00:00
										 |  |  |                 cmd = 'OpenURL "%s"' % url.replace('"', '%22') | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |                 script = '''tell application "%s"
 | 
					
						
							|  |  |  |                                 activate | 
					
						
							|  |  |  |                                 %s %s | 
					
						
							|  |  |  |                             end tell''' % (self.name, cmd, toWindow)
 | 
					
						
							|  |  |  |             # Open pipe to AppleScript through osascript command | 
					
						
							|  |  |  |             osapipe = os.popen("osascript", "w") | 
					
						
							|  |  |  |             if osapipe is None: | 
					
						
							|  |  |  |                 return False | 
					
						
							|  |  |  |             # Write script to osascript's stdin | 
					
						
							|  |  |  |             osapipe.write(script) | 
					
						
							|  |  |  |             rc = osapipe.close() | 
					
						
							|  |  |  |             return not rc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Don't clear _tryorder or _browsers since OS X can use above Unix support | 
					
						
							|  |  |  |     # (but we prefer using the OS X specific stuff) | 
					
						
							|  |  |  |     register("MacOSX", None, MacOSX('default'), -1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-25 14:35:58 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Platform support for OS/2 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | if sys.platform[:3] == "os2" and _iscommand("netscape"): | 
					
						
							|  |  |  |     _tryorder = [] | 
					
						
							|  |  |  |     _browsers = {} | 
					
						
							| 
									
										
										
										
											2001-11-25 14:35:58 +00:00
										 |  |  |     register("os2netscape", None, | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |              GenericBrowser(["start", "netscape", "%s"]), -1) | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-25 14:35:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-23 13:16:32 +00:00
										 |  |  | # OK, now that we know what the default preference orders for each | 
					
						
							|  |  |  | # platform are, allow user to override them with the BROWSER variable. | 
					
						
							| 
									
										
										
										
											2002-06-01 14:18:47 +00:00
										 |  |  | if "BROWSER" in os.environ: | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  |     _userchoices = os.environ["BROWSER"].split(os.pathsep) | 
					
						
							|  |  |  |     _userchoices.reverse() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Treat choices in same way as if passed into get() but do register | 
					
						
							|  |  |  |     # and prepend to _tryorder | 
					
						
							|  |  |  |     for cmdline in _userchoices: | 
					
						
							|  |  |  |         if cmdline != '': | 
					
						
							|  |  |  |             _synthesize(cmdline, -1) | 
					
						
							|  |  |  |     cmdline = None # to make del work if _userchoices was empty | 
					
						
							|  |  |  |     del cmdline | 
					
						
							|  |  |  |     del _userchoices | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-18 20:03:32 +00:00
										 |  |  | # what to do if _tryorder is now empty? | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     import getopt | 
					
						
							|  |  |  |     usage = """Usage: %s [-n | -t] url
 | 
					
						
							|  |  |  |     -n: open new window | 
					
						
							|  |  |  |     -t: open new tab""" % sys.argv[0]
 | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         opts, args = getopt.getopt(sys.argv[1:], 'ntd') | 
					
						
							|  |  |  |     except getopt.error, msg: | 
					
						
							|  |  |  |         print >>sys.stderr, msg | 
					
						
							|  |  |  |         print >>sys.stderr, usage | 
					
						
							|  |  |  |         sys.exit(1) | 
					
						
							|  |  |  |     new_win = 0 | 
					
						
							|  |  |  |     for o, a in opts: | 
					
						
							|  |  |  |         if o == '-n': new_win = 1 | 
					
						
							|  |  |  |         elif o == '-t': new_win = 2 | 
					
						
							|  |  |  |     if len(args) <> 1: | 
					
						
							|  |  |  |         print >>sys.stderr, usage | 
					
						
							|  |  |  |         sys.exit(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     url = args[0] | 
					
						
							|  |  |  |     open(url, new_win) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-20 21:03:35 +00:00
										 |  |  |     print "\a" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-03 14:16:44 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     main() |