68 self._profile_data = {'uid': uuid4()} |
68 self._profile_data = {'uid': uuid4()} |
69 self._profile_name = self.profile_name_mask % self._profile_data |
69 self._profile_name = self.profile_name_mask % self._profile_data |
70 fnull = open(os.devnull, 'w') |
70 fnull = open(os.devnull, 'w') |
71 stdout = TemporaryFile() |
71 stdout = TemporaryFile() |
72 stderr = TemporaryFile() |
72 stderr = TemporaryFile() |
|
73 self.firefox_cmd = ['firefox', '-no-remote'] |
|
74 if os.name == 'posix': |
|
75 self.firefox_cmd = ['xvfb-run', '-a'] + self.firefox_cmd |
73 try: |
76 try: |
74 home = osp.expanduser('~') |
77 home = osp.expanduser('~') |
75 user = getlogin() |
78 user = getlogin() |
76 assert os.access(home, os.W_OK), \ |
79 assert os.access(home, os.W_OK), \ |
77 'No write access to your home directory, Firefox will crash.'\ |
80 'No write access to your home directory, Firefox will crash.'\ |
78 ' Are you sure "%s" is a valid home for user "%s"' % (home, user) |
81 ' Are you sure "%s" is a valid home for user "%s"' % (home, user) |
79 check_call(['firefox', '-no-remote', '-CreateProfile', |
82 check_call(self.firefox_cmd + ['-CreateProfile', |
80 '%s %s' % (self._profile_name, self._tmp_dir)], |
83 '%s %s' % (self._profile_name, self._tmp_dir)], |
81 stdout=stdout, stderr=stderr) |
84 stdout=stdout, stderr=stderr) |
82 except CalledProcessError, cpe: |
85 except CalledProcessError, cpe: |
83 stdout.seek(0) |
86 stdout.seek(0) |
84 stderr.seek(0) |
87 stderr.seek(0) |
85 raise VerboseCalledProcessError(cpe.returncode, cpe.cmd, stdout.read(), stderr.read()) |
88 raise VerboseCalledProcessError(cpe.returncode, cpe.cmd, stdout.read(), stderr.read()) |
86 |
89 |
87 def start(self, url): |
90 def start(self, url): |
88 self.stop() |
91 self.stop() |
89 fnull = open(os.devnull, 'w') |
92 fnull = open(os.devnull, 'w') |
90 self._process = Popen(['firefox', '-no-remote', '-P', self._profile_name, url], |
93 self._process = Popen(self.firefox_cmd + ['-P', self._profile_name, url], |
91 stdout=fnull, stderr=fnull) |
94 stdout=fnull, stderr=fnull) |
92 |
95 |
93 def stop(self): |
96 def stop(self): |
94 if self._process is not None: |
97 if self._process is not None: |
95 assert self._process.returncode is None, self._process.returncode |
98 assert self._process.returncode is None, self._process.returncode |