1# Copyright 2017 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import("//build/buildflag_header.gni")
6import("//chrome/android/modules/buildflags.gni")
7import("//chrome/browser/vr/features.gni")
8import("//chrome/common/features.gni")
9import("//device/vr/buildflags/buildflags.gni")
10import("//testing/libfuzzer/fuzzer_test.gni")
11import("//testing/test.gni")
12import("//tools/grit/repack.gni")
13
14if (is_android) {
15  import("//build/config/android/rules.gni")
16}
17
18assert(enable_vr)
19
20buildflag_header("vr_buildflags") {
21  header = "vr_buildflags.h"
22  flags = [ "USE_VR_ASSETS_COMPONENT=$use_vr_assets_component" ]
23}
24
25use_command_buffer = is_win
26
27config("vr_gl_mode") {
28  if (use_command_buffer) {
29    defines = [
30      "VR_USE_COMMAND_BUFFER",
31      "GL_GLEXT_PROTOTYPES",
32    ]
33  } else {
34    defines = [ "VR_USE_NATIVE_GL" ]
35  }
36}
37
38component("vr_ui") {
39  sources = [
40    "animation.cc",
41    "animation.h",
42    "databinding/binding.h",
43    "databinding/binding_base.h",
44    "databinding/vector_binding.h",
45    "databinding/vector_element_binding.h",
46    "elements/button.cc",
47    "elements/button.h",
48    "elements/content_element.cc",
49    "elements/content_element.h",
50    "elements/controller.cc",
51    "elements/controller.h",
52    "elements/corner_radii.h",
53    "elements/disc_button.cc",
54    "elements/disc_button.h",
55    "elements/draw_phase.cc",
56    "elements/draw_phase.h",
57    "elements/environment/background.cc",
58    "elements/environment/background.h",
59    "elements/environment/grid.cc",
60    "elements/environment/grid.h",
61    "elements/environment/stars.cc",
62    "elements/environment/stars.h",
63    "elements/full_screen_rect.cc",
64    "elements/full_screen_rect.h",
65    "elements/indicator_spec.cc",
66    "elements/indicator_spec.h",
67    "elements/invisible_hit_target.cc",
68    "elements/invisible_hit_target.h",
69    "elements/keyboard.cc",
70    "elements/keyboard.h",
71    "elements/laser.cc",
72    "elements/laser.h",
73    "elements/linear_layout.cc",
74    "elements/linear_layout.h",
75    "elements/omnibox_formatting.cc",
76    "elements/omnibox_formatting.h",
77    "elements/omnibox_text_field.cc",
78    "elements/omnibox_text_field.h",
79    "elements/oval.cc",
80    "elements/oval.h",
81    "elements/platform_ui_element.cc",
82    "elements/platform_ui_element.h",
83    "elements/rect.cc",
84    "elements/rect.h",
85    "elements/render_text_wrapper.cc",
86    "elements/render_text_wrapper.h",
87    "elements/repositioner.cc",
88    "elements/repositioner.h",
89    "elements/resizer.cc",
90    "elements/resizer.h",
91    "elements/reticle.cc",
92    "elements/reticle.h",
93    "elements/scaled_depth_adjuster.cc",
94    "elements/scaled_depth_adjuster.h",
95    "elements/scrollable_element.cc",
96    "elements/scrollable_element.h",
97    "elements/shadow.cc",
98    "elements/shadow.h",
99    "elements/spinner.cc",
100    "elements/spinner.h",
101    "elements/text.cc",
102    "elements/text.h",
103    "elements/text_button.cc",
104    "elements/text_button.h",
105    "elements/text_input.cc",
106    "elements/text_input.h",
107    "elements/textured_element.cc",
108    "elements/textured_element.h",
109    "elements/throbber.cc",
110    "elements/throbber.h",
111    "elements/transient_element.cc",
112    "elements/transient_element.h",
113    "elements/ui_element.cc",
114    "elements/ui_element.h",
115    "elements/ui_element_name.cc",
116    "elements/ui_element_name.h",
117    "elements/ui_element_type.cc",
118    "elements/ui_element_type.h",
119    "elements/ui_texture.cc",
120    "elements/ui_texture.h",
121    "elements/url_text.cc",
122    "elements/url_text.h",
123    "elements/vector_icon.cc",
124    "elements/vector_icon.h",
125    "elements/vector_icon_button.cc",
126    "elements/vector_icon_button.h",
127    "elements/viewport_aware_root.cc",
128    "elements/viewport_aware_root.h",
129    "frame_lifecycle.cc",
130    "frame_lifecycle.h",
131    "model/color_scheme.cc",
132    "model/color_scheme.h",
133    "model/modal_prompt_type.cc",
134    "model/modal_prompt_type.h",
135    "model/model.cc",
136    "model/model.h",
137    "model/platform_toast.cc",
138    "model/platform_toast.h",
139    "renderers/base_quad_renderer.cc",
140    "renderers/base_quad_renderer.h",
141    "renderers/base_renderer.cc",
142    "renderers/base_renderer.h",
143    "renderers/external_textured_quad_renderer.cc",
144    "renderers/external_textured_quad_renderer.h",
145    "renderers/radial_gradient_quad_renderer.cc",
146    "renderers/radial_gradient_quad_renderer.h",
147    "renderers/texture_copy_renderer.cc",
148    "renderers/texture_copy_renderer.h",
149    "renderers/textured_quad_renderer.cc",
150    "renderers/textured_quad_renderer.h",
151    "renderers/transparent_quad_renderer.cc",
152    "renderers/transparent_quad_renderer.h",
153    "sequence.cc",
154    "sequence.h",
155    "skia_surface_provider.h",
156    "skia_surface_provider_factory.h",
157    "target_property.cc",
158    "target_property.h",
159    "transition.cc",
160    "transition.h",
161    "ui.cc",
162    "ui.h",
163    "ui_element_renderer.cc",
164    "ui_element_renderer.h",
165    "ui_input_manager.cc",
166    "ui_input_manager.h",
167    "ui_renderer.cc",
168    "ui_renderer.h",
169    "ui_scene.cc",
170    "ui_scene.h",
171    "ui_scene_creator.cc",
172    "ui_scene_creator.h",
173    "vr_ui_export.h",
174  ]
175
176  sources += [
177    "ui_input_manager_for_testing.cc",
178    "ui_input_manager_for_testing.h",
179  ]
180
181  deps = [
182    ":vr_base",
183    "//base",
184    "//cc/animation",
185    "//chrome/app:generated_resources",
186    "//chrome/app/vector_icons",
187    "//chrome/browser/vr/vector_icons",
188    "//chrome/common:constants",
189    "//components/omnibox/browser:vector_icons",
190    "//components/url_formatter",
191    "//components/vector_icons",
192    "//device/base",
193    "//device/vr/buildflags:buildflags",
194    "//media",
195    "//net",
196    "//skia",
197  ]
198
199  if (use_native_partitions) {
200    # Mark symbols in this library as belonging to the VR partition. Only
201    # exported symbols (module entrypoints) are affected.
202    cflags = [ "-fsymbol-partition=vr_partition" ]
203  }
204
205  if (is_android) {
206    sources += [ "jni_onload.cc" ]
207  }
208
209  defines = [ "VR_UI_IMPLEMENTATION" ]
210
211  if (use_command_buffer) {
212    sources += [
213      "cmd_buffer_surface_provider.cc",
214      "cmd_buffer_surface_provider.h",
215      "skia_surface_provider_factory_cmd_buffer.cc",
216    ]
217    deps += [
218      "//gpu/command_buffer/client:gles2_implementation",
219      "//gpu/skia_bindings",
220    ]
221  } else {
222    sources += [
223      "native_gl_surface_provider.cc",
224      "native_gl_surface_provider.h",
225      "skia_surface_provider_factory_native_gl.cc",
226    ]
227    deps += [ "//ui/gl/init" ]
228  }
229}
230
231component("vr_common") {
232  sources = [
233    "base_scheduler_delegate.cc",
234    "base_scheduler_delegate.h",
235    "browser_renderer.cc",
236    "browser_renderer.h",
237    "browser_renderer_browser_interface.h",
238    "consent/xr_session_request_consent_manager.cc",
239    "consent/xr_session_request_consent_manager.h",
240    "frame_type.h",
241    "gesture_detector.cc",
242    "gesture_detector.h",
243    "graphics_delegate.h",
244    "input_delegate.h",
245    "location_bar_helper.cc",
246    "location_bar_helper.h",
247    "platform_controller.h",
248    "scheduler_browser_renderer_interface.h",
249    "scheduler_delegate.h",
250    "service/xr_device_service.cc",
251    "service/xr_device_service.h",
252    "sounds_manager_audio_delegate.cc",
253    "sounds_manager_audio_delegate.h",
254    "vr_export.h",
255    "vr_web_contents_observer.cc",
256    "vr_web_contents_observer.h",
257    "xr_test_utils.h",
258  ]
259
260  sources += [
261    "input_delegate_for_testing.cc",
262    "input_delegate_for_testing.h",
263    "platform_controller_for_testing.cc",
264    "platform_controller_for_testing.h",
265  ]
266
267  public_deps = [
268    ":vr_base",
269    "//device/vr/public/mojom",
270  ]
271
272  deps = [
273    "//base",
274    "//cc/animation",
275    "//cc/paint",
276    "//chrome/common:constants",
277    "//components/omnibox/browser",
278    "//components/omnibox/browser",
279    "//components/rappor/public:public",
280    "//components/ukm/content",
281    "//content/public/browser",
282    "//device/base",
283    "//device/vr",
284    "//device/vr/buildflags:buildflags",
285    "//device/vr/public/mojom",
286    "//media",
287    "//net",
288    "//services/audio/public/cpp",
289    "//services/metrics/public/cpp:ukm_builders",
290    "//skia",
291    "//ui/base",
292    "//ui/display",
293  ]
294
295  if (is_win) {
296    sources += [
297      "win/graphics_delegate_win.cc",
298      "win/graphics_delegate_win.h",
299      "win/input_delegate_win.cc",
300      "win/input_delegate_win.h",
301      "win/scheduler_delegate_win.cc",
302      "win/scheduler_delegate_win.h",
303      "win/vr_browser_renderer_thread_win.cc",
304      "win/vr_browser_renderer_thread_win.h",
305    ]
306
307    deps += [ "//services/viz/public/cpp/gpu" ]
308
309    # Windows doesn't have app bundles, so include the UI directly.
310    deps += [ ":vr_ui" ]
311  }
312
313  defines = [ "VR_IMPLEMENTATION" ]
314
315  if (!use_command_buffer) {
316    sources += [
317      "base_graphics_delegate.cc",
318      "base_graphics_delegate.h",
319    ]
320    deps += [ "//ui/gl/init" ]
321  }
322}
323
324# vr_base contains common dependencies of vr_common and vr_ui. It exists because
325# vr_ui must not depend on vr_common.
326component("vr_base") {
327  sources = [
328    "assets_component_update_status.h",
329    "assets_load_status.h",
330    "assets_loader.cc",
331    "assets_loader.h",
332    "audio_delegate.h",
333    "browser_ui_interface.h",
334    "content_input_delegate.cc",
335    "content_input_delegate.h",
336    "exit_vr_prompt_choice.h",
337    "fov_rectangle.h",
338    "gl_bindings.h",
339    "gl_texture_location.h",
340    "input_event.cc",
341    "input_event.h",
342    "keyboard_delegate.h",
343    "keyboard_ui_interface.h",
344    "macros.h",
345    "metrics/consent_flow_metrics_helper.cc",
346    "metrics/consent_flow_metrics_helper.h",
347    "metrics/metrics_helper.cc",
348    "metrics/metrics_helper.h",
349    "metrics/session_metrics_helper.cc",
350    "metrics/session_metrics_helper.h",
351    "metrics/session_timer.cc",
352    "metrics/session_timer.h",
353    "metrics/session_tracker.h",
354    "metrics/webxr_session_tracker.cc",
355    "metrics/webxr_session_tracker.h",
356    "mode.h",
357    "model/assets.cc",
358    "model/assets.h",
359    "model/camera_model.h",
360    "model/capturing_state_model.h",
361    "model/controller_model.cc",
362    "model/controller_model.h",
363    "model/hosted_platform_ui.h",
364    "model/location_bar_state.cc",
365    "model/location_bar_state.h",
366    "model/omnibox_suggestions.cc",
367    "model/omnibox_suggestions.h",
368    "model/reticle_model.h",
369    "model/speech_recognition_model.h",
370    "model/text_input_info.cc",
371    "model/text_input_info.h",
372    "model/ui_mode.h",
373    "model/web_vr_model.h",
374    "platform_input_handler.h",
375    "platform_ui_input_delegate.cc",
376    "platform_ui_input_delegate.h",
377    "pose_util.cc",
378    "pose_util.h",
379    "render_info.h",
380    "scheduler_ui_interface.h",
381    "speech_recognizer.cc",
382    "speech_recognizer.h",
383    "text_edit_action.cc",
384    "text_edit_action.h",
385    "text_input_delegate.cc",
386    "text_input_delegate.h",
387    "ui_browser_interface.h",
388    "ui_initial_state.cc",
389    "ui_initial_state.h",
390    "ui_interface.h",
391    "ui_support.cc",
392    "ui_support.h",
393    "ui_test_input.h",
394    "ui_unsupported_mode.h",
395    "vr_base_export.h",
396    "vr_geometry_util.cc",
397    "vr_geometry_util.h",
398    "vr_gl_util.cc",
399    "vr_gl_util.h",
400  ]
401
402  sources += [
403    "keyboard_delegate_for_testing.cc",
404    "keyboard_delegate_for_testing.h",
405  ]
406
407  defines = [ "VR_BASE_IMPLEMENTATION" ]
408
409  public_deps = [
410    ":vr_buildflags",
411    ":vr_gl_bindings",
412    "//components/omnibox/browser",
413    "//components/strings:components_strings_grit",
414    "//content/public/common",
415    "//ui/base",
416  ]
417
418  deps = [
419    "//base",
420    "//chrome/app:generated_resources",
421    "//components/rappor:rappor",
422    "//components/security_state/core",
423    "//components/ukm/content",
424    "//components/url_formatter",
425    "//content/public/browser",
426    "//device/vr/public/mojom:mojom",
427    "//media",
428    "//net",
429    "//services/metrics/public/cpp:ukm_builders",
430    "//skia",
431  ]
432
433  if (is_android) {
434    deps += [ "//chrome/android/features/vr:jni_headers" ]
435  }
436}
437
438source_set("vr_gl_bindings") {
439  sources = [ "gl_bindings.h" ]
440  public_configs = [ ":vr_gl_mode" ]
441  if (use_command_buffer) {
442    public_deps = [ "//gpu/command_buffer/client:gles2_c_lib" ]
443  } else {
444    public_deps = [ "//ui/gl" ]
445  }
446}
447
448test("vr_common_unittests") {
449  sources = [
450    "animation_unittest.cc",
451    "base_scheduler_delegate_unittest.cc",
452    "browser_renderer_unittest.cc",
453    "databinding/binding_unittest.cc",
454    "databinding/vector_binding_unittest.cc",
455    "elements/button_unittest.cc",
456    "elements/content_element_unittest.cc",
457    "elements/disc_button_unittest.cc",
458    "elements/linear_layout_unittest.cc",
459    "elements/omnibox_formatting_unittest.cc",
460    "elements/omnibox_text_field_unittest.cc",
461    "elements/oval_unittest.cc",
462    "elements/rect_unittest.cc",
463    "elements/repositioner_unittest.cc",
464    "elements/resizer_unittest.cc",
465    "elements/scaled_depth_adjuster_unittest.cc",
466    "elements/scrollable_element_unittest.cc",
467    "elements/shadow_unittest.cc",
468    "elements/spinner_unittest.cc",
469    "elements/text_input_unittest.cc",
470    "elements/text_unittest.cc",
471    "elements/throbber_unittest.cc",
472    "elements/transient_element_unittest.cc",
473    "elements/ui_element_unittest.cc",
474    "elements/vector_icon_button_unittest.cc",
475    "elements/vector_icon_unittest.cc",
476    "elements/viewport_aware_root_unittest.cc",
477    "gesture_detector_unittest.cc",
478    "model/text_input_info_unittest.cc",
479    "platform_ui_input_delegate_unittest.cc",
480    "service/xr_runtime_manager_unittest.cc",
481    "speech_recognizer_unittest.cc",
482    "test/paths.cc",
483    "test/paths.h",
484    "test/run_all_unittests.cc",
485    "test/ui_test.cc",
486    "test/ui_test.h",
487    "ui_input_manager_unittest.cc",
488    "ui_scene_unittest.cc",
489    "ui_unittest.cc",
490    "vr_geometry_util_unittest.cc",
491  ]
492
493  deps = [
494    ":vr_test_support",
495    "//chrome/browser",
496    "//chrome/test:test_support",
497    "//components/url_formatter",
498    "//components/vector_icons",
499    "//content/test:test_support",
500    "//mojo/public/cpp/bindings",
501    "//services/network:test_support",
502    "//testing/gmock",
503    "//ui/gfx/geometry",
504  ]
505  if (is_android) {
506    deps += [
507      "//chrome:chrome_android_core",
508      "//ui/android:ui_java",
509    ]
510  }
511  if (is_win) {
512    configs += [ "//build/config/win:delayloads" ]
513  }
514}
515
516test("vr_pixeltests") {
517  testonly = true
518
519  sources = [
520    "test/run_all_pixeltests.cc",
521    "test/ui_pixel_test.cc",
522    "test/ui_pixel_test.h",
523    "ui_pixeltest.cc",
524  ]
525
526  deps = [
527    ":vr_gl_test_support",
528    ":vr_test_support",
529  ]
530  if (is_android) {
531    deps += [ "//ui/android:ui_java" ]
532  }
533}
534
535test("vr_common_perftests") {
536  sources = [
537    "test/run_all_perftests.cc",
538    "text_perftest.cc",
539  ]
540  deps = [
541    ":vr_gl_test_support",
542    ":vr_test_support",
543    "//testing/perf",
544  ]
545  if (is_android) {
546    deps += [ "//ui/android:ui_java" ]
547  }
548
549  # Needed for isolate script to execute
550  data_deps = [ "//testing:run_perf_test" ]
551}
552
553source_set("vr_test_support") {
554  testonly = true
555
556  sources = [
557    "test/animation_utils.cc",
558    "test/animation_utils.h",
559    "test/constants.cc",
560    "test/constants.h",
561    "test/mock_browser_ui_interface.cc",
562    "test/mock_browser_ui_interface.h",
563    "test/mock_content_input_delegate.cc",
564    "test/mock_content_input_delegate.h",
565    "test/mock_keyboard_delegate.cc",
566    "test/mock_keyboard_delegate.h",
567    "test/mock_render_text.cc",
568    "test/mock_render_text.h",
569    "test/mock_text_input_delegate.cc",
570    "test/mock_text_input_delegate.h",
571    "test/mock_ui_browser_interface.cc",
572    "test/mock_ui_browser_interface.h",
573    "test/vr_test_suite.cc",
574    "test/vr_test_suite.h",
575  ]
576
577  public_deps = [
578    ":vr_common",
579    ":vr_ui",
580    "//base/test:test_support",
581    "//cc:test_support",
582    "//components/omnibox/browser",
583    "//components/omnibox/browser:vector_icons",
584    "//components/security_state/core",
585    "//content/test:test_support",
586    "//mojo/core/embedder",
587    "//skia",
588    "//testing/gtest",
589    "//ui/accessibility:ax_enums_mojo",
590    "//ui/gfx:test_support",
591
592    # TODO(mthiesse, crbug.com/769373): Remove dependency on device/vr:fakes.
593    "//device/vr:vr_fakes",
594
595    # TODO(cjgrant): Figure out why including //ui/android:ui_java here
596    # doesn't propagate to individual test executable targets.
597  ]
598
599  data_deps = [ ":vr_test_pak" ]
600}
601
602source_set("vr_gl_test_support") {
603  testonly = true
604
605  sources = [
606    "test/gl_test_environment.h",
607    "test/gl_test_environment_unittest.cc",
608    "test/vr_gl_test_suite.cc",
609    "test/vr_gl_test_suite.h",
610  ]
611
612  public_deps = [
613    ":vr_gl_bindings",
614    "//base/test:test_support",
615    "//skia",
616    "//testing/gtest",
617  ]
618
619  deps = [
620    ":vr_test_support",
621    "//ui/gl:test_support",
622  ]
623
624  if (use_command_buffer) {
625    sources += [ "test/gl_test_environment_cmd_buffer.cc" ]
626    deps += [
627      "//gpu:gpu",
628      "//gpu/command_buffer/client:gles2_implementation",
629      "//gpu/ipc:gl_in_process_context",
630    ]
631  } else {
632    sources += [ "test/gl_test_environment_native_gl.cc" ]
633  }
634}
635
636repack("vr_test_pak") {
637  sources = [
638    "$root_gen_dir/chrome/generated_resources_en-US.pak",
639    "$root_gen_dir/components/components_resources.pak",
640    "$root_gen_dir/components/strings/components_strings_en-US.pak",
641  ]
642
643  output = "$root_out_dir/vr_test.pak"
644
645  deps = [
646    "//chrome/app:generated_resources",
647    "//components/resources:components_resources",
648    "//components/strings",
649  ]
650}
651
652if (!is_android) {
653  # This should only contain that files that are useful if enable_vr = true. For
654  # tests/infrastructure that can be used with enable_vr = false, see
655  # //chrome/test:xr_browser_tests_common.
656  source_set("xr_browser_tests_vr_required") {
657    testonly = true
658    defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
659
660    # Infrastructure
661    sources = [
662      "test/fake_xr_session_request_consent_manager.cc",
663      "test/fake_xr_session_request_consent_manager.h",
664      "test/mock_xr_device_hook_base.cc",
665      "test/mock_xr_device_hook_base.h",
666      "test/mock_xr_session_request_consent_manager.cc",
667      "test/mock_xr_session_request_consent_manager.h",
668      "test/multi_class_browser_test.h",
669    ]
670
671    deps = [
672      ":vr_common",
673      "//chrome/common:constants",
674      "//chrome/test:xr_browser_tests_common",
675      "//device/vr:vr",
676      "//device/vr/buildflags:buildflags",
677      "//device/vr/public/mojom",
678      "//device/vr/public/mojom:test_mojom",
679    ]
680
681    data_deps = []
682
683    # Windows-only tests and dependencies.
684    if (is_win) {
685      # Infrastructure.
686      sources += [
687        "test/browser_test_browser_renderer_browser_interface.cc",
688        "test/browser_test_browser_renderer_browser_interface.h",
689        "test/ui_utils.cc",
690        "test/ui_utils.h",
691      ]
692
693      # Tests.
694      sources += [
695        "webxr_vr_consent_dialog_browser_test.cc",
696        "webxr_vr_frame_loop_browser_test.cc",
697        "webxr_vr_frame_pose_browser_test.cc",
698        "webxr_vr_indicators_browser_test.cc",
699        "webxr_vr_input_browser_test.cc",
700        "webxr_vr_isolated_device_service_test.cc",
701        "webxr_vr_permission_request_browser_test.cc",
702        "webxr_vr_pixel_browser_test.cc",
703        "webxr_vr_tab_browser_test.cc",
704      ]
705
706      deps += [
707        ":vr_common",
708        "//components/content_settings/core/browser",
709        "//device/vr:directx_helpers",
710        "//third_party/openvr",
711      ]
712
713      data_deps += [ "//device/vr:openvr_mock" ]
714
715      if (enable_openxr) {
716        deps += [ "//third_party/openxr" ]
717        data_deps += [ "//device/vr:openxr_mock" ]
718      }
719    }
720  }
721}
722
723fuzzer_test("vr_omnibox_formatting_fuzzer") {
724  sources = [ "elements/omnibox_formatting_fuzzer.cc" ]
725  deps = [
726    ":vr_common",
727    ":vr_ui",
728    "//ui/gfx:test_support",
729  ]
730}
731