chromium/third_party/blink/web_tests/external/wpt/fenced-frame/resources/fledge-decision-logic.py

# These functions are used by FLEDGE to determine the logic for the ad seller.
# For our testing purposes, we only need the minimal amount of boilerplate
# code in place to allow them to be invoked properly and move the FLEDGE
# process along. The tests do not deal with reporting results, so we leave
# `reportResult` empty. See `generateURNFromFledge` in "utils.js" to see how
# this file is used.

from wptserve.utils import isomorphic_decode

def main(request, response):
  # Set up response headers.
  headers = [
    ('Content-Type', 'Application/Javascript'),
    ('Ad-Auction-Allowed', 'true')
  ]

  # Parse URL params.
  requested_size = request.GET.first(b"requested-size", None)

  # Use URL params to modify Javascript.
  requested_size_check = ''
  if requested_size is not None:
    # request.GET stores URL keys and values in iso-8859-1 binary encoding. We
    # have to decode the values back to a string to parse width/height. Don't
    # bother sanitizing the size, because it is sanitized before auction logic
    # runs already.
    width, height = isomorphic_decode(requested_size).split('-')

    requested_size_check = (
      f'''
        if (!(auctionConfig.requestedSize.width === '{width}') &&
             (auctionConfig.requestedSize.height === '{height}')) {{
          throw new Error('requestedSize missing/incorrect in auctionConfig');
        }}
      '''
    )

  # Generate Javascript.
  # Note: Python fstrings use double-brackets ( {{, }} ) to insert bracket
  # literals instead of substitution sequences.
  score_ad = (
    f'''function scoreAd(
      adMetadata,
      bid,
      auctionConfig,
      trustedScoringSignals,
      browserSignals) {{
        {requested_size_check}
        return 2*bid;
      }}
    '''
  )

  report_result = (
    f'''function reportResult(
      auctionConfig,
      browserSignals) {{
        {requested_size_check}
        return;
      }}
    '''
  )

  content = f'{score_ad}\n{report_result}'

  return (headers, content)