Publish Vulpes Preview 15 sources for desktop, Android and Tundra

Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,7 @@
{
"thumbnail": {
"format": "image/jpeg",
"size": 65,
"quality": 1
}
}

View file

@ -0,0 +1,9 @@
{
"defaultContactsOrder": "givenName",
"facebookEnabled": true,
"operationsTimeout": 25000,
"logLevel": "DEBUG",
"facebookSyncPeriod": 24,
"testToken": "",
"defaultImage": true
}

View file

@ -0,0 +1,22 @@
{
"default": {
"steps": [
{
"image": "/style/images/tutorial/1_large.png",
"l10nKey": "tutorial-step1-large-3"
},
{
"image": "/style/images/tutorial/2_large.png",
"l10nKey": "tutorial-step2-large-2"
},
{
"image": "/style/images/tutorial/3_large.png",
"l10nKey": "tutorial-step3-large-2"
},
{
"image": "/style/images/tutorial/4_large.png",
"l10nKey": "tutorial-step4-large-2"
}
]
}
}

View file

@ -0,0 +1,38 @@
{
"default": {
"steps": [
{
"video": "/style/images/tutorial/Homescreen.mp4",
"l10nKey": "tutorial-homescreen-tiny"
},
{
"video": "/style/images/tutorial/Notifications.mp4",
"l10nKey": "tutorial-notifications-v2-tiny"
},
{
"video": "/style/images/tutorial/Sheets.mp4",
"l10nKey": "tutorial-sheets-tiny"
},
{
"video": "/style/images/tutorial/Universal_Search.mp4",
"l10nKey": "tutorial-rocketbar-tiny"
}
]
},
"2.0..2.6": {
"steps": [
]
},
"2.1..2.6": {
"steps": [
]
},
"2.2..2.6": {
"steps": [
]
},
"2.5..2.6": {
"steps": [
]
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,626 @@
<!DOCTYPE html>
<html lang="en-US" dir="ltr">
<head>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
<meta charset="utf-8">
<meta name="theme-color" content="#eeeeee">
<!-- Common style -->
<link rel="stylesheet" href="/shared/style/input_areas.css">
<link rel="stylesheet" href="/shared/style/buttons.css">
<link rel="stylesheet" href="/shared/style/confirm.css">
<link rel="stylesheet" href="/shared/style/lists.css">
<link rel="stylesheet" href="/shared/style/progress_activity.css">
<link rel="stylesheet" href="/shared/style/status.css">
<link rel="stylesheet" href="/shared/style/animations.css">
<!-- Specific style -->
<link rel="stylesheet" href="style/style.css">
<link rel="stylesheet" href="style/status.css">
<link rel="stylesheet" href="style/overlay.css">
<link rel="stylesheet" href="style/extensions.css">
<link rel="stylesheet" href="style/tutorial.css">
<link rel="stylesheet" href="style/responsive.css">
<link rel="stylesheet" href="/shared/pages/import/style/curtain_frame.css">
<title>Welcome to Browser OS</title>
<!-- Localization -->
<link rel="resource" type="image/png" href="/shared/resources/branding/logosmall.png">
<link rel="resource" type="image/png" href="/shared/resources/branding/powered.png">
<link rel="resource" type="image/png" href="/shared/resources/branding/privacy_sprite.png">
<meta name="defaultLanguage" content="en-US">
<meta name="availableLanguages" content="ar:201601260729, bg:201601260729, bn-BD:201601260729, ca:201601260729, cs:201601260729, da:201601260729, de:201601260729, el:201601260729, en-US:201601260729, es:201601260729, eu:201601260729, fr:201601260729, gl:201601260729, hr:201601260729, hu:201601260729, it:201601260729, ja:201601260729, km:201601260729, ko:201601260729, lt:201601260729, mk:201601260729, ms:201601260729, ne-NP:201601260729, nl:201601260729, pa:201601260729, pl:201601260729, pt-BR:201601260729, ro:201601260729, ru:201601260729, sk:201601260729, sq:201601260729, sr-Cyrl:201601260729, sr-Latn:201601260729, sv-SE:201601260729, tr:201601260729, zh-CN:201601260729, zh-TW:201601260729">
<link rel="localization" href="/locales-obj/index.{locale}.json">
<!-- This is needed for not duplicating SIM Import locales -->
<link rel="resource" type="application/json" href="/shared/resources/tz.json">
<link rel="resource" type="application/json" href="/shared/resources/languages.json">
<link rel="resource" type="application/json" href="/shared/resources/keyboard_layouts.json">
<link rel="resource" type="application/json" href="/shared/resources/apn.json">
<link rel="resource" type="application/json" href="/shared/resources/apn_tz.json">
<!-- <script defer="" src="/shared/js/intl/l20n.js"></script> -->
<!-- <script defer="" src="/shared/js/tz_select.js"></script> -->
<!-- <script defer="" src="/shared/js/sanitizer.js"></script> -->
<!-- <script defer="" src="/shared/js/input_mgmt/input_app_list.js"></script> -->
<!-- <script defer="" src="/shared/js/keyboard_helper.js"></script> -->
<!-- <script defer="" src="/shared/js/language_list.js"></script> -->
<!-- <script defer="" src="/shared/js/settings_listener.js"></script> -->
<!-- <script defer="" src="/shared/js/version_helper.js"></script> -->
<!-- <script defer="" src="/shared/js/event_safety.js"></script> -->
<!-- <script defer="" src="/shared/js/date_time_helper.js"></script> -->
<!-- Import contacts help files -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/status.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/overlay.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/config.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/misc.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/sdcard.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/vcard_parser.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/import_from_vcard.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/utilities/import_sim_contacts.js"></script> -->
<!-- Code for the FTU App -->
<!-- <script defer="" src="/shared/js/screen_layout.js"></script> -->
<!-- <script defer="" src="/shared/js/text_normalizer.js"></script> -->
<!-- <script defer="" src="/shared/js/lazy_loader.js"></script> -->
<!-- <script defer="" src="/shared/js/basket_client.js"></script> -->
<!-- <script defer="" src="js/services_launcher.js"></script> -->
<!-- <script defer="" src="/shared/js/contacts/import/import_status_data.js"></script> -->
<!-- <script defer="" src="/shared/js/async_storage.js"></script> -->
<!-- <script defer="" src="/shared/js/mobile_operator.js"></script> -->
<!-- <script defer="" src="/shared/js/icc_helper.js"></script> -->
<!-- <script defer="" src="/shared/js/wifi_helper.js"></script> -->
<!-- <script defer="" src="/shared/js/fxa_iac_client.js"></script> -->
<!-- <script defer="" src="js/sim_manager.js"></script> -->
<!-- <script defer="" src="js/memcard_manager.js"></script> -->
<!-- <script defer="" src="js/wifi.js"></script> -->
<!-- <script defer="" src="js/import_services.js"></script> -->
<!-- <script defer="" src="js/utils.js"></script> -->
<!-- <script defer="" src="js/finish_screen.js"></script> -->
<!-- <script defer="" src="js/tutorial_utils.js"></script> -->
<!-- <script defer="" src="js/tutorial.js"></script> -->
<!-- <script defer="" src="js/navigation.js"></script> -->
<!-- <script defer="" src="js/data_mobile.js"></script> -->
<!-- <script defer="" src="js/time.js"></script> -->
<!-- <script defer="" src="js/ui.js"></script> -->
<!-- <script defer="" src="js/language.js"></script> -->
<!-- <script defer="" src="js/app.js"></script> -->
<!-- <script defer="" src="js/operatorVariant.js"></script> -->
<!-- Confirm dialogs BB library -->
<!-- <script defer="" src="/shared/js/confirm.js"></script> -->
<!-- Components -->
<!-- <script defer="" src="/shared/js/component_utils.js"></script> -->
<!-- <script defer="" src="/shared/elements/gaia_switch/script.js"></script> -->
<!-- <script defer="" src="/shared/elements/gaia_checkbox/script.js"></script> -->
<!-- <script defer="" src="/shared/elements/gaia_radio/script.js"></script> -->
<!-- <script defer="" src="/shared/elements/gaia_buttons/script.js"></script> -->
<!-- <script defer="" src="/shared/elements/gaia_subheader/script.js"></script> -->
<!-- <script defer="" src="/shared/elements/config.js"></script> -->
<!-- <link rel="stylesheet" type="text/css" href="/shared/elements/gaia-icons/gaia-icons.css" /> -->
<link rel="stylesheet" type="text/css" href="app://theme.gaiamobile.org/shared/elements/gaia-theme/gaia-theme.css">
<!-- <script defer="" src="/shared/elements/gaia-header/dist/gaia-header.js"></script> -->
<!-- Late Customization -->
<!-- <script defer="" src="/shared/js/icons_helper.js"></script> -->
<!-- <script defer="" src="js/late_customization.js"></script> --><script src="./gaia_build_defer_index.js" defer="" type="text/javascript"></script>
<link rel="stylesheet" href="style/late_customization.css">
<!--
<link href="/shared/pages/import/import.html">
<link href="/shared/pages/import/curtain.html">
<link href="/shared/pages/import/oauth.html">
-->
<!--
<link href="/shared/js/simple_phone_matcher.js">
<link href="/shared/js/mime_mapper.js">
<link href="/shared/js/contact_photo_helper.js">
<link href="/shared/js/contacts/contacts_matcher.js">
<link href="/shared/js/contacts/contacts_merger.js">
<link href="/shared/js/contacts/utilities/image_thumbnail.js">
<link href="/shared/js/contacts/merger_adapter.js">
<link href="/shared/js/contacts/utilities/http_rest.js">
-->
<meta content="2.5" name="appVersion"></head>
<body id="container" class="theme-settings" aria-hidden="true">
<section id="splash-screen" role="region" class="show">
</section>
<section id="unlock-sim-screen" role="region" class="skin-organic">
<gaia-header id="unlock-sim-action" action="back">
<h1 id="unlock-sim-header"></h1>
</gaia-header>
<article role="main">
<section id="pincode-screen" role="region">
<label id="pin-label"></label>
<label id="pin-retries-left" class="retries hidden"></label>
<section class="input-wrapper">
<input id="pin-input" name="simpin" x-inputmode="digit" size="8" maxlength="8" type="password">
<label id="pin-error" class="hidden error">
<span data-l10n-id="pinError" class="main">The PIN was incorrect.</span>
<span data-l10n-id="pinLastChanceMsg" class="lastchance hidden">This is your last chance to enter the correct PIN. Otherwise, you must enter the PUK code to use this SIM card.</span>
</label>
</section>
</section>
<section id="pukcode-screen" role="region">
<label id="puk-label"></label>
<label id="puk-retries-left" class="retries hidden"></label>
<section class="input-wrapper">
<input id="puk-input" name="simpuk" x-inputmode="digit" size="8" maxlength="8" type="password">
<div id="puk-info" data-l10n-id="pukInfo" class="info">You must enter the Personal Unlocking Key (PUK) Code for the SIM card. Refer to your SIM card documentation or contact your carrier for more information.</div>
<div id="puk-error" class="hidden error">
<span data-l10n-id="pukError" class="main">The PUK was incorrect.</span>
<span data-l10n-id="pukLastChanceMsg" class="lastchance hidden">This is your last chance to enter the correct PUK code. Your SIM card will be permanently unusable if you enter in the wrong PUK code.</span>
</div>
</section>
<label id="newpin" data-l10n-id="create_newpin">Create new PIN (4 to 8 digits)</label>
<section class="input-wrapper">
<input id="newpin-input" name="newpin" x-inputmode="digit" size="8" maxlength="8" type="password">
<label id="newpin-error" data-l10n-id="pinValidation" class="hidden error">PIN must have between 4 and 8 characters.</label>
</section>
<label id="confirm-newpin" data-l10n-id="confirm_newpin">Confirm new PIN</label>
<section class="input-wrapper">
<input id="confirm-newpin-input" name="confirm-newpin" x-inputmode="digit" size="8" maxlength="8" type="password">
<label id="confirm-newpin-error" data-l10n-id="confirm_newpin" class="hidden error">Confirm new PIN</label>
</section>
</section>
<section id="xckcode-screen" role="region">
<label id="xck-label" data-l10n-id="type_nck">Type your NCK code</label>
<label id="xck-retries-left" class="hidden retries"></label>
<section class="input-wrapper">
<input id="xck-input" name="simxck" x-inputmode="digit" size="16" maxlength="16" type="password">
<label id="xck-error" class="hidden error">
<span data-l10n-id="confirm_newpin" class="main">Confirm new PIN</span>
<span data-l10n-id="nckLastChanceMsg" class="lastchance hidden">Network depersonalization request failure. Last chance to enter the correct NCK code. Refer to your device documentation or contact your carrier for more information.</span>
</label>
</section>
</section>
</article>
<gaia-buttons class="nav">
<button id="skip-pin-button" class="button-left" data-l10n-id="skip">Skip</button>
<button id="back-sim-button" class="button-left back hidden" data-l10n-id="back">Back</button>
<button id="unlock-sim-button" class="recommend" data-l10n-id="ok">OK</button>
</gaia-buttons>
</section>
<section id="sim-info-screen" role="region" class="skin-organic">
<gaia-header>
<h1 id="sim-info-header" data-l10n-id="simManager">SIM Manager</h1>
</gaia-header>
<article role="main">
<section>
<section id="sim-info-1" class="sim-info">
<div class="sim-image"></div>
<div class="sim-details">
<p class="sim-title">
<span data-l10n-id="simDetail" data-l10n-args="{&quot;n&quot;: &quot;1&quot;}">SIM ⁨1⁩</span>
<span data-l10n-id="simDefault" class="default">(default)</span>
</p>
<p id="sim-carrier-1" class="sim-carrier"></p>
<p id="sim-number-1" class="sim-number"></p>
</div>
</section>
<section id="sim-info-2" class="sim-info">
<div class="sim-image"></div>
<div class="sim-details">
<p class="sim-title">
<span data-l10n-id="simDetail" data-l10n-args="{&quot;n&quot;: &quot;2&quot;}">SIM ⁨2⁩</span>
</p>
<p id="sim-carrier-2" class="sim-carrier"></p>
<p id="sim-number-2" class="sim-number"></p>
</div>
</section>
</section>
<section id="sim-info-messages">
<p id="sim-default-message" data-l10n-id="simDefaultMessage">Outgoing calls, outgoing messages and data connection are set to SIM 1 as default</p>
<p id="sim-settings-message" data-l10n-id="simSettingsMessage">You can change default settings at Settings &gt; SIM manager</p>
</section>
</article>
<gaia-buttons class="nav">
<button id="sim-info-back" class="button-left icon icon-previous" data-l10n-id="navbar-back">Back</button>
<button id="sim-info-forward" class="recommend icon icon-next" data-l10n-id="navbar-next">Next</button>
</gaia-buttons>
</section>
<section id="activation-screen" role="region" class="skin-organic no-options">
<gaia-header>
<h1 id="main-title"></h1>
<button id="wifi-refresh-button" data-l10n-id="refresh">Refresh</button>
</gaia-header>
<article role="main">
<section role="region" id="languages">
<article data-type="list">
<ul>
<!-- filled by js/language.js -->
</ul>
</article>
</section>
<section role="region" id="data_3g">
<article data-type="list">
<ul>
<li>
<gaia-switch id="data-connection-switch">
<label data-l10n-id="dataConnection">Enable Data</label>
</gaia-switch>
</li>
</ul>
</article>
<gaia-subheader id="dataCaution" skin="organic">
<span data-l10n-id="caution">Warning</span></gaia-subheader>
<section class="content">
<p id="dataExplanation" data-l10n-id="dataConnectionInfo">Enabling data connection now will allow you to set up your phone without a Wi-Fi connection. You may also enable it later on in Settings. Just make sure you have a data plan with your carrier to avoid potentially hefty charges.</p>
</section>
</section>
<section role="region" id="wifi">
<div id="wifi-wrapper" role="main">
<article id="networks">
</article>
<button id="join-hidden-button" data-l10n-id="join-hidden-button">Join hidden network</button>
</div>
</section>
<section role="region" id="configure_network">
<section id="configure_network_params">
<form data-type="list">
<ul>
<li class="hidden">
<input id="wifi_ssid" value="" dir="auto" type="text">
</li>
<li>
<label id="label_wifi_user" for="wifi_user" data-l10n-id="identity">User</label>
<input id="wifi_user" data-l10n-id="identityInput" placeholder="User" x-inputmode="verbatim" dir="auto" type="text">
</li>
<li>
<label for="wifi_password" data-l10n-id="password">Password</label>
<input id="wifi_password" data-l10n-id="passwordInput" placeholder="Password" value="" maxlength="63" x-inputmode="verbatim" type="password">
<gaia-checkbox class="inline" id="label_show_password" name="show_password">
<label id="wifi_show_password" data-l10n-id="showPassword">Show Password</label>
</gaia-checkbox>
</li>
</ul>
</form>
</section>
</section>
<section role="region" id="hidden-wifi-authentication">
<div>
<form data-type="list">
<ul>
<li>
<label id="label_wifi_ssid" for="hidden-wifi-ssid" data-l10n-id="ssid-name">SSID Network Name</label>
<input name="wifi_ssid" id="hidden-wifi-ssid" dir="auto" type="text">
</li>
<li>
<label id="label_wifi_security" for="hidden-wifi-security" data-l10n-id="security">Security</label>
<span class="button icon icon-dialog">
<select id="hidden-wifi-security">
<option data-l10n-id="securityNone">None</option>
<option data-l10n-id="securityWEP">WEP</option>
<option data-l10n-id="securityWPA-PSK" selected="">WPA-PSK</option>
<option data-l10n-id="securityWPA-EAP">WPA-EAP</option>
</select>
</span>
</li>
<li class="hidden" id="hidden-wifi-identity-box">
<label id="label_wifi_identity" for="hidden-wifi-identity" data-l10n-id="identity">User</label>
<input name="wifi_identity" id="hidden-wifi-identity" dir="auto" type="text">
</li>
<li id="hidden-wifi-password-box">
<label id="label_hidden_wifi_password" for="hidden-wifi-password" data-l10n-id="password">Password</label>
<input name="wifi_hidden_password" id="hidden-wifi-password" value="" x-inputmode="verbatim" maxlength="63" type="password">
<gaia-checkbox class="inline" id="hidden-wifi-show-password">
<label data-l10n-id="showPassword">Show Password</label>
</gaia-checkbox>
</li>
</ul>
</form>
</div>
</section>
<section role="region" id="date_and_time">
<section id="time_zone_overlay" class="gmt0">
</section>
<section id="time_zone_map">
<h1 data-l10n-id="timeZone">Time zone</h1>
<h2 id="time-zone-title">
UTC +00:00 Greenwich Mean Time
</h2>
</section>
<form id="time-form" data-type="list">
<ul>
<!-- timezones -->
<li>
<p id="tz-region-label" aria-label="Region" data-l10n-id="region"></p>
<select id="tz-region" class="invisible"></select>
<button id="tz-region-button" class="change icon icon-dialog" data-l10n-id="change" type="button" aria-describedby="tz-region-label">Change</button>
</li>
<li>
<p id="tz-city-label" aria-label="City" data-l10n-id="city">GMT</p>
<select id="tz-city" class="invisible"></select>
<button id="tz-city-button" class="change icon icon-dialog" data-l10n-id="change" type="button" aria-describedby="tz-city-label">Change</button>
</li>
<!-- date/time -->
<li>
<p id="date-configuration-label" aria-label="Date" data-l10n-id="date"></p>
<input id="date-configuration" class="invisible" min="1970-1-1" max="2037-12-31" type="date">
<button id="date-configuration-button" class="change icon icon-dialog" data-l10n-id="change" aria-describedby="date-configuration-label">Change</button>
</li>
<li>
<p id="time-configuration-label" aria-label="Time" data-l10n-id="time">00:00</p>
<input id="time-configuration" class="invisible" type="time">
<button id="time-configuration-button" class="change icon icon-dialog" data-l10n-id="change" type="button" aria-describedby="time-configuration-label">Change</button>
</li>
</ul>
</form>
</section>
<section role="region" id="geolocation">
<article data-type="list">
<ul>
<li>
<gaia-switch id="geolocation-switch" name="geolocation.enabled" checked="">
<label data-l10n-id="geolocationCheckbox">Enable Geolocation</label>
</gaia-switch>
</li>
</ul>
</article>
<gaia-subheader id="geolocationNotice" skin="organic">
<span data-l10n-id="notice">Notice</span></gaia-subheader>
<section class="content">
<p id="geolocationInfo" data-l10n-id="geolocationInfo2">⁨Foxfood⁩ uses data such as GPS, Wi-Fi, and mobile networks near you to help determine your approximate location.</p>
<p id="geolocationInfoMore" data-l10n-id="geolocationInfoMore">Data is sent to Mozilla and other service providers and will be used in the aggregate to improve those location databases. Data may be stored on your device and data collection may occur even when no apps are running.</p>
<p><a href="#about-your-privacy" data-l10n-id="aboutYourPrivacy">More about your privacy</a></p>
</section>
</section>
<section role="region" id="import_contacts">
<article data-type="list">
<ul>
<li id="sim-import" class="importOption">
<button id="sim-import-button" class="icon icon-sim" data-l10n-id="importSim2">SIM card</button>
<p id="no-sim" data-l10n-id="noSimMsg">To import contacts insert or unlock your SIM card</p>
</li>
<li id="sd_import" class="importOption">
<button id="sd-import-button" class="icon icon-sd" data-l10n-id="importMemoryCard">Memory card</button>
<p id="no-memorycard" data-l10n-id="noMemoryCardMsg">To import contacts insert a memory card</p>
</li>
<li id="gmail_import" class="importOption">
<button id="gmail-import-button" class="icon icon-gmail" data-l10n-id="importGmail">Gmail</button>
</li>
<li id="live_import" class="importOption">
<button id="live-import-button" class="icon icon-wlive" data-l10n-id="importOutlook">Outlook</button>
</li>
</ul>
</article>
</section>
<section role="region" id="firefox_accounts">
<div class="fxa-logo"></div>
<p data-l10n-id="fxa-upsell" id="fxa-intro">A Firefox Account lets you find a lost phone and buy apps from the Firefox Marketplace.</p>
<p>
<button id="fxa-create-account" data-l10n-id="fxa-create-account-or-sign-in">Create Account or Sign In</button>
</p>
</section>
<section role="region" id="about-your-rights">
<p data-l10n-id="about-your-rights-0">⁨Foxfood⁩ is built on free and open source software by a community of thousands from all over the world. There are a few things you should know:</p>
<p data-l10n-id="about-your-rights-1">⁨Foxfood⁩ is made available to you under the terms of several open source licenses including the Mozilla Public License. A device running ⁨Foxfood⁩ may also contain proprietary software from third parties. Any code provided under open licenses give you the right to modify the source code and distribute your modified versions as long as you comply with their terms.</p>
<p data-l10n-id="about-your-rights-2">You are not granted any trademark rights or licenses to the trademarks of the Mozilla Foundation or any party, including without limitation the ⁨Foxfood⁩ name or logo.</p>
<p data-l10n-id="about-your-rights-3">Some features in ⁨Foxfood⁩, such as the Crash Reporter, give you the option to provide feedback to Mozilla. By choosing to submit feedback, you give Mozilla permission to use the feedback to improve its products, to publish the feedback on its websites, and to distribute the feedback.</p>
</section>
<section role="region" id="about-your-privacy">
<i class="hack-first-child"></i> <!-- see Bug 819886 -->
<article data-type="list">
<ul>
<li>
<a class="privacy-menuitem privacy-browserOS external" href="https://www.mozilla.org/privacy/firefox-os" data-l10n-id="privacy-b2g" title="⁨Foxfood⁩">⁨Foxfood⁩</a>
</li>
<li>
<a class="privacy-menuitem privacy-marketPlace external" href="https://marketplace.firefox.com/privacy-policy" data-l10n-id="privacy-marketplace" title="⁨Marketplace⁩">Marketplace</a>
</li>
</ul>
</article>
</section>
<section role="region" id="sharing-performance-data">
<p data-l10n-id="telemetry-sends2">Telemetry sends Mozilla data about performance, hardware, configurations, customizations and app usage in your ⁨Foxfood⁩ device. We use this to make our products better, faster and more responsive.</p>
<!-- Links destinations are discussed in https://bugzilla.mozilla.org/show_bug.cgi?id=812956 -->
<p data-l10n-id="learn-more-telemetry2" data-l10n-args="{&quot;url&quot;: &quot;www.mozilla.org/telemetry&quot;}">Learn more at <a href="http://www.mozilla.org/telemetry" class="external">⁨www.mozilla.org/telemetry⁩</a></p>
<p data-l10n-id="learn-more-information2" data-l10n-args="{&quot;url&quot;: &quot;www.mozilla.org/privacy&quot;}">Learn how Mozilla handles your information at <a href="http://www.mozilla.org/privacy" class="external">⁨www.mozilla.org/privacy⁩</a></p>
</section>
<section role="region" id="SIM_mandatory">
<p data-l10n-id="SIM_mandatory_warm">Please, insert a SIM card and reboot your phone.</p>
</section>
<section role="region" id="browser_privacy">
<p data-l10n-id="mozillaCommunity2">When you use ⁨Foxfood⁩, you become part of a global community helping to build a brighter future for the Web. If you’d like to know more about the Mozilla community, our other products and events near you, please enter your email address below.</p>
<section id="newsletter-form">
<input data-l10n-id="emailAddress" placeholder="Email address" id="newsletter-input" type="email">
</section>
<section id="newsletter-success-screen">
<p data-l10n-id="email-successfully-added">Email successfully added</p>
</section>
<p data-l10n-id="learn-more-privacy2">Learn how Mozilla handles your information in our <a href="http://www.mozilla.org/privacy/firefox-os" class="external">privacy policy</a>.</p>
</section>
<section role="region" id="welcome_browser">
<section id="browser_logo_horizontal">
<img src="/shared/resources/branding/logosmall.png" role="presentation">
</section>
<p data-l10n-id="helpImprove3">Help us improve our products and services by automatically sending analytics data.</p>
<p data-l10n-id="learn-more-privacy3">Read our <a href="http://www.mozilla.org/privacy/firefox-os" class="external">Privacy Notice</a></p>
<section id="form_share_statistics">
<ul>
<li id="menuItem-basicmetrics">
<gaia-radio name="metricsGroup" id="metrics-basic" value="Basic">
<label data-l10n-id="basicMetricsRadio">Basic</label>
<details data-l10n-id="basicMetricsExplain">Send app usage and error reports.</details>
</gaia-radio>
</li>
<li id="menuItem-enhancedMetrics">
<gaia-radio name="metricsGroup" id="metrics-enhanced" value="Enhanced">
<label data-l10n-id="enhancedMetricsRadio">Enhanced</label>
<details data-l10n-id="enhancedMetricsExplain">Send Basic report plus diagnostic information.</details>
</gaia-radio>
</li>
<li id="menuItem-noneMetrics">
<gaia-radio name="metricsGroup" id="metrics-none" value="None">
<label data-l10n-id="noneMetricsRadio">None</label>
<details data-l10n-id="noneMetricsExplain">Do not send any data.</details>
</gaia-radio>
</li>
</ul>
</section>
</section>
</article>
<gaia-buttons id="nav-bar" class="nav forward-only">
<button id="back" class="button-left icon icon-previous" data-l10n-id="navbar-back">Back</button>
<button id="forward" class="recommend icon icon-next" data-l10n-id="navbar-next">Next</button>
<button id="wifi-join-button" class="recommend" data-l10n-id="navbar-join">Join</button>
</gaia-buttons>
</section>
<section id="finish-screen" class="finish-screen-base" role="region">
<section class="content">
<!-- for tiny devices -->
<div class="for-tiny">
<h1 data-l10n-id="startYourPhone">Start your phone tour!</h1>
<h2 data-l10n-id="joinTutorial">Join us for a quick tutorial about your new phone.</h2>
<p data-l10n-id="optionsAvailable">You can change the language, date/time and Wi-Fi connection in settings.</p>
</div>
<!-- for large devices -->
<div class="for-large">
<p data-l10n-id="startYourTablet">Start your tablet tour!</p>
</div>
</section>
<gaia-buttons skin="dark" class="nav">
<button id="skip-tutorial-button" class="button-left" data-l10n-id="skip">Skip</button>
<button id="lets-go-button" class="recommend" data-l10n-id="startTour">Start tour</button>
</gaia-buttons>
</section>
<section id="update-screen" class="finish-screen-base" role="region">
<section class="content">
<h1 data-l10n-id="startYourPhone">Start your phone tour!</h1>
<p data-l10n-id="joinTutorialUpdated">Join us for a quick tutorial about the updates to your phone!</p>
</section>
<gaia-buttons skin="dark" class="nav">
<button id="update-skip-tutorial-button" class="button-left" data-l10n-id="skip">Skip</button>
<button id="update-lets-go-button" class="recommend" data-l10n-id="startTour">Start tour</button>
</gaia-buttons>
</section>
<section id="tutorial" role="region" data-step="1">
<article id="tutorial-steps-container" role="main">
<section id="tutorial-step-header">
<p id="tutorial-step-title">
</p>
</section>
<section id="tutorial-step-media">
<img id="tutorial-step-image" class="step-img-base" role="presentation">
<video id="tutorial-step-video" class="step-video-base" role="presentation" autoplay="" loop="" hidden=""></video>
</section>
</article>
<gaia-buttons id="tutorial-nav-bar" class="nav" skin="dark">
<button id="back-tutorial" class="button-left icon icon-previous" data-l10n-id="navbar-back">Back</button>
<button id="forward-tutorial" class="recommend icon icon-next" data-l10n-id="navbar-next">Next</button>
</gaia-buttons>
</section>
<section id="tutorial-finish-tiny" class="tutorial-finish-base" role="region">
<section class="content">
<h1 data-l10n-id="thatsIt">That’s it!</h1>
<h2 id="enjoyYourPhone" data-l10n-id="enjoyYourPhone">You’re ready to enjoy your new phone.</h2>
<h2 id="enjoyYourPhoneUpdated" data-l10n-id="enjoyYourPhoneUpdated" hidden="">You’re ready to enjoy your updated phone.</h2>
</section>
<gaia-buttons skin="dark" class="forward-only">
<button class="recommend" id="tutorialFinished" data-l10n-id="letsGo">Let’s go</button>
</gaia-buttons></section>
<section id="tutorial-finish-large" class="tutorial-finish-base" role="region">
<section class="content">
<p data-l10n-id="thatsIt1Tablet-2">You can always swipe from the bottom edge to enter home screen.</p>
<p data-l10n-id="thatsIt2Tablet-2">Let’s do it!</p>
</section>
</section>
<form role="dialog" data-type="confirm" id="offline-error-dialog">
<section>
<h1 data-l10n-id="offline-dialog-title">You must be connected to the Internet to view the page.</h1>
<p><small>Please go back and connect to
the Internet. You can also view the page later from Settings or by
entering {{url}} in any browser.</small></p>
<gaia-buttons skin="dark">
<button data-l10n-id="OK">OK</button>
</gaia-buttons>
</section>
</form>
<form role="dialog" data-type="confirm" id="offline-newsletter-error-dialog">
<section>
<h1 data-l10n-id="offline-newsletter-dialog-title">You must be connected to the Internet to subscribe to the newsletter.</h1>
<p><small data-l10n-id="offline-newsletter-dialog-text">Please go back and connect to the Internet.</small></p>
<gaia-buttons skin="dark">
<button data-l10n-id="OK">OK</button>
</gaia-buttons>
</section>
</form>
<form role="dialog" data-type="confirm" id="invalid-email-error-dialog">
<section>
<h1 data-l10n-id="invalid-email-dialog-title">Your email is not valid</h1>
<p><small data-l10n-id="invalid-email-dialog-text">Please go back and correct your entry.</small></p>
<gaia-buttons skin="dark">
<button data-l10n-id="OK">OK</button>
</gaia-buttons>
</section>
</form>
<form id="confirmation-message" class="hide" role="dialog" data-type="confirm">
<section>
<h1>Confirmation title</h1>
<p>Confirmation message</p>
</section>
<menu>
<button>Action 1</button>
<button>Action 2</button>
</menu>
</form>
<form data-type="confirm" id="loading-overlay" role="dialog" class="hide no-opacity">
<section id="progress-activity" class="hide">
<h1 id="progress-title"></h1>
<p role="status">
<span id="progress-msg"></span>
<progress id="progress-element" class="pack-activity" value="0" max="100"></progress>
</p>
<menu>
<button data-l10n-id="cancel" id="cancel-overlay">Cancel</button>
</menu>
</section>
</form>
<section id="statusMsg" role="status" class="ftu">
<p></p>
</section>
<iframe id="iframe_curtain" src="/shared/pages/import/curtain.html"></iframe>
<iframe id="iframe_oauth" src="/shared/pages/import/oauth.html" hidden=""></iframe>
<iframe id="iframe_extensions"></iframe>
</body>
</html>

View file

@ -0,0 +1,4 @@
;'use strict';var AppManager={EVENT_PREFIX:'ftu-',init:function init(versionInfo){window.performance.mark('initialize');this.isInitialized=true;LanguageManager.init();UIManager.init();Navigation.init();window.performance.mark('navigationLoaded');this.publish('setup');var splashTimeout=1025;var splashScreenHidden=this.whenEvent(UIManager.splashScreen,'transitionend',splashTimeout).then(()=>{UIManager.container.removeAttribute('aria-hidden');window.performance.mark('visuallyLoaded');});var languageListReady=this.whenEvent(window,'languagelistready');Promise.all([splashScreenHidden,languageListReady]).then(()=>{window.performance.mark('fullyLoaded');});if(versionInfo&&versionInfo.isUpgrade()){var stepsKey=versionInfo.delta();UIManager.changeStatusBarColor(UIManager.DARK_THEME);UIManager.splashScreen.classList.remove('show');UIManager.activationScreen.classList.remove('show');UIManager.updateScreen.classList.add('show');Tutorial.init(stepsKey,function(){Tutorial.start();});return;}
SimManager.init();WifiManager.init();ImportIntegration.init();TimeManager.init();DataMobile.init();Tutorial.init();var kSplashTimeout=700;var conn=window.navigator.mozMobileConnections&&window.navigator.mozMobileConnections[0];if(!conn){setTimeout(function(){window.location.hash='#';UIManager.activationScreen.classList.add('show');window.location.hash='#languages';UIManager.splashScreen.classList.remove('show');window.performance.mark('navigationInteractive');window.performance.mark('contentInteractive');},kSplashTimeout);return;}
setTimeout(function(){Navigation.manageStep();UIManager.activationScreen.classList.add('show');UIManager.splashScreen.classList.remove('show');window.performance.mark('navigationInteractive');window.performance.mark('contentInteractive');},kSplashTimeout);},whenEvent:function(target,name,timeoutMs){return new Promise((resolve,reject)=>{eventSafety(target,name,resolve,timeoutMs||1000);});},publish:function(name,detail){var evt=new CustomEvent(this.EVENT_PREFIX+name,{bubbles:true,detail:detail||this});window.dispatchEvent(evt);}};function init(){VersionHelper.getVersionInfo().then(function(versionInfo){if(!AppManager.isInitialized){AppManager.init(versionInfo);}else{UIManager.initTZ();if(!UIManager.mainTitle.hasAttribute('data-l10n-id')){UIManager.mainTitle.setAttribute('data-l10n-id','language');}}});}
init();document.addEventListener('DOMRetranslated',init);document.l10n.ready.then(()=>{window.performance.mark('l10nready');});

View file

@ -0,0 +1,5 @@
;'use strict';var DataMobile={key:'ril.data.enabled',keySV:'ftu.ril.data.enabled',STEP_DATA_3G:2,apnRetrieved:false,init:function dm_init(){var settings=navigator.mozSettings;if(!settings){console.log('Settings is not available');return;}
this.settings=settings;},removeSVStatusObserver:function dm_removeSVStatusObserver(){this.settings.removeObserver(this.keySV,this.getStatus);},getStatus:function dm_getStatus(aCallback){var self=this;var reqSV=this.settings.createLock().get(this.keySV);reqSV.onsuccess=function gst_svsuccess(){var svStatus=reqSV.result[self.keySV];if(svStatus!==undefined&&!UIManager.dataConnectionChangedByUsr){self.settings.removeObserver(self.keySV,self.getStatus);if(Navigation.currentStep===self.STEP_DATA_3G){self.toggle(svStatus);if(typeof aCallback==='function'){aCallback(svStatus);}}else{self.getRealStatus(aCallback);}}else{self.getRealStatus(aCallback);}};reqSV.onerror=function gst_error(){console.log('Error retrieving '+self.keySV);};this.settings.addObserver(this.keySV,this.getStatus.bind(this,aCallback));},getRealStatus:function dm_getRealStatus(callback){var request=this.settings.createLock().get(this.key);var self=this;request.onsuccess=function gst_success(){var currentStatus=request.result[self.key];self.isDataAvailable=currentStatus;callback(currentStatus);};request.onerror=function gst_error(){console.log('Error retrieving '+self.key);};},toggle:function dm_toggle(status,callback){var options={};options[this.key]=status;if(!this.apnRetrieved){var self=this;this.getAPN(function apn_recovered(){self.settings.createLock().set(options);self.apnRetrieved=true;self.isDataAvailable=status;if(callback){callback();}});return;}
this.settings.createLock().set(options);this.apnRetrieved=true;this.isDataAvailable=status;if(callback){callback();}},getAPN:function dm_getapn(callback){var _self=this;function ensureApnSettings(){var req=_self.settings.createLock().get('ril.data.apnSettings');req.onsuccess=function loadApn(){var apnSettings=req.result['ril.data.apnSettings'];if(apnSettings){if(callback){callback(req.result);}
_self.settings.removeObserver('ril.data.apnSettings',ensureApnSettings);}};}
ensureApnSettings();this.settings.addObserver('ril.data.apnSettings',ensureApnSettings);}};

View file

@ -0,0 +1,5 @@
;(function(exports){'use strict';var currentLayout='tiny';var elementIDs=['tutorialFinished','enjoyYourPhone','enjoyYourPhoneUpdated'];var dom={};var initialized=false;var FinishScreen={init:function(isUpgrade){if(initialized){return;}
if(ScreenLayout.getCurrentLayout()!=='tiny'){currentLayout='large';}
var panelSelector='tutorial-finish-'+currentLayout;var finishPanel=document.getElementById(panelSelector);finishPanel.classList.add('show');elementIDs.forEach(function(name){dom[Utils.camelCase(name)]=document.getElementById(name);},this);if(isUpgrade){dom.enjoyYourPhone.hidden=true;dom.enjoyYourPhoneUpdated.hidden=false;}
if(currentLayout==='tiny'){dom.tutorialFinished.addEventListener('click',function ftuEnd(){window.close();});}else{navigator.mozApps.getSelf().onsuccess=function(evt){var app=evt.target.result;app.connect('ftucomms').then(function onConnAccepted(ports){ports.forEach(function(port){port.postMessage('done');});},function onConnRejected(reason){console.warn('FTU is rejected due to '+reason);});};}
initialized=true;}};exports.FinishScreen=FinishScreen;}(this));

View file

@ -0,0 +1,4 @@
;'use strict';var ImportIntegration={get liveImportButton(){delete this.liveImportButton;return(this.liveImportButton=document.getElementById('live-import-button'));},get gmailImportButton(){delete this.gmailImportButton;return(this.gmailImportButton=document.getElementById('gmail-import-button'));},init:function(){this.liveImportButton.addEventListener('click',this);this.gmailImportButton.addEventListener('click',this);},handleEvent:function(event){switch(event.type){case'click':if(event.target===this.liveImportButton){ServicesLauncher.start('live');}
else if(event.target===this.gmailImportButton){ServicesLauncher.start('gmail');}
break;}},checkImport:function(nextState){if(nextState==='disabled'){this.gmailImportButton.setAttribute('disabled','disabled');this.liveImportButton.setAttribute('disabled','disabled');}
else if(nextState==='enabled'){this.gmailImportButton.removeAttribute('disabled');this.liveImportButton.removeAttribute('disabled');}}};

View file

@ -0,0 +1,3 @@
;'use strict';var LanguageManager={settings:window.navigator.mozSettings,init:function init(){this.buildLanguageList();document.getElementById('languages').addEventListener('change',this);var onSettingChange=this._boundHandleSettingChange=this.handleSettingChange.bind(this);this.settings.addObserver('language.current',onSettingChange);this.settings.addObserver('accessibility.screenreader',onSettingChange);},uninit:function uninit(){if(this._boundHandleSettingChange){this.settings.removeObserver('language.current',this._boundHandleSettingChange);this.settings.removeObserver('accessibility.screenreader',this._boundHandleSettingChange);}},handleSettingChange:function(evt){switch(evt.settingName){case'accessibility.screenreader':this.buildLanguageList();break;case'language.current':KeyboardHelper.changeDefaultLayouts(evt.settingValue,true);break;}},handleEvent:function handleEvent(evt){if(!this.settings||evt.target.name!='language.current'){return true;}
this.setLanguage(evt.target.value);return false;},setLanguage:function settings_setLanguage(language){this.settings.createLock().set({'language.current':language});},buildLanguageList:function settings_buildLanguageList(){var panel=document.querySelector('#languages');var container=panel.querySelector('ul');container.innerHTML='';LanguageList.get(function fillLanguageList(allLanguages,currentLanguage){for(var lang in allLanguages){var label=document.createElement('label');label.textContent=LanguageList.wrapBidi(lang,allLanguages[lang]);var radio=document.createElement('gaia-radio');radio.className='checkone';radio.setAttribute('name','language.current');radio.setAttribute('value',lang);radio.checked=(lang===currentLanguage);radio.appendChild(label);radio.configureClass();var li=document.createElement('li');li.dataset.value=lang;li.appendChild(radio);container.appendChild(li);}
panel.dataset.languagesReady=true;window.dispatchEvent(new CustomEvent('languagelistready'));});}};

View file

@ -0,0 +1,56 @@
;(function(exports){'use strict';const MANIFEST_SETTING_NAME='latecustomization.url';const OPERATOR_INFO_SETTING_NAME='latecustomization.operatorInfo';const COMMS_CHANNEL='ftucomms';const ICON_SIZE=32;const IMG_PATH='style/images/late_customization';const ICON_INSTALLING_URL=`${IMG_PATH}/app_installing.svg`;const ICON_FAILED_URL=`${IMG_PATH}/app_install_unrecoverable.svg`;const ICON_DEFAULT_URL=`${IMG_PATH}/default_icon.svg`;function LateCustomizationPanel(){this.debug('LateCustomizationPanel ctor');}
LateCustomizationPanel.prototype={DEBUG:false,name:'LateCustomizationPanel',constructor:LateCustomizationPanel,_initialized:false,_downloadPossible:false,_customizationManifestUrl:'',get enabled(){return Boolean(this._customizationManifestUrl&&(this._operatorInfo||this._predefinedOperatorInfo));},get operatorInfo(){var info={};Object.assign(info,this._operatorInfo||this.getInfoFromMobileConnection(),this._predefinedOperatorInfo);return info;},get carrierName(){var info=this.operatorInfo;return info.carrier||info.operator;},get region(){return this.operatorInfo.region||'';},start:function(){window.addEventListener('hashchange',this);window.addEventListener('ftu-done',this);window.addEventListener('online',this);window.addEventListener('offline',this);this._operatorInfo=this.getInfoFromMobileConnection();this.waitForSettingValues().then((results)=>{var[url,predefinedInfo]=results;if(url){this._customizationManifestUrl=url;}
if(predefinedInfo){this._predefinedOperatorInfo=predefinedInfo;}
this.debug('start, resolved manifest url: '+this._customizationManifestUrl,' is enabled? '+this.enabled,' operatorInfo: ',this._operatorInfo);if(this.enabled){this.init();}else{this.debug('Not enabled; not initializing');if(!this._operatorInfo){this.waitForOperatorInfo().then((info)=>{if(!this._initialized&&this.enabled){this.init();}});}}}).catch(e=>{this.debug('start: didnt init, error from waitForSettingValues: ',e);});},init:function(){if(this._initialized||!this.enabled){return;}
this._initialized=true;this.appManifestUrls=[];this.render();Navigation.registerStep({hash:'#late_customization',afterStep:'firefox_accounts'});this.attemptToPopulateAppList();},postConnectMessage:function(message){navigator.mozApps.getSelf().onsuccess=function(evt){var app=evt.target.result;if(app.connect){app.connect(COMMS_CHANNEL).then(function onConnAccepted(ports){ports.forEach(function(port){port.postMessage(message);});},function onConnRejected(reason){console.error('Cannot connect to comms channel: ',reason);});}else{console.error('mozApps does not have a connect method. '+'Cannot connect to the comms channel.');}};},attemptToPopulateAppList:function(){this.debug('attemptToPopulateAppList, waiting to go online');var connected=this.whenUsableConnection();connected.then(()=>{this.debug('attemptToPopulateAppList, came online');return this.fetchAppsToInstall().then((appsMap)=>{if(!(this._appsToInstall&&this._appsToInstall.size)){this.debug('No apps in response from '+
this._customizationManifestUrl+', bailing');return;}
var urls=Array.from(this._appsToInstall.keys());var postMessageDetail={type:'late-customization-apps',urls:urls};this.postConnectMessage(postMessageDetail);this.updateAppList(this._appsToInstall);}).catch(err=>{console.warn('LateCustomizationPanel, error fetching customization '+'manifest from: '+this._customizationManifestUrl,err.message);});}).catch((e)=>{this.debug('No connection available in time to '+'fetch late customization manifest:',e);});return connected;},fetchAppsToInstall:function(){if(this._appsToInstall){return Promise.resolve(this._appsToInstall);}
return this.fetchManifest().then((manifestResp)=>{var appsMap=this.getAppsFromManifest(manifestResp);if(!appsMap){return Promise.reject('getAppsFromManifest didnt return appsMap');}
return(this._appsToInstall=appsMap);},(err)=>{console.warn('LateCustomization: ',err.message||err);});},waitForSettingValues:function(){var haveUrl,haveInfo;var lock=navigator.mozSettings.createLock();function getSetting(name){return new Promise((resolve,reject)=>{lock=(lock&&!lock.closed)?lock:navigator.mozSettings.createLock();var get=lock.get(name);get.addEventListener('success',(function(){resolve(get.result[name]);}));get.addEventListener('error',(function(){reject();}));});}
if(this._customizationManifestUrl){haveUrl=Promise.resolve(this._customizationManifestUrl);}else{haveUrl=getSetting(MANIFEST_SETTING_NAME);}
haveInfo=getSetting(OPERATOR_INFO_SETTING_NAME);return Promise.all([haveUrl,haveInfo]);},waitForOperatorInfo:function(){var info=this.getInfoFromMobileConnection();if(info){this._operatorInfo=info;return Promise.resolve(info);}
return new Promise((resolve,reject)=>{this._operatorInfoRequest={resolve:resolve,reject:reject};});},getInfoFromMobileConnection:function(){var connections=navigator.mozMobileConnections;if(connections){for(var i=0,conn;i<connections.length;i++){conn=connections[i];if(conn&&conn.voice&&conn.voice.connected){var operatorInfos=MobileOperator.userFacingInfo(conn);if(operatorInfos.operator){operatorInfos.mcc=conn.voice.network.mcc;operatorInfos.mnc=conn.voice.network.mnc;return operatorInfos;}}}}
return null;},getAppsFromManifest:function(data){var apps=new Map();var langs=navigator.languages;var list=data&&(data.apps||data.objects);if(!(list&&list.length)){return apps;}
list.filter((app)=>{return app.is_disabled!==true&&(new Set(app.device_types)).has('firefoxos');}).forEach((appData)=>{appData.manifestURL=appData.manifest_url;var appName='';langs.some(function tryLanguage(lang){if(this[lang]){appName=this[lang];return true;}},appData.name);appData.displayName=appName;this.debug('app data: ',appData.displayName,appData);apps.set(appData.manifestURL,appData);});return apps;},attemptInstalls:function(){this._installQueue=[];if(this._appsToInstall&&this._appsToInstall.size){var attempts=[];this._appsToInstall.forEach((appData,manifestURL)=>{if(appData.installState=='installed'||appData.installState=='pending'){this.debug('attemptInstalls: app install already underway: ',manifestURL,appData.installState);}else{attempts.push(this.enqueAppInstall(appData));}});return Promise.all(attempts);}else{return Promise.resolve();}},installApp:function(appData){this.debug('installApp: ',appData.manifestURL);return this.whenUsableConnection().then(()=>{return new Promise((resolve,reject)=>{var req=window.navigator.mozApps.install(appData.manifestURL);var onOutcome=(arg)=>{var selector=`li[data-manifest-url="${appData.manifestURL}"]`;var itemNode=this.appListNode.querySelector(selector);var manifestURL=req.result&&req.result.manifestURL;this.debug('appinstall DOMRequest outcome:',arg,req.result);if(req.error){delete appData.installState;itemNode&&itemNode.classList.add('failed');console.warn('Install error: ',req.error);}else if(req.result){appData.installState=req.result.installState;this.debug('Install success, app: ',manifestURL,appData.installState);}
itemNode&&itemNode.classList.remove('pending');resolve(req);};req.onsuccess=req.onerror=onOutcome;});}).catch(()=>{this.debug('Lost connection while attempting install of '+
appData.manifestURL);});},enqueAppInstall:function(app){var installQueue=this._installQueue;installQueue.push(app);this.debug('enqueAppInstall, queue: ',app.manifestURL);var currentInstallAttempt=this._installAttempt||Promise.resolve();return currentInstallAttempt.then(req=>{if(req&&req.error){console.warn('install error:',req.error);}
if(this._installQueue.length){this._installAttempt=this.installApp(this._installQueue.shift());}});},debug:function(){if(!this.DEBUG){return;}
var args=Array.from(arguments);args.unshift('LateCustomizationPanel');console.log.apply(console,args);},buildManifestUrl:function(url,infos={}){var apiURL=new URL(url);var params=new URLSearchParams(apiURL.search.substr(1));for(var key in infos){if(typeof infos[key]!=='undefined'){params.set(key,infos[key]);}}
apiURL.search=params.toString();return apiURL.href;},fetchManifest:function(){var url=this.buildManifestUrl(this._customizationManifestUrl,this.operatorInfo);if(!url){return Promise.reject(new Error('No manifest URL available'));}
this.debug('fetchManifest at: '+url);return new Promise((resolve,reject)=>{LazyLoader.getJSON(url,true).then((resp)=>{if(resp.objects){resolve(resp);}else{reject('No apps in reponse to: '+url);}}).catch(ex=>{reject(ex);});});},whenUsableConnection:function(){if(this._pendingNextOnline){return this._pendingNextOnline;}
var canDownload=navigator.onLine;if(canDownload){return Promise.resolve(true);}
return new Promise((resolve,reject)=>{this._nextOnlineRequest={resolve:resolve,reject:reject};});},handleEvent:function(evt){switch(evt.type){case'hashchange':if(this.enabled&&evt.target.location.hash==='#late_customization'){if(this._appsToInstall&&this._appsToInstall.size){this.onPanelShown();}else{Navigation.skipStep();}}
if(this._operatorInfoRequest){var info=this.getInfoFromMobileConnection();if(info){this._operatorInfo=info;this._operatorInfoRequest.resolve(info);this._operatorInfoRequest=null;}}
break;case'online':case'offline':if(navigator.onLine&&this._installQueue&&this._installQueue.length){return this.attemptInstalls();}
if(navigator.onLine&&this._nextOnlineRequest){this._nextOnlineRequest.resolve(true);}else if(this._nextOnlineRequest){this._nextOnlineRequest.reject(new Error('offline'));if(!this._appsToInstall){this.attemptToPopulateAppList();}}
this._nextOnlineRequest=null;break;case'ftu-done':if(this._operatorInfoRequest){this._operatorInfoRequest.reject(new Error('FTU complete with no viable operator'));this._operatorInfoRequest=null;}
if(this._nextOnlineRequest){this._nextOnlineRequest.reject(new Error('done before connection became available'));this._nextOnlineRequest=null;}
break;}},onPanelShown:function(){UIManager.mainTitle.setAttribute('data-l10n-id','late-customization');this.finalizeRender();this.attemptInstalls();},_createElement:function(name,options){var elm=document.createElement(name);if(options.id){elm.id=options.id;}
if(options.className){elm.className=options.className;}
if(options.dataset){for(var p in options.dataset){elm.dataset[p]=options.dataset[p];}}
if(options.attributes){for(var a in options.attributes){elm.setAttribute(a,options.attributes[a]);}}
if('textContent'in options){elm.textContent=options.textContent;}
return elm;},render:function(){var section=this.element=document.getElementById('late_customization');if(!section){section=this._createElement('section',{attributes:{role:'region'},id:'late_customization'});this.element=section;}
section.innerHTML=Sanitizer.escapeHTML`
<section id="late-customization-cando" class="content hidden">
<p id="late_customization-downloading-message"></p>
</section>
<section id="late-customization-nocando" class="content">
<p id="late_customization-download-later-message"></p>
<p id="late_customization-download-later-marketplace"></p>
</section>
<article data-type="list">
<ul id="late_customization-applist" class="hidden"></ul>
</article>`;function setTranslationById(domId,l10Id,attrs){var elem=section.querySelector('#'+domId);document.l10n.setAttributes(elem,l10Id,attrs);}
var carrierName=this.carrierName;if(carrierName){setTranslationById('late_customization-downloading-message','late-customization-downloading-message',{carrierName:this.carrierName});setTranslationById('late_customization-download-later-message','late-customization-download-later',{carrierName:this.carrierName});}else{setTranslationById('late_customization-downloading-message','late-customization-downloading-message-default');setTranslationById('late_customization-download-later-message','late-customization-download-later-default');}
setTranslationById('late_customization-download-later-marketplace','late-customization-download-later-marketplace',{carrierName:this.carrierName});if(!section.parentNode){document.querySelector('#activation-screen > article').appendChild(section);}
this.appListNode=document.querySelector('#late_customization-applist');},renderAppItem:function(appData){var itemNode=this._createElement('li',{dataset:{manifestUrl:appData.manifestURL},className:'pending'});var listNode=this.element.querySelector('#late_customization-applist');if(!listNode){this.debug('No element found to render app details into');return;}
itemNode.innerHTML=Sanitizer.escapeHTML`
<span class="icon"
style="background-image: url(${ICON_INSTALLING_URL})"></span>
<p dir="auto">${appData.displayName}</p>
`;listNode.appendChild(itemNode);var iconElem=itemNode.querySelector('.icon');this.getAppIconUrl(appData).then((iconUrl)=>{this.debug('getAppIconUrl returned:',iconUrl);var img=new Image();img.onload=()=>{iconElem.style.backgroundImage='url('+img.src+')';};img.onerror=()=>{iconElem.style.backgroundImage='url('+ICON_DEFAULT_URL+')';};img.src=iconUrl.href;});return itemNode;},getAppIconUrl:function(appData,iconSize=ICON_SIZE){var siteObj={};var manifest=appData;var manifestURL=appData.manifest_url;var origin=manifest.origin=new URL(manifestURL).origin;var hasIcons=(manifest.icons&&Object.keys(manifest.icons).length);if(!hasIcons){return Promise.resolve(new URL(ICON_DEFAULT_URL));}
siteObj.manifestURL=manifestURL;siteObj.manifest=manifest;var gotIcon=new Promise((resolve,reject)=>{IconsHelper.getIcon(origin,iconSize,null,siteObj).then((iconUrl)=>{this.debug('getIcon returned: ',iconUrl);resolve(iconUrl);}).catch(err=>{this.debug('Failed to load icon from: '+
JSON.stringify(appData.icons));console.warn('getIcon errback, err: ',err);resolve(new URL(ICON_FAILED_URL));});});return gotIcon;},finalizeRender:function(){var container=this.element;var appsMap=this._appsToInstall;var hasApps=(appsMap&&appsMap.size);var canDoElm=container.querySelector('#late-customization-cando');var noCanDoElm=container.querySelector('#late-customization-nocando');var appListElm=container.querySelector('#late_customization-applist');canDoElm.classList.toggle('hidden',!hasApps);appListElm.classList.toggle('hidden',!hasApps);noCanDoElm.classList.toggle('hidden',!!hasApps);},updateAppList:function(appsMap){var list=this.element.querySelector('#late_customization-applist');this.debug('updateAppList: ',appsMap);while(list.firstChild){list.firstChild.remove();}
if(appsMap&&appsMap.size){for(var appData of appsMap.values()){this.debug('calling renderAppItem with app: ',appData.manifestURL);this.renderAppItem(appData);}}
this.finalizeRender();}};exports.LateCustomizationPanel=LateCustomizationPanel;var panel;document.l10n.ready.then(()=>{panel=exports.lateCustomizationPanel=new LateCustomizationPanel();});window.addEventListener('ftu-setup',function onSetup(evt){window.removeEventListener('ftu-setup',onSetup);panel&&(panel.manager=evt.detail);panel&&panel.start();});})(window);

View file

@ -0,0 +1,11 @@
;'use strict';var SdManager={available:function(){return utils.sdcard.checkStorageCard();},checkSDButton:function sm_checkSDButton(){var sdOption=UIManager.sdImportButton;if(!SdManager.alreadyImported&&SdManager.available()){sdOption.removeAttribute('disabled');UIManager.noMemorycard.classList.add('hidden');}else{sdOption.setAttribute('disabled','disabled');if(!SdManager.alreadyImported){UIManager.noMemorycard.classList.remove('hidden');}}},importContacts:function sm_importContacts(){var importedContacts=0;UIManager.navBar.setAttribute('aria-disabled','true');var cancelled=false;var importer=null;var importButton;var progress=utils.overlay.show('memoryCardContacts-importing','activityBar','infiniteProgress');utils.overlay.showMenu();return new Promise((resolve,reject)=>{utils.overlay.oncancel=()=>{cancelled=true;if(importer){importer.finish();}else{UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();}
resolve();};importButton=UIManager.sdImportButton;utils.sdcard.retrieveFiles(['text/vcard','text/directory;profile=vCard','text/directory'],['vcf','vcard'],(error,fileArray)=>{if(!error&&!fileArray.length){error='No contacts were found';}
if(error){reject(error);return import_error(error);}
if(cancelled){resolve();return;}
var promises=[];fileArray.forEach(file=>{promises.push(utils.sdcard.getTextFromFile(file,onContacts));});Promise.all(promises).then(()=>{utils.misc.setTimestamp('sd');UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();if(cancelled){resolve();return;}
SdManager.alreadyImported=true;importButton.setAttribute('disabled','disabled');utils.status.show({id:'memoryCardContacts-imported3',args:{n:importedContacts}});resolve();}).catch(reject);});});function onContacts(text){if(cancelled){return Promise.reject();}
return new Promise((resolve,reject)=>{importer=new VCFReader(text);if(!text||!importer){var error='No contacts were found';import_error(error);reject(error);return;}
importer.onimported=imported_contact;importer.onerror=error=>{import_error(error);reject(error);};importer.process(()=>{if(cancelled){reject('Cancelled');utils.overlay.hide();return;}
resolve();});});}
function imported_contact(){importedContacts++;progress.update();}
function import_error(e){UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();importButton.removeAttribute('disabled');var cancel={title:'cancel',callback:function(){ConfirmDialog.hide();}};var retry={title:'retry',isRecommend:true,callback:function(){ConfirmDialog.hide();importButton.click();}};ConfirmDialog.show(null,'memoryCardContacts-error',cancel,retry);}}};

View file

@ -0,0 +1,29 @@
;(function(exports){'use strict';const DOGFOODSETTING='debug.performance_data.dogfooding';const METRICSSETTING='metrics.selectedMetrics.level';var steps=[{onlyForward:true,hash:'#languages',requireSIM:false},{onlyForward:false,hash:'#data_3g',requireSIM:true},{onlyForward:false,hash:'#wifi',requireSIM:false},{onlyForward:false,hash:'#date_and_time',requireSIM:false},{onlyForward:false,hash:'#geolocation',requireSIM:false},{onlyForward:false,hash:'#import_contacts',requireSIM:false},{onlyForward:false,hash:'#firefox_accounts',requireSIM:false},{onlyForward:false,hash:'#welcome_browser',requireSIM:false},{onlyForward:false,hash:'#browser_privacy',requireSIM:false}];exports.Navigation={get stepCount(){return this._stepOrder?this._stepOrder.length:0;},currentStepIndex:0,previousStepIndex:0,simMandatory:false,skipMobileDataScreen:false,skipDateTimeScreen:false,tzInitialized:false,_stepsById:null,_stepOrder:null,init:function n_init(){this._stepOrder=[];this._stepsById={};var settings=navigator.mozSettings;var forward=document.getElementById('forward');var back=document.getElementById('back');this._onForwardClick=this.forward.bind(this);this._onBackClick=this.back.bind(this);forward.addEventListener('click',this._onForwardClick);back.addEventListener('click',this._onBackClick);window.addEventListener('hashchange',this);this._onActivationScreenClick=this.handleExternalLinksClick.bind(this);UIManager.activationScreen.addEventListener('click',this._onActivationScreenClick);steps.forEach(step=>{this.registerStep(step);});var self=this;var reqSIM=settings&&settings.createLock().get('ftu.sim.mandatory')||{};reqSIM.onsuccess=function onSuccess(){self.simMandatory=reqSIM.result['ftu.sim.mandatory']||false;};navigator.mozApps.getSelf().onsuccess=function(evt){var app=evt.target.result;app.connect('ftucomms').then(function onConnAccepted(ports){self.ports=ports;ports.forEach(port=>port.postMessage('started'));},function onConnRejected(reason){console.warn('FTU navigation cannot use IAC: '+reason);});};},uninit:function(){this._stepOrder=null;this._stepsById=null;this.currentStepIndex=0;this.previousStepIndex=0;this.ports=null;var forward=document.getElementById('forward');var back=document.getElementById('back');var activationScreen=UIManager&&UIManager.activationScreen;if(forward&&this._onForwardClick){forward.removeEventListener('click',this._onForwardClick);}
if(back&&this._onBackClick){back.removeEventListener('click',this._onBackClick);}
if(activationScreen&&this._onActivationScreenClick){activationScreen.removeEventListener('click',this._onActivationScreenClick);}
window.removeEventListener('hashchange',this);},registerStep:function(step){if(!step.id){step.id=step.hash.substring(1);}
var id=step.id;this._stepsById[id]=step;var beforeStepIdx=step.hasOwnProperty('beforeStep')?this._stepOrder.indexOf(step.beforeStep):-1;var afterStepIdx=step.hasOwnProperty('afterStep')?this._stepOrder.indexOf(step.afterStep):-1;if(beforeStepIdx>-1){this._stepOrder.splice(beforeStepIdx,0,id);}else if(afterStepIdx>-1){this._stepOrder.splice(afterStepIdx+1,0,id);}else{this._stepOrder.push(id);}},stepAt:function(idx){var stepId=this._stepOrder[idx];if(stepId){return this._stepsById[stepId];}},indexOfStep:function(step){var id=(typeof id==='string')?step.id:step;return this._stepOrder.indexOf(id);},back:function n_back(event){var currentStep=this.stepAt(this.currentStepIndex);var actualHash=window.location.hash;if(actualHash!=currentStep.hash){window.history.back();}else{var self=this;var goToStep=function(){self.previousStepIndex=self.currentStepIndex;self.currentStepIndex--;if(self.currentStepIndex>=0){self.manageStep();}};goToStep();}},forward:function n_forward(event){var self=this;var goToStepForward=function(){self.previousStepIndex=self.currentStepIndex;self.currentStepIndex++;if(self.currentStepIndex>=self.stepCount){UIManager.sendNewsletter(function newsletterSent(result){if(result){UIManager.activationScreen.classList.remove('show');UIManager.changeStatusBarColor(UIManager.DARK_THEME);UIManager.finishScreen.classList.add('show');UIManager.hideActivationScreenFromScreenReader();}else{self.currentStepIndex--;}});return;}
self.manageStep();};goToStepForward();},handleExternalLinksClick:function n_handleExternalLinksClick(e){var link=e.target;if(!link.mozMatchesSelector('a.external')){return;}
e.preventDefault();var href=link.href,title=link.getAttribute('title')||link.textContent;if(navigator.onLine){this.displayExternalLink(href,title);}else{UIManager.displayOfflineDialog(href,title);}},displayExternalLink:function n_displayExternalLink(href,title){window.open(href,'','dialog');},ensureTZInitialized:function(){if(!this.tzInitialized){return UIManager.initTZ().then(()=>{this.skipDateTimeScreen=!UIManager.timeZoneNeedsConfirmation;this.tzInitialized=true;});}else{return Promise.resolve();}},handleEvent:function n_handleEvent(event){var actualHash=window.location.hash;switch(actualHash){case'#languages':UIManager.mainTitle.setAttribute('data-l10n-id','language');break;case'#data_3g':UIManager.mainTitle.setAttribute('data-l10n-id','3g');DataMobile.getStatus(UIManager.updateDataConnectionStatus.bind(UIManager));break;case'#wifi':DataMobile.removeSVStatusObserver();UIManager.mainTitle.setAttribute('data-l10n-id','selectNetwork');UIManager.activationScreen.classList.remove('no-options');if(UIManager.navBar.classList.contains('secondary-menu')){UIManager.navBar.classList.remove('secondary-menu');return;}
WifiManager.getNetworks(networks=>{this.ensureTZInitialized().then(()=>{WifiUI.renderNetworks(networks);});});break;case'#date_and_time':UIManager.mainTitle.setAttribute('data-l10n-id','dateAndTime');break;case'#geolocation':UIManager.mainTitle.setAttribute('data-l10n-id','geolocation');break;case'#import_contacts':UIManager.mainTitle.setAttribute('data-l10n-id','importContacts3');SimManager.checkSIMButton();SdManager.checkSDButton();var onlineState;if(!WifiManager.api){ImportIntegration.checkImport('enabled');break;}
onlineState=window.navigator.onLine?'enabled':'disabled';ImportIntegration.checkImport(onlineState);break;case'#firefox_accounts':UIManager.mainTitle.setAttribute('data-l10n-id','firefox-accounts');break;case'#welcome_browser':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');var settings=navigator.mozSettings;var basicMetrics=document.getElementById('metrics-basic');var enhancedMetrics=document.getElementById('metrics-enhanced');var noneMetrics=document.getElementById('metrics-none');var defaultLevel=settings&&settings.createLock().get(METRICSSETTING);if(defaultLevel){defaultLevel.onsuccess=function(){var result=defaultLevel.result[METRICSSETTING];if(result==='Basic'){basicMetrics.checked=true;}else if(result==='Enhanced'){enhancedMetrics.checked=true;}else if(result==='None'){noneMetrics.checked=true;}};}
var dogfood=settings&&settings.createLock().get(DOGFOODSETTING);if(dogfood){dogfood.onsuccess=function(){if(dogfood.result[DOGFOODSETTING]){basicMetrics.setAttribute('disabled','true');enhancedMetrics.setAttribute('disabled','true');noneMetrics.setAttribute('disabled','true');}else{basicMetrics.removeAttribute('disabled');enhancedMetrics.removeAttribute('disabled');noneMetrics.removeAttribute('disabled');}};}
break;case'#browser_privacy':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');break;case'#SIM_mandatory':UIManager.mainTitle.setAttribute('data-l10n-id','SIM_mandatory');break;case'#about-your-rights':case'#about-your-privacy':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');UIManager.navBar.classList.add('back-only');break;case'#sharing-performance-data':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');UIManager.navBar.classList.add('back-only');break;}
if(this.simMandatory){UIManager.skipPinButton.classList.add('hidden');UIManager.backSimButton.classList.remove('hidden');}else{UIManager.skipPinButton.classList.remove('hidden');UIManager.backSimButton.classList.add('hidden');}
var lastIndex=this.stepCount-1;if(this.currentStepIndex<=lastIndex&&(this.stepAt(this.currentStepIndex).hash!=='#wifi')){UIManager.activationScreen.classList.add('no-options');}
if(this.currentStepIndex<=lastIndex&&this.stepAt(this.currentStepIndex).hash===actualHash){UIManager.navBar.classList.remove('back-only');}},postStepMessage:function n_postStepMessage(stepIndex){if(!this.ports){return;}
var step=this.stepAt(stepIndex);this.ports.forEach(function(port){port.postMessage({type:'step',hash:step.hash});});},skipStep:function n_skipStep(){var stepIndex=this.currentStepIndex;stepIndex+=stepIndex>this.previousStepIndex?1:-1;if(stepIndex<=0){this.previousStepIndex=stepIndex=0;}
if(stepIndex>this.stepCount){this.previousStepIndex=stepIndex=this.stepCount;}
this.currentStepIndex=stepIndex;this.manageStep();},manageStep:function n_manageStep(){var self=this;if(self.currentStepIndex>self.previousStepIndex){self.postStepMessage(self.previousStepIndex);}
if(self.currentStepIndex>=self.stepCount){OperatorVariant.setSIMOnFirstBootState();}
if(self.currentStepIndex===0){self.skipMobileDataScreen=false;}
var futureLocation=this.stepAt(self.currentStepIndex);if(this.simMandatory&&!IccHelper.cardState&&futureLocation.requireSIM){futureLocation.hash='#SIM_mandatory';futureLocation.requireSIM=false;futureLocation.onlyBackward=true;}
if(this.stepAt(this.currentStepIndex).onlyForward){UIManager.navBar.classList.add('forward-only');}else{UIManager.navBar.classList.remove('forward-only');}
var nextButton=document.getElementById('forward');if(this.stepAt(this.currentStepIndex).onlyBackward){nextButton.setAttribute('disabled','disabled');}else{nextButton.removeAttribute('disabled');}
if(this.currentStepIndex===this.stepCount){nextButton.setAttribute('data-l10n-id','done');}else{nextButton.setAttribute('data-l10n-id','navbar-next');}
if(futureLocation.hash==='#firefox_accounts'){nextButton.setAttribute('data-l10n-id','skip');}
window.location.hash=futureLocation.hash;if(futureLocation.requireSIM){var check_cardState=function(response){if(!response||(!SimManager.available()&&futureLocation.hash!=='#data_3g')){self.skipStep();if(self.currentStepIndex>self.previousStepIndex){self.skipMobileDataScreen=true;}}};var skipUnlockScreens=this.currentStepIndex<this.previousStepIndex;SimManager.handleCardState(check_cardState,skipUnlockScreens);}
if(this.stepAt(this.currentStepIndex).hash==='#date_and_time'){if(!self.tzInitialized){self.skipDateTimeScreen=!UIManager.timeZoneNeedsConfirmation;}
if(self.skipDateTimeScreen){self.postStepMessage(self.currentStepIndex);if(navigator.onLine){UIManager.updateSetting('time.timezone.automatic-update.enabled',true);UIManager.updateSetting('time.clock.automatic-update.enabled',true);}
self.skipStep();}}
if((futureLocation.hash==='#firefox_accounts'&&!navigator.onLine)||(futureLocation.hash==='#firefox_accounts'&&UIManager.skipFxA)){self.postStepMessage(self.currentStepIndex);self.skipStep();}}};})(window);

View file

@ -0,0 +1,7 @@
;'use strict';var OperatorVariant=(function(){var NO_SIM='000-000';function setSIMOnFirstBootState(){var cardValue;function normalizeCode(aCode){var ncode=''+aCode;while(ncode.length<3){ncode='0'+ncode;}
return ncode;}
try{if(!IccHelper||!IccHelper.cardState){cardValue=NO_SIM;}else{var mcc=IccHelper.iccInfo.mcc;var mnc=IccHelper.iccInfo.mnc;if((mcc!==undefined)&&(mcc!==null)&&(mnc!==undefined)&&(mnc!==null)){cardValue=normalizeCode(mcc)+'-'+normalizeCode(mnc);}else{cardValue=NO_SIM;}}
var settings=navigator.mozSettings;if(!settings){console.log('Settings is not available');return;}
var req=settings.createLock().get('ftu.simPresentOnFirstBoot');req.onsuccess=function ov_onsuccess(){var currentStatus=req.result['ftu.simPresentOnFirstBoot'];if(currentStatus===undefined||currentStatus===null){var result=navigator.mozSettings.createLock().set({'ftu.simPresentOnFirstBoot':cardValue});result.onerror=function ov_error(){console.error('An error occurre setting '+'ftu.simPresentOnFirstBoot: '+cardValue);};}
cardValue=null;};req.onerror=function ov_error(){console.error('Error retrieving ftu.simPresentOnFirstBoot');};}catch(e){console.error('Error setSIMOnFirstBootState. '+e);}}
return{setSIMOnFirstBootState:setSIMOnFirstBootState};})();

View file

@ -0,0 +1,9 @@
;'use strict';var FTU_APP_ORIGIN=document.location.protocol+'//'+
document.location.host;var ServicesLauncher=(function(document){var extensionFrame=document.querySelector('#iframe_extensions');var oauthFrame=document.querySelector('#iframe_oauth');var BASE_IMPORT='/shared/pages/import/import.html?ftu=1';function getServiceURI(service){return BASE_IMPORT+'&service='+service;}
var access_token,currentURI,currentService;function open(){extensionFrame.className='opening';}
function load(targetService){currentService=targetService;currentURI=getServiceURI(targetService);window.addEventListener('message',messageHandler);oauthFrame.contentWindow.postMessage({type:'start',data:{from:'friends',service:targetService}},FTU_APP_ORIGIN);}
function unload(){window.removeEventListener('message',messageHandler);extensionFrame.src=null;}
function close(messageId){extensionFrame.addEventListener('transitionend',function tclose(){extensionFrame.removeEventListener('transitionend',tclose);extensionFrame.src=null;if(messageId){utils.status.show(messageId);}});extensionFrame.className='closing';window.removeEventListener('message',messageHandler);}
function messageHandler(e){if(e.origin!==FTU_APP_ORIGIN){return;}
var data=e.data;switch(data.type){case'ready':open();break;case'abort':unload();break;case'window_close':close(data.messageId);break;case'authenticated':extensionFrame.src=currentURI;access_token=data.data;break;case'messaging_ready':extensionFrame.contentWindow.postMessage({type:'token',data:access_token},FTU_APP_ORIGIN);break;}}
return{start:load};})(document);

View file

@ -0,0 +1,33 @@
;'use strict';var SimManager=(function(){function Icc(mozIcc){this.mozIcc=mozIcc;}
Icc.prototype={skipped:false,unlocked:false,alreadyImported:false,mozIcc:null,isLocked:function(){return!this.unlocked&&lockStates.indexOf(this.mozIcc.cardState)!==-1;}};function showRetryCount(icc,lockType,uiElement){var request=icc.mozIcc.getCardLockRetryCount(lockType);request.onsuccess=function(){var retryCount=request.result.retryCount;if(retryCount){var l10nArgs={n:retryCount};document.l10n.setAttributes(uiElement,'inputCodeRetriesLeft',l10nArgs);uiElement.classList.remove('hidden');}};request.onerror=function(){console.error('Could not fetch CardLockRetryCount',request.error.name);};}
var lockStates=['pinRequired','pukRequired','networkLocked','corporateLocked','serviceProviderLocked','network1Locked','network2Locked','hrpdNetworkLocked','ruimCorporateLocked','ruimServiceProviderLocked'];return{icc0:null,icc1:null,simSlots:window.navigator.mozMobileConnections?window.navigator.mozMobileConnections.length:0,_unlockingIcc:null,init:function sm_init(){this.mobConn=window.navigator.mozMobileConnections;if(!this.mobConn){return;}
this.iccManager=window.navigator.mozIccManager;if(!this.iccManager){return;}
this.icc0=null;this.icc1=null;if(this.iccManager.iccIds[0]){this.updateIccState(this.iccManager.iccIds[0]);}
if(this.iccManager.iccIds[1]){this.updateIccState(this.iccManager.iccIds[1]);}
this.iccManager.addEventListener('iccdetected',this.handleIccState.bind(this));this.alreadyImported=false;},handleUnlockError:function sm_handleUnlockError(lockType,retryCount){var l10nArgs={n:retryCount};switch(lockType){case'pin':if(retryCount===0){this.showPukScreen(this._unlockingIcc);break;}
UIManager.pinInput.value='';UIManager.pinInput.classList.add('onerror');UIManager.pinError.classList.remove('hidden');document.l10n.setAttributes(UIManager.pinRetriesLeft,'inputCodeRetriesLeft',l10nArgs);UIManager.pinRetriesLeft.classList.remove('hidden');if(retryCount===1){UIManager.pinError.querySelector('.lastchance').classList.remove('hidden');}else{document.l10n.setAttributes(UIManager.pinError.querySelector('.main'),'pinAttemptMsg2',l10nArgs);UIManager.pinError.querySelector('.main').classList.remove('hidden');}
break;case'puk':UIManager.pukInput.value='';UIManager.pukInput.classList.add('onerror');UIManager.pukError.classList.remove('hidden');UIManager.pukInfo.classList.add('hidden');document.l10n.setAttributes(UIManager.pukRetriesLeft,'inputCodeRetriesLeft',l10nArgs);UIManager.pukRetriesLeft.classList.remove('hidden');if(retryCount===1){UIManager.pukError.querySelector('.lastchance').classList.remove('hidden');}else{document.l10n.setAttributes(UIManager.pukError.querySelector('.main'),'pukAttemptMsg2',l10nArgs);UIManager.pukError.querySelector('.main').classList.remove('hidden');}
break;case'nck':case'cck':case'spck':UIManager.xckInput.value='';UIManager.xckInput.classList.add('onerror');UIManager.xckError.classList.remove('hidden');document.l10n.setAttributes(UIManager.xckRetriesLeft,'inputCodeRetriesLeft',l10nArgs);UIManager.xckRetriesLeft.classList.remove('hidden');if(retryCount==1){UIManager.xckError.querySelector('.lastchance').classList.remove('hidden');}else{document.l10n.setAttributes(UIManager.xckError.querySelector('.main'),'nckAttemptMsg2',l10nArgs);UIManager.xckError.querySelector('.main').classList.remove('hidden');}
break;}},available:function sm_available(){var icc=this.guessIcc();return(icc&&icc.cardState==='ready');},handleIccState:function sm_handleIccState(event){this.updateIccState(event.iccId);},updateIccState:function(iccId){var iccInfo=this.iccManager.getIccById(iccId);if(!iccInfo){throw new Error('Unrecognized iccID: '+iccId);}
if(this.mobConn[0]&&iccId===this.mobConn[0].iccId){this.icc0=new Icc(iccInfo);}else if(this.mobConn[1]&&iccId===this.mobConn[1].iccId){this.icc1=new Icc(iccInfo);}else{console.warn('ICC detected in unsupported slot',iccId);}},handleCardState:function sm_handleCardState(callback,skipUnlockScreen){this._unlockingIcc=null;SimManager.checkSIMButton();if(typeof callback==='function'){this.finishCallback=callback;}
if(this.shouldShowUnlockScreen(this.icc0)&&!skipUnlockScreen){this.showUnlockScreen(this.icc0);}else if(this.shouldShowUnlockScreen(this.icc1)&&!skipUnlockScreen){this.showUnlockScreen(this.icc1);}else if(this.shouldShowSIMInfoScreen()){this.resetSkipped();this.showSIMInfoScreen();}else{this.resetSkipped();this.finish();}},finish:function(){this.hideScreen();this.hideSIMInfoScreen();var showCellData=(this.icc0&&!this.icc0.isLocked())||(this.icc1&&!this.icc1.isLocked());this.finishCallback&&this.finishCallback(showCellData);},shouldShowUnlockScreen:function sm_shouldShowLockScreen(icc){return icc&&!icc.skipped&&icc.isLocked();},shouldShowSIMInfoScreen:function sm_shouldShowSIMInfoScreen(){return(this.icc0&&this.icc1);},showUnlockScreen:function sm_showUnlockScreen(icc){if(icc.unlocked){return;}
this._unlockingIcc=icc;switch(icc.mozIcc.cardState){case'pinRequired':this.showPinScreen(icc);break;case'pukRequired':this.showPukScreen(icc);break;case'networkLocked':case'corporateLocked':case'serviceProviderLocked':case'network1Locked':case'network2Locked':case'hrpdNetworkLocked':case'ruimCorporateLocked':case'ruimServiceProviderLocked':this.showXckScreen(icc);break;default:throw new Error('Cannot show SIM unlock screen, unknown cardState '+
icc.mozIcc.cardState);}},voiceChangeListeners:[],updateSIMInfoText:function sm_updateSIMInfoText(icc){var iccNumber=(icc===this.icc0)?1:2;if(icc&&icc.isLocked()){UIManager['simInfo'+iccNumber].classList.add('locked');UIManager['simCarrier'+iccNumber].setAttribute('data-l10n-id','simPinLocked');UIManager['simNumber'+iccNumber].removeAttribute('data-l10n-id');UIManager['simNumber'+iccNumber].textContent='';}else{UIManager['simInfo'+iccNumber].classList.remove('locked');var mobConn=this.mobConn[iccNumber-1];var operator=MobileOperator.userFacingInfo(mobConn).operator;if(!operator&&!this.voiceChangeListeners[iccNumber-1]){this.voiceChangeListeners[iccNumber-1]=function(evt){var operator=MobileOperator.userFacingInfo(mobConn).operator;if(operator){UIManager['simCarrier'+iccNumber].removeAttribute('data-l10n-id');UIManager['simCarrier'+iccNumber].textContent=operator;mobConn.removeEventListener('voicechange',this.voiceChangeListeners[iccNumber-1]);this.voiceChangeListeners[iccNumber-1]=null;}}.bind(this);mobConn.addEventListener('voicechange',this.voiceChangeListeners[iccNumber-1]);}
if(operator){UIManager['simCarrier'+iccNumber].removeAttribute('data-l10n-id');UIManager['simCarrier'+iccNumber].textContent=operator;}else{UIManager['simCarrier'+iccNumber].setAttribute('data-l10n-id','searchingOperator');}
var number=icc.mozIcc.iccInfo.msisdn||icc.mozIcc.iccInfo.mdn||'';if(number){UIManager['simNumber'+iccNumber].textContent=number;UIManager['simInfo'+iccNumber].classList.remove('no-number');}else{UIManager['simInfo'+iccNumber].classList.add('no-number');}}},showSIMInfoScreen:function sm_showSIMInfoScreen(){this.updateSIMInfoText(this.icc0);this.updateSIMInfoText(this.icc1);UIManager.activationScreen.classList.remove('show');UIManager.simInfoScreen.classList.add('show');},hideSIMInfoScreen:function sm_hidescreen(){UIManager.simInfoScreen.classList.remove('show');UIManager.activationScreen.classList.add('show');},checkSIMButton:function sm_checkSIMButton(){if(!this.mobConn){UIManager.simImport.classList.add('hidden');return;}
var simOption=UIManager.simImportButton;if(!SimManager.alreadyImported&&SimManager.available()){simOption.removeAttribute('disabled');UIManager.noSim.classList.add('hidden');}else{simOption.setAttribute('disabled','disabled');if(!SimManager.alreadyImported){UIManager.noSim.classList.remove('hidden');}}},showPinScreen:function sm_showPinScreen(icc){showRetryCount(icc,'pin',UIManager.pinRetriesLeft);UIManager.unlockSimButton.disabled=true;UIManager.pinInput.addEventListener('input',function sm_checkInput(event){UIManager.unlockSimButton.disabled=(event.target.value.length<4);});UIManager.activationScreen.classList.remove('show');UIManager.unlockSimScreen.classList.add('show');UIManager.pincodeScreen.classList.add('show');UIManager.xckcodeScreen.classList.remove('show');UIManager.unlockSimHeader.setAttribute('data-l10n-id','pincode2');if(this.simSlots>1){var simNumber=icc===this.icc0?1:2;document.l10n.setAttributes(UIManager.pinLabel,'pincodeLabel',{n:simNumber});}else{UIManager.pinLabel.setAttribute('data-l10n-id','type_pin');}
UIManager.pinInput.focus();},showPukScreen:function sm_showPukScreen(icc){showRetryCount(icc,'puk',UIManager.pukRetriesLeft);UIManager.unlockSimScreen.classList.add('show');UIManager.activationScreen.classList.remove('show');UIManager.pincodeScreen.classList.remove('show');UIManager.pukcodeScreen.classList.add('show');UIManager.xckcodeScreen.classList.remove('show');UIManager.unlockSimHeader.setAttribute('data-l10n-id','pukcode');if(this.simSlots>1){var simNumber=icc===this.icc0?1:2;document.l10n.setAttributes(UIManager.pukLabel,'pukcodeLabel',{n:simNumber});}else{UIManager.pukLabel.setAttribute('data-l10n-id','type_puk');}
UIManager.pukInput.focus();},showXckScreen:function sm_showXckScreen(icc){var lockType;switch(icc.mozIcc.cardState){case'networkLocked':lockType='nck';break;case'corporateLocked':lockType='cck';break;case'serviceProviderLocked':lockType='spck';break;case'network1Locked':lockType='nck1';break;case'network2Locked':lockType='nck2';break;case'hrpdNetworkLocked':lockType='hnck';break;case'ruimCorporateLocked':lockType='rcck';break;case'ruimServiceProviderLocked':lockType='rspck';break;default:return;}
showRetryCount(icc,lockType,UIManager.xckRetriesLeft);UIManager.unlockSimScreen.classList.add('show');UIManager.activationScreen.classList.remove('show');UIManager.pincodeScreen.classList.remove('show');UIManager.pukcodeScreen.classList.remove('show');UIManager.xckcodeScreen.classList.add('show');var simNumber=icc===this.icc0?1:2;switch(icc.mozIcc.cardState){case'networkLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'nckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'nckcodeLabel',{n:simNumber});break;case'corporateLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'cckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'cckcodeLabel',{n:simNumber});break;case'serviceProviderLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'spckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'spckcodeLabel',{n:simNumber});break;case'network1Locked':document.l10n.setAttributes(UIManager.unlockSimHeader,'nck1codeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'nck1codeLabel',{n:simNumber});break;case'network2Locked':document.l10n.setAttributes(UIManager.unlockSimHeader,'nck2codeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'nck2codeLabel',{n:simNumber});break;case'hrpdNetworkLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'hnckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'hnckcodeLabel',{n:simNumber});break;case'ruimCorporateLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'rcckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'rcckcodeLabel',{n:simNumber});break;case'ruimServiceProviderLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'rspckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'rspckcodeLabel',{n:simNumber});break;}
UIManager.xckInput.focus();},resetForm:function sm_clearInputs(){this.clearFields();UIManager.newpinInput.value='';UIManager.confirmNewpinInput.value='';UIManager.pinInput.value='';UIManager.pukInput.value='';UIManager.pukInfo.classList.remove('hidden');UIManager.xckInput.value='';UIManager.unlockSimButton.disabled=false;},hideScreen:function sm_hideScreen(){UIManager.unlockSimScreen.classList.remove('show');UIManager.pincodeScreen.classList.remove('show');UIManager.pukcodeScreen.classList.remove('show');UIManager.xckcodeScreen.classList.remove('show');UIManager.activationScreen.classList.add('show');},skip:function sm_skip(){if(this._unlockingIcc){this._unlockingIcc.skipped=true;}
this.resetForm();this.hideScreen();this.handleCardState();},resetSkipped:function sm_resetSkipped(){if(this.icc0){this.icc0.skipped=false;}
if(this.icc1){this.icc1.skipped=false;}},back:function sm_back(){this.resetForm();this.resetSkipped();this.hideScreen();this.hideSIMInfoScreen();Navigation.back();},simUnlockBack:function sm_simUnlockBack(){if(this.icc0&&this.icc0.skipped){this.icc0.skipped=false;this.hideScreen();this.handleCardState();}else{this.back();}},unlock:function sm_unlock(){var icc=this._unlockingIcc;if(!icc){throw new Error('Cannot unlock SIM, no current ICC');}
this.clearFields();switch(icc.mozIcc.cardState){case'pinRequired':this.unlockPin(icc);break;case'pukRequired':this.unlockPuk(icc);break;case'networkLocked':case'corporateLocked':case'serviceProviderLocked':case'network1Locked':case'network2Locked':case'hrpdNetworkLocked':case'ruimCorporateLocked':case'ruimServiceProviderLocked':this.unlockXck(icc);break;}},unlockPin:function sm_unlockPin(icc){var pin=UIManager.pinInput.value;if(pin.length<4||pin.length>8){UIManager.pinError.querySelector('.main').setAttribute('data-l10n-id','pinValidation');UIManager.pinInput.classList.add('onerror');UIManager.pinError.classList.remove('hidden');UIManager.pinInput.focus();return;}else{UIManager.pinInput.classList.remove('onerror');UIManager.pinError.classList.add('hidden');}
this.attemptUnlock(icc,{lockType:'pin',pin:pin});},clearFields:function sm_clearFields(){UIManager.pukInput.classList.remove('onerror');UIManager.pukError.classList.add('hidden');UIManager.newpinInput.classList.remove('onerror');UIManager.newpinError.classList.add('hidden');UIManager.confirmNewpinInput.classList.remove('onerror');UIManager.confirmNewpinError.classList.add('hidden');UIManager.pinError.classList.add('hidden');UIManager.pinError.querySelector('.main').classList.add('hidden');UIManager.pinError.querySelector('.lastchance').classList.add('hidden');UIManager.pinRetriesLeft.classList.add('hidden');UIManager.pukError.classList.add('hidden');UIManager.pukError.querySelector('.main').classList.add('hidden');UIManager.pukError.querySelector('.lastchance').classList.add('hidden');UIManager.pukRetriesLeft.classList.add('hidden');UIManager.xckError.classList.add('hidden');UIManager.xckError.querySelector('.main').classList.add('hidden');UIManager.xckError.querySelector('.lastchance').classList.add('hidden');UIManager.xckRetriesLeft.classList.add('hidden');},unlockPuk:function sm_unlockPuk(icc){var pukCode=UIManager.pukInput.value;if(pukCode.length!==8){UIManager.pukError.querySelector('.main').setAttribute('data-l10n-id','pukValidation');UIManager.pukError.classList.remove('hidden');UIManager.pukInfo.classList.add('hidden');UIManager.pukInput.classList.add('onerror');UIManager.pukError.focus();return;}
var newpinCode=UIManager.newpinInput.value;var confirmNewpin=UIManager.confirmNewpinInput.value;if(newpinCode.length<4||newpinCode.length>8){UIManager.newpinError.setAttribute('data-l10n-id','pinValidation');UIManager.newpinError.classList.remove('hidden');UIManager.newpinInput.classList.add('onerror');UIManager.newpinError.focus();return;}
if(newpinCode!=confirmNewpin){UIManager.confirmNewpinError.setAttribute('data-l10n-id','newpinConfirmation');UIManager.confirmNewpinError.classList.remove('hidden');UIManager.newpinInput.classList.add('onerror');UIManager.confirmNewpinInput.classList.add('onerror');UIManager.confirmNewpinError.focus();return;}
var options={lockType:'puk',puk:pukCode,newPin:newpinCode};this.attemptUnlock(icc,options);},unlockXck:function sm_unlockXck(icc){var xck=UIManager.xckInput.value;var lockType;switch(icc.mozIcc.cardState){case'networkLocked':lockType='nck';break;case'corporateLocked':lockType='cck';break;case'serviceProviderLocked':lockType='spck';break;case'network1Locked':lockType='nck1';break;case'network2Locked':lockType='nck2';break;case'hrpdNetworkLocked':lockType='hnck';break;case'ruimCorporateLocked':lockType='rcck';break;case'ruimServiceProviderLocked':lockType='rspck';break;}
if(xck.length<8||xck.length>16){UIManager.xckInput.classList.add('onerror');UIManager.xckError.classList.remove('hidden');UIManager.xckError.querySelector('.main').setAttribute('data-l10n-id',lockType+'Validation');UIManager.xckInput.focus();return;}else{UIManager.pinInput.classList.remove('onerror');UIManager.pinError.classList.add('hidden');}
var options={lockType:lockType,pin:xck};this.attemptUnlock(icc,options);},attemptUnlock:function sm_attemptUnlock(icc,options){var req=icc.mozIcc.unlockCardLock(options);req.onsuccess=(function sm_unlockSuccess(){icc.unlocked=true;this.resetForm();this.hideScreen();this.handleCardState();}).bind(this);req.onerror=(function sm_unlockError(){this.handleUnlockError(options.lockType,req.error.retryCount);}).bind(this);},guessIcc:function guessIcc(){var tempIcc=null;if(navigator.mozMobileConnections){for(var i=0;i<navigator.mozMobileConnections.length&&tempIcc===null;i++){if(navigator.mozMobileConnections[i]!==null&&navigator.mozMobileConnections[i].iccId!==null){tempIcc=navigator.mozIccManager.getIccById(navigator.mozMobileConnections[i].iccId);}}}else{tempIcc=navigator.mozIccManager;}
return tempIcc;},importContacts:function sm_importContacts(){var DELAY_FEEDBACK=300;UIManager.navBar.setAttribute('aria-disabled','true');var progress=utils.overlay.show('simContacts-reading','activityBar');var importButton=UIManager.simImportButton;var cancelled=false,contactsRead=false;var importer=new SimContactsImporter(SimManager.guessIcc());utils.overlay.showMenu();utils.overlay.oncancel=function oncancel(){cancelled=true;importer.finish();if(contactsRead){progress.setClass('activityBar');utils.overlay.hideMenu();progress.setHeaderMsg('messageCanceling');}else{importer.onfinish();}};var importedContacts=0;importer.onread=function sim_import_read(n){contactsRead=true;if(n>0){progress.setClass('progressBar');progress.setHeaderMsg('simContacts-importing');progress.setTotal(n);}};importer.onimported=function imported_contact(){importedContacts++;if(!cancelled){progress.update();}};importer.onfinish=function sim_import_finish(numDupsMerged,iccId){window.setTimeout(function do_sim_import_finish(){UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();if(importedContacts>0){utils.misc.setTimestamp('sim-'+iccId);}
if(!cancelled){SimManager.alreadyImported=true;importButton.setAttribute('disabled','disabled');utils.status.show({id:'simContacts-imported3',args:{n:importedContacts}});}},DELAY_FEEDBACK);importer.onfinish=null;};importer.onerror=function sim_import_error(){UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();importButton.removeAttribute('disabled');var cancel={title:'cancel',callback:function(){ConfirmDialog.hide();}};var retry={title:'retry',isRecommend:true,callback:function(){ConfirmDialog.hide();importButton.click();}};ConfirmDialog.show(null,'simContacts-error',cancel,retry);};importer.start();}};})();

View file

@ -0,0 +1,2 @@
;'use strict';var TimeManager={elementIDs:['tz-region','tz-city','date-configuration','time-configuration'],init:function tm_init(){if(window.navigator.mozTime){this.time=window.navigator.mozTime;}else{console.log('There is no mozTime available in window');}
this.elementIDs.forEach(function(elementID){document.getElementById(elementID+'-button').addEventListener('click',function(evt){evt.preventDefault();var input=document.getElementById(elementID);setTimeout(input.focus.bind(input),10);});});},set:function tm_set(date){this.time.set(date);}};

View file

@ -0,0 +1,11 @@
;(function(exports){'use strict';var currentLayout='tiny';var dom={};var elementIDs=['tutorial','tutorial-step-title','tutorial-step-media','tutorial-step-image','tutorial-step-video','forward-tutorial','back-tutorial'];var Tutorial={config:null,_stepsConfig:{},_stepsKey:'',_currentStep:1,_initialized:false,init:function(stepsKey,onLoaded){if(this._initialized||this._initialization){return;}
var initTasks=this._initialization=new TutorialUtils.Sequence(this.loadConfig.bind(this),this._initWithConfig.bind(this,stepsKey));initTasks.onabort=this._onAbortInitialization.bind(this);initTasks.oncomplete=this._onCompleteInitialization.bind(this,onLoaded);elementIDs.forEach(function(name){dom[Utils.camelCase(name)]=document.getElementById(name);if(!dom[Utils.camelCase(name)]){console.error('Cache DOM elements: couldnt cache: '+name);}},this);initTasks.next();var mediaEvents=this._mediaEvents=['abort','canplay','canplaythrough','durationchange','emptied','ended','error','interruptbegin','interruptend','loadeddata','loadedmetadata','loadstart','mozaudioavailable','pause','play','playing','stalled','suspend','waiting'];this._debugEventHandler={handleEvent:function(evt){var errCodes={'1':'MEDIA_ERR_ABORTED','2':'MEDIA_ERR_NETWORK','3':'MEDIA_ERR_DECODE','4':'MEDIA_ERR_SRC_NOT_SUPPORTED'};console.log('TUTORIAL: media-event: '+evt.type);if(evt.type=='error'){var errtype=errCodes[evt.target.error.code]||'unknown';console.log('TUTORIAL: media-event, '+errtype+' error');}}};mediaEvents.forEach(name=>{dom.tutorialStepVideo.addEventListener(name,this._debugEventHandler);});},start:function(onReady){var sequence;var initInProgress=false;if(this._initialization){sequence=this._initialization;initInProgress=true;}else{this._initialization=sequence=new TutorialUtils.Sequence();sequence.onabort=this._onAbortInitialization.bind(this);sequence.oncomplete=this._onCompleteInitialization.bind(this);}
sequence.push(function setInitialStep(){console.log('TUTORIAL: setInitialStep');return this._setStep();}.bind(this));sequence.push(function showTutorialAndFinishInit(){dom.tutorial.classList.add('show');console.log('TUTORIAL: dispatching tutorialinitialized');window.dispatchEvent(new CustomEvent('tutorialinitialized'));});if(typeof onReady==='function'){sequence.push(onReady);}
if(!initInProgress){sequence.next();}},_initWithConfig:function(stepsKey){stepsKey=stepsKey||'default';this._stepsKey=stepsKey;this._stepsConfig=this.config[stepsKey]||this.config['default'];dom.forwardTutorial.addEventListener('click',this);dom.backTutorial.addEventListener('click',this);this._currentStep=1;},_onAbortInitialization:function(){this._initialization=null;},_onCompleteInitialization:function(onReady){this._initialization=null;this._initialized=true;if(typeof onReady==='function'){onReady();}},_setStep:function(value){value=(typeof value==='number')?value:this._currentStep;var stepIndex=value-1;if(stepIndex>=this._stepsConfig.steps.length){return Promise.resolve().then(function(){Tutorial.done();});}
var stepData=this._stepsConfig.steps[stepIndex];if(!stepData){return Promise.reject('No data for step: '+value);}
dom.tutorial.dataset.step=this._currentStep;document.l10n.setAttributes(dom.tutorialStepTitle,stepData.l10nKey);var imgElement=dom.tutorialStepImage,videoElement=dom.tutorialStepVideo;var stepPromise;if(stepData.video){stepPromise=TutorialUtils.getBestAssetForDirection(stepData.video).then((bestSrc)=>{return TutorialUtils.loadAndPlayMedia(videoElement,bestSrc);});videoElement.hidden=false;imgElement.hidden=true;}else{imgElement.hidden=false;stepPromise=TutorialUtils.loadMedia(imgElement,stepData.image);imgElement.hidden=false;videoElement.hidden=true;}
return stepPromise;},handleEvent:function(evt){if(evt.type==='click'){switch(evt.target){case dom.forwardTutorial:this.next(evt);break;case dom.backTutorial:this.back(evt);break;}}},next:function(){return this._setStep(++this._currentStep);},back:function(){return this._setStep(--this._currentStep);},done:function(){var isUpgrade=this._stepsKey&&this._stepsKey!=='default';FinishScreen.init(isUpgrade);dom.tutorial.classList.remove('show');dom.tutorialStepVideo.removeAttribute('src');dom.tutorialStepImage.removeAttribute('src');},loadConfig:function(){if(!this._configPromise){currentLayout=ScreenLayout.getCurrentLayout()==='tiny'?'tiny':'large';var configUrl='/config/'+currentLayout+'.json';this._configPromise=LazyLoader.getJSON(configUrl).then(function(json){Tutorial.config=json;return Tutorial.config;},function(){return new Error('Tutorial config failed to load from: '+configUrl);});}
return this._configPromise;},reset:function(){var resetPromise=Promise.resolve();if(dom.tutorialStepVideo){this._mediaEvents.forEach(name=>{dom.tutorialStepVideo.removeEventListener(name,this._debugEventHandler);});dom.tutorialStepVideo.hidden=true;if(dom.tutorialStepVideo.src){resetPromise=new Promise((resolve,reject)=>{dom.tutorialStepVideo.addEventListener('emptied',()=>{resolve();});dom.tutorialStepVideo.removeAttribute('src');dom.tutorialStepVideo.load();});}}
if(this._initialization){this._initialization.abort();this._initialization=null;}
this._configPromise=null;this._currentStep=1;this._stepsConfig=this.config=null;if(this._initialized){dom.tutorial.classList.remove('show');this._initialized=false;}
document.getElementById('tutorial').classList.remove('show');return resetPromise;}};exports.Tutorial=Tutorial;})(this);

View file

@ -0,0 +1,8 @@
;(function(exports){'use strict';var TutorialUtils={loadMedia:function(mediaElement,src){console.log('loadMedia, got mediaElement: ',mediaElement);var isVideo=(mediaElement.nodeName==='VIDEO');console.log('TutorialUtils.loadMedia, isVideo: ',isVideo,mediaElement.nodeName);return new Promise(function(resolve,reject){function onMediaLoadOrError(evt){console.log('TutorialUtils.loadMedia, onMediaLoadOrError for '+'evt.type: '+(evt&&evt.type));evt.target.removeEventListener('error',onMediaLoadOrError);if(isVideo){evt.target.removeEventListener('canplay',onMediaLoadOrError);evt.target.removeEventListener('abort',onMediaLoadOrError);}else{evt.target.removeEventListener('load',onMediaLoadOrError);}
if(evt.type==='error'){console.error('Failed to load tutorial media: '+src);}else if(evt.type==='abort'){console.error('Loading of tutorial media aborted: '+src);}
resolve(evt);}
function onVideoUnloaded(evt){console.log('TutorialUtils.loadMedia, onVideoUnloaded for evt.type: '+
(evt&&evt.type));mediaElement.removeEventListener('emptied',onVideoUnloaded);mediaElement.addEventListener('canplay',onMediaLoadOrError);mediaElement.addEventListener('abort',onMediaLoadOrError);mediaElement.addEventListener('error',onMediaLoadOrError);console.log('TutorialUtils.loadMedia, onVideoUnloaded, '+'assigning src: '+src);mediaElement.src=src;mediaElement.load();}
if(isVideo){if(mediaElement.src){console.log('TutorialUtils.loadMedia, removing src attribute');mediaElement.removeAttribute('src');mediaElement.addEventListener('emptied',onVideoUnloaded,false);console.log('TutorialUtils.loadMedia, calling load');mediaElement.load();}else{console.log('TutorialUtils.loadMedia, no src, '+'just calling onVideoUnloaded');onVideoUnloaded();}}else{console.log('TutorialUtils.loadMedia, not a video, '+'listen for load/error only');mediaElement.addEventListener('load',onMediaLoadOrError,false);mediaElement.addEventListener('error',onMediaLoadOrError,false);mediaElement.src=src;}});},loadAndPlayMedia:function(mediaElement,src){return this.loadMedia(mediaElement,src).then((evt)=>{if(evt.type!=='error'&&mediaElement.nodeName==='VIDEO'){mediaElement.play();}});},fileExists:function(src){return new Promise((resolve)=>{window.fetch(src,{method:'HEAD'}).then((response)=>{resolve(response.ok);}).catch(()=>{resolve(false);});});},getBestAssetForDirection:function(src){var dir=document.dir||'ltr';var re=/(-rtl|ltr)?\.(png|gif|jpg|webm|mp4|m4v|ogg|ogv)$/;var directionSrc=src.replace(re,'-'+dir+'.$2');return this.fileExists(directionSrc).then((result)=>{return result?directionSrc:src;}).catch((e)=>{console.log('Exception from getBestAssetForDirection: ',e);});},Sequence:function(){var sequence=Array.slice(arguments);var aborted=false;sequence.abort=function(){aborted=true;this.length=0;if(typeof this.onabort==='function'){this.onabort();}};sequence.complete=function(result){if(!aborted&&typeof this.oncomplete==='function'){this.oncomplete(result);}};sequence.fail=function(reason){this.complete(reason);};sequence.next=function(previousTaskResult){var result,exception;if(aborted){return;}
var task=this.shift();if(task){try{result=task.apply(null,arguments);}catch(e){exception=e;}
if(exception){this.fail(exception);}else if(result&&typeof result.then==='function'){result.then(this.next.bind(this),this.fail.bind(this));}else{this.next(result);}}else{this.complete(previousTaskResult);}};return sequence;}};exports.TutorialUtils=TutorialUtils;})(window);

View file

@ -0,0 +1,11 @@
;'use strict';var UIManager={domSelectors:['container','splash-screen','activation-screen','finish-screen','update-screen','nav-bar','main-title','unlock-sim-screen','unlock-sim-header','unlock-sim-action','pincode-screen','pin-label','pin-retries-left','pin-input','back-sim-button','pin-error','skip-pin-button','unlock-sim-button','pukcode-screen','puk-label','puk-retries-left','puk-input','puk-info','puk-error','newpin-input','newpin-error','confirm-newpin-input','confirm-newpin-error','xckcode-screen','xck-label','xck-retries-left','xck-input','xck-error','sim-info-screen','sim-info-back','sim-info-forward','sim-info-1','sim-info-2','sim-number-1','sim-number-2','sim-carrier-1','sim-carrier-2','sim-import','sim-import-button','no-sim','sd-import-button','no-memorycard','fxa-create-account','fxa-intro','networks','wifi-refresh-button','wifi-join-button','join-hidden-button','hidden-wifi-authentication','hidden-wifi-ssid','hidden-wifi-security','hidden-wifi-password','hidden-wifi-password-box','hidden-wifi-identity','hidden-wifi-identity-box','hidden-wifi-show-password','date-configuration','time-configuration','date-configuration-label','time-configuration-label','time-form','data-connection-switch','geolocation-switch','lets-go-button','update-lets-go-button','skip-tutorial-button','update-skip-tutorial-button','metrics-basic','metrics-enhanced','metrics-none','offline-error-dialog','newsletter-form','newsletter-input','newsletter-success-screen','offline-newsletter-error-dialog','invalid-email-error-dialog'],dataConnectionChangedByUsr:false,timeZoneNeedsConfirmation:true,DARK_THEME:'#242d33',LIGHT_THEME:'#eeeeee',init:function ui_init(){this.domSelectors.forEach(function createElementRef(name){this[toCamelCase(name)]=document.getElementById(name);}.bind(this));this._settingsObserveHandler={'geolocation.enabled':{defaultValue:this.geolocationSwitch.checked,callback:function(value){var isEnabled=!!value;if(this.geolocationSwitch.checked!==isEnabled){this.geolocationSwitch.checked=isEnabled;}}.bind(this)}};for(var name in this._settingsObserveHandler){SettingsListener.observe(name,this._settingsObserveHandler[name].defaultValue,this._settingsObserveHandler[name].callback);}
var currentDate=new Date();this.timeConfigurationLabel.textContent=currentDate.toLocaleString(navigator.languages,{hour12:navigator.mozHour12,hour:'numeric',minute:'numeric',second:'numeric'});this.dateConfigurationLabel.textContent=currentDate.toLocaleString(navigator.languages,{year:'numeric',month:'numeric',day:'numeric'});this.simImportButton.addEventListener('click',this);this.sdImportButton.addEventListener('click',this);this.skipPinButton.addEventListener('click',this);this.backSimButton.addEventListener('click',this);this.unlockSimButton.addEventListener('click',this);this.unlockSimAction.addEventListener('action',this);this.simInfoBack.addEventListener('click',this);this.simInfoForward.addEventListener('click',this);this.dataConnectionSwitch.addEventListener('change',this);this.wifiRefreshButton.addEventListener('click',this);this.wifiJoinButton.addEventListener('click',this);this.networks.addEventListener('click',this);this.joinHiddenButton.addEventListener('click',this);this.hiddenWifiSecurity.addEventListener('change',this);this.wifiJoinButton.disabled=true;var checkHiddenWifiJoin=function(){this.wifiJoinButton.disabled=this.hiddenWifiSsid.value===''||!WifiHelper.isValidInput(this.hiddenWifiSecurity.value,this.hiddenWifiPassword.value,this.hiddenWifiIdentity.value);}.bind(this);this.hiddenWifiSsid.addEventListener('keyup',checkHiddenWifiJoin);this.hiddenWifiIdentity.addEventListener('keyup',checkHiddenWifiJoin);this.hiddenWifiPassword.addEventListener('keyup',checkHiddenWifiJoin);this.hiddenWifiSecurity.addEventListener('change',checkHiddenWifiJoin);this.hiddenWifiShowPassword.onchange=function togglePasswordVisibility(){UIManager.hiddenWifiPassword.type=this.checked?'text':'password';};this.timeConfiguration.addEventListener('input',this);this.dateConfiguration.addEventListener('input',this);this.geolocationSwitch.addEventListener('change',this);this.fxaCreateAccount.addEventListener('click',this);this.timeForm.addEventListener('submit',function(event){event.preventDefault();});this.newsletterInput.addEventListener('focus',function(){window.addEventListener('resize',function resize(){window.removeEventListener('resize',resize);setTimeout(function(){var page=document.getElementById('browser_privacy');UIManager.scrollToElement(page,UIManager.newsletterInput);},30);});});this.offlineNewsletterErrorDialog.querySelector('button').addEventListener('click',function offlineDialogClick(){this.offlineNewsletterErrorDialog.classList.remove('visible');}.bind(this));this.invalidEmailErrorDialog.querySelector('button').addEventListener('click',function invalidEmailDialogClick(){this.invalidEmailErrorDialog.classList.remove('visible');}.bind(this));var skipTutorialAction=function(){WifiManager.finish();if(ScreenLayout.getCurrentLayout()==='tiny'){window.close();}else{FinishScreen.init();}};var startTutorialAction=function(evt){WifiManager.finish();Tutorial.start(function onTutorialLoaded(){UIManager.activationScreen.classList.remove('show');UIManager.updateScreen.classList.remove('show');UIManager.finishScreen.classList.remove('show');});};this.skipTutorialButton.addEventListener('click',skipTutorialAction);this.updateSkipTutorialButton.addEventListener('click',skipTutorialAction);this.letsGoButton.addEventListener('click',startTutorialAction);this.updateLetsGoButton.addEventListener('click',startTutorialAction);this.metricsBasic.addEventListener('change',this);this.metricsEnhanced.addEventListener('change',this);this.metricsNone.addEventListener('change',this);var button=this.offlineErrorDialog.querySelector('button');button.addEventListener('click',this.onOfflineDialogButtonClick.bind(this));['confirmdialogshowing','loadingoverlayshowing','tutorialinitialized'].forEach(function(event){window.addEventListener(event,this.hideActivationScreenFromScreenReader.bind(this));},this);['confirmdialoghiding','loadingoverlayhiding'].forEach(function(event){window.addEventListener(event,this.showActivationScreenToScreenReader.bind(this));},this);this.checkInitialFxAStatus();},scrollToElement:function ui_scrollToElement(container,element){container.scrollTop=element.offsetTop;},sendNewsletter:function ui_sendNewsletter(callback){var self=this;var emailValue=self.newsletterInput.value;if(emailValue===''){return callback(true);}else{utils.overlay.show('email-loading','spinner');if(self.newsletterInput.checkValidity()){if(window.navigator.onLine){Basket.send(emailValue,function emailSent(err,data){if(err){if(err.code&&err.code===Basket.errors.INVALID_EMAIL){ConfirmDialog.show('invalid-email-dialog-title','invalid-email-dialog-text',{title:'cancel',callback:function ok(){ConfirmDialog.hide();}});utils.overlay.hide();return callback(false);}else{Basket.store(emailValue);}}
utils.overlay.hide();return callback(true);});}else{Basket.store(emailValue,function stored(errorStoring){utils.overlay.hide();return callback(!errorStoring);});}}else{utils.overlay.hide();ConfirmDialog.show('invalid-email-dialog-title','invalid-email-dialog-text',{title:'cancel',callback:function ok(){ConfirmDialog.hide();}});return callback(false);}}},initTZ:function ui_initTZ(){var self=this;var tzRegion=document.getElementById('tz-region');var tzCity=document.getElementById('tz-city');return new Promise(function(resolve){var onchange=self.setTimeZone.bind(self);var onload=function(){self.setTimeZone.apply(self,arguments);resolve();};tzSelect(tzRegion,tzCity,onchange,onload);});},handleEvent:function ui_handleEvent(event){switch(event.target.id){case'skip-pin-button':SimManager.skip();break;case'back-sim-button':case'sim-info-back':SimManager.back();break;case'unlock-sim-button':SimManager.unlock();break;case'unlock-sim-action':SimManager.simUnlockBack();break;case'sim-info-forward':SimManager.finish();break;case'sim-import-button':window.setTimeout(SimManager.importContacts,0);break;case'sd-import-button':window.setTimeout(SdManager.importContacts,0);break;case'data-connection-switch':this.dataConnectionChangedByUsr=true;var status=event.target.checked;DataMobile.toggle(status);break;case'wifi-refresh-button':WifiManager.scan(WifiUI.renderNetworks);break;case'wifi-join-button':if(window.location.hash==='#hidden-wifi-authentication'){WifiUI.joinHiddenNetwork();}else{WifiUI.joinNetwork();}
break;case'join-hidden-button':WifiUI.addHiddenNetwork();break;case'hidden-wifi-security':var securityType=event.target.selectedIndex?event.target.value:'';WifiUI.handleHiddenWifiSecurity(securityType);break;case'time-configuration':this.setTime();break;case'date-configuration':this.setDate();break;case'geolocation-switch':this.updateSetting(event.target.name,event.target.checked);break;case'metrics-enhanced':this.updateSetting('hud.hide',(event.target.value==='Enhanced'));this.updateSetting('devtools.overlay',(event.target.value==='Enhanced'));case'metrics-basic':case'metrics-none':this.updateSetting('metrics.selectedMetrics.level',event.target.value);break;case'fxa-create-account':this.createFirefoxAccount();break;default:if(event.target.parentNode.id==='networks-list'){WifiUI.chooseNetwork(event);}
break;}},updateSetting:function ui_updateSetting(name,value){if(!name){return;}
var cset={};cset[name]=value;return SettingsListener.getSettingsLock().set(cset);},setForwardButtonLabel:function ui_setForwardButtonLabel(label){var nextButton=document.getElementById('forward');nextButton.setAttribute('data-l10n-id',label);},checkInitialFxAStatus:function ui_checkInitialFxAStatus(){this.skipFxA=true;FxAccountsIACHelper.getAccount((account)=>{this.skipFxA=false;this.onFxALogin(account);},()=>{FxAccountsIACHelper.logout(()=>{this.skipFxA=false;});});},createFirefoxAccount:function ui_createFirefoxAccount(){FxAccountsIACHelper.openFlow(UIManager.onFxAFlowDone,UIManager.onFxAError);},onFxAFlowDone:function ui_onFxAFlowDone(){FxAccountsIACHelper.getAccount((account)=>{if(!account){return;}
UIManager.onFxALogin(account);UIManager.setForwardButtonLabel('navbar-next');},UIManager.onFxAError);},onFxALogin:function ui_onFxALogin(account){if(!account){return;}
UIManager.newsletterInput.value=account.email;UIManager.fxaIntro.innerHTML='';document.l10n.setAttributes(UIManager.fxaIntro,account.verified?'fxa-signed-in':'fxa-email-sent',{email:account.email});UIManager.fxaCreateAccount.disabled=true;},onFxAError:function ui_onFxAError(response){console.error('Create FxA Error: '+JSON.stringify(response));UIManager.newsletterInput.value='';document.l10n.setAttributes(UIManager.fxaIntro,'fxa-upsell');UIManager.fxaCreateAccount.disabled=false;UIManager.setForwardButtonLabel('skip');},displayOfflineDialog:function ui_displayOfflineDialog(href,title){var dialog=this.offlineErrorDialog;document.l10n.setAttributes(dialog.querySelector('small'),'offline-dialog-text',{url:href});dialog.classList.add('visible');this.hideActivationScreenFromScreenReader();},onOfflineDialogButtonClick:function ui_onOfflineDialogButtonClick(e){this.offlineErrorDialog.classList.remove('visible');this.showActivationScreenToScreenReader();},hideActivationScreenFromScreenReader:function ui_hideActivationScreenFromScreenReader(){this.activationScreen.setAttribute('aria-hidden',true);},showActivationScreenToScreenReader:function ui_showActivationScreenToScreenReader(){this.activationScreen.setAttribute('aria-hidden',false);},setDate:function ui_sd(){if(!!this.lock){return;}
var now=new Date();var currentDate=this.dateConfiguration.value;var currentTime=now.toLocaleFormat('%H:%M');var timeToSet=new Date(currentDate+'T'+currentTime);TimeManager.set(timeToSet);this.dateConfigurationLabel.textContent=timeToSet.toLocaleString(navigator.languages,{year:'numeric',month:'numeric',day:'numeric'});},setTime:function ui_st(){if(!!this.lock){return;}
var timeLabel=document.getElementById('time-configuration-label');var now=new Date();var currentTime=document.getElementById('time-configuration').value;if(currentTime.indexOf(':')===1){currentTime='0'+currentTime;}
var currentDate=now.toLocaleFormat('%Y-%m-%d');var timeToSet=new Date(currentDate+'T'+currentTime);TimeManager.set(timeToSet);timeLabel.textContent=timeToSet.toLocaleString(navigator.languages,{hour12:navigator.mozHour12,hour:'numeric',minute:'numeric',second:'numeric'});},setTimeZone:function ui_stz(timezone,needsConfirmation){this.timeZoneNeedsConfirmation=!!needsConfirmation;var utcOffset=timezone.utcOffset;document.getElementById('time_zone_overlay').className='UTC'+utcOffset.replace(/[+:]/g,'');var timezoneTitle=document.getElementById('time-zone-title');document.l10n.setAttributes(timezoneTitle,'timezoneTitle',{utcOffset:utcOffset,region:timezone.region,city:timezone.city});document.getElementById('tz-region-label').textContent=timezone.region;document.getElementById('tz-city-label').textContent=timezone.city;var now=new Date();var timeLabel=document.getElementById('time-configuration-label');timeLabel.textContent=now.toLocaleString(navigator.languages,{hour12:navigator.mozHour12,hour:'numeric',minute:'numeric',second:'numeric'});},updateDataConnectionStatus:function ui_udcs(status){this.dataConnectionSwitch.checked=status;},changeStatusBarColor:function ui_csbc(color){var themeMeta=document.head.querySelector('meta[name="theme-color"]');themeMeta.setAttribute('content',color);}};function toCamelCase(str){return str.replace(/\-(.)/g,function replacer(str,p1){return p1.toUpperCase();});}

View file

@ -0,0 +1 @@
;(function(exports){'use strict';var rdashes=/-(.)/g;var Utils={camelCase:function ut_camelCase(str){return str.replace(rdashes,function(str,p1){return p1.toUpperCase();});}};exports.Utils=Utils;}(this));

View file

@ -0,0 +1,20 @@
;(function(exports){'use strict';const WIFI_STATUS={connecting:'connecting',associated:'associated',connected:'connected',connectingfailed:'connectingfailed',disconnected:'disconnected'};var WifiManager={STATUS:Object.freeze(WIFI_STATUS),init:function wn_init(){this.api=WifiHelper.getWifiManager();this.changeStatus();if(navigator.mozSettings){var lock=window.navigator.mozSettings.createLock();this.enable(lock);this.enableDebugging(lock);}
this.gCurrentNetwork=this.api?this.api.connection.network:null;if(this.gCurrentNetwork!==null){this.api.forget(this.gCurrentNetwork);this.gCurrentNetwork=null;}},getNetworks:function wn_getNetworks(callback){this.networks?callback(this.networks):this.scan(callback);},scan:function wn_scan(callback){if(this._scanning){return;}
this._scanning=true;utils.overlay.show('scanningNetworks','spinner');var SCAN_TIMEOUT=10000;var self=this;self.onScan=callback;var req=this.api?this.api.getNetworks():null;if(!req){setTimeout(function(){self._scanning=false;callback();});return;}
var handleRequest=function handleRequest(){self._scanning=false;clearTimeout(self.scanTimeout);self.scanTimeout=null;self.onScan(self.networks);self.onScan=null;};req.onsuccess=function onScanSuccess(){self.networks=req.result;handleRequest();};req.onerror=function onScanError(){console.error('Error reading networks: '+req.error.name);self.networks=[];handleRequest();};if(!self.scanTimeout){self.scanTimeout=setTimeout(function(){self._scanning=false;console.warn('Timeout while reading networks');self.onScan();},SCAN_TIMEOUT);}},enable:function wn_enable(lock){lock.set({'wifi.enabled':true});},enableDebugging:function wn_enableDebugging(lock){this._prevDebuggingValue=false;var req=lock.get('wifi.debugging.enabled');req.onsuccess=function wn_getDebuggingSuccess(){this._prevDebuggingValue=req.result['wifi.debugging.enabled'];};lock.set({'wifi.debugging.enabled':true});},finish:function wn_finish(){if(!this._prevDebuggingValue&&navigator.mozSettings){var resetLock=window.navigator.mozSettings.createLock();resetLock.set({'wifi.debugging.enabled':false});}},getNetwork:function wm_gn(ssid){var list=this.networks;for(var i=0;i<list.length;i++){if(list[i].ssid===ssid){return list[i];}}
return null;},connect:function wn_connect(ssid,password,user){var network=this.getNetwork(ssid);if(!network){console.error('Network not found');return;}
this.ssid=ssid;WifiHelper.setPassword(network,password,user,'PEAP');this.gCurrentNetwork=network;this.api.associate(network);},changeStatus:function wn_cs(callback){var self=this;if(WifiManager.api){WifiManager.api.onstatuschange=function(event){if(event.status===WifiManager.STATUS.disconnected&&self.onScan){self.scan(self.onScan);}else{WifiUI.updateNetworkStatus(event.network.ssid,event.status);}};}}};var WifiUI={joinNetwork:function wui_jn(){var password=document.getElementById('wifi_password').value;var user=document.getElementById('wifi_user').value;var ssid=document.getElementById('wifi_ssid').value;WifiUI.connect(ssid,password,user);window.history.back();},joinHiddenNetwork:function wui_jhn(){var password=UIManager.hiddenWifiPassword.value;var user=UIManager.hiddenWifiIdentity.value;var ssid=UIManager.hiddenWifiSsid.value;var security=UIManager.hiddenWifiSecurity.value;var network;if(ssid.length){if(!Array.isArray(WifiManager.networks)){WifiManager.networks=[];}
network=new window.MozWifiNetwork({ssid:ssid,capabilities:[],security:[security],relSignalStrength:0,hidden:true});WifiManager.networks.push(network);this.renderNetworks(WifiManager.networks);WifiUI.connect(ssid,password,user);}
window.history.back();},_selectNetworkItem:function(ssid,isSelected=true){var elem=document.getElementById(ssid);if(!elem){return;}
if(isSelected){elem.setAttribute('data-wifi-selected',true);}else{var icon=elem.querySelector('aside');elem.removeAttribute('data-wifi-selected');elem.classList.remove('connected');icon.classList.remove('connecting');icon.classList.remove('connected');var security=elem.dataset.security;var securityLevelDOM=elem.querySelector('p[data-security-level]');securityLevelDOM.setAttribute('data-l10n-id',security?security:'securityOpen');}},connect:function wui_connect(ssid,password,user){var newWifi=document.getElementById(ssid);Array.from(document.querySelectorAll('li[data-wifi-selected]')).forEach((networkSelected)=>{this._selectNetworkItem(networkSelected,networkSelected===newWifi);});WifiManager.connect(ssid,password,user);},chooseNetwork:function wui_cn(event){var ssid=event.target.dataset.ssid;var selectedNetwork=WifiManager.getNetwork(ssid);if(!selectedNetwork){console.error('Network not found');return;}
if(WifiHelper.isOpen(selectedNetwork)){WifiUI.connect(ssid);return;}
UIManager.activationScreen.classList.add('no-options');UIManager.mainTitle.textContent=ssid;var ssidHeader=document.getElementById('wifi_ssid');var userInput=document.getElementById('wifi_user');var passwordInput=document.getElementById('wifi_password');var showPassword=document.querySelector('gaia-checkbox[name=show_password]');var joinButton=UIManager.wifiJoinButton;joinButton.disabled=true;passwordInput.addEventListener('input',function validatePassword(){joinButton.disabled=!WifiHelper.isValidInput(WifiHelper.getKeyManagement(selectedNetwork),passwordInput.value,userInput.value);});passwordInput.type='password';passwordInput.value='';showPassword.checked=false;showPassword.addEventListener('change',e=>{passwordInput.type=e.target.checked?'text':'password';});passwordInput.value='';ssidHeader.value=ssid;UIManager.navBar.classList.add('secondary-menu');if(WifiHelper.isEap(selectedNetwork)){userInput.parentNode.classList.remove('hidden');}else{userInput.parentNode.classList.add('hidden');}
window.location.hash='#configure_network';},addHiddenNetwork:function wui_addHiddenNetwork(){UIManager.activationScreen.classList.add('no-options');UIManager.mainTitle.setAttribute('data-l10n-id','authentication');UIManager.navBar.classList.add('secondary-menu');UIManager.hiddenWifiSsid.value='';UIManager.hiddenWifiPassword.value='';UIManager.hiddenWifiIdentity.value='';UIManager.wifiJoinButton.disabled=true;window.location.hash='#hidden-wifi-authentication';},handleHiddenWifiSecurity:function wui_handleSecurity(securityType){if(securityType===''){UIManager.hiddenWifiPasswordBox.classList.add('hidden');}else{UIManager.hiddenWifiPasswordBox.classList.remove('hidden');}
if(securityType.indexOf('EAP')!==-1){UIManager.hiddenWifiIdentityBox.classList.remove('hidden');}else{UIManager.hiddenWifiIdentityBox.classList.add('hidden');}},renderNetworks:function wui_rn(networks){var networksDOM=document.getElementById('networks');networksDOM.innerHTML='';var networksList;if(!networks||networks.length===0){var noResult='<div id="no-result-container">'+' <div id="no-result-message">'+' <p data-l10n-id="noWifiFound3"></p>'+' </div>'+'</div>';networksDOM.innerHTML=noResult;}else{networksList=document.createElement('ul');networksList.id='networks-list';networksList.setAttribute('role','listbox');networksList.setAttribute('data-l10n-id','networksList');var networksShown=[];networks.sort(function(a,b){return b.relSignalStrength-a.relSignalStrength;});for(var i=0,max=networks.length;i<max;i++){var network=networks[i];if(networksShown.indexOf(network.ssid)===-1){var li=document.createElement('li');var icon=document.createElement('aside');var ssidp=document.createElement('p');ssidp.setAttribute('dir','auto');var small=document.createElement('p');small.dataset.securityLevel=true;icon.classList.add('pack-end');icon.classList.add('wifi-icon');var level=Math.min(Math.floor(network.relSignalStrength/20),4);icon.classList.add('level-'+level);document.l10n.setAttributes(icon,'wifiLevel',{level:level});icon.setAttribute('role','presentation');ssidp.textContent=network.ssid;li.dataset.ssid=network.ssid;var keys=WifiHelper.getSecurity(network);li.dataset.security=keys;if(!WifiHelper.isOpen(network)){small.textContent=keys.join(', ');icon.classList.add('secured');}else{small.setAttribute('data-l10n-id','securityOpen');}
icon.classList.add('wifi-signal');var connectionStatus=WifiHelper.getNetworkStatus(network)||WifiManager.STATUS.disconnected;li.dataset.status=connectionStatus;if(connectionStatus===WifiManager.STATUS.connected){small.setAttribute('data-l10n-id','shortStatus-connected');small.removeAttribute('aria-label');icon.classList.add('connected');li.classList.add('connected');li.dataset.wifiSelected=true;}
networksShown.push(network.ssid);li.setAttribute('id',network.ssid);li.setAttribute('role','option');li.setAttribute('aria-live',true);li.setAttribute('aria-relevant','text');li.appendChild(ssidp);li.appendChild(small);li.appendChild(icon);if(WifiHelper.isConnected(network)){networksList.insertBefore(li,networksList.firstChild);}else{networksList.appendChild(li);}}}
networksList.dataset.type='list';networksDOM.appendChild(networksList);}
utils.overlay.hide();},updateNetworkStatus:function wui_uns(ssid,status){var element=document.getElementById(ssid);if(!element){return;}
if(status===WifiManager.STATUS.connecting&&ssid!==WifiManager.ssid){return;}
element.dataset.status=status;if(status!==WifiManager.STATUS.disconnected){element.querySelector('p[data-security-level]').setAttribute('data-l10n-id','shortStatus-'+status);}else{var security=element.dataset.security||'Open';element.querySelector('p[data-security-level]').setAttribute('data-l10n-id','security'+security);element.classList.remove('connected');}
var icon=element.querySelector('aside');switch(status){case WifiManager.STATUS.connecting:case WifiManager.STATUS.associated:icon.classList.add('connecting');break;case WifiManager.STATUS.connected:icon.classList.remove('connecting');var networksList=document.getElementById('networks-list');icon.classList.add('connected');element.classList.add('connected');networksList.removeChild(element);networksList.insertBefore(element,networksList.firstChild);break;default:icon.classList.remove('connecting');icon.classList.remove('connected');break;}}};exports.WifiManager=WifiManager;exports.WifiUI=WifiUI;})(window);

View file

@ -0,0 +1,18 @@
{
"name": "ftu",
"tags": {
"dictionaries": ["jsdoc"]
},
"source": {
"include": ["apps/ftu/js/**/*.js"]
},
"plugins": [
"plugins/markdown",
"plugins/summarize"
],
"opts": {
"private": true,
"recurse": true,
"destination": "docs/ftu"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more