// This mock provides a way to intercept renderer <-> browser mojo messages for // navigator.subApps.* calls eliminating the need for an actual browser. // // In Chromium-based browsers this implementation is provided by a polyfill // in order to reduce the amount of test-only code shipped to users. 'use strict'; let mockSubAppsService = null; // TODO(crbug.com/1408101): Figure out how to export SubAppsServiceResult (and // get rid of this). const Status = { SUCCESS: 0, FAILURE: 1, }; async function createMockSubAppsService(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value) { if (typeof SubAppsServiceTest === 'undefined') { // Load test-only API helpers. const script = document.createElement('script'); script.src = '/resources/test-only-api.js'; script.async = false; const p = new Promise((resolve, reject) => { script.onload = () => { resolve(); }; script.onerror = e => { reject(e); }; }) document.head.appendChild(script); await p; if (isChromiumBased) { // Chrome setup. await import('/resources/chromium/mock-subapps.js'); } else { throw new Error('Unsupported browser.'); } } assert_implements(SubAppsServiceTest, 'SubAppsServiceTest is not loaded properly.'); if (mockSubAppsService === null) { mockSubAppsService = new SubAppsServiceTest(); mockSubAppsService.initialize(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value); } } function subapps_test(func, description) { promise_test(async test => { test.add_cleanup(async () => { await mockSubAppsService.reset(); mockSubAppsService = null; }); await createMockSubAppsService(Status.SUCCESS, [], [], []); await func(test, mockSubAppsService); }, description); } async function subapps_add_expect_reject_with_result(t, add_call_params, mocked_response, expected_results) { t.add_cleanup(async () => { await mockSubAppsService.reset(); mockSubAppsService = null; }); await createMockSubAppsService(Status.FAILURE, mocked_response, [], []); await navigator.subApps.add(add_call_params).then( result => { assert_unreached("Should have rejected: ", result); }, error => { for (const app_id in expected_results) { assert_own_property(error, app_id, "Return results are missing entry for subapp.") assert_equals(error[app_id], expected_results[app_id], "Return results are not as expected.") } }); } async function subapps_add_expect_success_with_result(t, add_call_params, mocked_response, expected_results) { t.add_cleanup(async () => { await mockSubAppsService.reset(); mockSubAppsService = null; }); await createMockSubAppsService(Status.SUCCESS, mocked_response, [], []); await navigator.subApps.add(add_call_params).then(result => { for (const app_id in expected_results) { assert_own_property(result, app_id, "Return results are missing entry for subapp.") assert_equals(result[app_id], expected_results[app_id], "Return results are not as expected.") } }); } async function subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results) { t.add_cleanup(async () => { await mockSubAppsService.reset(); mockSubAppsService = null; }); await createMockSubAppsService(Status.FAILURE, [], [], mocked_response); await navigator.subApps.remove(remove_call_params).then( result => { assert_unreached("Should have rejected: ", result); }, error => { for (const app_id in expected_results) { assert_own_property(error, app_id, "Return results are missing entry for subapp.") assert_equals(error[app_id], expected_results[app_id], "Return results are not as expected.") } }); } async function subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results) { t.add_cleanup(async () => { await mockSubAppsService.reset(); mockSubAppsService = null; }); await createMockSubAppsService(Status.SUCCESS, [], [], mocked_response); await navigator.subApps.remove(remove_call_params).then(result => { for (const app_id in expected_results) { assert_own_property(result, app_id, "Return results are missing entry for subapp.") assert_equals(result[app_id], expected_results[app_id], "Return results are not as expected.") } }); }