Best JavaScript code snippet using wpt
chromecast.gyp
Source:chromecast.gyp
1# Copyright 2014 The Chromium Authors. All rights reserved.2# Use of this source code is governed by a BSD-style license that can be3# found in the LICENSE file.4{5 'variables': {6 'android_support_v13_target%':7 '../third_party/android_tools/android_tools.gyp:android_support_v13_javalib',8 'cast_build_release': 'internal/build/cast_build_release',9 'cast_is_debug_build%': 0,10 # Refers to enum CastProductType in components/metrics/proto/cast_logs.proto11 'cast_product_type%': 0, # CAST_PRODUCT_TYPE_UNKNOWN12 'chromium_code': 1,13 'chromecast_branding%': 'Chromium',14 'disable_display%': 0,15 'enable_default_cast_graphics%': 1,16 'ozone_platform_cast%': 0,17 'use_chromecast_webui%': 0,18 },19 'includes': [20 'chromecast_tests.gypi',21 ],22 'target_defaults': {23 'include_dirs': [24 '..', # Root of Chromium checkout25 ],26 'conditions': [27 ['disable_display==1', {28 'defines': ['DISABLE_DISPLAY'],29 }],30 ],31 },32 'targets': [33 # Public API target for OEM partners to replace shlibs.34 {35 'target_name': 'cast_public_api',36 'type': '<(component)',37 'sources': [38 'public/cast_egl_platform.h',39 'public/cast_egl_platform_shlib.h',40 'public/cast_media_shlib.h',41 'public/cast_sys_info.h',42 'public/chromecast_export.h',43 'public/graphics_properties_shlib.h',44 'public/graphics_types.h',45 'public/media/decoder_config.h',46 'public/media/stream_id.h',47 'public/osd_plane.h',48 'public/osd_plane_shlib.h',49 'public/osd_surface.h',50 'public/video_plane.h',51 ],52 },53 {54 'target_name': 'cast_base',55 'type': '<(component)',56 'dependencies': [57 '../base/base.gyp:base',58 ],59 'sources': [60 'base/cast_paths.cc',61 'base/cast_paths.h',62 'base/chromecast_switches.cc',63 'base/chromecast_switches.h',64 'base/error_codes.cc',65 'base/error_codes.h',66 'base/metrics/cast_histograms.h',67 'base/metrics/cast_metrics_helper.cc',68 'base/metrics/cast_metrics_helper.h',69 'base/metrics/grouped_histogram.cc',70 'base/metrics/grouped_histogram.h',71 'base/path_utils.cc',72 'base/path_utils.h',73 'base/process_utils.cc',74 'base/process_utils.h',75 'base/serializers.cc',76 'base/serializers.h'77 ],78 }, # end of target 'cast_base'79 {80 'target_name': 'cast_crash',81 'type': '<(component)',82 'include_dirs': [83 # TODO(gfhuang): we should not need to include this directly, but84 # somehow depending on component.gyp:breakpad_component is not85 # working as expected.86 '../breakpad/src',87 ],88 'dependencies': [89 'cast_base',90 'cast_version_header',91 '../breakpad/breakpad.gyp:breakpad_client',92 ],93 'sources': [94 'crash/app_state_tracker.cc',95 'crash/app_state_tracker.h',96 'crash/cast_crash_keys.cc',97 'crash/cast_crash_keys.h',98 'crash/cast_crashdump_uploader.cc',99 'crash/cast_crashdump_uploader.h',100 'crash/linux/crash_util.cc',101 'crash/linux/crash_util.h',102 'crash/linux/dummy_minidump_generator.cc',103 'crash/linux/dummy_minidump_generator.h',104 'crash/linux/dump_info.cc',105 'crash/linux/dump_info.h',106 'crash/linux/minidump_generator.h',107 'crash/linux/synchronized_minidump_manager.cc',108 'crash/linux/synchronized_minidump_manager.h',109 'crash/linux/minidump_params.cc',110 'crash/linux/minidump_params.h',111 'crash/linux/minidump_writer.cc',112 'crash/linux/minidump_writer.h',113 ],114 }, # end of target 'cast_crash'115 {116 'target_name': 'cast_crash_client',117 'type': '<(component)',118 'dependencies': [119 'cast_crash',120 '../components/components.gyp:crash_component',121 '../content/content.gyp:content_common',122 ],123 'sources' : [124 # TODO(slan): Move android crash_client here as well.125 'app/linux/cast_crash_reporter_client.cc',126 'app/linux/cast_crash_reporter_client.h',127 ],128 }, # end of target 'cast_crash_client'129 {130 'target_name': 'cast_net',131 'type': '<(component)',132 'sources': [133 'net/connectivity_checker.cc',134 'net/connectivity_checker.h',135 'net/connectivity_checker_impl.cc',136 'net/connectivity_checker_impl.h',137 'net/fake_connectivity_checker.cc',138 'net/fake_connectivity_checker.h',139 'net/net_switches.cc',140 'net/net_switches.h',141 'net/net_util_cast.cc',142 'net/net_util_cast.h',143 ],144 'conditions': [145 ['OS!="android"', {146 'sources': [147 'net/network_change_notifier_factory_cast.cc',148 'net/network_change_notifier_factory_cast.h',149 ],150 }],151 ],152 },153 {154 'target_name': 'cast_shell_resources',155 'type': 'none',156 'variables': {157 'grit_out_dir': '<(SHARED_INTERMEDIATE_DIR)/chromecast',158 },159 'actions': [160 {161 'action_name': 'cast_shell_resources',162 'variables': {163 'grit_grd_file': 'app/resources/shell_resources.grd',164 'grit_resource_ids': 'app/resources/resource_ids',165 },166 'includes': [ '../build/grit_action.gypi' ],167 },168 ],169 'includes': [ '../build/grit_target.gypi' ],170 },171 {172 'target_name': 'cast_shell_pak',173 'type': 'none',174 'dependencies': [175 'cast_shell_resources',176 '../content/app/resources/content_resources.gyp:content_resources',177 '../content/app/strings/content_strings.gyp:content_strings',178 '../net/net.gyp:net_resources',179 '../third_party/WebKit/public/blink_resources.gyp:blink_resources',180 '../ui/resources/ui_resources.gyp:ui_resources',181 '../ui/strings/ui_strings.gyp:ui_strings',182 ],183 'actions': [184 {185 'action_name': 'repack_cast_shell_pak',186 'variables': {187 'pak_inputs': [188 '<(SHARED_INTERMEDIATE_DIR)/blink/public/resources/blink_resources.pak',189 '<(SHARED_INTERMEDIATE_DIR)/blink/public/resources/blink_image_resources_100_percent.pak',190 '<(SHARED_INTERMEDIATE_DIR)/chromecast/shell_resources.pak',191 '<(SHARED_INTERMEDIATE_DIR)/content/content_resources.pak',192 '<(SHARED_INTERMEDIATE_DIR)/content/app/resources/content_resources_100_percent.pak',193 '<(SHARED_INTERMEDIATE_DIR)/content/app/strings/content_strings_en-US.pak',194 '<(SHARED_INTERMEDIATE_DIR)/net/net_resources.pak',195 '<(SHARED_INTERMEDIATE_DIR)/ui/resources/ui_resources_100_percent.pak',196 '<(SHARED_INTERMEDIATE_DIR)/ui/resources/webui_resources.pak',197 '<(SHARED_INTERMEDIATE_DIR)/ui/strings/app_locale_settings_en-US.pak',198 '<(SHARED_INTERMEDIATE_DIR)/ui/strings/ui_strings_en-US.pak',199 ],200 'conditions': [201 ['chromecast_branding=="Chrome" and use_chromecast_webui==1', {202 'pak_inputs': [203 '<(SHARED_INTERMEDIATE_DIR)/chromecast/app_resources.pak',204 '<(SHARED_INTERMEDIATE_DIR)/chromecast/cast_webui_resources.pak',205 ],206 }],207 ],208 'pak_output': '<(PRODUCT_DIR)/assets/cast_shell.pak',209 },210 'includes': [ '../build/repack_action.gypi' ],211 },212 ],213 'conditions': [214 ['chromecast_branding=="Chrome" and use_chromecast_webui==1', {215 'dependencies': [216 'internal/chromecast_resources.gyp:chromecast_app_resources',217 'internal/chromecast_resources.gyp:chromecast_webui_resources',218 ],219 }],220 ],221 }, # end of target 'cast_shell_pak'222 # This target contains all content-embedder implementation that is223 # non-platform-specific.224 {225 'target_name': 'cast_shell_common',226 'type': '<(component)',227 'dependencies': [228 'cast_base',229 'cast_crash_client',230 'cast_net',231 'cast_shell_pak',232 'cast_shell_resources',233 'cast_sys_info',234 'cast_version_header',235 'chromecast_locales.gyp:chromecast_locales_pak',236 'chromecast_locales.gyp:chromecast_settings',237 'media/media.gyp:media_base',238 'media/media.gyp:media_cdm',239 '../base/base.gyp:base',240 '../components/components.gyp:breakpad_host',241 '../components/components.gyp:cdm_renderer',242 '../components/components.gyp:component_metrics_proto',243 '../components/components.gyp:crash_component',244 '../components/components.gyp:devtools_discovery',245 '../components/components.gyp:devtools_http_handler',246 '../components/components.gyp:network_hints_browser',247 '../components/components.gyp:network_hints_renderer',248 '../components/components.gyp:metrics',249 '../components/components.gyp:metrics_gpu',250 '../components/components.gyp:metrics_net',251 '../components/components.gyp:metrics_profiler',252 '../content/content.gyp:content',253 '../content/content.gyp:content_app_both',254 '../skia/skia.gyp:skia',255 '../third_party/WebKit/public/blink.gyp:blink',256 '../third_party/widevine/cdm/widevine_cdm.gyp:widevine_cdm_version_h',257 ],258 'sources': [259 'app/cast_main_delegate.cc',260 'app/cast_main_delegate.h',261 'browser/cast_browser_context.cc',262 'browser/cast_browser_context.h',263 'browser/cast_browser_main_parts.cc',264 'browser/cast_browser_main_parts.h',265 'browser/cast_browser_process.cc',266 'browser/cast_browser_process.h',267 'browser/cast_content_browser_client.cc',268 'browser/cast_content_browser_client.h',269 'browser/cast_content_window.cc',270 'browser/cast_content_window.h',271 'browser/cast_download_manager_delegate.cc',272 'browser/cast_download_manager_delegate.h',273 'browser/cast_http_user_agent_settings.cc',274 'browser/cast_http_user_agent_settings.h',275 'browser/cast_net_log.cc',276 'browser/cast_net_log.h',277 'browser/cast_network_delegate.cc',278 'browser/cast_network_delegate.h',279 'browser/cast_permission_manager.cc',280 'browser/cast_permission_manager.h',281 'browser/cast_quota_permission_context.cc',282 'browser/cast_quota_permission_context.h',283 'browser/cast_resource_dispatcher_host_delegate.cc',284 'browser/cast_resource_dispatcher_host_delegate.h',285 'browser/devtools/cast_dev_tools_delegate.cc',286 'browser/devtools/cast_dev_tools_delegate.h',287 'browser/devtools/remote_debugging_server.cc',288 'browser/devtools/remote_debugging_server.h',289 'browser/geolocation/cast_access_token_store.cc',290 'browser/geolocation/cast_access_token_store.h',291 'browser/media/cast_media_client_android.cc',292 'browser/media/cast_media_client_android.h',293 'browser/metrics/cast_metrics_prefs.cc',294 'browser/metrics/cast_metrics_prefs.h',295 'browser/metrics/cast_metrics_service_client.cc',296 'browser/metrics/cast_metrics_service_client.h',297 'browser/metrics/cast_stability_metrics_provider.cc',298 'browser/metrics/cast_stability_metrics_provider.h',299 'browser/metrics/platform_metrics_providers.h',300 'browser/pref_service_helper.cc',301 'browser/pref_service_helper.h',302 'browser/service/cast_service.cc',303 'browser/service/cast_service.h',304 'browser/url_request_context_factory.cc',305 'browser/url_request_context_factory.h',306 'common/cast_content_client.cc',307 'common/cast_content_client.h',308 'common/cast_resource_delegate.cc',309 'common/cast_resource_delegate.h',310 'common/media/cast_messages.h',311 'common/media/cast_message_generator.cc',312 'common/media/cast_message_generator.h',313 'common/platform_client_auth.h',314 'common/pref_names.cc',315 'common/pref_names.h',316 'renderer/cast_content_renderer_client.cc',317 'renderer/cast_content_renderer_client.h',318 'renderer/cast_media_load_deferrer.cc',319 'renderer/cast_media_load_deferrer.h',320 'renderer/cast_render_process_observer.cc',321 'renderer/cast_render_process_observer.h',322 'renderer/key_systems_cast.cc',323 'renderer/key_systems_cast.h',324 'renderer/media/capabilities_message_filter.cc',325 'renderer/media/capabilities_message_filter.h',326 ],327 'conditions': [328 ['chromecast_branding=="Chrome"', {329 'dependencies': [330 'internal/chromecast_internal.gyp:cast_shell_internal',331 ],332 }, {333 'sources': [334 'browser/cast_content_browser_client_simple.cc',335 'browser/cast_network_delegate_simple.cc',336 'browser/devtools/remote_debugging_server_simple.cc',337 'browser/metrics/platform_metrics_providers_simple.cc',338 'browser/pref_service_helper_simple.cc',339 'common/platform_client_auth_simple.cc',340 'renderer/cast_content_renderer_client_simple.cc',341 ],342 'conditions': [343 ['OS=="android"', {344 'sources': [345 'browser/service/cast_service_android.cc',346 'browser/service/cast_service_android.h',347 ],348 }, {349 'sources': [350 'browser/media/cast_browser_cdm_factory_simple.cc',351 'browser/service/cast_service_simple.cc',352 'browser/service/cast_service_simple.h',353 ],354 }],355 ],356 }],357 # ExternalMetrics not necessary on Android and (as of this writing) uses358 # non-portable filesystem operations. Also webcrypto is not used on359 # Android either.360 ['OS=="linux"', {361 'sources': [362 'browser/metrics/external_metrics.cc',363 'browser/metrics/external_metrics.h',364 'graphics/cast_screen.cc',365 'graphics/cast_screen.h',366 ],367 'dependencies': [368 '../components/components.gyp:metrics_serialization',369 '../ui/aura/aura.gyp:aura_test_support',370 ],371 }],372 ['OS=="android"', {373 'dependencies': [374 '../components/components.gyp:cdm_browser',375 ],376 }],377 ],378 },379 {380 'target_name': 'cast_sys_info',381 'type': '<(component)',382 'dependencies': [383 'cast_public_api',384 '../base/base.gyp:base',385 ],386 'sources': [387 'base/cast_sys_info_util.h',388 'base/cast_sys_info_dummy.cc',389 'base/cast_sys_info_dummy.h',390 ],391 'conditions': [392 ['chromecast_branding!="Chrome" and OS!="android"', {393 'sources': [394 'base/cast_sys_info_util_simple.cc',395 ],396 }],397 ],398 }, # end of target 'cast_sys_info'399 {400 'target_name': 'cast_version_header',401 'type': 'none',402 'direct_dependent_settings': {403 'include_dirs': [404 '<(SHARED_INTERMEDIATE_DIR)',405 ],406 },407 'actions': [408 {409 'action_name': 'version_header',410 'message': 'Generating version header file: <@(_outputs)',411 'inputs': [412 '<(version_path)',413 'base/version.h.in',414 ],415 'outputs': [416 '<(SHARED_INTERMEDIATE_DIR)/chromecast/base/version.h',417 ],418 'action': [419 'python',420 '<(version_py_path)',421 '-e', 'VERSION_FULL="<(version_full)"',422 # CAST_BUILD_INCREMENTAL is taken from buildbot if available;423 # otherwise, a dev string is used.424 '-e', 'CAST_BUILD_INCREMENTAL="<!(echo ${CAST_BUILD_INCREMENTAL:="<!(date +%Y%m%d.%H%M%S)"})"',425 # CAST_BUILD_RELEASE is taken from cast_build_release file if exist;426 # otherwise, a dev string is used.427 '-e', 'CAST_BUILD_RELEASE="<!(if test -f <(cast_build_release); then cat <(cast_build_release); else echo eng.${USER}; fi)"',428 '-e', 'CAST_IS_DEBUG_BUILD=1 if "<(CONFIGURATION_NAME)" == "Debug" or <(cast_is_debug_build) == 1 else 0',429 '-e', 'CAST_PRODUCT_TYPE=<(cast_product_type)',430 'base/version.h.in',431 '<@(_outputs)',432 ],433 'includes': [434 '../build/util/version.gypi',435 ],436 },437 ],438 },439 ], # end of targets440 # Targets for Android receiver.441 'conditions': [442 ['OS=="android"', {443 'targets': [444 {445 'target_name': 'cast_shell_icudata',446 'type': 'none',447 'dependencies': [448 '../third_party/icu/icu.gyp:icudata',449 '../v8/tools/gyp/v8.gyp:v8_external_snapshot',450 ],451 'copies': [{452 'destination': '<(PRODUCT_DIR)/assets',453 'files': [454 '<(PRODUCT_DIR)/icudtl.dat',455 '<(PRODUCT_DIR)/natives_blob.bin',456 '<(PRODUCT_DIR)/snapshot_blob.bin',457 ],458 }],459 },460 {461 'target_name': 'libcast_shell_android',462 'type': 'shared_library',463 'dependencies': [464 'cast_jni_headers',465 'cast_shell_common',466 'cast_shell_icudata',467 'cast_shell_pak',468 'cast_version_header',469 '../base/base.gyp:base',470 '../breakpad/breakpad.gyp:breakpad_client',471 '../components/components.gyp:breakpad_host',472 '../components/components.gyp:crash_component',473 '../components/components.gyp:external_video_surface',474 '../content/content.gyp:content',475 '../skia/skia.gyp:skia',476 '../ui/gfx/gfx.gyp:gfx',477 '../ui/gl/gl.gyp:gl',478 ],479 'include_dirs': [480 '../breakpad/src',481 ],482 'sources': [483 'android/cast_jni_registrar.cc',484 'android/cast_jni_registrar.h',485 'android/cast_metrics_helper_android.cc',486 'android/cast_metrics_helper_android.h',487 'android/platform_jni_loader.h',488 'app/android/cast_crash_reporter_client_android.cc',489 'app/android/cast_crash_reporter_client_android.h',490 'app/android/cast_jni_loader.cc',491 'app/android/crash_handler.cc',492 'app/android/crash_handler.h',493 'base/cast_sys_info_android.cc',494 'base/cast_sys_info_android.h',495 'base/chromecast_config_android.cc',496 'base/chromecast_config_android.h',497 'browser/android/cast_window_android.cc',498 'browser/android/cast_window_android.h',499 'browser/android/cast_window_manager.cc',500 'browser/android/cast_window_manager.h',501 ],502 'conditions': [503 ['chromecast_branding=="Chrome"', {504 'dependencies': [505 'internal/chromecast_internal.gyp:cast_shell_android_internal'506 ],507 }, {508 'sources': [509 'android/platform_jni_loader_stub.cc',510 ],511 }]512 ],513 }, # end of target 'libcast_shell_android'514 {515 'target_name': 'cast_base_java',516 'type': 'none',517 'dependencies': [518 '../base/base.gyp:base_java',519 ],520 'variables': {521 'android_manifest_path': 'android/AndroidManifest.xml',522 'java_in_dir': 'base/java',523 },524 'includes': ['../build/java.gypi'],525 }, # end of target 'cast_base_java'526 {527 'target_name': 'cast_shell_java',528 'type': 'none',529 'dependencies': [530 '<(android_support_v13_target)',531 'cast_base_java',532 'cast_shell_manifest',533 '../base/base.gyp:base_java',534 '../components/components.gyp:external_video_surface_java',535 '../content/content.gyp:content_java',536 '../media/media.gyp:media_java',537 '../net/net.gyp:net_java',538 '../ui/android/ui_android.gyp:ui_java',539 ],540 'variables': {541 'android_manifest_path': '<(SHARED_INTERMEDIATE_DIR)/cast_shell_manifest/AndroidManifest.xml',542 'has_java_resources': 1,543 'java_in_dir': 'browser/android/apk',544 'resource_dir': 'browser/android/apk/res',545 'R_package': 'org.chromium.chromecast.shell',546 },547 'includes': ['../build/java.gypi'],548 }, # end of target 'cast_shell_java'549 {550 'target_name': 'cast_shell_manifest',551 'type': 'none',552 'variables': {553 'jinja_inputs': ['browser/android/apk/AndroidManifest.xml.jinja2'],554 'jinja_output': '<(SHARED_INTERMEDIATE_DIR)/cast_shell_manifest/AndroidManifest.xml',555 },556 'includes': [ '../build/android/jinja_template.gypi' ],557 },558 {559 'target_name': 'cast_shell_apk',560 'type': 'none',561 'dependencies': [562 'cast_shell_java',563 'libcast_shell_android',564 ],565 'variables': {566 'apk_name': 'CastShell',567 'manifest_package_name': 'org.chromium.chromecast.shell',568 # Note(gunsch): there are no Java files in the android/ directory.569 # Unfortunately, the java_apk.gypi target rigidly insists on having570 # a java_in_dir directory, but complains about duplicate classes571 # from the common cast_shell_java target (shared with internal APK)572 # if the actual Java path is used.573 # This will hopefully be removable after the great GN migration.574 'java_in_dir': 'android',575 'android_manifest_path': '<(SHARED_INTERMEDIATE_DIR)/cast_shell_manifest/AndroidManifest.xml',576 'package_name': 'org.chromium.chromecast.shell',577 'native_lib_target': 'libcast_shell_android',578 'asset_location': '<(PRODUCT_DIR)/assets',579 'additional_input_paths': ['<(PRODUCT_DIR)/assets/cast_shell.pak'],580 },581 'includes': [ '../build/java_apk.gypi' ],582 },583 {584 'target_name': 'cast_jni_headers',585 'type': 'none',586 'sources': [587 'base/java/src/org/chromium/chromecast/base/ChromecastConfigAndroid.java',588 'browser/android/apk/src/org/chromium/chromecast/shell/CastCrashHandler.java',589 'browser/android/apk/src/org/chromium/chromecast/shell/CastMetricsHelper.java',590 'browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java',591 'browser/android/apk/src/org/chromium/chromecast/shell/CastWindowAndroid.java',592 'browser/android/apk/src/org/chromium/chromecast/shell/CastWindowManager.java',593 ],594 'direct_dependent_settings': {595 'include_dirs': [596 '<(SHARED_INTERMEDIATE_DIR)/chromecast',597 ],598 },599 'variables': {600 'jni_gen_package': 'chromecast',601 },602 'includes': [ '../build/jni_generator.gypi' ],603 },604 ], # end of targets605 }, { # OS != "android"606 'targets': [607 {608 'target_name': 'cast_shell_media',609 'type': '<(component)',610 'dependencies': [611 'media/media.gyp:cast_media',612 '../content/content.gyp:content',613 '../ipc/ipc.gyp:ipc',614 '../media/media.gyp:media',615 ],616 'sources': [617 'browser/media/cast_browser_cdm_factory.cc',618 'browser/media/cast_browser_cdm_factory.h',619 'browser/media/cma_message_filter_host.cc',620 'browser/media/cma_message_filter_host.h',621 'browser/media/media_pipeline_host.cc',622 'browser/media/media_pipeline_host.h',623 'common/media/cma_ipc_common.h',624 'common/media/cma_messages.h',625 'common/media/cma_message_generator.cc',626 'common/media/cma_message_generator.h',627 'common/media/cma_param_traits.cc',628 'common/media/cma_param_traits.h',629 'common/media/shared_memory_chunk.cc',630 'common/media/shared_memory_chunk.h',631 'renderer/media/audio_pipeline_proxy.cc',632 'renderer/media/audio_pipeline_proxy.h',633 'renderer/media/chromecast_media_renderer_factory.cc',634 'renderer/media/chromecast_media_renderer_factory.h',635 'renderer/media/cma_message_filter_proxy.cc',636 'renderer/media/cma_message_filter_proxy.h',637 'renderer/media/media_channel_proxy.cc',638 'renderer/media/media_channel_proxy.h',639 'renderer/media/media_pipeline_proxy.cc',640 'renderer/media/media_pipeline_proxy.h',641 'renderer/media/video_pipeline_proxy.cc',642 'renderer/media/video_pipeline_proxy.h',643 ],644 }, # end of target 'cast_shell_media'645 # This target contains all of the primary code of |cast_shell|, except646 # for |main|. This allows end-to-end tests using |cast_shell|.647 # This also includes all targets that cannot be built on Android.648 {649 'target_name': 'cast_shell_core',650 'type': '<(component)',651 'dependencies': [652 'cast_shell_media',653 'cast_shell_common',654 'media/media.gyp:cast_media',655 ],656 'conditions': [657 ['ozone_platform_egltest==1', {658 'dependencies': [659 '../ui/ozone/ozone.gyp:eglplatform_shim_x11',660 ],661 }],662 ],663 },664 {665 'target_name': 'cast_shell',666 'type': 'executable',667 'dependencies': [668 'cast_shell_core',669 ],670 'sources': [671 'app/cast_main.cc',672 ],673 'ldflags': [674 # Allow OEMs to override default libraries that are shipped with675 # cast receiver package by installed OEM-specific libraries in676 # /oem_cast_shlib.677 '-Wl,-rpath=/oem_cast_shlib',678 # TODO(dougsteed): remove when Chromecast moves to boringssl.679 # Allow the cast shell to find the NSS module in the same680 # directory.681 '-Wl,-rpath=\$$ORIGIN'682 ],683 },684 ], # end of targets685 }],686 ['enable_default_cast_graphics==1', {687 'targets': [688 {689 'target_name': 'libcast_graphics_1.0',690 'type': 'shared_library',691 'dependencies': [692 'cast_public_api'693 ],694 'sources': [695 'graphics/cast_egl_platform_default.cc',696 'graphics/graphics_properties_default.cc',697 'graphics/osd_plane_default.cc'698 ],699 }700 ]701 }],702 ], # end of conditions...
presentation_cast.js
Source:presentation_cast.js
1// presentation_cast.js2// Implementation of the Presentation API [1] using the Google Cast SDK [2]3// mark a. foltz <mfoltz@google.com>4// [1] http://w3c.github.io/presentation-api/5// [2] https://developers.google.com/cast/docs/reference/chrome/6(function() {7 // Utility for logging messages to the developer console.8 window.log = {9 info: function(message) {console.info('[presentation_cast] ' + message);},10 warn: function(message) {console.warn('[presentation_cast] ' + message);},11 error: function(message) {console.error('[presentation_cast] ' + message);}12 };13 ////////////////////////////////////////////////////////////////////////////14 // Bookkeeping for the polyfill.15 // Whether the SDK is initialized.16 var castApiInitialized_ = false;17 // Cast Application Id for which the SDK was initialized18 var castApplicationId_ = undefined;19 // DIAL application name for which the SDK was initialized20 var dialApplicationName_ = undefined;21 // Map from presentationUrlL|id to the corresponding PresentationSession.22 var presentationSessions_ = {};23 // Map from Cast session id to the corresponding PresentationSession.24 var castSessions_ = {};25 // Keeps track of the PresentationSession that is currently being started or26 // joined, to link up with listeners in the Cast SDK.27 var pendingSession_ = null;28 var ORIGIN_RE_ = new RegExp('https?://[^/]+');29 var DIAL_URL_RE_ = new RegExp('https?://[^#]*#__dialAppName__=([^/]*)(/__dialPostData__=(.*))?$');30 var CAST_URL_RE_ = new RegExp('https?://[^#]*#__castAppId__=.*$');31 32 // Register DIAL applications that support WebSocket messaging here33 var DIAL_CAST_REGISTRY = {34 "Netflix" : { "cast" : "CA5E8412", "port" : 9080 }35 };36 37 // Register CAST applications that support CAST messaging here38 var CAST_NAMESPACE_REGISTRY = {39 "B46B8FE4" : 'urn:x-cast:org.w3.webscreens.presentationapi.shim',40 "5E735230" : 'urn:x-cast:org.w3.webscreens.presentationapi.shim',41 "CC9C7FD8" : 'urn:x-cast:org.w3.webscreens.presentationapi.shim'42 };43 // @return {string} A random 8 character identifier.44 var generateId_ = function() {45 return (Math.round(Math.random() * 3221225472) + 1073741824).toString(16);46 };47 ////////////////////////////////////////////////////////////////////////////48 // Implementation of Presentation API at49 // http://webscreens.github.io/presentation-api/50 // Namespace for the Presentation API51 var presentation = {52 // Event handler for AvailableChangeEvent.53 onavailablechange: null,54 // Is always null on the controlling page.55 session: null56 };57 // Constructor for AvailableChangeEvent.58 // @param {boolean} available True if a screen is available, false otherwise.59 var AvailableChangeEvent = function(available) {60 this.bubbles = false;61 this.cancelable = false;62 this.available = available;63 };64 // Constructor for StateChangeEvent.65 var StateChangeEvent = function(state) {66 this.bubbles = false;67 this.cancelable = false;68 this.state = state;69 };70 // Requests the initiation of a new presentation.71 // @param {string} presentationUrl The URL of the document to present.72 // @param {string=} presentationId An optional id to assign the presentation.73 // If not provided, a random one will be assigned.74 presentation.startSession = function(presentationUrl, presentationId) {75 var session = new PresentationSession(presentationUrl,76 presentationId || generateId_());77 return new Promise(function(resolve, reject) {78 if (!castApiInitialized_) {79 reject(Error('Cast SDK not initialized'));80 return;81 }82 var existingSession = presentationSessions_[session.key_];83 if (existingSession) {84 // User agent cannot have two sessions with identical URL+id.85 // TODO(mfoltz): Resolve to the existing session if the user selects86 // a screen running the same Cast session.87 reject(Error('Session already running for ' + session.key_));88 return;89 }90 presentationSessions_[session.key_] = session;91 // Request a new session from the Cast SDK.92 chrome.cast.requestSession(function(castSession) {93 log.info('Got cast session ' + castSession.sessionId +94 ' for presentation ' + session.key_);95 session.setCastSession_(castSession);96 castSessions_[castSession.sessionId] = session;97 resolve(session);98 // If it was a DIAL launch, after resolving the promise we'll asynchronously99 // post a message to the presentation session with the additionalData field100 // containing the <webSocketUrl> field.101 // CAST does not expose the additionalData from the DIAL REST API, so 102 // we reconstruct it here from the things that CAST does expose103 if (castSession.receiver.receiverType === "dial") {104 window.setTimeout(function() {105 106 // CAST does not pass back the Additional Data field, so for the107 // moment we need to fake out what it would contain108 var ipAddress = castSession.receiver.ipAddress;109 // Hardcoded port for now110 var port = DIAL_CAST_REGISTRY[ dialApplicationName_ ]['port'];111 // This ID is only required for Netflix MDX112 var id = encodeURIComponent(castSession.receiver.label);113 // Return the URL with all the info we need encoded114 var wsUrl = "ws://" + ipAddress + ":" + port + "?id=" + id,115 wsElement = "<webSocketUrl>" + wsUrl + "</webSocketUrl>",116 adElement = "<additionalData>" + wsElement + "</additionalData>";117 session.onmessage(adElement);118 }, 0);119 }120 }, function(castError) {121 reject(Error('Unable to create Cast session: ' + JSON.stringify(castError)));122 });123 });124 };125 // Requests the PresentationSession for an existing presentation.126 // @param {string} presentationUrl The URL of the document being presented.127 // @param {string} presentationId The id of the presentation..128 presentation.joinSession = function(presentationUrl, presentationId) {129 var session = new PresentationSession(presentationUrl,130 presentationId || generateId_());131 return new Promise(function(resolve, reject) {132 if (!castApiInitialized_) {133 reject(Error('Cast SDK not initialized'));134 return;135 }136 var existingSession = presentationSessions_[session.key_];137 if (existingSession) {138 resolve(existingSession);139 } else {140 // TODO(mfoltz): Keep promise pending in case the session is discovered later.141 reject(Error('No session available for ' + session.key_));142 }143 });144 };145 // Constructor for PresentationSession.146 // @param {string} presentationUrl The URL of the presentation.147 // @param {string} presentationId The id of the presentation.148 var PresentationSession = function(presentationUrl, presentationId) {149 this.url = presentationUrl;150 this.id = presentationId;151 this.state = 'disconnected';152 this.onmessage = null;153 this.onstatechange = null;154 // Private properties.155 this.key_ = this.url + '|' + this.id;156 this.origin_ = ORIGIN_RE_.exec(this.url)[0];157 this.castSessionId_ = null;158 this.castSession_ = null;159 };160 // Posts a message to the presentation.161 // @param {string} message The message to send.162 PresentationSession.prototype.postMessage = function(message) {163 if (this.castSession_ && this.state == 'connected' && this.castNamespace_ ) {164 log.info('postMessage to ' + this.key_ + ': ' + message);165 this.castSession_.sendMessage(this.castNamespace_,166 message,167 null,168 this.close.bind(this));169 } else {170 log.warn('postMessage failed for session ' + this.key_ +171 '; no Cast session or not connected or app does not support cast messaging');172 }173 };174 // Closes the presentation (by disconnecting from the underlying Cast175 // session).176 PresentationSession.prototype.close = function() {177 if (this.state == 'disconnected') {178 return;179 }180 if (this.castSession_) {181 this.castSession_.leave(182 function() {183 log.info('Cast session ' + this.castSessionId_ +184 ' left for presentation ' + this.key_);185 }.bind(this),186 function(error) {187 log.error('Cast session ' + this.castSessionId_ +188 ' for presentation ' + this.key_ + ' not left: ' +189 JSON.stringify(error));190 }.bind(this));191 }192 this.state = 'disconnected';193 this.fireStateChange_();194 };195 ////////////////////////////////////////////////////////////////////////////196 // Implementation specific functions. Not part of public API.197 PresentationSession.prototype.setCastSession_ = function(session) {198 if (this.castSession_) {199 console.info('PresentationSession ' + this.getKey_() +200 ' already associated with Cast session ' + session.id);201 return;202 }203 this.castSession_ = session;204 this.castSessionId = session.id;205 206 // See if this cast application is registered for CAST messaging207 if ( CAST_NAMESPACE_REGISTRY[ castApplicationId_ ] ) {208 209 this.castNamespace_ = CAST_NAMESPACE_REGISTRY[ castApplicationId_ ];210 211 this.castSession_.addMessageListener(this.castNamespace_,212 this.onPresentationMessage_.bind(this));213 }214 215 this.castSession_.addUpdateListener(this.onCastSessionUpdate_.bind(this));216 217 this.state = 'connected';218 this.fireStateChange_();219 };220 PresentationSession.prototype.onPresentationMessage_ =221 function(namespace, message) {222 if (namespace != this.castNamespace_ ||223 typeof(this.onmessage) != 'function') {224 return;225 }226 this.onmessage({data: message, origin: this.origin_, lastEventId: '',227 source: null, ports: null});228 };229 PresentationSession.prototype.onCastSessionUpdate_ = function(isAlive) {230 if (isAlive && this.state == 'disconnected') {231 this.state = 'connected';232 this.fireStateChange_();233 }234 if (!isAlive && this.state == 'connected') {235 this.state = 'disconnected';236 this.fireStateChange_();237 }238 };239 PresentationSession.prototype.fireStateChange_ = function() {240 if (typeof(this.onstatechange) == 'function') {241 this.onstatechange(new StateChangeEvent(this.state));242 }243 };244 PresentationSession.prototype.getKey_ = function() {245 return this.url + '|' + this.id;246 };247 PresentationSession.prototype.hasCastSession_ = function() {248 return typeof(this.castSession_) == 'object';249 };250 PresentationSession.prototype.maybePresentUrl_ = function() {251 // TODO(mfoltz): Check if the receiver is already displaying the URL.252 this.postMessage({cmd: 'open', url: this.url});253 };254 ////////////////////////////////////////////////////////////////////////////255 // Integration with Cast SDK.256 // Invoked when a Cast session is automatically connected. Currently we don't257 // support auto-join/auto-fling with this polyfill.258 var onCastSession_ = function(castSession) {259 log.info('onCastSession: connected to session ' + castSession.sessionId);260 };261 // Invoked when a Cast receiver is available or not.262 var onCastReceiverAvailable_ = function(availability) {263 if (typeof(navigator.presentation.onavailablechange) != 'function') {264 return;265 }266 log.info('onCastReceiverAvailable: available = ' + availability);267 if (availability == chrome.cast.ReceiverAvailability.AVAILABLE) {268 navigator.presentation.onavailablechange(new AvailableChangeEvent(true));269 } else {270 navigator.presentation.onavailablechange(new AvailableChangeEvent(false));271 }272 };273 // Initialization function for CAST detection274 var initializeCast_ = function( castAppId ) {275 return new Promise(function(resolve, reject) {276 var apiConfig = new chrome.cast.ApiConfig(277 new chrome.cast.SessionRequest(castAppId),278 onCastSession_,279 onCastReceiverAvailable_,280 chrome.cast.AutoJoinPolicy.PAGE_SCOPED);281 chrome.cast.initialize(282 apiConfig,283 function() {284 log.info('Cast Sender SDK initialized successfully for CAST App Id ' + castAppId );285 castApiInitialized_ = true;286 castApplicationId_ = castAppId;287 resolve();288 },289 function(error) {290 log.error('Unable to initialize Cast Sender SDK: ' + JSON.stringify(error));291 reject(Error(JSON.stringify(error)));292 });293 });294 };295 296 // Initialization function for DIAL detection297 var initializeDial_ = function(castAppId, dialAppName, dialLaunchPayload) {298 return new Promise(function(resolve, reject) {299 chrome.cast.timeout.requestSession = 30000;300 var sessionRequest = new chrome.cast.SessionRequest(castAppId);301 sessionRequest.dialRequest = new chrome.cast.DialRequest(dialAppName, dialLaunchPayload);302 var apiConfig = new chrome.cast.ApiConfig(303 sessionRequest,304 onCastSession_,305 onCastReceiverAvailable_,306 chrome.cast.AutoJoinPolicy.PAGE_SCOPED,307 chrome.cast.DefaultActionPolicy.CREATE_SESSION);308 chrome.cast.initialize(309 apiConfig,310 function() {311 log.info('Cast Sender SDK initialized successfully for DIAL application ' + dialAppName),312 castApiInitialized_ = true;313 castApplicationId_ = castAppId;314 dialApplicationName_ = dialAppName;315 resolve();316 },317 function(error) {318 log.error('Unable to initialize Cast Sender SDK: ' + JSON.stringify(error));319 reject(Error(JSON.stringify(error)));320 });321 });322 };323 // Load the Cast Sender SDK.324 window['__onGCastApiAvailable'] = function(loaded, error) {325 if (!loaded) {326 log.error('Cast Sender SDK not available: ' + JSON.stringify(error));327 return;328 }329 // Look for default URL330 var links = Array.prototype.slice.call( document.head.getElementsByTagName("link") )331 .filter( function( l ) { return l.rel == "default-presentation"; } );332 333 if ( links.length == 0 ) {334 log.error("No default presentation URL found");335 return;336 }337 338 var match = DIAL_URL_RE_.exec( links[ 0 ].href );339 if ( match && match[ 0 ] ) {340 341 // Initialize Cast detection for this application342 var dialAppName = match[1],343 castAppId = DIAL_CAST_REGISTRY[ dialAppName ]['cast'];344 345 if ( !castAppId ) {346 log.error("No CAST Application ID for DIAL Application " + dialAppName );347 return;348 }349 350 log.info("Initializing with DIAL Application Name: " + dialAppName351 + " and post data: " + match[3] );352 353 // Bind polyfill.354 navigator['presentation'] = presentation;355 356 // Initialize DIAL 357 initializeDial_( castAppId, dialAppName, match[3] ).then( function() {358 // Invoke a well-known callback so clients are notified when they can359 // call functions in the polyfill.360 if (typeof window['__onPresentationAvailable'] == 'function') {361 window['__onPresentationAvailable']();362 }363 } );364 } else {365 366 match = CAST_URL_RE_.exec( links[ 0 ].href );367 if ( !match || !match[0] ) {368 log.error("No CAST or DIAL application name in default presentation URL");369 return;370 }371 372 // Bind polyfill.373 navigator['presentation'] = presentation;374 375 // Initialize CAST 376 initializeCast_( match[0] ).then( function() {377 // Invoke a well-known callback so clients are notified when they can378 // call functions in the polyfill.379 if (typeof window['__onPresentationAvailable'] == 'function') {380 window['__onPresentationAvailable']();381 }382 } ); 383 }384 };385 386 // Pull in the CAST sender SDK387 var script = document.createElement('script');388 script.src = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js';389 document.head.appendChild(script);390})();391// TODO: Fix this...
cast_testing.gypi
Source:cast_testing.gypi
1# Copyright 2014 The Chromium Authors. All rights reserved.2# Use of this source code is governed by a BSD-style license that can be3# found in the LICENSE file.4{5 'targets': [6 {7 # GN version: //media/cast:test_support8 'target_name': 'cast_test_utility',9 'type': 'static_library',10 'include_dirs': [11 '<(DEPTH)/',12 ],13 'dependencies': [14 'cast_net',15 'cast_receiver',16 '<(DEPTH)/testing/gtest.gyp:gtest',17 '<(DEPTH)/third_party/ffmpeg/ffmpeg.gyp:ffmpeg',18 '<(DEPTH)/third_party/libyuv/libyuv.gyp:libyuv',19 '<(DEPTH)/third_party/mt19937ar/mt19937ar.gyp:mt19937ar',20 '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',21 ],22 'sources': [23 'test/fake_media_source.cc',24 'test/fake_media_source.h',25 'test/fake_single_thread_task_runner.cc',26 'test/fake_single_thread_task_runner.h',27 'test/loopback_transport.cc',28 'test/loopback_transport.h',29 'test/skewed_single_thread_task_runner.cc',30 'test/skewed_single_thread_task_runner.h',31 'test/skewed_tick_clock.cc',32 'test/skewed_tick_clock.h',33 'test/utility/audio_utility.cc',34 'test/utility/audio_utility.h',35 'test/utility/barcode.cc',36 'test/utility/barcode.h',37 'test/utility/default_config.cc',38 'test/utility/default_config.h',39 'test/utility/in_process_receiver.cc',40 'test/utility/in_process_receiver.h',41 'test/utility/input_builder.cc',42 'test/utility/input_builder.h',43 'test/utility/net_utility.cc',44 'test/utility/net_utility.h',45 'test/utility/standalone_cast_environment.cc',46 'test/utility/standalone_cast_environment.h',47 'test/utility/udp_proxy.cc',48 'test/utility/udp_proxy.h',49 'test/utility/video_utility.cc',50 'test/utility/video_utility.h',51 ], # source52 },53 {54 # GN version: //media/cast:cast_unittests55 'target_name': 'cast_unittests',56 'type': '<(gtest_target_type)',57 'include_dirs': [58 '<(DEPTH)/',59 ],60 'dependencies': [61 'cast_base',62 'cast_net',63 'cast_receiver',64 'cast_sender',65 'cast_test_utility',66 # Not a true dependency. This is here to make sure the CQ can verify67 # the tools compile correctly.68 'cast_tools',69 '<(DEPTH)/base/base.gyp:test_support_base',70 '<(DEPTH)/net/net.gyp:net',71 '<(DEPTH)/testing/gmock.gyp:gmock',72 '<(DEPTH)/testing/gtest.gyp:gtest',73 ],74 'sources': [75 '<(DEPTH)/media/base/run_all_unittests.cc',76 'logging/encoding_event_subscriber_unittest.cc',77 'logging/logging_impl_unittest.cc',78 'logging/logging_raw_unittest.cc',79 'logging/receiver_time_offset_estimator_impl_unittest.cc',80 'logging/serialize_deserialize_test.cc',81 'logging/simple_event_subscriber_unittest.cc',82 'logging/stats_event_subscriber_unittest.cc',83 'net/cast_transport_sender_impl_unittest.cc',84 'net/frame_id_wrap_helper_test.cc',85 'net/mock_cast_transport_sender.cc',86 'net/mock_cast_transport_sender.h',87 'net/pacing/mock_paced_packet_sender.cc',88 'net/pacing/mock_paced_packet_sender.h',89 'net/pacing/paced_sender_unittest.cc',90 'net/rtcp/receiver_rtcp_event_subscriber_unittest.cc',91 'net/rtcp/rtcp_builder_unittest.cc',92 'net/rtcp/rtcp_unittest.cc',93 'net/rtcp/rtcp_utility_unittest.cc',94# TODO(miu): The following two are test utility modules. Rename/move the files.95 'net/rtcp/test_rtcp_packet_builder.cc',96 'net/rtcp/test_rtcp_packet_builder.h',97 'net/rtp/cast_message_builder_unittest.cc',98 'net/rtp/frame_buffer_unittest.cc',99 'net/rtp/framer_unittest.cc',100 'net/rtp/mock_rtp_payload_feedback.cc',101 'net/rtp/mock_rtp_payload_feedback.h',102 'net/rtp/packet_storage_unittest.cc',103 'net/rtp/receiver_stats_unittest.cc',104 'net/rtp/rtp_header_parser.cc',105 'net/rtp/rtp_header_parser.h',106 'net/rtp/rtp_packet_builder.cc',107 'net/rtp/rtp_packetizer_unittest.cc',108 'net/rtp/rtp_parser_unittest.cc',109 'net/rtp/rtp_receiver_defines.h',110 'net/udp_transport_unittest.cc',111 'receiver/audio_decoder_unittest.cc',112 'receiver/frame_receiver_unittest.cc',113 'receiver/video_decoder_unittest.cc',114 'sender/audio_encoder_unittest.cc',115 'sender/audio_sender_unittest.cc',116 'sender/congestion_control_unittest.cc',117 'sender/fake_video_encode_accelerator_factory.cc',118 'sender/fake_video_encode_accelerator_factory.h',119 'sender/video_encoder_unittest.cc',120 'sender/video_sender_unittest.cc',121 'test/end2end_unittest.cc',122 'test/fake_receiver_time_offset_estimator.cc',123 'test/fake_receiver_time_offset_estimator.h',124 'test/fake_single_thread_task_runner.cc',125 'test/fake_single_thread_task_runner.h',126 'test/utility/audio_utility_unittest.cc',127 'test/utility/barcode_unittest.cc',128 ], # source129 },130 {131 'target_name': 'cast_benchmarks',132 'type': '<(gtest_target_type)',133 'include_dirs': [134 '<(DEPTH)/',135 ],136 'dependencies': [137 'cast_base',138 'cast_net',139 'cast_receiver',140 'cast_sender',141 'cast_test_utility',142 '<(DEPTH)/base/base.gyp:test_support_base',143 '<(DEPTH)/net/net.gyp:net',144 '<(DEPTH)/testing/gtest.gyp:gtest',145 ],146 'sources': [147 'test/cast_benchmarks.cc',148 'test/fake_single_thread_task_runner.cc',149 'test/fake_single_thread_task_runner.h',150 'test/utility/test_util.cc',151 'test/utility/test_util.h',152 ], # source153 'conditions': [154 ['os_posix==1 and OS!="mac" and OS!="ios" and use_allocator!="none"',155 {156 'dependencies': [157 '<(DEPTH)/base/allocator/allocator.gyp:allocator',158 ],159 }160 ],161 ],162 },163 {164 # This is a target for the collection of cast development tools.165 # They are built on bots but not shipped.166 'target_name': 'cast_tools',167 'type': 'none',168 'dependencies': [169 'cast_receiver_app',170 'cast_sender_app',171 'cast_simulator',172 'udp_proxy',173 ],174 },175 {176 'target_name': 'cast_receiver_app',177 'type': 'executable',178 'include_dirs': [179 '<(DEPTH)/',180 ],181 'dependencies': [182 'cast_base',183 'cast_net',184 'cast_receiver',185 'cast_test_utility',186 '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',187 '<(DEPTH)/net/net.gyp:net_test_support',188 '<(DEPTH)/media/media.gyp:media',189 '<(DEPTH)/testing/gtest.gyp:gtest',190 '<(DEPTH)/third_party/libyuv/libyuv.gyp:libyuv',191 ],192 'sources': [193 '<(DEPTH)/media/cast/test/receiver.cc',194 ],195 'conditions': [196 ['OS == "linux" and use_x11==1', {197 'dependencies': [198 '<(DEPTH)/build/linux/system.gyp:x11',199 '<(DEPTH)/build/linux/system.gyp:xext',200 ],201 'sources': [202 '<(DEPTH)/media/cast/test/linux_output_window.cc',203 '<(DEPTH)/media/cast/test/linux_output_window.h',204 ],205 }],206 ],207 },208 {209 'target_name': 'cast_sender_app',210 'type': 'executable',211 'include_dirs': [212 '<(DEPTH)/',213 ],214 'dependencies': [215 'cast_base',216 'cast_net',217 'cast_sender',218 'cast_test_utility',219 '<(DEPTH)/net/net.gyp:net_test_support',220 '<(DEPTH)/media/media.gyp:media',221 '<(DEPTH)/testing/gtest.gyp:gtest',222 '<(DEPTH)/third_party/ffmpeg/ffmpeg.gyp:ffmpeg',223 '<(DEPTH)/third_party/opus/opus.gyp:opus',224 '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',225 ],226 'sources': [227 '<(DEPTH)/media/cast/test/sender.cc',228 ],229 },230 {231 'target_name': 'cast_simulator',232 'type': 'executable',233 'include_dirs': [234 '<(DEPTH)/',235 ],236 'dependencies': [237 'cast_base',238 'cast_net',239 'cast_network_model_proto',240 'cast_sender',241 'cast_test_utility',242 '<(DEPTH)/net/net.gyp:net_test_support',243 '<(DEPTH)/media/media.gyp:media',244 '<(DEPTH)/testing/gtest.gyp:gtest',245 '<(DEPTH)/third_party/ffmpeg/ffmpeg.gyp:ffmpeg',246 '<(DEPTH)/third_party/opus/opus.gyp:opus',247 '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',248 ],249 'sources': [250 '<(DEPTH)/media/cast/test/simulator.cc',251 ],252 },253 {254 # GN version: //media/cast/test/proto255 'target_name': 'cast_network_model_proto',256 'type': 'static_library',257 'include_dirs': [258 '<(DEPTH)/',259 ],260 'sources': [261 'test/proto/network_simulation_model.proto',262 ],263 'variables': {264 'proto_in_dir': 'test/proto',265 'proto_out_dir': 'media/cast/test/proto',266 },267 'includes': ['../../build/protoc.gypi'],268 },269 {270 # GN version: //media/cast:generate_barcode_video271 'target_name': 'generate_barcode_video',272 'type': 'executable',273 'include_dirs': [274 '<(DEPTH)/',275 ],276 'dependencies': [277 'cast_test_utility',278 '<(DEPTH)/base/base.gyp:base',279 '<(DEPTH)/media/media.gyp:media',280 ],281 'sources': [282 'test/utility/generate_barcode_video.cc',283 ],284 },285 {286 # GN version: //media/cast:generate_timecode_audio287 'target_name': 'generate_timecode_audio',288 'type': 'executable',289 'include_dirs': [290 '<(DEPTH)/',291 ],292 'dependencies': [293 'cast_base',294 'cast_net',295 'cast_test_utility',296 '<(DEPTH)/base/base.gyp:base',297 '<(DEPTH)/media/media.gyp:media',298 ],299 'sources': [300 'test/utility/generate_timecode_audio.cc',301 ],302 },303 {304 # GN version: //media/cast:udp_proxy305 'target_name': 'udp_proxy',306 'type': 'executable',307 'include_dirs': [308 '<(DEPTH)/',309 ],310 'dependencies': [311 'cast_test_utility',312 '<(DEPTH)/base/base.gyp:base',313 '<(DEPTH)/media/media.gyp:media',314 ],315 'sources': [316 'test/utility/udp_proxy_main.cc',317 ],318 },319 ], # targets320 'conditions': [321 ['OS=="linux"',322 { 'targets': [323 {324 'target_name': 'tap_proxy',325 'type': 'executable',326 'include_dirs': [327 '<(DEPTH)/',328 ],329 'dependencies': [330 'cast_test_utility',331 '<(DEPTH)/base/base.gyp:base',332 '<(DEPTH)/media/media.gyp:media',333 ],334 'sources': [335 'test/utility/tap_proxy.cc',336 ],337 }338 ]339 }340 ],341 ['OS=="ios" or OS=="mac"', {342 'targets': [343 {344 # GN version: //media/cast:cast_h264_vt_encoder_unittests345 'target_name': 'cast_h264_vt_encoder_unittests',346 'type': '<(gtest_target_type)',347 'include_dirs': [348 '<(DEPTH)/',349 ],350 'dependencies': [351 'cast_base',352 'cast_sender',353 'cast_test_utility',354 '<(DEPTH)/base/base.gyp:test_support_base',355 '<(DEPTH)/testing/gmock.gyp:gmock',356 '<(DEPTH)/testing/gtest.gyp:gtest',357 '<(DEPTH)/third_party/ffmpeg/ffmpeg.gyp:ffmpeg',358 ],359 'sources': [360 'sender/h264_vt_encoder_unittest.cc',361 ],362 }], # targets363 }], # OS=="ios" or OS=="mac"364 ['test_isolation_mode != "noop"', {365 'targets': [366 {367 'target_name': 'cast_unittests_run',368 'type': 'none',369 'dependencies': [370 'cast_unittests',371 ],372 'includes': [373 '../../build/isolate.gypi',374 ],375 'sources': [376 'cast_unittests.isolate',377 ],378 },379 ],380 }],381 ], # conditions...
test_magic_shield_keeper.py
Source:test_magic_shield_keeper.py
1#!/usr/bin/env python3.82import unittest3from typing import Dict, Any4from unittest import TestCase5from unittest.mock import Mock6from tibia_terminator.keeper.magic_shield_keeper import MagicShieldKeeper7from tibia_terminator.reader.color_spec import (AmuletName, RingName)8from tibia_terminator.common.char_status import CharStatus9from tibia_terminator.reader.equipment_reader import MagicShieldStatus10START_TIME = 10011TOTAL_HP = 100012TOTAL_MANA = 100013SPEED = 10014MAGIC_SHIELD = 100015MAGIC_SHIELD_TRESHOLD = 90016EQUIPMENT_STATUS = {17 'emergency_action_amulet': AmuletName.UNKNOWN,18 'equipped_amulet': AmuletName.EMPTY,19 'emergency_action_ring': RingName.UNKNOWN,20 'equipped_ring': RingName.EMPTY,21 'magic_shield_status': MagicShieldStatus.OFF_COOLDOWN22}23class CharStatusStub(CharStatus):24 def __init__(self,25 hp: int = TOTAL_HP,26 speed: int = SPEED,27 mana: int = TOTAL_MANA,28 magic_shield_level: int = MAGIC_SHIELD,29 equipment_status: Dict[str, Any] = EQUIPMENT_STATUS):30 super().__init__(hp, speed, mana, magic_shield_level, equipment_status)31class TestMagicShieldKeeper(TestCase):32 def setUp(self):33 self.char_status = CharStatus(TOTAL_MANA, TOTAL_HP, 1000, MAGIC_SHIELD,34 EQUIPMENT_STATUS)35 self.mock_client = Mock()36 self.mock_cast_magic_shield = self.mock_client.cast_magic_shield37 self.mock_cancel_magic_shield = self.mock_client.cancel_magic_shield38 self.target = MagicShieldKeeper(self.mock_client, TOTAL_HP,39 MAGIC_SHIELD_TRESHOLD, self.time_fn)40 self.time = START_TIME41 def time_fn(self):42 return self.time43 def make_equipment_status(self, **kwargs) -> Dict[str, Any]:44 result = EQUIPMENT_STATUS.copy()45 for key, value in kwargs.items():46 result[key] = value47 return result48 def make_char_status(self, *args, **kwargs):49 return CharStatusStub(*args, **kwargs)50 def test_should_cast_magic_shield(self):51 # given52 char_status = self.make_char_status(53 mana=(TOTAL_HP * 1.5) + 1,54 magic_shield_level=MAGIC_SHIELD_TRESHOLD,55 equipment_status=self.make_equipment_status(56 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))57 cases = [58 char_status,59 char_status.copy(mana=(TOTAL_HP * 1.5) + 2),60 char_status.copy(magic_shield_level=MAGIC_SHIELD_TRESHOLD - 1)61 ]62 # when - then63 for _char_status in cases:64 self.check_should_cast_magic_shield(_char_status)65 def check_should_cast_magic_shield(self, char_status: CharStatus):66 # given67 self.mock_cast_magic_shield.reset_mock()68 # when69 self.target.handle_status_change(char_status)70 # then71 self.mock_cast_magic_shield.assert_called_once()72 def test_should_not_cast_magic_shield(self):73 # given74 char_status = self.make_char_status(75 mana=(TOTAL_HP * 1.5) + 1,76 magic_shield_level=MAGIC_SHIELD_TRESHOLD,77 equipment_status=self.make_equipment_status(78 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))79 cases = [80 char_status.copy(magic_shield_level=MAGIC_SHIELD_TRESHOLD + 1),81 char_status.copy(mana=TOTAL_HP * 1.5),82 char_status.copy(equipment_status=self.make_equipment_status(83 magic_shield_status=MagicShieldStatus.ON_COOLDOWN))84 ]85 # when - then86 for _char_status in cases:87 self.check_should_not_cast_magic_shield(_char_status)88 def check_should_not_cast_magic_shield(self, char_status: CharStatus):89 # given90 # when91 self.target.handle_status_change(char_status)92 # then93 self.mock_cast_magic_shield.assert_not_called()94 def test_should_cast_cancel_magic_shield(self):95 # given96 cast_mana = (TOTAL_HP * 1.5) + 197 cast_char_status = self.make_char_status(98 mana=cast_mana,99 magic_shield_level=cast_mana / 2,100 equipment_status=self.make_equipment_status(101 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))102 cancel_mana = (TOTAL_HP * 1.25)103 cases = [104 cast_char_status.copy(mana=cancel_mana),105 cast_char_status.copy(mana=cancel_mana - 1),106 cast_char_status.copy(mana=cancel_mana,107 magic_shield_level=(cancel_mana / 2) + 1)108 ]109 for cancel_char_status in cases:110 self.mock_cancel_magic_shield.reset_mock()111 self.target.handle_status_change(cast_char_status)112 # when113 self.target.handle_status_change(cancel_char_status)114 # then115 self.mock_cancel_magic_shield.assert_called_once()116 def test_should_not_cast_cancel_magic_shield(self):117 # given118 cast_mana = (TOTAL_HP * 1.5) + 1119 cast_char_status = self.make_char_status(120 mana=cast_mana,121 magic_shield_level=cast_mana / 2,122 equipment_status=self.make_equipment_status(123 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))124 cancel_mana = (TOTAL_HP * 1.25)125 cases = [126 cast_char_status.copy(mana=cancel_mana + 1),127 cast_char_status.copy(mana=cancel_mana + 2),128 cast_char_status.copy(mana=cancel_mana,129 magic_shield_level=(cancel_mana / 2)),130 cast_char_status.copy(mana=cancel_mana,131 magic_shield_level=(cancel_mana / 2) - 1),132 cast_char_status.copy(mana=cancel_mana,133 magic_shield_level=(cancel_mana / 2) - 2)134 ]135 for not_cast_cancel_char_status in cases:136 self.mock_cancel_magic_shield.reset_mock()137 self.target.handle_status_change(cast_char_status)138 # when139 self.target.handle_status_change(not_cast_cancel_char_status)140 # then141 self.mock_cancel_magic_shield.assert_not_called()142 def test_should_recast_magic_shield(self):143 # given144 cast_mana = (TOTAL_HP * 1.5) + 1145 cast_char_status = self.make_char_status(146 mana=cast_mana,147 magic_shield_level=cast_mana / 2,148 equipment_status=self.make_equipment_status(149 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))150 recast_char_status = cast_char_status.copy(151 equipment_status=self.make_equipment_status(152 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))153 self.target.handle_status_change(cast_char_status)154 # when155 self.target.handle_status_change(recast_char_status)156 # then157 self.assertEqual(self.mock_cast_magic_shield.call_count, 2)158 def test_should_not_recast_magic_shield(self):159 # given160 cast_mana = (TOTAL_HP * 1.5) + 1161 cast_char_status = self.make_char_status(162 mana=cast_mana,163 magic_shield_level=cast_mana / 2,164 equipment_status=self.make_equipment_status(165 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))166 cases = [167 cast_char_status.copy(equipment_status=self.make_equipment_status(168 magic_shield_status=MagicShieldStatus.ON_COOLDOWN)),169 cast_char_status.copy(equipment_status=self.make_equipment_status(170 magic_shield_status=MagicShieldStatus.RECENTLY_CAST))171 ]172 for not_recast_char_status in cases:173 self.mock_cast_magic_shield.reset_mock()174 self.target.handle_status_change(cast_char_status)175 # when176 self.target.handle_status_change(not_recast_char_status)177 # then178 self.assertEqual(self.mock_cast_magic_shield.call_count, 1)179 def test_should_refresh_magic_shield(self):180 # given181 cast_mana = (TOTAL_HP * 1.5) + 1182 refresh_char_status = self.make_char_status(183 mana=cast_mana,184 magic_shield_level=MAGIC_SHIELD_TRESHOLD + 1,185 equipment_status=self.make_equipment_status(186 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))187 # when-then188 for time in [179, 180, 181, 170, 171]:189 self.check_refresh_magic_shield(refresh_char_status,190 time,191 call_count=1)192 def test_should_not_refresh_magic_shield(self):193 # given194 cast_mana = (TOTAL_HP * 1.5) + 1195 refresh_char_status = self.make_char_status(196 mana=cast_mana,197 magic_shield_level=MAGIC_SHIELD_TRESHOLD + 1,198 equipment_status=self.make_equipment_status(199 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))200 # when-then201 for time in [169, 168, 0, 1]:202 self.check_refresh_magic_shield(refresh_char_status,203 time,204 call_count=0)205 def check_refresh_magic_shield(self, refresh_char_status: CharStatus,206 time: int, call_count: int):207 # given208 cast_mana = (TOTAL_HP * 1.5) + 1209 cast_char_status = self.make_char_status(210 mana=cast_mana,211 magic_shield_level=cast_mana / 2,212 equipment_status=self.make_equipment_status(213 magic_shield_status=MagicShieldStatus.OFF_COOLDOWN))214 casted_char_status = cast_char_status.copy(215 equipment_status=self.make_equipment_status(216 magic_shield_status=MagicShieldStatus.ON_COOLDOWN))217 self.mock_cast_magic_shield.reset_mock()218 self.target.handle_status_change(cast_char_status)219 self.target.handle_status_change(casted_char_status)220 # when221 self.time += time222 self.target.handle_status_change(refresh_char_status)223 # then224 self.assertEqual(self.mock_cast_magic_shield.call_count,225 call_count + 1)226if __name__ == '__main__':...
DOMTopLevelEventTypes.js
Source:DOMTopLevelEventTypes.js
1/**2 * Copyright (c) Facebook, Inc. and its affiliates.3 *4 * This source code is licensed under the MIT license found in the5 * LICENSE file in the root directory of this source tree.6 *7 * @flow8 */9import type {DOMTopLevelEventType} from 'events/TopLevelEventTypes';10import {11 unsafeCastStringToDOMTopLevelType,12 unsafeCastDOMTopLevelTypeToString,13} from 'events/TopLevelEventTypes';14import getVendorPrefixedEventName from './getVendorPrefixedEventName';15/**16 * To identify top level events in ReactDOM, we use constants defined by this17 * module. This is the only module that uses the unsafe* methods to express18 * that the constants actually correspond to the browser event names. This lets19 * us save some bundle size by avoiding a top level type -> event name map.20 * The rest of ReactDOM code should import top level types from this file.21 */22export const TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');23export const TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(24 getVendorPrefixedEventName('animationend'),25);26export const TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(27 getVendorPrefixedEventName('animationiteration'),28);29export const TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(30 getVendorPrefixedEventName('animationstart'),31);32export const TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');33export const TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');34export const TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType(35 'canplaythrough',36);37export const TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');38export const TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');39export const TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');40export const TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');41export const TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType(42 'compositionend',43);44export const TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType(45 'compositionstart',46);47export const TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType(48 'compositionupdate',49);50export const TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType(51 'contextmenu',52);53export const TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');54export const TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');55export const TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');56export const TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');57export const TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');58export const TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');59export const TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');60export const TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');61export const TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');62export const TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');63export const TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');64export const TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');65export const TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType(66 'durationchange',67);68export const TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');69export const TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');70export const TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');71export const TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');72export const TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');73export const TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType(74 'gotpointercapture',75);76export const TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');77export const TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');78export const TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');79export const TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');80export const TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');81export const TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');82export const TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');83export const TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');84export const TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType(85 'loadedmetadata',86);87export const TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType(88 'lostpointercapture',89);90export const TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');91export const TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');92export const TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');93export const TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');94export const TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');95export const TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');96export const TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');97export const TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');98export const TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');99export const TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType(100 'pointercancel',101);102export const TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType(103 'pointerdown',104);105export const TOP_POINTER_ENTER = unsafeCastStringToDOMTopLevelType(106 'pointerenter',107);108export const TOP_POINTER_LEAVE = unsafeCastStringToDOMTopLevelType(109 'pointerleave',110);111export const TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType(112 'pointermove',113);114export const TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');115export const TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType(116 'pointerover',117);118export const TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');119export const TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');120export const TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');121export const TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');122export const TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');123export const TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');124export const TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');125export const TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType(126 'selectionchange',127);128export const TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');129export const TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');130export const TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');131export const TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');132export const TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');133export const TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');134export const TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType(135 'touchcancel',136);137export const TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');138export const TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');139export const TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');140export const TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(141 getVendorPrefixedEventName('transitionend'),142);143export const TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType(144 'volumechange',145);146export const TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');147export const TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel');148// List of events that need to be individually attached to media elements.149// Note that events in this list will *not* be listened to at the top level150// unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.151export const mediaEventTypes = [152 TOP_ABORT,153 TOP_CAN_PLAY,154 TOP_CAN_PLAY_THROUGH,155 TOP_DURATION_CHANGE,156 TOP_EMPTIED,157 TOP_ENCRYPTED,158 TOP_ENDED,159 TOP_ERROR,160 TOP_LOADED_DATA,161 TOP_LOADED_METADATA,162 TOP_LOAD_START,163 TOP_PAUSE,164 TOP_PLAY,165 TOP_PLAYING,166 TOP_PROGRESS,167 TOP_RATE_CHANGE,168 TOP_SEEKED,169 TOP_SEEKING,170 TOP_STALLED,171 TOP_SUSPEND,172 TOP_TIME_UPDATE,173 TOP_VOLUME_CHANGE,174 TOP_WAITING,175];176export function getRawEventName(topLevelType: DOMTopLevelEventType): string {177 return unsafeCastDOMTopLevelTypeToString(topLevelType);...
PodCastUsuario.js
Source:PodCastUsuario.js
1const {Sequelize, DataTypes} = require("sequelize");2const db = require ("../db");3const PodCast = require("./PodCast");4const Usuario = require("./Usuario");5const PodCastUsuario = db.define("PodCastUsuario", 6 {7 PodCastId: {8 type: DataTypes.INTEGER,9 primaryKey: true,10 references: {11 model: PodCast,12 key: 'id'13 }14 },15 UsuarioId: {16 type: DataTypes.INTEGER,17 primaryKey: true,18 references: {19 model: Usuario,20 key: 'email'21 }22 }23 }24);25PodCast.belongsToMany(Usuario, {through:PodCastUsuario, as: 'usuarios'});26Usuario.belongsToMany(PodCast, {through:PodCastUsuario, as: 'podcasts'});...
Using AI Code Generation
1var wpt = require('webpagetest');2var wpt = new WebPageTest('www.webpagetest.org');3 if (err) return console.error(err);4 console.log('Test status: ' + data.statusText);5 console.log('Test ID: ' + data.data.testId);6 console.log('Test URL: ' + data.data.summary);7});8var wpt = require('webpagetest');9var wpt = new WebPageTest('www.webpagetest.org');10 if (err) return console.error(err);11 console.log('Test status: ' + data.statusText);12 console.log('Test ID: ' + data.data.testId);13 console.log('Test URL: ' + data.data.summary);14});15var wpt = require('webpagetest');16var wpt = new WebPageTest('www.webpagetest.org');17 if (err) return console.error(err);18 console.log('Test status: ' + data.statusText);19 console.log('Test ID: ' + data.data.testId);20 console.log('Test URL: ' + data.data.summary);21});22var wpt = require('webpagetest');23var wpt = new WebPageTest('www.webpagetest.org');24 if (err) return console.error(err);25 console.log('Test status: ' + data.statusText);26 console.log('Test ID: ' + data.data.testId);27 console.log('Test URL: ' + data.data.summary);28});29var wpt = require('webpagetest');30var wpt = new WebPageTest('www.webpagetest.org');31 if (err) return console.error(err);32 console.log('Test status: ' +
Using AI Code Generation
1var wptools = require('wptools');2var cast = wptools.cast('Mickey Mouse');3cast.get(function(err, data) {4 console.log(data);5});6var wptools = require('wptools');7var cast = wptools.cast('Mickey Mouse');8cast.get(function(err, data) {9 console.log(data);10});11var wptools = require('wptools');12var cast = wptools.cast('Mickey Mouse');13cast.get(function(err, data) {14 console.log(data);15});16var wptools = require('wptools');17var cast = wptools.cast('Mickey Mouse');18cast.get(function(err, data) {19 console.log(data);20});21var wptools = require('wptools');22var cast = wptools.cast('Mickey Mouse');23cast.get(function(err, data) {24 console.log(data);25});26var wptools = require('wptools');27var cast = wptools.cast('Mickey Mouse');28cast.get(function(err, data) {29 console.log(data);30});31var wptools = require('wptools');32var cast = wptools.cast('Mickey Mouse');33cast.get(function(err, data) {34 console.log(data);35});36var wptools = require('wptools');37var cast = wptools.cast('Mickey Mouse');38cast.get(function(err, data) {39 console.log(data);40});41var wptools = require('wptools');42var cast = wptools.cast('Mickey Mouse');43cast.get(function(err, data) {44 console.log(data);45});46var wptools = require('wptools');
Using AI Code Generation
1var wptoolkit = require('wptoolkit');2var cast = wptoolkit.cast;3var str = '123';4var num = cast(str, 'number');5var wptoolkit = require('wptoolkit');6var cast = wptoolkit.cast;7var str = '123';8var num = cast(str, 'number');9var wptoolkit = require('wptoolkit');10var cast = wptoolkit.cast;11var str = '123';12var num = cast(str, 'number');13var wptoolkit = require('wptoolkit');14var cast = wptoolkit.cast;15var str = '123';16var num = cast(str, 'number');17var wptoolkit = require('wptoolkit');18var cast = wptoolkit.cast;19var str = '123';20var num = cast(str, 'number');21var wptoolkit = require('wptoolkit');22var cast = wptoolkit.cast;23var str = '123';24var num = cast(str, 'number');25var wptoolkit = require('wptoolkit');26var cast = wptoolkit.cast;27var str = '123';28var num = cast(str, 'number');
Using AI Code Generation
1const wptools = require('wptools');2var cast = wptools.cast('Amitabh Bachchan');3console.log(cast);4const wptools = require('wptools');5var cast = wptools.cast('Amitabh Bachchan').then(function (res) {6 console.log(res);7});8const wptools = require('wptools');9var cast = wptools.cast('Amitabh Bachchan');10cast.then(function (res) {11 console.log(res);12});13const wptools = require('wptools');14var cast = wptools.cast('Amitabh Bachchan').then(function (res) {15 console.log(res);16}).catch(function (err) {17 console.log(err);18});19const wptools = require('wptools');20var cast = wptools.cast('Amitabh Bachchan').then(function (res) {21 console.log(res);22}).catch(function (err) {23 console.log(err);24});25const wptools = require('wptools');26var cast = wptools.cast('Amitabh Bachchan').then(function (res) {27 console.log(res);28}).catch(function (err) {29 console.log(err);30});31const wptools = require('wptools');32var cast = wptools.cast('Amitabh Bachchan').then(function (res) {33 console.log(res);34}).catch(function (err) {35 console.log(err);36});
Using AI Code Generation
1var wpt = require('webpagetest');2var wpt = new WebPageTest('www.webpagetest.org', 'A.3d6e7f8b9c10d11e12f13ab14cd15e16f17');3}, function(err, data) {4 if (err) return console.error(err);5 console.log('Test status:', data.statusText);6 wpt.getTestResults(data.data.testId, function(err, data) {7 if (err) return console.error(err);8 console.log('Test results:', data);9 });10});11var wpt = require('webpagetest');12var wpt = new WebPageTest('www.webpagetest.org', 'A.3d6e7f8b9c10d11e12f13ab14cd15e16f17');13}, function(err, data) {14 if (err) return console.error(err);15 console.log('Test status:', data.statusText);16 wpt.getTestResults(data.data.testId, function(err, data) {17 if (err) return console.error(err);18 console.log('Test results:', data);19 });20});21var wpt = require('webpagetest');22var wpt = new WebPageTest('www.webpagetest.org', 'A.3d6e7f8b9c10d11e12f13ab14cd15e16f17');23}, function(err, data) {24 if (err) return console.error(err);
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!