Commit graph

701 commits

Author SHA1 Message Date
Pavel Feldman 34adc28ed3
feat(pause): make page.pause public (#5288) 2021-02-03 16:01:51 -08:00
Dmitry Gozman d8e0834562
fix(server): use setMaxListeners(0) on all internal event emitters (#5283) 2021-02-03 13:53:09 -08:00
Pavel Feldman 3d253c4e5c
feat: auto-detect expression/function in js server (#5284) 2021-02-03 13:49:25 -08:00
Dmitry Gozman fa1cf4108b
fix(codegen): do not show recorder controls in iframes (#5282) 2021-02-03 13:42:29 -08:00
Andrey Lushnikov cb1b64289c
devops: downloading ffmpeg during install step (#5249)
This patch starts downloading FFMPEG like we download our browsers
instead of bundling it in the NPM package.

With this patch, NPM size is reduced from 8.8MB to 1.7MB.

Consequences:
- `npx playwright` is drastically faster now
- playwright driver for language bindings is way smaller
- projects that bundle Playwright can pass Apple Notorization

Fixes #5193
2021-02-03 09:19:11 -08:00
Dmitry Gozman 4cad34509f
fix(oopifs): do not emulate focus in oopifs (#5270)
- We don't need this, since it should propagate from the main frame.
- Forcing focus in oopif immediately focuses it and blurs currently
  focused frame. This leads to undesired side effects, e.g. selects
  being closed.
2021-02-03 08:47:52 -08:00
Dmitry Gozman 1a464c732c
feat(video): switch vp8 in ffmpeg to realtime (#5260)
This switches vp8 to "realtime" mode that works fast, adapting to
the speed of incoming frames, and produces the best quality in can
given realtime constraints.

In practice, this gives 2x larger video files but no noticible quality
difference. It also eliminates huge delays for encoding the video.

Drive-by: document our ffmpeg option choices and add some links
to documentation for future use.
2021-02-02 17:14:39 -08:00
Pavel Feldman 8a8d8ea370
fix: update terminal size dynamically (#5250) 2021-02-02 14:25:51 -08:00
Dmitry Gozman 6c12f58058
feat(selectors): always make xpath relative (#5252)
This makes `/foo` and `//foo` match starting with the scope,
not the document, by turning them into `./foo` and `.//foo`.
2021-02-02 13:27:16 -08:00
Dmitry Gozman 9e09bd369d
fix(oopifs): ignore target closure when broadcasting across oopifs (#5246) 2021-02-02 10:21:42 -08:00
Andrey Lushnikov 276bbca3d1
fix: retry browser launch if it failed due to glibc error (#5247)
Fixes #5214
2021-02-01 15:23:57 -08:00
Pavel Feldman 1db5ef24a8
docs: document electron api (#5229) 2021-02-01 11:43:26 -08:00
Pavel Feldman bf8c30a88b
feat(ui): extract recorder sidebar into a window (#5223) 2021-01-31 16:37:13 -08:00
Pavel Feldman 975519150e
chore: centralize playwright creation, bind context listeners to instance (#5217) 2021-01-29 16:00:56 -08:00
Dominik Deren f8fbfe28fa
feat(trace viewer): Adds _debugName BrowserContextOption to let users define a name for their contexts (#5205)
This change is adding a new property on the BrowserContextOptions class called `_debugName`. This property allows defining a user-friendly name for the browser context, and currently it is being used in one place, the Trace Viewer. When user provides the new value in the following way:

```typescript
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext({ _traceDir: __dirname, _debugName: 'My custom testcase name' });
  await context.close();
  await browser.close();
})();
```

The `_debugName` will be saved in the `*.trace` file for this browser context, on the `context-created` event, under the key `debugName`.

Later, when such a trace is displayed using Trace Viewer, the `debugName` will be displayed in the dropdown in the top right part of the app instead of the actual trace filename.

Fixes #5157.
2021-01-28 10:50:57 -08:00
Dmitry Gozman e915e51ea9
chore: fix bad merge in codeGenerator.ts (#5196) 2021-01-27 17:45:27 -08:00
Dmitry Gozman 2793d14409
fix(codegen): do not forget to reset currentAction in didPerformAction (#5194) 2021-01-27 17:05:56 -08:00
Pavel Feldman e50f11c5b1
feat(ui): more recorder uis (#5187) 2021-01-27 17:02:09 -08:00
Dmitry Gozman 321a873d8a
fix(codegen): add timeout to our actions, catch errors (#5188) 2021-01-27 15:57:28 -08:00
Dmitry Gozman 527286683f
feat(codegen): prefer frame name over url when unique (#5175) 2021-01-27 13:19:36 -08:00
Yury Semikhatsky f3cc4dfe6d
feat(webkit): bump to 1428 (#5140) 2021-01-26 09:42:06 -08:00
Pavel Feldman 45f7d73470
chore: plumb terminal size and port language (#5149) 2021-01-25 19:01:04 -08:00
Dmitry Gozman 5033261d27
feat(trace): streaming snapshots (#5133)
- Instead of capturing snapshots on demand, we now stream them
  from each frame every 100ms.
- Certain actions can also force snapshots at particular moment using
  "checkpoints".
- Trace viewer is able to show the page snapshot at a particular
  timestamp, or using a "checkpoint" snapshot.
- Small optimization to not process stylesheets if CSSOM was not used.
  There still is a lot of room for improvement.
2021-01-25 18:44:46 -08:00
Pavel Feldman 87a3ccc49e
fix: do not return cookies with empty values (#5147) 2021-01-25 16:37:33 -08:00
Pavel Feldman 2e290be40b
chore: remove source maps in pwdebug mode (#5148) 2021-01-25 16:36:57 -08:00
Pavel Feldman fdde9493ea
fix: don't parse potentially invalid urls in event handlers (#5090) 2021-01-25 14:49:51 -08:00
Pavel Feldman 01d6f83597
chore: introduce debug toolbar (#5145) 2021-01-25 14:49:26 -08:00
Dmitry Gozman 894abbfe28
feat(selectors): has-text pseudo-class (#5120)
This pseudo-class matches approximately when
`element.textContent.includes(textToSearchFor)`.
2021-01-25 14:19:07 -08:00
Dmitry Gozman d78d337e29
feat(fill): make fill work when targeting elements inside the label (#5143) 2021-01-25 13:40:19 -08:00
Dmitry Gozman beed9a79a3
feat(chromium): bump to 845618 (#5138) 2021-01-25 07:45:21 -08:00
Pavel Feldman 464fdc1800
chore: make recorder a supplement (#5131) 2021-01-24 19:21:19 -08:00
Pavel Feldman be9bef513e
chore: move recorder to server side (#5128) 2021-01-24 08:44:11 -08:00
Joel Einbinder 3e4e511d84
feat(pause): page._pause to wait for user to click resume (#5050) 2021-01-22 18:47:02 -08:00
Dmitry Gozman 3e1c72ac5f
fix(reload): do not throw when reload is racing with navigation (#5113)
When `page.reload()` is racing against the renderer-initiated
navigation, we might end up with `waitForNavigation()` being rejected
before the reload implementation is able to catch it.

To avoid that, carefully use Promise.all and await `waitForNavigation`
from the get go.

Same happens to `page.goForward()` and `page.goBack()`.
2021-01-22 15:58:53 -08:00
Dmitry Gozman 7a4b94e66c
feat(selectors): nth-match selector (#5081)
Introduces :nth-match(ul > li, 3) css extension, with one-based index.
2021-01-21 16:39:49 -08:00
Pavel Feldman 4b5c876bbf
chore: allow opening empty trace viewer (#5080) 2021-01-20 19:16:23 -08:00
Yury Semikhatsky d00c5cfd64
feat(webkit): bump to 1423 (#5057) 2021-01-19 14:02:41 -08:00
Yury Semikhatsky 615954b285
fix(dom): make selectOption wait for options (#5036) 2021-01-19 11:27:05 -08:00
Dmitry Gozman 0586c2554f feat(text selector): normalize whitespace for quoted match (#5049)
This changes quoted text selector like `text="Foo Bar"` to perform
normalized whitespace match.

Most of the time users want to match some string visible on the page,
and that always means normalized whitespace.

We keep the case sensitivity and full-string vs substring difference
between quoted and unquoted matches.
2021-01-19 09:30:34 -08:00
Dmitry Gozman 0a7b917ee3
feat(chromium): bump to 844399 (#5044) 2021-01-17 17:28:06 -08:00
Dmitry Gozman 17e953c2d8
chore: make generate_types not depend on the source (#5040)
The only dependency is a list of devices that we
can turn into a js file.
2021-01-17 12:09:20 -08:00
Dmitry Gozman afaec552dd
feat(trace): show dialogs, navigations and misc events (#5025) 2021-01-15 18:30:55 -08:00
Dmitry Gozman 5c3f483659
fix(cli): do not extend injected script on same-document navigations (#5002)
Otherwise, the injected script has to be ready for reentrancy.
2021-01-13 14:25:42 -08:00
Joel Einbinder decf373c81
fix(electron): return a ChromiumBrowserContext for electron (#4913) 2021-01-13 12:08:14 -08:00
Yury Semikhatsky 29c34325c9
fix(cookies): make filtering by url work with subdomains (#4989) 2021-01-12 15:56:29 -08:00
Dmitry Gozman d62b661cfa
docs: rename proximity selectors to position selectors (#4975) 2021-01-11 18:25:41 -08:00
Yury Semikhatsky 728846b377
fix(launcher): add vcruntime140_1.dll to the list of known deps (#4973) 2021-01-11 15:01:29 -08:00
Dmitry Gozman 5a2cfdbd47
api: add isChecked method (#4953)
This adds `{Page,Frame}.isChecked(selector)` and `ElementHandle.isChecked()` methods.

Useful to do assertions in tests:
```js
await page.click('text="Add TODO"');
expect(await page.isChecked('.item-done')).toBe(false);
```
2021-01-08 17:36:17 -08:00
Joel Einbinder 31d980fc92
chore(webpack): minify injected sources (#4946) 2021-01-08 16:15:05 -08:00
Dmitry Gozman f0a8729137
chore: remove unused selector engines (#4950)
css and id are superseeded by the new css engine.
2021-01-08 14:51:43 -08:00
Dmitry Gozman 3f904056ee
api: add isVisible, isHidden, isEnabled, isDisabled and isEditable (#4915)
These methods are useful for verification in tests, e.g.
```js
expect(await page.isEnabled(':text("Remove All")')).toBe(false);
await page.click(':text("Add Item")');
expect(await page.isVisible('.item:text("new item")')).toBe(true);
expect(await page.isEnabled(':text("Remove All")')).toBe(true);
```
2021-01-08 12:27:54 -08:00
Dmitry Gozman d08cbc33a7
docs: brush up selector docs (#4939)
docs: brush up selector docs

- Remove duplication
- Move extensions block to ChromiumBrowser
- Remove accidental ":xpath" extension from css selectors
- Document :has and :is extensions
2021-01-08 10:59:24 -08:00
Dmitry Gozman 2e05feac25
feat(cli): bring in trace viewer (#4920) 2021-01-07 16:15:34 -08:00
Dmitry Gozman eb9ea20511
feat(selectors): proximity selectors (#4923) 2021-01-07 14:12:59 -08:00
Yury Semikhatsky 0a2fe62cb7
fix(extensions): do not enable screencast for background pages (#4919) 2021-01-06 15:08:28 -08:00
Dmitry Gozman 5215add60d
chore: remove selectorsV2Enabled switch (#4880)
Selectors V2 seem to stick.
2021-01-04 15:32:31 -08:00
Joel Einbinder 6697dadca2
chore(eslint): add rule no-unused-expressions (#4848) 2020-12-29 09:59:35 -08:00
Tom Jenkinson d08f8487c4
chore: remove useless statement that was a typo (#4846) 2020-12-29 08:58:09 -08:00
Dmitry Gozman 225e65e076
feat(cli): share console api between cli and debug mode (#4807) 2020-12-23 14:15:16 -08:00
Dmitry Gozman f709e2300c
feat(cli): bring selector generator into playwright (#4795)
Also remove unused `SelectorEngine.create` function and add tests.
2020-12-23 12:44:47 -08:00
Yury Semikhatsky 8d4c46ac19
fix: throw if quality=0 is passed for png screenshot (#4812) 2020-12-23 09:53:14 -08:00
Yury Semikhatsky 94ee48f8ce
fix: allow proxy credentials with empty password (#4779) 2020-12-21 11:47:13 -08:00
Pavel Feldman 774eb53980
fix(adb): force page scale factor update on connection (#4755) 2020-12-17 18:28:49 -08:00
Yury Semikhatsky 3219057ab0
fix(webkit): support utf-8 characters in postData, bump to 1407 (#4744) 2020-12-17 18:09:06 -08:00
Dmitry Gozman 5a1c9f1fe1
fix(selector): bring back v1 query logic (#4754)
It turned out that v1 query logic is not shimmable by v2 logic.
This change brings back v1 query logic for `>>` combinator.
2020-12-17 17:01:46 -08:00
Dmitry Gozman 9a0023cc03
fix(selectors): text engine after capture matches scope (#4749) 2020-12-17 06:19:43 -08:00
Dmitry Gozman 35533b15c1
fix(scroll): scroll from under the sticky header (#4641)
When element with position:sticky covers some part of
the scroll container, we could fail to scroll from under it
to perform an action. To fight this, we can try different
scroll alignments and scroll to the top/bottom/center
in the attempt to scroll away from sticky header/footer/sidebar.
2020-12-16 15:29:42 -08:00
Max Schmitt 2c409b040e
fix(android): leaking adb socket connections (#4730) 2020-12-15 20:15:25 -08:00
Pavel Feldman 97be66b15c
fix(adb): enable newPage in mobile browser (#4728) 2020-12-15 15:14:16 -08:00
Pavel Feldman e02c54485c
chore(adb): make driver smaller (#4713) 2020-12-14 18:39:14 -08:00
Andrey Lushnikov b09e0d01bd
fix(launchdoctor): make launch doctor to warn on Win7 (#4718)
Windows 7 was end-of-lifed on January 14, 2020. We don't support this
system, but we'd like to have a best-effort to work there.

It does look like Chromium is missing some libraries on Win 7, however
it still manages to work there. To support this usecase, this patch
starts printing console warning about missing libraries on Win 7 only
instead of refusing to launch.

Fixes #3496
2020-12-14 16:40:51 -08:00
Dmitry Gozman 355a58e616
feat(storage): accept path in save/load storage apis (#4714)
Also make Firefox accept `expires: -1` cookies.
2020-12-14 16:03:52 -08:00
Yury Semikhatsky 0b8f34e726
docs: rename aggregate parameter objects to params (#4715) 2020-12-14 15:27:02 -08:00
Pavel Feldman 4799e8f20b
feat(adb): add screenshot (#4701) 2020-12-13 23:20:13 -08:00
Pavel Feldman 1596b53da2
test(adb): fix browser tests (#4700) 2020-12-13 22:33:00 -08:00
Pavel Feldman f89dcc7ba7
feat(adb): implement push (#4697) 2020-12-13 22:00:37 -08:00
Pavel Feldman 844b2c8f93
chore(adb): lint the driver (#4696) 2020-12-13 09:35:28 -08:00
Pavel Feldman ad5309ca6b
feat(adb): make shell return binary (#4695) 2020-12-13 08:33:35 -08:00
Pavel Feldman 7c89ec051a
feat(adb): expose a11y tree (#4694) 2020-12-13 08:14:32 -08:00
Max Schmitt 1b7fb7d56a
feat(android): expose installAPK(path) and ADB socket (#4689) 2020-12-12 09:36:38 -08:00
Pavel Feldman 6cc695d92a
test(adb): fix the adb tests (#4691) 2020-12-12 01:18:32 -08:00
Pavel Feldman aa1b546bd0
chore(android): respect timeout, add build script (#4690) 2020-12-11 23:35:25 -08:00
Pavel Feldman f20518f252
fix(har): do not complain about a lot of listeners (#4675) 2020-12-11 23:15:36 -08:00
Pavel Feldman 616df7d2f4
fix(adb): minor fixes (#4678) 2020-12-10 16:37:18 -08:00
Dmitry Gozman 495085cbb2
fix(chromium): make interception work with dedicated workers (#4658) 2020-12-10 15:04:57 -08:00
Dmitry Gozman b9c959768c
feat(selectors): optimize old->new conversion for css (#4672) 2020-12-10 15:03:02 -08:00
Dmitry Gozman 12dc04a304
feat(selectors): optimize old->new selectors conversion for text (#4671) 2020-12-10 13:53:19 -08:00
Dmitry Gozman c8e9b0542b
feat(selectors): disable proximity selectors (#4659)
These are not ready for prime time yet.
2020-12-10 10:04:10 -08:00
Pavel Feldman 8fc49c98fa
feat(adb): support webviews (#4657) 2020-12-09 17:15:24 -08:00
Dmitry Gozman b67e022111
feat(selectors): update new text selector (#4654)
We now default to `text` that does substring case-insensitive match
with normalized whitespace. `text-is` matches the whole string.
`matches-text` is renamed to `text-matches`.
2020-12-09 16:05:51 -08:00
Pavel Feldman aacd8e633c
chore: expose adb devices and actions (#4647) 2020-12-09 15:06:57 -08:00
Dmitry Gozman ab44d682ca
feat(selectors): remove index for now, add documentation (#4640) 2020-12-09 13:08:37 -08:00
Dmitry Gozman 1060fce005
feat(selectors): explicit list of custom functions (#4629)
When parsing CSS, we assume everything is a valid CSS function,
unless it is in the list of custom functions. This way we'll parse
future CSS functions automatically.
2020-12-08 09:38:43 -08:00
Dmitry Gozman be16ce4bd2
feat(errors): append recent browser logs when browser disconnects (#4625) 2020-12-08 09:35:28 -08:00
Joel Einbinder ea833daa89
chore: fix internal binding (#4598) 2020-12-08 08:38:29 -08:00
Dmitry Gozman 1e754a4d80
feat(selectors): proximity selectors (#4614)
This includes 'left-of', 'right-of', 'above', 'below', 'near' and 'within'.
2020-12-07 16:07:47 -08:00
Dmitry Gozman c36f5fa33a
feat(chromium): roll to 833159 (#4626) 2020-12-07 15:55:22 -08:00
Dmitry Gozman 18b565a969
feat(selectors): correctly work in large DOM (#4628)
This adds a test, fixes a bunch of call stack issues and
improves performance in some places.
2020-12-07 15:51:44 -08:00
Dmitry Gozman 1e0ab79f9a
feat(selectors): add visible and index engines (#4595) 2020-12-06 15:03:36 -08:00
Dmitry Gozman 8218a71a9b
feat(selectors): add more tests for css selectors (#4596) 2020-12-04 16:12:59 -08:00
Dmitry Gozman 49a3f943b6
feat(selectors): switch to the new engine (#4589)
We leave old implementation under the boolean flag,
just in case we need a quick revert.
2020-12-04 06:51:18 -08:00
Dmitry Gozman 016925cd16
feat(selectors): implement builtin selectors in new evaluator (#4579) 2020-12-03 14:10:40 -08:00
Dmitry Gozman 3121de403b
test: remove tests for SelectorEngine.create (#4580)
We are not going to keep this functionality on arbitrary engines.
2020-12-03 14:10:26 -08:00
Dmitry Gozman 3d6194e8a1
feat(selectors): introduce css evaluator (#4573)
Not used for production yet.
2020-12-02 14:46:19 -08:00
Dmitry Gozman 52ae218bfc
fix(fill): allow filling more input types (#4563)
This includes invalid types that are no recognized by the browser.
2020-12-02 14:43:41 -08:00
Joel Einbinder 3624e3e315
chore: add internal method for utility context bindings (#4566)
* internal binding extracted from dnd patch

* refactor it into the page

* dgozman comments 1
2020-12-02 13:43:16 -08:00
Dmitry Gozman a45532fd82
feat(selectors): update css parser (#4565)
This change requires string arguments to be quoted,
for example `:text("foo")` works but `:text(foo)` does not.
2020-12-02 08:16:02 -08:00
Dmitry Gozman e98aceb981
feat(selectors): introduce css parser (#4522)
It is not used for anything just yet.
2020-11-30 16:31:40 -08:00
Andrey Lushnikov f916c98081
chore: update WebKit version to 14.1 (#4515)
Safari Technology Preview now reports WebKit 14.1
2020-11-23 16:21:42 -08:00
Pavel Feldman a0587949a5
feat(chromium): roll to r828656 (#4503) 2020-11-20 08:10:27 -08:00
Dmitry Gozman aea106b28e
chore: simplify server screencast code (#4501)
Currently, we always throw from FrameSession._stopScreencast
when not running with video, and immediately catch it in
CRPage.didClose (thanks to debugger to point that).

Overall, we have code prepared for start/stop API, which
we never did, so it makes sense to simplify code a bit,
and throw if something goes wrong.
2020-11-19 19:26:53 -08:00
Dmitry Gozman 5e6eed0d87
fix(frames): do not start network idle timer after detach (#4502)
This fixes a common flaky error on the bots:
```
Error: Cannot find object to emit "loadstate": Frame@f5b80c8c318c5471a1e6af552866e981
```
2020-11-19 19:20:53 -08:00
Dmitry Gozman 09f9a35198
fix(protocol): rename websocket error event to socketerror (#4495)
This is to avoid special handling of error events in node.
2020-11-19 12:09:42 -08:00
Yury Semikhatsky a877c24f05
fix(route): throw on attempt to fulfill with redirect in WebKit (#4449) 2020-11-17 16:56:04 -08:00
Dmitry Gozman 38fadcaded
fix(chromium): use frameDetached reason (#4468)
This fixes the local -> remote frame swap when
Page.frameDetached arrives before Target.attachedToTarget.

Instead of error-prone logic we do currently, new CDP exposes
frame detach reason that we can use.
2020-11-17 10:24:13 -08:00
Dmitry Gozman b9ac9df837
fix: prevent memory leak when collecting logs from injected script poll (#4448) 2020-11-16 14:11:55 -08:00
Joel Einbinder 31bebc7ea0
fix(close): allow errors when closing all pages of a context (#4324) 2020-11-16 10:26:34 -08:00
Yury Semikhatsky dfe3552b59
feat(route): support URL overrides in continue (#4438) 2020-11-16 09:59:00 -08:00
Yury Semikhatsky 732e83f48d
feat(webkit): bump to 1385 (#4430) 2020-11-13 16:29:20 -08:00
Pavel Feldman 9404d2abb6
fix(debug): do not generate source urls for anonymous scripts (#3691) 2020-11-13 14:47:55 -08:00
Pavel Feldman d20e56e197
feat(state): allow getting / setting context state (#4412) 2020-11-13 14:24:53 -08:00
Pavel Feldman a35d207091
test: fix resource timing for bigsur test (#4419) 2020-11-13 14:10:32 -08:00
Dmitry Gozman e69315f711
fix(websocket): remove "skip frames" logic (#4435)
This optimization turned out to be racy, so better remove it for now.
2020-11-13 14:03:21 -08:00
Pavel Feldman b0d174fd9a
revert: lifecycle refactoring, it breaks setContent (#4420) 2020-11-12 16:13:55 -08:00
Pavel Feldman 5d47214e2c
chore: register frameless listeners separately (#4407) 2020-11-12 13:44:38 -08:00
Pavel Feldman bd7507e133
chore: unify new page handling across vendors (#4411) 2020-11-12 12:41:23 -08:00
Yury Semikhatsky eee82a7fca
fix(oopif): store child frame id between frameDetached and attachedToTarget (#4410) 2020-11-12 09:51:17 -08:00
Yury Semikhatsky 5702eca1f2
fix(selectors): make selectOptions work for labels (#4402) 2020-11-11 15:33:23 -08:00
Dmitry Gozman 138680f93c
fix(launchServer): stream protocol logs into options.logger (#4403)
fix(launchServer): stream protocol logs into options.logger

This has regressed in v1.4.
2020-11-11 15:12:10 -08:00
Pavel Feldman 2158d6d073
feat(scopes): make page a scope (#4385) 2020-11-10 14:47:26 -08:00
Andrey Lushnikov 775be21db6
fix(launchdoctor): fix launch doctor (#4387)
New webkit build, generated by 19f21b1bde, changed webkit build
layout: now there are subfolders that contain libraries and executables, and some of the dependencies are no longer bundled.

This patch:
- teaches launch doctor new directories structure: subfolders are now inspected for missing dependencies, and they are also used in the `LD_LIBRARY_PATH`.
- adds `libevent` and `libicudata` libs to the mapping for ubuntu 18.04
2020-11-09 16:47:15 -08:00
Pavel Feldman 28f6547d67
chore: add adb-based connectivity (#4375) 2020-11-06 16:31:11 -08:00
Dmitry Gozman 3db8b23b25
fix(chromium): lifecycle events race (#4369) 2020-11-06 13:37:15 -08:00
Dmitry Gozman c83ac444b4
api(websocket): do not send websocket frames without a listener (#4361)
Once user adds 'websocket' listener, we start sending the frames
for all websockets on the page.
2020-11-06 12:30:16 -08:00
Dmitry Gozman 5faf6f9e69
feat(firefox): switch to use pipe instead of websocket (#3279) 2020-11-05 14:15:25 -08:00
Dmitry Gozman c384313058
feat(fill): allow filling based on the label selector (#4342)
This enables filling the input based on the connected label:

```html
<label for=target>Name</label><input id=target>
```

```js
await page.fill('text=Name', 'Alice');
```
2020-11-05 05:22:49 -08:00
Dmitry Gozman e942138913
fix: do not report errored pages after context closure (#4346)
Consider the following sequence:
- page opens a popup;
- popup target is attached, we start initializing it;
- user calls browser.close();
- browser is closed, and popup initialization fails;
- we report "errored page" on the already closed context;
- RPC client cannot make sense of this:
  "Cannot find parent object BrowserContext@guid to create Frame@guid"

This issue was revealed during Firefox pipe migration.
2020-11-04 16:23:38 -08:00
Andrey Lushnikov 65009dc867
feat(chromium): roll Chromium to r823944 (#4341)
Fixes #4021
2020-11-04 11:20:02 -08:00
Dmitry Gozman 924cc9894a
feat(text selector): normalize spaces in lax mode (#4312) 2020-11-03 04:37:06 -08:00
Dmitry Gozman 1c39689dd6
api(videos): introduce a single recordVideo option bag (#4309)
api(videos): introduce a single recordVideo option bag

Currently contains `dir` and `size`, previously known as
`videosPath` and `videoSize`.
2020-11-02 19:42:05 -08:00
Dmitry Gozman f80f81545e
feat(chromium): bump to 823078 (#4308) 2020-11-02 14:34:08 -08:00
Pavel Feldman ac8ab1e1b5
feat(websocket): add WebSocket.waitForEvent and isClosed (#4301) 2020-11-02 14:09:58 -08:00
Pavel Feldman d117d0bb93
feat(scopes): make page a scope (#4300) 2020-11-02 13:06:54 -08:00
Dmitry Gozman 9c80cbdf9e
fix(docs): small docs changes for new apis (#4305) 2020-11-02 12:48:05 -08:00
Andrey Lushnikov 7fbbd1822e
feat(firefox): support WebSockets on Firefox (#4289) 2020-10-30 10:34:24 -07:00
Pavel Feldman 914f6372ec
feat(proxy): enable per-context http proxy (#4280) 2020-10-29 16:12:30 -07:00
Pavel Feldman f384a864a8
test(har): uncomment some raw header tests (#4273) 2020-10-28 15:58:45 -07:00
Pavel Feldman 7bedbb2d78
feat(browser): roll WebKit to r1370 (#4257) 2020-10-28 13:46:05 -07:00
Pavel Feldman 0b8c33ee75
fix(ECONRESET): fix it once and for all (#4258) 2020-10-27 11:09:41 -07:00
Pavel Feldman be8428475d
feat(websocket): implement Web Sockets for Chromium & WebKit (#4234) 2020-10-26 22:20:43 -07:00
Pavel Feldman 7fc4b797eb
feat(har): allow saving har for context (#4214) 2020-10-26 14:32:07 -07:00
Pavel Feldman f5fbea94bb
feat(debug): allow using timeout for rafs for throttling debugging 2020-10-23 16:06:51 -07:00
Pavel Feldman c97af3ee91
fix(listeners): avoid "too many listeners" problem safely (#4223) 2020-10-23 10:38:26 -07:00
Pavel Feldman c4fbc6436a
Revert "fix(listeners): avoid "too many listeners" problem (#3931)" (#4222)
This holds on to process / handlers forever.
2020-10-23 10:04:55 -07:00
Pavel Feldman 72320275ab
fix(headers): report raw request headers on Chromium (#4207) 2020-10-22 08:49:16 -07:00
Pavel Feldman 8a42cdad30
feat(timing): introduce resource timing (#4204) 2020-10-21 23:25:57 -07:00
Pavel Feldman 5d997ed28b
fix(video): make video path available in persistent profiles (#4182) 2020-10-19 14:35:18 -07:00
Joel Einbinder 92dda698f8
feat: tap (#4097) 2020-10-19 10:07:33 -07:00
Joel Einbinder 86ef956b4b
feat(webkit): bump to 1357 (#4154) 2020-10-19 03:03:50 -07:00
Pavel Feldman bbdba42d30
chore(screencast): respect i/o backpressure when writing into ffmpeg (#4164) 2020-10-16 10:04:14 -07:00
Pavel Feldman e9f5477d52
fix(screencast): await for the first video frame on Chromium (#4145) 2020-10-14 15:09:36 -07:00
Pavel Feldman 46a49d0809
fix(screencast): bump chromium video quality (#4146) 2020-10-14 15:02:32 -07:00
Yury Semikhatsky bb981fc0cc
fix(screencast): correctly process videos with 1 frame (#4144) 2020-10-14 14:10:35 -07:00
Andrey Lushnikov c7b23599bc
feat(firefox): roll to r1190 (#4133) 2020-10-14 09:35:56 -07:00
Pavel Feldman 5a7685665a
api(video): restore the missing video path accessor (#4132) 2020-10-13 22:15:51 -07:00
Pavel Feldman 3f68713f1e
chore: locate binaries in case of cli deployment (#4107) 2020-10-09 15:56:03 -07:00
Joel Einbinder 9801be6401
feat(chromium): roll to 815036 (#4099) 2020-10-09 11:45:45 -07:00
Andrey Lushnikov 80773fa96b
fix: disable chromium sandbox by default (#4090)
Certain environments, e.g. Azure Pipelines, override default user
inside container with a custom one, whereas fail to pass proper
seccomp profile for the docker image.

As a result, chromium sandboxing fails.

To ease life of devops deploying tests in various CI's, this patch
disables Chromium sandbox by default.

References #4084
2020-10-09 11:28:22 -07:00
Pavel Feldman ad58e49201
Revert "feat(firefox): migrate to the pipe channel (#4068)" (#4073)
Mac sporadically hangs on browser close.
2020-10-06 21:16:50 -07:00
Pavel Feldman ce7aa7a608
feat(firefox): migrate to the pipe channel (#4068) 2020-10-06 14:40:09 -07:00
Thomas Chaplin 2df6425254
chore(typo): resolve typo in src/progress.ts (#4041) 2020-10-05 15:21:35 -07:00
Dmitry Gozman d31cbc21e5
fix(video): wait for videos when closing persistent context (#4040)
To achieve this, we close all the pages one by one, then wait
for the videos to finish processing, and then close the browser.
2020-10-04 18:18:05 -07:00
Dmitry Gozman e214f795e0
feat(video): support videos in remote browser (#4042) 2020-10-02 17:27:56 -07:00
Dmitry Gozman 5e42029fce
api: allow exposeBinding to pass handles (#4030)
This adds an option `{ handle: true }` to pass a single handle instead of arbitrary json values.
2020-10-01 22:47:31 -07:00
Dmitry Gozman 4a77363af7
api: update videos api, hide tracing (#4015) 2020-10-01 11:06:19 -07:00
Pavel Feldman 20b83ee0b4
fix(electron): do not use --require to throttle startup (#4006) 2020-09-29 18:01:14 -07:00
Dmitry Gozman b3497b333e
fix(actions): wait for some time before retrying the action (#4001)
This saves some CPU cycles while waiting for the page to
change the state, e.g. for animations to complete.

Note that retrying logic is only applicable in rare
circumstances like unexpected scroll in the middle of an
action, or some overlay blocking the click. Usually,
action times out in this cases while retrying.
2020-09-29 10:28:19 -07:00
Yury Semikhatsky 1d21c1e4bd
feat(webkit): bump to 1347 (#3955) 2020-09-22 16:38:05 -07:00
Dmitry Gozman 18809b3902
fix(listeners): avoid "too many listeners" problem (#3931)
We currently spawn a process per page when recording
video in Chromium. This triggers "too many listeners" on the
process object once you have enough pages open.
2020-09-22 13:45:57 -07:00
Pavel Feldman f1016c1fc1
fix(executablePath): throw unexpected platform error upon call (#3943) 2020-09-21 15:51:27 -07:00
Pavel Feldman cd0a123e78
feat(chromium): roll to v808777 (#3942) 2020-09-21 15:51:14 -07:00
Joel Einbinder 75edc61531
feat(emulation): emulate a mouse pointer in headless chrome (#3922) 2020-09-21 08:20:05 -07:00
Dmitry Gozman df777344a3
api(video): simplify video api (#3924)
- This leaves just `recordVideos` and `videoSize` options on the context.
- Videos are saved to `artifactsPath`. We also save their ids to trace.
- `context.close()` waits for the processed videos.
2020-09-18 17:36:43 -07:00
Dmitry Gozman 0ade6af689
api(trace): introduce artifacts options (#3914)
api(trace): introduce artifacts options

This introduces launch({ artifactsPath }) and newContext({ relativeArtifactsPath, recordTrace }) options.
- artifactsPath option controls the directory where all artifacts go. If not passed, artifacts are not collected.
- relativeArtifactsPath can be used to put context-specific artifacts into a subfolder. If not passed, shared artifactsPath is used.
- recordTrace controls trace recording.

We also expose trace types under playwright/types/trace.d.ts.

In the follow up:
- videos will be put into artifactsPath;
- downloads will be put into artifactsPath, or keep using existing downloadsPath when artifactsPath is not specified.
2020-09-18 11:54:00 -07:00
Dmitry Gozman 01a4060665
chore: move action instrumentation per-context (#3908)
This allows tracing to expose plugin-like api.

This also remove Progress -> ActionMetadata dependency, leaving
Progress a low-level utility.
2020-09-17 09:32:54 -07:00
Dmitry Gozman dc06f0a75c
chore: introduce evaluateInUtility private api (#3907)
This is an experimental  client-side api. We'll experiment with it in plugins like tracing.
2020-09-16 16:07:49 -07:00
Dmitry Gozman 36f2420b0f
chore(trace): remove dependency on handle._previewPromise (#3906)
We now mark the target with '__playwright_target__' attribute and
let the trace viewer do whatever it wants.
2020-09-16 15:26:59 -07:00
Yury Semikhatsky 5507553173
fix(screencast): repeat previous frame instead of current (#3890) 2020-09-15 15:21:50 -07:00
Dmitry Gozman 592bae1cea
feat(trace): record goto, setContent, goBack, goForward and reload (#3883) 2020-09-15 09:46:36 -07:00
Max Schmitt 8bc09af458
fix(firefox): imply default ports for proxy (#3850) 2020-09-14 21:22:07 -07:00
Andrey Lushnikov 430f2bedaa
devops: stop relying on ubuntu stock ffmpeg (#3882)
This patch bakes ffmpeg-linux r1001 into our NPM package.

This increases NPM package size from 4.2MB to 6.7MB.

Fixes #3845
2020-09-14 19:22:00 -07:00
Dmitry Gozman 2f0d2029ca
chore: refactor goBack/goForward/reload (#3859)
These methods are the only users of waitForNavigation and
waitForLoadState on the server side. This refactor lifts the
Progress wrapper to the top-most goBack/goForward/reload call
and leaves waitForNavigation/waitForLoadState as internal helpers.
This way we get a single Progress for the actual api call.
2020-09-14 16:43:17 -07:00
Dmitry Gozman 0a243c6792
fix(waitTask): remove rerunnable tasks from the context data upon success/failure (#3875) 2020-09-14 14:55:37 -07:00
Dmitry Gozman 7ab0c10d7b
fix(launchServer): do not throw when 'port' option is present (#3877)
We now use 'launch' under the hood, which erroneously throws
when 'port' is present.

Instead, moved validation to the client side where it belongs,
added tests for validation errors.
2020-09-14 14:43:39 -07:00
Dmitry Gozman 01198f8eef
fix($$): use utility context when possible (#3870)
This avoids the typical issue of overridden bulitins,
trading it for performance of one by one node adoptions.
2020-09-14 10:38:14 -07:00
Yury Semikhatsky e5c6b19c00
fix(launcher): check for ffmpeg only when starting screencast (#3874) 2020-09-14 10:26:44 -07:00
Dmitry Gozman 5314512cbc
chore: inline page._runAbortableTask (#3861)
It does not do anything nowadays.
2020-09-11 23:33:38 -07:00
Yury Semikhatsky 40323aa94d
fix(screencast): use viewport as default size (#3844) 2020-09-11 15:14:31 -07:00
Dmitry Gozman 263aa06fa4
feat(trace): trace more actions (#3853) 2020-09-11 13:28:24 -07:00
Dmitry Gozman 38ed8de23d
feat(tracing): trace actions (#3825)
- Fill and click actions pass metadata to Progress.
- Progress reports success/failure through instrumentation.
- Tracer consumes ActionResult and ActionMetadata and records them.

Currently, only click and fill actions pass metadata to
contain the size of the change. Everything else should follow.
2020-09-10 21:42:09 -07:00
Philipp Mudra 1e600cb9d8
fix(windows): show details about missing dependencies (#3839) 2020-09-10 16:36:08 -07:00
Dmitry Gozman ed3b00efdf
chore: merge BrowserType and BrowserTypeBase, remove logName (#3837)
- We do not need the public BrowserType different from BrowserTypeBase anymore.
- Removing 'logName' parameter from runAbortableTask - it will
be used for metadata instead.
2020-09-10 15:34:13 -07:00
Andrey Lushnikov 868740067b
refactor: consolidate ffmpeg-related files in third_party/ffmpeg (#3815)
This patch:
- moves ffmpeg binaries from `//bin/` to `//third_party/ffmpeg`
- adds [COPYING.GPLv3](https://github.com/FFmpeg/FFmpeg/blob/master/COPYING.GPLv3)
ffmpeg license
- changes npm packaging to include `//third_party/ffmpeg` only in `playwright` and `playwrihgt-chromium` a
2020-09-09 09:51:28 -07:00
Andrey Lushnikov e8cf89572a
feat(chromium): roll Chromium to r799411 (#3811) 2020-09-09 00:58:25 -07:00
Joel Einbinder 1791be6d16
fix(input): send keypress event for enter key in chromium (#3796) 2020-09-08 20:04:14 -07:00
Yury Semikhatsky af58c8acb2
fix(screencast): ensure that _videostarted is fired after newPage (#3807) 2020-09-08 17:01:00 -07:00
Yury Semikhatsky 8f81868b9c
fix(screencast): tune ffmpeg params for better quality (#3798) 2020-09-08 15:39:18 -07:00
Andrey Lushnikov 143adc1634
refactor: bake ffmpeg into npm instead of CDN (#3799) 2020-09-08 15:10:36 -07:00
Pavel Feldman 74f1a64e36
fix(debug): do not generate source urls for anonymous scripts (#3787) 2020-09-07 15:50:25 -07:00
Pavel Feldman c83b2da54f
chore: revert isDevMode into isUnderTest (#3785) 2020-09-06 21:36:22 -07:00
Pavel Feldman fea3ceb36c
chore: expose injectedScript.extend (#3784) 2020-09-06 18:19:32 -07:00
Yury Semikhatsky 66985fc5f6
feat(screencast): add expreimental public API on context (#3766) 2020-09-04 22:37:38 -07:00
Dmitry Gozman 675ce00432
chore: introduce "instrumentation" that is used for debug and trace (#3775) 2020-09-04 16:31:52 -07:00
Andrey Lushnikov bbe2233f08
feat(chromium): use bundled ffmpeg instead of npm deps (#3771)
Fixes #3680
2020-09-04 04:17:51 -07:00
Max Schmitt 190d16daa3
feat: add browser type to device descriptors (#3731) 2020-09-03 13:12:43 -07:00
Dmitry Gozman c190310335
fix(setInputFiles): make it work with CSP enabled (#3756)
We used to do fetch() to decode the file buffer. However, this is
blocked by strict CSP policy. Instead, we can use explicit
string -> bytes conversion, and trade performance for CSP compliance.
2020-09-03 10:09:03 -07:00
Andrey Lushnikov 7671e8e8be
devops: remove warnings when running under root without sandbox (#3749)
As discussed offline, our testing scenarios assume running trusted
web content - so this warning is just a noise for this usecases.

When it comes to dealing with untrusted web content though, automation
authors need to make sure to not launch browsers under root in the first
place.
2020-09-02 18:02:11 -07:00
Andrey Lushnikov 2d46cd8105
feat(electron): automatically disable electron sandbox when run as root (#3747) 2020-09-02 17:30:10 -07:00
Yury Semikhatsky 0976732ec6
fix(screencast): remove white padding in headless chromium (#3746) 2020-09-02 17:28:08 -07:00
Dmitry Gozman de547d7d65
fix(connect): make selectors.register work in connected browser (#3664)
This is a large rework of selectors:
- Each BrowserContext now has a separate Selectors instance that has its own registrations.
  Most of them share a single sharedSelectors instance, but contexts created for a connected
  browser have their own instance.
- Connected browser now gets a RemoteBrowser object that encapsulates Selectors and Browser.
  This Selectors object is registered with the api selectors.
- Public selectors.register api iterates over all registered Selectors channels
  and registers in each of them.
- createSelector testing method migrated to ElementHandle._createSelectorForTest.
2020-09-02 16:15:43 -07:00
Yury Semikhatsky 1e64efcad1
feat(screencast): autoscale to fit requested size (#3730) 2020-09-02 10:40:50 -07:00
Dmitry Gozman a4563a85ce
fix(snapshot): remove integrity checksum for css (#3729)
Otherwise we cannot override css with cssom changes.
2020-09-02 10:20:52 -07:00
Yury Semikhatsky fc29623508
feat(screencast): use system ffmpeg on linux (#3724) 2020-09-02 08:47:43 -07:00
Yury Semikhatsky f8408cb840
fix(launcher): check libs required for playing h.264 (#3715) 2020-09-01 16:29:38 -07:00
Yury Semikhatsky db9b8a003f
fix(screencast): dont throw from frameAck if target is closed (#3702) 2020-08-31 17:43:23 -07:00
Yury Semikhatsky a17dd98cf9
feat(screencast): auto recording for new pages in chromium (#3701) 2020-08-31 15:21:02 -07:00
Yury Semikhatsky 8ec55e1fb2
feat(screencast): use ffmpeg to produce webm in chromium (#3668) 2020-08-31 08:43:14 -07:00
Andrey Lushnikov 45e178f8b5
fix: support IP:PORT short notation to specify proxy server (#3568)
Short notation implies `http://` scheme.

Fixes #3233
2020-08-28 14:17:16 -07:00
Dmitry Gozman b34d9aba25
feat(trace): experimental traces for our tests (#3567)
This introduces basic tracing enabled in our tests.

What is captured:
- network resources;
- snapshots at the start of most actions;
- snapshot after the test failure.

How this integrates with test runner:
- context fixture calls private method context._initSnapshotter() and uses Tracer to trace all events;
- all tests share a single test-results/trace-storage directory to store blobs;
- each test has its own trace file.
- npm run show-trace opens a bare-minimum trace viewer that renders snapshots.
2020-08-28 10:51:55 -07:00
Dmitry Gozman 5c0f93301d
test: always setUnderTest in index.js, rename to setDevMode (#3662)
Root index.js is only used for local development, so
assuming dev mode there is fine. This way we do not have
to worry about calling setUnderTest early enough.
2020-08-27 21:08:33 -07:00
Yury Semikhatsky 5f9407a0d1
feat(webkit): bump to 1334 (#3643) 2020-08-26 15:18:39 -07:00
Dmitry Gozman 8d7ec3aca3
fix(downloads): make path/saveAs work when connected remotely (#3634)
- saveAs uses a stream internally and pipes it to the local file;
- path throws an error when called on a remote browser.
2020-08-26 12:46:30 -07:00
Yury Semikhatsky db0fa07330
fix(screencast): replace ScreencastStopped with async path() (#3626) 2020-08-25 17:18:28 -07:00
Yury Semikhatsky 22b9246692
chore(context): unify browser context id handling (#3629) 2020-08-25 16:33:16 -07:00
Yury Semikhatsky a38564b7ca
fix(screencast): replace ScreencastStopped event with async path() (#3612) 2020-08-25 13:07:32 -07:00
Yury Semikhatsky b9d6324d14
feat(screencast): fire start evet for popups (#3600) 2020-08-24 17:23:54 -07:00
Dmitry Gozman bdbcae16cb
chore: remove injected -> types dependency (#3606)
This way, injected is self-contained and we can ensure it does not
depend on anything node-specific.
2020-08-24 15:30:45 -07:00
Dmitry Gozman cd220daa83
chore: move src files to server (#3593) 2020-08-24 06:51:51 -07:00
Dmitry Gozman 73e53b21df
chore: move injected and debug to src/server (#3591) 2020-08-23 20:25:59 -07:00
Dmitry Gozman 847201b132
chore: move firefox to src/server/firefox (#3590) 2020-08-23 17:05:58 -07:00
Dmitry Gozman 6a53b205e5
chore: move webkit to src/server/webkit (#3589) 2020-08-23 15:39:03 -07:00
Dmitry Gozman 77f803140a
fix(electron): fix electron types, move source to src/server/electron (#3583) 2020-08-23 13:46:40 -07:00
Dmitry Gozman 2e1493a5fa
chore: move browserPaths to utils, enforce more deps (#3584) 2020-08-22 21:15:03 -07:00
Dmitry Gozman f4e8f34c96
chore: move chromium to src/server/chromium, enfore installer deps (#3582) 2020-08-22 15:46:42 -07:00
Dmitry Gozman 655013d025
chore: move shared utilities to src/utils (#3575) 2020-08-22 07:07:13 -07:00
Dmitry Gozman 57e8617474
chore: refactor impl-side events to be per-class (#3569) 2020-08-21 16:26:33 -07:00
Dmitry Gozman 0a22e2758a
fix(chromium): disable lazy loading iframes (#3535)
These do not play nicely with our "page is loaded when all frames
are loaded" logic.
2020-08-19 15:58:13 -07:00
Dmitry Gozman 745dc339a6
chore: merge Browser{Context,}Base into Browser{Context,} (#3524) 2020-08-19 10:31:59 -07:00
Dmitry Gozman e54195ccfb
chore: align page.pdf options to the rpc protocol (#3521)
Drive-by: remove unused devices from playwright impl.
2020-08-18 18:48:44 -07:00
Dmitry Gozman 9790ea5b5d
chore: align more server-side options with rpc protocol (#3506)
This touches:
- noDefaultViewport;
- ignoreAllDefaultArgs;
- env;
- validateXYZ logic that was copying objects - we do not need that anymore;
- shuffles some converters closer to their usage.
2020-08-18 09:37:40 -07:00
Dmitry Gozman 58fc6b4003
chore: align some server-side methods with rpc calls (#3504)
- Never write to console on the server side - we use stdout for
  communication. This includes logPolitely and deprecate.
- Pass undefined instead of null in some BrowserContext methods.
- Use explicit _setFileChooserIntercepted instead of on/off magic.
2020-08-17 16:19:21 -07:00
Dmitry Gozman 141a255a07
chore: remove unused methods from server side (#3502)
Most of these were api methods that are no longer called directly.
2020-08-17 14:36:51 -07:00
Dmitry Gozman 1e9c0eb705
chore: remove logger infrastructure from server side (#3487)
We do not implement LoggerSink on the server, so we can
use a simple debugLogger.
2020-08-17 14:12:31 -07:00
Dmitry Gozman bc23324878
chore: remove apiName plumbing and some unused methods from server side (#3481)
We append apiName where needed on the client instead.
2020-08-14 18:25:32 -07:00
Dmitry Gozman ae4280a12b
chore: cleanup more non-rpc code (#3471)
- Replaces BrowserServer class with BrowserProcess struct.
- Removes src/api.ts.
- Removes helper.installApiHooks.
- Removes BrowserType.launchServer.
2020-08-14 13:19:12 -07:00
Dmitry Gozman 9b52ca8676
chore: remove unused non-rpc code, test options, infra, bots (#3444) 2020-08-13 16:00:23 -07:00
Andrey Lushnikov 515665908e chore: add comment to clarify /sbin 2020-08-13 11:44:21 -07:00
Joel Einbinder 1ef199f512
fix(launchDoctor): add sudo to install missing packages hint (#3402) 2020-08-12 08:48:35 -07:00
Andrey Lushnikov c035560389
fix: full path to ldconfig in linux (#3401) 2020-08-12 08:47:41 -07:00
Andrey Lushnikov 2db97e3b2d
feat(firefox): migrate to protocol-based proxy implementation (#3362)
This migrates Firefox to the protocol-based proxy implementation.

Benefits:
- supports secure web proxies (already supported by Chromium)
- unlocks support for SOCKS proxies with authentication
2020-08-11 11:36:27 -07:00
Max Schmitt e582cc678c
fix(launcher): make PrintDeps.exe path configurable (#3311) 2020-08-05 13:33:40 -07:00
Yury Semikhatsky 7e8d03b050
fix(launcher): extend list of known missing DLLs (#3256)
#2745
2020-07-31 14:11:11 -07:00
Yury Semikhatsky cbfdca736c
feat(launcher): check dependencies before launch on Windows (#3240) 2020-07-30 17:15:46 -07:00
Dmitry Gozman cefb1b9727
feat(rpc): run fixtures.jest.js with channel (#3227)
Also, introduce setupInProcess wrapper to be used for in-process rpc.
2020-07-30 10:22:28 -07:00
Andrey Lushnikov e09132527d
fix: a pretty error when browser executable is not found (#3220)
Make sure executable exists before launching it. If it doesn't and
we were launched without custom executable path, print a helpful
instruction to run `npm i playwright` and get browsers downloaded.

Note: there's already a test that makes sure bad executable paths
are treated fairly: 9132d23b2b/test/launcher.jest.js (L54-L59)

This doesn't test missing default browser installation which I think is
fine.

Fixes #3161
2020-07-29 23:16:24 -07:00
Andrey Lushnikov f111ad7437
fix: add missing libgles2 package to launch doctor (#3209)
References #2745
2020-07-29 10:40:33 -07:00
Andrey Lushnikov 6bc02f8fb6
feat(launchdoctor): detect missing libraries for dlopen (#3202)
WebKit WPE assumes `libglesv2.so` is available on the host system
and uses `dlopen` to open it.

This patch starts using `ldconfig -p` to check if the library
exists on the system.

References #2745
2020-07-29 09:58:45 -07:00
Andrey Lushnikov 6fa7547ce3
fix(launchDoctor): add package mapping for libvpx.so.5 (#3180)
Since we were bundling the library with the browsers before, the
mapping was missing.

References #2745
2020-07-27 10:39:45 -07:00
Max Schmitt 9b502af4e3
fix(launchDoctor): support existing LD_LIBRARY_PATH (#3165) 2020-07-27 10:05:12 -07:00
Dmitry Gozman fd2e65b73c
api: export all browsers from every package (#3128)
This makes it easier to reason about our packages.
The only difference is what each package downloads.
When the browser is not downloaded, it will fail to launch.

Each browser gets a 'download' attribute in the browser.json file.
2020-07-24 16:36:00 -07:00
Andrey Lushnikov 86b64a2311
feat(launchDoctor): package mappings for Ubuntu 20.04 (#3155)
This teaches Launch Doctor to print a command to install missing
packages on Ubuntu 20.04.

References #2745
2020-07-24 16:15:42 -07:00
Andrey Lushnikov d4b707861c
feat: validate Ubuntu version if launching firefox (#3156)
The original plan was to rnu some checks against libc version the
binary is compiled with, but these turn out to be a little complicated:
parsing out libc version from both static binary and host system
requires text processing, and it's hard to make sure it works reliably
across distributions.

Instead, let's start with a very particular check against running
Firefox on Ubuntu 16.04.

References #2745
2020-07-24 16:14:14 -07:00
Andrey Lushnikov bbe7dbe9ae
feat(installer): start downloadinb Ubuntu 20.04 builds (#3126)
Start auto-detecting Ubuntu 20.04 and downloading custom webkit
build for it.

References #2745
2020-07-23 17:37:47 -07:00
Dmitry Gozman 2bed312911
fix(electron): emit close events in the correct order (#3111) 2020-07-23 11:02:43 -07:00
Dmitry Gozman 65002a0ac2
feat(rpc): support firefox user prefs (#3093)
Also ignore firefoxUserPrefs in launchPersistentContext according to our api.
2020-07-22 17:20:00 -07:00
Andrey Lushnikov ea5dfdbec7
fix: re-write Chromium startup error with clear instructions (#3070)
This patch detects Chromium crash with a sandboxing error and re-writes
the error to surface information nicely.

#### Error Before:

```sh
pwuser@23592d09b3bd:~/tmp$ node a.js
(node:324) UnhandledPromiseRejectionWarning: browserType.launch: Protocol error (Browser.getVersion): Target closed.
=========================== logs ===========================
[browser] <launching> /home/pwuser/.cache/ms-playwright/chromium-790602/chrome-linux/chrome --disable-background-networking --enable-features=NetworkService,NetworkServiceInProcess --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disab
le-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=TranslateUI,BlinkGenPropertyTrees,ImprovedCookieControls,SameSiteByDefaultCookies --disable-hang-monitor --disab
le-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-sync --force-color-profile=srgb --metrics-recording-only --no-first-run --enable-automation --password-store=basic --use-mock-keychain --user-data-dir=/tmp/playwrig
ht_chromiumdev_profile-mjSfr2 --remote-debugging-pipe --headless --hide-scrollbars --mute-audio --no-startup-window
[browser] <launched> pid=401
[browser] [0722/170825.030020:FATAL:zygote_host_impl_linux.cc(117)] No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux/suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live
dangerously and need an immediate workaround, you can try using --no-sandbox.
[browser] #0 0x55ac4f8c7be9 base::debug::CollectStackTrace()
[browser] #1 0x55ac4f841c13 base::debug::StackTrace::StackTrace()
[browser] #2 0x55ac4f853680 logging::LogMessage::~LogMessage()
[browser] #3 0x55ac4df2307e content::ZygoteHostImpl::Init()
[browser] #4 0x55ac4f40dd47 content::ContentMainRunnerImpl::Initialize()
[browser] #5 0x55ac4f45c9fa service_manager::Main()
[browser] #6 0x55ac4f40c361 content::ContentMain()
[browser] #7 0x55ac4f45b5bd headless::(anonymous namespace)::RunContentMain()
[browser] #8 0x55ac4f45b2bc headless::HeadlessShellMain()
[browser] #9 0x55ac4ccc22e7 ChromeMain
[browser] #10 0x7f0f3d736b97 __libc_start_main
[browser] #11 0x55ac4ccc212a _start
[browser]
[browser] Received signal 6
[browser] #0 0x55ac4f8c7be9 base::debug::CollectStackTrace()
[browser] #1 0x55ac4f841c13 base::debug::StackTrace::StackTrace()
[browser] #2 0x55ac4f8c7785 base::debug::(anonymous namespace)::StackDumpSignalHandler()
[browser] #3 0x7f0f437b3890 (/lib/x86_64-linux-gnu/libpthread-2.27.so+0x1288f)
[browser] #4 0x7f0f3d753e97 gsignal
[browser] #5 0x7f0f3d755801 abort
[browser] #6 0x55ac4f8c66e5 base::debug::BreakDebugger()
[browser] #7 0x55ac4f853aeb logging::LogMessage::~LogMessage()
[browser] #8 0x55ac4df2307e content::ZygoteHostImpl::Init()
[browser] #9 0x55ac4f40dd47 content::ContentMainRunnerImpl::Initialize()
[browser] #10 0x55ac4f45c9fa service_manager::Main()
[browser] #11 0x55ac4f40c361 content::ContentMain()
[browser] #12 0x55ac4f45b5bd headless::(anonymous namespace)::RunContentMain()
[browser] #13 0x55ac4f45b2bc headless::HeadlessShellMain()
[browser] #14 0x55ac4ccc22e7 ChromeMain
[browser] #15 0x7f0f3d736b97 __libc_start_main
[browser] #16 0x55ac4ccc212a _start
[browser]   r8: 0000000000000000  r9: 00007ffd38a863b0 r10: 0000000000000008 r11: 0000000000000246
[browser]  r12: 00007ffd38a87680 r13: 00007ffd38a86610 r14: 00007ffd38a87690 r15: aaaaaaaaaaaaaaaa
[browser]   di: 0000000000000002  si: 00007ffd38a863b0  bp: 00007ffd38a86600  bx: 00007ffd38a86e44
[browser]   dx: 0000000000000000  ax: 0000000000000000  cx: 00007f0f3d753e97  sp: 00007ffd38a863b0
[browser]   ip: 00007f0f3d753e97 efl: 0000000000000246 cgf: 002b000000000033 erf: 0000000000000000
[browser]  trp: 0000000000000000 msk: 0000000000000000 cr2: 0000000000000000
[browser] [end of stack trace]
[browser] Calling _exit(1). Core file will not be generated.
============================================================
Note: use DEBUG=pw:api environment variable and rerun to capture Playwright logs.Error
    at /home/pwuser/tmp/node_modules/playwright/lib/chromium/crConnection.js:131:63
    at new Promise (<anonymous>)
    at CRSession.send (/home/pwuser/tmp/node_modules/playwright/lib/chromium/crConnection.js:130:16)
    at CRSession.send (/home/pwuser/tmp/node_modules/playwright/lib/helper.js:78:31)
    at Function.connect (/home/pwuser/tmp/node_modules/playwright/lib/chromium/crBrowser.js:54:39)
    at Chromium._connectToTransport (/home/pwuser/tmp/node_modules/playwright/lib/server/chromium.js:52:38)
    at Chromium._innerLaunch (/home/pwuser/tmp/node_modules/playwright/lib/server/browserType.js:87:36)
    at async ProgressController.run (/home/pwuser/tmp/node_modules/playwright/lib/progress.js:75:28)
    at async Chromium.launch (/home/pwuser/tmp/node_modules/playwright/lib/server/browserType.js:60:25)
    at async /home/pwuser/tmp/a.js:4:19
(node:324) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise reject
ion, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:324) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```


#### Error After:

```sh
pwuser@23592d09b3bd:~/tmp$ node a.js
(node:222) UnhandledPromiseRejectionWarning: browserType.launch: Chromium sandboxing failed!
================================
To workaround sandboxing issues, do either of the following:
  - (preferred): Configure environment to support sandboxing: https://github.com/microsoft/playwright/blob/master/docs/troubleshooting.md
  - (alternative): Launch Chromium without sandbox using 'chromiumSandbox: false' option
================================
Error
    at /home/pwuser/tmp/node_modules/playwright/lib/chromium/crConnection.js:131:63
    at new Promise (<anonymous>)
    at CRSession.send (/home/pwuser/tmp/node_modules/playwright/lib/chromium/crConnection.js:130:16)
    at CRSession.send (/home/pwuser/tmp/node_modules/playwright/lib/helper.js:78:31)
    at Function.connect (/home/pwuser/tmp/node_modules/playwright/lib/chromium/crBrowser.js:54:27)
    at Chromium._connectToTransport (/home/pwuser/tmp/node_modules/playwright/lib/server/chromium.js:53:38)
    at Chromium._innerLaunch (/home/pwuser/tmp/node_modules/playwright/lib/server/browserType.js:89:36)
    at async ProgressController.run (/home/pwuser/tmp/node_modules/playwright/lib/progress.js:75:28)
    at async Chromium.launch (/home/pwuser/tmp/node_modules/playwright/lib/server/browserType.js:61:25)
    at async /home/pwuser/tmp/a.js:4:19
(node:222) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise reject
ion, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:222) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```

References #2745
2020-07-22 10:57:58 -07:00
Andrey Lushnikov 47e30f047b
feat: introduce chromiumSandbox launch option (#3067)
The option is intended to be used instead of the `--no-sandbox`
argument that is accepted exclusively by Chromium and crashes
WebKit.

References #2745
2020-07-21 13:49:09 -07:00
Andrey Lushnikov af20d2704f
fix: auto-add --no-sandbox when running Chromium under root (#3064)
References #2745
2020-07-21 13:21:42 -07:00
Dmitry Gozman 5848ed8f41
feat(rpc): introduce protocol.pdl (#3054)
We now generate channels.ts from the protocol definition. There are still some shortcomings,
like union types - these will be addressed in follow ups.
2020-07-20 17:38:06 -07:00
Andrey Lushnikov 9a2245d30a
devops: show package names instead of missing libs on Ubuntu 18.04 (#3013)
This patch starts putting package names to install on Ubuntu instead
of missing dependencies list.

The mapping of library to package name is obtained using the following
script: https://gist.github.com/aslushnikov/2766200430228c3700537292fccad064

References #2745
2020-07-17 16:50:20 -07:00
Dmitry Gozman 91e1a25f34
feat(rpc): gracefully close browsers in server process on disconnect (#3005) 2020-07-17 16:14:23 -07:00
Dmitry Gozman aa4c893b09
feat(rpc): implement waitForNavigation on the client (#2949)
Drive-by: fix electron issues, exposed by the test using
waitForNavigation.

Drive-by: mark some tests skip(CHANNEL) that were mistakenly
marked skip(USES_HOOKS).
2020-07-15 18:48:19 -07:00
Andrey Lushnikov 0b9218149f
feat: validate browser dependencies before launching on Linux (#2960)
Missing dependencies is #1 problem with launching on Linux.

This patch starts validating browser dependencies before launching
browser on Linux. In case of a missing dependency, we will abandon
launching with an error that lists all missing libs.

References #2745
2020-07-15 15:24:38 -07:00
Dmitry Gozman cc8fe5a763
feat(rpc): support electron (#2933) 2020-07-13 21:46:59 -07:00
Andrey Lushnikov a403d4beff
fix(firefox): fix launching firefox without dependencies (#2900)
We always have to reject promises with some error. Otherwise,
our error-rewriting logic in try-catch miserably fails.

With this patch, attempt to launch Firefox when it's missing
dependencies will actually result in a thrown exception with
pretty logs. Without this patch, Playwright throws internal error.
2020-07-10 16:04:19 -07:00
Dmitry Gozman 8fe29feb21
feat(rpc): support more chromium-specific apis (#2883)
This includes page CDPSession, backgroundPages() and serviceWorkers().

This has also revealed an issue with closing order between the context
and the service worker.
2020-07-08 21:36:03 -07:00
Dmitry Gozman 2a86ead0ac
chore: replace FrameTask with internal events on Frame (#2856)
We now use a few helper.waitForEvent calls to wait for internal
events kNavigationEvent and kLifecycleEvent. With these events,
we should be able to replicate logic over rpc.
2020-07-07 15:22:05 -07:00
Pavel Feldman bc3050776e
chore: prepare library types for rpc (#2706) 2020-06-25 08:30:56 -07:00
Pavel Feldman fca514d74e
chore: move non-trivial types out of types.ts (#2680) 2020-06-23 14:51:06 -07:00
Pavel Feldman c220fc7f46
chore(logs): rework logs for simplicity (#2592) 2020-06-16 17:11:19 -07:00
Pavel Feldman 894826dec0
chore: form the debug script for authoring hints / helpers (#2551) 2020-06-11 18:18:33 -07:00
Pavel Feldman 17433d1881
chore: verify launch options (#2530) 2020-06-10 20:48:54 -07:00
Pavel Feldman 903de2582a
chore(websocket): extract common socket part (#2506) 2020-06-10 16:33:27 -07:00
Dmitry Gozman 1bb33650b0
chore: remove ExtendedEventEmitter and inline waitForEvent (#2529) 2020-06-10 15:12:50 -07:00
Pavel Feldman 8ee19d53e7
feature(webkit): roll WebKit to 1273 (#2514) 2020-06-10 13:36:45 -07:00
Dmitry Gozman 80705ff5e9
chore: simplify logging a bit (#2512)
This merges a few classes and stops inheriting from InnerLogger.
2020-06-09 16:11:17 -07:00
Pavel Feldman 9aa9d6bc1d
feat(downloads): accept downloads in persistent, allow specifying the downloadsPath (#2503) 2020-06-08 21:45:35 -07:00
Dmitry Gozman 3ec79e17fc
chore: simplify timeout handling in progress (#2487) 2020-06-05 15:53:30 -07:00
Dmitry Gozman 300099734c
chore: migrate waitForEvent to Progress (#2483)
Drive-by: remove/simplify some helper code.
2020-06-05 14:14:19 -07:00
Pavel Feldman fb058ffe0d
feat(proxy): allow specifying proxy (#2485) 2020-06-05 13:50:15 -07:00