| Index: tools/perf/perf_tools/iframe_server.py
|
| diff --git a/tools/perf/perf_tools/iframe_server.py b/tools/perf/perf_tools/iframe_server.py
|
| deleted file mode 100644
|
| index ace584220035595e9bfd1d3e874f1a388f61f730..0000000000000000000000000000000000000000
|
| --- a/tools/perf/perf_tools/iframe_server.py
|
| +++ /dev/null
|
| @@ -1,224 +0,0 @@
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""Test server for generating nested iframes with different sites.
|
| -
|
| -Very simple python server for creating a bunch of iframes. The page generation
|
| -is randomized based on query parameters. See the __init__ function of the
|
| -Params class for a description of the parameters.
|
| -
|
| -This server relies on gevent. On Ubuntu, install it via:
|
| -
|
| - sudo apt-get install python-gevent
|
| -
|
| -Run the server using
|
| -
|
| - python iframe_server.py
|
| -
|
| -To use the server, run chrome as follows:
|
| -
|
| - google-chrome --host-resolver-rules='map *.invalid 127.0.0.1'
|
| -
|
| -Change 127.0.0.1 to be the IP of the machine this server is running on. Then
|
| -in this chrome instance, navigate to any domain in .invalid
|
| -(eg., http://1.invalid:8090) to run this test.
|
| -
|
| -"""
|
| -
|
| -import colorsys
|
| -import copy
|
| -import random
|
| -import urllib
|
| -import urlparse
|
| -
|
| -from gevent import pywsgi # pylint: disable=F0401
|
| -
|
| -MAIN_PAGE = """
|
| -<html>
|
| - <head>
|
| - <style>
|
| - body {
|
| - background-color: %(color)s;
|
| - }
|
| - </style>
|
| - </head>
|
| - <body>
|
| - <center>
|
| - <h1><a href="%(url)s">%(site)s</a></h1>
|
| - <p><small>%(url)s</small>
|
| - </center>
|
| - <br />
|
| - %(iframe_html)s
|
| - </body>
|
| -</html>
|
| -"""
|
| -
|
| -IFRAME_FRAGMENT = """
|
| -<iframe src="%(src)s" width="%(width)s" height="%(height)s">
|
| -</iframe>
|
| -"""
|
| -
|
| -class Params(object):
|
| - """Simple object for holding parameters"""
|
| - def __init__(self, query_dict):
|
| - # Basic params:
|
| - # nframes is how many frames per page.
|
| - # nsites is how many sites to random choose out of.
|
| - # depth is how deep to make the frame tree
|
| - # pattern specifies how the sites are layed out per depth. An empty string
|
| - # uses a random N = [0, nsites] each time to generate a N.invalid URL.
|
| - # Otherwise sepcify with single letters like 'ABCA' and frame
|
| - # A.invalid will embed B.invalid will embed C.invalid will embed A.
|
| - # jitter is the amount of randomness applied to nframes and nsites.
|
| - # Should be from [0,1]. 0.0 means no jitter.
|
| - # size_jitter is like jitter, but for width and height.
|
| - self.nframes = int(query_dict.get('nframes', [4] )[0])
|
| - self.nsites = int(query_dict.get('nsites', [10] )[0])
|
| - self.depth = int(query_dict.get('depth', [1] )[0])
|
| - self.jitter = float(query_dict.get('jitter', [0] )[0])
|
| - self.size_jitter = float(query_dict.get('size_jitter', [0.5] )[0])
|
| - self.pattern = query_dict.get('pattern', [''] )[0]
|
| - self.pattern_pos = int(query_dict.get('pattern_pos', [0] )[0])
|
| -
|
| - # Size parameters. Values are percentages.
|
| - self.width = int(query_dict.get('width', [60])[0])
|
| - self.height = int(query_dict.get('height', [50])[0])
|
| -
|
| - # Pass the random seed so our pages are reproduceable.
|
| - self.seed = int(query_dict.get('seed',
|
| - [random.randint(0, 2147483647)])[0])
|
| -
|
| -
|
| -def get_site(urlpath):
|
| - """Takes a urlparse object and finds its approximate site.
|
| -
|
| - Site is defined as registered domain name + scheme. We approximate
|
| - registered domain name by preserving the last 2 elements of the DNS
|
| - name. This breaks for domains like co.uk.
|
| - """
|
| - no_port = urlpath.netloc.split(':')[0]
|
| - host_parts = no_port.split('.')
|
| - site_host = '.'.join(host_parts[-2:])
|
| - return '%s://%s' % (urlpath.scheme, site_host)
|
| -
|
| -
|
| -def generate_host(rand, params):
|
| - """Generates the host to be used as an iframes source.
|
| -
|
| - Uses the .invalid domain to ensure DNS will not resolve to any real
|
| - address.
|
| - """
|
| - if params.pattern:
|
| - host = params.pattern[params.pattern_pos]
|
| - params.pattern_pos = (params.pattern_pos + 1) % len(params.pattern)
|
| - else:
|
| - host = rand.randint(1, apply_jitter(rand, params.jitter, params.nsites))
|
| - return '%s.invalid' % host
|
| -
|
| -
|
| -def apply_jitter(rand, jitter, n):
|
| - """Reduce n by random amount from [0, jitter]. Ensures result is >=1."""
|
| - if jitter <= 0.001:
|
| - return n
|
| - v = n - int(n * rand.uniform(0, jitter))
|
| - if v:
|
| - return v
|
| - else:
|
| - return 1
|
| -
|
| -
|
| -def get_color_for_site(site):
|
| - """Generate a stable (and pretty-ish) color for a site."""
|
| - val = hash(site)
|
| - # The constants below are arbitrary chosen emperically to look "pretty."
|
| - # HSV is used because it is easier to control the color than RGB.
|
| - # Reducing the H to 0.6 produces a good range of colors. Preserving
|
| - # > 0.5 saturation and value means the colors won't be too washed out.
|
| - h = (val % 100)/100.0 * 0.6
|
| - s = 1.0 - (int(val/100) % 100)/200.
|
| - v = 1.0 - (int(val/10000) % 100)/200.0
|
| - (r, g, b) = colorsys.hsv_to_rgb(h, s, v)
|
| - return 'rgb(%d, %d, %d)' % (int(r * 255), int(g * 255), int(b * 255))
|
| -
|
| -
|
| -def make_src(scheme, netloc, path, params):
|
| - """Constructs the src url that will recreate the given params."""
|
| - if path == '/':
|
| - path = ''
|
| - return '%(scheme)s://%(netloc)s%(path)s?%(params)s' % {
|
| - 'scheme': scheme,
|
| - 'netloc': netloc,
|
| - 'path': path,
|
| - 'params': urllib.urlencode(params.__dict__),
|
| - }
|
| -
|
| -
|
| -def make_iframe_html(urlpath, params):
|
| - """Produces the HTML fragment for the iframe."""
|
| - if (params.depth <= 0):
|
| - return ''
|
| - # Ensure a stable random number per iframe.
|
| - rand = random.Random()
|
| - rand.seed(params.seed)
|
| -
|
| - netloc_paths = urlpath.netloc.split(':')
|
| - netloc_paths[0] = generate_host(rand, params)
|
| -
|
| - width = apply_jitter(rand, params.size_jitter, params.width)
|
| - height = apply_jitter(rand, params.size_jitter, params.height)
|
| - iframe_params = {
|
| - 'src': make_src(urlpath.scheme, ':'.join(netloc_paths),
|
| - urlpath.path, params),
|
| - 'width': '%d%%' % width,
|
| - 'height': '%d%%' % height,
|
| - }
|
| - return IFRAME_FRAGMENT % iframe_params
|
| -
|
| -
|
| -def create_html(environ):
|
| - """Creates the current HTML page. Also parses out query parameters."""
|
| - urlpath = urlparse.urlparse('%s://%s%s?%s' % (
|
| - environ['wsgi.url_scheme'],
|
| - environ['HTTP_HOST'],
|
| - environ['PATH_INFO'],
|
| - environ['QUERY_STRING']))
|
| - site = get_site(urlpath)
|
| - params = Params(urlparse.parse_qs(urlpath.query))
|
| -
|
| - rand = random.Random()
|
| - rand.seed(params.seed)
|
| -
|
| - iframe_htmls = []
|
| - for frame in xrange(0, apply_jitter(rand, params.jitter, params.nframes)):
|
| - # Copy current parameters into iframe and make modifications
|
| - # for the recursive generation.
|
| - iframe_params = copy.copy(params)
|
| - iframe_params.depth = params.depth - 1
|
| - # Base the new seed off the current seed, but have it skip enough that
|
| - # different frame trees are unlikely to collide. Numbers and skips
|
| - # not chosen in any scientific manner at all.
|
| - iframe_params.seed = params.seed + (frame + 1) * (
|
| - 1000000 + params.depth + 333)
|
| - iframe_htmls.append(make_iframe_html(urlpath, iframe_params))
|
| - template_params = dict(params.__dict__)
|
| - template_params.update({
|
| - 'color': get_color_for_site(site),
|
| - 'iframe_html': '\n'.join(iframe_htmls),
|
| - 'site': site,
|
| - 'url': make_src(urlpath.scheme, urlpath.netloc, urlpath.path, params),
|
| - })
|
| - return MAIN_PAGE % template_params
|
| -
|
| -
|
| -def application(environ, start_response):
|
| - start_response('200 OK', [('Content-Type', 'text/html')])
|
| - if environ['PATH_INFO'] == '/favicon.ico':
|
| - yield ''
|
| - else:
|
| - yield create_html(environ)
|
| -
|
| -
|
| -server = pywsgi.WSGIServer(('', 8090), application)
|
| -
|
| -server.serve_forever()
|
|
|