summaryrefslogtreecommitdiffstats
path: root/chromium/tools/oopif/iframe_server.py
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/tools/oopif/iframe_server.py')
-rw-r--r--chromium/tools/oopif/iframe_server.py224
1 files changed, 0 insertions, 224 deletions
diff --git a/chromium/tools/oopif/iframe_server.py b/chromium/tools/oopif/iframe_server.py
deleted file mode 100644
index ace58422003..00000000000
--- a/chromium/tools/oopif/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()