Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Intent to Implement: amp-ad-exit #8515

Closed
clawr opened this issue Mar 30, 2017 · 10 comments
Closed

Intent to Implement: amp-ad-exit #8515

clawr opened this issue Mar 30, 2017 · 10 comments
Assignees
Labels
INTENT TO IMPLEMENT Proposes implementation of a significant new feature. https://bit.ly/amp-contribute-code WG: monetization

Comments

@clawr
Copy link
Contributor

clawr commented Mar 30, 2017

Objective

For users: Provide a high-quality navigation experience for AMP creatives with fast-click protection and predictable exit behavior.

For developers: Provide features needed for display ad exits, such as pinging click tracking URLs and substituting custom URL variables. Allow exits to be configured without changing creative markup.

This initial version is only intended for ads that navigate to landing pages. This could plausibly be extended to handle other types of exits, like phone calls, but for now those are better handled by specialized components.

Background

Display ad clicks behave differently than other static web content. The ad server needs to know that the ad was clicked for proper accounting, either by redirecting through a click tracking server or by pinging the server asynchronously, and that tracking URL depends on impression-time information (e.g. an event ID) and client-side information like click location. The ad network may choose to improve click quality and the user's experience by not navigating in response to certain clicks, such as those very close to the edge of the device.

Proposal

This document proposes a new element to configure and perform exits. The element is configured with a JSON child script element and will expose an "exit" action to other elements on the page. Elements in the creative can be annotated to exit when tapped, passing a target name and extra URL parameters to insert. The exit action will perform these steps:

  1. parse the JSON config (if it hasn't yet been parsed)
  2. find the requested exit target
  3. determine whether the exit should be allowed by processing the click event through declared filters
  4. rewrite URLs using standard variable substitution rules
  5. ping any click tracking URLs
  6. perform the navigation by opening the target URL in a new tab

Details

Exit Configuration

When the JSON is parsed, the resulting object should conform to this ExitConfig type (this type description uses Closure Compiler type annotations):

/** @typedef {string} */
const Url;

/** @typedef {string|number|boolean} */
const VariableValue;

/** @typedef {!Object<string, (VariableValue|!Array<VariableValue>)>} */
const Variables;

/**
 * @typedef {{
 *   final_url: Url,
 *   tracking_urls: (!Array<Url>|undefined),
 *   vars: (Variables|undefined),
 *   filters: (!Array<string>|undefined>
 * }}
 */
const NavigationTarget;

/**
 * @typedef {{
 *   delay: (number|undefined)
 * }}
 */
const FastClickFilter;

/** @typedef {string} */
const UniqueElementSelector;

/**
 * @typedef {{
 *   top: (number|undefined),
 *   right: (number|undefined),
 *   bottom: (number|undefined),
 *   left: (number|undefined),
 *   relativeTo: (UniqueElementSelector|undefined)
 * }}
 */
const ClickLocationFilter;

/** @typedef {FastClickFilter|ClickLocationFilter} */
const Filter;

/**
 * @typedef {{
 *   targets: !Object<string, NavigationTarget>,
 *   filters: !Object<string, Filter>
 * }}
 */
const ExitConfig;

Filtering

There are initially two types of filters: location-based and time-based. Other filters (such as a confirmation prompt) could be added as needed.

ClickLocationFilter specifies the minimum distance a click must be from the edges of an element in the creative.

FastClickFilter specifies the time to wait before responding to clicks. This element will impose a minimum delay of 1 second on all exits.

Variable substitution

The final_url and tracking_urls will be processed for variable substitution. This includes the standard URL variables, click coordinates (CLICK_X and CLICK_Y), data from signal collection frames, and custom params.

Custom params are inspired by amp-analytics' vars option. URLs can include ${var} placeholders which will be replaced on exit. Variables can have default values which can be overridden by the element requesting the exit (see the "exit action" secton).

exit action

The component will expose an exit action that other elements will reference in on="tap:..." attributes. The action accepts a "target" string parameter that must match a named NavigationTarget in the ExitConfig. Other parameters can be passed for variable substitution by prefixing their name with an underscore.

Parameter name Parameter value type Meaning
target string The name of a NavigationTarget in the ExitConfig
_([a-zA-Z0-9_-])+ string|boolean|number Insert a query parameter with this key and value into the final or tracking URLs. Default values can be specified in the NavigationTarget config.

Example

<amp-ad-exit id="exit-api">
<script type="application/json">
{
  "targets": {
    "Product_0": {
      "final_url": "https://adclickserver.com/click?id=af319adec901&x=CLICK_X&y=CLICK_Y&elem=${elem}&adurl=https://example.com/product1",
      "vars": {
        "elem": {
          "default": "headline",
        }
      }
    },
    "Product_1": {
      "final_url": "https://example.com/product2",
      "tracking_urls": [
        "https://adclickserver.com/click?id=af319adec901&x=CLICK_X&y=CLICK_Y",
        "https://tracker.adnetwork.com/?url=example.com",
      ],
      "filters": ["fast_click", "border_protection"]
    }
  },
  "filters": {
    "fast_click": {
      "delay": 1000
    },
    "border_protection": {
      "top": 10,
      "right": 5,
      "bottom": 10,
      "left": 10,
      "relativeTo": "#product1"
    }
  }
}
</script>
</amp-ad-exit>

<div id="product0" on="tap:exit-api.exit(target='Product_0', _elem='p1')">
  <p>Description of first product</p>
  <amp-img src="..." width="..." height="..."></amp-img>
</div>
<div id="product1" on="tap:exit-api.exit(target='Product_1')">
  <p>Description of second product</p>
  <amp-img src="..." width="..." height="..."></amp-img>
</div>
@jasti
Copy link
Contributor

jasti commented Mar 30, 2017

@ampproject/a4a for review

@dvoytenko
Copy link
Contributor

@clawr Thanks a lot for the spec. I have a few questions:

Allow exits to be configured without changing creative markup.

The amp-ad-exit is however always in the creative itself, right? Looking at the "tap" events and config itself - it's fairly extensive and it'd seem that overall markup changes are very likely? E.g. what is _elem='p1'?

FastClickFilter specifies the time to wait before responding to clicks. This element will impose a minimum delay of 1 second on all exits.

a. Do you take a risk of not being able to open a new tab because user action has expired? This would seem to be especially possible on iOS...
b. How do you measure the delay? From the touchstart?

ClickLocationFilter specifies the minimum distance a click must be from the edges of an element in the creative.

Edge of the event element? Or edge of the creative itself in the overall document?

"border_protection": {...}

Can you describe the meaning of border protection like you did with other filters?

ping any click tracking URLs

  1. I assume this URLs also allow var substitution?
  2. In some environments (e.g. WebViews, CCT) navigation to new tab often substituted with top navigation. In that case pings like this could (and will often) fail. I can see couple ways to get around this: (a) try if this reliably works using sendBeacon; (b) instead or in-addition-to, also call the same pings from the target/landing page.

<div id="product0" on="tap:exit-api.exit(target='Product_0', _elem='p1')">

Is this just for an example? Is there a reason why these are not <a> or other accessible tags?

@cramforce
Copy link
Member

Looks good overall. Second the feedback on why not to use an <a> tag. I think that should be the recommendation. Do you want to support stuff like "control click", "middle mouse button click" and long presses?

@keithwrightbos
Copy link
Contributor

This looks good. I assume the CLICK_X/CLICK_Y document click listener will remain in existence for creatives that want a straight forward redirect? Or will they be required to move to the new element?

I would also like further clarification around when the time based filters start. Presumably they apply to the entire creative? Could they start based on any custom, amp-analytics like trigger (e.g. firstVisible or standard visibility)?

@clawr
Copy link
Contributor Author

clawr commented Apr 6, 2017

Thanks for the feedback!

Allow exits to be configured without changing creative markup.

The amp-ad-exit is however always in the creative itself, right? Looking at the "tap" events and config itself - it's fairly extensive and it'd seem that overall markup changes are very likely? E.g. what is _elem='p1'?

What I mean is that often we'll have some ad content and the only thing that differs between impressions is the destination URL. With this element we can regenerate the amp-ad-exit config but leave the rest of the HTML as is (instead of templating it or generating it each time). In the example, _elem is some advertiser-defined parameter inserted into the URL that means e.g. "the user clicked on the first product".

a. Do you take a risk of not being able to open a new tab because user action has expired? This would seem to be especially possible on iOS...
b. How do you measure the delay? From the touchstart?

The delay is time-after-load/visibility. The fast click filter is trying to prevent accidental clicks that occur before the user has had a chance to read the ad.

I would also like further clarification around when the time based filters start. Presumably they apply to the entire creative? Could they start based on any custom, amp-analytics like trigger (e.g. firstVisible or standard visibility)?

Probably on load, but I'd love to use visibility if it's not too heavyweight. Would it require integration with amp-analytics, or is the AMP runtime able to know when we're on screen?

ClickLocationFilter specifies the minimum distance a click must be from the edges of an element in the creative.

Edge of the event element? Or edge of the creative itself in the overall document?

Either, indicated by the "relativeTo" property (maybe it should be called "selector" for consistency with amp-analytics). A value of self, meaning the element that was clicked, could be useful.

Can you describe the meaning of border protection like you did with other filters?

This is just an example of the ClickLocationFilter. The filter names are arbitrary to allow different NavigationTargets to reference different filters.

  1. I assume this URLs also allow var substitution?

Yes

  1. In some environments (e.g. WebViews, CCT) navigation to new tab often substituted with top navigation. In that case pings like this could (and will often) fail. I can see couple ways to get around this: (a) try if this reliably works using sendBeacon; (b) instead or in-addition-to, also call the same pings from the target/landing page.

Ack. I think we'll try:

  1. navigator.sendBeacon, if available
  2. ALP integration, if availalbe
  3. best-effort pings via something like document.createElement('img').src = tracking_url

What is CCT?

Is there a reason why these are not or other accessible tags?

No, that's a good idea. I hadn't considered accessibility.

I assume the CLICK_X/CLICK_Y document click listener will remain in existence for creatives that want a straight forward redirect? Or will they be required to move to the new element?

I'd be happy to make those exclusive to this element to encourage adoption (since the user experience is better with fast-click protection).

@dvoytenko
Copy link
Contributor

@clawr

Probably on load, but I'd love to use visibility if it's not too heavyweight. Would it require integration with amp-analytics, or is the AMP runtime able to know when we're on screen?

For now it's relatively heavyweight. We can expose it anyway, but let's start with simpler option and enhance as needed.

What is CCT?

Custom Chrome Tabs

@alanorozco alanorozco added the INTENT TO IMPLEMENT Proposes implementation of a significant new feature. https://bit.ly/amp-contribute-code label Apr 12, 2017
@camelburrito
Copy link
Contributor

Could we simplify the format to

<amp-ad-exit>
  <script type="application/json">
{
  "target": {
      "final_url": "https://example.com/product2",
      "tracking_urls": [
        "https://adclickserver.com/click?id=af319adec901&x=CLICK_X&y=CLICK_Y",
        "https://tracker.adnetwork.com/?url=example.com",
      ],
      "filters": ["fast_click", "border_protection"]
  },
  "filters": {
    "fast_click": {
      "delay": 1000
    },
    "border_protection": {
      "top": 10,
      "right": 5,
      "bottom": 10,
      "left": 10,
      "relativeTo": "#product1"
    }
  }
}
</script>
  <div id="product1" on="tap:exit-api.exit()">
    <p>Description of second product</p>
    <amp-img src="..." width="..." height="..."></amp-img>
  </div>
</amp-ad-exit>

@dvoytenko
Copy link
Contributor

@clawr One variation is to setup global click handler and avoid on=tap actions. E.g.

<amp-ad-exit>
{
  targets: {
    "target1": {...}
  }
}
</amp-ad-exit>

<a amp-ad-exit="target1" data-var1="" data-var2="" ...>...</a>

This model might be a bit more explicit and more compact depending on how many vars you may have.

/cc @cramforce Is this what you meant?

@clawr
Copy link
Contributor Author

clawr commented Apr 14, 2017

@camelburrito I think that makes it more complex in a couple ways:

  1. Potential duplication of URLs, vars, and filters. One change might require updates in multiple places.
  2. Putting the config parts and content parts of the ad together could make it harder to programatically insert/rewrite and could interfere with CSS (e.g. a direct child selector).

@clawr
Copy link
Contributor Author

clawr commented Apr 14, 2017

@dvoytenko I like that too. I guess it would work by the amp-ad-exit element looking at the click event's target element and recursing up its parents until it finds a data-exit-target attribute. One interesting option then is to allow a hierarchy of vars, like

<div data-exit-var-foo="foo1">
  <p data-exit-var-bar="bar1">
    <a data-exit-target="target1" data-exit-var-qux="qux1">target 1</a>
    <a data-exit-target="target2" data-exit-var-qux="qux2">target 2</a>
  </p>
</div>

One downside with a global click handler is that only one amp-ad-exit element would be allowed (or at least all target names across amp-ad-exits would need to be unique). But I'm having a hard time imagining when that would be a problem.

clawr added a commit to clawr/amphtml that referenced this issue May 17, 2017
ampproject#8515).

Changes from the I2I:
- Only RANDOM, CLICK_X, and CLICK_Y variables can be used, alongside custom vars.
- It doesn't work well with <a> tags - the tap action doesn't trigger on middle clicks. Recommendation is to use other elements.
- ClickLocationFilter for border click protection is not yet implemented. It will be added in a future change.

The component does some lightweight validation of the JSON config when it's
built. This may be overkill.

Tested:
gulp test --files 'extensions/amp-ad-exit/0.1/test/*'
gulp check-types
clawr added a commit to clawr/amphtml that referenced this issue May 24, 2017
ampproject#8515).

Changes from the I2I:
- Only RANDOM, CLICK_X, and CLICK_Y variables can be used, alongside custom vars.
- It doesn't work well with <a> tags - the tap action doesn't trigger on middle clicks. Recommendation is to use other elements.
- ClickLocationFilter for border click protection is not yet implemented. It will be added in a future change.

The component does some lightweight validation of the JSON config when it's
built. This may be overkill.

Tested:
gulp test --files 'extensions/amp-ad-exit/0.1/test/*'
gulp check-types
clawr added a commit to clawr/amphtml that referenced this issue May 31, 2017
ampproject#8515).

Changes from the I2I:
- Only RANDOM, CLICK_X, and CLICK_Y variables can be used, alongside custom vars.
- It doesn't work well with <a> tags - the tap action doesn't trigger on middle clicks. Recommendation is to use other elements.
- ClickLocationFilter for border click protection is not yet implemented. It will be added in a future change.

The component does some lightweight validation of the JSON config when it's
built. This may be overkill.

Tested:
gulp test --files 'extensions/amp-ad-exit/0.1/test/*'
gulp check-types
@jasti jasti added this to Ads Features to track in AMP Advertising Jun 1, 2017
lannka pushed a commit that referenced this issue Jun 3, 2017
* Implementation of the amp-ad-exit component for managing ad navigation (#8515).

Changes from the I2I:
- Only RANDOM, CLICK_X, and CLICK_Y variables can be used, alongside custom vars.
- It doesn't work well with <a> tags - the tap action doesn't trigger on middle clicks. Recommendation is to use other elements.
- ClickLocationFilter for border click protection is not yet implemented. It will be added in a future change.

The component does some lightweight validation of the JSON config when it's
built. This may be overkill.

Tested:
gulp test --files 'extensions/amp-ad-exit/0.1/test/*'
gulp check-types

* Update JSDoc for some functions. Fix lint issue (ignore unused parameters in an interface method).

* sinon.spy -> sandbox.spy

* Add amp-ad-exit to the list of allowed extensions in A4A pages and fix validation rules.

Address PR: add experiment flag; use camelCase for config properties

address some comments

Instantiate a new Filter for each spec.

* Instantiate a new Filter for each spec.

* remove duplicate doctype tag in example

* Make ActionEventDef public for type annotations.

* Add filter factory.

* fix event var

* update type annotation for Filter.filter

* address PR comments

* Move filter config validation to the ctor. Remove Filter.buildCallback().

* camelCase in documentation examples
torch2424 pushed a commit to torch2424/amphtml that referenced this issue Jun 6, 2017
* Implementation of the amp-ad-exit component for managing ad navigation (ampproject#8515).

Changes from the I2I:
- Only RANDOM, CLICK_X, and CLICK_Y variables can be used, alongside custom vars.
- It doesn't work well with <a> tags - the tap action doesn't trigger on middle clicks. Recommendation is to use other elements.
- ClickLocationFilter for border click protection is not yet implemented. It will be added in a future change.

The component does some lightweight validation of the JSON config when it's
built. This may be overkill.

Tested:
gulp test --files 'extensions/amp-ad-exit/0.1/test/*'
gulp check-types

* Update JSDoc for some functions. Fix lint issue (ignore unused parameters in an interface method).

* sinon.spy -> sandbox.spy

* Add amp-ad-exit to the list of allowed extensions in A4A pages and fix validation rules.

Address PR: add experiment flag; use camelCase for config properties

address some comments

Instantiate a new Filter for each spec.

* Instantiate a new Filter for each spec.

* remove duplicate doctype tag in example

* Make ActionEventDef public for type annotations.

* Add filter factory.

* fix event var

* update type annotation for Filter.filter

* address PR comments

* Move filter config validation to the ctor. Remove Filter.buildCallback().

* camelCase in documentation examples
torch2424 pushed a commit to torch2424/amphtml that referenced this issue Jun 6, 2017
* Bidtellect amp implementation… (ampproject#9518)

* Bidtellect amp implementation…

* removing renderStartImplemented…

* spaces?

* adding example

* Fix test-amp-ad-network-doubleclick-impl (ampproject#9645)

* Optimizations to speed up Travis PR builds (ampproject#9626)

Travis builds have become slow during busy periods of the day due to various reasons. This PR does the following:

Reorganizes build tasks across fewer build shards
Reduces the number of VMs used by PR and master builds to 2
No longer does a full gulp dist for unit tests (Possible to do after ampproject#9404)
Reduces the total CPU time used for PR builds to < 20 mins
Fixes ampproject#9500
Fixes ampproject#9387

* Animations: full on-action API (ampproject#9641)

* Animations: full on-action API

* review fixes

* Fix Validator tests on Travis, which now uses Node v4 (ampproject#9654)

* Amp-imgur : Implement imgur embed (ampproject#9405) (ampproject#9434)

* Amp-imgur : Implement imgur embed (ampproject#9405)

* amp-imgur test code modified

* amp-imgur validation code changed

* fix amp-imgur lint check

* Remove unused Layour variables

* Test code modified

* Ingegration amp-imgur extension

* [amp-imgur] add resize logic

* Remove 3p iframes and add resize message listener

* Fix some code with reviews
* change some syntax
* change validation rules
* add find event source

* [amp-imgur] remove unnecessary code and add object check

* remove spec_name from validation code

* Remove unnecessary code and add owners file

* Change required tag name  to  in validation file

* data-imgurid -> data-imgur-id

* Add whitelist for amp-imgur

* remove unused AmpImgur import in test file

* remove unused preconnect callback

* Update amp-cors-requests.md (ampproject#9636)

Added updates and corrections per Dima's feedback.

* Expose login url building to amp access service (ampproject#9300)

* Animations: support style keyframes (ampproject#9647)

* Animations: support style keyframes

* docs

* review fixes

* lints

* Animations: subtargets format (ampproject#9655)

* Animations: subtargets format

* fix docs

* Fix extern for integration test (ampproject#9657)

* Remove whitelisted link for PR 9434 (ampproject#9656)

* Add callouts for CORS + cleanup (ampproject#9591)

* Add callouts for CORS + cleanup

* Update amp-access.md

* Doubleclick Fast Fetch: Send default safeframe version on ad request (ampproject#9613)

* Send default safeframe version on ad request

* fix test failure

* amp-ima-video: Fixes some undefined variables in compiled extension (ampproject#9617)

* Add experimental input-debounced to the actions and event doc (ampproject#9650)

* Copy and rename compiled script directly for deprecated version (ampproject#9587)

* Remove A4A Dependency on ads/_config.js (ampproject#9462)

* Added doubleclick specific config

* Modified other networks

* Update MockA4AImpl

* Remove unneeded config lines

* Add cid, remove renderStartImplemented

* Fix lint complaint

* Changed from mandatory config to overrrideable method

* Addressed feedback, modified getAdCid

* Addressed additional feedback

* Responded to feedback

* Removed unnneeded guard against null value

* Changed signature of function

* Fixed lint issues

* addressed comments

* Addressed comments, fixed broken test

* Change signature / update tests

* Fix wrong contents and white spaces in amp-imgur.md (ampproject#9658)

* Performance: separate ini-load from first visible ini-load (ampproject#9665)

* amp-bind: Fix more integration tests (ampproject#9598)

* more bind test fixes

* include object.assign polyfill

* move polyfills to separate file

* replace use of map() from bind-validator with ownProperty()

* fix types and test

* Stop using IOS elastic scroll when slidescroll takes over animation (Only for the NON SNAP-POINTS flow) (ampproject#9668)

* removing overflow touch on no-scroll for ios

* Stop using IOS elastic scroll when slidescroll takes over animation (Only for the NON SNAP-POINTS flow)

* make sure css is compiled before entry points (ampproject#9643)

* update npm package version (ampproject#9671)

* A4A: expose visibilityCsi (ampproject#9667)

* A4A: expose visibilityCsi

* tests

* amp-bind: Fix embedding in FIF (ampproject#9541)

* move element service changes from ampproject#9447

* store element service ids in extension struct

* add unit test, fix other tests

* Fix null value binding (ampproject#9674)

* Add amp-form's submit action to the docs (ampproject#9675)

* Write cookie for ad-cid. (ampproject#9594)

* Write cookie for ad-cid.

* fix tests

* amp-access-laterpay fixes (ampproject#9633)

* Add support for LaterPay subscriptions

* Fix canonical link on laterpay example

* Tweak default styling

* Add an example locale message for the header

* Fix indentation of JsDoc (ampproject#9677)

It should be indented at the same level as the method it's documenting.

* Add example to amp iframe docs (ampproject#9660)

* Change image to static link hosted on ampproject.org

* Update amp-iframe doc w example + gen cleanup

* Adds SFG experiment branches to doubleclick-a4a-config.js. (ampproject#9662)

* Added experiment branches corresponding to exp=a4a:(5|6).

* Removed test file.

* Removed changes to yarn.lock + minor fixes.

* Fixed adsense-a4a-config.js.

* Fixed return statement.

* Removed reference to style tag for opacity (ampproject#9634)

As style tag for `opacity` was replaced with `amp-boilerplate (back in this [commit](ampproject@0a056ca), updated the text to reflect those changes.

* De-flake amp-bind integration tests (ampproject#9683)

* split bind fixtures into one file per extension

* fix width/height binding bug, avoid race condition w/ dynamic containers

* actually, just skip the tests affected by race condition for now

* Remove timer calls to prevent future flakiness (ampproject#9478)

* Remove timer calls to prevent future flakiness

* Revert the line order change

* Poll instead of using stub callback constructor

* Add jsdoc and rename variables

* amp-animation: polyfill partial keyframes from CSS (ampproject#9689)

* Animations: whitelist offset distance and regroup condition types (ampproject#9688)

* Use Docker containers in Travis (ampproject#9666)

* clean up web-worker experiment (ampproject#9706)

* Load examiner.js when #development=2 (ampproject#9680)

* Load examiner.js when #development=1

* address comments

* Use development=2

* Fix presubmit

* Implementation of amp-ad-exit (ampproject#9390)

* Implementation of the amp-ad-exit component for managing ad navigation (ampproject#8515).

Changes from the I2I:
- Only RANDOM, CLICK_X, and CLICK_Y variables can be used, alongside custom vars.
- It doesn't work well with <a> tags - the tap action doesn't trigger on middle clicks. Recommendation is to use other elements.
- ClickLocationFilter for border click protection is not yet implemented. It will be added in a future change.

The component does some lightweight validation of the JSON config when it's
built. This may be overkill.

Tested:
gulp test --files 'extensions/amp-ad-exit/0.1/test/*'
gulp check-types

* Update JSDoc for some functions. Fix lint issue (ignore unused parameters in an interface method).

* sinon.spy -> sandbox.spy

* Add amp-ad-exit to the list of allowed extensions in A4A pages and fix validation rules.

Address PR: add experiment flag; use camelCase for config properties

address some comments

Instantiate a new Filter for each spec.

* Instantiate a new Filter for each spec.

* remove duplicate doctype tag in example

* Make ActionEventDef public for type annotations.

* Add filter factory.

* fix event var

* update type annotation for Filter.filter

* address PR comments

* Move filter config validation to the ctor. Remove Filter.buildCallback().

* camelCase in documentation examples

* Introducing "it.yield", a convenient way to test promise code (ampproject#9601)

* Introduce yield.

* Address comments.

* fix done state error handling

* Document amp-access as a special target (ampproject#9568)

`amp-access` is a special target that's not mentioned in this document.
It's special because you can't give an arbitrary ID to it, i.e., you
can't just change the id of the `amp-access` script tag to `amp-access2`
and expect `on="tap:amp-access2.login"` to work. Given that the
"actions" for `amp-access` is a bit dynamic depending on the structure
of the `amp-access` JSON, instead of listing out the actions in a
tabular form, a reference to the `amp-access` documentation is added.

* Run presubmit tests soon after building (ampproject#9716)

* Revert "Use Docker containers in Travis (ampproject#9666)" (ampproject#9717)

This reverts commit 98ecb9b.

It turns out that while using Docker containers instead of VMs on Travis reduces VM startup time, it has significantly increased build and test time, increasing the overall PR check round trip from < 20 mins to > 30 mins.

Compare https://travis-ci.org/ampproject/amphtml/jobs/238464404 (Docker) against https://travis-ci.org/ampproject/amphtml/jobs/238462066 (VM).

Fixes ampproject#9651

* Validator Rollup (ampproject#9719)

* Add validator tests for amp-imgur.

* Disallow amp-embed as child of amp-app-banner.

* Minor cleanup, Make sure our set numbers are consistent in javascript.

* amp-state: Allow both `src` and script child (ampproject#9721)

* adapt code from ampproject#8897

* also_requires_attr should be in trigger

* Remove experiment for input-debounced. Update docs. (ampproject#9724)

* Validator Rollup (ampproject#9727)

* Minor cleanup of amp-ad-exit

* Disallow amp-ad/amp-embed as children of amp ad containers when data-multi-size is present.

* Revision bump

* Enabling dynamic queryparam addition to anchour links  (ampproject#9684)

* Enabling queryparam addition to anchour links

* Code review changes

* Additional cache urls (ampproject#9733)

* Significantly speed up gulp build --css-only (ampproject#9726)

Prior to this PR, gulp build --css-only would take ~ 1 minute to run, and end up building a bunch of js files in addition to compiling css.

After this PR, gulp build --css-only takes ~ 0.5 seconds to run (a 100x speed up), and the only output files in build/ after running it are .css, and .css.js files.

Resulting speeds on my workstation:
gulp build --css-only: ~500ms
gulp build: ~1m 45s
gulp dist --fortesting: ~3m 30s

Fixes ampproject#9640

* add amp-analytics Facebook Pixel support (ampproject#9449)

* add amp-analytics Facebook Pixel support

* add amp-analytics Facebook Pixel support

* fix test on extensions/amp-analytics/0.1/test/vendor-requests.json

* add Facebook Pixel standard events https://developers.facebook.com/docs/ads-for-websites/pixel-events/v2.9#events

* Update vendors.js

fix conflicts

* Update vendors.js

fix conflicts

* Update vendor-requests.json

fix conflicts

* Update vendor-requests.json

fix conflicts

* Update vendor-requests.json

* Update analytics.amp.html

* Update analytics-vendors.amp.html

* Update vendors.js

* Update analytics-vendors.amp.html

* fix lint error

* update

* facebook pixel

* Update vendor-requests.json

* Update analytics.amp.html

* fix lint error

* fix lint error

*  fix alphabetical order

* Update yarn.lock

* AMP-ad supports Seznam Imedia ad network (ampproject#8893)

* AMP-ad supports Seznam Imedia ad network

* Fixed requested changes

* Fixed requested changes

* Render API implemented

* Improved placing ads

* Fixed requested changes

* Render API fixed context
* Renamed IM.cz to Imedia
* Described JSON parameters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
INTENT TO IMPLEMENT Proposes implementation of a significant new feature. https://bit.ly/amp-contribute-code WG: monetization
Projects
AMP Advertising
  
Ads Features to track
Development

No branches or pull requests

9 participants