puppeteer-ruby 0.38.0 → 0.40.2

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