diff options
author | binji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-13 18:30:57 +0000 |
---|---|---|
committer | binji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-13 18:30:57 +0000 |
commit | a688276a943167b08e04dfab58e171393083cbd6 (patch) | |
tree | 1c12195a6800700bff39e0317e199df7dc03a0d2 /ppapi | |
parent | b32505712071c25688fddd89d2226964c6f6b9cd (diff) | |
download | chromium_src-a688276a943167b08e04dfab58e171393083cbd6.zip chromium_src-a688276a943167b08e04dfab58e171393083cbd6.tar.gz chromium_src-a688276a943167b08e04dfab58e171393083cbd6.tar.bz2 |
PPAPI browser_tester: Add ability to write files via POST.
This is only enabled if the user runs the browser_tester with the
"--output_dir" flag. No files outside of this directory will be modified.
BUG=none
R=ncbray@chromium.org
Review URL: https://codereview.chromium.org/23823007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223086 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi')
3 files changed, 58 insertions, 4 deletions
diff --git a/ppapi/native_client/tools/browser_tester/browser_tester.py b/ppapi/native_client/tools/browser_tester/browser_tester.py index c01f4e3c..0fef6ea 100755 --- a/ppapi/native_client/tools/browser_tester/browser_tester.py +++ b/ppapi/native_client/tools/browser_tester/browser_tester.py @@ -47,6 +47,12 @@ def BuildArgParser(): metavar='DIRNAME', help='Add directory DIRNAME to be served from the HTTP ' 'server to be made visible under the root.') + parser.add_option('--output_dir', dest='output_dir', action='store', + type='string', default=None, + metavar='DIRNAME', + help='Set directory DIRNAME to be the output directory ' + 'when POSTing data to the server. NOTE: if this flag is ' + 'not set, POSTs will fail.') parser.add_option('--test_arg', dest='test_args', action='append', type='string', nargs=2, default=[], metavar='KEY VALUE', @@ -243,7 +249,8 @@ def RunTestsOnce(url, options): options.allow_404, options.bandwidth, listener, - options.serving_dirs) + options.serving_dirs, + options.output_dir) browser = browsertester.browserlauncher.ChromeLauncher(options) diff --git a/ppapi/native_client/tools/browser_tester/browserdata/nacltest.js b/ppapi/native_client/tools/browser_tester/browserdata/nacltest.js index 6917d5a..59a13400 100644 --- a/ppapi/native_client/tools/browser_tester/browserdata/nacltest.js +++ b/ppapi/native_client/tools/browser_tester/browserdata/nacltest.js @@ -466,6 +466,17 @@ function embed_name(embed) { } +// Write data to the filesystem. This will only work if the browser_tester was +// initialized with --output_dir. +function outputFile(name, data, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.onload = onload; + xhr.onerror = onerror; + xhr.open('POST', name, true); + xhr.send(data); +} + + // Webkit Bug Workaround // THIS SHOULD BE REMOVED WHEN Webkit IS FIXED // http://code.google.com/p/nativeclient/issues/detail?id=2428 diff --git a/ppapi/native_client/tools/browser_tester/browsertester/server.py b/ppapi/native_client/tools/browser_tester/browsertester/server.py index d1f9375..971d0d6 100644 --- a/ppapi/native_client/tools/browser_tester/browsertester/server.py +++ b/ppapi/native_client/tools/browser_tester/browsertester/server.py @@ -124,8 +124,43 @@ class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): self.end_headers() data = self.rfile.read(int(self.headers.getheader('content-length'))) self.wfile.write(data) + elif self.server.output_dir is not None: + # Try to write the file to disk. + path = self.NormalizePath(path) + output_path = os.path.join(self.server.output_dir, path) + try: + outfile = open(output_path, 'w') + except IOError: + error_message = 'File not found: %r' % output_path + self.server.listener.ServerError(error_message) + self.send_error(404, error_message) + return + + try: + data = self.rfile.read(int(self.headers.getheader('content-length'))) + outfile.write(data) + except IOError, e: + outfile.close() + try: + os.remove(output_path) + except OSError: + # Oh, well. + pass + error_message = 'Can\'t write file: %r\n' % output_path + error_message += 'Exception:\n%s' % str(e) + self.server.listener.ServerError(error_message) + self.send_error(500, error_message) + return + + outfile.close() + + # Send a success response. + self.send_response(200) + self.end_headers() else: - self.send_error(404, 'File not found') + error_message = 'File not found: %r' % path + self.server.listener.ServerError(error_message) + self.send_error(404, error_message) self.server.ResetTimeout() @@ -214,8 +249,8 @@ class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): class Server(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): def Configure( - self, file_mapping, redirect_mapping, extensions_mapping, allow_404, - bandwidth, listener, serving_dirs=[]): + self, file_mapping, redirect_mapping, extensions_mapping, allow_404, + bandwidth, listener, serving_dirs=[], output_dir=None): self.file_mapping = file_mapping self.redirect_mapping = redirect_mapping self.extensions_mapping.update(extensions_mapping) @@ -224,6 +259,7 @@ class Server(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): self.listener = listener self.rpc_lock = threading.Lock() self.serving_dirs = serving_dirs + self.output_dir = output_dir def TestingBegun(self, timeout): self.test_in_progress = True |