puppeteer-ruby 0.37.3 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,14 +28,23 @@ module Puppeteer::Launcher
28
28
  end
29
29
 
30
30
  if firefox_arguments.none? { |arg| arg.start_with?('--remote-debugging-') }
31
- firefox_arguments << '--remote-debugging-port=0'
31
+ firefox_arguments << "--remote-debugging-port=#{@chrome_arg_options.debugging_port}"
32
32
  end
33
33
 
34
- temporary_user_data_dir = nil
35
- if firefox_arguments.none? { |arg| arg.start_with?('--profile') || arg.start_with?('-profile') }
36
- temporary_user_data_dir = create_profile
34
+ profile_arg_index = firefox_arguments.index { |arg| arg.start_with?('--profile') || arg.start_with?('-profile') }
35
+ if profile_arg_index
36
+ using_temp_user_data_dir = false
37
+ user_data_dir = firefox_arguments[profile_arg_index + 1]
38
+ unless File.exist?(user_data_dir)
39
+ raise ArgumentError.new("Firefox profile not found at '#{user_data_dir}'")
40
+ end
41
+ prefs = default_preferences(@launch_options.extra_prefs_firefox)
42
+ write_preferences(prefs, user_data_dir)
43
+ else
44
+ using_temp_user_data_dir = true
45
+ user_data_dir = create_profile(@launch_options.extra_prefs_firefox)
37
46
  firefox_arguments << "--profile"
38
- firefox_arguments << temporary_user_data_dir
47
+ firefox_arguments << user_data_dir
39
48
  end
40
49
 
41
50
  firefox_executable =
@@ -44,7 +53,13 @@ module Puppeteer::Launcher
44
53
  else
45
54
  @launch_options.executable_path || fallback_executable_path
46
55
  end
47
- runner = Puppeteer::BrowserRunner.new(firefox_executable, firefox_arguments, temporary_user_data_dir)
56
+ runner = Puppeteer::BrowserRunner.new(
57
+ true,
58
+ firefox_executable,
59
+ firefox_arguments,
60
+ user_data_dir,
61
+ using_temp_user_data_dir,
62
+ )
48
63
  runner.start(
49
64
  handle_SIGHUP: @launch_options.handle_SIGHUP?,
50
65
  handle_SIGTERM: @launch_options.handle_SIGTERM?,
@@ -54,30 +69,39 @@ module Puppeteer::Launcher
54
69
  pipe: @launch_options.pipe?,
55
70
  )
56
71
 
72
+ browser =
73
+ begin
74
+ connection = runner.setup_connection(
75
+ use_pipe: @launch_options.pipe?,
76
+ timeout: @launch_options.timeout,
77
+ slow_mo: @browser_options.slow_mo,
78
+ preferred_revision: @preferred_revision,
79
+ )
80
+
81
+ Puppeteer::Browser.create(
82
+ connection: connection,
83
+ context_ids: [],
84
+ ignore_https_errors: @browser_options.ignore_https_errors?,
85
+ default_viewport: @browser_options.default_viewport,
86
+ process: runner.proc,
87
+ close_callback: -> { runner.close },
88
+ )
89
+ rescue
90
+ runner.kill
91
+ raise
92
+ end
93
+
57
94
  begin
58
- connection = runner.setup_connection(
59
- use_pipe: @launch_options.pipe?,
95
+ browser.wait_for_target(
96
+ predicate: ->(target) { target.type == 'page' },
60
97
  timeout: @launch_options.timeout,
61
- slow_mo: @browser_options.slow_mo,
62
- preferred_revision: @preferred_revision,
63
98
  )
64
-
65
- browser = Puppeteer::Browser.create(
66
- connection: connection,
67
- context_ids: [],
68
- ignore_https_errors: @browser_options.ignore_https_errors?,
69
- default_viewport: @browser_options.default_viewport,
70
- process: runner.proc,
71
- close_callback: -> { runner.close },
72
- )
73
-
74
- browser.wait_for_target(predicate: ->(target) { target.type == 'page' })
75
-
76
- browser
77
99
  rescue
78
- runner.kill
100
+ browser.close
79
101
  raise
80
102
  end
103
+
104
+ browser
81
105
  end
82
106
 
83
107
  # @return [Puppeteer::Browser]
@@ -187,11 +211,13 @@ module Puppeteer::Launcher
187
211
 
188
212
  # @param options [Launcher::ChromeArgOptions]
189
213
  def initialize(chrome_arg_options)
190
- firefox_arguments = ['--no-remote', '--foreground']
214
+ firefox_arguments = ['--no-remote']
191
215
 
192
- # if (os.platform().startsWith('win')) {
193
- # firefoxArguments.push('--wait-for-browser');
194
- # }
216
+ if Puppeteer.env.darwin?
217
+ firefox_arguments << '--foreground'
218
+ elsif Puppeteer.env.windows?
219
+ firefox_arguments << '--wait-for-browser'
220
+ end
195
221
 
196
222
  if chrome_arg_options.user_data_dir
197
223
  firefox_arguments << "--profile"
@@ -227,209 +253,216 @@ module Puppeteer::Launcher
227
253
  DefaultArgs.new(ChromeArgOptions.new(options || {}))
228
254
  end
229
255
 
230
- private def create_profile(extra_prefs = {})
231
- Dir.mktmpdir('puppeteer_dev_firefox_profile-').tap do |profile_path|
232
- server = 'dummy.test'
233
- default_preferences = {
234
- # Make sure Shield doesn't hit the network.
235
- 'app.normandy.api_url': '',
236
- # Disable Firefox old build background check
237
- 'app.update.checkInstallTime': false,
238
- # Disable automatically upgrading Firefox
239
- 'app.update.disabledForTesting': true,
240
-
241
- # Increase the APZ content response timeout to 1 minute
242
- 'apz.content_response_timeout': 60000,
243
-
244
- # Prevent various error message on the console
245
- # jest-puppeteer asserts that no error message is emitted by the console
246
- 'browser.contentblocking.features.standard': '-tp,tpPrivate,cookieBehavior0,-cm,-fp',
247
-
248
- # Enable the dump function: which sends messages to the system
249
- # console
250
- # https://bugzilla.mozilla.org/show_bug.cgi?id=1543115
251
- 'browser.dom.window.dump.enabled': true,
252
- # Disable topstories
253
- 'browser.newtabpage.activity-stream.feeds.system.topstories': false,
254
- # Always display a blank page
255
- 'browser.newtabpage.enabled': false,
256
- # Background thumbnails in particular cause grief: and disabling
257
- # thumbnails in general cannot hurt
258
- 'browser.pagethumbnails.capturing_disabled': true,
259
-
260
- # Disable safebrowsing components.
261
- 'browser.safebrowsing.blockedURIs.enabled': false,
262
- 'browser.safebrowsing.downloads.enabled': false,
263
- 'browser.safebrowsing.malware.enabled': false,
264
- 'browser.safebrowsing.passwords.enabled': false,
265
- 'browser.safebrowsing.phishing.enabled': false,
266
-
267
- # Disable updates to search engines.
268
- 'browser.search.update': false,
269
- # Do not restore the last open set of tabs if the browser has crashed
270
- 'browser.sessionstore.resume_from_crash': false,
271
- # Skip check for default browser on startup
272
- 'browser.shell.checkDefaultBrowser': false,
273
-
274
- # Disable newtabpage
275
- 'browser.startup.homepage': 'about:blank',
276
- # Do not redirect user when a milstone upgrade of Firefox is detected
277
- 'browser.startup.homepage_override.mstone': 'ignore',
278
- # Start with a blank page about:blank
279
- 'browser.startup.page': 0,
280
-
281
- # Do not allow background tabs to be zombified on Android: otherwise for
282
- # tests that open additional tabs: the test harness tab itself might get
283
- # unloaded
284
- 'browser.tabs.disableBackgroundZombification': false,
285
- # Do not warn when closing all other open tabs
286
- 'browser.tabs.warnOnCloseOtherTabs': false,
287
- # Do not warn when multiple tabs will be opened
288
- 'browser.tabs.warnOnOpen': false,
289
-
290
- # Disable the UI tour.
291
- 'browser.uitour.enabled': false,
292
- # Turn off search suggestions in the location bar so as not to trigger
293
- # network connections.
294
- 'browser.urlbar.suggest.searches': false,
295
- # Disable first run splash page on Windows 10
296
- 'browser.usedOnWindows10.introURL': '',
297
- # Do not warn on quitting Firefox
298
- 'browser.warnOnQuit': false,
299
-
300
- # Defensively disable data reporting systems
301
- 'datareporting.healthreport.documentServerURI': "http://#{server}/dummy/healthreport/",
302
- 'datareporting.healthreport.logging.consoleEnabled': false,
303
- 'datareporting.healthreport.service.enabled': false,
304
- 'datareporting.healthreport.service.firstRun': false,
305
- 'datareporting.healthreport.uploadEnabled': false,
306
-
307
- # Do not show datareporting policy notifications which can interfere with tests
308
- 'datareporting.policy.dataSubmissionEnabled': false,
309
- 'datareporting.policy.dataSubmissionPolicyBypassNotification': true,
310
-
311
- # DevTools JSONViewer sometimes fails to load dependencies with its require.js.
312
- # This doesn't affect Puppeteer but spams console (Bug 1424372)
313
- 'devtools.jsonview.enabled': false,
314
-
315
- # Disable popup-blocker
316
- 'dom.disable_open_during_load': false,
317
-
318
- # Enable the support for File object creation in the content process
319
- # Required for |Page.setFileInputFiles| protocol method.
320
- 'dom.file.createInChild': true,
321
-
322
- # Disable the ProcessHangMonitor
323
- 'dom.ipc.reportProcessHangs': false,
324
-
325
- # Disable slow script dialogues
326
- 'dom.max_chrome_script_run_time': 0,
327
- 'dom.max_script_run_time': 0,
328
-
329
- # Only load extensions from the application and user profile
330
- # AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION
331
- 'extensions.autoDisableScopes': 0,
332
- 'extensions.enabledScopes': 5,
333
-
334
- # Disable metadata caching for installed add-ons by default
335
- 'extensions.getAddons.cache.enabled': false,
336
-
337
- # Disable installing any distribution extensions or add-ons.
338
- 'extensions.installDistroAddons': false,
339
-
340
- # Disabled screenshots extension
341
- 'extensions.screenshots.disabled': true,
342
-
343
- # Turn off extension updates so they do not bother tests
344
- 'extensions.update.enabled': false,
345
-
346
- # Turn off extension updates so they do not bother tests
347
- 'extensions.update.notifyUser': false,
348
-
349
- # Make sure opening about:addons will not hit the network
350
- 'extensions.webservice.discoverURL': "http://#{server}/dummy/discoveryURL",
351
-
352
- # Allow the application to have focus even it runs in the background
353
- 'focusmanager.testmode': true,
354
- # Disable useragent updates
355
- 'general.useragent.updates.enabled': false,
356
- # Always use network provider for geolocation tests so we bypass the
357
- # macOS dialog raised by the corelocation provider
358
- 'geo.provider.testing': true,
359
- # Do not scan Wifi
360
- 'geo.wifi.scan': false,
361
- # No hang monitor
362
- 'hangmonitor.timeout': 0,
363
- # Show chrome errors and warnings in the error console
364
- 'javascript.options.showInConsole': true,
365
-
366
- # Disable download and usage of OpenH264: and Widevine plugins
367
- 'media.gmp-manager.updateEnabled': false,
368
- # Prevent various error message on the console
369
- # jest-puppeteer asserts that no error message is emitted by the console
370
- 'network.cookie.cookieBehavior': 0,
371
-
372
- # Do not prompt for temporary redirects
373
- 'network.http.prompt-temp-redirect': false,
374
-
375
- # Disable speculative connections so they are not reported as leaking
376
- # when they are hanging around
377
- 'network.http.speculative-parallel-limit': 0,
378
-
379
- # Do not automatically switch between offline and online
380
- 'network.manage-offline-status': false,
381
-
382
- # Make sure SNTP requests do not hit the network
383
- 'network.sntp.pools': server,
384
-
385
- # Disable Flash.
386
- 'plugin.state.flash': 0,
387
-
388
- 'privacy.trackingprotection.enabled': false,
389
-
390
- # Enable Remote Agent
391
- # https://bugzilla.mozilla.org/show_bug.cgi?id=1544393
392
- 'remote.enabled': true,
393
-
394
- # Don't do network connections for mitm priming
395
- 'security.certerrors.mitm.priming.enabled': false,
396
- # Local documents have access to all other local documents,
397
- # including directory listings
398
- 'security.fileuri.strict_origin_policy': false,
399
- # Do not wait for the notification button security delay
400
- 'security.notification_enable_delay': 0,
401
-
402
- # Ensure blocklist updates do not hit the network
403
- 'services.settings.server': "http://#{server}/dummy/blocklist/",
256
+ private def default_preferences(extra_prefs)
257
+ server = 'dummy.test'
258
+ default_preferences = {
259
+ # Make sure Shield doesn't hit the network.
260
+ 'app.normandy.api_url': '',
261
+ # Disable Firefox old build background check
262
+ 'app.update.checkInstallTime': false,
263
+ # Disable automatically upgrading Firefox
264
+ 'app.update.disabledForTesting': true,
265
+
266
+ # Increase the APZ content response timeout to 1 minute
267
+ 'apz.content_response_timeout': 60000,
268
+
269
+ # Prevent various error message on the console
270
+ # jest-puppeteer asserts that no error message is emitted by the console
271
+ 'browser.contentblocking.features.standard': '-tp,tpPrivate,cookieBehavior0,-cm,-fp',
272
+
273
+ # Enable the dump function: which sends messages to the system
274
+ # console
275
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1543115
276
+ 'browser.dom.window.dump.enabled': true,
277
+ # Disable topstories
278
+ 'browser.newtabpage.activity-stream.feeds.system.topstories': false,
279
+ # Always display a blank page
280
+ 'browser.newtabpage.enabled': false,
281
+ # Background thumbnails in particular cause grief: and disabling
282
+ # thumbnails in general cannot hurt
283
+ 'browser.pagethumbnails.capturing_disabled': true,
284
+
285
+ # Disable safebrowsing components.
286
+ 'browser.safebrowsing.blockedURIs.enabled': false,
287
+ 'browser.safebrowsing.downloads.enabled': false,
288
+ 'browser.safebrowsing.malware.enabled': false,
289
+ 'browser.safebrowsing.passwords.enabled': false,
290
+ 'browser.safebrowsing.phishing.enabled': false,
291
+
292
+ # Disable updates to search engines.
293
+ 'browser.search.update': false,
294
+ # Do not restore the last open set of tabs if the browser has crashed
295
+ 'browser.sessionstore.resume_from_crash': false,
296
+ # Skip check for default browser on startup
297
+ 'browser.shell.checkDefaultBrowser': false,
298
+
299
+ # Disable newtabpage
300
+ 'browser.startup.homepage': 'about:blank',
301
+ # Do not redirect user when a milstone upgrade of Firefox is detected
302
+ 'browser.startup.homepage_override.mstone': 'ignore',
303
+ # Start with a blank page about:blank
304
+ 'browser.startup.page': 0,
305
+
306
+ # Do not allow background tabs to be zombified on Android: otherwise for
307
+ # tests that open additional tabs: the test harness tab itself might get
308
+ # unloaded
309
+ 'browser.tabs.disableBackgroundZombification': false,
310
+ # Do not warn when closing all other open tabs
311
+ 'browser.tabs.warnOnCloseOtherTabs': false,
312
+ # Do not warn when multiple tabs will be opened
313
+ 'browser.tabs.warnOnOpen': false,
314
+
315
+ # Disable the UI tour.
316
+ 'browser.uitour.enabled': false,
317
+ # Turn off search suggestions in the location bar so as not to trigger
318
+ # network connections.
319
+ 'browser.urlbar.suggest.searches': false,
320
+ # Disable first run splash page on Windows 10
321
+ 'browser.usedOnWindows10.introURL': '',
322
+ # Do not warn on quitting Firefox
323
+ 'browser.warnOnQuit': false,
324
+
325
+ # Defensively disable data reporting systems
326
+ 'datareporting.healthreport.documentServerURI': "http://#{server}/dummy/healthreport/",
327
+ 'datareporting.healthreport.logging.consoleEnabled': false,
328
+ 'datareporting.healthreport.service.enabled': false,
329
+ 'datareporting.healthreport.service.firstRun': false,
330
+ 'datareporting.healthreport.uploadEnabled': false,
331
+
332
+ # Do not show datareporting policy notifications which can interfere with tests
333
+ 'datareporting.policy.dataSubmissionEnabled': false,
334
+ 'datareporting.policy.dataSubmissionPolicyBypassNotification': true,
335
+
336
+ # DevTools JSONViewer sometimes fails to load dependencies with its require.js.
337
+ # This doesn't affect Puppeteer but spams console (Bug 1424372)
338
+ 'devtools.jsonview.enabled': false,
339
+
340
+ # Disable popup-blocker
341
+ 'dom.disable_open_during_load': false,
342
+
343
+ # Enable the support for File object creation in the content process
344
+ # Required for |Page.setFileInputFiles| protocol method.
345
+ 'dom.file.createInChild': true,
346
+
347
+ # Disable the ProcessHangMonitor
348
+ 'dom.ipc.reportProcessHangs': false,
349
+
350
+ # Disable slow script dialogues
351
+ 'dom.max_chrome_script_run_time': 0,
352
+ 'dom.max_script_run_time': 0,
353
+
354
+ # Only load extensions from the application and user profile
355
+ # AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION
356
+ 'extensions.autoDisableScopes': 0,
357
+ 'extensions.enabledScopes': 5,
358
+
359
+ # Disable metadata caching for installed add-ons by default
360
+ 'extensions.getAddons.cache.enabled': false,
361
+
362
+ # Disable installing any distribution extensions or add-ons.
363
+ 'extensions.installDistroAddons': false,
364
+
365
+ # Disabled screenshots extension
366
+ 'extensions.screenshots.disabled': true,
367
+
368
+ # Turn off extension updates so they do not bother tests
369
+ 'extensions.update.enabled': false,
370
+
371
+ # Turn off extension updates so they do not bother tests
372
+ 'extensions.update.notifyUser': false,
373
+
374
+ # Make sure opening about:addons will not hit the network
375
+ 'extensions.webservice.discoverURL': "http://#{server}/dummy/discoveryURL",
376
+
377
+ # Allow the application to have focus even it runs in the background
378
+ 'focusmanager.testmode': true,
379
+ # Disable useragent updates
380
+ 'general.useragent.updates.enabled': false,
381
+ # Always use network provider for geolocation tests so we bypass the
382
+ # macOS dialog raised by the corelocation provider
383
+ 'geo.provider.testing': true,
384
+ # Do not scan Wifi
385
+ 'geo.wifi.scan': false,
386
+ # No hang monitor
387
+ 'hangmonitor.timeout': 0,
388
+ # Show chrome errors and warnings in the error console
389
+ 'javascript.options.showInConsole': true,
390
+
391
+ # Disable download and usage of OpenH264: and Widevine plugins
392
+ 'media.gmp-manager.updateEnabled': false,
393
+ # Prevent various error message on the console
394
+ # jest-puppeteer asserts that no error message is emitted by the console
395
+ 'network.cookie.cookieBehavior': 0,
396
+
397
+ # Do not prompt for temporary redirects
398
+ 'network.http.prompt-temp-redirect': false,
399
+
400
+ # Disable speculative connections so they are not reported as leaking
401
+ # when they are hanging around
402
+ 'network.http.speculative-parallel-limit': 0,
403
+
404
+ # Do not automatically switch between offline and online
405
+ 'network.manage-offline-status': false,
406
+
407
+ # Make sure SNTP requests do not hit the network
408
+ 'network.sntp.pools': server,
409
+
410
+ # Disable Flash.
411
+ 'plugin.state.flash': 0,
412
+
413
+ 'privacy.trackingprotection.enabled': false,
414
+
415
+ # Enable Remote Agent
416
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1544393
417
+ 'remote.enabled': true,
418
+
419
+ # Don't do network connections for mitm priming
420
+ 'security.certerrors.mitm.priming.enabled': false,
421
+ # Local documents have access to all other local documents,
422
+ # including directory listings
423
+ 'security.fileuri.strict_origin_policy': false,
424
+ # Do not wait for the notification button security delay
425
+ 'security.notification_enable_delay': 0,
426
+
427
+ # Ensure blocklist updates do not hit the network
428
+ 'services.settings.server': "http://#{server}/dummy/blocklist/",
429
+
430
+ # Do not automatically fill sign-in forms with known usernames and
431
+ # passwords
432
+ 'signon.autofillForms': false,
433
+ # Disable password capture, so that tests that include forms are not
434
+ # influenced by the presence of the persistent doorhanger notification
435
+ 'signon.rememberSignons': false,
436
+
437
+ # Disable first-run welcome page
438
+ 'startup.homepage_welcome_url': 'about:blank',
404
439
 
405
- # Do not automatically fill sign-in forms with known usernames and
406
- # passwords
407
- 'signon.autofillForms': false,
408
- # Disable password capture, so that tests that include forms are not
409
- # influenced by the presence of the persistent doorhanger notification
410
- 'signon.rememberSignons': false,
411
-
412
- # Disable first-run welcome page
413
- 'startup.homepage_welcome_url': 'about:blank',
440
+ # Disable first-run welcome page
441
+ 'startup.homepage_welcome_url.additional': '',
414
442
 
415
- # Disable first-run welcome page
416
- 'startup.homepage_welcome_url.additional': '',
443
+ # Disable browser animations (tabs, fullscreen, sliding alerts)
444
+ 'toolkit.cosmeticAnimations.enabled': false,
417
445
 
418
- # Disable browser animations (tabs, fullscreen, sliding alerts)
419
- 'toolkit.cosmeticAnimations.enabled': false,
446
+ # Prevent starting into safe mode after application crashes
447
+ 'toolkit.startup.max_resumed_crashes': -1,
448
+ }
420
449
 
421
- # Prevent starting into safe mode after application crashes
422
- 'toolkit.startup.max_resumed_crashes': -1,
423
- }
450
+ default_preferences.merge(extra_prefs)
451
+ end
424
452
 
425
- preferences = default_preferences.merge(extra_prefs)
426
-
427
- File.open(File.join(profile_path, 'user.js'), 'w') do |f|
428
- preferences.each do |key, value|
429
- f.write("user_pref(#{JSON.generate(key)}, #{JSON.generate(value)});\n")
430
- end
453
+ private def write_preferences(prefs, profile_path)
454
+ File.open(File.join(profile_path, 'user.js'), 'w') do |f|
455
+ prefs.each do |key, value|
456
+ f.write("user_pref(#{JSON.generate(key)}, #{JSON.generate(value)});\n")
431
457
  end
432
- IO.write(File.join(profile_path, 'prefs.js'), "")
458
+ end
459
+ IO.write(File.join(profile_path, 'prefs.js'), "")
460
+ end
461
+
462
+ private def create_profile(extra_prefs)
463
+ Dir.mktmpdir('puppeteer_dev_firefox_profile-', ENV['PUPPETEER_TMP_DIR']).tap do |profile_path|
464
+ prefs = default_preferences(extra_prefs)
465
+ write_preferences(prefs, profile_path)
433
466
  end
434
467
  end
435
468
  end
@@ -42,9 +42,10 @@ module Puppeteer::Launcher
42
42
  @dumpio = options[:dumpio] || false
43
43
  @env = options[:env] || ENV
44
44
  @pipe = options[:pipe] || false
45
+ @extra_prefs_firefox = options[:extra_prefs_firefox] || {}
45
46
  end
46
47
 
47
- attr_reader :channel, :executable_path, :ignore_default_args, :timeout, :env
48
+ attr_reader :channel, :executable_path, :ignore_default_args, :timeout, :env, :extra_prefs_firefox
48
49
 
49
50
  def handle_SIGINT?
50
51
  @handle_SIGINT