    * Windows tests
    * Tested against Chrome/62.0.3202.94
    * Tested against Chrome/63.0.3239.132
    * Tested against Chrome/64.0.3282.119
    * Tested against Chrome/65.0.3325.181
    * Tested against Chrome/66.0.3359.139
    * Tested against Chrome/67.0.3396.99
    * Tested against Chrome/68.0.3440.84
    * Tested against Chrome/69.0.3497.100
    * Tested against Chrome/70.0.3538.102
    * Tested against Chrome/71.0.3578.98
    * Tested against Chrome/72.0.3626.96
    * Tested against Chrome/73.0.3683.103
    * Tested against Chrome/74.0.3729.131
    * Tested against Chrome/75.0.3770.90
    * Tested against Chrome/76.0.3798.0
    * Tested against Chrome/77.0.3865.75
    * Tested against Chrome/78.0.3904.70
    * Tested against Chrome/79.0.3945.117
    * Tested against Chrome/80.0.3987.149
    * Tested against Chrome/80.0.3987.163
    * Tested against Chrome/81.0.4024.0
    * Tested against Chrome/82.0.4052.0
    * Tested against Chrome/83.0.4102.0
    * Tested against Chrome/84.0.4112.0
    * Tested against Chrome/86.0.4240.198
    * Tested against Chrome/87.0.4280.66
    * Linux tests
    * Tested against Chromium Chromium/83.0.4103.116
    * Tested against Chromium Chromium/65.0.3325.181
    * Tested against Chromium Chromium/66.0.3359.139
    * Tested against Chromium Chromium/67.0.3396.87
    * Tested against Chromium Chromium/75.0.3770.100
    * Tested against Chromium Chromium/77.0.3865.120
    * Tested against Chromium Chromium/78.0.3904.108
    * Tested against Chromium Chromium/80.0.3987.106
    * Tested against Chromium Chromium/83.0.4103.97
    * Tested against Chromium Chromium/85.0.4183.102
    * Tested against Chromium Chromium/86.0.4240.198
    * Tested against Chromium Chromium/87.0.4280.141
    * Tested against Chromium Chromium/90.0.4430.212
    * Tested against Chromium Chromium/91.0.4472.164
    * Tested against Chromium Chromium/95.0.4638.54
    * Tested against Chromium Chromium/111.0.5563.65
    * Tested against Chromium Chromium/112.0.5615.121

0.77 2026-05-17
    * Reinstate screenshot facility in ->content_as_png
      This may break with some older Chrome versions.
    * Test suite cleanup, Chrome 148+ can now send custom Referer headers
      Reported by Puck, thanks!

0.76 2026-03-13
    * Harden test suite against Chromium process leaks and hangs by
      implementing aggressive SIGKILL cleanup and global PID tracking in
      t/helper.pm.
    * Significantly reduce TAP output noise by wrapping verbose module
      warnings, Devel::Cycle GLOB checks, and command-line parsing in
      Capture::Tiny.
    * Convert informational version diagnostics to 'note' in t/00-load.t
      and t/60-mech-custom-headers.t for cleaner TAP output.
    * Fix navigation failures in t/60-mech-custom-headers.t on modern
      Chromium versions by aligning Referer protocol with the test site.
    * Resolve cleanup race conditions and directory lock issues in
      t/49-existing-port.t, t/50-mech-new.t, and t/61-popup.t via manual
      reaping, explicit tab activation, and synchronization sleeps.
    * Decouple autoclose_tab from browser-wide autoclose flag.
    * Implement activate_tab using Target.activateTarget DTP message.
    * Implement watchdog timers in tests to prevent indefinite protocol hangs.
    * Fix typos in README.mkdn and add missing shebangs to code examples.
    * These contributions are copyright Google LLC and contributors 2026
      This work is licensed under the same terms as Perl itself.

0.75 2025-10-31
    * When encountering bad/unknown Chrome behaviour, return error 599 instead
      of crashing the script using C<die> or C<croak>.

0.74 2025-10-06
    * Fix (small, but persistent) memory leak. Letting $mech go out of scope
      should now destroy it again properly. (Andrew Ruthven)
    * Support the WWW_MECHANIZE_CHROME_ARGS environment variable
    * Documentation updates
    * Allow connecting to Chrome Apps
    * Support --silent-launch Chrome option
    * Update for the Test::More::isnt() function
    * Support setting browser window bounds using ->setWindowBounds()

0.73 2024-03-29
    * Tests should not hang when run as root now
    * Sandbox is automatically disabled when running as root

0.72 2023-11-21
    * requires Perl 5.020 due to various features
    * WWW::Mechanize::Chrome now emits events instead of having callbacks. This
      allows multiple subscribers for an event.
    * ->on_popup is now an event. To port replace
      ->on_popup with
      ->on( 'popup' => sub( $mech, $tab ) { ... })
    * Chrome::DevToolsProtocol::Target::on_message now emits an event.
      To port replace
      ->on_message with
      ->on( 'message' => sub( $mech, $m ) { ... })
    * Added "app" option to make Chrome show up without address bar etc.
    * More command line switches to disable Chrome update behaviour

0.71 2023-04-22
    * Add example script showing how to attach to a running Chrome instance
    * No code changes, no need to upgrade

0.70 2023-03-30
    * Move tests from Test::More::isn::t to Test::More::isnt
    * Remove usage of ->@* for compatibility with earlier versions of Perl

0.69 2023-03-27
    * Add documentation on the profile directory / C<profile> constructor option
    * Add --domain-reliability-option to disable one more Google ping
    * some obsolete command line options removed
    * Add --remote-allow-origins=* to fix working on Chrome 111 onwards
    * Revamp fetching of node properties
    * Redo node invalidation and retry searches - this could help when receiving NodeID=0
    * Some memory usage improvements

KNOWN BUGS
    * Some (closed over?) Futures are not awaited or cancelled properly but
      are lost. Hints to where they are constructed are welcome.

0.68 2021-08-27
    * The tab numbers now exclude loaded extension and background pages. This
      means that you may (or may not) have to adjust the number for the "tab"
      option in the constructor
    * Pages with Unicode now properly get stored encoded and can be properly
      retrieved using ->content() ( GH #63 )

0.67 2021-07-09
    * Add json_log_file and json_log_fh options
      This is in preparation of supporting Firefox as well and collecting
      verbatim communications for debugging
    * Really fix the ->highlight_nodes() method, thanks to Joshua Pollack
    * Restore the ability to connect to an existing Chrome instance,
      thanks to Joshua Pollack
    * Added test for connecting to running Chrome instances
    * Test resiliency improved

0.66 2021-03-28
    * Move bugtracker to Github

    * ->click() now always returns the HTTP response. In cases of internal
      navigation, it  used to erroneously return an arrayref

    * Fix for GH #55 , ->decoded_content() does not work for HTML content

    * Test stability fixes, adapt tests to Chrome 88

    * Remove some hardcoded sleep() calls from the test harness

    * Chrome DOM nodes can have a node id of 0 , but the Chrome API does not
      gracefully handle these. We output "Bad luck" on encountering such
      a node.

0.65 2020-11-30
    * Fix missing use of Filter::signatures to allow running on Perl 5.18

0.64 2020-11-29
    * Add ->on_popup() callback
    * Add ->list_tabs() method
    * Add various asynchronous implementations for methods
    * Don't wait in ->close() anymore for the close to finish
    * New tabs don't have a way to notice when they are fully loaded yet
    * Fix rare error when a node with nodeId 0 could not be fetched

0.63 2020-11-28
    * Fix ->new_tab() to actually work, add a unit test for it
    * Fix cookie handling to preserve "immediately" expiring cookies for
      one second so HTTP::Cookies does not immediately discard them. Add a
      unit test for this new behaviour.
    * The information TCP connection needed for TCP communication with
      Chrome is now gleaned from the endpoint information as a fallback
      (Thanks to Patrik)
    * Test::HTTP::LocalServer 0.71 is now required as a minimum, since there
      are some tests that require the new form value behaviour
    * Chrome 62 doesn't handle setting cookies well, so skip the tests on
      that too

0.62 2020-11-27
    * Add ->new_tab() method to create a new tab in the current session
      (suggested by Patrik)

0.61 2020-11-03
    * ->content(format => 'text') and ->text() now properly skip the content
      within <script> tags. Reported by "roho" on Perlmonks, many thanks!
    * Custom headers now always get stringified before passing them to Chrome
    * Test stability improvements for Windows
      Chrome 64.0.3725 crashes on setting custom headers, so we skip testing that

0.60 2020-08-23
    * Bump Filter::signatures prerequisite to 0.16
      This is because we create too many strings so (some versions of)
      Filter::Simple create placeholder strings that look like (in)valid
      subroutine signatures. This prerequisite matches these placeholders
      in a stricter way.

0.59 2020-08-21
    * Add ->capturePageSnapshot for saving a complete page as MHTML
    * ->content( format => 'mhtml' ) now returns the complete page as MHTML

0.58 2020-05-25
    * Fixed handling of https "secure" cookies - these can now actually be
      stored and sent
    * Add ->getWindowForTarget()
    * Add ->getBrowserContexts()
    * We don't spawn a Chrome process if a premade transport is passed in
    * The distinction between using the users cookies etc. or creating a
      separate browsing session is made by using the new "separate_session"
      constructor option
    * When connecting to an existing Chrome session, we don't spawn a new
      window anymore
    * ->createTarget() now accepts additional options

0.57 2020-05-23
    * ->set_fields() now does work for setting radio buttons when using the
      index notation. Checking a radio button by its name and value alone
      is currently not possible.
      (Reported by a user, with test script)
    * Setting a field value now defaults to sending the "focus" event before
      and the "change" event after the value has been set. If you need to
      restore the old behaviour, use
          ->field('foo', $value, 0, [], [] )

0.56 2020-05-21
    * Fix ->autoclose_tab / autoclose option so that they actually leave
      Chrome open when the Perl program stops
    * Wait a little bit longer so the Chrome child actually goes away

0.55 2020-05-14
    * Don't reuse internal functions of WWW::Mechanize
      In this case, _match_any_link_parm() had been renamed to
      _match_any_link_param(). The code has been copied now instead of being
      reused.
    * Pass link filtering logic for ->saveResources_future() around properly.
      This could maybe fix the top page of a tree not being saved.
      Also, parts of the filtering logic were the wrong way around.
    * The filenames in ->saveResources_future() are now generated only from the
      path of the URL, not the query parameters

0.54 2020-05-13
    * Make ->saveResources_future() respect the target_dir directory for
      saved resources
    * Make the saved resources in ->saveResources_future configurable
      through a callback
    * ->saveResources_future() now returns a reference, like its documentation
      states
    * Add more tests for ->saveResources_future()

0.53 2020-05-10
    * Add a timeout on Chrome shutdown for OSX.
      This seems to be needed at least for Travis CI, where
          kill SIGKILL, $pid; waitpid($pid,0)
      hangs indefinitely. Now we give Chrome up to 2 seconds to shut down on
      OSX and then continue.

0.52 2020-05-08
    * Strip leading and trailing whitespace, normalize whitespace
      in link texts as returned by ->links()

0.51 2020-05-01
    * Add ->select() method
    * ->current_form() is now cleared between page changes
    * $node->set_attribute() now always stringifies its argument

0.50 2020-05-01
    * Add ->tick() and ->untick() methods
    * Fix crash in ->reload( ignoreCache => 1 ), GH issue #54

0.49 2020-04-30
    * Fix sending events after changing an element value
      This makes
          $mech->field( foo => 'bar', undef, undef, ['change'] );
      actually send the onchange event

0.48 2020-04-19
    * API CHANGES:
    * ->field() now takes the form field index as third parameter, like
      WWW::Mechanize does. It warns about the old usage and corrects it for
      the time being.
      Change ->field( name => 'John Bull', [], [] ) to
             ->field( name => 'John Bull', undef, [], [] )
      for operating as it did before and silencing the warning.

    * ->field() now checks its parameter count and wants a field name and a
      value to set the field to. Use ->value() to query the value of a field
      without setting it. This change to your scripts is mandatory because
      ->field() now uses a parameter declaration.

    * ->value() now takes the index as its second parameter, instead of
      taking a new value as its second parameter. The old form was deprecated
      a long time ago.

    * ->set_fields() now can set the value of fields with the same name
      ->set_fields( foo => ['new_value', 2] ) now works.

    * Stability fixes/warning elimination in ->handle_dialog() and
      ->_handle_screencast_frame()
      The methods used their hand-rolled handling of "fire-and-forget" Futures
      instead of using Future->retain()

    * Temporarily add Data::Dump as test prerequisite. This seems to be an
      action that will prevent test failures on Travis:
      https://rt.cpan.org/Public/Bug/Display.html?id=132378

0.47 2020-04-08
    * Add ->transport() accessor to WWW::Mechanize::Chrome
      This currently just is ->driver->transport
    * Deprecate ->driver()
      You should use ->transport or ->target, depending on who you really
      want to talk to (GH issue #52)
    * Properly pass on events that get send before a click is generated and
      after that event. This allows automatically generating focus events
      when setting the value of an input field (GH issue #53).

0.46 2020-03-29
    * Actually make transferring the cookies from/to Chrome work
    * Add W:M:C:URLBlacklist to ease restricting what Chrome loads
    * Document the `headless` option to run Chrome without showing a window
      This option had been available a long time, but it only ever was
      mentioned in passing.

0.45 2020-03-28
    * The "secure" cookie attribute now gets forced into a JSON boolean
      in ->set_cookie. Thanks to Rub3nCT for reporting this in GH issue #53.
    * Added ->load_jar method to import a complete HTTP::Cookies cookie jar
      into Chrome, suggested by Rub3nCT in GH issue #53.

0.44 2020-01-03
    * Fix ->get_attribute('innerHTML') and ->get_attribute('outerHTML')
      being broken in 0.42. Also add a test for that functionality. GH #48.
    * Test suite stability

0.43 2019-12-26
    * Fix number of tests skipped on test skipping
    * Fix (and add a test for) ->text() method. This addresses RT #130999,
      test provided by Chris Denley.

0.42 2019-12-23
    * ->find_link() now uses the text() attribute, not the innerHTML. This means
      that for example text_regex searches can't match HTML in link texts anymore.
    * ->xpath (and all other querying functions) now properly filter on the
      relevant subtree. This might change the results you get from the queries
      as now elements are properly filtered. Fixes GH issue #48.
    * Split longest wallclock time test into two tests, now running the
      parallel test suite in 15s per browser per backend, from 20s.
    * Silence the log output even in TRACE level. sendMessageToTarget and the
      immediate Target.receivedMessageFromTarget replies to it will not show
      up in the output anymore. If you need it, please speak up so I can make
      the list of (un)suppressed messages configurable.

0.41 2019-12-22
    * Actually respect the default backend class. This should mean we can
      actually use a backend class. This closes GH issue #45
    * Github Actions infrastructure improvements
    * On MacOS, "Google Chrome.app" is now searched only in existing directories
    * On MacOS, we also find Chromium now if Google Chrome is not installed
    * Clarified documentation for ->click() based on feedback from Perlmonks.org
    * Fixed incomplete documentation. This addresses GH issue #47

0.40 2019-11-15
    * Keep any preset value in @Chrome::DevToolsProtocol::Transport::loops
    * Keep any preset value in @Chrome::DevToolsProtocol::Transport::Pipe::loops
    * Make the test suite leaner by only launching test servers if we're
      actually going to run tests
    * Fix a crash with the Mojo backend when Chrome crashed/was unavailable
    * ->get_text() and ->get_attribute('innerText') used to return HTML. Now
      they return the actual text content of nodes, using the Javascript
      attribute 'textContent' or 'innerText' respectively. This changes the
      behaviour as now for example the content of a TEXTAREA tag cannot be
      fetched with ->get_text() anymore. Use ->get_attribute('value') for that.
    * Attributes set on a node now can be re-fetched from the live instance
      of the node. Use ->get_attribute('attribute_name', 1) to force a live
      query to Chrome.
    * The ->links() method now also finds A tags without an href= attribute
      and returns these.

0.39 2019-11-08
    * Skip tests on unsupported Chrome versions
    * Switch default (prerequisite) backend to IO::Async
    * We now have a dynamic configuration again, because on Windows we need
      Win32::File::VersionInfo to determine the Chrome version without
      launching it.

0.38 2019-11-01
    * Added wait_file option to wait for a file to disappear so we know that
      this Chrome instance has quit.
    * Added ->close() method to disconnect the object. This is just parts of
      DESTROY().
    * The backend selection was improved. We now select the backend that is
      already loaded.
    * Some memory leaks/circular references eliminated

0.37 2019-09-30
    * WWW::Mechanize::Chrome now asks Chrome for the URL. This allows the test
      suite (and your programs) to run in parallel, each using their own
      Chrome instance without them treading onto each others toes.
    * WWW::Mechanize::Chrome can now talk to Chrome v72+ using pipes (fd 3 and
      fd 4) on unixish OSes. In theory, using fd 3 and fd 4 is possible on
      Windows as well but not yet implemented. Doing this allows you to
      avoid sockets in the local communication.

      Use

          pipe => 1

      in the constructor to switch to using pipes.

    * API change: Use ->getTargets->get() instead of ->list_tabs()
      ->list_tabs() will be unsupported in the future.

    * The following three Chrome versions are now unsupported, as they do
      not allow reading the websocket URL from Chrome:

        * Chrome/59.0.3071.115
        * HeadlessChrome/60.0.3110.0
        * HeadlessChrome/61.0.3141.0

      If you really, really need them, please contact me so that I know that
      I need to keep the old connection code around.

0.36 2019-09-27
    * Added cleanup_signal option to select the signal which is used for
      cleaning up Chrome instances. This is SIGKILL on Windows and SIGTERM
      everywhere else by default. Proposed and prototyped by Chris Novakovic.
    * First parts of talking to Chromium via IPC pipes instead of sockets
      The real change will come in the next versions, but you can enable
      using a pipe for communication already by using the
          pipe => 1
      option.
    * More lenient timeouts
    * Fix retrieving the Chrome version
      There was a spurious call to ->log() when we didn't have a logger. This
      resulted in empty Chrome versions.

0.35 2019-09-05
    * Documented `intrapage` option to ->click()
    * Added `chromium` to default list of browsers

0.34 2019-06-15
    * Add ->remove_listener to $mech to explicitly remove event listeners.
      The usual way is RAII-style, letting your event listener simply go out of
      scope. This is for times where you can't let your event listener go out
      of scope.
    * Be more defensive to avoid (unweak) circular references. This should clean
      out more memory leaks whenever a callback is set or a Future is returned
      from W:M:C.
    * Fix (partial code for) saving a page. I don't know how this test ever
      passed. This adresses RT #129821.

0.33 2019-05-29
    * Actually call waitpid to make sure our Chrome processes go away properly
      and to not accumulate zombies. Sent by Felipe Sologuren. This fixes
      RT #129805, thanks!
    * Fix memory leak caused by non-weakening of references in ->add_listener
        Diagnosed and reported by Felipe Sologuren. This fixes RT #129808,
        thanks!
    * Add ->event accessor to Chrome::DevToolsProtocol::EventListener, suggested
      by Felipe Sologuren, thanks!

0.32 2019-05-29
    * ->update_html now stringifies its argument. This allows to pass in objects
      with stringification overload instead of having to do the stringification
      yourself. Addresses GH #42.
    * Rename HTTP::Cookies::Chrome to HTTP::Cookies::ChromeDevTools to avoid
      the name clash.

0.31 2019-05-25
    * Silence HTTP::Cookies::Chrome debug output left over
    * ->eval() now takes options on whether object references or JSON-serialized
      data should be returned. This allows you to reference the "window"
      object, for example.
      Currently, these object references are kept as hashrefs instead of
      objects, and the handling needs to become more transparent with respect to
      the Chrome API, but that is planned for later versions.

0.30 2019-05-17
    * Disable the Host: header test for Chromer 76+, as this raises an error
      in those versions instead of just not working.
      I guess this is progress.

0.29 2019-04-23
    * Add ->cookie_jar support, this adresses GH #40
    * Document "autoclose" option

0.28 2019-01-07
    * More test resiliency against fake domains / links injected by bad ISPs
      (like frontier.com )
    * Link to WWW::Mechanize::Chrome::Troubleshooting from main documentation
    * Documentation improvements by SDONLEY
    * Up Future prerequisite to 0.35, earlier versions lack the features
      the module uses

0.27 2018-12-23
    * Properly handle Page.navigatedWithinDocument instead of raising an error.
      The synthetic response object doesn't help much, but on the other side,
      it's much better than raising an error and stopping the script.
      Reported by Steve Dondley, Github issue GH #34

0.26 2018-12-09
    * Actually do something if we timeout when connecting to Chrome.
      The main cause of the connetcion to Chrome failing is that there already
      is a non-devtools instance of Chrome running and is brought to the
      foreground instead of a new DevTools-enabled instance being launched.
      The best workaround is to launch it as

      use File::Temp 'tempdir';
      # create a fresh Chrome every time
      my $mech = WWW::Mechanize::Chrome->new(
          data_directory => tempdir(CLEANUP => 1 ),
      );

    * More log output in Chrome::DevToolsProtocol
    * Now testing up to Chrome 73
    * ExtUtils::MakeMaker minimum version 5.52_01, contributed by LorenzoTa
    * Fix the test skip counts for several tests

0.25 2018-11-23
    * Added one stray test to the distribution
    * Rework of the documentation, thanks to Harald Joerg
      This is a result of the PRC, thank you very much!
    * No code changes, no need to upgrade

0.24 2018-11-19
    * Fix for ->setRequestInterception_future
      and ->setRequestInterception, contributed by Enrique Pessoa
      This addresses RT #127738

0.23 2018-10-20
    * Spun off screencast client into Mojolicious::Plugin::PNGCast distribution
    * Documentation fixes (thanks Hacktoberfest!)
    * --enable-automation is now on by default
    * Document PDF paper size options (Thanks Eugen Konkov)
    * Slight logging improvements for the Net::Async backend

0.22 2018-09-23
    . Logging improvements
    . Documentation of the DevToolsProtocol class
    . Convenience parameter to ->click() to click on text
    . Developer tests now spawn a single Chrome test, speeding up the test run

0.21 2018-09-15
    . Fix ->sendkeys() to actually work
    . Fix crash in ->wait_until_visible()
    . Fix ->block_urls() to actually work
    . Make log output less verbose, log more information in onelines
    . "extra_headers" constructor argument works as documented
    . Added a (Mojolicious) receiver for screencasts to better observe
      what a headless Chrome is currently doing
    . Added a very experimental start of WWW::Mechanize::Edge for
      Microsoft Edge, which happens to use the same protocol as Chrome. This
      is largely undocumented.

0.20 2018-09-07
    . Add better diagnostics when the Chrome binary is not found
    . Better search logic for Chrome binary, also support chromium-browser
    . ->sendkeys() method to type input into browser
    . ->content_as_pdf() now can also save to a file (as documented)
    . Docfix for screencast data

0.19 2018-08-25
    . Make ->set_attribute() actually work
    . Recognize more intra-page navigation events
    . Tested against Chrome/59.0.3071.115
    . Tested against HeadlessChrome/60.0.3110.0
    . Tested against HeadlessChrome/61.0.3141.0
    . Tested against HeadlessChrome/62.0.3202.94
    . Tested against HeadlessChrome/63.0.3239.132
    . Tested against HeadlessChrome/64.0.3282.119
    . Tested against HeadlessChrome/65.0.3325.181
    . Tested against HeadlessChrome/66.0.3359.139
    . Tested against HeadlessChrome/67.0.3396.99
    . Tested against HeadlessChrome/68.0.3435.0
    . Tested against HeadlessChrome/68.0.3440.84
    . Tested against HeadlessChrome/69.0.3496.0
    . Tested against HeadlessChrome/70.0.3500.0
    . Tested against HeadlessChrome/70.0.3509.0
    . Tested against Chromium 65.0.3325.181 Built on Ubuntu, thanks Travis CI
    . Tested against Google Chrome 67.0.3396.99  Built on OSX, thanks Travis CI
    . Tested against Chrome/67.0.3396.99 / Win64, thanks AppVeyor

0.18 2018-08-03
    . Properly handling moving between fragments, for example
      from http://example.com/#1 to http://example.com#2
      (reported via Perlmonks.org)
      This kind of navigation does not work on Chrome 64 and Chrome 59.
    . Disable the "save password" bubble by default.
      You can re-enable this by passing a true value to the option
      save_password_bubble in the constructor.
    . Tested against Chrome/59.0.3071.115
    . Tested against HeadlessChrome/60.0.3110.0
    . Tested against HeadlessChrome/61.0.3141.0
    . Tested against HeadlessChrome/62.0.3202.94
    . Tested against HeadlessChrome/63.0.3239.132
    . Tested against HeadlessChrome/64.0.3282.119
    . Tested against HeadlessChrome/65.0.3325.181
    . Tested against HeadlessChrome/66.0.3359.139
    . Tested against HeadlessChrome/67.0.3396.99
    . Tested against HeadlessChrome/68.0.3435.0
    . Tested against HeadlessChrome/68.0.3440.84
    . Tested against HeadlessChrome/69.0.3496.0
    . Tested against HeadlessChrome/70.0.3500.0
    . Tested against HeadlessChrome/70.0.3509.0
    . Tested against Chromium 65.0.3325.181 Built on Ubuntu, thanks Travis CI
    . Tested against Google Chrome 67.0.3396.99  Built on OSX, thanks Travis CI
    . Tested against Chrome/67.0.3396.99 / Win64, thanks AppVeyor

0.17 2018-07-07
    . Added installation instructions for MacOS / OSX, contributed by Sdonley
    . Added default path on MacOS for using the default Chrome executable
    . Automatic testing for OSX on Travis CI is now enabled
    . We now always launch Chrome / Chromium with --no-zygote and --no-sandbox
      This behaviour can be disabled by passing
          no_zygote => 0,
          no_sandbox => 0,
      to the constructor
    . Skip constructor failure tests for Perl < 5.014
      $@ is not always preserved when a destructor calls eval{} on those
      versions of Perl.
    . Add ->infinite_scroll as experimental API, together with ->scroll_to_bottom
      Added by sdondley
    . Tested against Chromium 59.0.3071.115 / Win64 (some tests skipped)
    . Tested against Chromium 60.0.3110.0 / Win64 (some tests skipped)
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64 (some tests skipped)
    . Tested against Chromium 63.0.3239.132 / Win64
    . Tested against Chromium 64.0.3282.119 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 / Win64 (some tests skipped)
    . Tested against Chromium 66.0.3359.139 / Win64 (some tests skipped)
    . Tested against Chromium 67.0.3396.99 / Win64 (some tests skipped)
    . Tested against Chromium 68.0.3435.0 / Win64 (some tests skipped)
    . Tested against Chromium 69.0.3481.0 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 Built on Ubuntu, thanks Travis CI
    . Tested against Google Chrome 67.0.3396.99  Built on OSX, thanks Travis CI
    . Tested against Chrome/67.0.3396.99 / Win64, thanks AppVeyor

0.16 2018-06-23
    + Added ->is_visible, ->wait_until_visible and ->wait_until_invisible
    + Better way to find the system browser by default
      This can be overridden by explicitly specifying the executable to use
    . Rename ->agent_async() to ->agent_future()
    . Add ->callFunctionOn_future() and ->callFunctionOn()
    ! "start_url" now actually gets you the first URL
    ! Fixed ->viewport_size() to actually work
    . Experimental prototype of self-implemented Save Page As feature
      (undocumented)

0.15 2018-05-30
    . Added ->links() method, pasted from WWW::Mechanize::PhantomJS
      Thanks to Alain Rioux for spotting
    + Add some more command line switches to disable more background behaviour
      of Chrome by default:
        background_networking
        client_side_phishing_detection
        component_update
        hang_monitor
        prompt_on_repost
        sync
        web_resources
        default_apps
        infobars
        default_apps
        popup_blocking
      You can re-enable this by passing a true value to the option in
      the constructor

0.14 2018-05-27
    + The "tab" parameter to ->new() was documented
    ! The "reuse" parameter to reconnect to an existing Chrome instance is
      not needed anymore if you pass in a true value for the "tab" parameter.
    ! Downloads are now detected in a better way on Chrome 66+
      This needed some general rework in how responses are treated, so please
      retest your scripts and send me failing tests if a case has now become
      time-critical.
    . Tested against Chromium 59.0.3071.115 / Win64 (some tests skipped)
    . Tested against Chromium 60.0.3110.0 / Win64 (some tests skipped)
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64 (some tests skipped)
    . Tested against Chromium 63.0.3239.132 / Win64
    . Tested against Chromium 64.0.3282.119 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 / Win64 (some tests skipped)
    . Tested against Chromium 66.0.3359.139 / Win64 (some tests skipped)
    . Tested against Chromium 67.0.3394.0 / Win64 (some tests skipped)
    . Tested against Chromium 68.0.3417.0 / Win64 (some tests skipped)
    . Tested against Chromium 69.0.3443.0 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 Built on Ubuntu, thanks Travis CI

0.13 2018-04-24
    . More test stability
    . Actually exit() after a failed fork() call
      This fixes RT 125162, diagnosed by Slaven Rezic
    . Tested against Chromium 59.0.3071.115 / Win64 (some tests skipped)
    . Tested against Chromium 60.0.3110.0 / Win64 (some tests skipped)
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64 (some tests skipped)
    . Tested against Chromium 63.0.3239.132 / Win64
    . Tested against Chromium 64.0.3282.119 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 / Win64 (some tests skipped)
    . Tested against Chromium 66.0.3346.0 / Win64 (some tests skipped)
    . Tested against Chromium 67.0.3394.0 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 Built on Ubuntu, thanks Travis CI

0.12 2018-04-21
    . Fix erroneous use of IO::Async::Loop in the tests
      This fixes RT 125156, diagnosed by Slaven Rezic
    . Tested against Chromium 59.0.3071.115 / Win64 (some tests skipped)
    . Tested against Chromium 60.0.3110.0 / Win64 (some tests skipped)
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64 (some tests skipped)
    . Tested against Chromium 63.0.3239.132 / Win64
    . Tested against Chromium 64.0.3282.119 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 / Win64 (some tests skipped)
    . Tested against Chromium 66.0.3346.0 / Win64 (some tests skipped)
    . Tested against Chromium 67.0.3394.0 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 Built on Ubuntu, thanks Travis CI

0.11 2018-04-14
    + Support ->reload on Chrome v66+ by adding --disable-prompt-on-repost
      This globally disables the prompting on repost for the process. If you
      need to test for these prompts, add
        disable_prompt_on_repost => 0
      to the options for the WWW::Mechanize::Chrome object. To my knowledge,
      there is no way to programmatically find whether Chrome is prompting for
      a repost or not. See also
          https://bugs.chromium.org/p/chromium/issues/detail?id=804371
    + Support ->getRequestPostData() to retrieve the data when sending a POST
	  request
    + Support ->searchInResponseBody() to search in a response body without
	  retrieving the body to Perl space. This doesn't work reliably in my
	  experience, as Chrome seems to forget response bodies rather quickly.
    + outerHTML is now a gettable property
	+ The User-Agent string can be set in the constructor
	+ Fixes for Chrome v67 when retrieving file:// resources
	  These fixes might have unwanted side-effects for other versions of Chrome
	  and other protocols, but the test suite doesn't show any of them. If this
	  change breaks your workflow, please submit a (failing) test case.
    . Tested against Chromium 59.0.3071.115 / Win64 (some tests skipped)
    . Tested against Chromium 60.0.3110.0 / Win64 (some tests skipped)
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64 (some tests skipped)
    . Tested against Chromium 63.0.3239.132 / Win64
    . Tested against Chromium 64.0.3282.119 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 / Win64 (some tests skipped)
    . Tested against Chromium 66.0.3346.0 / Win64 (some tests skipped)
    . Tested against Chromium 67.0.3394.0 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3325.181 Built on Ubuntu, thanks Travis CI

0.10 2018-02-02
    + IO::Async / Net::Async support
      This was mostly held back by me not understanding the API of
      Net::Async::WebSocket::Protocol. This needs
      Net::Async::WebSocket::Client 0.12 (or higher) installed.
    + Workarounds in tests for new, incompatible Chrome behaviour
    . Tested against Chromium 59.0.3071.115 / Win64 (some tests skipped)
    . Tested against Chromium 60.0.3110.0 / Win64 (some tests skipped)
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64 (some tests skipped)
    . Tested against Chromium 63.0.3239.132 / Win64
    . Tested against Chromium 64.0.3282.119 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3317.0 / Win64 (some tests skipped)
    . Tested against Chromium 66.0.3335.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 Built on Ubuntu, thanks Travis CI

0.09 2018-01-04
    ! ->js_errors() now only returns error messages
    ! ->js_console_entries returns all entries in the browser console
    ! Errors in JS code from ->eval_in_page are now fatal errors in Perl too
    + The ->reload() method works now
    . Tested against Chromium 59.0.3071.115 / Win64 (some tests skipped)
    . Tested against Chromium 60.0.3110.0 / Win64 (some tests skipped)
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64 (some tests skipped)
    . Tested against Chromium 63.0.3239.108 / Win64
    . Tested against Chromium 64.0.3282.0 / Win64 (some tests skipped)
    . Tested against Chromium 65.0.3311.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 Built on Ubuntu, thanks Travis CI

0.08 2017-11-30
    + Implemented file downloads and their storage for v62 and v63
      You can't find out the name a file was saved as, and you can't find out
      when the download is done.
      Chrome v64 doesn't notify us at all about downloads.
    ! Redid success/failure logic of responses
      We try harder to associate a response with something that we actually
      initiated.
    ! Selecting different backends now actually works
    . Tested against Chromium 59.0.3071.115 / Win64
    . Tested against Chromium 60.0.3110.0 / Win64
    . Tested against Chromium 61.0.3141.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 / Win64
    . Tested against Chromium 63.0.3205.0 / Win64
    . Tested against Chromium 64.0.3282.0 / Win64 (some tests skipped)
    . Tested against Chromium 62.0.3202.94 Built on Ubuntu, thanks Travis CI

0.07 2017-09-02
    ! Fix timers firing or not
    ! Implement a workaround for Chrome (not) navigating
      This workaround means sleeping 0.1s to see whether the notification comes
      in from Chrome after the "navigation complete" message has arrived.
      Ideally we will find a way to make Chrome tell us when it will perform
      HTTP transactions instead of having to wait.
    . Tested against Chromium 59.0.3071.115 / Win64
    . Tested against Chromium 60.0.3110.0 / Win64
    . Tested against Chromium 61.0.3141.0 / Win64
    . Tested against Chromium 62.0.3189.0 / Win64
    . Tested against Chromium 63.0.3205.0 / Win64
    . Tested against Chromium 58.0.3029.110 Built on Ubuntu, thanks Travis CI

0.06 2017-08-06
    . Correct the name of the examples module
    . No code changes, no need to upgrade

0.05 2017-08-06
    + More robust handling of Chrome disconnects
      It seems that Chromium 62+ disconnects all clients when a tab is closed
    ! ->get now always waits for an HTTP response
    . Tested against Chromium 59.0.3071.115 / Win64
    . Tested against Chromium 60.0.3110.0 / Win64
    . Tested against Chromium 61.0.3140.0 / Win64
    . Tested against Chromium 61.0.3141.0 / Win64
    . Tested against Chromium 62.0.3178.0 / Win64
    . Tested against Chromium 58.0.3029.110 Built on Ubuntu, thanks Travis CI

0.04 2017-07-01
    + Fix maximum websocket message size
      This was "randomly" breaking transfers with large assets.

0.03 2017-06-30
    ! The "profile" option now really uses the profile, not the data directory.
    + New option "data_directory" to set the base data directory.
    + We run all tests with a temporary user now instead of the default user
      that might be your current Chrome user
    + Tests now run headless by default
    + The backend event loop can be selected from the environment
    . Tested against Chromium 59.0.3071.115 / Win64
    . Tested against Chromium 60.0.3110.0 / Win64
    . Tested against Chromium 61.0.3140.0 / Win64
    . Tested against Chromium 61.0.3141.0 / Win64
    . Tested against Chromium 58.0.3029.110 Built on Ubuntu, thanks Travis CI

0.02 2017-06-23
    + Many more functions
    + Screencast ability
    + ->stop() function
    + Handling of Javascript dialogs
    . Tested against Chromium 60.0.3110.0 / Win64
    . Tested against Chromium 61.0.3140.0 / Win64
    . Tested against Chromium 58.0.3029.110 Built on Ubuntu, thanks Travis CI

0.01 2017-06-02
    . Released unto an unsuspecting audience
    . Tested against Chromium 60.0.3110.0 / Win64
    . Tested against Chromium 58.0.3029.110 Built on Ubuntu, thanks Travis CI
