summaryrefslogtreecommitdiffstats
path: root/ppapi
diff options
context:
space:
mode:
authorbinji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-13 18:30:57 +0000
committerbinji@chromium.org <binji@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-13 18:30:57 +0000
commita688276a943167b08e04dfab58e171393083cbd6 (patch)
tree1c12195a6800700bff39e0317e199df7dc03a0d2 /ppapi
parentb32505712071c25688fddd89d2226964c6f6b9cd (diff)
downloadchromium_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')
-rwxr-xr-xppapi/native_client/tools/browser_tester/browser_tester.py9
-rw-r--r--ppapi/native_client/tools/browser_tester/browserdata/nacltest.js11
-rw-r--r--ppapi/native_client/tools/browser_tester/browsertester/server.py42
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