Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[BUG] ERROR: method 'Target.enable' is not supported Firefox custom build. #1307

Closed
ghost opened this issue Mar 10, 2020 · 6 comments
Closed

Comments

@ghost
Copy link

ghost commented Mar 10, 2020

Context:

Playwright Version: latest
Operating System: Linux
Extra: Custom Firefox linux build (works by hand)

Code Snippet

const playwright = require('playwright');

(async () => {
  for (const browserType of ['firefox',]) {
    const browser = await playwright[browserType].launch({
      headless: false,
      dumpio: true,
    });
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto('http://whatsmyuseragent.org/');
    await page.screenshot({ path: `example-${browserType}.png` });
    await browser.close();
  }
})();

Describe the bug

My problem arises when using a custom Mozilla build but following playwright scripts and mozilla documentation.
Address Sanitizer. File mozconfig by default is

# Combined .mozconfig file for ASan on Linux+Mac
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-ff-asan

# Enable ASan specific code and build workarounds
ac_add_options --enable-address-sanitizer

# Add ASan to our compiler flags
export CFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -fPIC"
export CXXFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -fPIC"

# Additionally, we need the ASan flag during linking. Normally, our C/CXXFLAGS would
# be used during linking as well but there is at least one place in our build where
# our CFLAGS are not added during linking.
# Note: The use of this flag causes Clang to automatically link the ASan runtime :)
export LDFLAGS="-fsanitize=address"

# These three are required by ASan
ac_add_options --disable-jemalloc
ac_add_options --disable-crashreporter
ac_add_options --disable-elf-hack

# Keep symbols to symbolize ASan traces later
export MOZ_DEBUG_SYMBOLS=1
ac_add_options --enable-debug-symbols
ac_add_options --disable-install-strip

# Settings for an opt build (preferred)
# The -gline-tables-only ensures that all the necessary debug information for ASan
# is present, but the rest is stripped so the resulting binaries are smaller.
ac_add_options --enable-optimize="-O2 -gline-tables-only"
ac_add_options --disable-debug

# Settings for a debug+opt build
#ac_add_options --enable-optimize
#ac_add_options --enable-debug

# ASan specific options on Linux
ac_add_options --enable-valgrind

Build process as described Contributing Browser Patches

$ ./browser_patches/prepare_checkout.sh firefox checkout
$ ./path/checkout/mach bootstrap // to ensure satisfied dependencies.
$ ./browser_patches/firefox/build.sh 
$ ./path/checkout/mach run // to ensure build works fine
$ ./browser_patches/firefox/archive.sh .. //saved zip and cp it to core path and replace original folder of firefox or defined by 'executablePath' in script.

Commented new build config to disable crash reporter ../local-firefox/linux-1029/firefox/playwright.cfg if not firefox shows a dialog at start "contact administrator.." (it is disabled in mozconfig "ac_add_options --disable-crashreporter" anyway)

//lockPref("toolkit.crashreporter.enabled", false);
..
//Components.classes["@mozilla.org/toolkit/crash-reporter;1"].getService(Components.interfaces.nsICrashReporter).submitReports = false;

Error if not commented in 'dumpio':

JavaScript error: playwright.cfg, line 235: TypeError: Components.classes['@mozilla.org/toolkit/crash-reporter;1'] is undefined
Firefox AddressSanitizer build is done, it works fine because I use it for my testsuite manually. But if I use it with the playwright script, opens Firefox and visually does nothing and throw this error :

1583842611731	addons.webextension.doh-rollout@mozilla.org	WARN	Loading extension 'doh-rollout@mozilla.org': Reading manifest: Invalid extension permission: networkStatus
1583842612448	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons
1583842612448	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: telemetry
1583842612448	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/
1583842612449	addons.webextension.screenshots@mozilla.org	WARN	Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader*
[2020-03-10T12:16:53Z ERROR audio_thread_priority::rt_linux] setrlimit64: 1
Juggler listening on ws://127.0.0.1:39135/74fcf71e-37f4-4a0c-b17d-69890b3676e4
(node:21256) UnhandledPromiseRejectionWarning: Error: Protocol error (Target.enable): ERROR: method 'Target.enable' is not supported _dispatch@chrome://juggler/content/protocol/Dispatcher.js:96:15

    at Promise (/home/lupin/node_modules/playwright-core/lib/firefox/ffConnection.js:54:63)
    at new Promise (<anonymous>)
    at FFConnection.send (/home/lupin/node_modules/playwright-core/lib/firefox/ffConnection.js:53:16)
    at Function.connect (/home/lupin/node_modules/playwright-core/lib/firefox/ffBrowser.js:49:26)
    at Firefox.launch (/home/lupin/node_modules/playwright-core/lib/server/firefox.js:54:53)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:21256) 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(). (rejection id: 1)
(node:21256) [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.

This part t's not important, same line with default playwright firefox build and works fine with script attached

[2020-03-10T12:16:53Z ERROR audio_thread_priority::rt_linux] setrlimit64: 1 it's not important, same line with default playwright firefox build and works fine with script attached)
Any help to locate and fix this issue? I use Firefox with Address Sanitizer to commit fixes and ensure no memory corruptions are introduced.

@ghost ghost closed this as completed Mar 11, 2020
@ghost ghost reopened this Mar 11, 2020
@ghost ghost closed this as completed Mar 11, 2020
@ghost
Copy link
Author

ghost commented Mar 11, 2020

@aslushnikov I have mistakenly edited and closed this issue. I do not know how to recover it but it is in the historical record as edited. Could you take a look at it please? It is important to me and I am unable to find a solution and I am stuck to perform a work demo.

@ghost ghost reopened this Mar 11, 2020
@aslushnikov
Copy link
Collaborator

I have mistakenly edited and closed this issue. I do not know how to recover it but it is in the historical record as edited.

@lupinhex I think I mostly restored your issue.

Could you take a look at it please?

Let me try to compile FF the way you do and see what fails the build.

@ghost
Copy link
Author

ghost commented Mar 11, 2020

I have mistakenly edited and closed this issue. I do not know how to recover it but it is in the historical record as edited.

@lupinhex I think I mostly restored your issue.

Could you take a look at it please?

Let me try to compile FF the way you do and see what fails the build.

Thank you!

aslushnikov added a commit to aslushnikov/playwright that referenced this issue Mar 11, 2020
Type TypeError that happens while loading document is reported in
the message manager but does not have the error event.

Saw this while reproducing microsoft#1307
@aslushnikov
Copy link
Collaborator

@lupinhex
So here are the things I did:

  1. Got a tip-of-tree checkout of playwight: git clone https://github.com/microsoft/playwright
  2. change dir into playwright: cd playwright
  3. Ran npm install to get all dependencies
  4. Ran //browser_patches/prepare_checkout.sh firefox to get a firefox checkout
  5. Put the following in //browser_patches/firefox/checkout/.mozconfig
# Combined .mozconfig file for ASan on Linux+Mac
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-ff-asan

# Enable ASan specific code and build workarounds
ac_add_options --enable-address-sanitizer

# Add ASan to our compiler flags
export CFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -fPIC"
export CXXFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -fPIC"

# Additionally, we need the ASan flag during linking. Normally, our C/CXXFLAGS would
# be used during linking as well but there is at least one place in our build where
# our CFLAGS are not added during linking.
# Note: The use of this flag causes Clang to automatically link the ASan runtime :)
export LDFLAGS="-fsanitize=address"

# These three are required by ASan
ac_add_options --disable-jemalloc
ac_add_options --disable-crashreporter
ac_add_options --disable-elf-hack

# Keep symbols to symbolize ASan traces later
export MOZ_DEBUG_SYMBOLS=1
ac_add_options --enable-debug-symbols
ac_add_options --disable-install-strip

# Settings for an opt build (preferred)
# The -gline-tables-only ensures that all the necessary debug information for ASan
# is present, but the rest is stripped so the resulting binaries are smaller.
ac_add_options --enable-optimize="-O2 -gline-tables-only"
ac_add_options --disable-debug

# Settings for a debug+opt build
#ac_add_options --enable-optimize
#ac_add_options --enable-debug

# ASan specific options on Linux
ac_add_options --enable-valgrind
  1. Ran //browser_patches/firefox/build.sh to compile firefox
  2. I did not run the //browser_patches/firefox/archive.sh.
  3. I put the following file in the root of playwright checkout:
// NOTICE: requiring playwright from source
const playwright = require('.');

(async () => {
  for (const browserType of ['firefox',]) {
    const browser = await playwright[browserType].launch({
      // NOTICE: using executablePath to run local build
      executablePath: "/home/aslushnikov/prog/playwright/browser_patches/firefox/checkout/obj-x86_64-pc-linux-gnu/dist/bin/firefox",
      headless: false,
      dumpio: true,
    });
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto('http://whatsmyuseragent.org/');
    await page.screenshot({ path: `example-${browserType}.png` });
    await browser.close();
  }
})();

Running this script worked fine for me. I didn't even do anything with crash reporter in preferences.

I'm on Ubuntu 18.04. Can you try running this?

dgozman pushed a commit that referenced this issue Mar 11, 2020
…1344)

Type TypeError that happens while loading document is reported in
the message manager but does not have the error event.

Saw this while reproducing #1307
@ghost
Copy link
Author

ghost commented Mar 11, 2020

I'm on Ubuntu 18.04. Can you try running this?

It has been building for 40 minutes, so I have not replied before. I close it and open it if it doesn't work when it's done. Thank you!

@ghost ghost closed this as completed Mar 11, 2020
@zyscoder
Copy link

zyscoder commented Jan 4, 2021

@lupinhex
So here are the things I did:

  1. Got a tip-of-tree checkout of playwight: git clone https://github.com/microsoft/playwright
  2. change dir into playwright: cd playwright
  3. Ran npm install to get all dependencies
  4. Ran //browser_patches/prepare_checkout.sh firefox to get a firefox checkout
  5. Put the following in //browser_patches/firefox/checkout/.mozconfig
# Combined .mozconfig file for ASan on Linux+Mac
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-ff-asan

# Enable ASan specific code and build workarounds
ac_add_options --enable-address-sanitizer

# Add ASan to our compiler flags
export CFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -fPIC"
export CXXFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -fPIC"

# Additionally, we need the ASan flag during linking. Normally, our C/CXXFLAGS would
# be used during linking as well but there is at least one place in our build where
# our CFLAGS are not added during linking.
# Note: The use of this flag causes Clang to automatically link the ASan runtime :)
export LDFLAGS="-fsanitize=address"

# These three are required by ASan
ac_add_options --disable-jemalloc
ac_add_options --disable-crashreporter
ac_add_options --disable-elf-hack

# Keep symbols to symbolize ASan traces later
export MOZ_DEBUG_SYMBOLS=1
ac_add_options --enable-debug-symbols
ac_add_options --disable-install-strip

# Settings for an opt build (preferred)
# The -gline-tables-only ensures that all the necessary debug information for ASan
# is present, but the rest is stripped so the resulting binaries are smaller.
ac_add_options --enable-optimize="-O2 -gline-tables-only"
ac_add_options --disable-debug

# Settings for a debug+opt build
#ac_add_options --enable-optimize
#ac_add_options --enable-debug

# ASan specific options on Linux
ac_add_options --enable-valgrind
  1. Ran //browser_patches/firefox/build.sh to compile firefox
  2. I did not run the //browser_patches/firefox/archive.sh.
  3. I put the following file in the root of playwright checkout:
// NOTICE: requiring playwright from source
const playwright = require('.');

(async () => {
  for (const browserType of ['firefox',]) {
    const browser = await playwright[browserType].launch({
      // NOTICE: using executablePath to run local build
      executablePath: "/home/aslushnikov/prog/playwright/browser_patches/firefox/checkout/obj-x86_64-pc-linux-gnu/dist/bin/firefox",
      headless: false,
      dumpio: true,
    });
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto('http://whatsmyuseragent.org/');
    await page.screenshot({ path: `example-${browserType}.png` });
    await browser.close();
  }
})();

Running this script worked fine for me. I didn't even do anything with crash reporter in preferences.

I'm on Ubuntu 18.04. Can you try running this?

I recently stuck in the same problem too.
I think your steps have some mistakes. You put the .mozconfig in the //browser_patches/firefox/checkout/ first, and then run //browser_patches/firefox/build.sh. I noticed that the script //browser_patches/firefox/build.sh would rewrite .mozconfig, causing that your firefox is not built with the original configure (The one with asan). To verify this, you can have a look at the .mozconfig after you run build.sh to build firefox.
I modified the build.sh script:

#!/bin/bash
set -e
set +x

RUST_VERSION="1.47.0"
CBINDGEN_VERSION="0.15.0"
# Certain minimal SDK Version is required by firefox
MACOS_SDK_VERSION="10.12"
# XCode version can be determined from https://en.wikipedia.org/wiki/Xcode
XCODE_VERSION_WITH_REQUIRED_SDK_VERSION="8.3.3"

trap "cd $(pwd -P)" EXIT

cd "$(dirname $0)"
SCRIPT_FOLDER="$(pwd -P)"

if [[ ! -z "${FF_CHECKOUT_PATH}" ]]; then
  cd "${FF_CHECKOUT_PATH}"
  echo "WARNING: checkout path from FF_CHECKOUT_PATH env: ${FF_CHECKOUT_PATH}"
else
  cd "checkout"
fi


if [[ "$(uname)" == "Darwin" ]]; then
  # Firefox currently does not build on 10.15 out of the box - it requires SDK for 10.12.
  # Make sure the SDK is out there.
  if ! [[ -d $HOME/SDK-archive/MacOSX${MACOS_SDK_VERSION}.sdk ]]; then
    echo "As of Dec 2020, Firefox does not build on Mac without ${MACOS_SDK_VERSION} SDK."
    echo "Download XCode ${XCODE_VERSION_WITH_REQUIRED_SDK_VERSION} from https://developer.apple.com/download/more/ and"
    echo "extract SDK to $HOME/SDK-archive/MacOSX${MACOS_SDK_VERSION}.sdk"
    echo ""
    echo "More info: https://firefox-source-docs.mozilla.org/setup/macos_build.html"
    exit 1
  else
    echo "-- configuting .mozconfig with ${MACOS_SDK_VERSION} SDK path"
    echo "ac_add_options --with-macos-sdk=$HOME/SDK-archive/MacOSX${MACOS_SDK_VERSION}.sdk/" > .mozconfig
  fi
  echo "-- building on Mac"
elif [[ "$(uname)" == "Linux" ]]; then
  echo "-- building on Linux"
  echo "ac_add_options --disable-av1" > .mozconfig
elif [[ "$(uname)" == MINGW* ]]; then
  DLL_FILE=""
  if [[ $1 == "--win64" ]]; then
    echo "-- building win64 build on MINGW"
    echo "ac_add_options --target=x86_64-pc-mingw32" > .mozconfig
    echo "ac_add_options --host=x86_64-pc-mingw32" >> .mozconfig
    DLL_FILE=$("C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -find '**\Redist\MSVC\*\x64\**\vcruntime140.dll')
  else
    echo "-- building win32 build on MINGW"
    DLL_FILE=$("C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -find '**\Redist\MSVC\*\x86\**\vcruntime140.dll')
  fi
  WIN32_REDIST_DIR=$(dirname "$DLL_FILE")
  if ! [[ -d $WIN32_REDIST_DIR ]]; then
    echo "ERROR: cannot find MS VS C++ redistributable $WIN32_REDIST_DIR"
    exit 1;
  fi
  echo "export WIN32_REDIST_DIR=\"$WIN32_REDIST_DIR\"" >> .mozconfig
else
  echo "ERROR: cannot upload on this platform!" 1>&2
  exit 1;
fi

#OBJ_FOLDER="obj-build-playwright"
OBJ_FOLDER="objdir-ff-asan"
echo "mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/${OBJ_FOLDER}" >> .mozconfig
echo "ac_add_options --enable-address-sanitizer" >> .mozconfig
echo "export CFLAGS=\"-fsanitize=address -Dxmalloc=myxmalloc -fPIC\"" >> .mozconfig
echo "export CXXFLAGS=\"-fsanitize=address -Dxmalloc=myxmalloc -fPIC\"" >> .mozconfig
echo "export LDFLAGS=\"-fsanitize=address\"" >> .mozconfig
echo "ac_add_options --disable-jemalloc" >> .mozconfig
echo "ac_add_options --disable-crashreporter" >> .mozconfig
echo "ac_add_options --disable-elf-hack" >> .mozconfig
echo "export MOZ_DEBUG_SYMBOLS=1" >> .mozconfig
echo "ac_add_options --enable-debug-symbols" >> .mozconfig
echo "ac_add_options --disable-install-strip" >> .mozconfig
echo "ac_add_options --enable-optimize=\"-O2 -gline-tables-only\"" >> .mozconfig
echo "ac_add_options --disable-debug" >> .mozconfig
echo "ac_add_options --enable-valgrind" >> .mozconfig

if ! [[ -f "$HOME/.mozbuild/_virtualenvs/mach/bin/python" ]]; then
  ./mach create-mach-environment
fi

if [[ $1 == "--juggler" ]]; then
  ./mach build faster
else
  # TODO: rustup is not in the PATH on Windows
  if command -v rustup >/dev/null; then
    # We manage Rust version ourselves.
    echo "-- Using rust v${RUST_VERSION}"
    rustup install "${RUST_VERSION}"
    rustup default "${RUST_VERSION}"
  fi

  # TODO: cargo is not in the PATH on Windows
  if command -v cargo >/dev/null; then
    echo "-- Using cbindgen v${CBINDGEN_VERSION}"
    cargo install cbindgen --version "${CBINDGEN_VERSION}"
  fi
  ./mach build
fi

if [[ "$(uname)" == "Darwin" ]]; then
  node "${SCRIPT_FOLDER}"/install-preferences.js $PWD/${OBJ_FOLDER}/dist
else
  node "${SCRIPT_FOLDER}"/install-preferences.js $PWD/${OBJ_FOLDER}/dist/bin
fi

and then run build.sh.
After that I run my firefox with //browser_patches/checkout/mach run but error occurs:
Screenshot from 2021-01-04 20-48-53

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants