Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / page / page_filter.py
1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import optparse
6 import re
7
8 from telemetry.core import command_line
9
10
11 def HasLabelIn(page, labels):
12   return bool(page.labels.intersection(labels))
13
14
15 class PageFilter(command_line.ArgumentHandlerMixIn):
16   """Filters pages in the page set based on command-line flags."""
17
18   @classmethod
19   def AddCommandLineArgs(cls, parser):
20     group = optparse.OptionGroup(parser, 'Page filtering options')
21     group.add_option('--page-filter',
22         help='Use only pages whose URLs match the given filter regexp.')
23     group.add_option('--page-filter-exclude',
24         help='Exclude pages whose URLs match the given filter regexp.')
25     group.add_option('--page-label-filter',
26         help='Use only pages that have any of these labels')
27     group.add_option('--page-label-filter-exclude',
28         help='Exclude pages that have any of these labels')
29
30     parser.add_option_group(group)
31
32   @classmethod
33   def ProcessCommandLineArgs(cls, parser, args):
34     cls._page_regex = None
35     cls._page_exclude_regex = None
36     cls._include_labels = None
37     cls._exclude_labels = None
38
39     if args.page_filter:
40       try:
41         cls._page_regex = re.compile(args.page_filter)
42       except re.error:
43         raise parser.error('--page-filter: invalid regex')
44
45     if args.page_filter_exclude:
46       try:
47         cls._page_exclude_regex = re.compile(args.page_filter_exclude)
48       except re.error:
49         raise parser.error('--page-filter-exclude: invalid regex')
50
51     if args.page_label_filter:
52       cls._include_labels = args.page_label_filter.split(',')
53
54     if args.page_label_filter_exclude:
55       cls._exclude_labels = args.page_label_filter_exclude.split(',')
56
57   @classmethod
58   def IsSelected(cls, page):
59     # Exclude filters take priority.
60     if cls._exclude_labels and HasLabelIn(page, cls._exclude_labels):
61       return False
62     if cls._page_exclude_regex:
63       matches_url = cls._page_exclude_regex.search(page.url)
64       matches_name = page.name and cls._page_exclude_regex.search(page.name)
65       if matches_url or matches_name:
66         return False
67
68     # Apply all filters.
69     filter_result = True
70     if cls._include_labels:
71       filter_result = filter_result and HasLabelIn(page, cls._include_labels)
72     if cls._page_regex:
73       matches_url = cls._page_regex.search(page.url)
74       matches_name = page.name and cls._page_regex.search(page.name)
75       filter_result = filter_result and (matches_url or matches_name)
76
77     return filter_result